mlld
Version:
mlld: a modular prompt scripting language
1 lines • 59.5 kB
Source Map (JSON)
{"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}"]}