@probelabs/visor 0.1.181 → 0.1.182

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 (158) hide show
  1. package/defaults/code-talk.yaml +80 -14
  2. package/defaults/engineer.yaml +33 -15
  3. package/defaults/skills/code-explorer.yaml +5 -0
  4. package/dist/agent-protocol/a2a-frontend.d.ts +10 -0
  5. package/dist/agent-protocol/a2a-frontend.d.ts.map +1 -1
  6. package/dist/agent-protocol/task-evaluator.d.ts +52 -0
  7. package/dist/agent-protocol/task-evaluator.d.ts.map +1 -0
  8. package/dist/agent-protocol/task-store.d.ts +5 -3
  9. package/dist/agent-protocol/task-store.d.ts.map +1 -1
  10. package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
  11. package/dist/agent-protocol/tasks-tui.d.ts +34 -0
  12. package/dist/agent-protocol/tasks-tui.d.ts.map +1 -0
  13. package/dist/agent-protocol/trace-serializer.d.ts +90 -0
  14. package/dist/agent-protocol/trace-serializer.d.ts.map +1 -0
  15. package/dist/agent-protocol/track-execution.d.ts +2 -0
  16. package/dist/agent-protocol/track-execution.d.ts.map +1 -1
  17. package/dist/cli-main.d.ts.map +1 -1
  18. package/dist/defaults/code-talk.yaml +80 -14
  19. package/dist/defaults/engineer.yaml +33 -15
  20. package/dist/defaults/skills/code-explorer.yaml +5 -0
  21. package/dist/docs/commands.md +57 -14
  22. package/dist/docs/configuration.md +2 -0
  23. package/dist/docs/guides/graceful-restart.md +178 -0
  24. package/dist/docs/observability.md +69 -0
  25. package/dist/docs/production-deployment.md +17 -0
  26. package/dist/email/polling-runner.d.ts +4 -0
  27. package/dist/email/polling-runner.d.ts.map +1 -1
  28. package/dist/generated/config-schema.d.ts +70 -6
  29. package/dist/generated/config-schema.d.ts.map +1 -1
  30. package/dist/generated/config-schema.json +73 -6
  31. package/dist/index.js +5006 -886
  32. package/dist/output/traces/{run-2026-03-17T13-58-29-402Z.ndjson → run-2026-03-18T19-02-50-465Z.ndjson} +84 -84
  33. package/dist/{traces/run-2026-03-17T13-59-10-403Z.ndjson → output/traces/run-2026-03-18T19-03-30-428Z.ndjson} +2037 -2037
  34. package/dist/providers/mcp-custom-sse-server.d.ts +4 -0
  35. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  36. package/dist/runners/graceful-restart.d.ts +46 -0
  37. package/dist/runners/graceful-restart.d.ts.map +1 -0
  38. package/dist/runners/mcp-server-runner.d.ts +12 -0
  39. package/dist/runners/mcp-server-runner.d.ts.map +1 -1
  40. package/dist/runners/runner-factory.d.ts.map +1 -1
  41. package/dist/runners/runner-host.d.ts +12 -0
  42. package/dist/runners/runner-host.d.ts.map +1 -1
  43. package/dist/runners/runner.d.ts +12 -0
  44. package/dist/runners/runner.d.ts.map +1 -1
  45. package/dist/sdk/{a2a-frontend-IWOUJOIZ.mjs → a2a-frontend-4LP3MLTS.mjs} +47 -5
  46. package/dist/sdk/a2a-frontend-4LP3MLTS.mjs.map +1 -0
  47. package/dist/sdk/a2a-frontend-5J3UNFY4.mjs +1718 -0
  48. package/dist/sdk/a2a-frontend-5J3UNFY4.mjs.map +1 -0
  49. package/dist/sdk/{a2a-frontend-BDACLGMA.mjs → a2a-frontend-MU5EO2HZ.mjs} +35 -1
  50. package/dist/sdk/a2a-frontend-MU5EO2HZ.mjs.map +1 -0
  51. package/dist/sdk/{check-provider-registry-4YKTEDKF.mjs → check-provider-registry-MHXQGUNN.mjs} +7 -7
  52. package/dist/sdk/{check-provider-registry-4YFVBGYU.mjs → check-provider-registry-RRWCXSTG.mjs} +3 -3
  53. package/dist/sdk/{check-provider-registry-67ZLGDDQ.mjs → check-provider-registry-Y33CRFVD.mjs} +7 -7
  54. package/dist/sdk/{chunk-DGIH6EX3.mjs → chunk-4AXAVXG5.mjs} +151 -281
  55. package/dist/sdk/chunk-4AXAVXG5.mjs.map +1 -0
  56. package/dist/sdk/{chunk-VMVIM4JB.mjs → chunk-4I3TJ7UJ.mjs} +37 -7
  57. package/dist/sdk/chunk-4I3TJ7UJ.mjs.map +1 -0
  58. package/dist/sdk/{chunk-VXC2XNQJ.mjs → chunk-5J3DNRF7.mjs} +3 -3
  59. package/dist/sdk/{chunk-7YZSSO4X.mjs → chunk-6DPPP7LD.mjs} +10 -10
  60. package/dist/sdk/chunk-7ERVRLDV.mjs +296 -0
  61. package/dist/sdk/chunk-7ERVRLDV.mjs.map +1 -0
  62. package/dist/sdk/{chunk-4DVP6KVC.mjs → chunk-7Z2WHX2J.mjs} +71 -30
  63. package/dist/sdk/chunk-7Z2WHX2J.mjs.map +1 -0
  64. package/dist/sdk/chunk-ANUT54HW.mjs +1502 -0
  65. package/dist/sdk/chunk-ANUT54HW.mjs.map +1 -0
  66. package/dist/sdk/{chunk-J73GEFPT.mjs → chunk-DHETLQIX.mjs} +2 -2
  67. package/dist/sdk/{chunk-QGBASDYP.mjs → chunk-JCOSKBMP.mjs} +71 -30
  68. package/dist/sdk/chunk-JCOSKBMP.mjs.map +1 -0
  69. package/dist/sdk/chunk-MK7ONH47.mjs +739 -0
  70. package/dist/sdk/chunk-MK7ONH47.mjs.map +1 -0
  71. package/dist/sdk/chunk-QXT47ZHR.mjs +390 -0
  72. package/dist/sdk/chunk-QXT47ZHR.mjs.map +1 -0
  73. package/dist/sdk/chunk-V75NEIXL.mjs +296 -0
  74. package/dist/sdk/chunk-V75NEIXL.mjs.map +1 -0
  75. package/dist/sdk/chunk-ZOF5QT6U.mjs +5943 -0
  76. package/dist/sdk/chunk-ZOF5QT6U.mjs.map +1 -0
  77. package/dist/sdk/{config-TSA5FUOM.mjs → config-2STD74CJ.mjs} +2 -2
  78. package/dist/sdk/config-JE4HKTWW.mjs +16 -0
  79. package/dist/sdk/{failure-condition-evaluator-HTPB5FYW.mjs → failure-condition-evaluator-5DZYMCGW.mjs} +4 -4
  80. package/dist/sdk/failure-condition-evaluator-R6DCDJAV.mjs +18 -0
  81. package/dist/sdk/{github-frontend-3SDFCCKI.mjs → github-frontend-3PSCKPAJ.mjs} +4 -4
  82. package/dist/sdk/github-frontend-L3F5JXPJ.mjs +1394 -0
  83. package/dist/sdk/github-frontend-L3F5JXPJ.mjs.map +1 -0
  84. package/dist/sdk/{host-QE4L7UXE.mjs → host-54CHV2LW.mjs} +3 -3
  85. package/dist/sdk/{host-VBBSLUWG.mjs → host-WAU6CT42.mjs} +3 -3
  86. package/dist/sdk/{host-CVH2CSHM.mjs → host-X5ZZCEWN.mjs} +2 -2
  87. package/dist/sdk/{routing-YVMTKFDZ.mjs → routing-CVQT4KHX.mjs} +5 -5
  88. package/dist/sdk/routing-EBAE5SSO.mjs +26 -0
  89. package/dist/sdk/{schedule-tool-Z5VG67JK.mjs → schedule-tool-POY3CDZL.mjs} +7 -7
  90. package/dist/sdk/{schedule-tool-ADUXTCY7.mjs → schedule-tool-R2OAATUS.mjs} +7 -7
  91. package/dist/sdk/{schedule-tool-ZMX3Y7LF.mjs → schedule-tool-Z6QYL2B3.mjs} +3 -3
  92. package/dist/sdk/{schedule-tool-handler-N7UNABOA.mjs → schedule-tool-handler-J4NUETJ6.mjs} +3 -3
  93. package/dist/sdk/{schedule-tool-handler-PCERK6ZZ.mjs → schedule-tool-handler-JMAKHPI7.mjs} +7 -7
  94. package/dist/sdk/{schedule-tool-handler-QOJVFRB4.mjs → schedule-tool-handler-MWFUIQKR.mjs} +7 -7
  95. package/dist/sdk/sdk.d.mts +33 -0
  96. package/dist/sdk/sdk.d.ts +33 -0
  97. package/dist/sdk/sdk.js +2058 -342
  98. package/dist/sdk/sdk.js.map +1 -1
  99. package/dist/sdk/sdk.mjs +6 -6
  100. package/dist/sdk/task-evaluator-HLNXKKVV.mjs +1278 -0
  101. package/dist/sdk/task-evaluator-HLNXKKVV.mjs.map +1 -0
  102. package/dist/sdk/{trace-helpers-KXDOJWBL.mjs → trace-helpers-HL5FBX65.mjs} +3 -3
  103. package/dist/sdk/trace-helpers-WJXYVV4S.mjs +29 -0
  104. package/dist/sdk/trace-helpers-WJXYVV4S.mjs.map +1 -0
  105. package/dist/sdk/trace-reader-ZY77OFNM.mjs +266 -0
  106. package/dist/sdk/trace-reader-ZY77OFNM.mjs.map +1 -0
  107. package/dist/sdk/track-execution-MKIQXP2C.mjs +136 -0
  108. package/dist/sdk/track-execution-MKIQXP2C.mjs.map +1 -0
  109. package/dist/sdk/track-execution-YUXQ6WQH.mjs +136 -0
  110. package/dist/sdk/track-execution-YUXQ6WQH.mjs.map +1 -0
  111. package/dist/sdk/{workflow-check-provider-NTHC5ZBF.mjs → workflow-check-provider-SE5I7EMA.mjs} +7 -7
  112. package/dist/sdk/workflow-check-provider-SE5I7EMA.mjs.map +1 -0
  113. package/dist/sdk/{workflow-check-provider-SRIMWKLQ.mjs → workflow-check-provider-VKYGI5GK.mjs} +3 -3
  114. package/dist/sdk/workflow-check-provider-VKYGI5GK.mjs.map +1 -0
  115. package/dist/sdk/{workflow-check-provider-CJXW2Z4F.mjs → workflow-check-provider-YDGZRI3Z.mjs} +7 -7
  116. package/dist/sdk/workflow-check-provider-YDGZRI3Z.mjs.map +1 -0
  117. package/dist/slack/socket-runner.d.ts +12 -0
  118. package/dist/slack/socket-runner.d.ts.map +1 -1
  119. package/dist/teams/webhook-runner.d.ts +4 -0
  120. package/dist/teams/webhook-runner.d.ts.map +1 -1
  121. package/dist/telegram/polling-runner.d.ts +2 -0
  122. package/dist/telegram/polling-runner.d.ts.map +1 -1
  123. package/dist/traces/{run-2026-03-17T13-58-29-402Z.ndjson → run-2026-03-18T19-02-50-465Z.ndjson} +84 -84
  124. package/dist/{output/traces/run-2026-03-17T13-59-10-403Z.ndjson → traces/run-2026-03-18T19-03-30-428Z.ndjson} +2037 -2037
  125. package/dist/types/config.d.ts +33 -0
  126. package/dist/types/config.d.ts.map +1 -1
  127. package/dist/whatsapp/webhook-runner.d.ts +4 -0
  128. package/dist/whatsapp/webhook-runner.d.ts.map +1 -1
  129. package/package.json +2 -2
  130. package/dist/sdk/a2a-frontend-BDACLGMA.mjs.map +0 -1
  131. package/dist/sdk/a2a-frontend-IWOUJOIZ.mjs.map +0 -1
  132. package/dist/sdk/chunk-4DVP6KVC.mjs.map +0 -1
  133. package/dist/sdk/chunk-DGIH6EX3.mjs.map +0 -1
  134. package/dist/sdk/chunk-QGBASDYP.mjs.map +0 -1
  135. package/dist/sdk/chunk-VMVIM4JB.mjs.map +0 -1
  136. /package/dist/sdk/{check-provider-registry-4YFVBGYU.mjs.map → check-provider-registry-MHXQGUNN.mjs.map} +0 -0
  137. /package/dist/sdk/{check-provider-registry-4YKTEDKF.mjs.map → check-provider-registry-RRWCXSTG.mjs.map} +0 -0
  138. /package/dist/sdk/{check-provider-registry-67ZLGDDQ.mjs.map → check-provider-registry-Y33CRFVD.mjs.map} +0 -0
  139. /package/dist/sdk/{chunk-VXC2XNQJ.mjs.map → chunk-5J3DNRF7.mjs.map} +0 -0
  140. /package/dist/sdk/{chunk-7YZSSO4X.mjs.map → chunk-6DPPP7LD.mjs.map} +0 -0
  141. /package/dist/sdk/{chunk-J73GEFPT.mjs.map → chunk-DHETLQIX.mjs.map} +0 -0
  142. /package/dist/sdk/{config-TSA5FUOM.mjs.map → config-2STD74CJ.mjs.map} +0 -0
  143. /package/dist/sdk/{failure-condition-evaluator-HTPB5FYW.mjs.map → config-JE4HKTWW.mjs.map} +0 -0
  144. /package/dist/sdk/{routing-YVMTKFDZ.mjs.map → failure-condition-evaluator-5DZYMCGW.mjs.map} +0 -0
  145. /package/dist/sdk/{schedule-tool-ADUXTCY7.mjs.map → failure-condition-evaluator-R6DCDJAV.mjs.map} +0 -0
  146. /package/dist/sdk/{github-frontend-3SDFCCKI.mjs.map → github-frontend-3PSCKPAJ.mjs.map} +0 -0
  147. /package/dist/sdk/{host-CVH2CSHM.mjs.map → host-54CHV2LW.mjs.map} +0 -0
  148. /package/dist/sdk/{host-QE4L7UXE.mjs.map → host-WAU6CT42.mjs.map} +0 -0
  149. /package/dist/sdk/{host-VBBSLUWG.mjs.map → host-X5ZZCEWN.mjs.map} +0 -0
  150. /package/dist/sdk/{schedule-tool-Z5VG67JK.mjs.map → routing-CVQT4KHX.mjs.map} +0 -0
  151. /package/dist/sdk/{schedule-tool-ZMX3Y7LF.mjs.map → routing-EBAE5SSO.mjs.map} +0 -0
  152. /package/dist/sdk/{schedule-tool-handler-N7UNABOA.mjs.map → schedule-tool-POY3CDZL.mjs.map} +0 -0
  153. /package/dist/sdk/{schedule-tool-handler-PCERK6ZZ.mjs.map → schedule-tool-R2OAATUS.mjs.map} +0 -0
  154. /package/dist/sdk/{schedule-tool-handler-QOJVFRB4.mjs.map → schedule-tool-Z6QYL2B3.mjs.map} +0 -0
  155. /package/dist/sdk/{trace-helpers-KXDOJWBL.mjs.map → schedule-tool-handler-J4NUETJ6.mjs.map} +0 -0
  156. /package/dist/sdk/{workflow-check-provider-CJXW2Z4F.mjs.map → schedule-tool-handler-JMAKHPI7.mjs.map} +0 -0
  157. /package/dist/sdk/{workflow-check-provider-NTHC5ZBF.mjs.map → schedule-tool-handler-MWFUIQKR.mjs.map} +0 -0
  158. /package/dist/sdk/{workflow-check-provider-SRIMWKLQ.mjs.map → trace-helpers-HL5FBX65.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/config-loader.ts","../../src/generated/config-schema.ts","../../src/config.ts"],"sourcesContent":["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 * Annotate tool definitions with their source base directory.\n * This is used at runtime to resolve relative tool assets (e.g., API specs).\n */\n private annotateToolsBaseDir(config: Partial<VisorConfig>, baseDir: string): void {\n if (!config.tools || typeof config.tools !== 'object') {\n return;\n }\n for (const tool of Object.values(config.tools)) {\n if (!tool || typeof tool !== 'object') continue;\n (tool as any).__baseDir = (tool as any).__baseDir || baseDir;\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 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 // Normalize 'include' (alias) to 'extends' for nested chains\n if ((config as any).include && !(config as any).extends) {\n const inc = (config as any).include;\n (config as any).extends = Array.isArray(inc) ? inc : [inc];\n delete (config as any).include;\n }\n\n // Remember where this config came from to resolve relative tool assets.\n this.annotateToolsBaseDir(config, path.dirname(resolvedPath));\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: any) {\n if (error && (error.code === 'ENOENT' || error.code === 'ENOTDIR')) {\n throw new Error(`Configuration file not found: ${resolvedPath}`);\n }\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 try {\n const parsed = new URL(url);\n const baseUrl = new URL('.', parsed).toString();\n this.annotateToolsBaseDir(config, baseUrl);\n } catch {\n // Best-effort only.\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 // Only support new non-dot filename\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) {\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 // Alias: support 'include' as 'extends' in packaged defaults\n if ((config as any).include && !(config as any).extends) {\n const inc = (config as any).include;\n (config as any).extends = Array.isArray(inc) ? inc : [inc];\n delete (config as any).include;\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 // Ensure relative paths (e.g., ./code-review.yaml) resolve from the defaults directory\n const previousBaseDir = this.options.baseDir;\n try {\n this.options.baseDir = path.dirname(defaultConfigPath);\n return await this.processExtends(config);\n } finally {\n this.options.baseDir = previousBaseDir;\n }\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 canonicalize = (p: string): string => {\n const resolved = path.resolve(p);\n try {\n return path.normalize(fs.realpathSync.native(resolved));\n } catch {\n return path.normalize(resolved);\n }\n };\n const normalizedPath = canonicalize(resolvedPath);\n const normalizedRoot = canonicalize(projectRoot);\n\n // Check if the resolved path is within the project root\n if (\n normalizedPath !== normalizedRoot &&\n !normalizedPath.startsWith(`${normalizedRoot}${path.sep}`)\n ) {\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/etc/',\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, merge with 'steps' taking precedence on key conflicts\n if (config.steps && config.checks) {\n const merged = { ...(config.checks as Record<string, unknown>), ...(config.steps as any) };\n config.checks = merged as any;\n config.steps = merged as any;\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","// 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/VisorConfigSchema',\n definitions: {\n VisorConfigSchema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n hooks: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\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 include: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n description:\n 'Alias for extends - include from other configurations (backward compatibility)',\n },\n tools: {\n $ref: '#/definitions/Record%3Cstring%2CCustomToolDefinition%3E',\n description: 'Custom tool definitions that can be used in MCP blocks',\n },\n imports: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Import workflow definitions from external files or URLs',\n },\n inputs: {\n type: 'array',\n items: {\n $ref: '#/definitions/WorkflowInput',\n },\n description: 'Workflow inputs (for standalone reusable workflows)',\n },\n outputs: {\n type: 'array',\n items: {\n $ref: '#/definitions/WorkflowOutput',\n },\n description: 'Workflow outputs (for standalone reusable workflows)',\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 (optional - defaults provided)',\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 max_ai_concurrency: {\n type: 'number',\n description:\n 'Maximum total concurrent AI API calls across all checks (default: unlimited). When set, creates a shared concurrency limiter that gates every LLM request across all ProbeAgent instances in this run.',\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 limits: {\n $ref: '#/definitions/LimitsConfig',\n description: 'Global execution limits',\n },\n frontends: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: \"Frontend name, e.g., 'ndjson-sink', 'github'\",\n },\n config: {\n description: 'Frontend-specific configuration',\n },\n },\n required: ['name'],\n additionalProperties: false,\n },\n description: 'Optional integrations: event-driven frontends (e.g., ndjson-sink, github)',\n },\n workspace: {\n $ref: '#/definitions/WorkspaceConfig',\n description: 'Workspace isolation configuration for sandboxed execution',\n },\n sandbox: {\n type: 'string',\n description:\n 'Workspace-level default sandbox name (all checks use this unless overridden)',\n },\n sandboxes: {\n $ref: '#/definitions/Record%3Cstring%2CSandboxConfig%3E',\n description: 'Named sandbox environment definitions',\n },\n sandbox_defaults: {\n $ref: '#/definitions/SandboxDefaults',\n description: 'Workspace-level sandbox defaults (env allowlist, etc.)',\n },\n slack: {\n $ref: '#/definitions/SlackConfig',\n description: 'Slack configuration',\n },\n telegram: {\n $ref: '#/definitions/TelegramConfig',\n description: 'Telegram bot configuration',\n },\n email: {\n $ref: '#/definitions/EmailConfig',\n description: 'Email integration configuration',\n },\n whatsapp: {\n $ref: '#/definitions/WhatsAppConfig',\n description: 'WhatsApp bot configuration',\n },\n teams: {\n $ref: '#/definitions/TeamsConfig',\n description: 'Microsoft Teams bot configuration',\n },\n scheduler: {\n $ref: '#/definitions/SchedulerConfig',\n description: 'Scheduler configuration for scheduled workflow execution',\n },\n policy: {\n $ref: '#/definitions/PolicyConfig',\n description: 'Enterprise policy engine configuration',\n },\n agent_protocol: {\n $ref: '#/definitions/AgentProtocolConfig',\n description: 'Agent protocol (A2A) server configuration',\n },\n task_tracking: {\n type: 'boolean',\n description:\n 'Enable cross-frontend task tracking (default: false). When true, all workflow executions (CLI, Slack, TUI, Scheduler) are recorded in a shared SQLite TaskStore visible via `visor tasks`.',\n },\n graceful_restart: {\n $ref: '#/definitions/GracefulRestartConfig',\n description: 'Graceful restart configuration',\n },\n task_evaluate: {\n anyOf: [\n {\n type: 'boolean',\n },\n {\n $ref: '#/definitions/TaskEvaluateConfig',\n },\n ],\n description:\n 'Automatically evaluate completed tasks using an LLM judge. Requires task_tracking to be enabled. Runs asynchronously after task completion. Set to `true` for defaults, or provide an object to configure.',\n },\n },\n required: ['version'],\n patternProperties: {\n '^x-': {},\n },\n },\n 'Record<string,unknown>': {\n type: 'object',\n additionalProperties: {},\n },\n 'Record<string,CustomToolDefinition>': {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/CustomToolDefinition',\n },\n },\n CustomToolDefinition: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['command', 'api', 'workflow', 'http_client', 'utcp'],\n description: \"Tool implementation type (defaults to 'command')\",\n },\n name: {\n type: 'string',\n description: 'Tool name - used to reference the tool in MCP blocks',\n },\n description: {\n type: 'string',\n description: 'Description of what the tool does',\n },\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n const: 'object',\n },\n properties: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n required: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n additionalProperties: {\n type: 'boolean',\n },\n },\n required: ['type'],\n additionalProperties: false,\n description: 'Input schema for the tool (JSON Schema format)',\n patternProperties: {\n '^x-': {},\n },\n },\n exec: {\n type: 'string',\n description:\n \"Command to execute - supports Liquid template (required for type: 'command')\",\n },\n stdin: {\n type: 'string',\n description: 'Optional stdin input - supports Liquid template',\n },\n transform: {\n type: 'string',\n description: 'Transform the raw output - supports Liquid template',\n },\n transform_js: {\n type: 'string',\n description: 'Transform the output using JavaScript - alternative to transform',\n },\n cwd: {\n type: 'string',\n description: 'Working directory for command execution',\n },\n env: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'Environment variables for the command',\n },\n timeout: {\n type: 'number',\n description: 'Timeout in milliseconds',\n },\n parseJson: {\n type: 'boolean',\n description: 'Whether to parse output as JSON automatically',\n },\n outputSchema: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Expected output schema for validation',\n },\n spec: {\n anyOf: [\n {\n type: 'string',\n },\n {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n ],\n description: \"OpenAPI specification path/URL or inline object (required for type: 'api')\",\n },\n overlays: {\n anyOf: [\n {\n type: 'string',\n },\n {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n ],\n },\n },\n ],\n description: 'Overlay path/URL, inline object, or a mixed array applied in order',\n },\n targetUrl: {\n type: 'string',\n description: 'Override API base URL instead of OpenAPI servers',\n },\n target_url: {\n type: 'string',\n description: 'Alias for targetUrl (snake_case)',\n },\n whitelist: {\n anyOf: [\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n {\n type: 'string',\n },\n ],\n description:\n 'Include only operations matching these glob patterns (operationId or METHOD:/path)',\n },\n blacklist: {\n anyOf: [\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n {\n type: 'string',\n },\n ],\n description:\n 'Exclude operations matching these glob patterns (ignored when whitelist is set)',\n },\n headers: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'Extra headers added to all API requests',\n },\n disableXMcp: {\n type: 'boolean',\n description: 'Disable X-MCP: 1 request header',\n },\n disable_x_mcp: {\n type: 'boolean',\n description: 'Alias for disableXMcp (snake_case)',\n },\n apiKey: {\n type: 'string',\n description: 'API key fallback credential used by security schemes',\n },\n api_key: {\n type: 'string',\n description: 'Alias for apiKey (snake_case)',\n },\n securitySchemeName: {\n type: 'string',\n description: 'Preferred security scheme name (optional hint)',\n },\n security_scheme_name: {\n type: 'string',\n description: 'Alias for securitySchemeName (snake_case)',\n },\n securityCredentials: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'Credentials by OpenAPI security scheme name',\n },\n security_credentials: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'Alias for securityCredentials (snake_case)',\n },\n namePrefix: {\n type: 'string',\n description: 'Optional prefix prepended to generated operation tool names',\n },\n name_prefix: {\n type: 'string',\n description: 'Alias for namePrefix (snake_case)',\n },\n requestTimeoutMs: {\n type: 'number',\n description: 'Request timeout in milliseconds for API calls',\n },\n request_timeout_ms: {\n type: 'number',\n description: 'Alias for requestTimeoutMs (snake_case)',\n },\n base_url: {\n type: 'string',\n description: 'Base URL for HTTP client tools',\n },\n auth: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n },\n token: {\n type: 'string',\n },\n },\n required: ['type'],\n additionalProperties: {},\n description: 'Authentication config for HTTP client tools',\n patternProperties: {\n '^x-': {},\n },\n },\n rate_limit: {\n $ref: '#/definitions/RateLimitConfig',\n description: 'Rate limiting configuration for HTTP/API tools',\n },\n __utcpManual: {\n anyOf: [\n {\n type: 'string',\n },\n {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n ],\n description: 'UTCP manual source (URL, file path, or inline call template)',\n },\n __utcpToolName: {\n type: 'string',\n description: 'Resolved UTCP tool name from discovery',\n },\n __utcpVariables: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'UTCP variables for authentication',\n },\n __utcpPlugins: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: \"UTCP plugins to load (default: ['http'])\",\n },\n workflow: {\n type: 'string',\n description: \"Workflow ID (registry lookup) or file path (for type: 'workflow')\",\n },\n inputs: {\n type: 'array',\n items: {\n $ref: '#/definitions/WorkflowInput',\n },\n description: \"Inline workflow inputs (for type: 'workflow' with inline steps)\",\n },\n outputs: {\n type: 'array',\n items: {\n $ref: '#/definitions/WorkflowOutput',\n },\n description: \"Inline workflow outputs (for type: 'workflow' with inline steps)\",\n },\n steps: {\n $ref: '#/definitions/Record%3Cstring%2CCheckConfig%3E',\n description: \"Inline workflow steps (for type: 'workflow' with inline definition)\",\n },\n },\n required: ['name'],\n additionalProperties: false,\n description: 'Custom tool definition for use in MCP blocks',\n patternProperties: {\n '^x-': {},\n },\n },\n 'Record<string,string>': {\n type: 'object',\n additionalProperties: {\n type: 'string',\n },\n },\n RateLimitConfig: {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n description: 'Shared bucket name; defaults to URL origin',\n },\n requests: {\n type: 'number',\n description: 'Max requests per window',\n },\n per: {\n type: 'string',\n enum: ['second', 'minute', 'hour'],\n description: 'Time window unit',\n },\n max_retries: {\n type: 'number',\n description: 'Max retries on 429 (default: 3)',\n },\n backoff: {\n type: 'string',\n enum: ['fixed', 'exponential'],\n description: 'Backoff strategy (default: exponential)',\n },\n initial_delay_ms: {\n type: 'number',\n description: 'Base delay for backoff in ms (default: 1000)',\n },\n },\n required: ['requests', 'per'],\n additionalProperties: false,\n description: 'Rate limit configuration for HTTP/API requests.',\n patternProperties: {\n '^x-': {},\n },\n },\n WorkflowInput: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Input parameter name',\n },\n schema: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'JSON Schema for the input',\n },\n required: {\n type: 'boolean',\n description: 'Whether this input is required',\n },\n default: {\n description: 'Default value if not provided',\n },\n description: {\n type: 'string',\n description: 'Human-readable description',\n },\n },\n required: ['name'],\n additionalProperties: false,\n description: 'Workflow input definition for standalone reusable workflows',\n patternProperties: {\n '^x-': {},\n },\n },\n WorkflowOutput: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Output name',\n },\n description: {\n type: 'string',\n description: 'Human-readable description',\n },\n value: {\n type: 'string',\n description: 'Value using Liquid template syntax (references step outputs)',\n },\n value_js: {\n type: 'string',\n description: 'Value using JavaScript expression (alternative to value)',\n },\n },\n required: ['name'],\n additionalProperties: false,\n description: 'Workflow output definition for standalone reusable workflows',\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 rate_limit: {\n $ref: '#/definitions/RateLimitConfig',\n description: 'Rate limiting configuration for http_client checks',\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 content: {\n type: 'string',\n description: 'Script content to execute for script checks',\n },\n tools: {\n type: 'array',\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'object',\n properties: {\n workflow: {\n type: 'string',\n },\n args: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n },\n required: ['workflow'],\n additionalProperties: false,\n },\n ],\n },\n description:\n 'Tool names to expose inside script checks (string names or workflow references)',\n },\n tools_js: {\n type: 'string',\n description: 'JavaScript expression to dynamically compute tools for script checks',\n },\n mcp_servers: {\n $ref: '#/definitions/Record%3Cstring%2CMcpServerConfig%3E',\n description: 'MCP servers whose tools are exposed inside script checks',\n },\n enable_fetch: {\n type: 'boolean',\n description: 'Enable fetch() function in script checks (default: false)',\n },\n enable_bash: {\n type: 'boolean',\n description: 'Enable bash() function in script checks (default: false)',\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_persona: {\n type: 'string',\n description: \"Optional persona hint, prepended to the prompt as 'Persona: <value>'\",\n },\n ai_prompt_type: {\n type: 'string',\n description: 'Probe promptType for this check (underscore style)',\n },\n ai_max_iterations: {\n type: 'number',\n description: 'Maximum tool iterations for ProbeAgent (underscore style)',\n },\n ai_system_prompt: {\n type: 'string',\n description: 'System prompt for this check (underscore style)',\n },\n ai_custom_prompt: {\n type: 'string',\n description: 'Legacy customPrompt (underscore style) — deprecated, use ai_system_prompt',\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 ai_mcp_servers_js: {\n type: 'string',\n description:\n 'JavaScript expression to dynamically compute MCP servers for this AI check. Expression has access to: outputs, inputs, pr, files, env, memory Must return an object mapping server names to McpServerConfig objects.\\n\\nExample: ``` const servers = {}; const tags = outputs[\\'route-intent\\']?.tags || []; if (tags.includes(\\'jira\\')) { servers.jira = { command: \"npx\", args: [\"-y\", \"@aashari/mcp-server-atlassian-jira\"], env: { ATLASSIAN_SITE_NAME: \"mysite\" } }; } return servers; ```',\n },\n ai_custom_tools: {\n type: 'array',\n items: {\n type: 'string',\n },\n description:\n 'List of custom tool names to expose to this AI check via ephemeral SSE MCP server',\n },\n ai_custom_tools_js: {\n type: 'string',\n description:\n \"JavaScript expression to dynamically compute custom tools for this AI check. Expression has access to: outputs, inputs, pr, files, env, memory Must return an array of tool names (strings) or WorkflowToolReference objects ({ workflow: string, args?: Record<string, unknown> })\\n\\nExample: ``` const tools = []; if (outputs['route-intent'].intent === 'engineer') { tools.push({ workflow: 'engineer', args: { projects: ['tyk'] } }); } return tools; ```\",\n },\n ai_bash_config_js: {\n type: 'string',\n description:\n \"JavaScript expression to dynamically compute bash configuration for this AI check. Expression has access to: outputs, inputs, pr, files, env, memory Must return a BashConfig object with allow/deny arrays.\\n\\nExample: ``` return outputs['build-config']?.bash_config ?? {}; ```\",\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:\n 'Timeout in milliseconds for command execution (default: 60000, i.e., 60 seconds)',\n },\n depends_on: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n description:\n 'Check IDs that this check depends on (optional). Accepts single string or array.',\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 output_schema: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description:\n \"Optional JSON Schema to validate the produced output. If omitted and `schema` is an object, the engine will treat that object as the output_schema for validation purposes while still using string schemas (e.g., 'code-review') for template selection.\",\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 criticality: {\n type: 'string',\n enum: ['external', 'internal', 'policy', 'info'],\n description:\n \"Operational criticality of this step. Drives default safety policies (contracts, retries, loop budgets) at load time. Behavior can still be overridden explicitly per step via on_*, fail_if, assume/guarantee, etc.\\n\\n- 'external': interacts with external systems (side effects). Highest safety.\\n- 'internal': modifies CI/config/state but not prod. High safety.\\n- 'policy': organizational checks (linting, style, doc). Moderate safety.\\n- 'info': informational checks. Lowest safety.\",\n },\n continue_on_failure: {\n type: 'boolean',\n description:\n \"Allow dependents to run even if this step fails. Defaults to false (dependents are gated when this step fails). Similar to GitHub Actions' continue-on-error.\",\n },\n forEach: {\n type: 'boolean',\n description: 'Process output as array and run dependent checks for each item',\n },\n fanout: {\n type: 'string',\n enum: ['map', 'reduce'],\n description:\n \"Control scheduling behavior when this check is triggered via routing (run/goto) from a forEach scope.\\n- 'map': schedule once per item (fan-out) using item scopes.\\n- 'reduce': schedule a single run at the parent scope (aggregation). If unset, the current default is a single run (reduce) for backward compatibility.\",\n },\n reduce: {\n type: 'boolean',\n description: \"Alias for fanout: 'reduce'\",\n },\n on_init: {\n $ref: '#/definitions/OnInitConfig',\n description:\n 'Init routing configuration for this check (runs before execution/preprocessing)',\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 on_finish: {\n $ref: '#/definitions/OnFinishConfig',\n description:\n 'Finish routing configuration for forEach checks (runs after ALL iterations complete)',\n },\n assume: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n description:\n \"Preconditions that must hold before executing the check. If any expression evaluates to false, the check is skipped (skipReason='assume').\",\n },\n guarantee: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n description:\n 'Postconditions that should hold after executing the check. Expressions are evaluated against the produced result/output; violations are recorded as error issues with ruleId \"contract/guarantee_failed\".',\n },\n max_runs: {\n type: 'number',\n description:\n 'Hard cap on how many times this check may execute within a single engine run. Overrides global limits.max_runs_per_check. Set to 0 or negative to disable for this step.',\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 output_format: {\n type: 'string',\n enum: ['json', 'text'],\n description:\n \"Output parsing hint for command provider (optional) When set to 'json', command stdout is expected to be JSON. When 'text', treat as plain text. Note: command provider attempts JSON parsing heuristically; this flag mainly suppresses schema warnings and may be used by providers to alter parsing behavior in the future.\",\n },\n operation: {\n type: 'string',\n enum: ['get', 'set', 'append', 'increment', 'delete', 'clear', 'list'],\n description: \"Memory operation to perform. Use `type: 'script'` for custom JavaScript.\",\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 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 command_args: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Command arguments (for stdio transport in MCP checks)',\n },\n workingDirectory: {\n type: 'string',\n description: 'Working directory (for stdio transport in MCP checks)',\n },\n manual: {\n anyOf: [\n {\n type: 'string',\n },\n {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n ],\n description: 'UTCP manual source: URL string, file path, or inline call template object',\n },\n variables: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'UTCP variables for manual authentication/configuration',\n },\n plugins: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: \"UTCP plugins to load (default: ['http'])\",\n },\n placeholder: {\n type: 'string',\n description: 'Placeholder text to show in input field',\n },\n allow_empty: {\n type: 'boolean',\n description: 'Allow empty input (default: false)',\n },\n multiline: {\n type: 'boolean',\n description: 'Support multiline input (default: false)',\n },\n default: {\n type: 'string',\n description: 'Default value if timeout occurs or empty input when allow_empty is true',\n },\n workflow: {\n type: 'string',\n description: 'Workflow ID or path to workflow file',\n },\n args: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Arguments/inputs for the workflow',\n },\n overrides: {\n $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-15521-30601-src_types_config.ts-0-61047%3E%3E',\n description: 'Override specific step configurations in the workflow',\n },\n output_mapping: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'Map workflow outputs to check outputs',\n },\n workflow_inputs: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Alias for args - workflow inputs (backward compatibility)',\n },\n config: {\n type: 'string',\n description:\n 'Config file path - alternative to workflow ID (loads a Visor config file as workflow)',\n },\n workflow_overrides: {\n $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-15521-30601-src_types_config.ts-0-61047%3E%3E',\n description: 'Alias for overrides - workflow step overrides (backward compatibility)',\n },\n ref: {\n type: 'string',\n description: 'Git reference to checkout (branch, tag, commit SHA) - supports templates',\n },\n repository: {\n type: 'string',\n description: 'Repository URL or owner/repo format (defaults to current repository)',\n },\n token: {\n type: 'string',\n description: 'GitHub token for private repositories (defaults to GITHUB_TOKEN env)',\n },\n fetch_depth: {\n type: 'number',\n description: 'Number of commits to fetch (0 for full history, default: 1)',\n },\n fetch_tags: {\n type: 'boolean',\n description: 'Whether to fetch tags (default: false)',\n },\n submodules: {\n anyOf: [\n {\n type: 'boolean',\n },\n {\n type: 'string',\n const: 'recursive',\n },\n ],\n description: \"Checkout submodules: false, true, or 'recursive'\",\n },\n working_directory: {\n type: 'string',\n description: 'Working directory for the checkout (defaults to temp directory)',\n },\n use_worktree: {\n type: 'boolean',\n description: 'Use git worktree for efficient parallel checkouts (default: true)',\n },\n clean: {\n type: 'boolean',\n description: 'Clean the working directory before checkout (default: true)',\n },\n sparse_checkout: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Sparse checkout paths - only checkout specific directories/files',\n },\n lfs: {\n type: 'boolean',\n description: 'Enable Git LFS (Large File Storage)',\n },\n clone_timeout_ms: {\n type: 'number',\n description: 'Timeout in ms for cloning the bare repository (default: 300000 = 5 min)',\n },\n cleanup_on_failure: {\n type: 'boolean',\n description: 'Clean up worktree on failure (default: true)',\n },\n persist_worktree: {\n type: 'boolean',\n description: 'Keep worktree after workflow completion (default: false)',\n },\n sandbox: {\n type: 'string',\n description: 'Sandbox name to use for this check (overrides workspace-level default)',\n },\n policy: {\n $ref: '#/definitions/StepPolicyOverride',\n description: 'Per-step policy override (enterprise)',\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 'script',\n 'http',\n 'http_input',\n 'http_client',\n 'noop',\n 'log',\n 'memory',\n 'github',\n 'claude-code',\n 'mcp',\n 'human-input',\n 'workflow',\n 'git-checkout',\n 'a2a',\n 'utcp',\n ],\n description: 'Valid check types in configuration',\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 (presence indicates stdio 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 url: {\n type: 'string',\n description: 'URL endpoint (presence indicates external server)',\n },\n transport: {\n type: 'string',\n enum: ['stdio', 'sse', 'http'],\n description: 'Transport type',\n },\n workflow: {\n type: 'string',\n description: 'Workflow ID or path (presence indicates workflow tool)',\n },\n inputs: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Inputs to pass to workflow',\n },\n description: {\n type: 'string',\n description: 'Tool description for AI',\n },\n allowedMethods: {\n type: 'array',\n items: {\n type: 'string',\n },\n description:\n 'Whitelist specific methods from this MCP server (supports wildcards like \"search_*\")',\n },\n blockedMethods: {\n type: 'array',\n items: {\n type: 'string',\n },\n description:\n 'Block specific methods from this MCP server (supports wildcards like \"*_delete\")',\n },\n },\n additionalProperties: false,\n description:\n 'Unified MCP server/tool entry - type detected by which properties are present\\n\\nDetection logic (priority order): 1. Has `command` → stdio MCP server (external process) 2. Has `url` → SSE/HTTP MCP server (external endpoint) 3. Has `workflow` → workflow tool reference 4. Empty `{}` or just key → auto-detect from `tools:` section',\n patternProperties: {\n '^x-': {},\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 'slack_message',\n 'telegram_message',\n 'email_message',\n 'whatsapp_message',\n 'teams_message',\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 max_iterations: {\n type: 'number',\n description: 'Maximum tool iterations for ProbeAgent',\n },\n debug: {\n type: 'boolean',\n description: 'Enable debug mode',\n },\n prompt_type: {\n type: 'string',\n description: 'Probe promptType to use (e.g., engineer, code-review, architect)',\n },\n system_prompt: {\n type: 'string',\n description: 'System prompt (baseline preamble). Replaces legacy custom_prompt.',\n },\n custom_prompt: {\n type: 'string',\n description:\n 'Probe customPrompt (baseline/system prompt) — deprecated, use system_prompt',\n },\n skip_code_context: {\n type: 'boolean',\n description: 'Skip adding code context (diffs, files, PR info) to the prompt',\n },\n skip_slack_context: {\n type: 'boolean',\n description:\n 'Skip adding Slack conversation context to the prompt (when running under Slack)',\n },\n skip_transport_context: {\n type: 'boolean',\n description:\n 'Skip adding transport-specific context (e.g., GitHub PR/issue XML, Slack conversation XML) to the prompt. When true, this behaves like setting both skip_code_context and skip_slack_context to true, unless those are explicitly overridden.',\n },\n mcpServers: {\n $ref: '#/definitions/Record%3Cstring%2CMcpServerConfig%3E',\n description: 'MCP servers configuration',\n },\n enableDelegate: {\n type: 'boolean',\n description: 'Enable the delegate tool for task distribution to subagents',\n },\n enableTasks: {\n type: 'boolean',\n description: 'Enable task management for tracking multi-goal requests',\n },\n retry: {\n $ref: '#/definitions/AIRetryConfig',\n description: 'Retry configuration for this provider',\n },\n fallback: {\n $ref: '#/definitions/AIFallbackConfig',\n description: 'Fallback configuration for provider failures',\n },\n allowEdit: {\n type: 'boolean',\n description:\n 'Enable Edit and Create tools for file modification (disabled by default for security)',\n },\n allowedTools: {\n type: 'array',\n items: {\n type: 'string',\n },\n description:\n 'Filter allowed tools - supports whitelist, exclusion (!prefix), or raw AI mode (empty array)',\n },\n disableTools: {\n type: 'boolean',\n description: 'Disable all tools for raw AI mode (alternative to allowedTools: [])',\n },\n allowBash: {\n type: 'boolean',\n description: 'Enable bash command execution (shorthand for bashConfig.enabled)',\n },\n search_delegate_provider: {\n type: 'string',\n description:\n \"Override provider for search delegate sub-agents (e.g., 'google' for cheaper search)\",\n },\n search_delegate_model: {\n type: 'string',\n description: \"Override model for search delegate sub-agents (e.g., 'gemini-2.0-flash')\",\n },\n bashConfig: {\n $ref: '#/definitions/BashConfig',\n description: 'Advanced bash command execution configuration',\n },\n completion_prompt: {\n type: 'string',\n description:\n 'Completion prompt for post-completion validation/review (runs after attempt_completion)',\n },\n enable_scheduler: {\n type: 'boolean',\n description:\n 'Enable the schedule tool for scheduling workflow executions (requires scheduler configuration)',\n },\n enableExecutePlan: {\n type: 'boolean',\n description:\n 'Enable the execute_plan DSL orchestration tool (replaces analyze_all when enabled)',\n },\n ai_timeout: {\n type: 'number',\n description:\n 'Probe-level timeout in milliseconds for graceful wind-down (maxOperationTimeout). When set, Probe injects \"TIME LIMIT REACHED\" and gives bonus steps before hard abort. Defaults to (timeout - 90s) when not explicitly set. The main `timeout` field controls Visor\\'s external hard kill (always active).',\n },\n timeout_behavior: {\n type: 'string',\n enum: ['graceful', 'negotiated'],\n description:\n \"Timeout behavior: 'graceful' (default) injects wind-down message; 'negotiated' uses observer LLM to decide extensions\",\n },\n negotiated_timeout_budget: {\n type: 'number',\n description: 'Total extra time budget in ms for negotiated timeout extensions',\n },\n negotiated_timeout_max_requests: {\n type: 'number',\n description: 'Maximum number of extension requests for negotiated timeout',\n },\n negotiated_timeout_max_per_request: {\n type: 'number',\n description: 'Maximum time in ms per individual extension request',\n },\n graceful_stop_deadline: {\n type: 'number',\n description: 'Wind-down deadline in ms for sub-agents after graceful stop is triggered',\n },\n },\n additionalProperties: false,\n description: 'AI provider configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n AIRetryConfig: {\n type: 'object',\n properties: {\n maxRetries: {\n type: 'number',\n description: 'Maximum retry attempts (0-50)',\n },\n initialDelay: {\n type: 'number',\n description: 'Initial delay in milliseconds (0-60000)',\n },\n maxDelay: {\n type: 'number',\n description: 'Maximum delay cap in milliseconds (0-300000)',\n },\n backoffFactor: {\n type: 'number',\n description: 'Exponential backoff multiplier (1-10)',\n },\n retryableErrors: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Custom error patterns to retry on',\n },\n },\n additionalProperties: false,\n description: 'Retry configuration for AI provider calls',\n patternProperties: {\n '^x-': {},\n },\n },\n AIFallbackConfig: {\n type: 'object',\n properties: {\n strategy: {\n type: 'string',\n enum: ['same-model', 'same-provider', 'any', 'custom'],\n description: \"Fallback strategy: 'same-model', 'same-provider', 'any', or 'custom'\",\n },\n providers: {\n type: 'array',\n items: {\n $ref: '#/definitions/AIFallbackProviderConfig',\n },\n description: 'Array of fallback provider configurations',\n },\n maxTotalAttempts: {\n type: 'number',\n description: 'Maximum total attempts across all providers',\n },\n auto: {\n type: 'boolean',\n description: 'Enable automatic fallback using available environment variables',\n },\n },\n additionalProperties: false,\n description: 'Fallback configuration for AI providers',\n patternProperties: {\n '^x-': {},\n },\n },\n AIFallbackProviderConfig: {\n type: 'object',\n properties: {\n provider: {\n type: 'string',\n enum: ['google', 'anthropic', 'openai', 'bedrock'],\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 for this provider',\n },\n maxRetries: {\n type: 'number',\n description: 'Per-provider retry override',\n },\n region: {\n type: 'string',\n description: 'AWS region (for Bedrock)',\n },\n accessKeyId: {\n type: 'string',\n description: 'AWS access key ID (for Bedrock)',\n },\n secretAccessKey: {\n type: 'string',\n description: 'AWS secret access key (for Bedrock)',\n },\n },\n required: ['provider', 'model'],\n additionalProperties: false,\n description: 'Fallback provider configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n BashConfig: {\n type: 'object',\n properties: {\n allow: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: \"Array of permitted command patterns (e.g., ['ls', 'git status'])\",\n },\n deny: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: \"Array of blocked command patterns (e.g., ['rm -rf', 'sudo'])\",\n },\n disableDefaultAllow: {\n type: 'boolean',\n description: 'Disable default safe command list (use with caution)',\n },\n disableDefaultDeny: {\n type: 'boolean',\n description: 'Disable default dangerous command blocklist (use with extreme caution)',\n },\n timeout: {\n type: 'number',\n description: 'Execution timeout in milliseconds',\n },\n workingDirectory: {\n type: 'string',\n description: 'Default working directory for command execution',\n },\n },\n additionalProperties: false,\n description:\n \"Bash command execution configuration for ProbeAgent Note: Use 'allowBash: true' in AIProviderConfig to enable bash execution\",\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 enableDelegate: {\n type: 'boolean',\n description: 'Enable the delegate tool for task distribution to subagents',\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 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 OnInitConfig: {\n type: 'object',\n properties: {\n run: {\n type: 'array',\n items: {\n $ref: '#/definitions/OnInitRunItem',\n },\n description: 'Items to run before this check executes',\n },\n run_js: {\n type: 'string',\n description: 'Dynamic init items: JS expression returning OnInitRunItem[]',\n },\n transitions: {\n type: 'array',\n items: {\n $ref: '#/definitions/TransitionRule',\n },\n description: 'Declarative transitions (optional, for advanced use cases)',\n },\n },\n additionalProperties: false,\n description:\n 'Init routing configuration per check Runs BEFORE the check executes (preprocessing/setup)',\n patternProperties: {\n '^x-': {},\n },\n },\n OnInitRunItem: {\n anyOf: [\n {\n $ref: '#/definitions/OnInitToolInvocation',\n },\n {\n $ref: '#/definitions/OnInitStepInvocation',\n },\n {\n $ref: '#/definitions/OnInitWorkflowInvocation',\n },\n {\n type: 'string',\n },\n ],\n description: 'Unified on_init run item - can be tool, step, workflow, or plain string',\n },\n OnInitToolInvocation: {\n type: 'object',\n properties: {\n tool: {\n type: 'string',\n description: 'Tool name (must exist in tools: section)',\n },\n with: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Arguments to pass to the tool (Liquid templates supported)',\n },\n as: {\n type: 'string',\n description: 'Custom output name (defaults to tool name)',\n },\n },\n required: ['tool'],\n additionalProperties: false,\n description: 'Invoke a custom tool (from tools: section)',\n patternProperties: {\n '^x-': {},\n },\n },\n OnInitStepInvocation: {\n type: 'object',\n properties: {\n step: {\n type: 'string',\n description: 'Step name (must exist in steps: section)',\n },\n with: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Arguments to pass to the step (Liquid templates supported)',\n },\n as: {\n type: 'string',\n description: 'Custom output name (defaults to step name)',\n },\n },\n required: ['step'],\n additionalProperties: false,\n description: 'Invoke a helper step (regular check)',\n patternProperties: {\n '^x-': {},\n },\n },\n OnInitWorkflowInvocation: {\n type: 'object',\n properties: {\n workflow: {\n type: 'string',\n description: 'Workflow ID or path',\n },\n with: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Workflow inputs (Liquid templates supported)',\n },\n as: {\n type: 'string',\n description: 'Custom output name (defaults to workflow name)',\n },\n overrides: {\n $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-15521-30601-src_types_config.ts-0-61047%3E%3E',\n description: 'Step overrides',\n },\n output_mapping: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n description: 'Output mapping',\n },\n },\n required: ['workflow'],\n additionalProperties: false,\n description: 'Invoke a reusable workflow',\n patternProperties: {\n '^x-': {},\n },\n },\n 'Record<string,Partial<interface-src_types_config.ts-15521-30601-src_types_config.ts-0-61047>>':\n {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/Partial%3Cinterface-src_types_config.ts-15521-30601-src_types_config.ts-0-61047%3E',\n },\n },\n 'Partial<interface-src_types_config.ts-15521-30601-src_types_config.ts-0-61047>': {\n type: 'object',\n additionalProperties: false,\n },\n TransitionRule: {\n type: 'object',\n properties: {\n when: {\n type: 'string',\n description:\n 'JavaScript expression evaluated in the same sandbox as goto_js; truthy enables the rule.',\n },\n to: {\n type: ['string', 'null'],\n description: 'Target step ID, or null to explicitly prevent goto.',\n },\n goto_event: {\n $ref: '#/definitions/EventTrigger',\n description: 'Optional event override when performing goto.',\n },\n },\n required: ['when'],\n additionalProperties: false,\n description: 'Declarative transition rule for on_* blocks.',\n patternProperties: {\n '^x-': {},\n },\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 transitions: {\n type: 'array',\n items: {\n $ref: '#/definitions/TransitionRule',\n },\n description:\n \"Declarative transitions. Evaluated in order; first matching rule wins. If a rule's `to` is null, no goto occurs. When omitted or none match, the engine falls back to goto_js/goto for backward compatibility.\",\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 $ref: '#/definitions/OnSuccessRunItem',\n },\n description:\n 'Post-success steps to run - can be step names or rich invocations with arguments',\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 transitions: {\n type: 'array',\n items: {\n $ref: '#/definitions/TransitionRule',\n },\n description: 'Declarative transitions (see OnFailConfig.transitions).',\n },\n },\n additionalProperties: false,\n description: 'Success routing configuration per check',\n patternProperties: {\n '^x-': {},\n },\n },\n OnSuccessRunItem: {\n anyOf: [\n {\n type: 'string',\n },\n {\n $ref: '#/definitions/OnInitStepInvocation',\n },\n {\n $ref: '#/definitions/OnInitWorkflowInvocation',\n },\n ],\n description:\n 'Success routing run item - can be step name, step with args, or workflow with args',\n },\n OnFinishConfig: {\n type: 'object',\n properties: {\n run: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Post-finish 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-finish steps: JS expression returning string[]',\n },\n transitions: {\n type: 'array',\n items: {\n $ref: '#/definitions/TransitionRule',\n },\n description: 'Declarative transitions (see OnFailConfig.transitions).',\n },\n },\n additionalProperties: false,\n description:\n 'Finish routing configuration for forEach checks Runs once after ALL iterations of forEach and ALL dependent checks complete',\n patternProperties: {\n '^x-': {},\n },\n },\n StepPolicyOverride: {\n type: 'object',\n properties: {\n require: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n description: 'Required role(s) - any of these roles suffices',\n },\n deny: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Explicit deny for roles',\n },\n rule: {\n type: 'string',\n description: 'Custom OPA rule path for this step',\n },\n },\n additionalProperties: false,\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 enabled: {\n type: 'boolean',\n description: 'Whether PR comments are enabled',\n },\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 LimitsConfig: {\n type: 'object',\n properties: {\n max_runs_per_check: {\n type: 'number',\n description:\n 'Maximum number of executions per check within a single engine run. Applies to each distinct scope independently for forEach item executions. Set to 0 or negative to disable. Default: 50.',\n },\n max_workflow_depth: {\n type: 'number',\n description:\n 'Maximum nesting depth for workflows executed by the state machine engine. Nested workflows are invoked by the workflow provider; this limit prevents accidental infinite recursion. Default: 3.',\n },\n },\n additionalProperties: false,\n description: 'Global engine limits',\n patternProperties: {\n '^x-': {},\n },\n },\n WorkspaceConfig: {\n type: 'object',\n properties: {\n enabled: {\n type: 'boolean',\n description: 'Enable workspace isolation (default: true when config present)',\n },\n base_path: {\n type: 'string',\n description: 'Base path for workspaces (default: /tmp/visor-workspaces)',\n },\n name: {\n type: 'string',\n description: 'Workspace directory name (defaults to session id)',\n },\n main_project_name: {\n type: 'string',\n description:\n 'Main project folder name inside the workspace (defaults to original directory name)',\n },\n cleanup_on_exit: {\n type: 'boolean',\n description: 'Clean up workspace on exit (default: true)',\n },\n include_main_project: {\n type: 'boolean',\n description: 'Include main project worktree in AI allowed folders (default: false)',\n },\n },\n additionalProperties: false,\n description: 'Workspace isolation configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n 'Record<string,SandboxConfig>': {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/SandboxConfig',\n },\n },\n SandboxConfig: {\n type: 'object',\n properties: {\n engine: {\n type: 'string',\n enum: ['docker', 'bubblewrap', 'seatbelt'],\n description:\n \"Sandbox engine type: 'docker' (default), 'bubblewrap' (Linux namespaces), or 'seatbelt' (macOS sandbox-exec)\",\n },\n image: {\n type: 'string',\n description: 'Docker image to use (e.g., \"node:20-alpine\")',\n },\n dockerfile: {\n type: 'string',\n description: 'Path to Dockerfile (relative to config file or absolute)',\n },\n dockerfile_inline: {\n type: 'string',\n description: 'Inline Dockerfile content',\n },\n compose: {\n type: 'string',\n description: 'Path to docker-compose file',\n },\n service: {\n type: 'string',\n description: 'Service name within the compose file',\n },\n workdir: {\n type: 'string',\n description: 'Working directory inside container (default: /workspace)',\n },\n env_passthrough: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Glob patterns for host env vars to forward into sandbox',\n },\n network: {\n type: 'boolean',\n description: 'Enable/disable network access (default: true)',\n },\n read_only: {\n type: 'boolean',\n description: 'Mount repo as read-only (default: false)',\n },\n resources: {\n $ref: '#/definitions/SandboxResourceConfig',\n description: 'Resource limits',\n },\n visor_path: {\n type: 'string',\n description: 'Where visor is mounted inside container (default: /opt/visor)',\n },\n cache: {\n $ref: '#/definitions/SandboxCacheConfig',\n description: 'Cache volume configuration',\n },\n bind_paths: {\n type: 'array',\n items: {\n $ref: '#/definitions/SandboxBindPath',\n },\n description: 'Additional host paths to bind-mount into the sandbox',\n },\n },\n additionalProperties: false,\n description: 'Configuration for a single sandbox environment',\n patternProperties: {\n '^x-': {},\n },\n },\n SandboxResourceConfig: {\n type: 'object',\n properties: {\n memory: {\n type: 'string',\n description: 'Memory limit (e.g., \"512m\", \"2g\")',\n },\n cpu: {\n type: 'number',\n description: 'CPU limit (e.g., 1.0, 0.5)',\n },\n },\n additionalProperties: false,\n description: 'Resource limits for sandbox containers',\n patternProperties: {\n '^x-': {},\n },\n },\n SandboxCacheConfig: {\n type: 'object',\n properties: {\n prefix: {\n type: 'string',\n description: 'Liquid template for cache scope prefix (default: git branch)',\n },\n fallback_prefix: {\n type: 'string',\n description: 'Fallback prefix when current prefix has no cache',\n },\n paths: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Paths inside the container to cache',\n },\n ttl: {\n type: 'string',\n description: 'Time-to-live for cache volumes (e.g., \"7d\", \"24h\")',\n },\n max_scopes: {\n type: 'number',\n description: 'Maximum number of cache scopes to keep',\n },\n },\n required: ['paths'],\n additionalProperties: false,\n description: 'Cache configuration for sandbox volumes',\n patternProperties: {\n '^x-': {},\n },\n },\n SandboxBindPath: {\n type: 'object',\n properties: {\n host: {\n type: 'string',\n description: 'Host path (supports ~ prefix for home directory)',\n },\n container: {\n type: 'string',\n description: 'Container path (defaults to resolved host path)',\n },\n read_only: {\n type: 'boolean',\n description: 'Mount as read-only (default: true)',\n },\n },\n required: ['host'],\n additionalProperties: false,\n description: 'Additional host path to bind-mount into the sandbox',\n patternProperties: {\n '^x-': {},\n },\n },\n SandboxDefaults: {\n type: 'object',\n properties: {\n env_passthrough: {\n type: 'array',\n items: {\n type: 'string',\n },\n description:\n 'Base env var patterns for all sandboxes (replaces hardcoded defaults when set)',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n SlackConfig: {\n type: 'object',\n properties: {\n version: {\n type: 'string',\n description: 'Slack API version',\n },\n mentions: {\n type: 'string',\n description: \"Mention handling: 'all', 'direct', etc.\",\n },\n threads: {\n type: 'string',\n description: \"Thread handling: 'required', 'optional', etc.\",\n },\n allow_bot_messages: {\n type: 'boolean',\n description: 'Allow bot_message events to trigger runs (default: false)',\n },\n show_raw_output: {\n type: 'boolean',\n description: 'Show raw output in Slack responses',\n },\n telemetry: {\n $ref: '#/definitions/SlackTelemetryConfig',\n description: 'Append telemetry identifiers to Slack replies.',\n },\n },\n additionalProperties: false,\n description: 'Slack configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n SlackTelemetryConfig: {\n type: 'object',\n properties: {\n enabled: {\n type: 'boolean',\n description: 'Enable telemetry ID suffix in Slack messages',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n TelegramConfig: {\n type: 'object',\n properties: {\n bot_token: {\n type: 'string',\n description: 'Bot token from',\n },\n polling_timeout: {\n type: 'number',\n description: 'Polling timeout in seconds for getUpdates (default: 30)',\n },\n chat_allowlist: {\n type: 'array',\n items: {\n type: ['string', 'number'],\n },\n description: 'Chat/group allowlist - numeric chat IDs that the bot responds in',\n },\n require_mention: {\n type: 'boolean',\n description: 'In groups, only respond when',\n },\n workflow: {\n type: 'string',\n description: 'Workflow to run when a message is received',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n EmailConfig: {\n type: 'object',\n properties: {\n receive: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['imap', 'resend'],\n description: \"Backend type: 'imap' (universal) or 'resend' (managed webhook)\",\n },\n host: {\n type: 'string',\n description: 'IMAP server hostname',\n },\n port: {\n type: 'number',\n description: 'IMAP server port (default: 993)',\n },\n auth: {\n type: 'object',\n properties: {\n user: {\n type: 'string',\n },\n pass: {\n type: 'string',\n },\n },\n additionalProperties: false,\n description: 'IMAP auth credentials',\n patternProperties: {\n '^x-': {},\n },\n },\n secure: {\n type: 'boolean',\n description: 'Use TLS (default: true)',\n },\n poll_interval: {\n type: 'number',\n description: 'Polling interval in seconds when IDLE not available (default: 30)',\n },\n folder: {\n type: 'string',\n description: \"IMAP folder to monitor (default: 'INBOX')\",\n },\n mark_read: {\n type: 'boolean',\n description: 'Mark processed messages as read (default: true)',\n },\n api_key: {\n type: 'string',\n description: \"Resend API key (for type: 'resend')\",\n },\n webhook_secret: {\n type: 'string',\n description: 'Resend webhook secret for signature verification',\n },\n },\n additionalProperties: false,\n description: 'Receive backend configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n send: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['smtp', 'resend'],\n description: \"Backend type: 'smtp' (universal) or 'resend' (managed API)\",\n },\n host: {\n type: 'string',\n description: 'SMTP server hostname',\n },\n port: {\n type: 'number',\n description: 'SMTP server port (default: 587)',\n },\n auth: {\n type: 'object',\n properties: {\n user: {\n type: 'string',\n },\n pass: {\n type: 'string',\n },\n },\n additionalProperties: false,\n description: 'SMTP auth credentials',\n patternProperties: {\n '^x-': {},\n },\n },\n secure: {\n type: 'boolean',\n description: 'Use TLS (default: true)',\n },\n from: {\n type: 'string',\n description: 'Default sender address (e.g., \"Bot <bot@example.com>\")',\n },\n api_key: {\n type: 'string',\n description: \"Resend API key (for type: 'resend')\",\n },\n },\n additionalProperties: false,\n description: 'Send backend configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n allowlist: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Only process emails from these senders',\n },\n workflow: {\n type: 'string',\n description: 'Workflow to run when an email is received',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n WhatsAppConfig: {\n type: 'object',\n properties: {\n access_token: {\n type: 'string',\n description: 'WhatsApp Cloud API access token (or WHATSAPP_ACCESS_TOKEN env var)',\n },\n phone_number_id: {\n type: 'string',\n description:\n 'Phone Number ID from Meta Business Suite (or WHATSAPP_PHONE_NUMBER_ID env var)',\n },\n app_secret: {\n type: 'string',\n description:\n 'Meta App Secret for webhook signature verification (or WHATSAPP_APP_SECRET env var)',\n },\n verify_token: {\n type: 'string',\n description:\n 'Verify token for webhook subscription challenge (or WHATSAPP_VERIFY_TOKEN env var)',\n },\n api_version: {\n type: 'string',\n description: \"Graph API version (default: 'v21.0')\",\n },\n port: {\n type: 'number',\n description: 'Port for webhook HTTP server (default: 8443)',\n },\n host: {\n type: 'string',\n description: \"Host for webhook HTTP server (default: '0.0.0.0')\",\n },\n phone_allowlist: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Phone number allowlist — only respond to these numbers',\n },\n workflow: {\n type: 'string',\n description: 'Workflow to run when a message is received',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n TeamsConfig: {\n type: 'object',\n properties: {\n app_id: {\n type: 'string',\n description: 'Azure AD App (client) ID (or TEAMS_APP_ID env var)',\n },\n app_password: {\n type: 'string',\n description: 'Azure AD App client secret (or TEAMS_APP_PASSWORD env var)',\n },\n tenant_id: {\n type: 'string',\n description: 'Azure AD Tenant ID for single-tenant apps (or TEAMS_TENANT_ID env var)',\n },\n port: {\n type: 'number',\n description: 'Port for webhook HTTP server (default: 3978)',\n },\n host: {\n type: 'string',\n description: \"Host for webhook HTTP server (default: '0.0.0.0')\",\n },\n user_allowlist: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'User ID allowlist — only respond to these AAD user IDs',\n },\n workflow: {\n type: 'string',\n description: 'Workflow to run when a message is received',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n SchedulerConfig: {\n type: 'object',\n properties: {\n enabled: {\n type: 'boolean',\n description: 'Enable/disable the scheduler (default: true)',\n },\n storage: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to schedules JSON file (legacy, triggers auto-migration)',\n },\n driver: {\n type: 'string',\n enum: ['sqlite', 'postgresql', 'mysql', 'mssql'],\n description: \"Database driver (default: 'sqlite')\",\n },\n connection: {\n $ref: '#/definitions/SchedulerStorageConnectionConfig',\n description: 'Database connection configuration',\n },\n },\n additionalProperties: false,\n description: 'Storage configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n ha: {\n $ref: '#/definitions/SchedulerHAConfig',\n description: 'High-availability configuration for multi-node deployments',\n },\n limits: {\n $ref: '#/definitions/SchedulerLimitsConfig',\n description: 'Limits for dynamic schedules',\n },\n default_timezone: {\n type: 'string',\n description: 'Default timezone (IANA format, e.g., \"America/New_York\")',\n },\n check_interval_ms: {\n type: 'number',\n description: 'Check interval in milliseconds (default: 60000)',\n },\n permissions: {\n $ref: '#/definitions/SchedulerPermissionsConfig',\n description: 'Permissions for dynamic schedule creation (via AI tool)',\n },\n cron: {\n $ref: '#/definitions/Record%3Cstring%2CStaticCronJob%3E',\n description: 'Static cron jobs defined in configuration (always executed)',\n },\n on_message: {\n $ref: '#/definitions/Record%3Cstring%2CSlackMessageTrigger%3E',\n description: 'Slack message triggers for reactive workflow execution',\n },\n },\n additionalProperties: false,\n description: 'Scheduler configuration for workflow scheduling',\n patternProperties: {\n '^x-': {},\n },\n },\n SchedulerStorageConnectionConfig: {\n type: 'object',\n properties: {\n filename: {\n type: 'string',\n description: \"SQLite database file path (default: '.visor/schedules.db')\",\n },\n host: {\n type: 'string',\n description: 'Database host (PostgreSQL/MySQL/MSSQL)',\n },\n port: {\n type: 'number',\n description: 'Database port (PostgreSQL/MySQL/MSSQL)',\n },\n database: {\n type: 'string',\n description: 'Database name (PostgreSQL/MySQL/MSSQL)',\n },\n user: {\n type: 'string',\n description: 'Database user (PostgreSQL/MySQL/MSSQL)',\n },\n password: {\n type: 'string',\n description: 'Database password (PostgreSQL/MySQL/MSSQL)',\n },\n ssl: {\n anyOf: [\n {\n type: 'boolean',\n },\n {\n $ref: '#/definitions/SchedulerSslConfig',\n },\n ],\n description: 'SSL/TLS configuration (PostgreSQL/MySQL/MSSQL)',\n },\n connection_string: {\n type: 'string',\n description: 'Connection string URL (e.g., postgresql://user:pass@host/db)',\n },\n pool: {\n type: 'object',\n properties: {\n min: {\n type: 'number',\n },\n max: {\n type: 'number',\n },\n },\n additionalProperties: false,\n description: 'Connection pool configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n },\n additionalProperties: false,\n description: 'Scheduler storage connection configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n SchedulerSslConfig: {\n type: 'object',\n properties: {\n enabled: {\n type: 'boolean',\n description: 'Enable SSL (default: true when SslConfig object is provided)',\n },\n reject_unauthorized: {\n type: 'boolean',\n description: 'Reject unauthorized certificates (default: true)',\n },\n ca: {\n type: 'string',\n description: 'Path to CA certificate PEM file',\n },\n cert: {\n type: 'string',\n description: 'Path to client certificate PEM file',\n },\n key: {\n type: 'string',\n description: 'Path to client key PEM file',\n },\n },\n additionalProperties: false,\n description: 'SSL/TLS configuration for scheduler database connections',\n patternProperties: {\n '^x-': {},\n },\n },\n SchedulerHAConfig: {\n type: 'object',\n properties: {\n enabled: {\n type: 'boolean',\n description: 'Enable distributed locking for multi-node deployments (default: false)',\n },\n node_id: {\n type: 'string',\n description: 'Unique node identifier (default: hostname-pid)',\n },\n lock_ttl: {\n type: 'number',\n description: 'Lock time-to-live in seconds (default: 60)',\n },\n heartbeat_interval: {\n type: 'number',\n description: 'Heartbeat interval for lock renewal in seconds (default: 15)',\n },\n },\n additionalProperties: false,\n description: 'Scheduler high-availability configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n SchedulerLimitsConfig: {\n type: 'object',\n properties: {\n max_per_user: {\n type: 'number',\n description: 'Maximum schedules per user (default: 25)',\n },\n max_recurring_per_user: {\n type: 'number',\n description: 'Maximum recurring schedules per user (default: 10)',\n },\n max_global: {\n type: 'number',\n description: 'Maximum total schedules (default: 1000)',\n },\n },\n additionalProperties: false,\n description: 'Scheduler limits configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n SchedulerPermissionsConfig: {\n type: 'object',\n properties: {\n allow_personal: {\n type: 'boolean',\n description: 'Allow personal schedules (via DM or CLI)',\n },\n allow_channel: {\n type: 'boolean',\n description: 'Allow channel schedules (in Slack channels)',\n },\n allow_dm: {\n type: 'boolean',\n description: 'Allow DM schedules (to specific users)',\n },\n allowed_workflows: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'List of allowed workflow patterns (glob-style, e.g., \"report-*\")',\n },\n denied_workflows: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'List of denied workflow patterns',\n },\n },\n additionalProperties: false,\n description: 'Scheduler permissions for dynamic schedule creation',\n patternProperties: {\n '^x-': {},\n },\n },\n 'Record<string,StaticCronJob>': {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/StaticCronJob',\n },\n },\n StaticCronJob: {\n type: 'object',\n properties: {\n schedule: {\n type: 'string',\n description: 'Cron expression (e.g., \"0 9 * * 1\" for every Monday at 9am)',\n },\n workflow: {\n type: 'string',\n description: 'Workflow/check ID to run',\n },\n inputs: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Optional workflow inputs',\n },\n output: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['slack', 'github', 'webhook', 'none'],\n description: 'Output type: slack, github, webhook, or none',\n },\n target: {\n type: 'string',\n description: 'Target (channel name, repo, URL)',\n },\n thread_id: {\n type: 'string',\n description: 'Thread ID for threaded outputs',\n },\n },\n required: ['type'],\n additionalProperties: false,\n description: 'Output destination configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n description: {\n type: 'string',\n description: 'Description for logging/display',\n },\n enabled: {\n type: 'boolean',\n description: 'Enable/disable this job (default: true)',\n },\n timezone: {\n type: 'string',\n description: 'Timezone for schedule (default: UTC or scheduler default)',\n },\n },\n required: ['schedule', 'workflow'],\n additionalProperties: false,\n description:\n 'Static cron job defined in YAML configuration These are always executed by the scheduler daemon',\n patternProperties: {\n '^x-': {},\n },\n },\n 'Record<string,SlackMessageTrigger>': {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/SlackMessageTrigger',\n },\n },\n SlackMessageTrigger: {\n type: 'object',\n properties: {\n channels: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Channel IDs to monitor (supports wildcard suffix, e.g., \"CENG*\")',\n },\n from: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Only trigger on messages from these user IDs',\n },\n from_bots: {\n type: 'boolean',\n description: 'Allow bot messages to trigger (default: false)',\n },\n contains: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Keyword match - any keyword triggers (case-insensitive OR)',\n },\n match: {\n type: 'string',\n description: 'Regex pattern to match against message text',\n },\n threads: {\n type: 'string',\n enum: ['root_only', 'thread_only', 'any'],\n description: \"Thread scope filter (default: 'any')\",\n },\n workflow: {\n type: 'string',\n description: 'Workflow/check ID to execute',\n },\n inputs: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n description: 'Optional workflow inputs',\n },\n output: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['slack', 'github', 'webhook', 'none'],\n description: 'Output type: slack, github, webhook, or none',\n },\n target: {\n type: 'string',\n description: 'Target (channel name, repo, URL)',\n },\n thread_id: {\n type: 'string',\n description: 'Thread ID for threaded outputs',\n },\n },\n required: ['type'],\n additionalProperties: false,\n description: 'Output destination configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n description: {\n type: 'string',\n description: 'Description for logging/display',\n },\n enabled: {\n type: 'boolean',\n description: 'Enable/disable this trigger (default: true)',\n },\n },\n required: ['workflow'],\n additionalProperties: false,\n description:\n 'Slack message trigger for reactive workflow execution Triggers workflows based on Slack messages matching configured filters',\n patternProperties: {\n '^x-': {},\n },\n },\n PolicyConfig: {\n type: 'object',\n properties: {\n engine: {\n type: 'string',\n enum: ['local', 'remote', 'disabled'],\n description: 'Policy engine mode',\n },\n rules: {\n anyOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n description: 'Path to .rego files or .wasm bundle (local mode)',\n },\n data: {\n type: 'string',\n description: 'Path to a JSON file to load as OPA data document',\n },\n url: {\n type: 'string',\n description: 'OPA server URL (remote mode)',\n },\n fallback: {\n type: 'string',\n enum: ['allow', 'deny', 'warn'],\n description: 'Default decision when policy evaluation fails',\n },\n timeout: {\n type: 'number',\n description: 'Evaluation timeout in ms (default: 5000)',\n },\n roles: {\n $ref: '#/definitions/Record%3Cstring%2CPolicyRoleConfig%3E',\n description: 'Role definitions: map role names to conditions',\n },\n },\n required: ['engine'],\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n 'Record<string,PolicyRoleConfig>': {\n type: 'object',\n additionalProperties: {\n $ref: '#/definitions/PolicyRoleConfig',\n },\n },\n PolicyRoleConfig: {\n type: 'object',\n properties: {\n author_association: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'GitHub author associations that map to this role',\n },\n teams: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'GitHub team slugs (requires GitHub API)',\n },\n users: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Explicit GitHub usernames',\n },\n slack_users: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Slack user IDs (e.g., [\"U0123ABC\"])',\n },\n emails: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Email addresses for identity matching (e.g., [\"alice@co.com\"])',\n },\n slack_channels: {\n type: 'array',\n items: {\n type: 'string',\n },\n description: 'Slack channel IDs — role only applies when triggered from these channels',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n AgentProtocolConfig: {\n type: 'object',\n properties: {\n enabled: {\n type: 'boolean',\n },\n protocol: {\n type: 'string',\n },\n agent_card: {\n type: 'string',\n },\n agent_card_inline: {\n $ref: '#/definitions/AgentCard',\n },\n public_url: {\n type: 'string',\n },\n port: {\n type: 'number',\n },\n host: {\n type: 'string',\n },\n tls: {\n $ref: '#/definitions/AgentProtocolTlsConfig',\n },\n auth: {\n $ref: '#/definitions/AgentProtocolAuthConfig',\n },\n default_workflow: {\n type: 'string',\n },\n skill_routing: {\n $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n },\n task_ttl: {\n type: 'string',\n },\n queue: {\n $ref: '#/definitions/AgentProtocolQueueConfig',\n },\n },\n required: ['enabled', 'protocol'],\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n AgentCard: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n version: {\n type: 'string',\n },\n provider: {\n type: 'object',\n properties: {\n organization: {\n type: 'string',\n },\n url: {\n type: 'string',\n },\n },\n required: ['organization'],\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n supported_interfaces: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n },\n protocol_binding: {\n type: 'string',\n },\n protocol_version: {\n type: 'string',\n },\n },\n required: ['url'],\n additionalProperties: false,\n },\n },\n capabilities: {\n $ref: '#/definitions/AgentCapabilities',\n },\n default_input_modes: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n default_output_modes: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n security_schemes: {\n $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n },\n security_requirements: {\n type: 'array',\n items: {},\n },\n skills: {\n type: 'array',\n items: {\n $ref: '#/definitions/AgentSkill',\n },\n },\n icon_url: {\n type: 'string',\n },\n },\n required: ['name'],\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n AgentCapabilities: {\n type: 'object',\n properties: {\n streaming: {\n type: 'boolean',\n },\n push_notifications: {\n type: 'boolean',\n },\n extensions: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n extended_agent_card: {\n type: 'boolean',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n AgentSkill: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n description: {\n type: 'string',\n },\n tags: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n examples: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n input_modes: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n output_modes: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n required: ['id', 'name', 'description'],\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n AgentProtocolTlsConfig: {\n type: 'object',\n properties: {\n cert: {\n type: 'string',\n },\n key: {\n type: 'string',\n },\n },\n required: ['cert', 'key'],\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n AgentProtocolAuthConfig: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['bearer', 'api_key', 'none'],\n },\n token_env: {\n type: 'string',\n },\n header_name: {\n type: 'string',\n },\n param_name: {\n type: 'string',\n },\n key_env: {\n type: 'string',\n },\n },\n required: ['type'],\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n AgentProtocolQueueConfig: {\n type: 'object',\n properties: {\n poll_interval: {\n type: 'number',\n },\n max_concurrent: {\n type: 'number',\n },\n stale_claim_timeout: {\n type: 'number',\n },\n },\n additionalProperties: false,\n patternProperties: {\n '^x-': {},\n },\n },\n GracefulRestartConfig: {\n type: 'object',\n properties: {\n drain_timeout_ms: {\n type: 'number',\n description:\n 'Max time in ms to wait for in-flight work to complete. 0 = unlimited (default).',\n },\n child_ready_timeout_ms: {\n type: 'number',\n description:\n 'Max time in ms to wait for the new child process to become ready. Default: 15000.',\n },\n notify_users: {\n type: 'boolean',\n description: 'Send \"restarting\" messages to active conversations. Default: true.',\n },\n restart_command: {\n type: 'string',\n description:\n 'Override the command used to spawn the new process. If not set, auto-detects: npx re-invokes npx, direct execution re-spawns same binary.',\n },\n },\n additionalProperties: false,\n description: 'Graceful restart configuration',\n patternProperties: {\n '^x-': {},\n },\n },\n TaskEvaluateConfig: {\n type: 'object',\n properties: {\n enabled: {\n type: 'boolean',\n description: 'Enable auto-evaluation (default: true when config object is present)',\n },\n model: {\n type: 'string',\n description:\n 'LLM model to use for evaluation (e.g. \"gemini-2.5-flash\", \"claude-sonnet-4-5\")',\n },\n provider: {\n type: 'string',\n description: 'AI provider: google, openai, anthropic',\n },\n prompt: {\n type: 'string',\n description:\n 'Custom system prompt for the evaluator (overrides the default evaluation prompt)',\n },\n },\n additionalProperties: false,\n description: 'Configuration for automatic task evaluation via LLM judge.',\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';\nimport { validateJsSyntax } from './utils/sandbox';\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 'slack_message',\n 'telegram_message',\n 'email_message',\n 'whatsapp_message',\n 'teams_message',\n] as const;\n\n/**\n * Configuration manager for Visor\n */\nexport class ConfigManager {\n private validCheckTypes: ConfigCheckType[] = [\n 'ai',\n 'claude-code',\n 'mcp',\n 'command',\n 'script',\n 'http',\n 'http_input',\n 'http_client',\n 'memory',\n 'noop',\n 'log',\n 'github',\n 'human-input',\n 'workflow',\n 'git-checkout',\n 'a2a',\n 'utcp',\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 * Annotate tools with the originating config directory for relative asset resolution.\n */\n private annotateToolBaseDirs(config: Partial<VisorConfig>, baseDir: string): void {\n if (!config.tools || typeof config.tools !== 'object') {\n return;\n }\n for (const tool of Object.values(config.tools)) {\n if (!tool || typeof tool !== 'object') continue;\n (tool as any).__baseDir = (tool as any).__baseDir || baseDir;\n }\n }\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 let configContent: string;\n try {\n // Attempt to read directly; if not found or not accessible, an error will be thrown\n configContent = fs.readFileSync(resolvedPath, 'utf8');\n } catch (readErr: any) {\n if (readErr && (readErr.code === 'ENOENT' || readErr.code === 'ENOTDIR')) {\n throw new Error(`Configuration file not found: ${resolvedPath}`);\n }\n throw new Error(\n `Failed to read configuration file ${resolvedPath}: ${readErr?.message || String(readErr)}`\n );\n }\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/include directive (include is an alias for extends)\n const extendsValue = parsedConfig.extends || (parsedConfig as any).include;\n if (extendsValue) {\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/include\n const extends_ = Array.isArray(extendsValue) ? extendsValue : [extendsValue];\n\n // Remove extends and include fields from config\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { extends: _, include: __, ...configWithoutExtends } = parsedConfig as any;\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 // Check if this is a workflow definition file (has 'id' field indicating it's a workflow)\n // Do this BEFORE normalizing to avoid copying workflow steps to checks\n if ((parsedConfig as any).id && typeof (parsedConfig as any).id === 'string') {\n parsedConfig = await this.convertWorkflowToConfig(parsedConfig, path.dirname(resolvedPath));\n }\n\n // Tag tools with this config's directory so relative API specs/overlays resolve correctly.\n this.annotateToolBaseDirs(parsedConfig, path.dirname(resolvedPath));\n\n // Normalize 'checks' and 'steps'. Prefer checks when this config used extends/include\n // so child overrides win over bundled defaults that may live under steps.\n parsedConfig = this.normalizeStepsAndChecks(parsedConfig, !!extendsValue);\n\n // Load workflows if defined\n await this.loadWorkflows(parsedConfig, path.dirname(resolvedPath));\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 * Load configuration from an in-memory object (used by the test runner to\n * handle co-located config + tests without writing temp files).\n */\n public async loadConfigFromObject(\n obj: Partial<VisorConfig>,\n options: ConfigLoadOptions & { baseDir?: string } = {}\n ): Promise<VisorConfig> {\n const { validate = true, mergeDefaults = true, allowedRemotePatterns, baseDir } = options;\n try {\n let parsedConfig: Partial<VisorConfig> = JSON.parse(JSON.stringify(obj || {}));\n if (!parsedConfig || typeof parsedConfig !== 'object') {\n throw new Error('Configuration must be a YAML/JSON object');\n }\n\n const extendsValue = (parsedConfig as any).extends || (parsedConfig as any).include;\n if (extendsValue) {\n const loaderOptions: ConfigLoaderOptions = {\n baseDir: baseDir || process.cwd(),\n allowRemote: this.isRemoteExtendsAllowed(),\n maxDepth: 10,\n allowedRemotePatterns,\n };\n const loader = new ConfigLoader(loaderOptions);\n const extends_ = Array.isArray(extendsValue) ? extendsValue : [extendsValue];\n // Remove extends/include\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { extends: _, include: __, ...configWithoutExtends } = parsedConfig as any;\n let mergedConfig: Partial<VisorConfig> = {};\n for (const source of extends_) {\n console.log(`📦 Extending from: ${source}`);\n const parentConfig = await loader.fetchConfig(String(source));\n mergedConfig = new ConfigMerger().merge(mergedConfig, parentConfig);\n }\n parsedConfig = new ConfigMerger().merge(mergedConfig, configWithoutExtends);\n parsedConfig = new ConfigMerger().removeDisabledChecks(parsedConfig);\n }\n\n // Convert workflow definition to runnable config if needed\n if ((parsedConfig as any).id && typeof (parsedConfig as any).id === 'string') {\n parsedConfig = await this.convertWorkflowToConfig(parsedConfig, baseDir || process.cwd());\n }\n\n this.annotateToolBaseDirs(parsedConfig, baseDir || process.cwd());\n\n parsedConfig = this.normalizeStepsAndChecks(parsedConfig, !!extendsValue);\n await this.loadWorkflows(parsedConfig, baseDir || process.cwd());\n\n if (validate) this.validateConfig(parsedConfig);\n\n let finalConfig = parsedConfig as VisorConfig;\n if (mergeDefaults) finalConfig = this.mergeWithDefaults(parsedConfig) as VisorConfig;\n return finalConfig;\n } catch (error) {\n if (error instanceof Error) throw new Error(`Failed to load configuration: ${error.message}`);\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 candidates = ['visor.yaml', 'visor.yml', '.visor.yaml', '.visor.yml'].map(p =>\n path.join(baseDir, p)\n );\n\n for (const p of candidates) {\n try {\n const st = fs.statSync(p);\n if (!st.isFile()) continue;\n const isLegacy = path.basename(p).startsWith('.');\n if (isLegacy) {\n // Allow legacy dotfile unless strict mode enabled\n if (process.env.VISOR_STRICT_CONFIG_NAME === 'true') {\n const rel = path.relative(baseDir, p);\n throw new Error(\n `Legacy config detected: ${rel}. Please rename to visor.yaml (or visor.yml).`\n );\n }\n return this.loadConfig(p, options);\n }\n return this.loadConfig(p, options);\n } catch (e: any) {\n if (e && e.code === 'ENOENT') continue; // try next\n // Surface unexpected errors\n if (e) throw e;\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 // Only support new non-dot filename\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) {\n // Always log to stderr to avoid contaminating formatted output\n console.error(`📦 Loading bundled default configuration from ${bundledConfigPath}`);\n // Synchronous loader for bundled defaults with shallow extends support\n const readAndParse = (p: string): Partial<VisorConfig> => {\n const raw = fs.readFileSync(p, 'utf8');\n const obj = yaml.load(raw) as Partial<VisorConfig>;\n if (!obj || typeof obj !== 'object') return {};\n // Alias: support 'include' as 'extends' in packaged defaults\n if ((obj as any).include && !(obj as any).extends) {\n const inc = (obj as any).include;\n (obj as any).extends = Array.isArray(inc) ? inc : [inc];\n delete (obj as any).include;\n }\n return obj;\n };\n const baseDir = path.dirname(bundledConfigPath);\n const merger = new (require('./utils/config-merger').ConfigMerger)();\n\n const loadWithExtendsSync = (p: string): Partial<VisorConfig> => {\n const current = readAndParse(p);\n const extVal: any = (current as any).extends || (current as any).include;\n // Strip extends/include to prevent re-processing\n if ((current as any).extends !== undefined) delete (current as any).extends;\n if ((current as any).include !== undefined) delete (current as any).include;\n if (!extVal) return current;\n const list = Array.isArray(extVal) ? extVal : [extVal];\n let acc: Partial<VisorConfig> = {};\n for (const src of list) {\n const rel = typeof src === 'string' ? src : String(src);\n const abs = path.isAbsolute(rel) ? rel : path.resolve(baseDir, rel);\n const parentCfg = loadWithExtendsSync(abs);\n acc = merger.merge(acc, parentCfg);\n }\n return merger.merge(acc, current);\n };\n\n let parsedConfig = loadWithExtendsSync(bundledConfigPath);\n // Normalize and validate as usual\n parsedConfig = this.normalizeStepsAndChecks(parsedConfig);\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 * Convert a workflow definition file to a visor config\n * When a workflow YAML is run standalone, register the workflow and use its tests as checks\n */\n private async convertWorkflowToConfig(\n workflowData: any,\n basePath: string\n ): Promise<Partial<VisorConfig>> {\n const { WorkflowRegistry } = await import('./workflow-registry');\n const registry = WorkflowRegistry.getInstance();\n\n // Register the workflow\n const workflowId = workflowData.id;\n logger.info(`Detected standalone workflow file: ${workflowId}`);\n\n // Process imports first so dependencies are available\n if (workflowData.imports && Array.isArray(workflowData.imports)) {\n for (const source of workflowData.imports) {\n try {\n const results = await registry.import(source, { basePath, validate: true });\n for (const result of results) {\n if (!result.valid && result.errors) {\n const errors = result.errors.map(e => ` ${e.path}: ${e.message}`).join('\\n');\n throw new Error(`Failed to import workflow from '${source}':\\n${errors}`);\n }\n }\n logger.info(`Imported workflows from: ${source}`);\n } catch (err: unknown) {\n // If the workflow already exists, log a warning but don't fail\n const errMsg = err instanceof Error ? err.message : String(err);\n if (errMsg.includes('already exists')) {\n logger.debug(`Workflow from '${source}' already imported, skipping`);\n } else {\n throw err;\n }\n }\n }\n }\n\n // Extract tests before modifying workflowData\n const tests = workflowData.tests || {};\n\n // Create a clean workflow definition (without tests and imports)\n const workflowDefinition = { ...workflowData };\n delete workflowDefinition.tests;\n delete workflowDefinition.imports;\n\n // Register the workflow itself\n const result = registry.register(workflowDefinition, 'standalone', { override: true });\n if (!result.valid && result.errors) {\n const errors = result.errors.map(e => ` ${e.path}: ${e.message}`).join('\\n');\n throw new Error(`Failed to register workflow '${workflowId}':\\n${errors}`);\n }\n\n logger.info(`Registered workflow '${workflowId}' for standalone execution`);\n\n // For standalone workflow testing, use the workflow's steps as checks\n // This allows the test runner to execute the workflow steps directly\n const workflowSteps = workflowData.steps || {};\n\n // Create a config that includes the workflow steps as checks,\n // plus the tests section and workflow metadata for output computation\n const visorConfig: Partial<VisorConfig> & { tests?: any; outputs?: any; inputs?: any } = {\n version: '1.0',\n steps: workflowSteps,\n checks: workflowSteps,\n tests: tests, // Preserve test harness config (may be empty if stripped by test runner)\n };\n\n // Preserve workflow metadata for output computation during tests\n if (workflowData.outputs) {\n visorConfig.outputs = workflowData.outputs;\n }\n if (workflowData.inputs) {\n visorConfig.inputs = workflowData.inputs;\n }\n if (workflowData.tools) {\n visorConfig.tools = workflowData.tools;\n }\n if (workflowData.id) {\n (visorConfig as any).id = workflowData.id;\n }\n if (workflowData.name) {\n (visorConfig as any).name = workflowData.name;\n }\n if (workflowData.description) {\n (visorConfig as any).description = workflowData.description;\n }\n if (workflowData.on) {\n (visorConfig as any).on = workflowData.on;\n }\n if (workflowData.sandboxes) {\n visorConfig.sandboxes = workflowData.sandboxes;\n }\n if (workflowData.sandbox) {\n visorConfig.sandbox = workflowData.sandbox;\n }\n\n logger.debug(\n `Standalone workflow config has ${Object.keys(workflowSteps).length} workflow steps as checks`\n );\n logger.debug(`Workflow step names: ${Object.keys(workflowSteps).join(', ')}`);\n logger.debug(`Config keys after conversion: ${Object.keys(visorConfig).join(', ')}`);\n\n return visorConfig;\n }\n\n /**\n * Load and register workflows from configuration\n */\n private async loadWorkflows(config: Partial<VisorConfig>, basePath: string): Promise<void> {\n // Only import workflows from external files\n if (!config.imports || config.imports.length === 0) {\n return;\n }\n\n const { WorkflowRegistry } = await import('./workflow-registry');\n const registry = WorkflowRegistry.getInstance();\n\n // Import workflow files\n // Use override: true so config reloads pick up changes to workflow definitions\n for (const source of config.imports) {\n const results = await registry.import(source, { basePath, validate: true, override: true });\n for (const result of results) {\n if (!result.valid && result.errors) {\n const errors = result.errors.map(e => ` ${e.path}: ${e.message}`).join('\\n');\n throw new Error(`Failed to import workflow from '${source}':\\n${errors}`);\n }\n }\n logger.info(`Imported workflows from: ${source}`);\n }\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(\n config: Partial<VisorConfig>,\n preferChecks: boolean = false\n ): Partial<VisorConfig> {\n // If both are present, merge with CHECKS taking precedence on key conflicts.\n // Rationale: user overrides typically land in 'checks' while bundled defaults\n // may come in via 'steps' (e.g., included workflows). We want user overrides\n // (e.g., appendPrompt) to win over defaults.\n if (config.steps && config.checks) {\n if (preferChecks) {\n // Union with checks winning over steps (child overrides)\n const merged = { ...(config.steps as any), ...(config.checks as Record<string, any>) };\n config.steps = merged as any;\n config.checks = merged as any;\n } else {\n // Back-compat: when both present in a single file, honor steps exclusively\n // (ignore extra keys under checks)\n config.checks = config.steps;\n // Ensure steps remains authoritative\n config.steps = config.steps;\n }\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, warnings);\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 sandbox configuration\n if (config.sandboxes) {\n const sandboxNames = Object.keys(config.sandboxes);\n for (const [sandboxName, sandboxConfig] of Object.entries(config.sandboxes)) {\n this.validateSandboxConfig(sandboxName, sandboxConfig, errors);\n }\n\n // Validate top-level sandbox reference\n if (config.sandbox && !sandboxNames.includes(config.sandbox)) {\n errors.push({\n field: 'sandbox',\n message: `Top-level sandbox '${config.sandbox}' not found in sandboxes definitions. Available: ${sandboxNames.join(', ')}`,\n value: config.sandbox,\n });\n }\n\n // Validate check-level sandbox references (skip Liquid templates — resolved at runtime)\n if (checksToValidate) {\n for (const [checkName, checkConfig] of Object.entries(checksToValidate)) {\n if (\n checkConfig.sandbox &&\n !checkConfig.sandbox.includes('{{') &&\n !sandboxNames.includes(checkConfig.sandbox)\n ) {\n errors.push({\n field: `checks.${checkName}.sandbox`,\n message: `Check '${checkName}' references sandbox '${checkConfig.sandbox}' which is not defined. Available: ${sandboxNames.join(', ')}`,\n value: checkConfig.sandbox,\n });\n }\n }\n }\n } else {\n // If no sandboxes defined, check that nothing references them\n // Skip Liquid templates (e.g., \"{{ inputs.sandbox }}\") — resolved at runtime\n if (config.sandbox && !String(config.sandbox).includes('{{')) {\n errors.push({\n field: 'sandbox',\n message: `Top-level sandbox '${config.sandbox}' is set but no sandboxes are defined`,\n value: config.sandbox,\n });\n }\n if (checksToValidate) {\n for (const [checkName, checkConfig] of Object.entries(checksToValidate)) {\n if (checkConfig.sandbox && !checkConfig.sandbox.includes('{{')) {\n errors.push({\n field: `checks.${checkName}.sandbox`,\n message: `Check '${checkName}' references sandbox '${checkConfig.sandbox}' but no sandboxes are defined`,\n value: checkConfig.sandbox,\n });\n }\n }\n }\n }\n\n // Validate scheduler configuration\n if (\n config.scheduler?.ha?.enabled &&\n (!config.scheduler.storage?.driver || config.scheduler.storage.driver === 'sqlite')\n ) {\n warnings.push({\n field: 'scheduler.ha',\n message:\n 'HA mode is enabled but storage driver is SQLite (single-node only). ' +\n 'Distributed locking will use in-memory locks which do not coordinate across nodes. ' +\n 'Use driver: \"postgresql\", \"mysql\", or \"mssql\" for true multi-node HA.',\n });\n }\n\n // Validate server database connection config\n const schedulerDriver = config.scheduler?.storage?.driver;\n if (schedulerDriver && schedulerDriver !== 'sqlite') {\n const conn = config.scheduler?.storage?.connection;\n if (!conn) {\n errors.push({\n field: 'scheduler.storage.connection',\n message: `The '${schedulerDriver}' driver requires a connection configuration.`,\n });\n } else {\n const hasConnStr = !!(conn as { connection_string?: string }).connection_string;\n const hasHost = !!(conn as { host?: string }).host;\n const hasDb = !!(conn as { database?: string }).database;\n\n if (!hasConnStr && !hasHost) {\n errors.push({\n field: 'scheduler.storage.connection',\n message: `The '${schedulerDriver}' driver requires either 'connection_string' or 'host' (with 'database') to be specified.`,\n });\n }\n\n if (!hasConnStr && hasHost && !hasDb) {\n errors.push({\n field: 'scheduler.storage.connection.database',\n message: `The '${schedulerDriver}' driver requires 'database' when using host-based connection.`,\n });\n }\n\n if (hasConnStr && hasHost) {\n warnings.push({\n field: 'scheduler.storage.connection',\n message:\n 'Both connection_string and host are set. connection_string takes precedence; host/port/database/user/password will be ignored.',\n });\n }\n\n // SSL warning for remote hosts\n if (hasHost && !hasConnStr) {\n const host = (conn as { host?: string }).host || '';\n const ssl = (conn as { ssl?: unknown }).ssl;\n const isLocal =\n host === 'localhost' ||\n host === '127.0.0.1' ||\n host === '::1' ||\n host === '0.0.0.0' ||\n host === '[::]';\n if (!isLocal && !ssl) {\n warnings.push({\n field: 'scheduler.storage.connection.ssl',\n message: `SSL is not enabled for remote host '${host}'. Consider enabling SSL for secure database connections.`,\n });\n }\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 custom tools section\n if (config.tools) {\n for (const [toolName, toolDef] of Object.entries(config.tools)) {\n const type = toolDef.type || 'command';\n if (type === 'api') {\n const spec = toolDef.spec;\n const hasStringSpec = typeof spec === 'string' && spec.trim().length > 0;\n const hasInlineSpec = !!spec && typeof spec === 'object' && !Array.isArray(spec);\n if (!hasStringSpec && !hasInlineSpec) {\n errors.push({\n field: `tools.${toolName}.spec`,\n message: `Invalid tool configuration for \"${toolName}\": missing spec field (required for type: api)`,\n });\n }\n\n const overlays = toolDef.overlays;\n if (overlays !== undefined) {\n const isInlineOverlay =\n !!overlays && typeof overlays === 'object' && !Array.isArray(overlays);\n const isStringOverlay = typeof overlays === 'string';\n const isMixedArrayOverlay =\n Array.isArray(overlays) &&\n overlays.every(\n item =>\n typeof item === 'string' ||\n (!!item && typeof item === 'object' && !Array.isArray(item))\n );\n\n if (!isInlineOverlay && !isStringOverlay && !isMixedArrayOverlay) {\n errors.push({\n field: `tools.${toolName}.overlays`,\n message: `Invalid tool configuration for \"${toolName}\": overlays must be a string, object, or array of strings/objects`,\n value: overlays,\n });\n }\n }\n } else if (!toolDef.exec || typeof toolDef.exec !== 'string') {\n errors.push({\n field: `tools.${toolName}.exec`,\n message: `Invalid tool configuration for \"${toolName}\": missing exec field (required for command tools)`,\n });\n }\n }\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 // Validate policy configuration if present\n if (config.policy) {\n this.validatePolicyConfig(config.policy as any, errors, warnings);\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 sandbox configuration\n */\n private validateSandboxConfig(\n name: string,\n config: import('./sandbox/types').SandboxConfig,\n errors: ConfigValidationError[]\n ): void {\n // Validate sandbox name (prevent command injection via config keys)\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {\n errors.push({\n field: `sandboxes.${name}`,\n message: `Sandbox name '${name}' contains invalid characters. Only letters, numbers, dots, hyphens, underscores allowed.`,\n });\n }\n\n // Validate engine field if present\n if (config.engine && !['docker', 'bubblewrap', 'seatbelt'].includes(config.engine)) {\n errors.push({\n field: `sandboxes.${name}.engine`,\n message: `Sandbox '${name}' has invalid engine '${config.engine}'. Must be 'docker', 'bubblewrap', or 'seatbelt'.`,\n });\n }\n\n const isNativeEngine = config.engine === 'bubblewrap' || config.engine === 'seatbelt';\n\n if (isNativeEngine) {\n // Native engine (bubblewrap/seatbelt): reject Docker-only fields\n const dockerOnlyFields: Array<[string, unknown]> = [\n ['image', config.image],\n ['dockerfile', config.dockerfile],\n ['dockerfile_inline', config.dockerfile_inline],\n ['compose', config.compose],\n ['service', config.service],\n ['cache', config.cache],\n ['resources', config.resources],\n ];\n for (const [field, value] of dockerOnlyFields) {\n if (value !== undefined) {\n errors.push({\n field: `sandboxes.${name}.${field}`,\n message: `Sandbox '${name}' uses ${config.engine} engine but has Docker-only field '${field}'. Remove it or switch to engine: docker.`,\n });\n }\n }\n } else {\n // Docker engine (default): must have exactly one mode\n const modes = [\n config.image ? 'image' : null,\n config.dockerfile || config.dockerfile_inline ? 'dockerfile' : null,\n config.compose ? 'compose' : null,\n ].filter(Boolean);\n\n if (modes.length === 0) {\n errors.push({\n field: `sandboxes.${name}`,\n message: `Sandbox '${name}' must specify one of: image, dockerfile, dockerfile_inline, or compose`,\n });\n } else if (modes.length > 1) {\n errors.push({\n field: `sandboxes.${name}`,\n message: `Sandbox '${name}' has multiple modes (${modes.join(', ')}). Specify exactly one.`,\n });\n }\n\n // Compose mode requires service\n if (config.compose && !config.service) {\n errors.push({\n field: `sandboxes.${name}.service`,\n message: `Sandbox '${name}' uses compose mode but is missing required 'service' field`,\n });\n }\n\n // Validate file paths don't contain traversal\n if (config.dockerfile && /\\.\\./.test(config.dockerfile)) {\n errors.push({\n field: `sandboxes.${name}.dockerfile`,\n message: `Dockerfile path '${config.dockerfile}' in sandbox '${name}' must not contain '..' path traversal`,\n });\n }\n if (config.compose && /\\.\\./.test(config.compose)) {\n errors.push({\n field: `sandboxes.${name}.compose`,\n message: `Compose file path '${config.compose}' in sandbox '${name}' must not contain '..' path traversal`,\n });\n }\n\n // Validate cache paths are absolute and safe\n if (config.cache?.paths) {\n for (const p of config.cache.paths) {\n if (!p.startsWith('/')) {\n errors.push({\n field: `sandboxes.${name}.cache.paths`,\n message: `Cache path '${p}' in sandbox '${name}' must be absolute (start with /)`,\n value: p,\n });\n }\n if (/\\.\\./.test(p)) {\n errors.push({\n field: `sandboxes.${name}.cache.paths`,\n message: `Cache path '${p}' in sandbox '${name}' must not contain '..' path traversal`,\n value: p,\n });\n }\n }\n }\n\n // Validate resource limits\n if (config.resources?.cpu !== undefined) {\n if (typeof config.resources.cpu !== 'number' || config.resources.cpu <= 0) {\n errors.push({\n field: `sandboxes.${name}.resources.cpu`,\n message: `CPU limit in sandbox '${name}' must be a positive number`,\n value: config.resources.cpu,\n });\n }\n }\n }\n\n // Common validations for all engines\n\n // Validate visor_path\n if (config.visor_path) {\n if (!config.visor_path.startsWith('/')) {\n errors.push({\n field: `sandboxes.${name}.visor_path`,\n message: `visor_path '${config.visor_path}' in sandbox '${name}' must be an absolute path (start with /)`,\n });\n }\n if (/\\.\\./.test(config.visor_path)) {\n errors.push({\n field: `sandboxes.${name}.visor_path`,\n message: `visor_path '${config.visor_path}' in sandbox '${name}' must not contain '..' path traversal`,\n });\n }\n }\n\n if (config.workdir && config.workdir !== 'host') {\n if (!config.workdir.startsWith('/')) {\n errors.push({\n field: `sandboxes.${name}.workdir`,\n message: `Workdir '${config.workdir}' in sandbox '${name}' must be an absolute path (start with /) or the literal \"host\"`,\n });\n }\n if (/\\.\\./.test(config.workdir)) {\n errors.push({\n field: `sandboxes.${name}.workdir`,\n message: `Workdir '${config.workdir}' in sandbox '${name}' must not contain '..' path traversal`,\n });\n }\n }\n\n // Validate bind_paths\n if (config.bind_paths) {\n for (let i = 0; i < config.bind_paths.length; i++) {\n const bp = config.bind_paths[i];\n if (!bp.host) {\n errors.push({\n field: `sandboxes.${name}.bind_paths[${i}].host`,\n message: `bind_paths[${i}] in sandbox '${name}' is missing required 'host' field`,\n });\n }\n if (bp.host && /\\.\\./.test(bp.host)) {\n errors.push({\n field: `sandboxes.${name}.bind_paths[${i}].host`,\n message: `bind_paths[${i}].host '${bp.host}' in sandbox '${name}' must not contain '..' path traversal`,\n });\n }\n if (bp.container) {\n if (!bp.container.startsWith('/')) {\n errors.push({\n field: `sandboxes.${name}.bind_paths[${i}].container`,\n message: `bind_paths[${i}].container '${bp.container}' in sandbox '${name}' must be an absolute path (start with /)`,\n });\n }\n if (/\\.\\./.test(bp.container)) {\n errors.push({\n field: `sandboxes.${name}.bind_paths[${i}].container`,\n message: `bind_paths[${i}].container '${bp.container}' in sandbox '${name}' must not contain '..' path traversal`,\n });\n }\n }\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 _warnings?: ConfigValidationError[]\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 // Require specifying criticality for external-effect providers\n try {\n const externalTypes = new Set(['github', 'http', 'http_client', 'http_input', 'workflow']);\n if (externalTypes.has(checkConfig.type as string) && !checkConfig.criticality) {\n errors.push({\n field: `checks.${checkName}.criticality`,\n message: `Missing required criticality for step \"${checkName}\" (type: ${checkConfig.type}). Set criticality: 'external' or 'internal' to enable safe defaults for side-effecting steps.`,\n });\n }\n } catch {\n // best-effort hint only\n }\n\n // Criticality-driven contract requirements (lint-time)\n // For higher-safety modes, require a pre-run guard (assume or if) and,\n // for output-producing providers, a post-run contract (schema or guarantee).\n try {\n const crit = (checkConfig.criticality || 'policy') as string;\n const isCritical = crit === 'external' || crit === 'internal';\n\n if (isCritical) {\n // 1) Pre-run guard: either assume (string or non-empty array) or if\n const hasAssume =\n typeof (checkConfig as any).assume === 'string' ||\n (Array.isArray((checkConfig as any).assume) && (checkConfig as any).assume.length > 0);\n const hasIf =\n typeof (checkConfig as any).if === 'string' && (checkConfig as any).if.trim().length > 0;\n if (!hasAssume && !hasIf) {\n errors.push({\n field: `checks.${checkName}.assume`,\n message: `Critical step \"${checkName}\" (criticality: ${crit}) requires a precondition: set 'assume:' (preferred) or 'if:' to guard execution.`,\n });\n }\n\n // 2) Post-run contract for output-producing providers\n const outputProviders = new Set([\n 'ai',\n 'script',\n 'command',\n 'http',\n 'http_client',\n 'http_input',\n ]);\n if (outputProviders.has(checkConfig.type as string)) {\n const hasSchema = typeof (checkConfig as any).schema !== 'undefined';\n const hasGuarantee =\n typeof (checkConfig as any).guarantee === 'string' &&\n (checkConfig as any).guarantee.trim().length > 0;\n if (!hasSchema && !hasGuarantee) {\n errors.push({\n field: `checks.${checkName}.schema/guarantee`,\n message: `Critical step \"${checkName}\" (type: ${checkConfig.type}) requires an output contract: provide 'schema:' (renderer name or JSON Schema) or 'guarantee:' expression.`,\n });\n }\n }\n }\n } catch {\n // lint-only; never throw from here\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 // Prefer single-field schema: if both schema (object) and output_schema are present, warn\n try {\n const hasObjSchema =\n (checkConfig as any)?.schema && typeof (checkConfig as any).schema === 'object';\n const hasOutputSchema =\n (checkConfig as any)?.output_schema &&\n typeof (checkConfig as any).output_schema === 'object';\n if (hasObjSchema && hasOutputSchema) {\n (_warnings || errors).push({\n field: `checks.${checkName}.schema`,\n message: `Both 'schema' (object) and 'output_schema' are set; 'schema' will be used for validation. 'output_schema' is deprecated.`,\n });\n }\n } catch {}\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 reuseValue = checkConfig.reuse_ai_session as unknown;\n const isString = typeof reuseValue === 'string';\n const isBoolean = typeof reuseValue === 'boolean';\n const isSelf = reuseValue === 'self';\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: reuseValue,\n });\n } else if (isString && !isSelf) {\n // When reuse_ai_session is a string (other than the special 'self' value),\n // it must refer to a valid check name\n const targetCheckName = reuseValue 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: reuseValue,\n });\n }\n } else if (reuseValue === 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: reuseValue,\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 // Validate on_finish configuration\n if (checkConfig.on_finish !== undefined) {\n if (!checkConfig.forEach) {\n errors.push({\n field: `checks.${checkName}.on_finish`,\n message: `Check \"${checkName}\" has on_finish but forEach is not true. on_finish is only valid on forEach checks.`,\n value: checkConfig.on_finish,\n });\n }\n }\n\n // Validate JavaScript syntax in transform_js and script content\n try {\n // Validate transform_js if present\n const transformJs = (checkConfig as any).transform_js;\n if (typeof transformJs === 'string' && transformJs.trim().length > 0) {\n const result = validateJsSyntax(transformJs);\n if (!result.valid) {\n errors.push({\n field: `checks.${checkName}.transform_js`,\n message: `JavaScript syntax error in \"${checkName}\" transform_js: ${result.error}`,\n value: transformJs.slice(0, 100) + (transformJs.length > 100 ? '...' : ''),\n });\n }\n }\n\n // Validate script content if type is 'script'\n if (checkConfig.type === 'script') {\n const content = (checkConfig as any).content;\n if (typeof content === 'string' && content.trim().length > 0) {\n const result = validateJsSyntax(content);\n if (!result.valid) {\n errors.push({\n field: `checks.${checkName}.content`,\n message: `JavaScript syntax error in \"${checkName}\" script: ${result.error}`,\n value: content.slice(0, 100) + (content.length > 100 ? '...' : ''),\n });\n }\n }\n }\n } catch {\n // Syntax validation is best-effort; don't fail the whole config on validation errors\n }\n }\n\n /**\n * Validate policy engine configuration\n */\n private validatePolicyConfig(\n policy: Record<string, unknown>,\n errors: ConfigValidationError[],\n warnings: ConfigValidationError[]\n ): void {\n const validEngines = ['local', 'remote', 'disabled'];\n if (policy.engine && !validEngines.includes(policy.engine as string)) {\n errors.push({\n field: 'policy.engine',\n message: `policy.engine must be one of: ${validEngines.join(', ')}`,\n value: policy.engine,\n });\n }\n\n if (policy.engine === 'local' && !policy.rules) {\n errors.push({\n field: 'policy.rules',\n message: 'policy.rules is required when policy.engine is \"local\"',\n });\n }\n\n if (policy.rules && typeof policy.rules !== 'string' && !Array.isArray(policy.rules)) {\n errors.push({\n field: 'policy.rules',\n message: 'policy.rules must be a string or array of strings',\n value: policy.rules,\n });\n }\n if (Array.isArray(policy.rules) && !policy.rules.every((r: unknown) => typeof r === 'string')) {\n errors.push({\n field: 'policy.rules',\n message: 'policy.rules array must contain only strings',\n value: policy.rules,\n });\n }\n\n if (policy.engine === 'local' && policy.rules) {\n const rulesPath = Array.isArray(policy.rules) ? policy.rules : [policy.rules];\n for (const rp of rulesPath) {\n if (typeof rp === 'string' && !fs.existsSync(path.resolve(rp))) {\n warnings.push({\n field: 'policy.rules',\n message: `Policy rules path does not exist: ${rp}. It will be resolved at runtime.`,\n value: rp,\n });\n }\n }\n }\n\n if (policy.engine === 'remote') {\n if (!policy.url) {\n errors.push({\n field: 'policy.url',\n message: 'policy.url is required when policy.engine is \"remote\"',\n });\n } else if (typeof policy.url !== 'string' || !/^https?:\\/\\//i.test(policy.url)) {\n errors.push({\n field: 'policy.url',\n message: 'policy.url must use http:// or https:// protocol',\n });\n }\n }\n\n if (policy.fallback !== undefined) {\n const validFallbacks = ['allow', 'deny', 'warn'];\n if (!validFallbacks.includes(policy.fallback as string)) {\n errors.push({\n field: 'policy.fallback',\n message: `policy.fallback must be one of: ${validFallbacks.join(', ')}`,\n value: policy.fallback,\n });\n }\n }\n\n if (policy.timeout !== undefined) {\n if (typeof policy.timeout !== 'number' || policy.timeout < 0) {\n errors.push({\n field: 'policy.timeout',\n message: 'policy.timeout must be a non-negative number (milliseconds)',\n value: policy.timeout,\n });\n }\n }\n\n if (policy.data !== undefined) {\n if (typeof policy.data !== 'string') {\n errors.push({\n field: 'policy.data',\n message: 'policy.data must be a string (path to a JSON file)',\n value: policy.data,\n });\n }\n }\n\n if (\n policy.data &&\n typeof policy.data === 'string' &&\n !fs.existsSync(path.resolve(policy.data))\n ) {\n warnings.push({\n field: 'policy.data',\n message: `Policy data file does not exist: ${policy.data}. It will be resolved at runtime.`,\n value: policy.data,\n });\n }\n\n if (policy.roles && typeof policy.roles === 'object') {\n for (const [roleName, roleConfig] of Object.entries(policy.roles as Record<string, any>)) {\n if (typeof roleConfig !== 'object' || roleConfig === null) {\n errors.push({\n field: `policy.roles.${roleName}`,\n message: `Role '${roleName}' must be an object with author_association, teams, or users`,\n value: roleConfig,\n });\n } else {\n if (Array.isArray(roleConfig.teams) && roleConfig.teams.length > 0) {\n warnings.push({\n field: `policy.roles.${roleName}.teams`,\n message: `Role '${roleName}' uses 'teams' which is not yet implemented. Team-based role resolution requires a future update. Only author_association and users are currently supported.`,\n value: roleConfig.teams,\n });\n }\n\n const validAssociations = [\n 'OWNER',\n 'MEMBER',\n 'COLLABORATOR',\n 'CONTRIBUTOR',\n 'FIRST_TIME_CONTRIBUTOR',\n 'FIRST_TIMER',\n 'MANNEQUIN',\n 'NONE',\n ];\n if (roleConfig.author_association && Array.isArray(roleConfig.author_association)) {\n for (const assoc of roleConfig.author_association) {\n if (!validAssociations.includes(assoc)) {\n warnings.push({\n field: `policy.roles.${roleName}.author_association`,\n message: `Unknown author_association value: '${assoc}'. Valid values: ${validAssociations.join(', ')}`,\n value: assoc,\n });\n }\n }\n }\n\n // Validate slack_users (should start with 'U')\n if (Array.isArray(roleConfig.slack_users)) {\n for (const uid of roleConfig.slack_users) {\n if (typeof uid === 'string' && !uid.startsWith('U')) {\n warnings.push({\n field: `policy.roles.${roleName}.slack_users`,\n message: `Slack user ID '${uid}' does not start with 'U'. Slack user IDs typically start with 'U' (e.g., U0123ABC).`,\n value: uid,\n });\n }\n }\n }\n\n // Validate emails (should contain '@')\n if (Array.isArray(roleConfig.emails)) {\n for (const email of roleConfig.emails) {\n if (typeof email === 'string' && !email.includes('@')) {\n warnings.push({\n field: `policy.roles.${roleName}.emails`,\n message: `Email '${email}' does not contain '@'. Expected a valid email address.`,\n value: email,\n });\n }\n }\n if (roleConfig.emails.length > 0) {\n warnings.push({\n field: `policy.roles.${roleName}.emails`,\n message: `Role '${roleName}' uses 'emails' for identity matching. This requires the Slack bot to have the 'users:read.email' OAuth scope.`,\n value: roleConfig.emails,\n });\n }\n }\n\n // Validate slack_channels (should start with 'C')\n if (Array.isArray(roleConfig.slack_channels)) {\n for (const chId of roleConfig.slack_channels) {\n if (typeof chId === 'string' && !chId.startsWith('C')) {\n warnings.push({\n field: `policy.roles.${roleName}.slack_channels`,\n message: `Slack channel ID '${chId}' does not start with 'C'. Public channel IDs typically start with 'C' (e.g., C0123ENG).`,\n value: chId,\n });\n }\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 // Gracefully allow certain known top-level keys that may appear in\n // specific execution contexts but are not part of the core schema.\n // - 'tests' is used by the YAML test runner and can legitimately\n // be present when loading a suite file.\n // - 'slack' holds inbound Slack settings (socket/webhook); older\n // schema snapshots may not include it yet.\n // - 'sandboxes', 'sandbox', 'sandbox_defaults' are sandbox\n // execution keys that may not yet be in the generated schema.\n const allowedTopLevelKeys = new Set([\n 'tests',\n 'slack',\n 'mcp_server',\n 'sandboxes',\n 'sandbox',\n 'sandbox_defaults',\n 'policy',\n // Workflow metadata fields used when configs are imported as reusable workflows\n 'id',\n 'name',\n 'description',\n ]);\n if (topLevel && allowedTopLevelKeys.has(addl)) {\n // Do not warn for these keys.\n continue;\n }\n // Internal tool metadata used to resolve relative tool assets.\n if (!topLevel && addl === '__baseDir' && pathStr.startsWith('tools.')) {\n continue;\n }\n // At check level, allow 'sandbox' without warning\n if (!topLevel && addl === 'sandbox' && pathStr.match(/^(checks|steps)\\.[^.]+$/)) {\n continue;\n }\n // Build a contextual hint for common misconfigurations\n let hint = '';\n if (topLevel) {\n if (addl === 'ai') {\n hint =\n \" Use 'ai_provider' and 'ai_model' at the top level for global defaults, or configure 'ai:' inside each step.\";\n }\n } else {\n const isCheckLevel = /^(checks|steps)\\.[^.]+$/.test(pathStr);\n if (isCheckLevel) {\n // Resolve check type for type-specific hints\n const checkName = pathStr.split('.')[1];\n const checksObj = (config as any).checks || (config as any).steps || {};\n const checkType = checksObj[checkName]?.type || 'ai';\n\n if (addl === 'system_prompt' || addl === 'custom_prompt') {\n hint = ` Did you mean to put this inside the step's 'ai:' block, or use 'ai_${addl}' at the step level?`;\n } else if (addl === 'provider') {\n hint =\n \" Did you mean 'ai_provider' or to put this inside the step's 'ai:' block?\";\n } else if (addl === 'model') {\n hint = \" Did you mean 'ai_model' or to put this inside the step's 'ai:' block?\";\n } else if (addl === 'parseJson' && checkType === 'command') {\n hint =\n ' Command steps auto-parse JSON output when valid. Use an ai custom tool definition for parseJson.';\n } else if (addl === 'max_tool_calls' || addl === 'maxToolCalls') {\n hint =\n \" Use 'ai_max_iterations' at the step level or 'maxIterations' inside the 'ai:' block.\";\n }\n }\n }\n warnings.push({\n field: fullField || 'config',\n message: topLevel\n ? `Unknown top-level key '${addl}' will be ignored.${hint}`\n : `Unknown key '${addl}' will be ignored.${hint}`,\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"],"mappings":"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","names":["outputFormat","logFn","ConfigMerger","yaml","fs","path","result"]}