@reverse-craft/smart-fs 1.0.6 → 2.0.0

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 (40) hide show
  1. package/README.md +160 -13
  2. package/dist/analyzer.d.ts +91 -0
  3. package/dist/analyzer.d.ts.map +1 -0
  4. package/dist/beautifier.d.ts +120 -0
  5. package/dist/beautifier.d.ts.map +1 -0
  6. package/dist/index.d.ts +102 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +1267 -0
  9. package/dist/index.js.map +7 -0
  10. package/dist/languageDetector.d.ts +74 -0
  11. package/dist/languageDetector.d.ts.map +1 -0
  12. package/dist/llmConfig.d.ts +34 -0
  13. package/dist/llmConfig.d.ts.map +1 -0
  14. package/dist/searcher.d.ts +113 -0
  15. package/dist/searcher.d.ts.map +1 -0
  16. package/dist/server.d.ts +2 -0
  17. package/dist/server.d.ts.map +1 -0
  18. package/dist/server.js +571 -78
  19. package/dist/server.js.map +4 -4
  20. package/dist/tools/ToolDefinition.d.ts +24 -0
  21. package/dist/tools/ToolDefinition.d.ts.map +1 -0
  22. package/dist/tools/aiFindJsvmpDispatcher.d.ts +79 -0
  23. package/dist/tools/aiFindJsvmpDispatcher.d.ts.map +1 -0
  24. package/dist/tools/applyCustomTransform.d.ts +14 -0
  25. package/dist/tools/applyCustomTransform.d.ts.map +1 -0
  26. package/dist/tools/findUsageSmart.d.ts +16 -0
  27. package/dist/tools/findUsageSmart.d.ts.map +1 -0
  28. package/dist/tools/index.d.ts +43 -0
  29. package/dist/tools/index.d.ts.map +1 -0
  30. package/dist/tools/readCodeSmart.d.ts +13 -0
  31. package/dist/tools/readCodeSmart.d.ts.map +1 -0
  32. package/dist/tools/searchCodeSmart.d.ts +18 -0
  33. package/dist/tools/searchCodeSmart.d.ts.map +1 -0
  34. package/dist/transformer.d.ts +119 -0
  35. package/dist/transformer.d.ts.map +1 -0
  36. package/dist/truncator.d.ts +69 -0
  37. package/dist/truncator.d.ts.map +1 -0
  38. package/dist/types.d.ts +61 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/package.json +16 -16
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/languageDetector.ts", "../src/beautifier.ts", "../src/truncator.ts", "../src/searcher.ts", "../src/analyzer.ts", "../src/transformer.ts"],
4
+ "sourcesContent": ["/**\n * smart-fs - Smart file processing library\n * \n * Provides code beautification, truncation, search, analysis, and transformation\n * with multi-language support and source map generation.\n * \n * @module smart-fs\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n// Re-export all types\nexport * from './types.js';\n\n// Re-export language detector\nexport {\n type SupportedLanguage,\n type LanguageInfo,\n detectLanguage,\n getLanguageInfo,\n isFullySupportedLanguage,\n getSupportedExtensions,\n isExtensionSupported,\n} from './languageDetector.js';\n\n// Re-export beautifier\nexport {\n type SourceMap,\n type BeautifyOptions,\n type BeautifyResult,\n type LocalPaths,\n type LocalCacheCheck,\n ensureBeautified,\n beautifyCode,\n beautifyJson,\n beautifyHtml,\n beautifyCss,\n getLocalPaths,\n isLocalCacheValid,\n} from './beautifier.js';\n\n// Re-export truncator\nexport {\n type TruncateOptions,\n type TruncateResult,\n truncateCode,\n truncateCodeFromFile,\n truncateFallback,\n truncateLongLines,\n truncateCodeHighPerf,\n} from './truncator.js';\n\n// Re-export searcher\nexport {\n type OriginalPosition as SearchOriginalPosition,\n type ContextLine,\n type SearchMatch,\n type SearchOptions,\n type SearchResult,\n searchInCode,\n formatSearchResult,\n formatSourcePosition as formatSearchSourcePosition,\n createRegex,\n escapeRegex,\n unescapeBackslashes,\n} from './searcher.js';\n\n// Re-export analyzer\nexport {\n type OriginalPosition as AnalyzeOriginalPosition,\n type LocationInfo,\n type BindingInfo,\n type AnalysisResult,\n type AnalyzeOptions,\n analyzeBindings,\n formatAnalysisResult,\n formatSourcePosition as formatAnalyzeSourcePosition,\n parseCode,\n} from './analyzer.js';\n\n// Re-export transformer\nexport {\n type TransformOptions,\n type TransformResult,\n type OutputPaths,\n type BabelPluginFunction,\n applyCustomTransform,\n loadBabelPlugin,\n runBabelTransform,\n getOutputPaths,\n cleanBasename,\n} from './transformer.js';\n\n// Import types for convenience functions\nimport type { SmartReadOptions, ProcessingResult } from './types.js';\nimport type { SearchOptions, SearchResult } from './searcher.js';\nimport type { AnalyzeOptions, AnalysisResult } from './analyzer.js';\nimport { detectLanguage, getLanguageInfo } from './languageDetector.js';\nimport { ensureBeautified } from './beautifier.js';\nimport { truncateCodeFromFile } from './truncator.js';\nimport { searchInCode, formatSearchResult } from './searcher.js';\nimport { analyzeBindings, formatAnalysisResult } from './analyzer.js';\n\n\n/**\n * Smart read file with beautification and truncation\n * \n * This is a convenience function that combines beautification and truncation\n * into a single operation. It handles:\n * - Language detection (or uses specified language)\n * - Code beautification (for supported languages)\n * - String/line truncation\n * - Optional line range extraction\n * \n * @param filePath - Path to the file to read\n * @param options - Processing options\n * @returns ProcessingResult with processed code and metadata\n * \n * @example\n * ```typescript\n * // Read and process entire file\n * const result = await smartRead('./src/app.js');\n * \n * // Read specific lines with custom options\n * const result = await smartRead('./src/app.js', {\n * startLine: 10,\n * endLine: 50,\n * charLimit: 200,\n * maxLineChars: 400\n * });\n * ```\n */\nexport async function smartRead(\n filePath: string,\n options?: SmartReadOptions\n): Promise<ProcessingResult> {\n const absolutePath = path.resolve(filePath);\n \n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n return {\n code: '',\n sourceMap: null,\n language: 'unknown',\n usedFallback: true,\n error: `File not found: ${filePath}`,\n };\n }\n \n // Detect or use specified language\n const langInfo = options?.language \n ? getLanguageInfo(options.language)\n : detectLanguage(absolutePath);\n \n try {\n // Beautify the file\n const beautifyResult = await ensureBeautified(absolutePath, {\n language: options?.language,\n saveLocal: options?.saveLocal,\n });\n \n let code = beautifyResult.code;\n \n // Extract line range if specified\n if (options?.startLine !== undefined || options?.endLine !== undefined) {\n const lines = code.split('\\n');\n const startLine = Math.max(1, options?.startLine ?? 1);\n const endLine = Math.min(lines.length, options?.endLine ?? lines.length);\n code = lines.slice(startLine - 1, endLine).join('\\n');\n }\n \n // Apply truncation\n const truncateResult = truncateCodeFromFile(absolutePath, code, {\n language: options?.language,\n charLimit: options?.charLimit,\n maxLineChars: options?.maxLineChars,\n previewLength: options?.previewLength,\n });\n \n return {\n code: truncateResult.code,\n sourceMap: beautifyResult.rawMap,\n language: langInfo.language,\n usedFallback: beautifyResult.usedFallback || truncateResult.usedFallback,\n localPath: beautifyResult.localPath,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n code: '',\n sourceMap: null,\n language: langInfo.language,\n usedFallback: true,\n error: message,\n };\n }\n}\n\n/**\n * Smart search in file with beautification and source map support\n * \n * This function beautifies the file first, then searches in the beautified code.\n * Results include original file positions via source map for setting breakpoints.\n * \n * @param filePath - Path to the file to search\n * @param query - Search query (text or regex pattern)\n * @param options - Search options\n * @returns SearchResult with matches and original positions\n * \n * @example\n * ```typescript\n * // Simple text search\n * const result = await smartSearch('./src/app.js', 'function');\n * \n * // Regex search with options\n * const result = await smartSearch('./src/app.js', 'function\\\\s+\\\\w+', {\n * isRegex: true,\n * caseSensitive: true,\n * contextLines: 3\n * });\n * ```\n */\nexport async function smartSearch(\n filePath: string,\n query: string,\n options?: SearchOptions\n): Promise<SearchResult & { formatted: string; error?: string }> {\n const absolutePath = path.resolve(filePath);\n \n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n return {\n matches: [],\n totalMatches: 0,\n truncated: false,\n formatted: `File not found: ${filePath}`,\n error: `File not found: ${filePath}`,\n };\n }\n \n try {\n // Beautify the file first\n const beautifyResult = await ensureBeautified(absolutePath);\n \n // Source map is required for search\n if (!beautifyResult.rawMap) {\n return {\n matches: [],\n totalMatches: 0,\n truncated: false,\n formatted: `Search not supported for this file type (no source map available)`,\n error: `Search requires source map support`,\n };\n }\n \n // Perform search\n const searchResult = searchInCode(\n beautifyResult.code,\n beautifyResult.rawMap,\n options ?? { query }\n );\n \n // Format result\n const formatted = formatSearchResult(\n filePath,\n query,\n options?.caseSensitive ?? false,\n searchResult,\n options?.maxMatches ?? 50,\n options?.isRegex ?? false\n );\n \n return {\n ...searchResult,\n formatted,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n matches: [],\n totalMatches: 0,\n truncated: false,\n formatted: `Search error: ${message}`,\n error: message,\n };\n }\n}\n\n/**\n * Find variable/function usage in file\n * \n * This function analyzes the code to find all bindings (definitions and references)\n * for a specific identifier. Results include original file positions via source map.\n * \n * @param filePath - Path to the file to analyze\n * @param identifier - Variable or function name to find\n * @param options - Analysis options\n * @returns AnalysisResult with bindings and original positions\n * \n * @example\n * ```typescript\n * // Find all usages of 'myFunction'\n * const result = await findUsage('./src/app.js', 'myFunction');\n * \n * // Find usage at specific line\n * const result = await findUsage('./src/app.js', 'data', {\n * targetLine: 42\n * });\n * ```\n */\nexport async function findUsage(\n filePath: string,\n identifier: string,\n options?: AnalyzeOptions\n): Promise<AnalysisResult & { formatted: string; error?: string }> {\n const absolutePath = path.resolve(filePath);\n \n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n return {\n bindings: [],\n identifier,\n isTargeted: options?.targetLine !== undefined,\n targetLine: options?.targetLine,\n formatted: `File not found: ${filePath}`,\n error: `File not found: ${filePath}`,\n };\n }\n \n try {\n // Beautify the file first\n const beautifyResult = await ensureBeautified(absolutePath);\n \n // Source map is required for analysis\n if (!beautifyResult.rawMap) {\n return {\n bindings: [],\n identifier,\n isTargeted: options?.targetLine !== undefined,\n targetLine: options?.targetLine,\n formatted: `Analysis not supported for this file type (no source map available)`,\n error: `Analysis requires source map support`,\n };\n }\n \n // Perform analysis\n const analysisResult = await analyzeBindings(\n beautifyResult.code,\n beautifyResult.rawMap,\n identifier,\n options\n );\n \n // Format result\n const formatted = formatAnalysisResult(\n filePath,\n analysisResult,\n options?.maxReferences ?? 10\n );\n \n return {\n ...analysisResult,\n formatted,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n bindings: [],\n identifier,\n isTargeted: options?.targetLine !== undefined,\n targetLine: options?.targetLine,\n formatted: `Analysis error: ${message}`,\n error: message,\n };\n }\n}\n", "import * as path from 'path';\n\n/**\n * Supported language types for smart-fs processing\n */\nexport type SupportedLanguage =\n | 'javascript'\n | 'typescript'\n | 'json'\n | 'html'\n | 'xml'\n | 'css'\n | 'unknown';\n\n/**\n * Information about a language's processing capabilities\n */\nexport interface LanguageInfo {\n /** The language identifier */\n language: SupportedLanguage;\n /** Whether AST-based processing is supported */\n supportsAST: boolean;\n /** Whether beautification is supported */\n supportsBeautify: boolean;\n /** Whether source map generation is supported */\n supportsSourceMap: boolean;\n}\n\n/**\n * Language configuration mapping\n */\nconst LANGUAGE_CONFIG: Record<SupportedLanguage, LanguageInfo> = {\n javascript: {\n language: 'javascript',\n supportsAST: true,\n supportsBeautify: true,\n supportsSourceMap: true,\n },\n typescript: {\n language: 'typescript',\n supportsAST: true,\n supportsBeautify: true,\n supportsSourceMap: true,\n },\n json: {\n language: 'json',\n supportsAST: false,\n supportsBeautify: true,\n supportsSourceMap: false,\n },\n html: {\n language: 'html',\n supportsAST: false,\n supportsBeautify: true,\n supportsSourceMap: false,\n },\n xml: {\n language: 'xml',\n supportsAST: false,\n supportsBeautify: true,\n supportsSourceMap: false,\n },\n css: {\n language: 'css',\n supportsAST: false,\n supportsBeautify: true,\n supportsSourceMap: false,\n },\n unknown: {\n language: 'unknown',\n supportsAST: false,\n supportsBeautify: false,\n supportsSourceMap: false,\n },\n};\n\n/**\n * File extension to language mapping\n */\nconst EXTENSION_MAP: Record<string, SupportedLanguage> = {\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.jsx': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.mts': 'typescript',\n '.cts': 'typescript',\n '.json': 'json',\n '.html': 'html',\n '.htm': 'html',\n '.xml': 'xml',\n '.svg': 'xml',\n '.css': 'css',\n};\n\n/**\n * Detect language from file path based on extension\n * \n * @param filePath - Path to the file (can be relative or absolute)\n * @returns LanguageInfo object with detected language and capabilities\n * \n * @example\n * ```typescript\n * const info = detectLanguage('./src/app.ts');\n * // { language: 'typescript', supportsAST: true, supportsBeautify: true, supportsSourceMap: true }\n * \n * const unknown = detectLanguage('./readme.md');\n * // { language: 'unknown', supportsAST: false, supportsBeautify: false, supportsSourceMap: false }\n * ```\n */\nexport function detectLanguage(filePath: string): LanguageInfo {\n const ext = path.extname(filePath).toLowerCase();\n const language = EXTENSION_MAP[ext] ?? 'unknown';\n return LANGUAGE_CONFIG[language];\n}\n\n/**\n * Get language info by explicit language name\n * \n * @param language - The language identifier\n * @returns LanguageInfo object with language capabilities\n * \n * @example\n * ```typescript\n * const info = getLanguageInfo('typescript');\n * // { language: 'typescript', supportsAST: true, supportsBeautify: true, supportsSourceMap: true }\n * ```\n */\nexport function getLanguageInfo(language: SupportedLanguage): LanguageInfo {\n return LANGUAGE_CONFIG[language];\n}\n\n/**\n * Check if a language supports full processing (AST + beautify + source map)\n * \n * @param language - The language identifier\n * @returns true if the language supports all processing features\n * \n * @example\n * ```typescript\n * isFullySupportedLanguage('javascript'); // true\n * isFullySupportedLanguage('json'); // false (no AST or source map)\n * isFullySupportedLanguage('unknown'); // false\n * ```\n */\nexport function isFullySupportedLanguage(language: SupportedLanguage): boolean {\n const info = LANGUAGE_CONFIG[language];\n return info.supportsAST && info.supportsBeautify && info.supportsSourceMap;\n}\n\n/**\n * Get all supported file extensions\n * \n * @returns Array of supported file extensions (including the dot)\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_MAP);\n}\n\n/**\n * Check if a file extension is supported (not unknown)\n * \n * @param ext - File extension (with or without leading dot)\n * @returns true if the extension maps to a known language\n */\nexport function isExtensionSupported(ext: string): boolean {\n const normalizedExt = ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;\n return normalizedExt in EXTENSION_MAP;\n}\n", "import * as esbuild from 'esbuild';\nimport * as crypto from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { detectLanguage, getLanguageInfo, type SupportedLanguage } from './languageDetector.js';\n\nconst TEMP_DIR = path.join(os.tmpdir(), 'smart-fs-mcp-cache');\n\nexport interface SourceMap {\n version: number;\n sources: string[];\n names: string[];\n mappings: string;\n file?: string;\n sourceRoot?: string;\n}\n\nexport interface BeautifyOptions {\n /** Override auto-detected language */\n language?: SupportedLanguage;\n /** Save beautified file locally (default: true for JS/TS) */\n saveLocal?: boolean;\n}\n\nexport interface BeautifyResult {\n code: string;\n /** Source map (null for languages that don't support it) */\n rawMap: SourceMap | null;\n /** \u672C\u5730\u4FDD\u5B58\u7684\u7F8E\u5316\u6587\u4EF6\u8DEF\u5F84 */\n localPath: string;\n /** \u672C\u5730\u4FDD\u5B58\u7684 source map \u8DEF\u5F84 */\n localMapPath: string;\n /** \u672C\u5730\u4FDD\u5B58\u5931\u8D25\u65F6\u7684\u9519\u8BEF\u4FE1\u606F */\n localSaveError?: string;\n /** Whether fallback mode was used */\n usedFallback: boolean;\n}\n\n/**\n * Ensure the cache directory exists\n */\nasync function ensureCacheDir(): Promise<void> {\n await fs.mkdir(TEMP_DIR, { recursive: true });\n}\n\n/**\n * Calculate cache key based on file path and modification time\n */\nfunction calculateCacheKey(originalPath: string, mtimeMs: number): string {\n const fileKey = `${originalPath}-${mtimeMs}`;\n return crypto.createHash('md5').update(fileKey).digest('hex');\n}\n\n/**\n * Get cache file paths for a given original file\n */\nfunction getCachePaths(originalPath: string, hash: string): { beautifiedPath: string; mapPath: string } {\n const fileName = path.basename(originalPath, '.js');\n const beautifiedPath = path.join(TEMP_DIR, `${fileName}.${hash}.beautified.js`);\n const mapPath = `${beautifiedPath}.map`;\n return { beautifiedPath, mapPath };\n}\n\n\n/**\n * Local paths result interface\n */\nexport interface LocalPaths {\n /** Path to the beautified file in the same directory as the original */\n beautifiedPath: string;\n /** Path to the source map file in the same directory as the original */\n mapPath: string;\n}\n\n/**\n * Get local file paths for beautified output\n * Given an original file path, returns the paths where the beautified file\n * and source map should be saved in the same directory.\n * \n * Naming convention:\n * - Original: {filename}.js -> Beautified: {filename}.beautified.js\n * - Source map: {filename}.beautified.js.map\n * \n * @param originalPath - Path to the original JavaScript file\n * @returns Object containing beautifiedPath and mapPath\n */\nexport function getLocalPaths(originalPath: string): LocalPaths {\n const absolutePath = path.resolve(originalPath);\n const dir = path.dirname(absolutePath);\n const ext = path.extname(absolutePath);\n const baseName = path.basename(absolutePath, ext);\n \n const beautifiedPath = path.join(dir, `${baseName}.beautified.js`);\n const mapPath = `${beautifiedPath}.map`;\n \n return { beautifiedPath, mapPath };\n}\n\n/**\n * Check if cache exists and is valid (for temp directory cache)\n */\nasync function isCacheValid(beautifiedPath: string, mapPath: string): Promise<boolean> {\n try {\n await Promise.all([\n fs.access(beautifiedPath),\n fs.access(mapPath)\n ]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Local cache validation result interface\n */\nexport interface LocalCacheCheck {\n /** Original file modification time in milliseconds */\n originalMtime: number;\n /** Whether the beautified file exists */\n beautifiedExists: boolean;\n /** Beautified file modification time in milliseconds (0 if not exists) */\n beautifiedMtime: number;\n /** Whether the cache is valid (beautifiedMtime >= originalMtime) */\n isValid: boolean;\n}\n\n/**\n * Check if local beautified cache is valid\n * \n * A local cache is considered valid when:\n * 1. The beautified file exists\n * 2. The beautified file's modification time is >= the original file's modification time\n * \n * @param originalPath - Path to the original JavaScript file\n * @returns LocalCacheCheck object with validation details\n */\nexport async function isLocalCacheValid(originalPath: string): Promise<LocalCacheCheck> {\n const absolutePath = path.resolve(originalPath);\n const { beautifiedPath } = getLocalPaths(absolutePath);\n \n // Get original file stats\n let originalStats: Awaited<ReturnType<typeof fs.stat>>;\n try {\n originalStats = await fs.stat(absolutePath);\n } catch {\n // Original file doesn't exist - cache cannot be valid\n return {\n originalMtime: 0,\n beautifiedExists: false,\n beautifiedMtime: 0,\n isValid: false\n };\n }\n \n const originalMtime = originalStats.mtimeMs;\n \n // Check if beautified file exists and get its stats\n let beautifiedStats: Awaited<ReturnType<typeof fs.stat>>;\n try {\n beautifiedStats = await fs.stat(beautifiedPath);\n } catch {\n // Beautified file doesn't exist\n return {\n originalMtime,\n beautifiedExists: false,\n beautifiedMtime: 0,\n isValid: false\n };\n }\n \n const beautifiedMtime = beautifiedStats.mtimeMs;\n const isValid = beautifiedMtime >= originalMtime;\n \n return {\n originalMtime,\n beautifiedExists: true,\n beautifiedMtime,\n isValid\n };\n}\n\n/**\n * Beautify JSON content with proper indentation\n * @param content - JSON string to beautify\n * @returns Object with beautified JSON string and error flag\n */\nexport function beautifyJson(content: string): { code: string; parseFailed: boolean } {\n try {\n const parsed = JSON.parse(content);\n return { code: JSON.stringify(parsed, null, 2), parseFailed: false };\n } catch {\n // If parsing fails, return original content (Requirement 8.5)\n return { code: content, parseFailed: true };\n }\n}\n\n/**\n * Simple HTML/XML beautification with indentation\n * This is a basic formatter that handles common cases\n * @param content - HTML/XML string to beautify\n * @returns Beautified HTML/XML string, or original content if formatting fails\n */\nexport function beautifyHtml(content: string): string {\n try {\n // Simple regex-based formatting for HTML/XML\n // This handles basic indentation without a full parser\n \n let formatted = '';\n let indent = 0;\n const indentStr = ' '; // 2 spaces\n \n // Normalize line endings and split by tags\n const normalized = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n \n // Split content into tokens (tags and text)\n const tokens = normalized.split(/(<[^>]+>)/g).filter(token => token.trim() !== '');\n \n for (const token of tokens) {\n const trimmedToken = token.trim();\n \n if (!trimmedToken) continue;\n \n // Check if it's a tag\n if (trimmedToken.startsWith('<')) {\n // Self-closing tag or declaration\n if (trimmedToken.startsWith('<!') || \n trimmedToken.startsWith('<?') || \n trimmedToken.endsWith('/>')) {\n formatted += indentStr.repeat(indent) + trimmedToken + '\\n';\n }\n // Closing tag\n else if (trimmedToken.startsWith('</')) {\n indent = Math.max(0, indent - 1);\n formatted += indentStr.repeat(indent) + trimmedToken + '\\n';\n }\n // Opening tag\n else {\n formatted += indentStr.repeat(indent) + trimmedToken + '\\n';\n indent++;\n }\n } else {\n // Text content - preserve it with current indentation\n const textLines = trimmedToken.split('\\n');\n for (const line of textLines) {\n const trimmedLine = line.trim();\n if (trimmedLine) {\n formatted += indentStr.repeat(indent) + trimmedLine + '\\n';\n }\n }\n }\n }\n \n return formatted.trimEnd();\n } catch {\n // If formatting fails, return original content (Requirement 8.5)\n return content;\n }\n}\n\n/**\n * Simple CSS beautification with indentation\n * @param content - CSS string to beautify\n * @returns Beautified CSS string, or original content if formatting fails\n */\nexport function beautifyCss(content: string): string {\n try {\n // Simple regex-based formatting for CSS\n let formatted = content;\n \n // Normalize line endings\n formatted = formatted.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n \n // Add newline after { and before }\n formatted = formatted.replace(/\\{/g, ' {\\n');\n formatted = formatted.replace(/\\}/g, '\\n}\\n');\n \n // Add newline after ;\n formatted = formatted.replace(/;/g, ';\\n');\n \n // Clean up multiple newlines\n formatted = formatted.replace(/\\n\\s*\\n/g, '\\n');\n \n // Add indentation\n const lines = formatted.split('\\n');\n let indent = 0;\n const indentStr = ' ';\n const result: string[] = [];\n \n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n \n // Decrease indent before closing brace\n if (trimmed.startsWith('}')) {\n indent = Math.max(0, indent - 1);\n }\n \n result.push(indentStr.repeat(indent) + trimmed);\n \n // Increase indent after opening brace\n if (trimmed.endsWith('{')) {\n indent++;\n }\n }\n \n return result.join('\\n');\n } catch {\n // If formatting fails, return original content (Requirement 8.5)\n return content;\n }\n}\n\n/**\n * Beautify code string directly based on language\n * @param code - Source code to beautify\n * @param language - Language type\n * @returns Beautified code (or original if fallback mode)\n */\nexport function beautifyCode(\n code: string,\n language: SupportedLanguage\n): { code: string; usedFallback: boolean } {\n const langInfo = getLanguageInfo(language);\n \n // If language doesn't support beautification, return original (fallback mode)\n if (!langInfo.supportsBeautify) {\n return { code, usedFallback: true };\n }\n \n switch (language) {\n case 'json': {\n const result = beautifyJson(code);\n // If JSON parsing failed, use fallback mode (Requirement 8.4)\n return { code: result.code, usedFallback: result.parseFailed };\n }\n case 'html':\n case 'xml':\n return { code: beautifyHtml(code), usedFallback: false };\n case 'css':\n return { code: beautifyCss(code), usedFallback: false };\n case 'javascript':\n case 'typescript':\n // JS/TS beautification requires async esbuild, handled separately\n // This function is for sync beautification of simple formats\n return { code, usedFallback: true };\n default:\n // Unknown language - fallback mode\n return { code, usedFallback: true };\n }\n}\n\n/**\n * Beautify file based on detected or specified language\n * - JS/TS: Use esbuild for formatting with source map\n * - JSON: Use JSON.stringify with indentation\n * - HTML/XML: Use simple indentation-based formatting\n * - CSS: Use simple formatting\n * - Unknown: Return original (fallback mode)\n * \n * @param originalPath - Original file path\n * @param options - Optional beautify options (language, saveLocal, etc.)\n * @returns Beautified code and Source Map (null for non-JS/TS)\n */\nexport async function ensureBeautified(\n originalPath: string,\n options?: BeautifyOptions\n): Promise<BeautifyResult> {\n // Resolve to absolute path\n const absolutePath = path.resolve(originalPath);\n \n // Check if file exists\n let stats: Awaited<ReturnType<typeof fs.stat>>;\n try {\n stats = await fs.stat(absolutePath);\n } catch {\n throw new Error(`File not found: ${originalPath}`);\n }\n \n // Detect or use specified language\n const langInfo = options?.language \n ? getLanguageInfo(options.language)\n : detectLanguage(absolutePath);\n \n const language = langInfo.language;\n \n // Get local paths for local save/read\n const localPaths = getLocalPaths(absolutePath);\n \n // Handle non-JS/TS languages (no caching, no source map)\n if (language !== 'javascript' && language !== 'typescript') {\n const content = await fs.readFile(absolutePath, 'utf-8');\n const beautified = beautifyCode(content, language);\n \n return {\n code: beautified.code,\n rawMap: null, // No source map for non-JS/TS\n localPath: localPaths.beautifiedPath,\n localMapPath: localPaths.mapPath,\n usedFallback: beautified.usedFallback,\n };\n }\n \n // JS/TS processing with esbuild and caching\n // Check local cache first\n const localCacheCheck = await isLocalCacheValid(absolutePath);\n if (localCacheCheck.isValid) {\n // Local cache hit - read from local files\n try {\n const [code, mapContent] = await Promise.all([\n fs.readFile(localPaths.beautifiedPath, 'utf-8'),\n fs.readFile(localPaths.mapPath, 'utf-8')\n ]);\n return {\n code,\n rawMap: JSON.parse(mapContent) as SourceMap,\n localPath: localPaths.beautifiedPath,\n localMapPath: localPaths.mapPath,\n usedFallback: false,\n };\n } catch {\n // If reading local cache fails, fall through to regenerate\n }\n }\n \n // Ensure temp cache directory exists\n await ensureCacheDir();\n \n // Calculate cache key for temp directory\n const hash = calculateCacheKey(absolutePath, stats.mtimeMs);\n const { beautifiedPath, mapPath } = getCachePaths(absolutePath, hash);\n \n // Check temp cache\n if (await isCacheValid(beautifiedPath, mapPath)) {\n // Temp cache hit - read from cache\n const [code, mapContent] = await Promise.all([\n fs.readFile(beautifiedPath, 'utf-8'),\n fs.readFile(mapPath, 'utf-8')\n ]);\n \n const result: BeautifyResult = {\n code,\n rawMap: JSON.parse(mapContent) as SourceMap,\n localPath: localPaths.beautifiedPath,\n localMapPath: localPaths.mapPath,\n usedFallback: false,\n };\n \n // Also save to local directory\n await saveToLocal(result, localPaths, mapContent);\n \n return result;\n }\n \n // Cache miss - beautify with Esbuild\n let esbuildResult: esbuild.BuildResult;\n try {\n esbuildResult = await esbuild.build({\n entryPoints: [absolutePath],\n bundle: false,\n write: false,\n format: 'esm',\n sourcemap: 'external',\n sourcesContent: false,\n outfile: 'out.js',\n // Beautify settings\n minify: false,\n keepNames: true,\n treeShaking: false,\n });\n } catch (err) {\n // If esbuild fails, fall back to returning original content\n const content = await fs.readFile(absolutePath, 'utf-8');\n return {\n code: content,\n rawMap: null,\n localPath: localPaths.beautifiedPath,\n localMapPath: localPaths.mapPath,\n usedFallback: true,\n };\n }\n \n // Extract code and source map from result\n const codeFile = esbuildResult.outputFiles?.find(f => f.path.endsWith('.js'));\n const mapFile = esbuildResult.outputFiles?.find(f => f.path.endsWith('.map'));\n \n if (!codeFile || !mapFile) {\n // If output files are missing, fall back to original content\n const content = await fs.readFile(absolutePath, 'utf-8');\n return {\n code: content,\n rawMap: null,\n localPath: localPaths.beautifiedPath,\n localMapPath: localPaths.mapPath,\n usedFallback: true,\n };\n }\n \n const code = codeFile.text;\n const rawMap = JSON.parse(mapFile.text) as SourceMap;\n const mapText = mapFile.text;\n \n // Write to temp cache\n await Promise.all([\n fs.writeFile(beautifiedPath, code, 'utf-8'),\n fs.writeFile(mapPath, mapText, 'utf-8')\n ]);\n \n const result: BeautifyResult = {\n code,\n rawMap,\n localPath: localPaths.beautifiedPath,\n localMapPath: localPaths.mapPath,\n usedFallback: false,\n };\n \n // Save to local directory\n await saveToLocal(result, localPaths, mapText);\n \n return result;\n}\n\n/**\n * Save beautified code and source map to local directory\n * Handles errors gracefully by setting localSaveError instead of throwing\n */\nasync function saveToLocal(\n result: BeautifyResult,\n localPaths: LocalPaths,\n mapText: string\n): Promise<void> {\n try {\n await Promise.all([\n fs.writeFile(localPaths.beautifiedPath, result.code, 'utf-8'),\n fs.writeFile(localPaths.mapPath, mapText, 'utf-8')\n ]);\n result.localPath = localPaths.beautifiedPath;\n result.localMapPath = localPaths.mapPath;\n } catch (err) {\n // Handle specific error types\n const error = err as NodeJS.ErrnoException;\n if (error.code === 'EACCES' || error.code === 'EPERM') {\n result.localSaveError = `Permission denied: Cannot write to ${path.dirname(localPaths.beautifiedPath)}`;\n } else if (error.code === 'ENOSPC') {\n result.localSaveError = `Insufficient disk space: Cannot write to ${path.dirname(localPaths.beautifiedPath)}`;\n } else {\n result.localSaveError = `Failed to save locally: ${error.message || String(err)}`;\n }\n // Don't throw - the temp cache result is still valid\n }\n}\n", "import { parse } from 'meriyah';\nimport { walk } from 'estree-walker';\nimport MagicString from 'magic-string';\nimport type { Node } from 'estree';\nimport { detectLanguage, getLanguageInfo, type SupportedLanguage } from './languageDetector.js';\n\n/**\n * Count newlines in a string\n */\nfunction countNewlines(str: string): number {\n let count = 0;\n for (const char of str) {\n if (char === '\\n') count++;\n }\n return count;\n}\n\n/**\n * Create truncated string with preserved newlines\n * Format: \"start ...[TRUNCATED {length} CHARS]... \\n\\n\\nend\"\n */\nfunction createTruncatedString(original: string, previewLength: number): string {\n const newlineCount = countNewlines(original);\n const start = original.slice(0, previewLength);\n const end = original.slice(-previewLength);\n \n // Build the truncation marker with preserved newlines\n const marker = `...[TRUNCATED ${original.length} CHARS]...`;\n \n // Create newlines to preserve line count\n // We need to account for newlines already in start and end portions\n const startNewlines = countNewlines(start);\n const endNewlines = countNewlines(end);\n const preservedNewlines = Math.max(0, newlineCount - startNewlines - endNewlines);\n const newlineStr = '\\n'.repeat(preservedNewlines);\n \n return `${start}${marker}${newlineStr}${end}`;\n}\n\n/**\n * Options for truncation operations\n */\nexport interface TruncateOptions {\n /** Override auto-detected language */\n language?: SupportedLanguage;\n /** Character limit for string truncation (default: 200) */\n charLimit?: number;\n /** Maximum characters per line (default: 500) */\n maxLineChars?: number;\n /** Preview length for truncated content (default: 50) */\n previewLength?: number;\n}\n\n/**\n * Result of truncation operation\n */\nexport interface TruncateResult {\n /** Truncated code */\n code: string;\n /** Whether fallback mode was used */\n usedFallback: boolean;\n}\n\n/**\n * Result of AST-based truncation\n */\ninterface ASTTruncateResult {\n /** Truncated code */\n code: string;\n /** Whether parsing failed and fallback was used */\n parseFailed: boolean;\n}\n\n/**\n * Truncate long strings in JavaScript/TypeScript code using AST-based processing\n * This function uses meriyah to parse the AST and truncate string literals\n * \n * @param sourceCode - Source code to process\n * @param limit - Character limit for strings (default 200)\n * @param previewLength - Length of start/end preview portions (default 50)\n * @returns ASTTruncateResult with truncated code and parse failure indicator\n */\nfunction truncateCodeAST(sourceCode: string, limit: number = 200, previewLength: number = 50): ASTTruncateResult {\n // Try to parse the AST\n let ast: ReturnType<typeof parse>;\n try {\n ast = parse(sourceCode, {\n module: true,\n next: true,\n ranges: true,\n loc: true,\n raw: true,\n });\n } catch {\n // AST parsing failed - return original code unchanged (Requirement 8.4, 8.5)\n // Signal that fallback mode should be used\n return { code: sourceCode, parseFailed: true };\n }\n\n const magicString = new MagicString(sourceCode);\n \n // Walk the AST and find string literals to truncate\n walk(ast as unknown as Node, {\n enter(node: Node) {\n // Handle regular string literals\n if (node.type === 'Literal' && typeof (node as any).value === 'string') {\n const literal = node as any;\n const value = literal.value as string;\n \n if (value.length > limit && literal.start !== undefined && literal.end !== undefined) {\n const truncated = createTruncatedString(value, previewLength);\n // Wrap in quotes matching the original\n const originalText = sourceCode.slice(literal.start, literal.end);\n const quote = originalText[0]; // Get the quote character used\n magicString.overwrite(literal.start, literal.end, `${quote}${truncated}${quote}`);\n }\n }\n \n // Handle template literals\n if (node.type === 'TemplateLiteral') {\n const template = node as any;\n \n // Process each quasi (template element)\n for (const quasi of template.quasis) {\n const value = quasi.value.raw as string;\n \n if (value.length > limit && quasi.start !== undefined && quasi.end !== undefined) {\n const truncated = createTruncatedString(value, previewLength);\n // Template literal quasis don't have surrounding quotes\n magicString.overwrite(quasi.start, quasi.end, truncated);\n }\n }\n }\n }\n });\n\n return { code: magicString.toString(), parseFailed: false };\n}\n\n/**\n * Legacy function name for backward compatibility\n * @deprecated Use truncateCode instead\n */\nexport function truncateCodeHighPerf(sourceCode: string, limit: number = 200, previewLength: number = 50): string {\n return truncateCodeAST(sourceCode, limit, previewLength).code;\n}\n\n/**\n * Fallback truncation for unsupported languages\n * Only truncates lines exceeding the character limit, no AST parsing\n * Preserves the original line count (Requirement 3.3)\n * \n * @param code - Source code to process\n * @param maxLineChars - Maximum characters per line (default: 500)\n * @param previewLength - Length of start/end preview portions (default: 50)\n * @returns Truncated code with preserved line count\n */\nexport function truncateFallback(\n code: string,\n maxLineChars: number = 500,\n previewLength: number = 50\n): string {\n if (!code) {\n return code;\n }\n\n const lines = code.split('\\n');\n\n const processedLines = lines.map((line) => {\n if (line.length <= maxLineChars) {\n return line;\n }\n\n const start = line.slice(0, previewLength);\n const end = line.slice(-previewLength);\n const truncatedChars = line.length - previewLength * 2;\n const marker = `...[LINE TRUNCATED ${truncatedChars} CHARS]...`;\n\n return `${start}${marker}${end}`;\n });\n\n return processedLines.join('\\n');\n}\n\n/**\n * Truncate code based on language type\n * - For JS/TS: Use AST-based truncation for string literals + line truncation\n * - For other languages: Use line-based truncation only (fallback mode)\n * \n * @param code - Source code to process\n * @param options - Truncation options including language, limits, etc.\n * @returns TruncateResult with truncated code and fallback indicator\n */\nexport function truncateCode(\n code: string,\n options?: TruncateOptions\n): TruncateResult {\n const {\n language,\n charLimit = 200,\n maxLineChars = 500,\n previewLength = 50,\n } = options ?? {};\n\n // Determine language info\n const langInfo = language ? getLanguageInfo(language) : null;\n \n // Check if AST-based truncation is supported\n const supportsAST = langInfo?.supportsAST ?? false;\n \n if (supportsAST && (language === 'javascript' || language === 'typescript')) {\n // Use AST-based truncation for JS/TS\n const astResult = truncateCodeAST(code, charLimit, previewLength);\n \n // If AST parsing failed, fall back to line-based truncation (Requirement 8.4)\n if (astResult.parseFailed) {\n const truncatedCode = truncateFallback(code, maxLineChars, previewLength);\n return {\n code: truncatedCode,\n usedFallback: true,\n };\n }\n \n // Also apply line truncation to AST-processed code\n const truncatedCode = truncateLongLines(astResult.code, maxLineChars, previewLength / maxLineChars);\n return {\n code: truncatedCode,\n usedFallback: false,\n };\n }\n \n // Fallback mode: only line-based truncation (Requirement 3.2)\n const truncatedCode = truncateFallback(code, maxLineChars, previewLength);\n return {\n code: truncatedCode,\n usedFallback: true,\n };\n}\n\n/**\n * Truncate code from a file path, auto-detecting language\n * \n * @param filePath - Path to the file (used for language detection)\n * @param code - Source code to process\n * @param options - Truncation options (language override, limits, etc.)\n * @returns TruncateResult with truncated code and fallback indicator\n */\nexport function truncateCodeFromFile(\n filePath: string,\n code: string,\n options?: Omit<TruncateOptions, 'language'> & { language?: SupportedLanguage }\n): TruncateResult {\n // Detect language from file path if not specified\n const language = options?.language ?? detectLanguage(filePath).language;\n \n return truncateCode(code, {\n ...options,\n language,\n });\n}\n\n/**\n * Truncate lines that exceed the maximum character limit\n * @param code - Source code to process\n * @param maxLineChars - Maximum characters per line (default 500)\n * @param previewRatio - Ratio of line to show at start/end (default 0.2)\n * @returns Code with truncated long lines\n */\nexport function truncateLongLines(\n code: string,\n maxLineChars: number = 500,\n previewRatio: number = 0.2\n): string {\n if (!code) {\n return code;\n }\n\n const lines = code.split('\\n');\n const previewLength = Math.floor(maxLineChars * previewRatio);\n\n const processedLines = lines.map((line) => {\n if (line.length <= maxLineChars) {\n return line;\n }\n\n const start = line.slice(0, previewLength);\n const end = line.slice(-previewLength);\n const truncatedChars = line.length - previewLength * 2;\n const marker = `...[LINE TRUNCATED ${truncatedChars} CHARS]...`;\n\n return `${start}${marker}${end}`;\n });\n\n return processedLines.join('\\n');\n}\n", "import { SourceMapConsumer } from 'source-map-js';\nimport type { SourceMap } from './beautifier.js';\n\n/**\n * Original position from source map\n */\nexport interface OriginalPosition {\n line: number | null;\n column: number | null;\n}\n\n/**\n * Context line with position info\n */\nexport interface ContextLine {\n lineNumber: number;\n content: string;\n originalPosition: OriginalPosition;\n}\n\n/**\n * Search match result\n */\nexport interface SearchMatch {\n /** Match line number (1-based, in beautified code) */\n lineNumber: number;\n /** Match line content */\n lineContent: string;\n /** Original file coordinates */\n originalPosition: OriginalPosition;\n /** Context lines before match */\n contextBefore: ContextLine[];\n /** Context lines after match */\n contextAfter: ContextLine[];\n}\n\n/**\n * Search options\n */\nexport interface SearchOptions {\n /** Regex pattern or text to search */\n query: string;\n /** Number of context lines (default 2) */\n contextLines?: number;\n /** Case sensitive search (default false) */\n caseSensitive?: boolean;\n /** Maximum matches to return (default 50) */\n maxMatches?: number;\n /** Treat query as regex pattern (default false for literal text search) */\n isRegex?: boolean;\n /** Timeout in milliseconds for search operation (default 500) */\n timeoutMs?: number;\n}\n\n/**\n * Search result\n */\nexport interface SearchResult {\n /** Matched results */\n matches: SearchMatch[];\n /** Total matches found (before truncation) */\n totalMatches: number;\n /** Whether results were truncated */\n truncated: boolean;\n}\n\n\n/**\n * Convert double-escaped backslashes to single backslashes.\n * Fixes MCP JSON transmission double-escaping issue.\n * \n * @param str - String with potentially double-escaped backslashes\n * @returns String with `\\\\` converted to `\\`\n * \n * @example\n * unescapeBackslashes(\"for\\\\s*\\\\(\") // returns \"for\\s*\\(\"\n * unescapeBackslashes(\"\\\\\\\\n\") // returns \"\\\\n\" (literal backslash + n)\n * unescapeBackslashes(\"hello\") // returns \"hello\" (unchanged)\n */\nexport function unescapeBackslashes(str: string): string {\n return str.replace(/\\\\\\\\/g, '\\\\');\n}\n\n/**\n * Escape all regex special characters in a string for literal matching\n * @param str - String to escape\n * @returns Escaped string safe for use in RegExp\n */\nexport function escapeRegex(str: string): string {\n return str.replace(/[()[\\]{}.*+?^$|\\\\]/g, '\\\\$&');\n}\n\n/**\n * Create regex from query string with error handling\n * @param query - Regex pattern or text\n * @param caseSensitive - Whether to be case sensitive\n * @param isRegex - Whether to treat query as regex (default false)\n * @returns Created RegExp\n * @throws Error if regex is invalid\n */\nexport function createRegex(query: string, caseSensitive: boolean = false, isRegex: boolean = false): RegExp {\n try {\n const flags = caseSensitive ? 'g' : 'gi';\n const pattern = isRegex ? query : escapeRegex(query);\n return new RegExp(pattern, flags);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid regex: ${message}`);\n }\n}\n\n/**\n * Get original position for a line using source map consumer\n */\nfunction getOriginalPosition(\n consumer: SourceMapConsumer,\n lineNumber: number\n): OriginalPosition {\n const pos = consumer.originalPositionFor({\n line: lineNumber,\n column: 0,\n });\n return {\n line: pos.line,\n column: pos.column,\n };\n}\n\n/**\n * Build line offset index using Int32Array for memory efficiency.\n * Returns the offset array and total line count.\n */\nfunction buildLineOffsets(code: string): { offsets: Int32Array; totalLines: number } {\n // Pre-allocate with estimated average line length of 40 chars\n let capacity = Math.max(16, Math.ceil(code.length / 40));\n let offsets = new Int32Array(capacity);\n let lineCount = 0;\n\n offsets[0] = 0; // First line starts at index 0\n\n for (let i = 0; i < code.length; i++) {\n if (code[i] === '\\n') {\n lineCount++;\n // Dynamic resize if needed\n if (lineCount >= capacity) {\n capacity *= 2;\n const newArr = new Int32Array(capacity);\n newArr.set(offsets);\n offsets = newArr;\n }\n offsets[lineCount] = i + 1; // Next line starts after \\n\n }\n }\n\n return {\n offsets: offsets.subarray(0, lineCount + 1),\n totalLines: lineCount + 1,\n };\n}\n\n/**\n * Binary search to find line number (1-based) from character index.\n */\nfunction getLineNumberFromIndex(offsets: Int32Array, totalLines: number, index: number): number {\n let low = 0;\n let high = totalLines - 1;\n\n while (low <= high) {\n const mid = (low + high) >>> 1;\n if (offsets[mid] <= index) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n return low; // 1-based line number\n}\n\n/**\n * Get line content by line number (1-based) without splitting entire string.\n */\nfunction getLineContent(\n code: string,\n offsets: Int32Array,\n totalLines: number,\n lineNo: number\n): string {\n if (lineNo < 1 || lineNo > totalLines) return '';\n\n const start = offsets[lineNo - 1];\n let end: number;\n\n if (lineNo < totalLines) {\n // End is one before the next line's start (exclude \\n)\n end = offsets[lineNo] - 1;\n } else {\n // Last line: go to end of string\n end = code.length;\n }\n\n // Handle \\r\\n line endings\n if (end > start && code[end - 1] === '\\r') {\n end--;\n }\n\n return code.slice(start, end);\n}\n\n/**\n * Search for pattern in code and return matches with context.\n * Optimized version: avoids split() for large files, uses index-based iteration.\n *\n * @param code - Beautified code to search in\n * @param rawMap - Source map for coordinate mapping\n * @param options - Search options\n * @returns Search result with matches\n */\nexport function searchInCode(\n code: string,\n rawMap: SourceMap,\n options: SearchOptions\n): SearchResult {\n const {\n query,\n contextLines = 2,\n caseSensitive = false,\n maxMatches = 10,\n isRegex = false,\n timeoutMs = 500,\n } = options;\n\n // Build line offset index (memory efficient)\n const { offsets, totalLines } = buildLineOffsets(code);\n\n // Create regex with global + multiline flags\n const flags = (caseSensitive ? 'g' : 'gi') + 'm';\n const patternStr = isRegex ? unescapeBackslashes(query) : escapeRegex(query);\n\n let regex: RegExp;\n try {\n regex = new RegExp(patternStr, flags);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid regex: ${message}`);\n }\n\n // Create source map consumer\n const consumer = new SourceMapConsumer({\n ...rawMap,\n version: String(rawMap.version),\n });\n\n const matches: SearchMatch[] = [];\n let lastMatchedLine = -1;\n let totalMatchesFound = 0;\n let match: RegExpExecArray | null;\n\n // Performance protection\n const startTime = Date.now();\n\n // Iterate matches using exec() - no string splitting\n while ((match = regex.exec(code)) !== null) {\n // Prevent infinite loop on zero-width matches\n if (match.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n\n const lineNumber = getLineNumberFromIndex(offsets, totalLines, match.index);\n\n // Dedupe: skip if same line already matched\n if (lineNumber === lastMatchedLine) {\n continue;\n }\n lastMatchedLine = lineNumber;\n totalMatchesFound++;\n\n // Only build match details if we haven't hit the limit yet\n if (matches.length < maxMatches) {\n // Build context (lazy: only fetch line content when needed)\n const contextBefore: ContextLine[] = [];\n for (let i = Math.max(1, lineNumber - contextLines); i < lineNumber; i++) {\n contextBefore.push({\n lineNumber: i,\n content: getLineContent(code, offsets, totalLines, i),\n originalPosition: getOriginalPosition(consumer, i),\n });\n }\n\n const contextAfter: ContextLine[] = [];\n for (let i = lineNumber + 1; i <= Math.min(totalLines, lineNumber + contextLines); i++) {\n contextAfter.push({\n lineNumber: i,\n content: getLineContent(code, offsets, totalLines, i),\n originalPosition: getOriginalPosition(consumer, i),\n });\n }\n\n matches.push({\n lineNumber,\n lineContent: getLineContent(code, offsets, totalLines, lineNumber),\n originalPosition: getOriginalPosition(consumer, lineNumber),\n contextBefore,\n contextAfter,\n });\n }\n\n // Timeout protection (still count but stop searching)\n if (Date.now() - startTime > timeoutMs) {\n break;\n }\n }\n\n return {\n matches,\n totalMatches: totalMatchesFound,\n truncated: totalMatchesFound > maxMatches,\n };\n}\n\n/**\n * Format source position as \"L{line}:{column}\" or placeholder\n */\nexport function formatSourcePosition(line: number | null, column: number | null): string {\n if (line !== null && column !== null) {\n return `L${line}:${column}`;\n }\n return '';\n}\n\n/**\n * Format a single code line with line number, source coordinates, and content\n * Matches the format used in read_code_smart\n */\nfunction formatCodeLine(lineNumber: number, sourcePos: string, code: string, maxLineNumWidth: number, prefix: string = ' '): string {\n const lineNumStr = String(lineNumber).padStart(maxLineNumWidth, ' ');\n const srcPosPadded = sourcePos ? sourcePos.padEnd(10, ' ') : ' ';\n return `${prefix}${lineNumStr} ${srcPosPadded} ${code}`;\n}\n\n/**\n * Format search result for output\n * @param filePath - Path to the file\n * @param query - Search query\n * @param caseSensitive - Whether search was case sensitive\n * @param result - Search result\n * @param maxMatches - Maximum matches limit\n * @param isRegex - Whether query was treated as regex pattern\n * @returns Formatted output string\n */\nexport function formatSearchResult(\n filePath: string,\n query: string,\n caseSensitive: boolean,\n result: SearchResult,\n maxMatches: number = 50,\n isRegex: boolean = false\n): string {\n const { matches, totalMatches, truncated } = result;\n\n const outputParts: string[] = [];\n\n // Header - matches read_code_smart format\n const caseInfo = caseSensitive ? 'case-sensitive' : 'case-insensitive';\n const modeInfo = isRegex ? 'regex' : 'literal';\n outputParts.push(`${filePath}`);\n outputParts.push(`Query=\"${query}\" (${modeInfo}, ${caseInfo})`);\n outputParts.push(`Src=original position for breakpoints`);\n\n if (totalMatches === 0) {\n outputParts.push('Matches: None');\n return outputParts.join('\\n');\n }\n\n const matchInfo = truncated\n ? `Matches: ${totalMatches} (showing first ${maxMatches})`\n : `Matches: ${totalMatches}`;\n outputParts.push(matchInfo);\n\n // Format each match\n for (const match of matches) {\n outputParts.push(`--- Line ${match.lineNumber} ---`);\n\n // Calculate max line number width for alignment\n const allLineNumbers = [\n ...match.contextBefore.map((c) => c.lineNumber),\n match.lineNumber,\n ...match.contextAfter.map((c) => c.lineNumber),\n ];\n const maxLineNumWidth = Math.max(...allLineNumbers.map((n) => String(n).length));\n\n // Format context before\n for (const ctx of match.contextBefore) {\n const srcPos = formatSourcePosition(ctx.originalPosition.line, ctx.originalPosition.column);\n outputParts.push(formatCodeLine(ctx.lineNumber, srcPos, ctx.content, maxLineNumWidth, ' '));\n }\n\n // Format match line with >> prefix\n const matchSrcPos = formatSourcePosition(match.originalPosition.line, match.originalPosition.column);\n outputParts.push(formatCodeLine(match.lineNumber, matchSrcPos, match.lineContent, maxLineNumWidth, '>>'));\n\n // Format context after\n for (const ctx of match.contextAfter) {\n const srcPos = formatSourcePosition(ctx.originalPosition.line, ctx.originalPosition.column);\n outputParts.push(formatCodeLine(ctx.lineNumber, srcPos, ctx.content, maxLineNumWidth, ' '));\n }\n }\n\n // Add truncation message if needed\n if (truncated) {\n outputParts.push(`\\n... (${totalMatches - maxMatches} more matches not shown)`);\n }\n\n return outputParts.join('\\n');\n}\n", "import { SourceMapConsumer } from 'source-map-js';\nimport { parse, ParserOptions } from '@babel/parser';\nimport type { NodePath } from '@babel/traverse';\nimport type { Identifier } from '@babel/types';\nimport type { SourceMap } from './beautifier.js';\n\n// Dynamic import for babel traverse to handle ESM/CJS interop\ntype TraverseFn = (\n parent: Parameters<typeof import('@babel/traverse').default>[0],\n opts?: Parameters<typeof import('@babel/traverse').default>[1],\n scope?: Parameters<typeof import('@babel/traverse').default>[2],\n state?: Parameters<typeof import('@babel/traverse').default>[3],\n parentPath?: Parameters<typeof import('@babel/traverse').default>[4]\n) => void;\n\nlet traverse: TraverseFn | null = null;\n\nasync function getTraverse(): Promise<TraverseFn> {\n if (!traverse) {\n const mod = await import('@babel/traverse');\n // Handle both ESM default export and CJS module.exports\n traverse = (mod.default?.default ?? mod.default) as TraverseFn;\n }\n return traverse;\n}\n\n/**\n * Original position from source map\n */\nexport interface OriginalPosition {\n line: number | null;\n column: number | null;\n}\n\n/**\n * Location information for a definition or reference\n */\nexport interface LocationInfo {\n /** Line number in beautified code (1-based) */\n line: number;\n /** Column number in beautified code (0-based) */\n column: number;\n /** Original file coordinates from source map */\n originalPosition: OriginalPosition;\n /** Content of the line containing this location */\n lineContent: string;\n}\n\n/**\n * Binding information for a variable/function\n */\nexport interface BindingInfo {\n /** Unique scope identifier */\n scopeUid: number;\n /** Binding kind (var, let, const, param, etc.) */\n kind: string;\n /** Definition location */\n definition: LocationInfo;\n /** All reference locations */\n references: LocationInfo[];\n /** Total reference count (before limiting) */\n totalReferences: number;\n /** The location that matched the target line (if targeted search) */\n hitLocation?: LocationInfo;\n}\n\n/**\n * Analysis result containing all bindings for an identifier\n */\nexport interface AnalysisResult {\n /** All bindings found for the identifier */\n bindings: BindingInfo[];\n /** The identifier that was searched */\n identifier: string;\n /** Whether this was a targeted (line-specific) search */\n isTargeted: boolean;\n /** The target line if specified */\n targetLine?: number;\n}\n\n\n/**\n * Default parser options for Babel\n */\nconst DEFAULT_PARSER_OPTIONS: ParserOptions = {\n sourceType: 'unambiguous',\n plugins: [\n 'jsx',\n 'typescript',\n 'classProperties',\n 'classPrivateProperties',\n 'classPrivateMethods',\n 'dynamicImport',\n 'optionalChaining',\n 'nullishCoalescingOperator',\n 'objectRestSpread',\n ],\n errorRecovery: true,\n};\n\n/**\n * Parse JavaScript/TypeScript code into an AST\n * @param code - Source code to parse\n * @returns Parsed AST\n * @throws Error if parsing fails\n */\nexport function parseCode(code: string) {\n try {\n return parse(code, DEFAULT_PARSER_OPTIONS);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Parse error: ${message}`);\n }\n}\n\n\n/**\n * Get original position for a location using source map consumer\n */\nfunction getOriginalPosition(\n consumer: SourceMapConsumer,\n line: number,\n column: number\n): OriginalPosition {\n const pos = consumer.originalPositionFor({ line, column });\n return {\n line: pos.line,\n column: pos.column,\n };\n}\n\n/**\n * Get line content from code by line number (1-based)\n */\nfunction getLineContent(lines: string[], lineNumber: number): string {\n if (lineNumber < 1 || lineNumber > lines.length) {\n return '';\n }\n return lines[lineNumber - 1];\n}\n\n/**\n * Create a LocationInfo object\n */\nfunction createLocationInfo(\n line: number,\n column: number,\n lines: string[],\n consumer: SourceMapConsumer\n): LocationInfo {\n return {\n line,\n column,\n originalPosition: getOriginalPosition(consumer, line, column),\n lineContent: getLineContent(lines, line),\n };\n}\n\n/**\n * Options for binding analysis\n */\nexport interface AnalyzeOptions {\n /** Maximum references to return per binding (default 10) */\n maxReferences?: number;\n /** Target line number for precise binding identification (1-based) */\n targetLine?: number;\n}\n\n/**\n * Analyze bindings for a specific identifier in the code\n * Uses Babel traverse to find all bindings and their references\n * \n * @param code - Beautified code to analyze\n * @param rawMap - Source map for coordinate mapping\n * @param identifier - Variable/function name to find\n * @param options - Analysis options\n * @returns Analysis result with all bindings\n */\nexport async function analyzeBindings(\n code: string,\n rawMap: SourceMap,\n identifier: string,\n options?: AnalyzeOptions\n): Promise<AnalysisResult> {\n const targetLine = options?.targetLine;\n const isTargeted = targetLine !== undefined;\n // Use 15 max references for targeted searches, 10 for regular searches\n const maxReferences = options?.maxReferences ?? (isTargeted ? 15 : 10);\n \n // Parse the code\n const ast = parseCode(code);\n \n // Split code into lines for content extraction\n const lines = code.split('\\n');\n \n // Create source map consumer\n const consumer = new SourceMapConsumer({\n ...rawMap,\n version: String(rawMap.version),\n });\n \n // Collect all bindings for the identifier\n const bindings: BindingInfo[] = [];\n const processedScopes = new Set<number>();\n \n // Get traverse function\n const traverse = await getTraverse();\n \n try {\n traverse(ast, {\n Identifier(path: NodePath<Identifier>) {\n // Only process if this is the identifier we're looking for\n if (path.node.name !== identifier) {\n return;\n }\n \n // For targeted search, check if this identifier is at the target line\n if (isTargeted) {\n const nodeLoc = path.node.loc;\n if (!nodeLoc || nodeLoc.start.line !== targetLine) {\n return;\n }\n }\n \n // Get the binding for this identifier\n const binding = path.scope.getBinding(identifier);\n if (!binding) {\n return;\n }\n \n // Get scope UID to avoid processing same binding multiple times\n const scopeUid = binding.scope.uid;\n if (processedScopes.has(scopeUid)) {\n return;\n }\n processedScopes.add(scopeUid);\n \n // Get definition location\n const defNode = binding.identifier;\n const defLoc = defNode.loc;\n if (!defLoc) {\n return;\n }\n \n const definition = createLocationInfo(\n defLoc.start.line,\n defLoc.start.column,\n lines,\n consumer\n );\n \n // Get all reference locations\n const allReferences: LocationInfo[] = [];\n for (const refPath of binding.referencePaths) {\n const refLoc = refPath.node.loc;\n if (!refLoc) {\n continue;\n }\n \n allReferences.push(\n createLocationInfo(\n refLoc.start.line,\n refLoc.start.column,\n lines,\n consumer\n )\n );\n }\n \n // Store total count before limiting\n const totalReferences = allReferences.length;\n \n // Limit references\n const limitedReferences = allReferences.slice(0, maxReferences);\n \n // Create hit location for targeted search\n let hitLocation: LocationInfo | undefined;\n if (isTargeted) {\n const nodeLoc = path.node.loc!;\n hitLocation = createLocationInfo(\n nodeLoc.start.line,\n nodeLoc.start.column,\n lines,\n consumer\n );\n }\n \n bindings.push({\n scopeUid,\n kind: binding.kind,\n definition,\n references: limitedReferences,\n totalReferences,\n hitLocation,\n });\n \n // For targeted search, stop after finding the first matching binding\n if (isTargeted) {\n path.stop();\n }\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Analysis error: ${message}`);\n }\n \n return {\n bindings,\n identifier,\n isTargeted,\n targetLine,\n };\n}\n\n\n/**\n * Format source position as \"L{line}:{column}\" or placeholder\n */\nexport function formatSourcePosition(line: number | null, column: number | null): string {\n if (line !== null && column !== null) {\n return `L${line}:${column}`;\n }\n return '';\n}\n\n/**\n * Format a single code line with line number, source coordinates, and content\n * Matches the format used in read_code_smart\n */\nfunction formatCodeLine(lineNumber: number, sourcePos: string, code: string, prefix: string = ' '): string {\n const lineNumStr = String(lineNumber).padStart(5, ' ');\n const srcPosPadded = sourcePos ? sourcePos.padEnd(10, ' ') : ' ';\n return `${prefix}${lineNumStr} ${srcPosPadded} ${code}`;\n}\n\n/**\n * Check if two locations match (same line and column)\n */\nfunction locationsMatch(loc1: LocationInfo, loc2: LocationInfo): boolean {\n return loc1.line === loc2.line && loc1.column === loc2.column;\n}\n\n/**\n * Format analysis result for output\n * @param filePath - Path to the file\n * @param result - Analysis result\n * @param maxReferences - Maximum references shown per binding\n * @returns Formatted output string\n */\nexport function formatAnalysisResult(\n filePath: string,\n result: AnalysisResult,\n maxReferences: number = 10\n): string {\n const { bindings, identifier, isTargeted, targetLine } = result;\n \n const outputParts: string[] = [];\n \n // Header - matches read_code_smart format\n outputParts.push(`${filePath}`);\n outputParts.push(`Identifier=\"${identifier}\"`);\n outputParts.push(`Src=original position for breakpoints`);\n \n // Handle no bindings found\n if (bindings.length === 0) {\n if (isTargeted && targetLine !== undefined) {\n outputParts.push(`Bindings: None at line ${targetLine}`);\n outputParts.push(`The variable may be global, externally defined, or not present at this line.`);\n } else {\n outputParts.push('Bindings: None');\n }\n return outputParts.join('\\n');\n }\n \n // Display \"Targeted Scope\" header when isTargeted is true\n if (isTargeted) {\n outputParts.push(`Bindings: 1 (Targeted at line ${targetLine})`);\n } else {\n const scopeInfo = bindings.length > 1 ? ' (different scopes)' : '';\n outputParts.push(`Bindings: ${bindings.length}${scopeInfo}`);\n }\n \n // Format each binding\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n \n // Use \"Targeted Scope\" label for targeted searches\n if (isTargeted) {\n outputParts.push(`--- Targeted Scope (${binding.kind}) ---`);\n } else {\n outputParts.push(`--- Scope #${i + 1} (${binding.kind}) ---`);\n }\n \n // Format definition - check if definition is the hit location\n const defIsHit = isTargeted && binding.hitLocation && \n locationsMatch(binding.definition, binding.hitLocation);\n const defPrefix = defIsHit ? '\uD83D\uDCCD Definition (hit):' : '\uD83D\uDCCD Definition:';\n outputParts.push(defPrefix);\n \n const defSrcPos = formatSourcePosition(\n binding.definition.originalPosition.line,\n binding.definition.originalPosition.column\n );\n const defMarker = defIsHit ? ' \u25C0\u2500\u2500 hit' : '';\n outputParts.push(formatCodeLine(binding.definition.line, defSrcPos, binding.definition.lineContent + defMarker, ' '));\n \n // Format references\n const totalRefs = binding.totalReferences;\n \n if (totalRefs === 0) {\n outputParts.push('\uD83D\uDD0E References: None');\n } else {\n outputParts.push(`\uD83D\uDD0E References (${totalRefs}):`);\n \n for (const ref of binding.references) {\n // Check if this reference is the hit location\n const refIsHit = isTargeted && binding.hitLocation && \n locationsMatch(ref, binding.hitLocation);\n \n const refSrcPos = formatSourcePosition(\n ref.originalPosition.line,\n ref.originalPosition.column\n );\n const refMarker = refIsHit ? ' \u25C0\u2500\u2500 hit' : '';\n outputParts.push(formatCodeLine(ref.line, refSrcPos, ref.lineContent + refMarker, ' '));\n }\n \n // Add truncation message if references were limited\n if (totalRefs > maxReferences) {\n const remaining = totalRefs - maxReferences;\n outputParts.push(` ... (${remaining} more references not shown)`);\n }\n }\n }\n \n return outputParts.join('\\n');\n}\n", "import * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { transformSync, type BabelFileResult, type PluginItem } from '@babel/core';\nimport { ensureBeautified, type SourceMap } from './beautifier.js';\n\n/**\n * Transform options interface\n */\nexport interface TransformOptions {\n /** Path to the user's Babel plugin script */\n scriptPath: string;\n /** Output file suffix (default \"_deob\") */\n outputSuffix?: string;\n}\n\n/**\n * Transform result interface\n */\nexport interface TransformResult {\n /** Transformed code */\n code: string;\n /** Cascaded Source Map */\n map: SourceMap;\n /** Output file path */\n outputPath: string;\n /** Source Map file path */\n mapPath: string;\n}\n\n/**\n * Output paths interface\n */\nexport interface OutputPaths {\n /** Output JS file path */\n outputPath: string;\n /** Source Map file path */\n mapPath: string;\n}\n\n/**\n * Clean basename by removing .beautified and _deob* suffixes\n * \n * Examples:\n * - main.js -> main\n * - main.beautified.js -> main\n * - main_deob.js -> main\n * - main.beautified_deob.js -> main\n * - main_deob_v2.js -> main\n * \n * @param filename - Original filename (with or without path)\n * @returns Cleaned basename without extension\n */\nexport function cleanBasename(filename: string): string {\n // Get just the filename without directory\n const base = path.basename(filename);\n \n // Remove .js extension\n let name = base.endsWith('.js') ? base.slice(0, -3) : base;\n \n // Remove _deob* suffix first (e.g., _deob, _deob_v2, _deob123)\n // This handles cases like main.beautified_deob.js\n name = name.replace(/_deob[^/]*$/, '');\n \n // Remove .beautified suffix if present\n if (name.endsWith('.beautified')) {\n name = name.slice(0, -'.beautified'.length);\n }\n \n return name;\n}\n\n/**\n * Calculate output paths for transformed file\n * \n * @param targetFile - Path to the target file\n * @param outputSuffix - Suffix for output file (default \"_deob\")\n * @returns Output paths for JS and map files\n */\nexport function getOutputPaths(targetFile: string, outputSuffix: string = '_deob'): OutputPaths {\n const absolutePath = path.resolve(targetFile);\n const dir = path.dirname(absolutePath);\n const basename = cleanBasename(absolutePath);\n \n const outputPath = path.join(dir, `${basename}${outputSuffix}.js`);\n const mapPath = `${outputPath}.map`;\n \n return { outputPath, mapPath };\n}\n\n/**\n * Babel plugin function type\n * A Babel plugin is a function that receives babel API and returns a visitor object\n */\nexport type BabelPluginFunction = (babel: { types: typeof import('@babel/types') }) => {\n visitor: Record<string, unknown>;\n};\n\n/**\n * Load a Babel plugin script from the given path\n * \n * Features:\n * - Resolves to absolute path\n * - Clears require cache for hot-reloading\n * - Validates plugin format\n * \n * @param scriptPath - Path to the Babel plugin script\n * @returns The loaded Babel plugin function\n * @throws Error if script not found or invalid format\n */\nexport async function loadBabelPlugin(scriptPath: string): Promise<BabelPluginFunction> {\n // Resolve to absolute path\n const absolutePath = path.resolve(scriptPath);\n \n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`Script not found: ${absolutePath}`);\n }\n \n // Convert to file URL for ESM import\n const fileUrl = `file://${absolutePath}?t=${Date.now()}`;\n \n // Dynamic import with cache busting for hot-reload\n let module: unknown;\n try {\n module = await import(fileUrl);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to load script: ${message}`);\n }\n \n // Extract the plugin function\n const plugin = (module as { default?: unknown }).default ?? module;\n \n // Validate plugin format - must be a function\n if (typeof plugin !== 'function') {\n throw new Error(\n `Invalid Babel plugin: Script must export a function that returns a visitor object. ` +\n `Got ${typeof plugin} instead.`\n );\n }\n \n return plugin as BabelPluginFunction;\n}\n\n\n/**\n * Babel transform result interface\n */\ninterface BabelTransformResult {\n /** Transformed code */\n code: string;\n /** Generated source map (cascaded) */\n map: SourceMap;\n}\n\n/**\n * Run Babel transform with source map cascade\n * \n * Configuration:\n * - inputSourceMap: Enables cascade from beautified -> original\n * - sourceMaps: true to generate output source map\n * - retainLines: false for best readability\n * - compact: false for readable output\n * - minified: false for readable output\n * \n * @param code - Input code (beautified)\n * @param inputSourceMap - Source map from beautifier (beautified -> original)\n * @param plugin - Babel plugin function\n * @param filename - Original filename for source map\n * @returns Transformed code and cascaded source map\n */\nexport function runBabelTransform(\n code: string,\n inputSourceMap: SourceMap,\n plugin: BabelPluginFunction,\n filename: string\n): BabelTransformResult {\n let result: BabelFileResult | null;\n \n try {\n result = transformSync(code, {\n filename,\n plugins: [plugin as PluginItem],\n // Source map configuration for cascade\n // @ts-expect-error - SourceMap is compatible with InputSourceMap at runtime\n inputSourceMap: inputSourceMap,\n sourceMaps: true,\n // Readability settings\n retainLines: false,\n compact: false,\n minified: false,\n // Preserve code structure\n parserOpts: {\n sourceType: 'unambiguous',\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`Babel Error: ${message}`);\n }\n \n if (!result || !result.code) {\n throw new Error('Babel Error: Transform produced no output');\n }\n \n if (!result.map) {\n throw new Error('Babel Error: Transform produced no source map');\n }\n \n return {\n code: result.code,\n map: result.map as unknown as SourceMap,\n };\n}\n\n\n/**\n * Apply custom Babel transform to a JavaScript file\n * \n * Process:\n * 1. Load and validate the Babel plugin script\n * 2. Get beautified code and source map from target file\n * 3. Run Babel transform with source map cascade\n * 4. Write output file and source map\n * 5. Append sourceMappingURL comment\n * \n * @param targetFile - Path to the JavaScript file to transform\n * @param options - Transform options (scriptPath, outputSuffix)\n * @returns Transform result with output paths\n */\nexport async function applyCustomTransform(\n targetFile: string,\n options: TransformOptions\n): Promise<TransformResult> {\n const { scriptPath, outputSuffix = '_deob' } = options;\n \n // Resolve target file path\n const absoluteTargetPath = path.resolve(targetFile);\n \n // Check if target file exists\n try {\n await fs.access(absoluteTargetPath);\n } catch {\n throw new Error(`File not found: ${targetFile}`);\n }\n \n // Load the Babel plugin script\n const plugin = await loadBabelPlugin(scriptPath);\n \n // Get beautified code and source map\n const beautifyResult = await ensureBeautified(absoluteTargetPath);\n const { code: beautifiedCode, rawMap: inputSourceMap } = beautifyResult;\n \n // Run Babel transform with source map cascade\n const transformResult = runBabelTransform(\n beautifiedCode,\n inputSourceMap,\n plugin,\n absoluteTargetPath\n );\n \n // Calculate output paths\n const { outputPath, mapPath } = getOutputPaths(absoluteTargetPath, outputSuffix);\n \n // Prepare output code with sourceMappingURL comment\n const mapFileName = path.basename(mapPath);\n const outputCode = `${transformResult.code}\\n//# sourceMappingURL=${mapFileName}`;\n \n // Prepare source map with correct file reference\n const outputMap: SourceMap = {\n ...transformResult.map,\n file: path.basename(outputPath),\n };\n \n // Write output files\n try {\n await Promise.all([\n fs.writeFile(outputPath, outputCode, 'utf-8'),\n fs.writeFile(mapPath, JSON.stringify(outputMap, null, 2), 'utf-8'),\n ]);\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code === 'EACCES' || error.code === 'EPERM') {\n throw new Error(`Permission denied: Cannot write to ${path.dirname(outputPath)}`);\n }\n throw new Error(`Failed to write output files: ${error.message || String(err)}`);\n }\n \n return {\n code: outputCode,\n map: outputMap,\n outputPath,\n mapPath,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["fs", "path", "path", "code", "result", "truncatedCode", "SourceMapConsumer", "parse", "getOriginalPosition", "getLineContent", "traverse", "path", "formatSourcePosition", "formatCodeLine", "path", "fs", "basename"]
7
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Supported language types for smart-fs processing
3
+ */
4
+ export type SupportedLanguage = 'javascript' | 'typescript' | 'json' | 'html' | 'xml' | 'css' | 'unknown';
5
+ /**
6
+ * Information about a language's processing capabilities
7
+ */
8
+ export interface LanguageInfo {
9
+ /** The language identifier */
10
+ language: SupportedLanguage;
11
+ /** Whether AST-based processing is supported */
12
+ supportsAST: boolean;
13
+ /** Whether beautification is supported */
14
+ supportsBeautify: boolean;
15
+ /** Whether source map generation is supported */
16
+ supportsSourceMap: boolean;
17
+ }
18
+ /**
19
+ * Detect language from file path based on extension
20
+ *
21
+ * @param filePath - Path to the file (can be relative or absolute)
22
+ * @returns LanguageInfo object with detected language and capabilities
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const info = detectLanguage('./src/app.ts');
27
+ * // { language: 'typescript', supportsAST: true, supportsBeautify: true, supportsSourceMap: true }
28
+ *
29
+ * const unknown = detectLanguage('./readme.md');
30
+ * // { language: 'unknown', supportsAST: false, supportsBeautify: false, supportsSourceMap: false }
31
+ * ```
32
+ */
33
+ export declare function detectLanguage(filePath: string): LanguageInfo;
34
+ /**
35
+ * Get language info by explicit language name
36
+ *
37
+ * @param language - The language identifier
38
+ * @returns LanguageInfo object with language capabilities
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const info = getLanguageInfo('typescript');
43
+ * // { language: 'typescript', supportsAST: true, supportsBeautify: true, supportsSourceMap: true }
44
+ * ```
45
+ */
46
+ export declare function getLanguageInfo(language: SupportedLanguage): LanguageInfo;
47
+ /**
48
+ * Check if a language supports full processing (AST + beautify + source map)
49
+ *
50
+ * @param language - The language identifier
51
+ * @returns true if the language supports all processing features
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * isFullySupportedLanguage('javascript'); // true
56
+ * isFullySupportedLanguage('json'); // false (no AST or source map)
57
+ * isFullySupportedLanguage('unknown'); // false
58
+ * ```
59
+ */
60
+ export declare function isFullySupportedLanguage(language: SupportedLanguage): boolean;
61
+ /**
62
+ * Get all supported file extensions
63
+ *
64
+ * @returns Array of supported file extensions (including the dot)
65
+ */
66
+ export declare function getSupportedExtensions(): string[];
67
+ /**
68
+ * Check if a file extension is supported (not unknown)
69
+ *
70
+ * @param ext - File extension (with or without leading dot)
71
+ * @returns true if the extension maps to a known language
72
+ */
73
+ export declare function isExtensionSupported(ext: string): boolean;
74
+ //# sourceMappingURL=languageDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languageDetector.d.ts","sourceRoot":"","sources":["../src/languageDetector.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,YAAY,GACZ,MAAM,GACN,MAAM,GACN,KAAK,GACL,KAAK,GACL,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,gDAAgD;IAChD,WAAW,EAAE,OAAO,CAAC;IACrB,0CAA0C;IAC1C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iDAAiD;IACjD,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAsED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAI7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,YAAY,CAEzE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAG7E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGzD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * LLM Configuration Module
3
+ * Handles reading and validating LLM configuration from environment variables
4
+ */
5
+ export interface LLMConfig {
6
+ apiKey: string;
7
+ baseUrl: string;
8
+ model: string;
9
+ }
10
+ /**
11
+ * 从环境变量读取 LLM 配置
12
+ * @returns LLMConfig | null (null 表示未配置)
13
+ */
14
+ export declare function getLLMConfig(): LLMConfig | null;
15
+ /**
16
+ * 检查 LLM 是否已配置
17
+ */
18
+ export declare function isLLMConfigured(): boolean;
19
+ /**
20
+ * LLM Client Interface
21
+ */
22
+ export interface LLMClient {
23
+ /**
24
+ * 发送 JSVMP 检测请求到 LLM
25
+ * @param formattedCode 格式化后的代码
26
+ * @returns LLM 返回的原始 JSON 字符串
27
+ */
28
+ analyzeJSVMP(formattedCode: string): Promise<string>;
29
+ }
30
+ /**
31
+ * 创建 LLM 客户端实例
32
+ */
33
+ export declare function createLLMClient(config: LLMConfig): LLMClient;
34
+ //# sourceMappingURL=llmConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmConfig.d.ts","sourceRoot":"","sources":["../src/llmConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,SAAS,GAAG,IAAI,CAiB/C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAoDD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAyD5D"}
@@ -0,0 +1,113 @@
1
+ import type { SourceMap } from './beautifier.js';
2
+ /**
3
+ * Original position from source map
4
+ */
5
+ export interface OriginalPosition {
6
+ line: number | null;
7
+ column: number | null;
8
+ }
9
+ /**
10
+ * Context line with position info
11
+ */
12
+ export interface ContextLine {
13
+ lineNumber: number;
14
+ content: string;
15
+ originalPosition: OriginalPosition;
16
+ }
17
+ /**
18
+ * Search match result
19
+ */
20
+ export interface SearchMatch {
21
+ /** Match line number (1-based, in beautified code) */
22
+ lineNumber: number;
23
+ /** Match line content */
24
+ lineContent: string;
25
+ /** Original file coordinates */
26
+ originalPosition: OriginalPosition;
27
+ /** Context lines before match */
28
+ contextBefore: ContextLine[];
29
+ /** Context lines after match */
30
+ contextAfter: ContextLine[];
31
+ }
32
+ /**
33
+ * Search options
34
+ */
35
+ export interface SearchOptions {
36
+ /** Regex pattern or text to search */
37
+ query: string;
38
+ /** Number of context lines (default 2) */
39
+ contextLines?: number;
40
+ /** Case sensitive search (default false) */
41
+ caseSensitive?: boolean;
42
+ /** Maximum matches to return (default 50) */
43
+ maxMatches?: number;
44
+ /** Treat query as regex pattern (default false for literal text search) */
45
+ isRegex?: boolean;
46
+ /** Timeout in milliseconds for search operation (default 500) */
47
+ timeoutMs?: number;
48
+ }
49
+ /**
50
+ * Search result
51
+ */
52
+ export interface SearchResult {
53
+ /** Matched results */
54
+ matches: SearchMatch[];
55
+ /** Total matches found (before truncation) */
56
+ totalMatches: number;
57
+ /** Whether results were truncated */
58
+ truncated: boolean;
59
+ }
60
+ /**
61
+ * Convert double-escaped backslashes to single backslashes.
62
+ * Fixes MCP JSON transmission double-escaping issue.
63
+ *
64
+ * @param str - String with potentially double-escaped backslashes
65
+ * @returns String with `\\` converted to `\`
66
+ *
67
+ * @example
68
+ * unescapeBackslashes("for\\s*\\(") // returns "for\s*\("
69
+ * unescapeBackslashes("\\\\n") // returns "\\n" (literal backslash + n)
70
+ * unescapeBackslashes("hello") // returns "hello" (unchanged)
71
+ */
72
+ export declare function unescapeBackslashes(str: string): string;
73
+ /**
74
+ * Escape all regex special characters in a string for literal matching
75
+ * @param str - String to escape
76
+ * @returns Escaped string safe for use in RegExp
77
+ */
78
+ export declare function escapeRegex(str: string): string;
79
+ /**
80
+ * Create regex from query string with error handling
81
+ * @param query - Regex pattern or text
82
+ * @param caseSensitive - Whether to be case sensitive
83
+ * @param isRegex - Whether to treat query as regex (default false)
84
+ * @returns Created RegExp
85
+ * @throws Error if regex is invalid
86
+ */
87
+ export declare function createRegex(query: string, caseSensitive?: boolean, isRegex?: boolean): RegExp;
88
+ /**
89
+ * Search for pattern in code and return matches with context.
90
+ * Optimized version: avoids split() for large files, uses index-based iteration.
91
+ *
92
+ * @param code - Beautified code to search in
93
+ * @param rawMap - Source map for coordinate mapping
94
+ * @param options - Search options
95
+ * @returns Search result with matches
96
+ */
97
+ export declare function searchInCode(code: string, rawMap: SourceMap, options: SearchOptions): SearchResult;
98
+ /**
99
+ * Format source position as "L{line}:{column}" or placeholder
100
+ */
101
+ export declare function formatSourcePosition(line: number | null, column: number | null): string;
102
+ /**
103
+ * Format search result for output
104
+ * @param filePath - Path to the file
105
+ * @param query - Search query
106
+ * @param caseSensitive - Whether search was case sensitive
107
+ * @param result - Search result
108
+ * @param maxMatches - Maximum matches limit
109
+ * @param isRegex - Whether query was treated as regex pattern
110
+ * @returns Formatted output string
111
+ */
112
+ export declare function formatSearchResult(filePath: string, query: string, caseSensitive: boolean, result: SearchResult, maxMatches?: number, isRegex?: boolean): string;
113
+ //# sourceMappingURL=searcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.d.ts","sourceRoot":"","sources":["../src/searcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,iCAAiC;IACjC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,gCAAgC;IAChC,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;CACpB;AAGD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,EAAE,OAAO,GAAE,OAAe,GAAG,MAAM,CAS3G;AAmGD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,YAAY,CAgGd;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAKvF;AAYD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,EACtB,MAAM,EAAE,YAAY,EACpB,UAAU,GAAE,MAAW,EACvB,OAAO,GAAE,OAAe,GACvB,MAAM,CAyDR"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}