{"version":3,"sources":["../core/utils/sourceContextExtractor.ts","../core/utils/smartPathResolver.ts","../core/utils/enhancedLocationFormatter.ts","../core/utils/errorDisplayFormatter.ts","../core/utils/errorFormatSelector.ts"],"names":["SourceContextExtractor","constructor","fileSystem","fileCache","maxCacheSize","cacheTtl","Map","extractContext","location","options","contextLines","maxLineLength","file","line","lines","getFileLines","extractContextFromLines","error","extractContextFromSource","sourceContent","split","errorLineIndex","length","startLine","Math","max","endLine","min","contextLines_","i","content","column","start","end","slice","push","number","isErrorLine","errorLine","errorColumn","filePath","now","Date","cached","get","timestamp","readFile","size","cleanCache","set","entries","Array","from","expiredKeys","filter","_","cache","map","key","forEach","delete","sortedEntries","includes","sort","a","__","b","toRemove","clearCache","clear","SmartPathResolver","projectRootCache","resolvePath","basePath","process","cwd","workingDirectory","preferRelative","maxRelativeDepth","absolutePath","resolve","projectRoot","findProjectRoot","relativeFromCwd","relative","relativeFromProject","isWithinProject","startsWith","displayPath","isRelative","projectRelative","upLevels","match","display","absolute","startPath","fallbackBasePath","cacheKey","has","currentDir","dirname","rootDir","parse","root","indicators","indicator","indicatorPath","join","fileExists","formatPathForDisplay","resolvedPath","result","undefined","EnhancedLocationFormatter","pathResolver","formatLocation","useSmartPaths","pathOptions","startPos","parts","formatLocationForError","formatted","ErrorDisplayFormatter","sourceExtractor","locationFormatter","formatError","showSourceContext","useColors","errorHeader","formatErrorHeader","details","peggyFormatted","parseErrorIndicator","chalk","red","bold","sourceSection","extractPeggySourceSection","sourceLocation","logger","debug","errorDetails","hasFile","formattedLocation","sourceContext","hasContext","sourceLength","contextDisplay","formatSourceContext","mlldLocation","enhancedSourceContext","hasSourceLocation","detailsDisplay","formatErrorDetails","directiveTrace","DirectiveTraceFormatter","traceFormatter","trace","format","suggestion","cyan","errorName","name","replace","message","context","fileHeader","blue","maxLineNum","l","lineNumWidth","String","lineNum","padStart","prefix","errorLineDisplay","createErrorIndicator","contextLineDisplay","gray","prefixLength","lineContent","actualColumn","errorLength","spaces","repeat","arrows","hint","expectedToken","yellow","sourceLines","inSourceSection","trim","relevantDetails","value","Object","require","header","ErrorFormatSelector","formatter","formatForCLI","formatForAPI","useSourceContext","json","code","severity","cause","Error","raw","formatAuto","isTTY","stdout","hasColors","toJSON"],"mappings":"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","file":"chunk-JO67PGXR.mjs","sourcesContent":["// String operations are legitimate in this file for error message formatting\n// This file extracts source code context for error messages, requiring line-by-line\n// string splitting to show code snippets with line numbers and error indicators.\n// This is purely for human-readable output formatting, not AST manipulation.\n\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\nimport { FormattedLocation } from './locationFormatter';\n\nexport interface SourceLine {\n  number: number;\n  content: string;\n  isErrorLine: boolean;\n}\n\nexport interface SourceContext {\n  file?: string;\n  lines: SourceLine[];\n  errorLine: number;\n  errorColumn: number;\n}\n\nexport interface ExtractSourceContextOptions {\n  contextLines?: number;\n  maxLineLength?: number;\n}\n\nexport class SourceContextExtractor {\n  private fileCache = new Map<string, { lines: string[]; timestamp: number }>();\n  private maxCacheSize = 100;\n  private cacheTtl = 60000; // 1 minute\n\n  constructor(private fileSystem: IFileSystemService) {}\n\n  async extractContext(\n    location: FormattedLocation,\n    options: ExtractSourceContextOptions = {}\n  ): Promise<SourceContext | null> {\n    const { contextLines = 2, maxLineLength = 120 } = options;\n\n    if (!location.file || !location.line) {\n      return null;\n    }\n\n    try {\n      const lines = await this.getFileLines(location.file);\n      return this.extractContextFromLines(lines, location, { contextLines, maxLineLength });\n    } catch (error) {\n      return null;\n    }\n  }\n\n  /**\n   * Extract context from provided source content instead of reading from file\n   */\n  extractContextFromSource(\n    sourceContent: string,\n    location: FormattedLocation,\n    options: ExtractSourceContextOptions = {}\n  ): SourceContext | null {\n    if (!location.line) {\n      return null;\n    }\n\n    const lines = sourceContent.split('\\n');\n    return this.extractContextFromLines(lines, location, options);\n  }\n\n  private extractContextFromLines(\n    lines: string[],\n    location: FormattedLocation,\n    options: ExtractSourceContextOptions = {}\n  ): SourceContext | null {\n    const { contextLines = 2, maxLineLength = 120 } = options;\n    const errorLineIndex = location.line! - 1;\n    \n    if (errorLineIndex < 0 || errorLineIndex >= lines.length) {\n      return null;\n    }\n\n    const startLine = Math.max(0, errorLineIndex - contextLines);\n    const endLine = Math.min(lines.length - 1, errorLineIndex + contextLines);\n\n    const contextLines_: SourceLine[] = [];\n    \n    for (let i = startLine; i <= endLine; i++) {\n      let content = lines[i];\n      \n      if (content.length > maxLineLength) {\n        const column = location.column || 1;\n        const start = Math.max(0, column - 40);\n        const end = Math.min(content.length, start + maxLineLength);\n        content = (start > 0 ? '...' : '') + content.slice(start, end) + (end < content.length ? '...' : '');\n      }\n\n      contextLines_.push({\n        number: i + 1,\n        content,\n        isErrorLine: i === errorLineIndex\n      });\n    }\n\n    return {\n      file: location.file,\n      lines: contextLines_,\n      errorLine: location.line!,\n      errorColumn: location.column || 1\n    };\n  }\n\n  private async getFileLines(filePath: string): Promise<string[]> {\n    const now = Date.now();\n    const cached = this.fileCache.get(filePath);\n    \n    // Check if we have a valid cached entry\n    if (cached && (now - cached.timestamp) < this.cacheTtl) {\n      return cached.lines;\n    }\n\n    try {\n      const content = await this.fileSystem.readFile(filePath);\n      const lines = content.split('\\n');\n      \n      // Clean cache if it's getting too large\n      if (this.fileCache.size >= this.maxCacheSize) {\n        this.cleanCache();\n      }\n      \n      this.fileCache.set(filePath, { lines, timestamp: now });\n      return lines;\n    } catch (error) {\n      throw error;\n    }\n  }\n\n  private cleanCache(): void {\n    const now = Date.now();\n    const entries = Array.from(this.fileCache.entries());\n    \n    // Remove expired entries first\n    const expiredKeys = entries\n      .filter(([_, cache]) => (now - cache.timestamp) >= this.cacheTtl)\n      .map(([key]) => key);\n    \n    expiredKeys.forEach(key => this.fileCache.delete(key));\n    \n    // If still too large, remove oldest entries\n    if (this.fileCache.size >= this.maxCacheSize) {\n      const sortedEntries = entries\n        .filter(([key]) => !expiredKeys.includes(key))\n        .sort(([_, a], [__, b]) => a.timestamp - b.timestamp);\n      \n      const toRemove = sortedEntries.slice(0, sortedEntries.length - this.maxCacheSize + 10);\n      toRemove.forEach(([key]) => this.fileCache.delete(key));\n    }\n  }\n\n  clearCache(): void {\n    this.fileCache.clear();\n  }\n}","import * as path from 'path';\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\n\nexport interface SmartPathOptions {\n  basePath?: string;\n  workingDirectory?: string;\n  preferRelative?: boolean;\n  maxRelativeDepth?: number;\n}\n\nexport interface ResolvedPath {\n  display: string;\n  absolute: string;\n  relative?: string;\n  isRelative: boolean;\n  isWithinProject: boolean;\n}\n\nexport class SmartPathResolver {\n  private fileSystem: IFileSystemService;\n  private projectRootCache = new Map<string, string | null>();\n\n  constructor(fileSystem: IFileSystemService) {\n    this.fileSystem = fileSystem;\n  }\n\n  /**\n   * Resolve a file path to the most appropriate display format\n   */\n  async resolvePath(filePath: string, options: SmartPathOptions = {}): Promise<ResolvedPath> {\n    const {\n      basePath = process.cwd() as string,\n      workingDirectory = process.cwd() as string,\n      preferRelative = true,\n      maxRelativeDepth = 3\n    } = options;\n\n    const absolutePath = path.resolve(filePath);\n    \n    // Find project root\n    const projectRoot = await this.findProjectRoot(absolutePath, basePath);\n    \n    // Calculate relative path from working directory\n    const relativeFromCwd = path.relative(workingDirectory, absolutePath);\n    \n    // Calculate relative path from project root\n    const relativeFromProject = projectRoot \n      ? path.relative(projectRoot, absolutePath)\n      : relativeFromCwd;\n\n    // Determine if file is within the project\n    const isWithinProject = projectRoot !== null && !relativeFromProject.startsWith('..');\n    \n    // Choose the best display path\n    let displayPath: string;\n    let isRelative = false;\n\n    if (preferRelative && isWithinProject) {\n      // Use project-relative path if within project\n      const projectRelative = relativeFromProject.startsWith('./') ? relativeFromProject : `./${relativeFromProject}`;\n      \n      // Check if the relative path is reasonable (not too many ../ segments)\n      const upLevels = (projectRelative.match(/\\.\\.\\//g) || []).length;\n      \n      if (upLevels <= maxRelativeDepth) {\n        displayPath = projectRelative;\n        isRelative = true;\n      } else {\n        displayPath = absolutePath;\n      }\n    } else if (preferRelative && !relativeFromCwd.startsWith('..')) {\n      // Use cwd-relative path if not too far up\n      const upLevels = (relativeFromCwd.match(/\\.\\.\\//g) || []).length;\n      \n      if (upLevels <= maxRelativeDepth) {\n        displayPath = relativeFromCwd.startsWith('./') ? relativeFromCwd : `./${relativeFromCwd}`;\n        isRelative = true;\n      } else {\n        displayPath = absolutePath;\n      }\n    } else {\n      displayPath = absolutePath;\n    }\n\n    return {\n      display: displayPath,\n      absolute: absolutePath,\n      relative: isWithinProject ? relativeFromProject : relativeFromCwd,\n      isRelative,\n      isWithinProject\n    };\n  }\n\n  /**\n   * Find the project root by looking for package.json, .git, or other indicators\n   */\n  private async findProjectRoot(startPath: string, fallbackBasePath: string): Promise<string | null> {\n    const cacheKey = startPath;\n    \n    if (this.projectRootCache.has(cacheKey)) {\n      return this.projectRootCache.get(cacheKey) || null;\n    }\n\n    let currentDir = path.dirname(startPath);\n    const rootDir = path.parse(currentDir).root;\n\n    while (currentDir !== rootDir) {\n      // Check for common project root indicators\n      const indicators = [\n        'package.json',\n        '.git',\n        'pyproject.toml',\n        'Cargo.toml',\n        'go.mod',\n        'composer.json',\n        'pom.xml',\n        'build.gradle',\n        'Makefile',\n        'README.md'\n      ];\n\n      for (const indicator of indicators) {\n        const indicatorPath = path.join(currentDir, indicator);\n        try {\n          if (await this.fileExists(indicatorPath)) {\n            this.projectRootCache.set(cacheKey, currentDir);\n            return currentDir;\n          }\n        } catch {\n          // Ignore file access errors\n        }\n      }\n\n      currentDir = path.dirname(currentDir);\n    }\n\n    // If no project root found, use fallback\n    this.projectRootCache.set(cacheKey, fallbackBasePath);\n    return fallbackBasePath;\n  }\n\n  /**\n   * Check if a file exists\n   */\n  private async fileExists(filePath: string): Promise<boolean> {\n    try {\n      await this.fileSystem.readFile(filePath);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Clear the project root cache\n   */\n  clearCache(): void {\n    this.projectRootCache.clear();\n  }\n\n  /**\n   * Format a file path for error display with line and column\n   */\n  formatPathForDisplay(resolvedPath: ResolvedPath, line?: number, column?: number): string {\n    let result = resolvedPath.display;\n    \n    if (line !== undefined) {\n      result += `:${line}`;\n      \n      if (column !== undefined) {\n        result += `:${column}`;\n      }\n    }\n    \n    return result;\n  }\n}","import type { InterpreterLocation, ErrorSourceLocation } from '@core/types';\nimport { SmartPathResolver, SmartPathOptions } from './smartPathResolver';\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\n\nexport interface EnhancedFormattedLocation {\n  readonly display: string;\n  readonly file?: string;\n  readonly displayPath?: string; // Smart path without line/column\n  readonly line?: number;\n  readonly column?: number;\n  readonly isRelative?: boolean;\n  readonly isWithinProject?: boolean;\n}\n\nexport interface FormatLocationOptions extends SmartPathOptions {\n  useSmartPaths?: boolean;\n}\n\nexport class EnhancedLocationFormatter {\n  private pathResolver: SmartPathResolver;\n\n  constructor(fileSystem: IFileSystemService) {\n    this.pathResolver = new SmartPathResolver(fileSystem);\n  }\n\n  async formatLocation(\n    location: InterpreterLocation | ErrorSourceLocation | undefined,\n    options: FormatLocationOptions = {}\n  ): Promise<EnhancedFormattedLocation> {\n    const { useSmartPaths = true, ...pathOptions } = options;\n\n    if (!location) {\n      return { display: 'unknown location' };\n    }\n\n    // Handle Location objects with start/end properties\n    if ('start' in location && location.start) {\n      // Extract position info from start property\n      const startPos = location.start;\n      const filePath = (startPos as any).filePath || (location as any).filePath;\n      \n      if (filePath) {\n        let displayPath = filePath;\n        let isRelative = false;\n        let isWithinProject = false;\n\n        if (useSmartPaths) {\n          try {\n            const resolvedPath = await this.pathResolver.resolvePath(filePath, pathOptions);\n            displayPath = resolvedPath.display;\n            isRelative = resolvedPath.isRelative;\n            isWithinProject = resolvedPath.isWithinProject;\n          } catch {\n            // Fall back to absolute path if smart resolution fails\n            displayPath = filePath;\n          }\n        }\n\n        const parts: string[] = [displayPath];\n        \n        if (startPos.line !== undefined) {\n          if (startPos.column !== undefined) {\n            parts.push(`${startPos.line}:${startPos.column}`);\n          } else {\n            parts.push(`line ${startPos.line}`);\n          }\n        }\n        \n        return {\n          display: parts.join(':'),\n          file: filePath,\n          displayPath,\n          line: startPos.line,\n          column: startPos.column,\n          isRelative,\n          isWithinProject\n        };\n      }\n    }\n\n    // Handle locations with file paths\n    if ('filePath' in location && location.filePath) {\n      let displayPath = location.filePath;\n      let isRelative = false;\n      let isWithinProject = false;\n\n      if (useSmartPaths) {\n        try {\n          const resolvedPath = await this.pathResolver.resolvePath(location.filePath, pathOptions);\n          displayPath = resolvedPath.display;\n          isRelative = resolvedPath.isRelative;\n          isWithinProject = resolvedPath.isWithinProject;\n        } catch {\n          // Fall back to absolute path if smart resolution fails\n          displayPath = location.filePath;\n        }\n      }\n\n      const parts: string[] = [displayPath];\n      \n      if (location.line !== undefined) {\n        if (location.column !== undefined) {\n          parts.push(`${location.line}:${location.column}`);\n        } else {\n          parts.push(`line ${location.line}`);\n        }\n      }\n      \n      return {\n        display: parts.join(':'),\n        file: location.filePath,\n        displayPath,\n        line: location.line,\n        column: location.column,\n        isRelative,\n        isWithinProject\n      };\n    }\n\n    // Handle locations without file paths (line/column only)\n    if ('line' in location && location.line !== undefined) {\n      const parts: string[] = [];\n      \n      if (location.column !== undefined) {\n        parts.push(`line ${location.line}, column ${location.column}`);\n      } else {\n        parts.push(`line ${location.line}`);\n      }\n      \n      return {\n        display: parts.join(''),\n        line: location.line,\n        column: location.column\n      };\n    }\n\n    return { display: 'unknown location' };\n  }\n\n  async formatLocationForError(\n    location: InterpreterLocation | ErrorSourceLocation | undefined,\n    options: FormatLocationOptions = {}\n  ): Promise<string> {\n    const formatted = await this.formatLocation(location, options);\n    return formatted.display;\n  }\n\n  clearCache(): void {\n    this.pathResolver.clearCache();\n  }\n}","import chalk from 'chalk';\nimport { MlldError } from '@core/errors/MlldError';\nimport { SourceContextExtractor, SourceContext } from './sourceContextExtractor';\nimport { EnhancedLocationFormatter } from './enhancedLocationFormatter';\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\nimport { logger } from '@core/utils/logger';\n\nexport interface ErrorDisplayOptions {\n  showSourceContext?: boolean;\n  contextLines?: number;\n  maxLineLength?: number;\n  useColors?: boolean;\n  useSmartPaths?: boolean;\n  basePath?: string;\n  workingDirectory?: string;\n}\n\nexport class ErrorDisplayFormatter {\n  private sourceExtractor: SourceContextExtractor;\n  private locationFormatter: EnhancedLocationFormatter;\n\n  constructor(fileSystem: IFileSystemService) {\n    this.sourceExtractor = new SourceContextExtractor(fileSystem);\n    this.locationFormatter = new EnhancedLocationFormatter(fileSystem);\n  }\n\n  async formatError(error: MlldError, options: ErrorDisplayOptions = {}): Promise<string> {\n    const {\n      showSourceContext = true,\n      contextLines = 2,\n      maxLineLength = 120,\n      useColors = true,\n      useSmartPaths = true,\n      basePath,\n      workingDirectory = process.cwd()\n    } = options;\n\n    const parts: string[] = [];\n\n    // Format the main error message\n    const errorHeader = this.formatErrorHeader(error, useColors);\n    parts.push(errorHeader);\n\n    // Add Peggy formatted section if available (right after header for parse errors)\n    if (error.details?.peggyFormatted) {\n      // Add parse error indicator\n      const parseErrorIndicator = useColors \n        ? chalk.red.bold('✘ Parse Error')\n        : '✘ Parse Error';\n      parts.push('\\n' + parseErrorIndicator);\n      \n      // Extract and add the source code section from Peggy's format\n      const sourceSection = this.extractPeggySourceSection(error.details.peggyFormatted, useColors);\n      if (sourceSection) {\n        parts.push(sourceSection);\n      }\n    }\n\n    // Add source context if available and requested (skip if we have Peggy formatting)\n    if (showSourceContext && error.sourceLocation && !error.details?.peggyFormatted) {\n      logger.debug('[ErrorDisplay] Formatting source context:', {\n        sourceLocation: error.sourceLocation,\n        errorDetails: error.details,\n        hasFile: !!(error.sourceLocation as any).filePath || !!(error.details?.filePath)\n      });\n      \n      const formattedLocation = await this.locationFormatter.formatLocation(error.sourceLocation, {\n        useSmartPaths,\n        basePath,\n        workingDirectory,\n        preferRelative: true,\n        maxRelativeDepth: 3\n      });\n      \n      logger.debug('[ErrorDisplay] Formatted location:', formattedLocation);\n      \n      // Check if we have source content stored in the error (for parse errors)\n      const sourceContent = (error as any).sourceContent || error.details?.sourceContent;\n      \n      if (sourceContent) {\n        // Use source content directly when available (more reliable than file reading)\n        const sourceContext = this.sourceExtractor.extractContextFromSource(\n          sourceContent,\n          {\n            display: formattedLocation.display,\n            file: formattedLocation.displayPath || formattedLocation.file || '<stdin>',\n            line: formattedLocation.line,\n            column: formattedLocation.column\n          },\n          {\n            contextLines,\n            maxLineLength\n          }\n        );\n\n        logger.debug('[ErrorDisplay] Source context from content:', {\n          hasContext: !!sourceContext,\n          sourceLength: sourceContent.length,\n          lines: sourceContext?.lines?.length\n        });\n\n        if (sourceContext) {\n          const contextDisplay = this.formatSourceContext(sourceContext, useColors, error.details?.mlldLocation);\n          parts.push(contextDisplay);\n        }\n      } else if (formattedLocation.file) {\n        // Use original file path for source extraction (absolute path needed)\n        const sourceContext = await this.sourceExtractor.extractContext({\n          display: formattedLocation.display,\n          file: formattedLocation.file, // Use absolute path for file reading\n          line: formattedLocation.line,\n          column: formattedLocation.column\n        }, {\n          contextLines,\n          maxLineLength\n        });\n\n        logger.debug('[ErrorDisplay] Source context extracted:', {\n          hasContext: !!sourceContext,\n          file: formattedLocation.file,\n          lines: sourceContext?.lines?.length\n        });\n\n        if (sourceContext) {\n          // Update the source context to use the smart display path\n          const enhancedSourceContext = {\n            ...sourceContext,\n            file: formattedLocation.displayPath || formattedLocation.file // Use smart path for display\n          };\n          const contextDisplay = this.formatSourceContext(enhancedSourceContext, useColors, error.details?.mlldLocation);\n          parts.push(contextDisplay);\n        }\n      } else {\n        logger.debug('[ErrorDisplay] No file path in formatted location and no source content');\n      }\n    } else {\n      logger.debug('[ErrorDisplay] No source context requested or no sourceLocation:', {\n        showSourceContext,\n        hasSourceLocation: !!error.sourceLocation\n      });\n    }\n\n    // Add error details\n    const detailsDisplay = await this.formatErrorDetails(error, useColors, {\n      useSmartPaths,\n      basePath,\n      workingDirectory\n    });\n    if (detailsDisplay) {\n      parts.push(detailsDisplay);\n    }\n\n    // Add directive trace if available\n    if (error.details?.directiveTrace && error.details.directiveTrace.length > 0) {\n      const { DirectiveTraceFormatter } = await import('./DirectiveTraceFormatter');\n      const traceFormatter = new DirectiveTraceFormatter();\n      const trace = traceFormatter.format(error.details.directiveTrace, useColors);\n      parts.push('\\n' + trace);\n    }\n\n    // Add suggestion if available\n    if (error.details?.suggestion) {\n      const suggestion = useColors \n        ? chalk.cyan(`💡 ${error.details.suggestion}`)\n        : `💡 ${error.details.suggestion}`;\n      parts.push(suggestion);\n    }\n\n    return parts.join('\\n\\n');\n  }\n\n  private formatErrorHeader(error: MlldError, useColors: boolean): string {\n    const errorName = error.name.replace('Error', '');\n    \n    if (useColors) {\n      return chalk.red.bold(`${errorName}: ${error.message}`);\n    }\n    \n    return `${errorName}: ${error.message}`;\n  }\n\n  private formatSourceContext(context: SourceContext, useColors: boolean, mlldLocation?: any): string {\n    const parts: string[] = [];\n\n    // File header\n    if (context.file) {\n      const fileHeader = useColors\n        ? chalk.blue.bold(`  ${context.file}:${context.errorLine}:${context.errorColumn}`)\n        : `  ${context.file}:${context.errorLine}:${context.errorColumn}`;\n      parts.push(fileHeader);\n    }\n\n    // Source lines\n    const maxLineNum = Math.max(...context.lines.map(l => l.number));\n    const lineNumWidth = String(maxLineNum).length;\n\n    for (const line of context.lines) {\n      const lineNum = String(line.number).padStart(lineNumWidth, ' ');\n      const prefix = `  ${lineNum} | `;\n      \n      if (line.isErrorLine) {\n        // Error line with highlighting\n        const errorLineDisplay = useColors\n          ? chalk.red(`${prefix}${line.content}`)\n          : `${prefix}${line.content}`;\n        parts.push(errorLineDisplay);\n\n        // Add error indicator\n        const indicator = this.createErrorIndicator(\n          prefix.length, \n          context.errorColumn, \n          line.content,\n          useColors,\n          mlldLocation\n        );\n        if (indicator) {\n          parts.push(indicator);\n        }\n      } else {\n        // Context line\n        const contextLineDisplay = useColors\n          ? chalk.gray(`${prefix}${line.content}`)\n          : `${prefix}${line.content}`;\n        parts.push(contextLineDisplay);\n      }\n    }\n\n    return parts.join('\\n');\n  }\n\n  private createErrorIndicator(\n    prefixLength: number, \n    column: number, \n    lineContent: string, \n    useColors: boolean,\n    mlldLocation?: any\n  ): string | null {\n    if (column < 1) return null;\n\n    // If we have mlldLocation with precise position info, use it\n    if (mlldLocation && mlldLocation.column && mlldLocation.length) {\n      // Use the precise column from mlldLocation\n      const actualColumn = mlldLocation.column;\n      const errorLength = mlldLocation.length || 1;\n      \n      // Create spacing to align with the error position\n      const spaces = ' '.repeat(prefixLength + actualColumn - 1);\n      const arrows = '^'.repeat(Math.min(errorLength, lineContent.length - actualColumn + 1));\n      \n      // Add expected token hint if available\n      let hint = '';\n      if (mlldLocation.expectedToken) {\n        hint = ` Expected: ${mlldLocation.expectedToken}`;\n      }\n      \n      return useColors \n        ? `${spaces}${chalk.red.bold(arrows)}${chalk.yellow(hint)}`\n        : `${spaces}${arrows}${hint}`;\n    }\n\n    // Fallback to simple indicator\n    const spaces = ' '.repeat(prefixLength + column - 1);\n    const indicator = '^';\n    \n    return useColors \n      ? `${spaces}${chalk.red.bold(indicator)}`\n      : `${spaces}${indicator}`;\n  }\n\n  private extractPeggySourceSection(peggyFormatted: string, useColors: boolean): string | null {\n    // Parse Peggy's format to extract the full source code display with arrows\n    const lines = peggyFormatted.split('\\n');\n    const sourceLines: string[] = [];\n    let inSourceSection = false;\n    \n    for (const line of lines) {\n      // Start collecting after the location line (e.g., \" --> file.mld:5:10\")\n      if (line.trim().startsWith('-->')) {\n        // Include the location line itself\n        sourceLines.push(line);\n        inSourceSection = true;\n        continue;\n      }\n      \n      // Collect ALL lines in source section (including arrows and empty lines)\n      if (inSourceSection) {\n        // Check if we've hit the end of the source section\n        // This is typically a completely empty line after the arrow indicators\n        if (line === '' && sourceLines.length > 2 && \n            sourceLines[sourceLines.length - 1].includes('^')) {\n          // We've likely hit the end of the source section\n          break;\n        }\n        \n        // Include all lines that are part of the source display:\n        // - Lines with line numbers (e.g., \"1 | /var @items = [\")\n        // - Lines with pipe separators (e.g., \"  |\")\n        // - Lines with arrow indicators (e.g., \"  | ^^^^^^^\")\n        // - Empty lines within the section\n        sourceLines.push(line);\n      }\n    }\n    \n    return sourceLines.length > 0 ? sourceLines.join('\\n') : null;\n  }\n\n  private async formatErrorDetails(\n    error: MlldError, \n    useColors: boolean,\n    pathOptions: { useSmartPaths?: boolean; basePath?: string; workingDirectory?: string; }\n  ): Promise<string | null> {\n    if (!error.details || typeof error.details !== 'object') {\n      return null;\n    }\n\n    const relevantDetails = [];\n    \n    for (const [key, value] of Object.entries(error.details)) {\n      // Skip suggestion as it's handled separately\n      if (key === 'suggestion') continue;\n      // Skip sourceContent as it's only for internal use\n      if (key === 'sourceContent') continue;\n      // Skip peggyFormatted as it's handled separately\n      if (key === 'peggyFormatted') continue;\n      // Skip mlldLocation as it's used for arrow indicators\n      if (key === 'mlldLocation') continue;\n      if (value === undefined || value === null) continue;\n\n      // Format location objects specially with smart paths\n      if (value && typeof value === 'object' && \n          ('line' in value || 'filePath' in value)) {\n        try {\n          const formattedLocation = await this.locationFormatter.formatLocationForError(value, pathOptions);\n          relevantDetails.push(`  ${key}: ${formattedLocation}`);\n        } catch {\n          // Fallback to basic formatting if smart formatting fails\n          const { formatLocationForError } = require('./locationFormatter');\n          relevantDetails.push(`  ${key}: ${formatLocationForError(value)}`);\n        }\n      } else {\n        relevantDetails.push(`  ${key}: ${String(value)}`);\n      }\n    }\n\n    if (relevantDetails.length === 0) {\n      return null;\n    }\n\n    const header = useColors ? chalk.gray('Details:') : 'Details:';\n    const details = useColors \n      ? chalk.gray(relevantDetails.join('\\n'))\n      : relevantDetails.join('\\n');\n\n    return `${header}\\n${details}`;\n  }\n}","import { MlldError } from '@core/errors/MlldError';\nimport { ErrorDisplayFormatter } from './errorDisplayFormatter';\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\n\nexport interface ErrorFormatOptions {\n  useColors?: boolean;\n  useSourceContext?: boolean;\n  useSmartPaths?: boolean;\n  basePath?: string;\n  workingDirectory?: string;\n  contextLines?: number;\n}\n\nexport interface FormattedErrorResult {\n  formatted: string;\n  raw: MlldError;\n  json: Record<string, any>;\n}\n\n/**\n * Unified error formatting for both CLI and API usage\n */\nexport class ErrorFormatSelector {\n  private formatter?: ErrorDisplayFormatter;\n\n  constructor(private fileSystem?: IFileSystemService) {\n    if (fileSystem) {\n      this.formatter = new ErrorDisplayFormatter(fileSystem);\n    }\n  }\n\n  /**\n   * Format error for CLI display with colors and context\n   */\n  async formatForCLI(\n    error: MlldError,\n    options: ErrorFormatOptions = {}\n  ): Promise<string> {\n    if (!this.formatter) {\n      return this.formatForAPI(error, options).formatted;\n    }\n\n    return await this.formatter.formatError(error, {\n      showSourceContext: options.useSourceContext ?? true,\n      useColors: options.useColors ?? true,\n      useSmartPaths: options.useSmartPaths ?? true,\n      basePath: options.basePath,\n      workingDirectory: options.workingDirectory || process.cwd(),\n      contextLines: options.contextLines || 2\n    });\n  }\n\n  /**\n   * Format error for API usage (no colors, structured data)\n   */\n  formatForAPI(\n    error: MlldError,\n    options: ErrorFormatOptions = {}\n  ): FormattedErrorResult {\n    // Create a clean, structured representation\n    const json = {\n      name: error.name,\n      message: error.message,\n      code: error.code,\n      severity: error.severity,\n      sourceLocation: error.sourceLocation,\n      details: error.details,\n      cause: error.cause instanceof Error ? {\n        name: error.cause.name,\n        message: error.cause.message\n      } : error.cause\n    };\n\n    // Create a simple formatted version (no colors, minimal context)\n    let formatted = `${error.name}: ${error.message}`;\n    \n    if (error.sourceLocation) {\n      if ('filePath' in error.sourceLocation && error.sourceLocation.filePath) {\n        let location = error.sourceLocation.filePath;\n        if (error.sourceLocation.line) {\n          location += `:${error.sourceLocation.line}`;\n          if (error.sourceLocation.column) {\n            location += `:${error.sourceLocation.column}`;\n          }\n        }\n        formatted += `\\n  at ${location}`;\n      } else if ('line' in error.sourceLocation && error.sourceLocation.line) {\n        formatted += `\\n  at line ${error.sourceLocation.line}`;\n        if (error.sourceLocation.column) {\n          formatted += `, column ${error.sourceLocation.column}`;\n        }\n      }\n    }\n\n    if (error.details?.suggestion) {\n      formatted += `\\n\\nSuggestion: ${error.details.suggestion}`;\n    }\n\n    return {\n      formatted,\n      raw: error,\n      json\n    };\n  }\n\n  /**\n   * Auto-detect appropriate format based on environment\n   */\n  async formatAuto(\n    error: MlldError,\n    options: ErrorFormatOptions = {}\n  ): Promise<FormattedErrorResult> {\n    const isTTY = process.stdout?.isTTY ?? false;\n    const hasColors = options.useColors ?? isTTY;\n    const hasContext = options.useSourceContext ?? isTTY;\n\n    if (hasColors && hasContext && this.formatter) {\n      const formatted = await this.formatForCLI(error, {\n        ...options,\n        useColors: hasColors,\n        useSourceContext: hasContext\n      });\n      \n      return {\n        formatted,\n        raw: error,\n        json: error.toJSON()\n      };\n    } else {\n      return this.formatForAPI(error, options);\n    }\n  }\n}"]}