@aiderdesk/tree-sitter-utils 0.1.0 → 0.2.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.
- package/BENCHMARK.md +112 -0
- package/README.md +34 -0
- package/dist/__tests__/mention-extractor.test.d.ts +2 -0
- package/dist/__tests__/mention-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/tree-renderer.test.d.ts +2 -0
- package/dist/__tests__/tree-renderer.test.d.ts.map +1 -0
- package/dist/cache-manager.d.ts +7 -4
- package/dist/cache-manager.d.ts.map +1 -1
- package/dist/dependency-index.d.ts +9 -0
- package/dist/dependency-index.d.ts.map +1 -0
- package/dist/file-utils.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +670 -487
- package/dist/index.js.map +4 -4
- package/dist/mention-extractor.d.ts +4 -0
- package/dist/mention-extractor.d.ts.map +1 -0
- package/dist/repo-map-service.d.ts +28 -0
- package/dist/repo-map-service.d.ts.map +1 -0
- package/dist/repo-map-worker.d.ts +2 -0
- package/dist/repo-map-worker.d.ts.map +1 -0
- package/dist/repo-map-worker.js +907 -0
- package/dist/repo-map-worker.js.map +7 -0
- package/dist/symbol-extractor.d.ts +6 -2
- package/dist/symbol-extractor.d.ts.map +1 -1
- package/dist/tree-renderer.d.ts +1 -1
- package/dist/tree-renderer.d.ts.map +1 -1
- package/dist/tree-sitter-analyzer.d.ts +10 -4
- package/dist/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/tree-sitter-parser.d.ts +6 -5
- package/dist/tree-sitter-parser.d.ts.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -8
- package/resources/queries/c_sharp-tags.scm +9 -4
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/language-detector.ts", "../src/index.ts", "../src/tree-sitter-parser.ts", "../src/wasm-downloader.ts", "../src/logger.ts", "../src/constants.ts", "../src/symbol-extractor.ts", "../src/
|
|
4
|
-
"sourcesContent": ["import * as path from 'path';\n\nconst LANGUAGE_MAP: Record<string, string> = {\n '.py': 'python',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'tsx',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.java': 'java',\n '.go': 'go',\n '.rs': 'rust',\n '.c': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.h': 'c',\n '.hpp': 'cpp',\n '.hxx': 'cpp',\n '.cs': 'c_sharp',\n '.dart': 'dart',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.jl': 'julia',\n '.ml': 'ocaml',\n '.mli': 'ocaml_interface',\n '.php': 'php',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.scala': 'scala',\n '.sc': 'scala',\n};\n\nexport function detectLanguage(filePath: string): string | null {\n const ext = path.extname(filePath).toLowerCase();\n return LANGUAGE_MAP[ext] || null;\n}\n\nexport function isLanguageSupported(filePath: string): boolean {\n return detectLanguage(filePath) !== null;\n}\n\nexport function getSupportedExtensions(): string[] {\n return Object.keys(LANGUAGE_MAP);\n}\n\nexport function getSupportedLanguages(): string[] {\n return [...new Set(Object.values(LANGUAGE_MAP))];\n}\n", "// Export types\nexport type { Tag, Symbol, RepoMapOptions, SymbolOptions, GraphEdge, RankedDefinition, ParseResult, LanguageConfig, Logger } from './types';\n\n// Export classes\nexport { TreeSitterAnalyzer } from './tree-sitter-analyzer';\nexport { TreeSitterParser } from './tree-sitter-parser';\nexport { SymbolExtractor } from './symbol-extractor';\nexport { GraphBuilder } from './graph-builder';\nexport { PageRankCalculator } from './pagerank';\nexport { TreeRenderer } from './tree-renderer';\nexport { CacheManager } from './cache-manager';\n\n// Export utilities\nexport { detectLanguage, isLanguageSupported, getSupportedExtensions, getSupportedLanguages } from './language-detector';\nexport { downloadWasmForLanguage, getLanguageWasmConfig, getSupportedLanguagesForWasm } from './wasm-downloader';\nexport { setLogger, getLogger } from './logger';\nexport { getAllFiles } from './file-utils';\n\n// Convenience functions\nimport { TreeSitterAnalyzer } from './tree-sitter-analyzer';\n\nlet defaultAnalyzer: TreeSitterAnalyzer | null = null;\n\nasync function getAnalyzer(): Promise<TreeSitterAnalyzer> {\n if (!defaultAnalyzer) {\n defaultAnalyzer = new TreeSitterAnalyzer();\n await defaultAnalyzer.initialize();\n }\n return defaultAnalyzer;\n}\n\n/**\n * Extract symbols from files\n * @param filePaths - Array of file paths to extract symbols from\n * @param options - Symbol extraction options\n * @returns Array of symbols\n */\nexport async function extractSymbols(filePaths: string[], options?: import('./types').SymbolOptions): Promise<import('./types').Symbol[]> {\n const analyzer = await getAnalyzer();\n return analyzer.extractSymbols(filePaths, options);\n}\n\n/**\n * Generate a repository map\n * @param root - Root directory of the repository\n * @param options - Repository map options\n * @returns Formatted repository map string\n */\nexport async function getRepoMap(root: string, options?: Omit<import('./types').RepoMapOptions, 'root'>): Promise<string> {\n const analyzer = await getAnalyzer();\n return analyzer.getRepoMap({ ...options, root });\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Parser, Language, Query } from 'web-tree-sitter';\n\nimport { Tag } from './types';\nimport { detectLanguage } from './language-detector';\nimport { downloadWasmForLanguage } from './wasm-downloader';\nimport { QUERIES_DIR } from './constants';\nimport logger from './logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SyntaxNode = any;\n\nexport class TreeSitterParser {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private parser: any = null;\n private languages: Map<string, Language> = new Map();\n private queries: Map<string, string> = new Map();\n private initialized = false;\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n try {\n await Parser.init();\n this.parser = new Parser();\n\n // Load queries\n try {\n const queryFiles = await fs.readdir(QUERIES_DIR);\n\n for (const file of queryFiles) {\n if (file.endsWith('-tags.scm')) {\n const language = file.replace('-tags.scm', '');\n const queryPath = path.join(QUERIES_DIR, file);\n const queryContent = await fs.readFile(queryPath, 'utf-8');\n this.queries.set(language, queryContent);\n }\n }\n } catch (error) {\n logger.warn('[TreeSitterParser] Could not load query files from resources:', error);\n }\n\n this.initialized = true;\n logger.info(`[TreeSitterParser] Initialized with ${this.queries.size} language queries`);\n } catch (error) {\n logger.error('[TreeSitterParser] Initialization failed:', error);\n throw error;\n }\n }\n\n private async loadLanguage(language: string): Promise<Language | null> {\n if (this.languages.has(language)) {\n return this.languages.get(language)!;\n }\n\n try {\n // Use on-demand WASM download\n const wasmBuffer = await downloadWasmForLanguage(language);\n if (!wasmBuffer) {\n return null;\n }\n\n const lang = await Language.load(wasmBuffer);\n this.languages.set(language, lang);\n return lang;\n } catch (error) {\n logger.error(`[TreeSitterParser] Failed to load language ${language}:`, error);\n return null;\n }\n }\n\n async parseFile(filePath: string, rootDir?: string): Promise<Tag[]> {\n if (!this.initialized || !this.parser) {\n await this.initialize();\n }\n\n if (!this.parser) {\n return [];\n }\n\n const language = detectLanguage(filePath);\n if (!language) {\n return [];\n }\n\n const lang = await this.loadLanguage(language);\n if (!lang) {\n return [];\n }\n\n const query = this.queries.get(language);\n if (!query) {\n return [];\n }\n\n try {\n const sourceCode = await fs.readFile(filePath, 'utf-8');\n\n this.parser.setLanguage(lang);\n const tree = this.parser.parse(sourceCode);\n\n if (!tree) {\n return [];\n }\n\n const tags = this.extractTags(tree.rootNode, query, filePath, lang, rootDir);\n return tags;\n } catch (error) {\n logger.error(`[TreeSitterParser] Error parsing file ${filePath}:`, error);\n return [];\n }\n }\n\n private extractTags(node: SyntaxNode, query: string, filePath: string, language: Language, rootDir?: string): Tag[] {\n const tags: Tag[] = [];\n\n try {\n const queryObj = new Query(language, query);\n const matches = queryObj.matches(node);\n\n logger.debug(`[TreeSitterParser] Found ${matches.length} matches in ${filePath}`);\n\n // Compute relative path if rootDir is provided\n const relFname = rootDir ? path.relative(rootDir, filePath) : filePath;\n\n for (const match of matches) {\n for (const capture of match.captures) {\n // Only process captures that contain the actual name (name.definition.* or name.reference.*)\n // Skip captures that are just markers for the entire definition (@definition.* or @reference.*)\n if (!capture.name.startsWith('name.')) {\n continue;\n }\n\n const name = capture.node.text;\n const kind = this.determineKind(capture.name);\n const line = capture.node.startPosition.row;\n\n logger.debug(`[TreeSitterParser] Found tag: ${name} (${kind}) at line ${line}`);\n\n tags.push({\n rel_fname: relFname,\n fname: filePath,\n line,\n name,\n kind,\n });\n }\n }\n } catch (error) {\n logger.error(`[TreeSitterParser] Error extracting tags from ${filePath}:`, error);\n }\n\n return tags;\n }\n\n private determineKind(captureName: string): 'def' | 'ref' {\n if (captureName.includes('definition')) {\n return 'def';\n }\n return 'ref';\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\n\nimport logger from './logger';\n\nconst LANGUAGE_WASM_MAP: Record<string, { url: string; file: string }> = {\n python: {\n url: 'https://unpkg.com/tree-sitter-python/tree-sitter-python.wasm',\n file: 'tree-sitter-python.wasm',\n },\n javascript: {\n url: 'https://unpkg.com/tree-sitter-javascript/tree-sitter-javascript.wasm',\n file: 'tree-sitter-javascript.wasm',\n },\n typescript: {\n url: 'https://unpkg.com/tree-sitter-typescript/tree-sitter-typescript.wasm',\n file: 'tree-sitter-typescript.wasm',\n },\n tsx: {\n url: 'https://unpkg.com/tree-sitter-typescript/tree-sitter-tsx.wasm',\n file: 'tree-sitter-tsx.wasm',\n },\n java: {\n url: 'https://unpkg.com/tree-sitter-java/tree-sitter-java.wasm',\n file: 'tree-sitter-java.wasm',\n },\n go: {\n url: 'https://unpkg.com/tree-sitter-go/tree-sitter-go.wasm',\n file: 'tree-sitter-go.wasm',\n },\n rust: {\n url: 'https://unpkg.com/tree-sitter-rust/tree-sitter-rust.wasm',\n file: 'tree-sitter-rust.wasm',\n },\n c: {\n url: 'https://unpkg.com/tree-sitter-c/tree-sitter-c.wasm',\n file: 'tree-sitter-c.wasm',\n },\n cpp: {\n url: 'https://unpkg.com/tree-sitter-cpp/tree-sitter-cpp.wasm',\n file: 'tree-sitter-cpp.wasm',\n },\n ruby: {\n url: 'https://unpkg.com/tree-sitter-ruby/tree-sitter-ruby.wasm',\n file: 'tree-sitter-ruby.wasm',\n },\n php: {\n url: 'https://unpkg.com/tree-sitter-php/tree-sitter-php.wasm',\n file: 'tree-sitter-php.wasm',\n },\n scala: {\n url: 'https://unpkg.com/tree-sitter-scala/tree-sitter-scala.wasm',\n file: 'tree-sitter-scala.wasm',\n },\n dart: {\n url: 'https://unpkg.com/tree-sitter-dart/tree-sitter-dart.wasm',\n file: 'tree-sitter-dart.wasm',\n },\n ocaml: {\n url: 'https://unpkg.com/tree-sitter-ocaml/tree-sitter-ocaml.wasm',\n file: 'tree-sitter-ocaml.wasm',\n },\n ocaml_interface: {\n url: 'https://unpkg.com/tree-sitter-ocaml/tree-sitter-ocaml_interface.wasm',\n file: 'tree-sitter-ocaml_interface.wasm',\n },\n c_sharp: {\n url: 'https://unpkg.com/tree-sitter-c-sharp/tree-sitter-c_sharp.wasm',\n file: 'tree-sitter-c_sharp.wasm',\n },\n haskell: {\n url: 'https://unpkg.com/tree-sitter-haskell/tree-sitter-haskell.wasm',\n file: 'tree-sitter-haskell.wasm',\n },\n julia: {\n url: 'https://unpkg.com/tree-sitter-julia/tree-sitter-julia.wasm',\n file: 'tree-sitter-julia.wasm',\n },\n};\n\nfunction getCacheDir(): string {\n const platform = os.platform();\n const homeDir = os.homedir();\n\n if (platform === 'darwin') {\n return path.join(homeDir, 'Library', 'Caches', 'aiderdesk', 'tree-sitter');\n } else if (platform === 'win32') {\n return path.join(process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'aiderdesk', 'tree-sitter');\n } else {\n return path.join(homeDir, '.cache', 'aiderdesk', 'tree-sitter');\n }\n}\n\nexport async function downloadWasmForLanguage(language: string): Promise<Buffer | null> {\n const config = LANGUAGE_WASM_MAP[language];\n if (!config) {\n logger.warn(`No WASM configuration for language: ${language}`);\n return null;\n }\n\n const cacheDir = getCacheDir();\n const wasmPath = path.join(cacheDir, 'wasm', config.file);\n\n try {\n // Try to load from cache first\n try {\n const buffer = await fs.readFile(wasmPath);\n logger.debug(`Loaded WASM for ${language} from cache: ${wasmPath}`);\n return buffer;\n } catch {\n // Not in cache, download it\n }\n\n // Download WASM file\n logger.info(`Downloading WASM for ${language} from ${config.url}`);\n\n const response = await fetch(config.url, { redirect: 'follow' });\n\n if (!response.ok) {\n throw new Error(`Failed to download ${language} WASM: ${response.status} ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Save to cache\n await fs.mkdir(path.dirname(wasmPath), { recursive: true });\n await fs.writeFile(wasmPath, buffer);\n\n logger.info(`Downloaded and cached WASM for ${language} (${Math.round(buffer.byteLength / 1024)} KB)`);\n\n return buffer;\n } catch (error) {\n logger.error(`Failed to download WASM for ${language}:`, error);\n return null;\n }\n}\n\nexport function getLanguageWasmConfig(language: string): { url: string; file: string } | null {\n return LANGUAGE_WASM_MAP[language] || null;\n}\n\nexport function getSupportedLanguagesForWasm(): string[] {\n return Object.keys(LANGUAGE_WASM_MAP);\n}\n", "/* eslint-disable no-console */\n\nexport interface Logger {\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n}\n\nconst defaultLogger: Logger = {\n info: (message: string, ...args: unknown[]) => console.log(`[TreeSitterUtils] ${message}`, ...args),\n warn: (message: string, ...args: unknown[]) => console.warn(`[TreeSitterUtils] ${message}`, ...args),\n error: (message: string, ...args: unknown[]) => console.error(`[TreeSitterUtils] ${message}`, ...args),\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG_TREE_SITTER) {\n console.debug(`[TreeSitterUtils] ${message}`, ...args);\n }\n },\n};\n\nlet currentLogger = defaultLogger;\n\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\nexport default currentLogger;\n", "import * as path from 'path';\nimport { fileURLToPath } from 'url';\n\n// Support both CommonJS and ESM\nconst getDirname = (): string => {\n // @ts-ignore - __dirname is defined in CommonJS\n if (typeof __dirname !== 'undefined') {\n // @ts-ignore\n return __dirname;\n }\n return path.dirname(fileURLToPath(import.meta.url));\n};\n\nconst dirName = getDirname();\n\nexport const RESOURCES_DIR = path.join(dirName, '..', 'resources');\nexport const QUERIES_DIR = path.join(RESOURCES_DIR, 'queries');\nexport const WASM_DIR = path.join(RESOURCES_DIR, 'wasm');\n", "import { Tag } from './types';\nimport { TreeSitterParser } from './tree-sitter-parser';\nimport { isLanguageSupported } from './language-detector';\nimport { CacheManager } from './cache-manager';\nimport logger from './logger';\n\nexport class SymbolExtractor {\n private cacheManager: CacheManager | null = null;\n\n constructor(private readonly parser: TreeSitterParser) {}\n\n setCacheManager(cacheManager: CacheManager): void {\n this.cacheManager = cacheManager;\n }\n\n async extractTags(files: string[], rootDir?: string): Promise<Tag[]> {\n const allTags: Tag[] = [];\n const supportedFiles = files.filter(isLanguageSupported);\n\n logger.info(`[SymbolExtractor] Extracting tags from ${supportedFiles.length} supported files out of ${files.length} total`);\n\n // Process files in parallel batches to avoid memory issues\n const batchSize = 50;\n for (let i = 0; i < supportedFiles.length; i += batchSize) {\n const batch = supportedFiles.slice(i, i + batchSize);\n const batchTags = await Promise.all(\n batch.map(async (file) => {\n try {\n // Check cache first\n if (this.cacheManager) {\n const currentMtime = await this.cacheManager.getFileMtime(file);\n\n if (currentMtime !== null) {\n const cached = await this.cacheManager.getFileCache(file);\n\n // Use cache if mtime matches\n if (cached && cached.mtime === currentMtime) {\n logger.debug(`[SymbolExtractor] Cache hit for ${file}`);\n // Update relative paths in cached tags if rootDir is provided\n if (rootDir) {\n const path = await import('path');\n const relPath = path.relative(rootDir, file);\n return cached.tags.map((tag) => ({ ...tag, rel_fname: relPath }));\n }\n return cached.tags;\n }\n\n // Parse file and update cache\n const tags = await this.parser.parseFile(file, rootDir);\n await this.cacheManager.setFileCache(file, currentMtime, tags);\n return tags;\n }\n }\n\n // Fallback to parsing without cache\n return await this.parser.parseFile(file, rootDir);\n } catch (error) {\n logger.error(`[SymbolExtractor] Error processing ${file}:`, error);\n return [];\n }\n }),\n );\n allTags.push(...batchTags.flat());\n }\n\n logger.info(`[SymbolExtractor] Extracted ${allTags.length} tags total`);\n return allTags;\n }\n\n filterDefinitions(tags: Tag[]): Tag[] {\n return tags.filter((tag) => tag.kind === 'def');\n }\n\n filterReferences(tags: Tag[]): Tag[] {\n return tags.filter((tag) => tag.kind === 'ref');\n }\n\n groupTagsByFile(tags: Tag[]): Map<string, Tag[]> {\n const grouped = new Map<string, Tag[]>();\n for (const tag of tags) {\n const fileTags = grouped.get(tag.rel_fname) || [];\n fileTags.push(tag);\n grouped.set(tag.rel_fname, fileTags);\n }\n return grouped;\n }\n}\n", "// @ts-ignore - graphology types are incomplete\nimport Graph from 'graphology';\n\nimport { Tag } from './types';\nimport logger from './logger';\n\nexport class GraphBuilder {\n buildDependencyGraph(tags: Tag[]): {\n graph: Graph;\n defines: Map<string, Set<string>>;\n references: Map<string, string[]>;\n } {\n const graph = new Graph({ type: 'directed', allowSelfLoops: false, multi: true });\n\n const defines = new Map<string, Set<string>>();\n const references = new Map<string, string[]>();\n const definitions = new Map<string, Tag[]>();\n\n // Build mappings\n for (const tag of tags) {\n if (tag.kind === 'def') {\n if (!defines.has(tag.name)) {\n defines.set(tag.name, new Set());\n }\n defines.get(tag.name)!.add(tag.rel_fname);\n\n const key = `${tag.rel_fname}:${tag.name}`;\n if (!definitions.has(key)) {\n definitions.set(key, []);\n }\n definitions.get(key)!.push(tag);\n } else if (tag.kind === 'ref') {\n if (!references.has(tag.name)) {\n references.set(tag.name, []);\n }\n references.get(tag.name)!.push(tag.rel_fname);\n }\n }\n\n // Build graph edges\n const idents = new Set(Array.from(defines.keys()).filter((k) => references.has(k)));\n\n for (const ident of Array.from(idents)) {\n const definers = Array.from(defines.get(ident) || []);\n const referencers = references.get(ident) || [];\n\n // Calculate weight multiplier\n let mul = 1.0;\n if (this.isSnakeCase(ident) || this.isKebabCase(ident) || this.isCamelCase(ident)) {\n mul *= 10;\n }\n if (ident.startsWith('_')) {\n mul *= 0.1;\n }\n if (definers.length > 5) {\n mul *= 0.1; // Very common symbol\n }\n\n // Count references per file\n const refCounts = new Map<string, number>();\n for (const ref of referencers) {\n refCounts.set(ref, (refCounts.get(ref) || 0) + 1);\n }\n\n // Add edges\n for (const referencer of referencers) {\n const numRefs = refCounts.get(referencer) || 1;\n const weight = mul * Math.sqrt(numRefs);\n\n for (const definer of definers) {\n if (referencer !== definer) {\n if (!graph.hasNode(referencer)) {\n graph.addNode(referencer);\n }\n if (!graph.hasNode(definer)) {\n graph.addNode(definer);\n }\n\n const edgeKey = `${referencer}->${definer}:${ident}`;\n if (!graph.hasEdge(edgeKey)) {\n graph.addEdgeWithKey(edgeKey, referencer, definer, { weight, ident });\n }\n }\n }\n }\n }\n\n logger.info(`[GraphBuilder] Built graph with ${graph.order} nodes and ${graph.size} edges`);\n\n return { graph, defines, references };\n }\n\n private isSnakeCase(str: string): boolean {\n return /^[a-z][a-z0-9_]*$/.test(str) && str.includes('_');\n }\n\n private isKebabCase(str: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(str) && str.includes('-');\n }\n\n private isCamelCase(str: string): boolean {\n return /^[a-z][a-zA-Z0-9]*$/.test(str) && /[A-Z]/.test(str);\n }\n}\n", "// @ts-ignore - graphology types are incomplete\nimport Graph from 'graphology';\n// @ts-ignore - graphology-metrics types are incomplete\nimport pagerank from 'graphology-metrics/centrality/pagerank';\n\nimport { RankedDefinition, Tag } from './types';\nimport logger from './logger';\n\nexport class PageRankCalculator {\n calculate(graph: Graph, tags: Tag[], mentionedFiles?: Set<string>, mentionedIdents?: Set<string>): RankedDefinition[] {\n if (graph.order === 0) {\n return [];\n }\n\n // Build personalization vector\n const personalization: Record<string, number> = {};\n const nodes = graph.nodes();\n const personalize = nodes.length > 0 ? 100 / nodes.length : 0;\n\n for (const node of nodes) {\n let score = 0;\n if (mentionedFiles?.has(node)) {\n score += personalize;\n }\n if (mentionedIdents) {\n // Check if any mentioned ident is defined in this file\n const fileTags = tags.filter((t) => t.rel_fname === node && t.kind === 'def');\n if (fileTags.some((t) => mentionedIdents.has(t.name))) {\n score += personalize;\n }\n }\n if (score > 0) {\n personalization[node] = score;\n }\n }\n\n try {\n // Calculate PageRank\n const pagerankOptions: Record<string, unknown> = {\n alpha: 0.85,\n maxIterations: 100,\n tolerance: 1e-6,\n };\n\n if (Object.keys(personalization).length > 0) {\n pagerankOptions.personalization = personalization;\n }\n\n const ranks = pagerank(graph, pagerankOptions as Parameters<typeof pagerank>[1]);\n\n // Distribute rank across definitions\n const rankedDefinitions: RankedDefinition[] = [];\n const definitions = tags.filter((t) => t.kind === 'def');\n\n for (const def of definitions) {\n const nodeRank = ranks[def.rel_fname] || 0;\n\n // Calculate edge contribution\n let edgeRank = nodeRank;\n if (graph.hasNode(def.rel_fname)) {\n graph.forEachOutboundEdge(def.rel_fname, (edge) => {\n const weight = graph.getEdgeAttribute(edge, 'weight') as number;\n const totalWeight = this.getTotalOutboundWeight(graph, def.rel_fname);\n if (totalWeight > 0) {\n edgeRank += nodeRank * (weight / totalWeight);\n }\n });\n }\n\n rankedDefinitions.push({\n rel_fname: def.rel_fname,\n name: def.name,\n rank: edgeRank,\n line: def.line,\n });\n }\n\n // Sort by rank\n rankedDefinitions.sort((a, b) => b.rank - a.rank);\n\n logger.info(`[PageRankCalculator] Calculated ranks for ${rankedDefinitions.length} definitions`);\n\n return rankedDefinitions;\n } catch (error) {\n logger.error('[PageRankCalculator] Error calculating PageRank:', error);\n return [];\n }\n }\n\n private getTotalOutboundWeight(graph: Graph, node: string): number {\n if (!graph.hasNode(node)) {\n return 0;\n }\n let total = 0;\n graph.forEachOutboundEdge(node, (edge) => {\n total += (graph.getEdgeAttribute(edge, 'weight') as number) || 1;\n });\n return total;\n }\n}\n", "import * as fs from 'fs/promises';\n\nimport { RankedDefinition } from './types';\nimport logger from './logger';\n\nexport class TreeRenderer {\n async render(rankedDefinitions: RankedDefinition[], chatFiles: Set<string>, maxLines?: number): Promise<string> {\n // Filter out chat files\n const filtered = rankedDefinitions.filter((def) => !chatFiles.has(def.rel_fname));\n\n // Group by file\n const byFile = new Map<string, RankedDefinition[]>();\n for (const def of filtered) {\n const fileDefs = byFile.get(def.rel_fname) || [];\n fileDefs.push(def);\n byFile.set(def.rel_fname, fileDefs);\n }\n\n // Sort files by highest rank in file\n const sortedFiles = Array.from(byFile.entries()).sort((a, b) => {\n const maxRankA = Math.max(...a[1].map((d) => d.rank));\n const maxRankB = Math.max(...b[1].map((d) => d.rank));\n return maxRankB - maxRankA;\n });\n\n const totalFiles = sortedFiles.length;\n\n // If no maxLines specified, render everything\n if (!maxLines) {\n return this.renderAllFiles(sortedFiles);\n }\n\n // If more files than maxLines, just list filenames\n if (totalFiles > maxLines) {\n return this.renderFileListOnly(sortedFiles, maxLines);\n }\n\n // Calculate lines per file (at least 2 lines per file: 1 for content + 1 for \"...\" if truncated)\n // Account for the filename line (1 line per file)\n const headerLines = totalFiles;\n const availableLines = maxLines - headerLines;\n const linesPerFile = Math.max(1, Math.floor(availableLines / totalFiles));\n\n return this.renderWithLineLimit(sortedFiles, linesPerFile);\n }\n\n private async renderAllFiles(sortedFiles: [string, RankedDefinition[]][]): Promise<string> {\n let output = '';\n for (const [file, definitions] of sortedFiles) {\n output += `\\n${file}:\\n`;\n\n // Sort definitions by line number\n definitions.sort((a, b) => a.line - b.line);\n\n // Get unique lines and render\n const lines = Array.from(new Set(definitions.map((d) => d.line)));\n const treeLines = await this.renderFileTree(file, lines, Infinity);\n output += treeLines;\n }\n\n return output.trim();\n }\n\n private renderFileListOnly(sortedFiles: [string, RankedDefinition[]][], maxLines: number): string {\n let output = '';\n const filesToShow = sortedFiles.slice(0, maxLines - 1); // Reserve 1 line for \"...\"\n\n for (const [file] of filesToShow) {\n output += `${file}\\n`;\n }\n\n if (sortedFiles.length > filesToShow.length) {\n output += '...\\n';\n }\n\n return output.trim();\n }\n\n private async renderWithLineLimit(sortedFiles: [string, RankedDefinition[]][], linesPerFile: number): Promise<string> {\n let output = '';\n\n for (const [file, definitions] of sortedFiles) {\n // Sort definitions by rank (highest first) then by line number\n definitions.sort((a, b) => {\n if (a.rank !== b.rank) {\n return b.rank - a.rank;\n }\n return a.line - b.line;\n });\n\n // Get unique lines, limited to linesPerFile\n const uniqueLines = Array.from(new Set(definitions.map((d) => d.line)));\n const limitedLines = uniqueLines.slice(0, linesPerFile);\n const isTruncated = uniqueLines.length > linesPerFile;\n\n output += `${file}:\\n`;\n\n const treeLines = await this.renderFileTree(file, limitedLines, linesPerFile, isTruncated);\n output += treeLines;\n }\n\n return output.trim();\n }\n\n private async renderFileTree(filePath: string, lines: number[], maxLines: number, isTruncated: boolean = false): Promise<string> {\n if (lines.length === 0) {\n return '';\n }\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const fileLines = content.split('\\n');\n\n let output = '';\n const maxContentLines = isTruncated ? maxLines - 1 : maxLines;\n const linesToRender = lines.slice(0, maxContentLines);\n\n for (let i = 0; i < linesToRender.length; i++) {\n const lineNum = linesToRender[i];\n const lineContent = fileLines[lineNum]?.trim() || '';\n\n if (lineContent) {\n // Truncate long lines\n const truncated = lineContent.length > 100 ? lineContent.substring(0, 97) + '...' : lineContent;\n\n // Determine if this is the last line\n const isLast = i === linesToRender.length - 1 && !isTruncated;\n const prefix = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n output += `${prefix}${truncated}\\n`;\n }\n }\n\n // Add truncation indicator\n if (isTruncated) {\n output += '\u2514\u2500\u2500 ...\\n';\n }\n\n return output;\n } catch (error) {\n logger.error(`[TreeRenderer] Error reading file ${filePath}:`, error);\n return '';\n }\n }\n}\n", "import { DatabaseSync } from 'node:sqlite';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\n\nimport { Tag } from './types';\nimport logger from './logger';\n\nfunction getCacheDbPath(): string {\n const platform = os.platform();\n const homeDir = os.homedir();\n\n let cacheDir: string;\n if (platform === 'darwin') {\n cacheDir = path.join(homeDir, 'Library', 'Caches', 'aiderdesk', 'tree-sitter');\n } else if (platform === 'win32') {\n cacheDir = path.join(process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'aiderdesk', 'tree-sitter');\n } else {\n cacheDir = path.join(homeDir, '.cache', 'aiderdesk', 'tree-sitter');\n }\n\n return path.join(cacheDir, 'cache.db');\n}\n\nexport class CacheManager {\n private db: DatabaseSync | null = null;\n private dbPath: string;\n\n constructor(dbPath?: string) {\n this.dbPath = dbPath || getCacheDbPath();\n }\n\n async initialize(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.dbPath), { recursive: true });\n this.db = new DatabaseSync(this.dbPath);\n\n const createTableSQL = `\n CREATE TABLE IF NOT EXISTS file_cache (\n file_path TEXT PRIMARY KEY,\n mtime INTEGER NOT NULL,\n tags TEXT NOT NULL,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n )\n `;\n\n this.db.exec(createTableSQL);\n logger.info(`[CacheManager] Cache database initialized at ${this.dbPath}`);\n } catch (error) {\n logger.error('[CacheManager] Failed to initialize cache database:', error);\n this.db = null;\n }\n }\n\n async getFileCache(filePath: string): Promise<{ tags: Tag[]; mtime: number } | null> {\n if (!this.db) {\n return null;\n }\n\n try {\n const sql = 'SELECT mtime, tags FROM file_cache WHERE file_path = ?';\n const stmt = this.db.prepare(sql);\n const result = stmt.get(filePath) as { mtime: number; tags: string } | undefined;\n\n if (result) {\n const tags = JSON.parse(result.tags) as Tag[];\n return { tags, mtime: result.mtime };\n }\n\n return null;\n } catch (error) {\n logger.error(`[CacheManager] Failed to get cache for ${filePath}:`, error);\n return null;\n }\n }\n\n async setFileCache(filePath: string, mtime: number, tags: Tag[]): Promise<void> {\n if (!this.db) {\n return;\n }\n\n try {\n const sql = `\n INSERT INTO file_cache (file_path, mtime, tags, updated_at)\n VALUES (?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT(file_path) DO UPDATE SET\n mtime = excluded.mtime,\n tags = excluded.tags,\n updated_at = CURRENT_TIMESTAMP\n `;\n\n const stmt = this.db.prepare(sql);\n stmt.run(filePath, mtime, JSON.stringify(tags));\n logger.debug(`[CacheManager] Cached ${tags.length} tags for ${filePath}`);\n } catch (error) {\n logger.error(`[CacheManager] Failed to set cache for ${filePath}:`, error);\n }\n }\n\n async getFileMtime(filePath: string): Promise<number | null> {\n try {\n const stats = await fs.stat(filePath);\n return stats.mtimeMs;\n } catch (error) {\n logger.error(`[CacheManager] Failed to get mtime for ${filePath}:`, error);\n return null;\n }\n }\n\n async clearCache(): Promise<void> {\n if (!this.db) {\n return;\n }\n\n try {\n const sql = 'DELETE FROM file_cache';\n this.db.exec(sql);\n logger.info('[CacheManager] Cache cleared');\n } catch (error) {\n logger.error('[CacheManager] Failed to clear cache:', error);\n }\n }\n\n close(): void {\n if (this.db) {\n this.db.close();\n this.db = null;\n logger.info('[CacheManager] Cache database closed');\n }\n }\n}\n", "import * as path from 'path';\n\nimport { glob } from 'glob';\nimport { simpleGit } from 'simple-git';\n\nimport logger from './logger.js';\n\nconst DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '.git/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n 'out/**',\n 'coverage/**',\n '*.min.js',\n '*.min.css',\n '.DS_Store',\n 'Thumbs.db',\n '*.log',\n '*.lock',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n];\n\nconst isGitRepository = async (baseDir: string): Promise<boolean> => {\n try {\n const git = simpleGit(baseDir);\n await git.revparse(['--git-dir']);\n return true;\n } catch {\n return false;\n }\n};\n\nconst getAllFilesFromGit = async (baseDir: string): Promise<string[]> => {\n try {\n const git = simpleGit(baseDir);\n const result = await git.raw(['ls-files', '-z']);\n const files = result.split('\\0').filter(Boolean);\n logger.debug(`Retrieved ${files.length} tracked files from Git`);\n // Return absolute paths\n return files.map((file) => path.resolve(baseDir, file));\n } catch (gitError) {\n logger.warn('Failed to get tracked files from Git, falling back to filesystem', gitError);\n return [];\n }\n};\n\nconst getAllFilesFromFS = async (baseDir: string, ignore: string[]): Promise<string[]> => {\n try {\n const pattern = path.join(baseDir, '**/*').replace(/\\\\/g, '/');\n const files = await glob(pattern, {\n nodir: true,\n absolute: true,\n dot: false,\n ignore,\n });\n\n logger.debug(`Retrieved ${files.length} files from filesystem`);\n return files;\n } catch (error) {\n logger.error('Failed to get files from filesystem:', error);\n return [];\n }\n};\n\nconst matchesPattern = (filePath: string, pattern: string): boolean => {\n // Convert glob pattern to regex for simple matching\n const regexPattern = pattern\n .replace(/\\*\\*/g, '<<DOUBLE_STAR>>')\n .replace(/\\*/g, '[^/]*')\n .replace(/<<DOUBLE_STAR>>/g, '.*')\n .replace(/\\?/g, '[^/]');\n const regex = new RegExp(regexPattern);\n return regex.test(filePath);\n};\n\nconst filterByExcludePatterns = (files: string[], excludePatterns: string[], baseDir: string): string[] => {\n return files.filter((file) => {\n const relative = path.relative(baseDir, file).replace(/\\\\/g, '/');\n return !excludePatterns.some((pattern) => matchesPattern(relative, pattern));\n });\n};\n\nexport const getAllFiles = async (baseDir: string, excludePatterns: string[] = []): Promise<string[]> => {\n const allIgnorePatterns = [...DEFAULT_IGNORE_PATTERNS, ...excludePatterns];\n\n try {\n // Try git first if it's a git repository\n if (await isGitRepository(baseDir)) {\n const gitFiles = await getAllFilesFromGit(baseDir);\n if (gitFiles.length > 0) {\n // Filter by exclude patterns\n return filterByExcludePatterns(gitFiles, excludePatterns, baseDir);\n }\n }\n\n // Fallback to filesystem scanning\n const fsFiles = await getAllFilesFromFS(baseDir, allIgnorePatterns);\n\n // Filter by exclude patterns\n return filterByExcludePatterns(fsFiles, excludePatterns, baseDir);\n } catch (error) {\n logger.error('Failed to get files:', error);\n return [];\n }\n};\n", "import { TreeSitterParser } from './tree-sitter-parser';\nimport { SymbolExtractor } from './symbol-extractor';\nimport { GraphBuilder } from './graph-builder';\nimport { PageRankCalculator } from './pagerank';\nimport { TreeRenderer } from './tree-renderer';\nimport { CacheManager } from './cache-manager';\nimport { getAllFiles } from './file-utils';\nimport { RepoMapOptions, SymbolOptions, Tag, Symbol, ParseResult } from './types';\nimport logger from './logger';\n\nexport class TreeSitterAnalyzer {\n private readonly parser: TreeSitterParser;\n private readonly symbolExtractor: SymbolExtractor;\n private readonly graphBuilder: GraphBuilder;\n private readonly pageRankCalculator: PageRankCalculator;\n private readonly treeRenderer: TreeRenderer;\n private readonly cacheManager: CacheManager;\n private initialized = false;\n\n constructor() {\n this.parser = new TreeSitterParser();\n this.cacheManager = new CacheManager();\n this.symbolExtractor = new SymbolExtractor(this.parser);\n this.symbolExtractor.setCacheManager(this.cacheManager);\n this.graphBuilder = new GraphBuilder();\n this.pageRankCalculator = new PageRankCalculator();\n this.treeRenderer = new TreeRenderer();\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n await this.parser.initialize();\n await this.cacheManager.initialize();\n this.initialized = true;\n logger.info('[TreeSitterAnalyzer] Initialized');\n }\n\n async getRepoMap(options: RepoMapOptions): Promise<string> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const { root, files, excludePatterns = [], mentionedFiles = new Set(), mentionedIdents = new Set(), chatFiles = new Set(), maxLines } = options;\n\n try {\n // Get files to process\n let filesToProcess: string[];\n if (files && files.length > 0) {\n filesToProcess = files;\n } else {\n filesToProcess = await getAllFiles(root, excludePatterns);\n }\n\n logger.info(`[TreeSitterAnalyzer] Processing ${filesToProcess.length} files for repository map`);\n\n // Extract tags from all files\n const tags = await this.symbolExtractor.extractTags(filesToProcess, root);\n\n if (tags.length === 0) {\n return '';\n }\n\n // Build dependency graph\n const { graph, defines: _defines, references: _references } = this.graphBuilder.buildDependencyGraph(tags);\n\n // Calculate PageRank\n const rankedDefinitions = this.pageRankCalculator.calculate(graph, tags, mentionedFiles, mentionedIdents);\n\n // Render tree\n const output = await this.treeRenderer.render(rankedDefinitions, chatFiles, maxLines);\n\n logger.info(`[TreeSitterAnalyzer] Generated repository map with ${rankedDefinitions.length} definitions`);\n\n return output;\n } catch (error) {\n logger.error('[TreeSitterAnalyzer] Error generating repository map:', error);\n return '';\n }\n }\n\n async extractSymbols(filePaths: string[], options?: SymbolOptions): Promise<Symbol[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const useCache = options?.useCache !== false;\n\n try {\n // Temporarily disable cache if requested\n const originalCacheManager = useCache ? this.cacheManager : null;\n if (!useCache) {\n this.symbolExtractor.setCacheManager(null as any);\n }\n\n const tags = await this.symbolExtractor.extractTags(filePaths, options?.rootDir);\n\n // Restore cache manager\n if (!useCache) {\n this.symbolExtractor.setCacheManager(this.cacheManager);\n }\n\n // Convert tags to symbols\n const symbols: Symbol[] = tags.map((tag) => ({\n name: tag.name,\n kind: tag.kind,\n line: tag.line,\n file: tag.fname,\n relativeFile: tag.rel_fname,\n }));\n\n logger.info(`[TreeSitterAnalyzer] Extracted ${symbols.length} symbols from ${filePaths.length} files`);\n\n return symbols;\n } catch (error) {\n logger.error('[TreeSitterAnalyzer] Error extracting symbols:', error);\n return [];\n }\n }\n\n async parseFile(filePath: string): Promise<ParseResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const { detectLanguage } = await import('./language-detector');\n const language = detectLanguage(filePath) || 'unknown';\n\n const tags = await this.parser.parseFile(filePath);\n\n return {\n tags,\n file: filePath,\n language,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["fs", "path", "path", "platform", "buffer", "path", "
|
|
3
|
+
"sources": ["../src/language-detector.ts", "../src/index.ts", "../src/tree-sitter-analyzer.ts", "../src/tree-sitter-parser.ts", "../src/wasm-downloader.ts", "../src/logger.ts", "../src/constants.ts", "../src/symbol-extractor.ts", "../src/dependency-index.ts", "../src/tree-renderer.ts", "../src/cache-manager.ts", "../src/file-utils.ts", "../src/graph-builder.ts", "../src/pagerank.ts", "../src/repo-map-service.ts"],
|
|
4
|
+
"sourcesContent": ["import * as path from 'path';\n\nconst LANGUAGE_MAP: Record<string, string> = {\n '.py': 'python',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'tsx',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.java': 'java',\n '.go': 'go',\n '.rs': 'rust',\n '.c': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.h': 'c',\n '.hpp': 'cpp',\n '.hxx': 'cpp',\n '.cs': 'c_sharp',\n '.dart': 'dart',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.jl': 'julia',\n '.ml': 'ocaml',\n '.mli': 'ocaml_interface',\n '.php': 'php',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.scala': 'scala',\n '.sc': 'scala',\n};\n\nexport function detectLanguage(filePath: string): string | null {\n const ext = path.extname(filePath).toLowerCase();\n return LANGUAGE_MAP[ext] || null;\n}\n\nexport function isLanguageSupported(filePath: string): boolean {\n return detectLanguage(filePath) !== null;\n}\n\nexport function getSupportedExtensions(): string[] {\n return Object.keys(LANGUAGE_MAP);\n}\n\nexport function getSupportedLanguages(): string[] {\n return [...new Set(Object.values(LANGUAGE_MAP))];\n}\n", "// Export types\nexport type { Tag, Symbol, RepoMapOptions, SymbolOptions, GraphEdge, RankedDefinition, ParseResult, LanguageConfig, Logger } from './types';\n\n// Export classes\nexport { TreeSitterAnalyzer } from './tree-sitter-analyzer';\nexport { TreeSitterParser } from './tree-sitter-parser';\nexport { SymbolExtractor } from './symbol-extractor';\nexport { GraphBuilder } from './graph-builder';\nexport { PageRankCalculator } from './pagerank';\nexport { TreeRenderer } from './tree-renderer';\nexport { CacheManager } from './cache-manager';\n\n// Export utilities\nexport { detectLanguage, isLanguageSupported, getSupportedExtensions, getSupportedLanguages } from './language-detector';\nexport { downloadWasmForLanguage, getLanguageWasmConfig, getSupportedLanguagesForWasm } from './wasm-downloader';\nexport { setLogger, getLogger } from './logger';\nexport { getAllFiles } from './file-utils';\n\n// Convenience functions\nimport { TreeSitterAnalyzer } from './tree-sitter-analyzer';\nimport { RepoMapService } from './repo-map-service';\n\nexport { RepoMapService } from './repo-map-service';\n\nconst repoMapService = new RepoMapService();\n\nlet defaultAnalyzer: TreeSitterAnalyzer | null = null;\n\nasync function getAnalyzer(): Promise<TreeSitterAnalyzer> {\n if (!defaultAnalyzer) {\n defaultAnalyzer = new TreeSitterAnalyzer();\n await defaultAnalyzer.initialize();\n }\n return defaultAnalyzer;\n}\n\n/**\n * Extract symbols from files\n * @param filePaths - Array of file paths to extract symbols from\n * @param options - Symbol extraction options\n * @returns Array of symbols\n */\nexport async function extractSymbols(filePaths: string[], options?: import('./types').SymbolOptions): Promise<import('./types').Symbol[]> {\n const analyzer = await getAnalyzer();\n return analyzer.extractSymbols(filePaths, options);\n}\n\n/**\n * Generate a repository map\n * @param root - Root directory of the repository\n * @param options - Repository map options\n * @returns Formatted repository map string\n */\nexport async function getRepoMap(root: string, options?: Omit<import('./types').RepoMapOptions, 'root'>): Promise<string> {\n return repoMapService.getRepoMap({ ...options, root });\n}\n", "import * as path from 'path';\n\nimport { TreeSitterParser } from './tree-sitter-parser';\nimport { SymbolExtractor } from './symbol-extractor';\nimport { DependencyIndex } from './dependency-index';\nimport { TreeRenderer } from './tree-renderer';\nimport { CacheManager } from './cache-manager';\nimport { getAllFiles } from './file-utils';\nimport { RepoMapOptions, SymbolOptions, Symbol, ParseResult } from './types';\n\nexport class TreeSitterAnalyzer {\n private readonly parser = new TreeSitterParser();\n private readonly symbolExtractor = new SymbolExtractor(this.parser);\n private readonly treeRenderer = new TreeRenderer();\n private readonly cacheManager: CacheManager;\n private initialization: Promise<void> | undefined;\n private queue: Promise<unknown> = Promise.resolve();\n private graph: DependencyIndex | undefined;\n private revision = -1;\n private outputs = new Map<string, string>();\n\n constructor(options: { cachePath?: string } = {}) {\n this.cacheManager = new CacheManager(options.cachePath);\n this.symbolExtractor.setCacheManager(this.cacheManager);\n }\n\n initialize(): Promise<void> {\n this.initialization ??= Promise.all([this.parser.initialize(), this.cacheManager.initialize()]).then(() => undefined);\n return this.initialization;\n }\n\n getRepoMap(options: RepoMapOptions): Promise<string> {\n const result = this.queue.then(() => this.generateRepoMap(options));\n this.queue = result.catch(() => undefined);\n return result;\n }\n\n private async generateRepoMap(options: RepoMapOptions): Promise<string> {\n options.signal?.throwIfAborted();\n await this.initialize();\n const root = path.resolve(options.root);\n const normalize = (files: Set<string> = new Set()): Set<string> =>\n new Set([...files].map((file) => path.relative(root, path.resolve(root, file)).replaceAll(path.sep, '/')));\n const mentionedFiles = normalize(options.mentionedFiles);\n const chatFiles = normalize(options.chatFiles);\n const mentionedIdents = options.mentionedIdents ?? new Set<string>();\n const files = options.files?.length ? options.files.map((file) => path.resolve(root, file)) : await getAllFiles(root, options.excludePatterns);\n options.signal?.throwIfAborted();\n const tags = await this.symbolExtractor.extractTags(files, root, options.signal, true);\n if (!tags.length) return '';\n if (this.revision !== this.symbolExtractor.revision) {\n this.graph = new DependencyIndex(tags);\n this.revision = this.symbolExtractor.revision;\n this.outputs.clear();\n }\n if (options.prepareOnly) return '';\n const key = JSON.stringify([[...mentionedFiles].sort(), [...mentionedIdents].sort(), [...chatFiles].sort(), options.maxLines]);\n const cached = this.outputs.get(key);\n if (cached !== undefined) return cached;\n options.signal?.throwIfAborted();\n const ranked = this.graph!.rank(mentionedFiles, mentionedIdents);\n options.signal?.throwIfAborted();\n const output = await this.treeRenderer.render(ranked, chatFiles, options.maxLines, root);\n options.signal?.throwIfAborted();\n if (this.outputs.size >= 8) this.outputs.delete(this.outputs.keys().next().value!);\n this.outputs.set(key, output);\n return output;\n }\n\n extractSymbols(filePaths: string[], options?: SymbolOptions): Promise<Symbol[]> {\n const result = this.queue.then(async () => {\n await this.initialize();\n if (options?.useCache === false) this.symbolExtractor.setCacheManager(null);\n try {\n const tags = await this.symbolExtractor.extractTags(filePaths, options?.rootDir);\n return tags.map((tag) => ({\n name: tag.name,\n kind: tag.kind,\n line: tag.line,\n file: tag.fname,\n relativeFile: tag.rel_fname,\n }));\n } finally {\n this.symbolExtractor.setCacheManager(this.cacheManager);\n }\n });\n this.queue = result.catch(() => undefined);\n return result;\n }\n\n async parseFile(filePath: string): Promise<ParseResult> {\n await this.initialize();\n const { detectLanguage } = await import('./language-detector');\n return {\n tags: await this.parser.parseFile(filePath),\n file: filePath,\n language: detectLanguage(filePath) || 'unknown',\n };\n }\n\n async dispose(): Promise<void> {\n await this.queue;\n await this.parser.dispose();\n this.cacheManager.close();\n this.graph = undefined;\n this.outputs.clear();\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Parser, Language, Query } from 'web-tree-sitter';\n\nimport { Tag } from './types';\nimport { detectLanguage } from './language-detector';\nimport { downloadWasmForLanguage } from './wasm-downloader';\nimport { QUERIES_DIR } from './constants';\n\nlet runtimeInitialization: Promise<void> | undefined;\n\nexport class TreeSitterParser {\n private parser: Parser | null = null;\n private languages = new Map<string, Promise<{ language: Language; query: Query }>>();\n private initialization: Promise<void> | undefined;\n private queue: Promise<unknown> = Promise.resolve();\n\n initialize(): Promise<void> {\n this.initialization ??= this.initializeParser();\n return this.initialization;\n }\n\n private async initializeParser(): Promise<void> {\n runtimeInitialization ??= Parser.init();\n await runtimeInitialization;\n this.parser = new Parser();\n }\n\n private loadLanguage(name: string): Promise<{ language: Language; query: Query }> {\n let pending = this.languages.get(name);\n if (!pending) {\n pending = (async () => {\n const buffer = await downloadWasmForLanguage(name);\n if (!buffer) {\n throw new Error(`No WASM available for ${name}`);\n }\n const language = await Language.load(buffer);\n const source = await fs.readFile(path.join(QUERIES_DIR, `${name}-tags.scm`), 'utf-8');\n const query = new Query(language, source);\n if (name === 'c_sharp') {\n for (const capture of query.captureNames) {\n if (!capture.startsWith('name.')) query.disableCapture(capture);\n }\n }\n return { language, query };\n })();\n this.languages.set(name, pending);\n void pending.catch(() => this.languages.delete(name));\n }\n return pending;\n }\n\n parseFile(filePath: string, rootDir?: string, compactReferences = false): Promise<Tag[]> {\n const result = this.queue.then(() => this.parse(filePath, rootDir, compactReferences));\n this.queue = result.catch(() => undefined);\n return result;\n }\n\n private async parse(filePath: string, rootDir?: string, compactReferences = false): Promise<Tag[]> {\n await this.initialize();\n const name = detectLanguage(filePath);\n if (!name || !this.parser) {\n return [];\n }\n const { language, query } = await this.loadLanguage(name);\n const source = await fs.readFile(filePath, 'utf-8');\n this.parser.setLanguage(language);\n const tree = this.parser.parse(source);\n if (!tree) {\n throw new Error(`Unable to parse ${filePath}`);\n }\n try {\n const tags: Tag[] = [];\n const references = new Map<string, Tag>();\n const relative = rootDir ? path.relative(rootDir, filePath).replaceAll(path.sep, '/') : filePath;\n for (const match of query.matches(tree.rootNode)) {\n for (const capture of match.captures) {\n if (capture.name.startsWith('name.')) {\n const kind = capture.name.includes('definition') ? 'def' : 'ref';\n const name = capture.node.text;\n const previous = compactReferences && kind === 'ref' ? references.get(name) : undefined;\n if (previous) {\n previous.count = (previous.count ?? 1) + 1;\n continue;\n }\n const tag: Tag = {\n rel_fname: relative,\n fname: filePath,\n line: capture.node.startPosition.row,\n // Detach sliced node text so cached tags cannot retain entire source files.\n name: Buffer.from(name, 'utf8').toString('utf8'),\n kind,\n };\n tags.push(tag);\n if (compactReferences && kind === 'ref') references.set(tag.name, tag);\n }\n }\n }\n return tags;\n } finally {\n tree.delete();\n }\n }\n\n async dispose(): Promise<void> {\n await this.queue;\n for (const pending of this.languages.values()) {\n try {\n const { query } = await pending;\n query.delete();\n } catch {\n // Failed language loads have no query to release.\n }\n }\n this.languages.clear();\n this.parser?.delete();\n this.parser = null;\n this.initialization = undefined;\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\n\nimport logger from './logger';\n\nconst LANGUAGE_WASM_MAP: Record<string, { url: string; file: string }> = {\n python: {\n url: 'https://unpkg.com/tree-sitter-python/tree-sitter-python.wasm',\n file: 'tree-sitter-python.wasm',\n },\n javascript: {\n url: 'https://unpkg.com/tree-sitter-javascript/tree-sitter-javascript.wasm',\n file: 'tree-sitter-javascript.wasm',\n },\n typescript: {\n url: 'https://unpkg.com/tree-sitter-typescript/tree-sitter-typescript.wasm',\n file: 'tree-sitter-typescript.wasm',\n },\n tsx: {\n url: 'https://unpkg.com/tree-sitter-typescript/tree-sitter-tsx.wasm',\n file: 'tree-sitter-tsx.wasm',\n },\n java: {\n url: 'https://unpkg.com/tree-sitter-java/tree-sitter-java.wasm',\n file: 'tree-sitter-java.wasm',\n },\n go: {\n url: 'https://unpkg.com/tree-sitter-go/tree-sitter-go.wasm',\n file: 'tree-sitter-go.wasm',\n },\n rust: {\n url: 'https://unpkg.com/tree-sitter-rust/tree-sitter-rust.wasm',\n file: 'tree-sitter-rust.wasm',\n },\n c: {\n url: 'https://unpkg.com/tree-sitter-c/tree-sitter-c.wasm',\n file: 'tree-sitter-c.wasm',\n },\n cpp: {\n url: 'https://unpkg.com/tree-sitter-cpp/tree-sitter-cpp.wasm',\n file: 'tree-sitter-cpp.wasm',\n },\n ruby: {\n url: 'https://unpkg.com/tree-sitter-ruby/tree-sitter-ruby.wasm',\n file: 'tree-sitter-ruby.wasm',\n },\n php: {\n url: 'https://unpkg.com/tree-sitter-php/tree-sitter-php.wasm',\n file: 'tree-sitter-php.wasm',\n },\n scala: {\n url: 'https://unpkg.com/tree-sitter-scala/tree-sitter-scala.wasm',\n file: 'tree-sitter-scala.wasm',\n },\n dart: {\n url: 'https://unpkg.com/tree-sitter-dart/tree-sitter-dart.wasm',\n file: 'tree-sitter-dart.wasm',\n },\n ocaml: {\n url: 'https://unpkg.com/tree-sitter-ocaml/tree-sitter-ocaml.wasm',\n file: 'tree-sitter-ocaml.wasm',\n },\n ocaml_interface: {\n url: 'https://unpkg.com/tree-sitter-ocaml/tree-sitter-ocaml_interface.wasm',\n file: 'tree-sitter-ocaml_interface.wasm',\n },\n c_sharp: {\n url: 'https://unpkg.com/tree-sitter-c-sharp@0.23.5/tree-sitter-c_sharp.wasm',\n file: 'tree-sitter-c_sharp-0.23.5.wasm',\n },\n haskell: {\n url: 'https://unpkg.com/tree-sitter-haskell/tree-sitter-haskell.wasm',\n file: 'tree-sitter-haskell.wasm',\n },\n julia: {\n url: 'https://unpkg.com/tree-sitter-julia/tree-sitter-julia.wasm',\n file: 'tree-sitter-julia.wasm',\n },\n};\n\nfunction getCacheDir(): string {\n const platform = os.platform();\n const homeDir = os.homedir();\n\n if (platform === 'darwin') {\n return path.join(homeDir, 'Library', 'Caches', 'aiderdesk', 'tree-sitter');\n } else if (platform === 'win32') {\n return path.join(process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'aiderdesk', 'tree-sitter');\n } else {\n return path.join(homeDir, '.cache', 'aiderdesk', 'tree-sitter');\n }\n}\n\nexport async function downloadWasmForLanguage(language: string): Promise<Buffer | null> {\n const config = LANGUAGE_WASM_MAP[language];\n if (!config) {\n logger.warn(`No WASM configuration for language: ${language}`);\n return null;\n }\n\n const cacheDir = getCacheDir();\n const wasmPath = path.join(cacheDir, 'wasm', config.file);\n\n try {\n // Try to load from cache first\n try {\n const buffer = await fs.readFile(wasmPath);\n logger.debug(`Loaded WASM for ${language} from cache: ${wasmPath}`);\n return buffer;\n } catch {\n // Not in cache, download it\n }\n\n // Download WASM file\n logger.info(`Downloading WASM for ${language} from ${config.url}`);\n\n const response = await fetch(config.url, { redirect: 'follow' });\n\n if (!response.ok) {\n throw new Error(`Failed to download ${language} WASM: ${response.status} ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Save to cache\n await fs.mkdir(path.dirname(wasmPath), { recursive: true });\n await fs.writeFile(wasmPath, buffer);\n\n logger.info(`Downloaded and cached WASM for ${language} (${Math.round(buffer.byteLength / 1024)} KB)`);\n\n return buffer;\n } catch (error) {\n logger.error(`Failed to download WASM for ${language}:`, error);\n return null;\n }\n}\n\nexport function getLanguageWasmConfig(language: string): { url: string; file: string } | null {\n return LANGUAGE_WASM_MAP[language] || null;\n}\n\nexport function getSupportedLanguagesForWasm(): string[] {\n return Object.keys(LANGUAGE_WASM_MAP);\n}\n", "/* eslint-disable no-console */\n\nexport interface Logger {\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n}\n\nconst defaultLogger: Logger = {\n info: (message: string, ...args: unknown[]) => console.log(`[TreeSitterUtils] ${message}`, ...args),\n warn: (message: string, ...args: unknown[]) => console.warn(`[TreeSitterUtils] ${message}`, ...args),\n error: (message: string, ...args: unknown[]) => console.error(`[TreeSitterUtils] ${message}`, ...args),\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG_TREE_SITTER) {\n console.debug(`[TreeSitterUtils] ${message}`, ...args);\n }\n },\n};\n\nlet currentLogger = defaultLogger;\n\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\nexport default currentLogger;\n", "import * as path from 'path';\nimport { fileURLToPath } from 'url';\n\n// Support both CommonJS and ESM\nconst getDirname = (): string => {\n // @ts-ignore - __dirname is defined in CommonJS\n if (typeof __dirname !== 'undefined') {\n // @ts-ignore\n return __dirname;\n }\n return path.dirname(fileURLToPath(import.meta.url));\n};\n\nconst dirName = getDirname();\n\nexport const RESOURCES_DIR = path.join(dirName, '..', 'resources');\nexport const QUERIES_DIR = path.join(RESOURCES_DIR, 'queries');\nexport const WASM_DIR = path.join(RESOURCES_DIR, 'wasm');\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Tag } from './types';\nimport { TreeSitterParser } from './tree-sitter-parser';\nimport { isLanguageSupported } from './language-detector';\nimport { CacheManager } from './cache-manager';\nimport logger from './logger';\n\nexport class SymbolExtractor {\n private cacheManager: CacheManager | null = null;\n private memory = new Map<string, { fingerprint: string; tags: Tag[] }>();\n private lastRoot: string | undefined;\n private lastFiles = '';\n revision = 0;\n\n constructor(private readonly parser: TreeSitterParser) {}\n\n setCacheManager(cacheManager: CacheManager | null): void {\n this.cacheManager = cacheManager;\n }\n\n async extractTags(files: string[], rootDir?: string, signal?: AbortSignal, compactReferences = false): Promise<Tag[]> {\n const allTags: Tag[] = [];\n const supported = files.filter(isLanguageSupported);\n const fileKey = JSON.stringify([compactReferences, supported]);\n if (this.lastRoot !== rootDir || this.lastFiles !== fileKey) {\n this.revision++;\n this.memory.clear();\n this.lastRoot = rootDir;\n this.lastFiles = fileKey;\n }\n for (let i = 0; i < supported.length; i += 50) {\n signal?.throwIfAborted();\n const results = await Promise.all(\n supported.slice(i, i + 50).map(async (file) => {\n try {\n const before = await fs.stat(file);\n const fingerprint = `${compactReferences}:${before.mtimeMs}:${before.ctimeMs}:${before.size}`;\n const memory = this.memory.get(file);\n if (this.cacheManager && memory?.fingerprint === fingerprint) {\n return memory.tags;\n }\n this.revision++;\n const cached = await this.cacheManager?.getFileCache(file);\n let tags: Tag[];\n if (cached?.fingerprint === fingerprint) {\n const relative = rootDir ? path.relative(rootDir, file).replaceAll(path.sep, '/') : file;\n tags = cached.tags.map((tag) => ({\n ...tag,\n rel_fname: relative,\n }));\n } else {\n tags = await this.parser.parseFile(file, rootDir, compactReferences);\n const after = await fs.stat(file);\n if (`${compactReferences}:${after.mtimeMs}:${after.ctimeMs}:${after.size}` !== fingerprint) {\n return tags;\n }\n await this.cacheManager?.setFileCache(file, before.mtimeMs, tags, fingerprint);\n }\n this.memory.set(file, { fingerprint, tags });\n return tags;\n } catch (error) {\n this.revision++;\n this.memory.delete(file);\n logger.error(`[SymbolExtractor] Error processing ${file}:`, error);\n return [];\n }\n }),\n );\n for (const tags of results) {\n for (const tag of tags) allTags.push(tag);\n }\n }\n signal?.throwIfAborted();\n return allTags;\n }\n\n filterDefinitions(tags: Tag[]): Tag[] {\n return tags.filter((tag) => tag.kind === 'def');\n }\n\n filterReferences(tags: Tag[]): Tag[] {\n return tags.filter((tag) => tag.kind === 'ref');\n }\n\n groupTagsByFile(tags: Tag[]): Map<string, Tag[]> {\n const grouped = new Map<string, Tag[]>();\n for (const tag of tags) {\n const fileTags = grouped.get(tag.rel_fname) || [];\n fileTags.push(tag);\n grouped.set(tag.rel_fname, fileTags);\n }\n return grouped;\n }\n}\n", "import { RankedDefinition, Tag } from './types';\n\ntype Relation = {\n definers: Set<string>;\n sources: Map<string, number>;\n};\n\nexport class DependencyIndex {\n private definitions: Tag[] = [];\n private relations: Relation[] = [];\n private outbound = new Map<string, number>();\n\n constructor(tags: Tag[]) {\n const definitions = new Map<string, Set<string>>();\n const references = new Map<string, Map<string, number>>();\n for (const tag of tags) {\n if (tag.kind === 'def') {\n this.definitions.push(tag);\n let files = definitions.get(tag.name);\n if (!files) definitions.set(tag.name, (files = new Set()));\n files.add(tag.rel_fname);\n this.outbound.set(tag.rel_fname, 0);\n } else {\n let counts = references.get(tag.name);\n if (!counts) references.set(tag.name, (counts = new Map()));\n counts.set(tag.rel_fname, (counts.get(tag.rel_fname) ?? 0) + (tag.count ?? 1));\n }\n }\n for (const [name, definers] of definitions) {\n const counts = references.get(name);\n if (!counts) continue;\n let multiplier = 1;\n if (\n (/^[a-z][a-z0-9_]*$/.test(name) && name.includes('_')) ||\n (/^[a-z][a-z0-9-]*$/.test(name) && name.includes('-')) ||\n (/^[a-z][a-zA-Z0-9]*$/.test(name) && /[A-Z]/.test(name))\n )\n multiplier *= 10;\n if (name.startsWith('_')) multiplier *= 0.1;\n if (definers.size > 5) multiplier *= 0.1;\n const sources = new Map<string, number>();\n for (const [file, count] of counts) {\n const targets = definers.size - Number(definers.has(file));\n if (!targets) continue;\n const weight = multiplier * Math.sqrt(count);\n sources.set(file, weight);\n this.outbound.set(file, (this.outbound.get(file) ?? 0) + weight * targets);\n }\n if (sources.size) this.relations.push({ definers, sources });\n }\n }\n\n rank(mentionedFiles = new Set<string>(), mentionedIdents = new Set<string>()): RankedDefinition[] {\n const nodes = [...this.outbound.keys()];\n const count = nodes.length;\n if (!count) return [];\n const mentionedDefinitions = new Set(this.definitions.filter((tag) => mentionedIdents.has(tag.name)).map((tag) => tag.rel_fname));\n const weights = new Map(nodes.map((node) => [node, Number(mentionedFiles.has(node)) + Number(mentionedDefinitions.has(node))]));\n const total = [...weights.values()].reduce((sum, weight) => sum + weight, 0);\n const personalization = new Map(nodes.map((node) => [node, total ? weights.get(node)! / total : 1 / count]));\n let ranks = new Map(nodes.map((node) => [node, 1 / count]));\n for (let iteration = 0; iteration < 100; iteration++) {\n let dangling = 0;\n for (const node of nodes) {\n if (!this.outbound.get(node)) dangling += ranks.get(node)!;\n }\n const base = 0.85 * dangling + 0.15;\n const next = new Map(nodes.map((node) => [node, base * personalization.get(node)!]));\n for (const { definers, sources } of this.relations) {\n let incoming = 0;\n for (const [source, weight] of sources) {\n incoming += (0.85 * ranks.get(source)! * weight) / this.outbound.get(source)!;\n }\n for (const target of definers) {\n // Each identifier is a weighted complete bipartite relation, excluding self-edges.\n const self = sources.get(target);\n const contribution = incoming - (self ? (0.85 * ranks.get(target)! * self) / this.outbound.get(target)! : 0);\n next.set(target, next.get(target)! + contribution);\n }\n }\n let error = 0;\n for (const node of nodes) error += Math.abs(next.get(node)! - ranks.get(node)!);\n ranks = next;\n if (error < count * 1e-6) break;\n if (iteration === 99) throw new Error('Repository map PageRank did not converge');\n }\n return this.definitions\n .map((tag) => ({\n rel_fname: tag.rel_fname,\n name: tag.name,\n line: tag.line,\n rank: ranks.get(tag.rel_fname)! * (this.outbound.get(tag.rel_fname) ? 2 : 1),\n }))\n .sort((a, b) => b.rank - a.rank);\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { RankedDefinition } from './types';\nimport logger from './logger';\n\nexport class TreeRenderer {\n async render(rankedDefinitions: RankedDefinition[], chatFiles: Set<string>, maxLines?: number, root = process.cwd()): Promise<string> {\n // Filter out chat files\n const filtered = rankedDefinitions.filter((def) => !chatFiles.has(def.rel_fname));\n\n // Group by file\n const byFile = new Map<string, RankedDefinition[]>();\n for (const def of filtered) {\n const fileDefs = byFile.get(def.rel_fname) || [];\n fileDefs.push(def);\n byFile.set(def.rel_fname, fileDefs);\n }\n\n const maximumRanks = new Map<string, number>();\n for (const def of filtered) maximumRanks.set(def.rel_fname, Math.max(maximumRanks.get(def.rel_fname) ?? -Infinity, def.rank));\n\n // Sort files by highest rank in file\n const sortedFiles = Array.from(byFile.entries()).sort((a, b) => {\n const maxRankA = maximumRanks.get(a[0])!;\n const maxRankB = maximumRanks.get(b[0])!;\n return maxRankB - maxRankA;\n });\n\n const totalFiles = sortedFiles.length;\n\n // If no maxLines specified, render everything\n if (!maxLines) {\n return this.renderAllFiles(sortedFiles, root);\n }\n\n // If more files than maxLines, just list filenames\n if (totalFiles * 2 > maxLines) {\n return this.renderFileListOnly(sortedFiles, maxLines);\n }\n\n // Calculate lines per file (at least 2 lines per file: 1 for content + 1 for \"...\" if truncated)\n // Account for the filename line (1 line per file)\n const headerLines = totalFiles;\n const availableLines = maxLines - headerLines;\n const linesPerFile = Math.max(1, Math.floor(availableLines / totalFiles));\n\n return this.renderWithLineLimit(sortedFiles, linesPerFile, root);\n }\n\n private async renderAllFiles(sortedFiles: [string, RankedDefinition[]][], root: string): Promise<string> {\n let output = '';\n for (const [file, definitions] of sortedFiles) {\n output += `\\n${file}:\\n`;\n\n // Sort definitions by line number\n definitions.sort((a, b) => a.line - b.line);\n\n // Get unique lines and render\n const lines = Array.from(new Set(definitions.map((d) => d.line)));\n const treeLines = await this.renderFileTree(path.resolve(root, file), lines, Infinity);\n output += treeLines;\n }\n\n return output.trim();\n }\n\n private renderFileListOnly(sortedFiles: [string, RankedDefinition[]][], maxLines: number): string {\n let output = '';\n const filesToShow = sortedFiles.slice(0, maxLines - 1); // Reserve 1 line for \"...\"\n\n for (const [file] of filesToShow) {\n output += `${file}\\n`;\n }\n\n if (sortedFiles.length > filesToShow.length) {\n output += '...\\n';\n }\n\n return output.trim();\n }\n\n private async renderWithLineLimit(sortedFiles: [string, RankedDefinition[]][], linesPerFile: number, root: string): Promise<string> {\n let output = '';\n\n for (const [file, definitions] of sortedFiles) {\n // Sort definitions by rank (highest first) then by line number\n definitions.sort((a, b) => {\n if (a.rank !== b.rank) {\n return b.rank - a.rank;\n }\n return a.line - b.line;\n });\n\n // Get unique lines, limited to linesPerFile\n const uniqueLines = Array.from(new Set(definitions.map((d) => d.line)));\n const limitedLines = uniqueLines.slice(0, linesPerFile);\n const isTruncated = uniqueLines.length > linesPerFile;\n\n output += `${file}:\\n`;\n\n const treeLines = await this.renderFileTree(path.resolve(root, file), limitedLines, linesPerFile, isTruncated);\n output += treeLines;\n }\n\n return output.trim();\n }\n\n private async renderFileTree(filePath: string, lines: number[], maxLines: number, isTruncated: boolean = false): Promise<string> {\n if (lines.length === 0) {\n return '';\n }\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const fileLines = content.split('\\n');\n\n let output = '';\n const maxContentLines = isTruncated ? maxLines - 1 : maxLines;\n const linesToRender = lines.slice(0, maxContentLines);\n\n for (let i = 0; i < linesToRender.length; i++) {\n const lineNum = linesToRender[i];\n const lineContent = fileLines[lineNum]?.trim() || '';\n\n if (lineContent) {\n // Truncate long lines\n const truncated = lineContent.length > 100 ? lineContent.substring(0, 97) + '...' : lineContent;\n\n // Determine if this is the last line\n const isLast = i === linesToRender.length - 1 && !isTruncated;\n const prefix = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n output += `${prefix}${truncated}\\n`;\n }\n }\n\n // Add truncation indicator\n if (isTruncated) {\n output += '\u2514\u2500\u2500 ...\\n';\n }\n\n return output;\n } catch (error) {\n logger.error(`[TreeRenderer] Error reading file ${filePath}:`, error);\n return '';\n }\n }\n}\n", "import { DatabaseSync, StatementSync } from 'node:sqlite';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\n\nimport { Tag } from './types';\nimport logger from './logger';\n\nconst getCacheDbPath = (): string => {\n const home = os.homedir();\n const directory =\n process.platform === 'darwin'\n ? path.join(home, 'Library', 'Caches')\n : process.platform === 'win32'\n ? process.env.APPDATA || path.join(home, 'AppData', 'Roaming')\n : path.join(home, '.cache');\n return path.join(directory, 'aiderdesk', 'tree-sitter', 'cache.db');\n};\n\nexport class CacheManager {\n private db: DatabaseSync | null = null;\n private select: StatementSync | undefined;\n private insert: StatementSync | undefined;\n\n constructor(private readonly dbPath = getCacheDbPath()) {}\n\n async initialize(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.dbPath), { recursive: true });\n this.db = new DatabaseSync(this.dbPath);\n this.db.exec('PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; PRAGMA busy_timeout = 1000;');\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS file_cache_v3 (\n file_path TEXT PRIMARY KEY,\n mtime REAL NOT NULL,\n fingerprint TEXT NOT NULL,\n tags TEXT NOT NULL\n )\n `);\n this.select = this.db.prepare('SELECT mtime, fingerprint, tags FROM file_cache_v3 WHERE file_path = ?');\n this.insert = this.db.prepare(`\n INSERT INTO file_cache_v3 (file_path, mtime, fingerprint, tags) VALUES (?, ?, ?, ?)\n ON CONFLICT(file_path) DO UPDATE SET mtime = excluded.mtime, fingerprint = excluded.fingerprint, tags = excluded.tags\n `);\n } catch (error) {\n logger.warn('[CacheManager] Persistent cache unavailable:', error);\n this.close();\n }\n }\n\n async getFileCache(file: string): Promise<{ tags: Tag[]; mtime: number; fingerprint: string } | null> {\n try {\n const result = this.select?.get(file) as { tags: string; mtime: number; fingerprint: string } | undefined;\n if (!result) return null;\n const stored = JSON.parse(result.tags) as {\n relative: string;\n tags: [number, string, Tag['kind'], number?][];\n };\n return {\n ...result,\n tags: stored.tags.map(([line, name, kind, count]) => ({\n fname: file,\n rel_fname: stored.relative,\n line,\n name,\n kind,\n count,\n })),\n };\n } catch (error) {\n logger.warn(`[CacheManager] Failed to read ${file}:`, error);\n return null;\n }\n }\n\n async setFileCache(file: string, mtime: number, tags: Tag[], fingerprint = String(mtime)): Promise<void> {\n try {\n this.insert?.run(\n file,\n mtime,\n fingerprint,\n JSON.stringify({\n relative: tags[0]?.rel_fname ?? file,\n tags: tags.map((tag) => [tag.line, tag.name, tag.kind, tag.count]),\n }),\n );\n } catch (error) {\n logger.warn(`[CacheManager] Failed to cache ${file}:`, error);\n }\n }\n\n async getFileMtime(file: string): Promise<number | null> {\n try {\n return (await fs.stat(file)).mtimeMs;\n } catch {\n return null;\n }\n }\n\n async clearCache(): Promise<void> {\n this.db?.exec('DELETE FROM file_cache_v3');\n }\n\n close(): void {\n this.select = undefined;\n this.insert = undefined;\n this.db?.close();\n this.db = null;\n }\n}\n", "import * as path from 'path';\n\nimport { glob } from 'glob';\nimport { Minimatch } from 'minimatch';\nimport { simpleGit } from 'simple-git';\n\nimport logger from './logger';\n\nconst DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '.git/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n 'out/**',\n 'coverage/**',\n '*.min.js',\n '*.min.css',\n '.DS_Store',\n 'Thumbs.db',\n '*.log',\n '*.lock',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n];\n\nconst getAllFilesFromGit = async (baseDir: string): Promise<string[] | null> => {\n try {\n const result = await simpleGit(baseDir).raw(['ls-files', '-z']);\n return result\n .split(String.fromCharCode(0))\n .filter(Boolean)\n .map((file) => path.resolve(baseDir, file));\n } catch (error) {\n logger.debug('Git discovery unavailable, falling back to filesystem', error);\n return null;\n }\n};\n\nexport const getAllFiles = async (baseDir: string, excludePatterns: string[] = []): Promise<string[]> => {\n const ignore = [...DEFAULT_IGNORE_PATTERNS, ...excludePatterns];\n const matchers = ignore.map((pattern) => ({\n regex: new Minimatch(pattern, { dot: true }).makeRe(),\n basename: !pattern.includes('/'),\n }));\n const gitFiles = await getAllFilesFromGit(baseDir);\n if (gitFiles !== null) {\n return gitFiles.filter((file) => {\n const relative = path.relative(baseDir, file).split(path.sep).join('/');\n const basename = path.basename(file);\n return !matchers.some((matcher) => matcher.regex && matcher.regex.test(matcher.basename ? basename : relative));\n });\n }\n try {\n return await glob('**/*', { cwd: baseDir, nodir: true, absolute: true, dot: false, ignore });\n } catch (error) {\n logger.error('Failed to discover repository files:', error);\n return [];\n }\n};\n", "// @ts-ignore - graphology types are incomplete\nimport Graph from 'graphology';\n\nimport { Tag } from './types';\nimport logger from './logger';\n\nexport class GraphBuilder {\n buildDependencyGraph(tags: Tag[]): {\n graph: Graph;\n defines: Map<string, Set<string>>;\n references: Map<string, string[]>;\n } {\n const graph = new Graph({ type: 'directed', allowSelfLoops: false, multi: true });\n\n const defines = new Map<string, Set<string>>();\n const references = new Map<string, string[]>();\n const definitions = new Map<string, Tag[]>();\n\n // Build mappings\n for (const tag of tags) {\n if (tag.kind === 'def') {\n if (!defines.has(tag.name)) {\n defines.set(tag.name, new Set());\n }\n defines.get(tag.name)!.add(tag.rel_fname);\n\n const key = `${tag.rel_fname}:${tag.name}`;\n if (!definitions.has(key)) {\n definitions.set(key, []);\n }\n definitions.get(key)!.push(tag);\n } else if (tag.kind === 'ref') {\n if (!references.has(tag.name)) {\n references.set(tag.name, []);\n }\n references.get(tag.name)!.push(tag.rel_fname);\n }\n }\n\n // Build graph edges\n const idents = new Set(Array.from(defines.keys()).filter((k) => references.has(k)));\n\n for (const ident of Array.from(idents)) {\n const definers = Array.from(defines.get(ident) || []);\n const referencers = references.get(ident) || [];\n\n // Calculate weight multiplier\n let mul = 1.0;\n if (this.isSnakeCase(ident) || this.isKebabCase(ident) || this.isCamelCase(ident)) {\n mul *= 10;\n }\n if (ident.startsWith('_')) {\n mul *= 0.1;\n }\n if (definers.length > 5) {\n mul *= 0.1; // Very common symbol\n }\n\n // Count references per file\n const refCounts = new Map<string, number>();\n for (const ref of referencers) {\n refCounts.set(ref, (refCounts.get(ref) || 0) + 1);\n }\n\n // Add edges\n for (const referencer of referencers) {\n const numRefs = refCounts.get(referencer) || 1;\n const weight = mul * Math.sqrt(numRefs);\n\n for (const definer of definers) {\n if (referencer !== definer) {\n if (!graph.hasNode(referencer)) {\n graph.addNode(referencer);\n }\n if (!graph.hasNode(definer)) {\n graph.addNode(definer);\n }\n\n const edgeKey = `${referencer}->${definer}:${ident}`;\n if (!graph.hasEdge(edgeKey)) {\n graph.addEdgeWithKey(edgeKey, referencer, definer, { weight, ident });\n }\n }\n }\n }\n }\n\n logger.info(`[GraphBuilder] Built graph with ${graph.order} nodes and ${graph.size} edges`);\n\n return { graph, defines, references };\n }\n\n private isSnakeCase(str: string): boolean {\n return /^[a-z][a-z0-9_]*$/.test(str) && str.includes('_');\n }\n\n private isKebabCase(str: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(str) && str.includes('-');\n }\n\n private isCamelCase(str: string): boolean {\n return /^[a-z][a-zA-Z0-9]*$/.test(str) && /[A-Z]/.test(str);\n }\n}\n", "// @ts-ignore - graphology types are incomplete\nimport Graph from 'graphology';\n// @ts-ignore - graphology-metrics types are incomplete\nimport pagerank from 'graphology-metrics/centrality/pagerank';\n\nimport { RankedDefinition, Tag } from './types';\nimport logger from './logger';\n\nexport class PageRankCalculator {\n calculate(graph: Graph, tags: Tag[], mentionedFiles?: Set<string>, mentionedIdents?: Set<string>): RankedDefinition[] {\n if (graph.order === 0) {\n return [];\n }\n\n // Build personalization vector\n const personalization: Record<string, number> = {};\n const nodes = graph.nodes();\n const personalize = nodes.length > 0 ? 100 / nodes.length : 0;\n\n for (const node of nodes) {\n let score = 0;\n if (mentionedFiles?.has(node)) {\n score += personalize;\n }\n if (mentionedIdents) {\n // Check if any mentioned ident is defined in this file\n const fileTags = tags.filter((t) => t.rel_fname === node && t.kind === 'def');\n if (fileTags.some((t) => mentionedIdents.has(t.name))) {\n score += personalize;\n }\n }\n if (score > 0) {\n personalization[node] = score;\n }\n }\n\n try {\n // Calculate PageRank\n const pagerankOptions: Record<string, unknown> = {\n alpha: 0.85,\n maxIterations: 100,\n tolerance: 1e-6,\n };\n\n if (Object.keys(personalization).length > 0) {\n pagerankOptions.personalization = personalization;\n }\n\n const ranks = pagerank(graph, pagerankOptions as Parameters<typeof pagerank>[1]);\n\n // Distribute rank across definitions\n const rankedDefinitions: RankedDefinition[] = [];\n const definitions = tags.filter((t) => t.kind === 'def');\n\n for (const def of definitions) {\n const nodeRank = ranks[def.rel_fname] || 0;\n\n // Calculate edge contribution\n let edgeRank = nodeRank;\n if (graph.hasNode(def.rel_fname)) {\n graph.forEachOutboundEdge(def.rel_fname, (edge) => {\n const weight = graph.getEdgeAttribute(edge, 'weight') as number;\n const totalWeight = this.getTotalOutboundWeight(graph, def.rel_fname);\n if (totalWeight > 0) {\n edgeRank += nodeRank * (weight / totalWeight);\n }\n });\n }\n\n rankedDefinitions.push({\n rel_fname: def.rel_fname,\n name: def.name,\n rank: edgeRank,\n line: def.line,\n });\n }\n\n // Sort by rank\n rankedDefinitions.sort((a, b) => b.rank - a.rank);\n\n logger.info(`[PageRankCalculator] Calculated ranks for ${rankedDefinitions.length} definitions`);\n\n return rankedDefinitions;\n } catch (error) {\n logger.error('[PageRankCalculator] Error calculating PageRank:', error);\n return [];\n }\n }\n\n private getTotalOutboundWeight(graph: Graph, node: string): number {\n if (!graph.hasNode(node)) {\n return 0;\n }\n let total = 0;\n graph.forEachOutboundEdge(node, (edge) => {\n total += (graph.getEdgeAttribute(edge, 'weight') as number) || 1;\n });\n return total;\n }\n}\n", "import * as path from 'path';\nimport { Worker } from 'worker_threads';\n\nimport { RepoMapOptions } from './types';\n\nexport type RepoMapRequest = {\n id: number;\n options: Omit<RepoMapOptions, 'signal'>;\n};\n\nexport type RepoMapResponse = {\n id: number;\n output?: string;\n error?: string;\n};\n\ntype Subscriber = {\n resolve: (output: string) => void;\n reject: (error: Error) => void;\n cleanup: () => void;\n};\n\ntype Job = RepoMapRequest & {\n key: string;\n subscribers: Set<Subscriber>;\n};\n\nexport class RepoMapService {\n private worker: Worker | undefined;\n private active: Job | undefined;\n private jobs = new Map<string, Job>();\n private queue: Job[] = [];\n private sequence = 0;\n private idleTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(private readonly options: { cachePath?: string } = {}) {}\n\n getRepoMap(options: RepoMapOptions): Promise<string> {\n if (options.signal?.aborted) return Promise.reject(new Error('Repository map cancelled', { cause: options.signal.reason }));\n const root = path.resolve(options.root);\n const { signal, ...serializable } = options;\n const request = { ...serializable, root };\n const key = JSON.stringify([\n root,\n request.files,\n request.excludePatterns,\n request.maxLines,\n request.prepareOnly,\n [...(request.mentionedFiles ?? [])].sort(),\n [...(request.mentionedIdents ?? [])].sort(),\n [...(request.chatFiles ?? [])].sort(),\n ]);\n let job = this.jobs.get(key);\n if (!job) {\n if (this.jobs.size >= 64) return Promise.reject(new Error('Repository map queue is full'));\n job = {\n id: ++this.sequence,\n key,\n options: request,\n subscribers: new Set(),\n };\n this.jobs.set(key, job);\n this.queue.push(job);\n }\n const pending = job;\n return new Promise<string>((resolve, reject) => {\n const abort = () => {\n subscriber.cleanup();\n pending.subscribers.delete(subscriber);\n reject(new Error('Repository map cancelled', { cause: signal?.reason }));\n if (!pending.subscribers.size) {\n this.jobs.delete(pending.key);\n this.queue = this.queue.filter((queued) => queued !== pending);\n if (this.active === pending) {\n this.stopWorker();\n this.active = undefined;\n }\n this.schedule();\n }\n };\n const subscriber: Subscriber = {\n resolve,\n reject,\n cleanup: () => signal?.removeEventListener('abort', abort),\n };\n pending.subscribers.add(subscriber);\n signal?.addEventListener('abort', abort, { once: true });\n this.schedule();\n });\n }\n\n private schedule(): void {\n if (this.active) return;\n const next = this.queue.shift();\n if (!next) return;\n clearTimeout(this.idleTimer);\n this.active = next;\n try {\n if (!this.worker) {\n const worker = new Worker(path.join(__dirname, 'repo-map-worker.js'), {\n workerData: this.options,\n resourceLimits: { maxOldGenerationSizeMb: 512 },\n });\n this.worker = worker;\n worker.on('message', (response: RepoMapResponse) => {\n if (this.worker !== worker || this.active?.id !== response.id) return;\n this.finish(response);\n });\n worker.on('error', (error) => {\n if (this.worker !== worker) return;\n this.stopWorker();\n if (this.active) this.finish({ id: this.active.id, error: error.message });\n });\n worker.on('exit', (code) => {\n if (this.worker !== worker) return;\n this.worker = undefined;\n if (this.active)\n this.finish({\n id: this.active.id,\n error: `Repository map worker exited (${code})`,\n });\n });\n }\n this.worker.ref();\n this.worker.postMessage({\n id: next.id,\n options: next.options,\n } satisfies RepoMapRequest);\n } catch (error) {\n this.stopWorker();\n this.finish({ id: next.id, error: String(error) });\n }\n }\n\n private finish(response: RepoMapResponse): void {\n const job = this.active;\n if (!job) return;\n this.jobs.delete(job.key);\n this.active = undefined;\n for (const subscriber of job.subscribers) {\n subscriber.cleanup();\n if (response.error !== undefined) subscriber.reject(new Error(response.error));\n else subscriber.resolve(response.output ?? '');\n }\n this.worker?.unref();\n this.idleTimer = setTimeout(() => this.stopWorker(), 5 * 60 * 1000);\n this.idleTimer.unref();\n this.schedule();\n }\n\n private stopWorker(): void {\n const worker = this.worker;\n this.worker = undefined;\n void worker?.terminate();\n }\n\n dispose(): void {\n clearTimeout(this.idleTimer);\n this.stopWorker();\n for (const job of this.jobs.values()) {\n for (const subscriber of job.subscribers) {\n subscriber.cleanup();\n subscriber.reject(new Error('Repository map service disposed'));\n }\n }\n this.jobs.clear();\n this.queue = [];\n this.active = undefined;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "fs", "path", "path", "platform", "buffer", "path", "relative", "name", "fs", "path", "relative", "fs", "path", "fs", "path", "os", "path", "relative", "basename", "files", "detectLanguage", "Graph", "pagerank", "path", "resolve"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const extractChatWords: (chatText: string) => Set<string>;
|
|
2
|
+
export declare const matchMentionedFiles: (chatWords: Set<string>, files: string[]) => Set<string>;
|
|
3
|
+
export declare const matchMentionedIdents: (chatWords: Set<string>, idents: string[]) => Set<string>;
|
|
4
|
+
//# sourceMappingURL=mention-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mention-extractor.d.ts","sourceRoot":"","sources":["../src/mention-extractor.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,KAAG,GAAG,CAAC,MAAM,CAE7D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM,EAAE,KAAG,GAAG,CAAC,MAAM,CAWvF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,WAAW,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,MAAM,EAAE,KAAG,GAAG,CAAC,MAAM,CAQzF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { RepoMapOptions } from './types';
|
|
2
|
+
export type RepoMapRequest = {
|
|
3
|
+
id: number;
|
|
4
|
+
options: Omit<RepoMapOptions, 'signal'>;
|
|
5
|
+
};
|
|
6
|
+
export type RepoMapResponse = {
|
|
7
|
+
id: number;
|
|
8
|
+
output?: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare class RepoMapService {
|
|
12
|
+
private readonly options;
|
|
13
|
+
private worker;
|
|
14
|
+
private active;
|
|
15
|
+
private jobs;
|
|
16
|
+
private queue;
|
|
17
|
+
private sequence;
|
|
18
|
+
private idleTimer;
|
|
19
|
+
constructor(options?: {
|
|
20
|
+
cachePath?: string;
|
|
21
|
+
});
|
|
22
|
+
getRepoMap(options: RepoMapOptions): Promise<string>;
|
|
23
|
+
private schedule;
|
|
24
|
+
private finish;
|
|
25
|
+
private stopWorker;
|
|
26
|
+
dispose(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=repo-map-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-map-service.d.ts","sourceRoot":"","sources":["../src/repo-map-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAaF,qBAAa,cAAc;IAQb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAA4C;gBAEhC,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAEjE,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAsDpD,OAAO,CAAC,QAAQ;IA2ChB,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,UAAU;IAMlB,OAAO,IAAI,IAAI;CAahB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-map-worker.d.ts","sourceRoot":"","sources":["../src/repo-map-worker.ts"],"names":[],"mappings":""}
|