@probelabs/visor 0.1.176 → 0.1.177

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 (85) hide show
  1. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  2. package/dist/index.js +126 -23
  3. package/dist/output/traces/{run-2026-03-10T15-37-04-236Z.ndjson → run-2026-03-10T16-21-38-082Z.ndjson} +84 -84
  4. package/dist/output/traces/{run-2026-03-10T15-37-44-748Z.ndjson → run-2026-03-10T16-22-15-059Z.ndjson} +1812 -1812
  5. package/dist/sdk/{a2a-frontend-W54ZZ32L.mjs → a2a-frontend-BPWLYLCG.mjs} +2 -2
  6. package/dist/sdk/a2a-frontend-HBUSNE3K.mjs +1658 -0
  7. package/dist/sdk/a2a-frontend-HBUSNE3K.mjs.map +1 -0
  8. package/dist/sdk/{check-provider-registry-7HSDAKHQ.mjs → check-provider-registry-HW4QPPSA.mjs} +2 -2
  9. package/dist/sdk/{check-provider-registry-MJYNLB37.mjs → check-provider-registry-OY2EESIO.mjs} +5 -5
  10. package/dist/sdk/{check-provider-registry-VE6LQPLY.mjs → check-provider-registry-TRHN5ZBY.mjs} +5 -5
  11. package/dist/sdk/{chunk-4E34HRCW.mjs → chunk-2LCF5H5K.mjs} +73 -28
  12. package/dist/sdk/chunk-2LCF5H5K.mjs.map +1 -0
  13. package/dist/sdk/{chunk-66PTDQAO.mjs → chunk-ADQVGGKA.mjs} +3 -3
  14. package/dist/sdk/{chunk-SEA2FWEC.mjs → chunk-BWC5R2UB.mjs} +2 -2
  15. package/dist/sdk/{chunk-Y2DYDGGY.mjs → chunk-FNBSDOQM.mjs} +3 -3
  16. package/dist/sdk/{chunk-Y2DYDGGY.mjs.map → chunk-FNBSDOQM.mjs.map} +1 -1
  17. package/dist/sdk/chunk-GVTWESYN.mjs +516 -0
  18. package/dist/sdk/chunk-GVTWESYN.mjs.map +1 -0
  19. package/dist/sdk/chunk-OHOBWVPP.mjs +1502 -0
  20. package/dist/sdk/chunk-OHOBWVPP.mjs.map +1 -0
  21. package/dist/sdk/chunk-OPI632LK.mjs +739 -0
  22. package/dist/sdk/chunk-OPI632LK.mjs.map +1 -0
  23. package/dist/sdk/{chunk-R3FNZRE4.mjs → chunk-XLDVWRKQ.mjs} +73 -28
  24. package/dist/sdk/chunk-XLDVWRKQ.mjs.map +1 -0
  25. package/dist/sdk/{chunk-OK4MLC3R.mjs → chunk-Y6PVSFCS.mjs} +49 -9
  26. package/dist/sdk/chunk-Y6PVSFCS.mjs.map +1 -0
  27. package/dist/sdk/{failure-condition-evaluator-RTT5SLVL.mjs → failure-condition-evaluator-63BECZYF.mjs} +3 -3
  28. package/dist/sdk/failure-condition-evaluator-HL33X7MH.mjs +18 -0
  29. package/dist/sdk/{github-frontend-C4GG62PI.mjs → github-frontend-FP6WKNZR.mjs} +3 -3
  30. package/dist/sdk/github-frontend-U2U42CKV.mjs +1386 -0
  31. package/dist/sdk/github-frontend-U2U42CKV.mjs.map +1 -0
  32. package/dist/sdk/{host-6GGO2BQE.mjs → host-6SBCE4VK.mjs} +4 -4
  33. package/dist/sdk/host-NYUSWEE4.mjs +87 -0
  34. package/dist/sdk/host-NYUSWEE4.mjs.map +1 -0
  35. package/dist/sdk/{routing-DXVYOXAS.mjs → routing-PFFCQJV2.mjs} +4 -4
  36. package/dist/sdk/routing-SFP4D6O3.mjs +26 -0
  37. package/dist/sdk/{schedule-tool-R7NSHTPJ.mjs → schedule-tool-45NAALKS.mjs} +2 -2
  38. package/dist/sdk/{schedule-tool-LL7XDILD.mjs → schedule-tool-DN2DSXIX.mjs} +5 -5
  39. package/dist/sdk/{schedule-tool-GKKVOQB7.mjs → schedule-tool-KVZN5LP6.mjs} +5 -5
  40. package/dist/sdk/{schedule-tool-handler-O3L2R5OJ.mjs → schedule-tool-handler-57JBEICD.mjs} +5 -5
  41. package/dist/sdk/{schedule-tool-handler-5GTQ6SFI.mjs → schedule-tool-handler-6MPP5DXK.mjs} +2 -2
  42. package/dist/sdk/{schedule-tool-handler-ZZGJ3UFR.mjs → schedule-tool-handler-GEXHYH3X.mjs} +5 -5
  43. package/dist/sdk/sdk.js +75 -15
  44. package/dist/sdk/sdk.js.map +1 -1
  45. package/dist/sdk/sdk.mjs +4 -4
  46. package/dist/sdk/slack-frontend-XKSIOUXB.mjs +910 -0
  47. package/dist/sdk/slack-frontend-XKSIOUXB.mjs.map +1 -0
  48. package/dist/sdk/{trace-helpers-CECHXDLI.mjs → trace-helpers-L3EOYW5P.mjs} +2 -2
  49. package/dist/sdk/trace-helpers-MYH2GPXF.mjs +29 -0
  50. package/dist/sdk/{workflow-check-provider-EY6VSMNG.mjs → workflow-check-provider-JNEFAECH.mjs} +5 -5
  51. package/dist/sdk/workflow-check-provider-JNEFAECH.mjs.map +1 -0
  52. package/dist/sdk/{workflow-check-provider-AX7IRQEZ.mjs → workflow-check-provider-OA33MESM.mjs} +2 -2
  53. package/dist/sdk/workflow-check-provider-OA33MESM.mjs.map +1 -0
  54. package/dist/sdk/{workflow-check-provider-HZQGJFOU.mjs → workflow-check-provider-U3UIYLU7.mjs} +5 -5
  55. package/dist/sdk/workflow-check-provider-U3UIYLU7.mjs.map +1 -0
  56. package/dist/traces/{run-2026-03-10T15-37-04-236Z.ndjson → run-2026-03-10T16-21-38-082Z.ndjson} +84 -84
  57. package/dist/traces/{run-2026-03-10T15-37-44-748Z.ndjson → run-2026-03-10T16-22-15-059Z.ndjson} +1812 -1812
  58. package/dist/utils/workspace-manager.d.ts +5 -1
  59. package/dist/utils/workspace-manager.d.ts.map +1 -1
  60. package/dist/utils/worktree-manager.d.ts +5 -1
  61. package/dist/utils/worktree-manager.d.ts.map +1 -1
  62. package/package.json +2 -2
  63. package/dist/sdk/chunk-4E34HRCW.mjs.map +0 -1
  64. package/dist/sdk/chunk-OK4MLC3R.mjs.map +0 -1
  65. package/dist/sdk/chunk-R3FNZRE4.mjs.map +0 -1
  66. /package/dist/sdk/{a2a-frontend-W54ZZ32L.mjs.map → a2a-frontend-BPWLYLCG.mjs.map} +0 -0
  67. /package/dist/sdk/{check-provider-registry-7HSDAKHQ.mjs.map → check-provider-registry-HW4QPPSA.mjs.map} +0 -0
  68. /package/dist/sdk/{check-provider-registry-MJYNLB37.mjs.map → check-provider-registry-OY2EESIO.mjs.map} +0 -0
  69. /package/dist/sdk/{check-provider-registry-VE6LQPLY.mjs.map → check-provider-registry-TRHN5ZBY.mjs.map} +0 -0
  70. /package/dist/sdk/{chunk-66PTDQAO.mjs.map → chunk-ADQVGGKA.mjs.map} +0 -0
  71. /package/dist/sdk/{chunk-SEA2FWEC.mjs.map → chunk-BWC5R2UB.mjs.map} +0 -0
  72. /package/dist/sdk/{failure-condition-evaluator-RTT5SLVL.mjs.map → failure-condition-evaluator-63BECZYF.mjs.map} +0 -0
  73. /package/dist/sdk/{routing-DXVYOXAS.mjs.map → failure-condition-evaluator-HL33X7MH.mjs.map} +0 -0
  74. /package/dist/sdk/{github-frontend-C4GG62PI.mjs.map → github-frontend-FP6WKNZR.mjs.map} +0 -0
  75. /package/dist/sdk/{host-6GGO2BQE.mjs.map → host-6SBCE4VK.mjs.map} +0 -0
  76. /package/dist/sdk/{schedule-tool-GKKVOQB7.mjs.map → routing-PFFCQJV2.mjs.map} +0 -0
  77. /package/dist/sdk/{schedule-tool-LL7XDILD.mjs.map → routing-SFP4D6O3.mjs.map} +0 -0
  78. /package/dist/sdk/{schedule-tool-R7NSHTPJ.mjs.map → schedule-tool-45NAALKS.mjs.map} +0 -0
  79. /package/dist/sdk/{schedule-tool-handler-5GTQ6SFI.mjs.map → schedule-tool-DN2DSXIX.mjs.map} +0 -0
  80. /package/dist/sdk/{schedule-tool-handler-O3L2R5OJ.mjs.map → schedule-tool-KVZN5LP6.mjs.map} +0 -0
  81. /package/dist/sdk/{schedule-tool-handler-ZZGJ3UFR.mjs.map → schedule-tool-handler-57JBEICD.mjs.map} +0 -0
  82. /package/dist/sdk/{trace-helpers-CECHXDLI.mjs.map → schedule-tool-handler-6MPP5DXK.mjs.map} +0 -0
  83. /package/dist/sdk/{workflow-check-provider-AX7IRQEZ.mjs.map → schedule-tool-handler-GEXHYH3X.mjs.map} +0 -0
  84. /package/dist/sdk/{workflow-check-provider-EY6VSMNG.mjs.map → trace-helpers-L3EOYW5P.mjs.map} +0 -0
  85. /package/dist/sdk/{workflow-check-provider-HZQGJFOU.mjs.map → trace-helpers-MYH2GPXF.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/failure-condition-evaluator.ts"],"sourcesContent":["/**\n * Failure condition evaluation engine using SandboxJS for secure expression evaluation\n */\n\nimport { ReviewSummary } from './reviewer';\nimport { addEvent } from './telemetry/trace-helpers';\nimport { addFailIfTriggered } from './telemetry/metrics';\nimport {\n FailureConditions,\n FailureCondition,\n FailureConditionContext,\n FailureConditionResult,\n FailureConditionSeverity,\n} from './types/config';\nimport Sandbox from '@nyariv/sandboxjs';\nimport { createSecureSandbox } from './utils/sandbox';\nimport { createPermissionHelpers, detectLocalMode } from './utils/author-permissions';\nimport { MemoryStore } from './memory-store';\n\n/**\n * Evaluates failure conditions using SandboxJS for secure evaluation\n */\nexport class FailureConditionEvaluator {\n private sandbox?: Sandbox;\n\n constructor() {}\n\n /**\n * Create a secure sandbox with whitelisted functions and globals\n */\n private createSecureSandbox(): Sandbox {\n return createSecureSandbox();\n }\n\n /**\n * Evaluate simple fail_if condition\n */\n async evaluateSimpleCondition(\n checkName: string,\n checkSchema: string,\n checkGroup: string,\n reviewSummary: ReviewSummary,\n expression: string,\n previousOutputs?: Record<string, ReviewSummary>,\n authorAssociation?: string\n ): Promise<boolean> {\n const context = this.buildEvaluationContext(\n checkName,\n checkSchema,\n checkGroup,\n reviewSummary,\n previousOutputs,\n authorAssociation\n );\n\n try {\n try {\n const isObj = context.output && typeof context.output === 'object';\n const keys = isObj ? Object.keys(context.output as any).join(',') : typeof context.output;\n let errorVal: unknown = undefined;\n if (isObj && (context.output as any).error !== undefined)\n errorVal = (context.output as any).error;\n require('./logger').logger.debug(\n ` fail_if: evaluating '${expression}' with output keys=${keys} error=${String(errorVal)}`\n );\n } catch {}\n const res = this.evaluateExpression(expression, context);\n if (res === true) {\n try {\n addEvent('fail_if.triggered', {\n check: checkName,\n scope: 'check',\n name: `${checkName}_fail_if`,\n expression,\n severity: 'error',\n });\n } catch {}\n try {\n const { emitNdjsonSpanWithEvents } = require('./telemetry/fallback-ndjson');\n emitNdjsonSpanWithEvents(\n 'visor.fail_if',\n { check: checkName, scope: 'check', name: `${checkName}_fail_if` },\n [\n {\n name: 'fail_if.triggered',\n attrs: {\n check: checkName,\n scope: 'check',\n name: `${checkName}_fail_if`,\n expression,\n severity: 'error',\n },\n },\n ]\n );\n } catch {}\n }\n return res;\n } catch (error) {\n console.warn(`Failed to evaluate fail_if expression: ${error}`);\n return false; // Don't fail on evaluation errors\n }\n }\n\n /**\n * Determine if the event is related to pull requests\n */\n private determineIfPullRequest(eventType?: string): boolean {\n if (!eventType) return false;\n\n const prEvents = ['pr_opened', 'pr_updated', 'pr_closed', 'pull_request'];\n return prEvents.includes(eventType) || eventType.startsWith('pr_');\n }\n\n /**\n * Determine if the event is related to issues\n */\n private determineIfIssue(eventType?: string): boolean {\n if (!eventType) return false;\n\n const issueEvents = ['issue_opened', 'issue_comment', 'issues'];\n return issueEvents.includes(eventType) || eventType.startsWith('issue_');\n }\n\n /**\n * Evaluate if condition to determine whether a check should run\n */\n async evaluateIfCondition(\n checkName: string,\n expression: string,\n contextData?: {\n branch?: string;\n baseBranch?: string;\n filesChanged?: string[];\n event?: string;\n environment?: Record<string, string>;\n previousResults?: Map<string, ReviewSummary>;\n authorAssociation?: string;\n workflowInputs?: Record<string, unknown>;\n /** Current step's output for guarantee evaluation */\n output?: unknown;\n /** Conversation context for TUI/CLI/Slack messages */\n conversation?: {\n transport?: string;\n thread?: { id: string };\n messages?: Array<{ role: string; text: string; timestamp: string }>;\n current?: { role: string; text: string; timestamp: string };\n attributes?: Record<string, unknown>;\n };\n }\n ): Promise<boolean> {\n // Build context for if evaluation\n const context = {\n // Check metadata\n checkName,\n\n // Git context\n branch: contextData?.branch || 'unknown',\n baseBranch: contextData?.baseBranch || 'main',\n filesChanged: contextData?.filesChanged || [],\n filesCount: contextData?.filesChanged?.length || 0,\n\n // GitHub event context\n event: {\n event_name: contextData?.event || 'manual',\n action: undefined, // Would be populated from actual GitHub context\n repository: undefined, // Would be populated from actual GitHub context\n },\n\n // Environment variables\n env: contextData?.environment || {},\n\n // Previous check results (unwrap output field like templates do)\n outputs: contextData?.previousResults\n ? (() => {\n const outputs: Record<string, unknown> = {};\n for (const [checkName, result] of contextData.previousResults) {\n // If the result has a direct output field, use it directly\n // Otherwise, expose the entire result as-is\n const summary = result as ReviewSummary & { output?: unknown };\n outputs[checkName] = summary.output !== undefined ? summary.output : summary;\n }\n return outputs;\n })()\n : {},\n\n // Workflow inputs (for workflows)\n inputs: contextData?.workflowInputs || {},\n\n // Output property: use provided output for guarantee evaluation, or empty for if conditions\n output:\n contextData?.output !== undefined &&\n contextData.output !== null &&\n typeof contextData.output === 'object'\n ? (contextData.output as Record<string, unknown>)\n : { issues: [] },\n // Author association (used by permission helpers)\n authorAssociation: contextData?.authorAssociation,\n\n // Utility metadata\n metadata: {\n checkName,\n schema: '',\n group: '',\n criticalIssues: 0,\n errorIssues: 0,\n warningIssues: 0,\n infoIssues: 0,\n totalIssues: 0,\n hasChanges: (contextData?.filesChanged?.length || 0) > 0,\n branch: contextData?.branch || 'unknown',\n event: contextData?.event || 'manual',\n },\n\n // Conversation context (for TUI/CLI/Slack)\n conversation: contextData?.conversation,\n };\n\n try {\n const res = this.evaluateExpression(expression, context);\n try {\n if (process.env.VISOR_DEBUG === 'true') {\n // Debug if-eval output (only when VISOR_DEBUG enabled)\n const outputKeys = Object.keys(context.outputs || {});\n console.error(\n `[if-eval] check=${checkName} expr=\"${expression}\" result=${String(res)} outputKeys=[${outputKeys.join(',')}]`\n );\n }\n } catch {}\n return res;\n } catch (error) {\n console.warn(`Failed to evaluate if expression for check '${checkName}': ${error}`);\n // Fail-secure: do not run the check on evaluation errors\n return false;\n }\n }\n\n /**\n * Evaluate all failure conditions for a check result\n */\n async evaluateConditions(\n checkName: string,\n checkSchema: string,\n checkGroup: string,\n reviewSummary: ReviewSummary,\n globalConditions?: FailureConditions,\n checkConditions?: FailureConditions,\n previousOutputs?: Record<string, ReviewSummary>,\n authorAssociation?: string\n ): Promise<FailureConditionResult[]> {\n const context = this.buildEvaluationContext(\n checkName,\n checkSchema,\n checkGroup,\n reviewSummary,\n previousOutputs,\n authorAssociation\n );\n\n const results: FailureConditionResult[] = [];\n\n // Evaluate global conditions first\n if (globalConditions) {\n const globalResults = await this.evaluateConditionSet(globalConditions, context, 'global');\n results.push(...globalResults);\n }\n\n // Evaluate check-specific conditions (these override global ones with same name)\n if (checkConditions) {\n const checkResults = await this.evaluateConditionSet(checkConditions, context, 'check');\n\n // Remove global conditions that are overridden by check-specific ones\n const overriddenConditions = new Set(Object.keys(checkConditions));\n const filteredResults = results.filter(\n result => !overriddenConditions.has(result.conditionName)\n );\n\n results.length = 0;\n results.push(...filteredResults, ...checkResults);\n }\n\n return results;\n }\n\n /**\n * Evaluate a set of failure conditions\n */\n private async evaluateConditionSet(\n conditions: FailureConditions,\n context: FailureConditionContext,\n source: 'global' | 'check'\n ): Promise<FailureConditionResult[]> {\n const results: FailureConditionResult[] = [];\n\n for (const [conditionName, condition] of Object.entries(conditions)) {\n try {\n addEvent('fail_if.evaluated', {\n check: context.checkName,\n scope: source,\n name: conditionName,\n expression: this.extractExpression(condition),\n });\n } catch {}\n\n // File fallback: append an NDJSON span with the evaluation event\n try {\n const { emitNdjsonSpanWithEvents } = require('./telemetry/fallback-ndjson');\n emitNdjsonSpanWithEvents(\n 'visor.fail_if',\n { check: context.checkName || 'unknown', scope: source, name: conditionName },\n [\n {\n name: 'fail_if.evaluated',\n attrs: {\n check: context.checkName,\n scope: source,\n name: conditionName,\n expression: this.extractExpression(condition),\n },\n },\n ]\n );\n } catch {}\n\n try {\n const result = await this.evaluateSingleCondition(conditionName, condition, context);\n results.push(result);\n\n if (result.failed) {\n try {\n addEvent('fail_if.triggered', {\n check: context.checkName,\n scope: source,\n name: conditionName,\n expression: result.expression,\n severity: result.severity,\n halt_execution: result.haltExecution,\n });\n } catch {}\n try {\n addFailIfTriggered(context.checkName || 'unknown', source);\n } catch {}\n }\n } catch (error) {\n // If evaluation fails, create an error result\n results.push({\n conditionName,\n failed: false,\n expression: this.extractExpression(condition),\n severity: 'error',\n haltExecution: false,\n error: `Failed to evaluate ${source} condition '${conditionName}': ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Evaluate a single failure condition\n */\n private async evaluateSingleCondition(\n conditionName: string,\n condition: FailureCondition,\n context: FailureConditionContext\n ): Promise<FailureConditionResult> {\n const expression = this.extractExpression(condition);\n const config = this.extractConditionConfig(condition);\n\n try {\n const failed = this.evaluateExpression(expression, context);\n\n return {\n conditionName,\n failed,\n expression,\n message: config.message,\n severity: config.severity || 'error',\n haltExecution: config.halt_execution || false,\n };\n } catch (error) {\n throw new Error(\n `Expression evaluation error: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Secure expression evaluation using SandboxJS\n * Supports the same GitHub Actions-style functions as the previous implementation\n */\n private evaluateExpression(condition: string, context: FailureConditionContext): boolean {\n try {\n // Normalize multi-line or semicolon-separated expressions.\n // Allows writing debug statements on separate lines, e.g.:\n // log(\"start\")\n // log(outputs)\n // outputs[\"fetch-tickets\"].issueType === 'Bug'\n // We convert to a single expression using the comma operator so the\n // final expression determines the boolean result.\n const normalize = (expr: string): string => {\n const trimmed = expr.trim();\n // If it's already a single-line expression without semicolons, keep it.\n if (!/[\\n;]/.test(trimmed)) return trimmed;\n\n // Split on newlines/semicolons, drop empty and comment-only lines.\n const parts = trimmed\n .split(/[\\n;]+/)\n .map(s => s.trim())\n .filter(s => s.length > 0 && !s.startsWith('//'));\n\n if (parts.length === 0) return 'true';\n\n // Support an explicit return in the last statement.\n const lastRaw = parts.pop() as string;\n const last = lastRaw.replace(/^return\\s+/i, '').trim();\n\n // Join leading statements with comma operator; last expression returns value.\n if (parts.length === 0) return last;\n return `(${parts.join(', ')}, ${last})`;\n };\n\n // note: normalization happens later only if raw compilation fails\n // Helper functions for GitHub Actions-style expressions\n const contains = (searchString: string, searchValue: string): boolean =>\n String(searchString).toLowerCase().includes(String(searchValue).toLowerCase());\n\n const startsWith = (searchString: string, searchValue: string): boolean =>\n String(searchString).toLowerCase().startsWith(String(searchValue).toLowerCase());\n\n const endsWith = (searchString: string, searchValue: string): boolean =>\n String(searchString).toLowerCase().endsWith(String(searchValue).toLowerCase());\n\n const length = (value: string | unknown[] | Record<string, unknown>): number => {\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length;\n }\n if (value && typeof value === 'object') {\n return Object.keys(value).length;\n }\n return 0;\n };\n\n const always = (): boolean => true;\n const success = (): boolean => true;\n const failure = (): boolean => false;\n\n // Debug logging function for printing to console\n const log = (...args: unknown[]): void => {\n console.log('🔍 Debug:', ...args);\n };\n\n // Helper functions for array operations\n const hasIssue = (issues: unknown[], field: string, value: unknown): boolean => {\n if (!Array.isArray(issues)) return false;\n return issues.some(issue => (issue as Record<string, unknown>)[field] === value);\n };\n\n const countIssues = (issues: unknown[], field: string, value: unknown): number => {\n if (!Array.isArray(issues)) return 0;\n return issues.filter(issue => (issue as Record<string, unknown>)[field] === value).length;\n };\n\n const hasFileMatching = (issues: unknown[], pattern: string): boolean => {\n if (!Array.isArray(issues)) return false;\n return issues.some(issue => (issue as { file?: string }).file?.includes(pattern));\n };\n\n // Backward compatibility aliases\n const hasIssueWith = hasIssue;\n const hasFileWith = hasFileMatching;\n\n // Permission helper functions\n const permissionHelpers = createPermissionHelpers(\n context.authorAssociation,\n detectLocalMode()\n );\n const hasMinPermission = permissionHelpers.hasMinPermission;\n const isOwner = permissionHelpers.isOwner;\n const isMember = permissionHelpers.isMember;\n const isCollaborator = permissionHelpers.isCollaborator;\n const isContributor = permissionHelpers.isContributor;\n const isFirstTimer = permissionHelpers.isFirstTimer;\n\n // Extract context variables\n const output = context.output || {};\n // Ensure issues is an array - it might be a JSON string from workflow outputs\n let issues = output.issues || [];\n if (typeof issues === 'string') {\n try {\n issues = JSON.parse(issues);\n } catch {\n issues = [];\n }\n }\n if (!Array.isArray(issues)) {\n issues = [];\n }\n\n // Backward compatibility: provide metadata for transition period\n // TODO: Remove after all configurations are updated\n const metadata = context.metadata || {\n checkName: context.checkName || '',\n schema: context.schema || '',\n group: context.group || '',\n criticalIssues: issues.filter((i: { severity?: string }) => i.severity === 'critical')\n .length,\n errorIssues: issues.filter((i: { severity?: string }) => i.severity === 'error').length,\n warningIssues: issues.filter((i: { severity?: string }) => i.severity === 'warning').length,\n infoIssues: issues.filter((i: { severity?: string }) => i.severity === 'info').length,\n totalIssues: issues.length,\n hasChanges: context.hasChanges || false,\n };\n\n // Do not mutate output shape here. Output contracts are defined by providers and\n // workflow outputs. Tests and expressions should rely on those schemas directly.\n\n // Legacy variables for backward compatibility\n const criticalIssues = metadata.criticalIssues;\n const errorIssues = metadata.errorIssues;\n const totalIssues = metadata.totalIssues;\n const warningIssues = metadata.warningIssues;\n const infoIssues = metadata.infoIssues;\n\n // Additional context for 'if' conditions and some failure conditions\n const checkName = context.checkName || '';\n const schema = context.schema || '';\n const group = context.group || '';\n const branch = context.branch || 'unknown';\n const baseBranch = context.baseBranch || 'main';\n const filesChanged = context.filesChanged || [];\n const filesCount = context.filesCount || 0;\n const event = context.event || 'manual';\n const env = context.env || {};\n const outputs = context.outputs || {};\n const inputs = context.inputs || {};\n const debugData = context.debug || null;\n const conversation = context.conversation || null;\n\n // Get memory store and create accessor for fail_if expressions\n const memoryStore = MemoryStore.getInstance();\n const memoryAccessor = {\n get: (key: string, ns?: string) => memoryStore.get(key, ns),\n has: (key: string, ns?: string) => memoryStore.has(key, ns),\n list: (ns?: string) => memoryStore.list(ns),\n getAll: (ns?: string) => memoryStore.getAll(ns),\n };\n\n // Create scope with all context variables and helper functions\n const scope = {\n // Primary context variables\n output,\n outputs,\n debug: debugData,\n // Memory accessor for fail_if expressions\n memory: memoryAccessor,\n // Legacy compatibility variables\n issues,\n metadata,\n criticalIssues,\n errorIssues,\n totalIssues,\n warningIssues,\n infoIssues,\n // If condition context\n checkName,\n schema,\n group,\n branch,\n baseBranch,\n filesChanged,\n filesCount,\n event,\n env,\n inputs,\n // Conversation context (TUI/CLI/Slack)\n conversation,\n // Helper functions\n contains,\n startsWith,\n endsWith,\n length,\n always,\n success,\n failure,\n log,\n hasIssue,\n countIssues,\n hasFileMatching,\n hasIssueWith,\n hasFileWith,\n // Permission helpers\n hasMinPermission,\n isOwner,\n isMember,\n isCollaborator,\n isContributor,\n isFirstTimer,\n };\n\n // Compile and execute the expression in the sandbox\n const raw = condition.trim();\n if (!this.sandbox) {\n this.sandbox = this.createSecureSandbox();\n }\n let exec: ReturnType<typeof this.sandbox.compile>;\n try {\n exec = this.sandbox.compile(`return (${raw});`);\n } catch {\n const normalizedExpr = normalize(condition);\n exec = this.sandbox.compile(`return (${normalizedExpr});`);\n }\n const result = exec(scope).run();\n try {\n require('./logger').logger.debug(` fail_if: result=${Boolean(result)}`);\n } catch {}\n // Ensure we return a boolean\n return Boolean(result);\n } catch (error) {\n console.error('❌ Failed to evaluate expression:', condition, error);\n // Re-throw the error so it can be caught by evaluateSingleCondition\n // and properly populate the error field in the result\n throw error;\n }\n }\n\n /**\n * Extract the expression from a failure condition\n */\n private extractExpression(condition: FailureCondition): string {\n if (typeof condition === 'string') {\n return condition;\n }\n return condition.condition;\n }\n\n /**\n * Extract configuration from a failure condition\n */\n private extractConditionConfig(condition: FailureCondition): {\n message?: string;\n severity?: FailureConditionSeverity;\n halt_execution?: boolean;\n } {\n if (typeof condition === 'string') {\n return {};\n }\n return {\n message: condition.message,\n severity: condition.severity,\n halt_execution: condition.halt_execution,\n };\n }\n\n /**\n * Build the evaluation context for expressions\n */\n private buildEvaluationContext(\n checkName: string,\n checkSchema: string,\n checkGroup: string,\n reviewSummary: ReviewSummary,\n previousOutputs?: Record<string, ReviewSummary>,\n authorAssociation?: string\n ): FailureConditionContext {\n const { issues, debug } = reviewSummary;\n const reviewSummaryWithOutput = reviewSummary as ReviewSummary & { output?: unknown };\n\n // Extract output field to avoid nesting (output.output)\n const {\n output: extractedOutput,\n // Exclude issues from otherFields since we handle it separately\n issues: _issues, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...otherFields\n } = reviewSummaryWithOutput as any;\n\n // Build output object with safety for array-based outputs (forEach aggregation)\n const aggregatedOutput: Record<string, unknown> = {\n issues: (issues || []).map(issue => ({\n file: issue.file,\n line: issue.line,\n endLine: issue.endLine,\n ruleId: issue.ruleId,\n message: issue.message,\n severity: issue.severity,\n category: issue.category,\n group: issue.group,\n schema: issue.schema,\n suggestion: issue.suggestion,\n replacement: issue.replacement,\n })),\n // Include additional schema-specific data from reviewSummary\n ...otherFields,\n };\n\n if (Array.isArray(extractedOutput)) {\n // Preserve items array and lift common flags for convenience (e.g., output.error)\n aggregatedOutput.items = extractedOutput;\n const anyError = extractedOutput.find(\n it => it && typeof it === 'object' && (it as Record<string, unknown>).error\n ) as Record<string, unknown> | undefined;\n if (anyError && anyError.error !== undefined) {\n aggregatedOutput.error = anyError.error;\n }\n } else if (extractedOutput && typeof extractedOutput === 'object') {\n Object.assign(aggregatedOutput, extractedOutput as Record<string, unknown>);\n }\n\n // If provider attached a raw transform snapshot, merge its fields generically.\n try {\n const raw = (reviewSummaryWithOutput as any).__raw;\n if (raw && typeof raw === 'object') {\n Object.assign(aggregatedOutput, raw as Record<string, unknown>);\n }\n } catch {}\n\n // If output is a string, try to parse JSON (full or from end) to enrich context,\n // and also derive common boolean flags generically (e.g., key:true/false) for fail_if usage.\n try {\n if (typeof extractedOutput === 'string') {\n const parsed =\n this.tryExtractJsonFromEnd(extractedOutput) ??\n (() => {\n try {\n return JSON.parse(extractedOutput);\n } catch {\n return null;\n }\n })();\n if (parsed !== null) {\n if (Array.isArray(parsed)) {\n (aggregatedOutput as any).items = parsed;\n } else if (typeof parsed === 'object') {\n Object.assign(aggregatedOutput, parsed as Record<string, unknown>);\n }\n }\n // Generic boolean key extraction for simple text outputs (no special provider cases)\n const lower = extractedOutput.toLowerCase();\n const boolFrom = (key: string): boolean | null => {\n const reTrue = new RegExp(\n `(?:^|[^a-z0-9_])${key}[^a-z0-9_]*[:=][^a-z0-9_]*true(?:[^a-z0-9_]|$)`\n );\n const reFalse = new RegExp(\n `(?:^|[^a-z0-9_])${key}[^a-z0-9_]*[:=][^a-z0-9_]*false(?:[^a-z0-9_]|$)`\n );\n if (reTrue.test(lower)) return true;\n if (reFalse.test(lower)) return false;\n return null;\n };\n const keys = ['error'];\n for (const k of keys) {\n const v = boolFrom(k);\n if (v !== null && (aggregatedOutput as any)[k] === undefined) {\n (aggregatedOutput as any)[k] = v;\n }\n }\n }\n } catch {}\n\n // Try to parse JSON from content as a last resort when no structured output is present\n try {\n const rsAny = reviewSummaryWithOutput as any;\n const hasStructuredOutput = extractedOutput !== undefined && extractedOutput !== null;\n if (!hasStructuredOutput && typeof rsAny?.content === 'string') {\n const parsedFromContent = this.tryExtractJsonFromEnd(rsAny.content);\n if (parsedFromContent !== null && parsedFromContent !== undefined) {\n if (Array.isArray(parsedFromContent)) {\n (aggregatedOutput as any).items = parsedFromContent;\n } else if (typeof parsedFromContent === 'object') {\n Object.assign(aggregatedOutput, parsedFromContent as Record<string, unknown>);\n }\n }\n }\n } catch {}\n\n // Get memory store instance\n const memoryStore = MemoryStore.getInstance();\n\n const context: FailureConditionContext = {\n output: aggregatedOutput,\n outputs: (() => {\n if (!previousOutputs) return {};\n const outputs: Record<string, unknown> = {};\n for (const [checkName, result] of Object.entries(previousOutputs)) {\n // If the result has a direct output field, use it directly\n // Otherwise, expose the entire result as-is\n const summary = result as ReviewSummary & { output?: unknown };\n outputs[checkName] = summary.output !== undefined ? summary.output : summary;\n }\n return outputs;\n })(),\n // Add memory accessor for fail_if expressions\n memory: {\n get: (key: string, ns?: string) => memoryStore.get(key, ns),\n has: (key: string, ns?: string) => memoryStore.has(key, ns),\n list: (ns?: string) => memoryStore.list(ns),\n getAll: (ns?: string) => memoryStore.getAll(ns),\n } as any,\n // Add basic context info for failure conditions\n checkName: checkName,\n schema: checkSchema,\n group: checkGroup,\n authorAssociation: authorAssociation,\n };\n\n // Add debug information if available\n if (debug) {\n context.debug = {\n errors: debug.errors || [],\n processingTime: debug.processingTime || 0,\n provider: debug.provider || 'unknown',\n model: debug.model || 'unknown',\n };\n }\n\n return context;\n }\n\n // Minimal JSON-from-end extractor for fail_if context fallback\n private tryExtractJsonFromEnd(text: string): unknown | null {\n try {\n const lines = text.split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n const t = lines[i].trim();\n if (t.startsWith('{') || t.startsWith('[')) {\n const candidate = lines.slice(i).join('\\n').trim();\n if (\n (candidate.startsWith('{') && candidate.endsWith('}')) ||\n (candidate.startsWith('[') && candidate.endsWith(']'))\n ) {\n return JSON.parse(candidate);\n }\n }\n }\n } catch {}\n return null;\n }\n\n /**\n * Check if any failure condition requires halting execution\n */\n static shouldHaltExecution(results: FailureConditionResult[]): boolean {\n return results.some(result => result.failed && result.haltExecution);\n }\n\n /**\n * Get all failed conditions\n */\n static getFailedConditions(results: FailureConditionResult[]): FailureConditionResult[] {\n return results.filter(result => result.failed);\n }\n\n /**\n * Group results by severity\n */\n static groupResultsBySeverity(results: FailureConditionResult[]): {\n error: FailureConditionResult[];\n warning: FailureConditionResult[];\n info: FailureConditionResult[];\n } {\n return {\n // Only 'error' severity now (no backward compatibility needed here as this is internal)\n error: results.filter(r => r.severity === 'error'),\n warning: results.filter(r => r.severity === 'warning'),\n info: results.filter(r => r.severity === 'info'),\n };\n }\n\n /**\n * Format results for display\n */\n static formatResults(results: FailureConditionResult[]): string {\n const failed = FailureConditionEvaluator.getFailedConditions(results);\n\n if (failed.length === 0) {\n return '✅ All failure conditions passed';\n }\n\n const grouped = FailureConditionEvaluator.groupResultsBySeverity(failed);\n const sections: string[] = [];\n\n if (grouped.error.length > 0) {\n sections.push(`❌ **Error severity conditions (${grouped.error.length}):**`);\n grouped.error.forEach(result => {\n sections.push(` - ${result.conditionName}: ${result.message || result.expression}`);\n });\n }\n\n if (grouped.warning.length > 0) {\n sections.push(`⚠️ **Warning conditions (${grouped.warning.length}):**`);\n grouped.warning.forEach(result => {\n sections.push(` - ${result.conditionName}: ${result.message || result.expression}`);\n });\n }\n\n if (grouped.info.length > 0) {\n sections.push(`ℹ️ **Info conditions (${grouped.info.length}):**`);\n grouped.info.forEach(result => {\n sections.push(` - ${result.conditionName}: ${result.message || result.expression}`);\n });\n }\n\n return sections.join('\\n');\n }\n}\n"],"mappings":"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","names":["checkName","issues"]}
@@ -52,11 +52,11 @@ import {
52
52
  init_routing,
53
53
  init_snapshot_store,
54
54
  snapshot_store_exports
55
- } from "./chunk-66PTDQAO.mjs";
55
+ } from "./chunk-ADQVGGKA.mjs";
56
56
  import {
57
57
  FailureConditionEvaluator,
58
58
  init_failure_condition_evaluator
59
- } from "./chunk-SEA2FWEC.mjs";
59
+ } from "./chunk-BWC5R2UB.mjs";
60
60
  import {
61
61
  addEvent,
62
62
  emitNdjsonFallback,
@@ -67,7 +67,7 @@ import {
67
67
  setSpanAttributes,
68
68
  trace_helpers_exports,
69
69
  withActiveSpan
70
- } from "./chunk-Y2DYDGGY.mjs";
70
+ } from "./chunk-FNBSDOQM.mjs";
71
71
  import {
72
72
  generateHumanId,
73
73
  init_human_id
@@ -4042,7 +4042,7 @@ async function executeWorkflowAsTool(workflowId, args, context2, argsOverrides)
4042
4042
  ...args,
4043
4043
  ...argsOverrides
4044
4044
  };
4045
- const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-HZQGJFOU.mjs");
4045
+ const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-U3UIYLU7.mjs");
4046
4046
  const provider = new WorkflowCheckProvider2();
4047
4047
  const checkConfig = {
4048
4048
  type: "workflow",
@@ -6919,7 +6919,7 @@ async function executeCheckWithForEachItems(checkId, forEachParent, forEachItems
6919
6919
  workflowInputs,
6920
6920
  ai: {
6921
6921
  ...checkConfig.ai || {},
6922
- timeout: checkConfig.ai?.timeout || 18e5,
6922
+ timeout: checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
6923
6923
  debug: !!context2.debug
6924
6924
  }
6925
6925
  };
@@ -7006,7 +7006,7 @@ async function executeCheckWithForEachItems(checkId, forEachParent, forEachItems
7006
7006
  context2,
7007
7007
  prInfo,
7008
7008
  dependencyResults,
7009
- checkConfig.ai?.timeout || 18e5,
7009
+ checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
7010
7010
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
7011
7011
  );
7012
7012
  try {
@@ -7422,7 +7422,7 @@ async function executeInvocation(item, context2, scope, prInfo, dependencyResult
7422
7422
  __outputHistory: outputHistory,
7423
7423
  ai: {
7424
7424
  ...stepConfig.ai || {},
7425
- timeout: stepConfig.ai?.timeout || 18e5,
7425
+ timeout: stepConfig.timeout || stepConfig.ai?.timeout || 18e5,
7426
7426
  debug: !!context2.debug
7427
7427
  }
7428
7428
  };
@@ -7946,7 +7946,7 @@ async function executeSingleCheck(checkId, context2, state, emitEvent, transitio
7946
7946
  workflowInputs,
7947
7947
  ai: {
7948
7948
  ...checkConfig.ai || {},
7949
- timeout: checkConfig.ai?.timeout || 18e5,
7949
+ timeout: checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
7950
7950
  debug: !!context2.debug
7951
7951
  }
7952
7952
  };
@@ -8047,7 +8047,7 @@ async function executeSingleCheck(checkId, context2, state, emitEvent, transitio
8047
8047
  context2,
8048
8048
  prInfo,
8049
8049
  dependencyResults,
8050
- checkConfig.ai?.timeout || 18e5,
8050
+ checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
8051
8051
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
8052
8052
  );
8053
8053
  try {
@@ -8776,7 +8776,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8776
8776
  workflowInputs,
8777
8777
  ai: {
8778
8778
  ...checkConfig.ai || {},
8779
- timeout: checkConfig.ai?.timeout || 18e5,
8779
+ timeout: checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
8780
8780
  debug: !!context2.debug
8781
8781
  }
8782
8782
  };
@@ -8811,7 +8811,10 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8811
8811
  `[LevelDispatch] Conversation extracted (${conv?.transport || "unknown"}): ${messageCount} messages`
8812
8812
  );
8813
8813
  }
8814
- const transportCtx = slackConv ? { slack: { event: event || {}, conversation: slackConv } } : { telegram: { event: event || {}, conversation: telegramConv }, webhook: payload };
8814
+ const transportCtx = slackConv ? { slack: { event: event || {}, conversation: slackConv } } : {
8815
+ telegram: { event: event || {}, conversation: telegramConv },
8816
+ webhook: payload
8817
+ };
8815
8818
  providerConfig.eventContext = {
8816
8819
  ...providerConfig.eventContext,
8817
8820
  ...transportCtx,
@@ -8975,7 +8978,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8975
8978
  context2,
8976
8979
  prInfo,
8977
8980
  dependencyResults,
8978
- checkConfig.ai?.timeout || 18e5,
8981
+ checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
8979
8982
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
8980
8983
  );
8981
8984
  try {
@@ -9363,7 +9366,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9363
9366
  }
9364
9367
  }
9365
9368
  try {
9366
- const { evaluateTransitions } = await import("./routing-DXVYOXAS.mjs");
9369
+ const { evaluateTransitions } = await import("./routing-PFFCQJV2.mjs");
9367
9370
  const transTarget = await evaluateTransitions(
9368
9371
  onFinish.transitions,
9369
9372
  forEachParent,
@@ -9423,7 +9426,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9423
9426
  `[LevelDispatch] Error evaluating on_finish transitions for ${forEachParent}: ${e instanceof Error ? e.message : String(e)}`
9424
9427
  );
9425
9428
  }
9426
- const { evaluateGoto: evaluateGoto2 } = await import("./routing-DXVYOXAS.mjs");
9429
+ const { evaluateGoto: evaluateGoto2 } = await import("./routing-PFFCQJV2.mjs");
9427
9430
  if (context2.debug) {
9428
9431
  logger.info(
9429
9432
  `[LevelDispatch] Evaluating on_finish.goto_js for forEach parent: ${forEachParent}`
@@ -9904,7 +9907,7 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
9904
9907
  workflowInputs,
9905
9908
  ai: {
9906
9909
  ...checkConfig2.ai || {},
9907
- timeout: checkConfig2.ai?.timeout || 18e5,
9910
+ timeout: checkConfig2.timeout || checkConfig2.ai?.timeout || 18e5,
9908
9911
  debug: !!context2.debug
9909
9912
  }
9910
9913
  };
@@ -9935,7 +9938,9 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
9935
9938
  const event = payload?.event;
9936
9939
  const messageCount = Array.isArray(conv?.messages) ? conv.messages.length : 0;
9937
9940
  if (context2.debug) {
9938
- logger.info(`[LevelDispatch] Conversation extracted (${conv?.transport || "unknown"}): ${messageCount} messages`);
9941
+ logger.info(
9942
+ `[LevelDispatch] Conversation extracted (${conv?.transport || "unknown"}): ${messageCount} messages`
9943
+ );
9939
9944
  }
9940
9945
  const transportCtx = slackConv ? { slack: { event: event || {}, conversation: slackConv } } : { telegram: { event: event || {}, conversation: telegramConv }, webhook: payload };
9941
9946
  providerConfig.eventContext = {
@@ -10073,7 +10078,7 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
10073
10078
  context2,
10074
10079
  prInfo,
10075
10080
  dependencyResults,
10076
- checkConfig2.ai?.timeout || 18e5,
10081
+ checkConfig2.timeout || checkConfig2.ai?.timeout || 18e5,
10077
10082
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
10078
10083
  );
10079
10084
  try {
@@ -12733,10 +12738,27 @@ var init_workspace_manager = __esm({
12733
12738
  await this.deleteLocalBranches(worktreePath);
12734
12739
  }
12735
12740
  /**
12736
- * Delete all local branches in a worktree.
12741
+ * Delete local branches in a worktree that are safe to remove.
12742
+ * IMPORTANT: Git worktrees share the branch namespace with the main repo
12743
+ * and all other worktrees. We must NOT delete branches that are checked out
12744
+ * in the main working tree or any other worktree — doing so would destroy
12745
+ * the user's work.
12737
12746
  */
12738
12747
  async deleteLocalBranches(worktreePath) {
12739
12748
  const escapedPath = shellEscape(worktreePath);
12749
+ const worktreeListResult = await commandExecutor.execute(
12750
+ `git -C ${escapedPath} worktree list --porcelain`,
12751
+ { timeout: 1e4 }
12752
+ );
12753
+ const protectedBranches = /* @__PURE__ */ new Set();
12754
+ if (worktreeListResult.exitCode === 0) {
12755
+ for (const line of worktreeListResult.stdout.split("\n")) {
12756
+ const match = line.match(/^branch refs\/heads\/(.+)$/);
12757
+ if (match) {
12758
+ protectedBranches.add(match[1]);
12759
+ }
12760
+ }
12761
+ }
12740
12762
  const listResult = await commandExecutor.execute(
12741
12763
  `git -C ${escapedPath} branch --list --format='%(refname:short)'`,
12742
12764
  { timeout: 1e4 }
@@ -12746,6 +12768,10 @@ var init_workspace_manager = __esm({
12746
12768
  }
12747
12769
  const branches = listResult.stdout.trim().split("\n").map((b) => b.trim()).filter((b) => b.length > 0);
12748
12770
  for (const branch of branches) {
12771
+ if (protectedBranches.has(branch)) {
12772
+ logger.debug(`[Workspace] Skipping branch '${branch}' \u2014 checked out in another worktree`);
12773
+ continue;
12774
+ }
12749
12775
  const deleteResult = await commandExecutor.execute(
12750
12776
  `git -C ${escapedPath} branch -D ${shellEscape(branch)}`,
12751
12777
  { timeout: 1e4 }
@@ -13384,7 +13410,7 @@ var init_state_machine_execution_engine = __esm({
13384
13410
  try {
13385
13411
  const map = options?.webhookContext?.webhookData;
13386
13412
  if (map) {
13387
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-MJYNLB37.mjs");
13413
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-OY2EESIO.mjs");
13388
13414
  const reg = CheckProviderRegistry2.getInstance();
13389
13415
  const p = reg.getProvider("http_input");
13390
13416
  if (p && typeof p.setWebhookContext === "function") p.setWebhookContext(map);
@@ -13507,7 +13533,7 @@ var init_state_machine_execution_engine = __esm({
13507
13533
  tag_filter: tagFilter
13508
13534
  } : config;
13509
13535
  try {
13510
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-MJYNLB37.mjs");
13536
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-OY2EESIO.mjs");
13511
13537
  const registry = CheckProviderRegistry2.getInstance();
13512
13538
  registry.setCustomTools(configWithTagFilter.tools || {});
13513
13539
  } catch (error) {
@@ -13571,7 +13597,7 @@ var init_state_machine_execution_engine = __esm({
13571
13597
  try {
13572
13598
  const webhookData = this.executionContext?.webhookContext?.webhookData;
13573
13599
  if (webhookData instanceof Map) {
13574
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-ZZGJ3UFR.mjs");
13600
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-GEXHYH3X.mjs");
13575
13601
  const slackCtx = extractSlackContext2(webhookData);
13576
13602
  if (slackCtx) {
13577
13603
  const payload = Array.from(webhookData.values())[0];
@@ -13600,7 +13626,7 @@ var init_state_machine_execution_engine = __esm({
13600
13626
  if (Array.isArray(configWithTagFilter.frontends) && configWithTagFilter.frontends.length > 0) {
13601
13627
  try {
13602
13628
  const { EventBus } = await import("./event-bus-5K3Y2FCS.mjs");
13603
- const { FrontendsHost } = await import("./host-6GGO2BQE.mjs");
13629
+ const { FrontendsHost } = await import("./host-NYUSWEE4.mjs");
13604
13630
  const bus = new EventBus();
13605
13631
  context2.eventBus = bus;
13606
13632
  frontendsHost = new FrontendsHost(bus, logger);
@@ -13952,9 +13978,9 @@ var init_state_machine_execution_engine = __esm({
13952
13978
  * @returns Array of failure condition evaluation results
13953
13979
  */
13954
13980
  async evaluateFailureConditions(checkName, reviewSummary, config, previousOutputs, authorAssociation) {
13955
- const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-RTT5SLVL.mjs");
13981
+ const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-63BECZYF.mjs");
13956
13982
  const evaluator = new FailureConditionEvaluator2();
13957
- const { addEvent: addEvent3 } = await import("./trace-helpers-CECHXDLI.mjs");
13983
+ const { addEvent: addEvent3 } = await import("./trace-helpers-MYH2GPXF.mjs");
13958
13984
  const { addFailIfTriggered } = await import("./metrics-JTOG2HNO.mjs");
13959
13985
  const checkConfig = config.checks?.[checkName];
13960
13986
  if (!checkConfig) {
@@ -41593,8 +41619,8 @@ function buildBuiltinGlobals(opts) {
41593
41619
  const asyncFunctionNames = /* @__PURE__ */ new Set();
41594
41620
  const scheduleFn = async (args = {}) => {
41595
41621
  try {
41596
- const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-LL7XDILD.mjs");
41597
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-ZZGJ3UFR.mjs");
41622
+ const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-DN2DSXIX.mjs");
41623
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-GEXHYH3X.mjs");
41598
41624
  const parentCtx = opts.sessionInfo?._parentContext;
41599
41625
  const webhookData = parentCtx?.prInfo?.eventContext?.webhookData;
41600
41626
  const visorCfg = parentCtx?.config;
@@ -42641,11 +42667,26 @@ var init_worktree_manager = __esm({
42641
42667
  await this.deleteLocalBranches(worktreePath);
42642
42668
  }
42643
42669
  /**
42644
- * Delete all local branches in a worktree.
42670
+ * Delete local branches in a worktree that are safe to remove.
42645
42671
  * Worktrees are always used in detached HEAD state, so any local branches
42646
42672
  * were unintentionally created and should be cleaned up.
42673
+ * IMPORTANT: Git worktrees share the branch namespace with the main repo
42674
+ * and all other worktrees. We must NOT delete branches that are checked out
42675
+ * in the main working tree or any other worktree — doing so would destroy
42676
+ * the user's work.
42647
42677
  */
42648
42678
  async deleteLocalBranches(worktreePath) {
42679
+ const worktreeListCmd = `git -C ${this.escapeShellArg(worktreePath)} worktree list --porcelain`;
42680
+ const worktreeListResult = await this.executeGitCommand(worktreeListCmd, { timeout: 1e4 });
42681
+ const protectedBranches = /* @__PURE__ */ new Set();
42682
+ if (worktreeListResult.exitCode === 0) {
42683
+ for (const line of worktreeListResult.stdout.split("\n")) {
42684
+ const match = line.match(/^branch refs\/heads\/(.+)$/);
42685
+ if (match) {
42686
+ protectedBranches.add(match[1]);
42687
+ }
42688
+ }
42689
+ }
42649
42690
  const listCmd = `git -C ${this.escapeShellArg(worktreePath)} branch --list --format='%(refname:short)'`;
42650
42691
  const listResult = await this.executeGitCommand(listCmd, { timeout: 1e4 });
42651
42692
  if (listResult.exitCode !== 0 || !listResult.stdout.trim()) {
@@ -42653,6 +42694,10 @@ var init_worktree_manager = __esm({
42653
42694
  }
42654
42695
  const branches = listResult.stdout.trim().split("\n").map((b) => b.trim()).filter((b) => b.length > 0);
42655
42696
  for (const branch of branches) {
42697
+ if (protectedBranches.has(branch)) {
42698
+ logger.debug(`Skipping branch '${branch}' \u2014 checked out in another worktree`);
42699
+ continue;
42700
+ }
42656
42701
  const deleteCmd = `git -C ${this.escapeShellArg(worktreePath)} branch -D ${this.escapeShellArg(branch)}`;
42657
42702
  const deleteResult = await this.executeGitCommand(deleteCmd, { timeout: 1e4 });
42658
42703
  if (deleteResult.exitCode === 0) {
@@ -45191,4 +45236,4 @@ undici/lib/fetch/body.js:
45191
45236
  undici/lib/websocket/frame.js:
45192
45237
  (*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
45193
45238
  */
45194
- //# sourceMappingURL=chunk-R3FNZRE4.mjs.map
45239
+ //# sourceMappingURL=chunk-XLDVWRKQ.mjs.map