@aiready/ast-mcp-server 0.1.3 → 0.1.4

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/dist/index.cjs CHANGED
@@ -384,7 +384,7 @@ var SymbolIndex = class {
384
384
  process.memoryUsage().heapUsed / 1024 / 1024
385
385
  );
386
386
  }
387
- } catch (e) {
387
+ } catch {
388
388
  }
389
389
  }
390
390
  const tsconfigs = await projectManager.getProjectsForPath(safeRoot);
@@ -523,10 +523,6 @@ var WorkerPool = class {
523
523
  } else {
524
524
  task.resolve(msg.result);
525
525
  }
526
- const worker = this.workers.find(
527
- (w) => !this.available.includes(w) && ![...this.activeJobs.values()].some((t) => t.id === msg.id)
528
- // simplistic
529
- );
530
526
  }
531
527
  handleWorkerError(worker, err) {
532
528
  const idx = this.workers.indexOf(worker);
@@ -536,7 +532,7 @@ var WorkerPool = class {
536
532
  const workerPath = import_path4.default.join(__dirname, "ast-worker.js");
537
533
  const newWorker = new import_worker_threads.Worker(workerPath);
538
534
  newWorker.on("message", (msg) => this.handleResult(msg));
539
- newWorker.on("error", (e) => this.handleWorkerError(newWorker, e));
535
+ newWorker.on("error", (_e) => this.handleWorkerError(newWorker, _e));
540
536
  this.workers[idx] = newWorker;
541
537
  this.available.push(newWorker);
542
538
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","../src/security.ts","../src/tools/search-code.ts","../src/index.ts","../src/schemas.ts","../src/tools/resolve-definition.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import path from 'path';\nimport fs from 'fs';\n\nexport function resolveWorkspaceRoot(): string {\n return process.env.AST_WORKSPACE_ROOT || process.cwd();\n}\n\nexport function validateWorkspacePath(inputPath: string): string {\n const root = resolveWorkspaceRoot();\n const resolved = path.resolve(root, inputPath);\n const normalized = path.normalize(resolved);\n\n // Reject path traversal\n if (!normalized.startsWith(root)) {\n throw new Error(\n `Path traversal detected: ${inputPath} escapes workspace root`\n );\n }\n\n // Reject null bytes\n if (normalized.includes('\\0')) {\n throw new Error('Path contains null bytes');\n }\n\n return normalized;\n}\n\nexport function validateFileExists(filePath: string): string {\n const safe = validateWorkspacePath(filePath);\n if (!fs.existsSync(safe)) {\n throw new Error(`File not found: ${filePath}`);\n }\n if (!fs.statSync(safe).isFile()) {\n throw new Error(`Not a file: ${filePath}`);\n }\n return safe;\n}\n","import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { rgPath } from '@vscode/ripgrep';\nimport { validateWorkspacePath } from '../security.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface SearchResult {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nexport async function searchCode(\n pattern: string,\n searchPath: string,\n filePattern?: string,\n limit: number = 50,\n regex: boolean = true\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = [\n '--json',\n '--max-count',\n limit.toString(),\n '--max-columns',\n '500',\n ];\n\n if (!regex) {\n args.push('--fixed-strings');\n }\n\n args.push(pattern, safePath);\n\n if (filePattern) {\n args.push('--glob', filePattern);\n }\n\n // Common exclusions\n args.push('--glob', '!**/node_modules/**');\n args.push('--glob', '!**/dist/**');\n args.push('--glob', '!**/.git/**');\n\n try {\n const { stdout } = await execFileAsync(rgPath, args);\n const lines = stdout.split('\\n').filter(Boolean);\n const results: SearchResult[] = [];\n\n for (const line of lines) {\n const data = JSON.parse(line);\n if (data.type === 'match') {\n const file = data.data.path.text;\n const lineNumber = data.data.line_number;\n const submatches = data.data.submatches;\n\n for (const submatch of submatches) {\n results.push({\n file,\n line: lineNumber,\n column: submatch.start,\n text: data.data.lines.text.trim(),\n });\n }\n }\n }\n\n return results.slice(0, limit);\n } catch (error: any) {\n if (error.code === 1) {\n // rg returns 1 if no matches found\n return [];\n }\n throw error;\n }\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind } from 'ts-morph';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) return { references: [], total_count: 0 };\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const sf = ref.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(ref.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text: ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n references: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n\n public async findImplementations(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ implementations: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { implementations: [], total_count: 0 };\n\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { implementations: [], total_count: 0 };\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<{\n implementations: ReferenceLocation[];\n total_count: number;\n }>('find_implementations', {\n tsconfig,\n file: hit.file,\n symbol: symbolName,\n });\n\n // Apply pagination\n return {\n implementations: result.implementations.slice(offset, offset + limit),\n total_count: result.total_count,\n };\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { implementations: [], total_count: 0 };\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { implementations: [], total_count: 0 };\n\n const targetNode = exported[0];\n if (\n !Node.isClassDeclaration(targetNode) &&\n !Node.isInterfaceDeclaration(targetNode)\n ) {\n return { implementations: [], total_count: 0 };\n }\n\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const results: ReferenceLocation[] = [];\n const implementations = (targetNode as any).getImplementations?.();\n if (implementations) {\n for (const impl of implementations) {\n const sf = impl.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(impl.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n implementations: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n }\n\n public async getFileStructure(\n filePath: string\n ): Promise<FileStructure | undefined> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n if (!sourceFile) return undefined;\n\n const structure: FileStructure = {\n file: safePath,\n imports: sourceFile.getImportDeclarations().map((imp: any) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni: any) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym: any) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile\n .getClasses()\n .map((cls: any) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn: any) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf: any) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta: any) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm: any) => this.mapToEnumInfo(enm)),\n };\n\n return structure;\n }\n\n public async shutdown(): Promise<void> {\n await this.pool.terminate();\n }\n\n private mapToDefinitionLocation(node: Node): DefinitionLocation {\n const sourceFile = node.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(node.getStart());\n\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: this.mapNodeToSymbolKind(node),\n snippet: node.getText(),\n documentation: this.getJsDoc(node),\n };\n }\n\n private mapNodeToSymbolKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n private mapSymbolKind(symbol: any): SymbolKind {\n const decls = symbol.getDeclarations();\n if (decls.length > 0) return this.mapNodeToSymbolKind(decls[0]);\n return 'variable';\n }\n\n private getJsDoc(node: Node): string | undefined {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n }\n\n public getSymbolDocs(node: Node) {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n const doc = docs[0];\n return {\n documentation: doc.getCommentText(),\n tags: doc.getTags().map((tag) => ({\n name: tag.getTagName(),\n text: tag.getCommentText() || '',\n })),\n };\n }\n }\n return undefined;\n }\n\n private mapToClassInfo(cls: any): ClassInfo {\n return {\n name: cls.getName() || 'anonymous',\n ...this.getSymbolDocs(cls),\n methods: cls.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n properties: cls\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n };\n }\n\n private mapToFunctionInfo(fn: any): FunctionInfo {\n return {\n name: fn.getName() || 'anonymous',\n ...this.getSymbolDocs(fn),\n params: fn.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: fn.getReturnType().getText(),\n };\n }\n\n private mapToPropertyInfo(p: any) {\n return {\n name: p.getName(),\n type: p.getType().getText(),\n ...this.getSymbolDocs(p),\n };\n }\n\n private mapToInterfaceInfo(itf: any): InterfaceInfo {\n return {\n name: itf.getName(),\n ...this.getSymbolDocs(itf),\n properties: itf\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n methods: itf.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n };\n }\n\n private mapToTypeAliasInfo(ta: any): TypeAliasInfo {\n return {\n name: ta.getName(),\n type: ta.getType().getText(),\n ...this.getSymbolDocs(ta),\n };\n }\n\n private mapToEnumInfo(enm: any): EnumInfo {\n return {\n name: enm.getName(),\n ...this.getSymbolDocs(enm),\n members: enm.getMembers().map((m: any) => m.getName()),\n };\n }\n\n private deduplicateLocations<\n T extends { file: string; line: number; column: number },\n >(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport const typescriptAdapter = new TypeScriptAdapter();\n","import { Project } from 'ts-morph';\nimport path from 'path';\nimport fs from 'fs';\nimport { glob } from 'glob';\nimport { validateWorkspacePath } from './security.js';\n\n/**\n * ProjectManager handles tsconfig discovery and Project lifecycle.\n * One Project per tsconfig.json to handle monorepo project boundaries correctly.\n */\nexport class ProjectManager {\n private projects: Map<string, Project> = new Map();\n private tsconfigCache: Map<string, string[]> = new Map();\n private accessOrder: string[] = []; // MRU at front\n private maxProjects: number = 4;\n\n /**\n * Find all tsconfig.json files in a directory (recursive)\n */\n public async findTsConfigs(rootDir: string): Promise<string[]> {\n const safeRoot = validateWorkspacePath(rootDir);\n if (this.tsconfigCache.has(safeRoot)) {\n return this.tsconfigCache.get(safeRoot)!;\n }\n\n const configs = await glob('**/tsconfig.json', {\n cwd: safeRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n this.tsconfigCache.set(safeRoot, configs);\n return configs;\n }\n\n /**\n * Ensure a Project exists for a given tsconfig path, managing LRU cache\n */\n public ensureProject(tsconfigPath: string): Project {\n this.checkMemoryPressure();\n\n // Cache hit\n if (this.projects.has(tsconfigPath)) {\n this.moveToFront(tsconfigPath);\n return this.projects.get(tsconfigPath)!;\n }\n\n // Evict if full\n while (this.projects.size >= this.maxProjects) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n\n // Create with lazy file loading\n const project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true, // KEY: don't load all files\n });\n\n this.projects.set(tsconfigPath, project);\n this.accessOrder.unshift(tsconfigPath);\n return project;\n }\n\n /**\n * Move a tsconfig path to the front of the access order (MRU)\n */\n private moveToFront(tsconfigPath: string) {\n const index = this.accessOrder.indexOf(tsconfigPath);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n this.accessOrder.unshift(tsconfigPath);\n }\n }\n\n private checkMemoryPressure(): void {\n const heapUsed = process.memoryUsage().heapUsed / 1024 / 1024;\n const maxHeap = parseInt(process.env.AST_MAX_HEAP_MB || '1536', 10);\n\n while (heapUsed > maxHeap && this.projects.size > 1) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n }\n\n public disposeProject(tsconfigPath: string): void {\n const project = this.projects.get(tsconfigPath);\n if (project) {\n // Forget files explicitly\n for (const sourceFile of project.getSourceFiles()) {\n project.removeSourceFile(sourceFile);\n }\n this.projects.delete(tsconfigPath);\n }\n }\n\n /**\n * Find the nearest tsconfig.json for a file\n */\n public async findNearestTsConfig(\n filePath: string\n ): Promise<string | undefined> {\n const safePath = validateWorkspacePath(filePath);\n let currentDir = path.dirname(safePath);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const tsconfigPath = path.join(currentDir, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n return tsconfigPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return undefined;\n }\n\n /**\n * Get all tsconfigs for a path\n */\n public async getProjectsForPath(rootDir: string): Promise<string[]> {\n return this.findTsConfigs(rootDir);\n }\n\n /**\n * Dispose all projects to free memory\n */\n public disposeAll(): void {\n for (const [key] of this.projects) {\n this.disposeProject(key);\n }\n this.accessOrder = [];\n }\n}\n\nexport const projectManager = new ProjectManager();\n","import { projectManager } from '../project-manager.js';\nimport { IndexingStats, SymbolKind } from '../types.js';\nimport { validateWorkspacePath } from '../security.js';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport { Node, ExportedDeclarations } from 'ts-morph';\n\nexport interface SymbolEntry {\n name: string;\n kind: SymbolKind;\n file: string;\n line: number;\n column: number;\n exported: boolean;\n}\n\nexport interface DiskCache {\n version: 1;\n rootDir: string;\n builtAt: string;\n fileHashes: Record<string, number>; // file -> mtimeMs\n symbols: Record<string, SymbolEntry[]>;\n}\n\nexport class SymbolIndex {\n private index: Record<string, SymbolEntry[]> = {};\n\n private getCachePath(rootDir: string): string {\n const hash = crypto\n .createHash('sha256')\n .update(rootDir)\n .digest('hex')\n .slice(0, 12);\n return path.join(\n process.platform === 'win32' ? process.env.TEMP || 'c:/temp' : '/tmp',\n `ast-index-${hash}.json`\n );\n }\n\n private isCacheValid(cached: DiskCache, rootDir: string): boolean {\n if (cached.rootDir !== rootDir) return false;\n\n for (const [file, cachedMtime] of Object.entries(cached.fileHashes)) {\n if (!fs.existsSync(file)) return false;\n if (fs.statSync(file).mtimeMs !== cachedMtime) return false;\n }\n\n return true;\n }\n\n private computeStats(\n cache: DiskCache,\n duration_ms?: number,\n memory_mb?: number\n ): IndexingStats {\n const files = Object.keys(cache.fileHashes).length;\n let functions = 0;\n let classes = 0;\n let interfaces = 0;\n let types = 0;\n\n for (const entries of Object.values(cache.symbols)) {\n for (const entry of entries) {\n if (entry.kind === 'function' || entry.kind === 'method') functions++;\n if (entry.kind === 'class') classes++;\n if (entry.kind === 'interface') interfaces++;\n if (entry.kind === 'type_alias') types++;\n }\n }\n\n return {\n indexed: {\n files,\n functions,\n classes,\n interfaces,\n types,\n },\n duration_ms: duration_ms || 0,\n memory_mb: memory_mb || 0,\n };\n }\n\n private mapKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n /**\n * Build/Warm the index for a given path\n */\n public async buildIndex(rootDir: string): Promise<IndexingStats> {\n const startTime = Date.now();\n const safeRoot = validateWorkspacePath(rootDir);\n const cachePath = this.getCachePath(safeRoot);\n\n if (fs.existsSync(cachePath)) {\n try {\n const cached: DiskCache = JSON.parse(\n fs.readFileSync(cachePath, 'utf-8')\n );\n if (this.isCacheValid(cached, safeRoot)) {\n this.index = cached.symbols;\n return this.computeStats(\n cached,\n Date.now() - startTime,\n process.memoryUsage().heapUsed / 1024 / 1024\n );\n }\n } catch (e) {\n // Corrupt cache, ignore\n }\n }\n\n const tsconfigs = await projectManager.getProjectsForPath(safeRoot);\n const symbols: Record<string, SymbolEntry[]> = {};\n const fileHashes: Record<string, number> = {};\n\n for (const config of tsconfigs) {\n const project = projectManager.ensureProject(config);\n // We need to force load files for indexing\n project.addSourceFilesFromTsConfig(config);\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n try {\n fileHashes[filePath] = fs.statSync(filePath).mtimeMs;\n } catch {\n continue;\n }\n\n // Extract exported declarations\n for (const [name, decls] of sourceFile.getExportedDeclarations()) {\n for (const decl of decls) {\n const entry: SymbolEntry = {\n name,\n kind: this.mapKind(decl as Node),\n file: filePath,\n line: decl.getStartLineNumber(),\n column: decl.getStart() - decl.getStartLinePos(),\n exported: true,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n\n // Extract non-exported top-level declarations\n for (const fn of sourceFile.getFunctions()) {\n const name = fn.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === fn.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'function',\n file: filePath,\n line: fn.getStartLineNumber(),\n column: fn.getStart() - fn.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n for (const cls of sourceFile.getClasses()) {\n const name = cls.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === cls.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'class',\n file: filePath,\n line: cls.getStartLineNumber(),\n column: cls.getStart() - cls.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n }\n }\n\n const cache: DiskCache = {\n version: 1,\n rootDir: safeRoot,\n builtAt: new Date().toISOString(),\n fileHashes,\n symbols,\n };\n\n fs.mkdirSync(path.dirname(cachePath), { recursive: true });\n fs.writeFileSync(cachePath, JSON.stringify(cache));\n\n this.index = symbols;\n\n const duration = Date.now() - startTime;\n const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;\n\n return this.computeStats(cache, duration, Math.round(memoryUsage));\n }\n\n public lookup(name: string): SymbolEntry[] {\n return this.index[name] || [];\n }\n\n public lookupByFile(file: string): SymbolEntry[] {\n return Object.values(this.index)\n .flat()\n .filter((e) => e.file === file);\n }\n}\n\nexport const symbolIndex = new SymbolIndex();\n","import { Worker } from 'worker_threads';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface WorkerTask<T> {\n id: string;\n type: string;\n payload: unknown;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private available: Worker[] = [];\n private queue: WorkerTask<unknown>[] = [];\n private activeJobs = new Map<string, WorkerTask<unknown>>();\n private taskId = 0;\n\n constructor(private poolSize: number) {}\n\n async init(): Promise<void> {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js'); // Assuming tsup builds this\n\n for (let i = 0; i < this.poolSize; i++) {\n const worker = new Worker(workerPath);\n worker.on('message', (msg) => this.handleResult(msg));\n worker.on('error', (err) => this.handleWorkerError(worker, err));\n this.workers.push(worker);\n this.available.push(worker);\n }\n }\n\n async execute<T>(type: string, payload: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = String(++this.taskId);\n const task: WorkerTask<T> = { id, type, payload, resolve, reject };\n\n const worker = this.available.pop();\n if (worker) {\n this.dispatch(worker, task);\n } else {\n this.queue.push(task as WorkerTask<unknown>);\n }\n });\n }\n\n private dispatch<T>(worker: Worker, task: WorkerTask<T>): void {\n this.activeJobs.set(task.id, task as WorkerTask<unknown>);\n worker.postMessage({ id: task.id, type: task.type, payload: task.payload });\n }\n\n private handleResult(msg: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n const task = this.activeJobs.get(msg.id);\n if (!task) return;\n\n this.activeJobs.delete(msg.id);\n\n if (msg.error) {\n task.reject(new Error(msg.error));\n } else {\n task.resolve(msg.result);\n }\n\n // Return worker to pool\n const worker = this.workers.find(\n (w) =>\n !this.available.includes(w) &&\n ![...this.activeJobs.values()].some((t) => t.id === msg.id) // simplistic\n );\n // properly finding the worker is tricky without storing mapping.\n // let's just make it simpler: each message comes from a worker, but we don't know which one.\n // Actually, worker.on('message') should be tied to the worker!\n }\n\n private handleWorkerError(worker: Worker, err: Error): void {\n const idx = this.workers.indexOf(worker);\n if (idx !== -1) {\n worker.terminate();\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js');\n const newWorker = new Worker(workerPath);\n newWorker.on('message', (msg) => this.handleResult(msg));\n newWorker.on('error', (e) => this.handleWorkerError(newWorker, e));\n this.workers[idx] = newWorker;\n this.available.push(newWorker);\n }\n }\n\n async terminate(): Promise<void> {\n await Promise.all(this.workers.map((w) => w.terminate()));\n this.workers = [];\n this.available = [];\n }\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findReferences(symbol, path, limit, offset);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function getFileStructure(file: string) {\n return await typescriptAdapter.getFileStructure(file);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind, Node } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nexport async function getSymbolDocs(\n symbol: string,\n filePath: string\n): Promise<any> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n\n if (sourceFile) {\n const node = sourceFile\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .find((id: Node) => id.getText() === symbol);\n\n if (node) {\n const decls = node.getSymbol()?.getDeclarations();\n if (decls && decls.length > 0) {\n const docs = typescriptAdapter.getSymbolDocs(decls[0]);\n if (docs) {\n return {\n symbol,\n file: sourceFile.getFilePath(),\n line: sourceFile.getLineAndColumnAtPos(decls[0].getStart()).line,\n ...docs,\n };\n }\n }\n }\n }\n\n return undefined;\n}\n","import { symbolIndex } from '../index/symbol-index.js';\n\nexport async function buildSymbolIndex(path: string) {\n return await symbolIndex.buildIndex(path);\n}\n"],"mappings":"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","names":["path","import_ts_morph","import_fs","import_path","path","fs","import_fs","import_path","import_ts_morph","crypto","path","fs","import_path","path","path","tsconfig","fs","searchCode","path","path","path","import_ts_morph","path","path"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","../src/security.ts","../src/tools/search-code.ts","../src/index.ts","../src/schemas.ts","../src/tools/resolve-definition.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import path from 'path';\nimport fs from 'fs';\n\nexport function resolveWorkspaceRoot(): string {\n return process.env.AST_WORKSPACE_ROOT || process.cwd();\n}\n\nexport function validateWorkspacePath(inputPath: string): string {\n const root = resolveWorkspaceRoot();\n const resolved = path.resolve(root, inputPath);\n const normalized = path.normalize(resolved);\n\n // Reject path traversal\n if (!normalized.startsWith(root)) {\n throw new Error(\n `Path traversal detected: ${inputPath} escapes workspace root`\n );\n }\n\n // Reject null bytes\n if (normalized.includes('\\0')) {\n throw new Error('Path contains null bytes');\n }\n\n return normalized;\n}\n\nexport function validateFileExists(filePath: string): string {\n const safe = validateWorkspacePath(filePath);\n if (!fs.existsSync(safe)) {\n throw new Error(`File not found: ${filePath}`);\n }\n if (!fs.statSync(safe).isFile()) {\n throw new Error(`Not a file: ${filePath}`);\n }\n return safe;\n}\n","import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { rgPath } from '@vscode/ripgrep';\nimport { validateWorkspacePath } from '../security.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface SearchResult {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nexport async function searchCode(\n pattern: string,\n searchPath: string,\n filePattern?: string,\n limit: number = 50,\n regex: boolean = true\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = [\n '--json',\n '--max-count',\n limit.toString(),\n '--max-columns',\n '500',\n ];\n\n if (!regex) {\n args.push('--fixed-strings');\n }\n\n args.push(pattern, safePath);\n\n if (filePattern) {\n args.push('--glob', filePattern);\n }\n\n // Common exclusions\n args.push('--glob', '!**/node_modules/**');\n args.push('--glob', '!**/dist/**');\n args.push('--glob', '!**/.git/**');\n\n try {\n const { stdout } = await execFileAsync(rgPath, args);\n const lines = stdout.split('\\n').filter(Boolean);\n const results: SearchResult[] = [];\n\n for (const line of lines) {\n const data = JSON.parse(line);\n if (data.type === 'match') {\n const file = data.data.path.text;\n const lineNumber = data.data.line_number;\n const submatches = data.data.submatches;\n\n for (const submatch of submatches) {\n results.push({\n file,\n line: lineNumber,\n column: submatch.start,\n text: data.data.lines.text.trim(),\n });\n }\n }\n }\n\n return results.slice(0, limit);\n } catch (error: any) {\n if (error.code === 1) {\n // rg returns 1 if no matches found\n return [];\n }\n throw error;\n }\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) return { references: [], total_count: 0 };\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const sf = ref.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(ref.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text: ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n references: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n\n public async findImplementations(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ implementations: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { implementations: [], total_count: 0 };\n\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { implementations: [], total_count: 0 };\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<{\n implementations: ReferenceLocation[];\n total_count: number;\n }>('find_implementations', {\n tsconfig,\n file: hit.file,\n symbol: symbolName,\n });\n\n // Apply pagination\n return {\n implementations: result.implementations.slice(offset, offset + limit),\n total_count: result.total_count,\n };\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { implementations: [], total_count: 0 };\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { implementations: [], total_count: 0 };\n\n const targetNode = exported[0];\n if (\n !Node.isClassDeclaration(targetNode) &&\n !Node.isInterfaceDeclaration(targetNode)\n ) {\n return { implementations: [], total_count: 0 };\n }\n\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const results: ReferenceLocation[] = [];\n const implementations = (targetNode as any).getImplementations?.();\n if (implementations) {\n for (const impl of implementations) {\n const sf = impl.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(impl.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n implementations: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n }\n\n public async getFileStructure(\n filePath: string\n ): Promise<FileStructure | undefined> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n if (!sourceFile) return undefined;\n\n const structure: FileStructure = {\n file: safePath,\n imports: sourceFile.getImportDeclarations().map((imp: any) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni: any) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym: any) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile\n .getClasses()\n .map((cls: any) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn: any) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf: any) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta: any) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm: any) => this.mapToEnumInfo(enm)),\n };\n\n return structure;\n }\n\n public async shutdown(): Promise<void> {\n await this.pool.terminate();\n }\n\n private mapToDefinitionLocation(node: Node): DefinitionLocation {\n const sourceFile = node.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(node.getStart());\n\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: this.mapNodeToSymbolKind(node),\n snippet: node.getText(),\n documentation: this.getJsDoc(node),\n };\n }\n\n private mapNodeToSymbolKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n private mapSymbolKind(symbol: any): SymbolKind {\n const decls = symbol.getDeclarations();\n if (decls.length > 0) return this.mapNodeToSymbolKind(decls[0]);\n return 'variable';\n }\n\n private getJsDoc(node: Node): string | undefined {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n }\n\n public getSymbolDocs(node: Node) {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n const doc = docs[0];\n return {\n documentation: doc.getCommentText(),\n tags: doc.getTags().map((tag) => ({\n name: tag.getTagName(),\n text: tag.getCommentText() || '',\n })),\n };\n }\n }\n return undefined;\n }\n\n private mapToClassInfo(cls: any): ClassInfo {\n return {\n name: cls.getName() || 'anonymous',\n ...this.getSymbolDocs(cls),\n methods: cls.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n properties: cls\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n };\n }\n\n private mapToFunctionInfo(fn: any): FunctionInfo {\n return {\n name: fn.getName() || 'anonymous',\n ...this.getSymbolDocs(fn),\n params: fn.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: fn.getReturnType().getText(),\n };\n }\n\n private mapToPropertyInfo(p: any) {\n return {\n name: p.getName(),\n type: p.getType().getText(),\n ...this.getSymbolDocs(p),\n };\n }\n\n private mapToInterfaceInfo(itf: any): InterfaceInfo {\n return {\n name: itf.getName(),\n ...this.getSymbolDocs(itf),\n properties: itf\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n methods: itf.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n };\n }\n\n private mapToTypeAliasInfo(ta: any): TypeAliasInfo {\n return {\n name: ta.getName(),\n type: ta.getType().getText(),\n ...this.getSymbolDocs(ta),\n };\n }\n\n private mapToEnumInfo(enm: any): EnumInfo {\n return {\n name: enm.getName(),\n ...this.getSymbolDocs(enm),\n members: enm.getMembers().map((m: any) => m.getName()),\n };\n }\n\n private deduplicateLocations<\n T extends { file: string; line: number; column: number },\n >(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport const typescriptAdapter = new TypeScriptAdapter();\n","import { Project } from 'ts-morph';\nimport path from 'path';\nimport fs from 'fs';\nimport { glob } from 'glob';\nimport { validateWorkspacePath } from './security.js';\n\n/**\n * ProjectManager handles tsconfig discovery and Project lifecycle.\n * One Project per tsconfig.json to handle monorepo project boundaries correctly.\n */\nexport class ProjectManager {\n private projects: Map<string, Project> = new Map();\n private tsconfigCache: Map<string, string[]> = new Map();\n private accessOrder: string[] = []; // MRU at front\n private maxProjects: number = 4;\n\n /**\n * Find all tsconfig.json files in a directory (recursive)\n */\n public async findTsConfigs(rootDir: string): Promise<string[]> {\n const safeRoot = validateWorkspacePath(rootDir);\n if (this.tsconfigCache.has(safeRoot)) {\n return this.tsconfigCache.get(safeRoot)!;\n }\n\n const configs = await glob('**/tsconfig.json', {\n cwd: safeRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n this.tsconfigCache.set(safeRoot, configs);\n return configs;\n }\n\n /**\n * Ensure a Project exists for a given tsconfig path, managing LRU cache\n */\n public ensureProject(tsconfigPath: string): Project {\n this.checkMemoryPressure();\n\n // Cache hit\n if (this.projects.has(tsconfigPath)) {\n this.moveToFront(tsconfigPath);\n return this.projects.get(tsconfigPath)!;\n }\n\n // Evict if full\n while (this.projects.size >= this.maxProjects) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n\n // Create with lazy file loading\n const project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true, // KEY: don't load all files\n });\n\n this.projects.set(tsconfigPath, project);\n this.accessOrder.unshift(tsconfigPath);\n return project;\n }\n\n /**\n * Move a tsconfig path to the front of the access order (MRU)\n */\n private moveToFront(tsconfigPath: string) {\n const index = this.accessOrder.indexOf(tsconfigPath);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n this.accessOrder.unshift(tsconfigPath);\n }\n }\n\n private checkMemoryPressure(): void {\n const heapUsed = process.memoryUsage().heapUsed / 1024 / 1024;\n const maxHeap = parseInt(process.env.AST_MAX_HEAP_MB || '1536', 10);\n\n while (heapUsed > maxHeap && this.projects.size > 1) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n }\n\n public disposeProject(tsconfigPath: string): void {\n const project = this.projects.get(tsconfigPath);\n if (project) {\n // Forget files explicitly\n for (const sourceFile of project.getSourceFiles()) {\n project.removeSourceFile(sourceFile);\n }\n this.projects.delete(tsconfigPath);\n }\n }\n\n /**\n * Find the nearest tsconfig.json for a file\n */\n public async findNearestTsConfig(\n filePath: string\n ): Promise<string | undefined> {\n const safePath = validateWorkspacePath(filePath);\n let currentDir = path.dirname(safePath);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const tsconfigPath = path.join(currentDir, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n return tsconfigPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return undefined;\n }\n\n /**\n * Get all tsconfigs for a path\n */\n public async getProjectsForPath(rootDir: string): Promise<string[]> {\n return this.findTsConfigs(rootDir);\n }\n\n /**\n * Dispose all projects to free memory\n */\n public disposeAll(): void {\n for (const [key] of this.projects) {\n this.disposeProject(key);\n }\n this.accessOrder = [];\n }\n}\n\nexport const projectManager = new ProjectManager();\n","import { projectManager } from '../project-manager.js';\nimport { IndexingStats, SymbolKind } from '../types.js';\nimport { validateWorkspacePath } from '../security.js';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport { Node } from 'ts-morph';\n\nexport interface SymbolEntry {\n name: string;\n kind: SymbolKind;\n file: string;\n line: number;\n column: number;\n exported: boolean;\n}\n\nexport interface DiskCache {\n version: 1;\n rootDir: string;\n builtAt: string;\n fileHashes: Record<string, number>; // file -> mtimeMs\n symbols: Record<string, SymbolEntry[]>;\n}\n\nexport class SymbolIndex {\n private index: Record<string, SymbolEntry[]> = {};\n\n private getCachePath(rootDir: string): string {\n const hash = crypto\n .createHash('sha256')\n .update(rootDir)\n .digest('hex')\n .slice(0, 12);\n return path.join(\n process.platform === 'win32' ? process.env.TEMP || 'c:/temp' : '/tmp',\n `ast-index-${hash}.json`\n );\n }\n\n private isCacheValid(cached: DiskCache, rootDir: string): boolean {\n if (cached.rootDir !== rootDir) return false;\n\n for (const [file, cachedMtime] of Object.entries(cached.fileHashes)) {\n if (!fs.existsSync(file)) return false;\n if (fs.statSync(file).mtimeMs !== cachedMtime) return false;\n }\n\n return true;\n }\n\n private computeStats(\n cache: DiskCache,\n duration_ms?: number,\n memory_mb?: number\n ): IndexingStats {\n const files = Object.keys(cache.fileHashes).length;\n let functions = 0;\n let classes = 0;\n let interfaces = 0;\n let types = 0;\n\n for (const entries of Object.values(cache.symbols)) {\n for (const entry of entries) {\n if (entry.kind === 'function' || entry.kind === 'method') functions++;\n if (entry.kind === 'class') classes++;\n if (entry.kind === 'interface') interfaces++;\n if (entry.kind === 'type_alias') types++;\n }\n }\n\n return {\n indexed: {\n files,\n functions,\n classes,\n interfaces,\n types,\n },\n duration_ms: duration_ms || 0,\n memory_mb: memory_mb || 0,\n };\n }\n\n private mapKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n /**\n * Build/Warm the index for a given path\n */\n public async buildIndex(rootDir: string): Promise<IndexingStats> {\n const startTime = Date.now();\n const safeRoot = validateWorkspacePath(rootDir);\n const cachePath = this.getCachePath(safeRoot);\n\n if (fs.existsSync(cachePath)) {\n try {\n const cached: DiskCache = JSON.parse(\n fs.readFileSync(cachePath, 'utf-8')\n );\n if (this.isCacheValid(cached, safeRoot)) {\n this.index = cached.symbols;\n return this.computeStats(\n cached,\n Date.now() - startTime,\n process.memoryUsage().heapUsed / 1024 / 1024\n );\n }\n } catch {\n // Corrupt cache, ignore\n }\n }\n\n const tsconfigs = await projectManager.getProjectsForPath(safeRoot);\n const symbols: Record<string, SymbolEntry[]> = {};\n const fileHashes: Record<string, number> = {};\n\n for (const config of tsconfigs) {\n const project = projectManager.ensureProject(config);\n // We need to force load files for indexing\n project.addSourceFilesFromTsConfig(config);\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n try {\n fileHashes[filePath] = fs.statSync(filePath).mtimeMs;\n } catch {\n continue;\n }\n\n // Extract exported declarations\n for (const [name, decls] of sourceFile.getExportedDeclarations()) {\n for (const decl of decls) {\n const entry: SymbolEntry = {\n name,\n kind: this.mapKind(decl as Node),\n file: filePath,\n line: decl.getStartLineNumber(),\n column: decl.getStart() - decl.getStartLinePos(),\n exported: true,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n\n // Extract non-exported top-level declarations\n for (const fn of sourceFile.getFunctions()) {\n const name = fn.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === fn.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'function',\n file: filePath,\n line: fn.getStartLineNumber(),\n column: fn.getStart() - fn.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n for (const cls of sourceFile.getClasses()) {\n const name = cls.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === cls.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'class',\n file: filePath,\n line: cls.getStartLineNumber(),\n column: cls.getStart() - cls.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n }\n }\n\n const cache: DiskCache = {\n version: 1,\n rootDir: safeRoot,\n builtAt: new Date().toISOString(),\n fileHashes,\n symbols,\n };\n\n fs.mkdirSync(path.dirname(cachePath), { recursive: true });\n fs.writeFileSync(cachePath, JSON.stringify(cache));\n\n this.index = symbols;\n\n const duration = Date.now() - startTime;\n const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;\n\n return this.computeStats(cache, duration, Math.round(memoryUsage));\n }\n\n public lookup(name: string): SymbolEntry[] {\n return this.index[name] || [];\n }\n\n public lookupByFile(file: string): SymbolEntry[] {\n return Object.values(this.index)\n .flat()\n .filter((e) => e.file === file);\n }\n}\n\nexport const symbolIndex = new SymbolIndex();\n","import { Worker } from 'worker_threads';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface WorkerTask<T> {\n id: string;\n type: string;\n payload: unknown;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private available: Worker[] = [];\n private queue: WorkerTask<unknown>[] = [];\n private activeJobs = new Map<string, WorkerTask<unknown>>();\n private taskId = 0;\n\n constructor(private poolSize: number) {}\n\n async init(): Promise<void> {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js'); // Assuming tsup builds this\n\n for (let i = 0; i < this.poolSize; i++) {\n const worker = new Worker(workerPath);\n worker.on('message', (msg) => this.handleResult(msg));\n worker.on('error', (err) => this.handleWorkerError(worker, err));\n this.workers.push(worker);\n this.available.push(worker);\n }\n }\n\n async execute<T>(type: string, payload: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = String(++this.taskId);\n const task: WorkerTask<T> = { id, type, payload, resolve, reject };\n\n const worker = this.available.pop();\n if (worker) {\n this.dispatch(worker, task);\n } else {\n this.queue.push(task as WorkerTask<unknown>);\n }\n });\n }\n\n private dispatch<T>(worker: Worker, task: WorkerTask<T>): void {\n this.activeJobs.set(task.id, task as WorkerTask<unknown>);\n worker.postMessage({ id: task.id, type: task.type, payload: task.payload });\n }\n\n private handleResult(msg: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n const task = this.activeJobs.get(msg.id);\n if (!task) return;\n\n this.activeJobs.delete(msg.id);\n\n if (msg.error) {\n task.reject(new Error(msg.error));\n } else {\n task.resolve(msg.result);\n }\n\n // Return worker to pool\n // properly finding the worker is tricky without storing mapping.\n // let's just make it simpler: each message comes from a worker, but we don't know which one.\n // Actually, worker.on('message') should be tied to the worker!\n }\n\n private handleWorkerError(worker: Worker, err: Error): void {\n const idx = this.workers.indexOf(worker);\n if (idx !== -1) {\n worker.terminate();\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js');\n const newWorker = new Worker(workerPath);\n newWorker.on('message', (msg) => this.handleResult(msg));\n newWorker.on('error', (_e) => this.handleWorkerError(newWorker, _e));\n this.workers[idx] = newWorker;\n this.available.push(newWorker);\n }\n }\n\n async terminate(): Promise<void> {\n await Promise.all(this.workers.map((w) => w.terminate()));\n this.workers = [];\n this.available = [];\n }\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findReferences(symbol, path, limit, offset);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function getFileStructure(file: string) {\n return await typescriptAdapter.getFileStructure(file);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind, Node } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nexport async function getSymbolDocs(\n symbol: string,\n filePath: string\n): Promise<any> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n\n if (sourceFile) {\n const node = sourceFile\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .find((id: Node) => id.getText() === symbol);\n\n if (node) {\n const decls = node.getSymbol()?.getDeclarations();\n if (decls && decls.length > 0) {\n const docs = typescriptAdapter.getSymbolDocs(decls[0]);\n if (docs) {\n return {\n symbol,\n file: sourceFile.getFilePath(),\n line: sourceFile.getLineAndColumnAtPos(decls[0].getStart()).line,\n ...docs,\n };\n }\n }\n }\n }\n\n return undefined;\n}\n","import { symbolIndex } from '../index/symbol-index.js';\n\nexport async function buildSymbolIndex(path: string) {\n return await symbolIndex.buildIndex(path);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAKM,kBAOO;AAZb;AAAA;AAAA;AAKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;AAAA;AAAA;;;ACTvD,SAAS,uBAA+B;AAC7C,SAAO,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AACvD;AAEO,SAAS,sBAAsB,WAA2B;AAC/D,QAAM,OAAO,qBAAqB;AAClC,QAAM,WAAW,YAAAA,QAAK,QAAQ,MAAM,SAAS;AAC7C,QAAM,aAAa,YAAAA,QAAK,UAAU,QAAQ;AAG1C,MAAI,CAAC,WAAW,WAAW,IAAI,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,4BAA4B,SAAS;AAAA,IACvC;AAAA,EACF;AAGA,MAAI,WAAW,SAAS,IAAI,GAAG;AAC7B,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,SAAO;AACT;AAzBA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AAAA;AAAA;;;ACAjB;AAAA;AAAA;AAAA;AAcA,eAAsB,WACpB,SACA,YACA,aACA,QAAgB,IAChB,QAAiB,MACQ;AACzB,QAAM,WAAW,sBAAsB,UAAU;AAEjD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,SAAK,KAAK,iBAAiB;AAAA,EAC7B;AAEA,OAAK,KAAK,SAAS,QAAQ;AAE3B,MAAI,aAAa;AACf,SAAK,KAAK,UAAU,WAAW;AAAA,EACjC;AAGA,OAAK,KAAK,UAAU,qBAAqB;AACzC,OAAK,KAAK,UAAU,aAAa;AACjC,OAAK,KAAK,UAAU,aAAa;AAEjC,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,uBAAQ,IAAI;AACnD,UAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAC/C,UAAM,UAA0B,CAAC;AAEjC,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAI,KAAK,SAAS,SAAS;AACzB,cAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,cAAM,aAAa,KAAK,KAAK;AAC7B,cAAM,aAAa,KAAK,KAAK;AAE7B,mBAAW,YAAY,YAAY;AACjC,kBAAQ,KAAK;AAAA,YACX;AAAA,YACA,MAAM;AAAA,YACN,QAAQ,SAAS;AAAA,YACjB,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK;AAAA,UAClC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,MAAM,GAAG,KAAK;AAAA,EAC/B,SAAS,OAAY;AACnB,QAAI,MAAM,SAAS,GAAG;AAEpB,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACF;AA7EA,0BACA,aACA,gBAGM;AALN;AAAA;AAAA;AAAA;AAAA,2BAAyB;AACzB,kBAA0B;AAC1B,qBAAuB;AACvB;AAEA,IAAM,oBAAgB,uBAAU,6BAAQ;AAAA;AAAA;;;ACLxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AACvB,mBAAqC;AACrC,mBAGO;;;ACLP;AAAA,iBAAkB;AAKX,IAAM,0BAA0B,aAAE,OAAO;AAAA,EAC9C,QAAQ,aACL,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EACF,MAAM,aAAE,OAAO,EAAE,SAAS,kCAAkC;AAC9D,CAAC;AAKM,IAAM,uBAAuB,aAAE,OAAO;AAAA,EAC3C,QAAQ,aAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,EAChE,MAAM,aAAE,OAAO,EAAE,SAAS,wBAAwB;AAAA,EAClD,OAAO,aACJ,OAAO,EACP,SAAS,EACT,QAAQ,EAAE,EACV,SAAS,mCAAmC;AAAA,EAC/C,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,SAAS,mBAAmB;AACvE,CAAC;AAKM,IAAM,4BAA4B,aAAE,OAAO;AAAA,EAChD,QAAQ,aACL,OAAO,EACP,SAAS,8DAA8D;AAAA,EAC1E,MAAM,aAAE,OAAO,EAAE,SAAS,wBAAwB;AAAA,EAClD,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,SAAS,sBAAsB;AAAA,EACxE,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,SAAS,mBAAmB;AACvE,CAAC;AAKM,IAAM,yBAAyB,aAAE,OAAO;AAAA,EAC7C,MAAM,aAAE,OAAO,EAAE,SAAS,sCAAsC;AAClE,CAAC;AAKM,IAAM,mBAAmB,aAAE,OAAO;AAAA,EACvC,SAAS,aAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,EAChE,MAAM,aAAE,OAAO,EAAE,SAAS,wBAAwB;AAAA,EAClD,aAAa,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,EACxE,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,SAAS,uBAAuB;AAAA,EACzE,OAAO,aACJ,QAAQ,EACR,SAAS,EACT,QAAQ,IAAI,EACZ,SAAS,+BAA+B;AAC7C,CAAC;AAKM,IAAM,sBAAsB,aAAE,OAAO;AAAA,EAC1C,QAAQ,aAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,EAClE,MAAM,aAAE,OAAO,EAAE,SAAS,wBAAwB;AACpD,CAAC;AAKM,IAAM,yBAAyB,aAAE,OAAO;AAAA,EAC7C,MAAM,aAAE,OAAO,EAAE,SAAS,iCAAiC;AAC7D,CAAC;;;AC3ED;;;ACAA;AAAA,IAAAC,mBAAqB;AACrB,IAAAC,aAAe;;;ACDf;AAAA,sBAAwB;AACxB,IAAAC,eAAiB;AACjB,gBAAe;AACf,kBAAqB;AACrB;AAMO,IAAM,iBAAN,MAAqB;AAAA,EAClB,WAAiC,oBAAI,IAAI;AAAA,EACzC,gBAAuC,oBAAI,IAAI;AAAA,EAC/C,cAAwB,CAAC;AAAA;AAAA,EACzB,cAAsB;AAAA;AAAA;AAAA;AAAA,EAK9B,MAAa,cAAc,SAAoC;AAC7D,UAAM,WAAW,sBAAsB,OAAO;AAC9C,QAAI,KAAK,cAAc,IAAI,QAAQ,GAAG;AACpC,aAAO,KAAK,cAAc,IAAI,QAAQ;AAAA,IACxC;AAEA,UAAM,UAAU,UAAM,kBAAK,oBAAoB;AAAA,MAC7C,KAAK;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,CAAC,sBAAsB,YAAY;AAAA,IAC7C,CAAC;AAED,SAAK,cAAc,IAAI,UAAU,OAAO;AACxC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,cAA+B;AAClD,SAAK,oBAAoB;AAGzB,QAAI,KAAK,SAAS,IAAI,YAAY,GAAG;AACnC,WAAK,YAAY,YAAY;AAC7B,aAAO,KAAK,SAAS,IAAI,YAAY;AAAA,IACvC;AAGA,WAAO,KAAK,SAAS,QAAQ,KAAK,aAAa;AAC7C,YAAM,SAAS,KAAK,YAAY,IAAI;AACpC,WAAK,eAAe,MAAM;AAAA,IAC5B;AAGA,UAAM,UAAU,IAAI,wBAAQ;AAAA,MAC1B,kBAAkB;AAAA,MAClB,6BAA6B;AAAA;AAAA,IAC/B,CAAC;AAED,SAAK,SAAS,IAAI,cAAc,OAAO;AACvC,SAAK,YAAY,QAAQ,YAAY;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,cAAsB;AACxC,UAAM,QAAQ,KAAK,YAAY,QAAQ,YAAY;AACnD,QAAI,QAAQ,IAAI;AACd,WAAK,YAAY,OAAO,OAAO,CAAC;AAChC,WAAK,YAAY,QAAQ,YAAY;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,sBAA4B;AAClC,UAAM,WAAW,QAAQ,YAAY,EAAE,WAAW,OAAO;AACzD,UAAM,UAAU,SAAS,QAAQ,IAAI,mBAAmB,QAAQ,EAAE;AAElE,WAAO,WAAW,WAAW,KAAK,SAAS,OAAO,GAAG;AACnD,YAAM,SAAS,KAAK,YAAY,IAAI;AACpC,WAAK,eAAe,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEO,eAAe,cAA4B;AAChD,UAAM,UAAU,KAAK,SAAS,IAAI,YAAY;AAC9C,QAAI,SAAS;AAEX,iBAAW,cAAc,QAAQ,eAAe,GAAG;AACjD,gBAAQ,iBAAiB,UAAU;AAAA,MACrC;AACA,WAAK,SAAS,OAAO,YAAY;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBACX,UAC6B;AAC7B,UAAM,WAAW,sBAAsB,QAAQ;AAC/C,QAAI,aAAa,aAAAC,QAAK,QAAQ,QAAQ;AACtC,UAAM,OAAO,aAAAA,QAAK,MAAM,UAAU,EAAE;AAEpC,WAAO,eAAe,MAAM;AAC1B,YAAM,eAAe,aAAAA,QAAK,KAAK,YAAY,eAAe;AAC1D,UAAI,UAAAC,QAAG,WAAW,YAAY,GAAG;AAC/B,eAAO;AAAA,MACT;AACA,mBAAa,aAAAD,QAAK,QAAQ,UAAU;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,SAAoC;AAClE,WAAO,KAAK,cAAc,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,eAAW,CAAC,GAAG,KAAK,KAAK,UAAU;AACjC,WAAK,eAAe,GAAG;AAAA,IACzB;AACA,SAAK,cAAc,CAAC;AAAA,EACtB;AACF;AAEO,IAAM,iBAAiB,IAAI,eAAe;;;ACvIjD;AAEA;AACA,IAAAE,aAAe;AACf,oBAAmB;AACnB,IAAAC,eAAiB;AACjB,IAAAC,mBAAqB;AAmBd,IAAM,cAAN,MAAkB;AAAA,EACf,QAAuC,CAAC;AAAA,EAExC,aAAa,SAAyB;AAC5C,UAAM,OAAO,cAAAC,QACV,WAAW,QAAQ,EACnB,OAAO,OAAO,EACd,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,WAAO,aAAAC,QAAK;AAAA,MACV,QAAQ,aAAa,UAAU,QAAQ,IAAI,QAAQ,YAAY;AAAA,MAC/D,aAAa,IAAI;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,aAAa,QAAmB,SAA0B;AAChE,QAAI,OAAO,YAAY,QAAS,QAAO;AAEvC,eAAW,CAAC,MAAM,WAAW,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACnE,UAAI,CAAC,WAAAC,QAAG,WAAW,IAAI,EAAG,QAAO;AACjC,UAAI,WAAAA,QAAG,SAAS,IAAI,EAAE,YAAY,YAAa,QAAO;AAAA,IACxD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aACN,OACA,aACA,WACe;AACf,UAAM,QAAQ,OAAO,KAAK,MAAM,UAAU,EAAE;AAC5C,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,QAAI,aAAa;AACjB,QAAI,QAAQ;AAEZ,eAAW,WAAW,OAAO,OAAO,MAAM,OAAO,GAAG;AAClD,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,SAAS,cAAc,MAAM,SAAS,SAAU;AAC1D,YAAI,MAAM,SAAS,QAAS;AAC5B,YAAI,MAAM,SAAS,YAAa;AAChC,YAAI,MAAM,SAAS,aAAc;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,aAAa,eAAe;AAAA,MAC5B,WAAW,aAAa;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,QAAQ,MAAwB;AACtC,QAAI,sBAAK,mBAAmB,IAAI,EAAG,QAAO;AAC1C,QAAI,sBAAK,sBAAsB,IAAI,EAAG,QAAO;AAC7C,QAAI,sBAAK,uBAAuB,IAAI,EAAG,QAAO;AAC9C,QAAI,sBAAK,uBAAuB,IAAI,EAAG,QAAO;AAC9C,QAAI,sBAAK,kBAAkB,IAAI,EAAG,QAAO;AACzC,QAAI,sBAAK,sBAAsB,IAAI,EAAG,QAAO;AAC7C,QAAI,sBAAK,oBAAoB,IAAI,EAAG,QAAO;AAC3C,QAAI,sBAAK,sBAAsB,IAAI,EAAG,QAAO;AAC7C,QAAI,sBAAK,uBAAuB,IAAI,EAAG,QAAO;AAC9C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,SAAyC;AAC/D,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,WAAW,sBAAsB,OAAO;AAC9C,UAAM,YAAY,KAAK,aAAa,QAAQ;AAE5C,QAAI,WAAAA,QAAG,WAAW,SAAS,GAAG;AAC5B,UAAI;AACF,cAAM,SAAoB,KAAK;AAAA,UAC7B,WAAAA,QAAG,aAAa,WAAW,OAAO;AAAA,QACpC;AACA,YAAI,KAAK,aAAa,QAAQ,QAAQ,GAAG;AACvC,eAAK,QAAQ,OAAO;AACpB,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,KAAK,IAAI,IAAI;AAAA,YACb,QAAQ,YAAY,EAAE,WAAW,OAAO;AAAA,UAC1C;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,eAAe,mBAAmB,QAAQ;AAClE,UAAM,UAAyC,CAAC;AAChD,UAAM,aAAqC,CAAC;AAE5C,eAAW,UAAU,WAAW;AAC9B,YAAM,UAAU,eAAe,cAAc,MAAM;AAEnD,cAAQ,2BAA2B,MAAM;AAEzC,iBAAW,cAAc,QAAQ,eAAe,GAAG;AACjD,cAAM,WAAW,WAAW,YAAY;AACxC,YAAI;AACF,qBAAW,QAAQ,IAAI,WAAAA,QAAG,SAAS,QAAQ,EAAE;AAAA,QAC/C,QAAQ;AACN;AAAA,QACF;AAGA,mBAAW,CAAC,MAAM,KAAK,KAAK,WAAW,wBAAwB,GAAG;AAChE,qBAAW,QAAQ,OAAO;AACxB,kBAAM,QAAqB;AAAA,cACzB;AAAA,cACA,MAAM,KAAK,QAAQ,IAAY;AAAA,cAC/B,MAAM;AAAA,cACN,MAAM,KAAK,mBAAmB;AAAA,cAC9B,QAAQ,KAAK,SAAS,IAAI,KAAK,gBAAgB;AAAA,cAC/C,UAAU;AAAA,YACZ;AACA,aAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK;AAAA,UACnC;AAAA,QACF;AAGA,mBAAW,MAAM,WAAW,aAAa,GAAG;AAC1C,gBAAM,OAAO,GAAG,QAAQ;AACxB,cACE,QACA,CAAC,QAAQ,IAAI,GAAG;AAAA,YACd,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,GAAG,mBAAmB;AAAA,UACjE,GACA;AACA,kBAAM,QAAqB;AAAA,cACzB;AAAA,cACA,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM,GAAG,mBAAmB;AAAA,cAC5B,QAAQ,GAAG,SAAS,IAAI,GAAG,gBAAgB;AAAA,cAC3C,UAAU;AAAA,YACZ;AACA,aAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK;AAAA,UACnC;AAAA,QACF;AACA,mBAAW,OAAO,WAAW,WAAW,GAAG;AACzC,gBAAM,OAAO,IAAI,QAAQ;AACzB,cACE,QACA,CAAC,QAAQ,IAAI,GAAG;AAAA,YACd,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,IAAI,mBAAmB;AAAA,UAClE,GACA;AACA,kBAAM,QAAqB;AAAA,cACzB;AAAA,cACA,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM,IAAI,mBAAmB;AAAA,cAC7B,QAAQ,IAAI,SAAS,IAAI,IAAI,gBAAgB;AAAA,cAC7C,UAAU;AAAA,YACZ;AACA,aAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAmB;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AAEA,eAAAA,QAAG,UAAU,aAAAD,QAAK,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACzD,eAAAC,QAAG,cAAc,WAAW,KAAK,UAAU,KAAK,CAAC;AAEjD,SAAK,QAAQ;AAEb,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,UAAM,cAAc,QAAQ,YAAY,EAAE,WAAW,OAAO;AAE5D,WAAO,KAAK,aAAa,OAAO,UAAU,KAAK,MAAM,WAAW,CAAC;AAAA,EACnE;AAAA,EAEO,OAAO,MAA6B;AACzC,WAAO,KAAK,MAAM,IAAI,KAAK,CAAC;AAAA,EAC9B;AAAA,EAEO,aAAa,MAA6B;AAC/C,WAAO,OAAO,OAAO,KAAK,KAAK,EAC5B,KAAK,EACL,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAClC;AACF;AAEO,IAAM,cAAc,IAAI,YAAY;;;AFpN3C;;;AGfA;AAAA,4BAAuB;AACvB,IAAAC,eAAiB;AACjB,iBAA8B;AAUvB,IAAM,aAAN,MAAiB;AAAA,EAOtB,YAAoB,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAN/B,UAAoB,CAAC;AAAA,EACrB,YAAsB,CAAC;AAAA,EACvB,QAA+B,CAAC;AAAA,EAChC,aAAa,oBAAI,IAAiC;AAAA,EAClD,SAAS;AAAA,EAIjB,MAAM,OAAsB;AAC1B,UAAM,YAAY,aAAAC,QAAK,YAAQ,0BAAc,aAAe,CAAC;AAC7D,UAAM,aAAa,aAAAA,QAAK,KAAK,WAAW,eAAe;AAEvD,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,KAAK;AACtC,YAAM,SAAS,IAAI,6BAAO,UAAU;AACpC,aAAO,GAAG,WAAW,CAAC,QAAQ,KAAK,aAAa,GAAG,CAAC;AACpD,aAAO,GAAG,SAAS,CAAC,QAAQ,KAAK,kBAAkB,QAAQ,GAAG,CAAC;AAC/D,WAAK,QAAQ,KAAK,MAAM;AACxB,WAAK,UAAU,KAAK,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,QAAW,MAAc,SAA8B;AAC3D,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK,OAAO,EAAE,KAAK,MAAM;AAC/B,YAAM,OAAsB,EAAE,IAAI,MAAM,SAAS,SAAS,OAAO;AAEjE,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,UAAI,QAAQ;AACV,aAAK,SAAS,QAAQ,IAAI;AAAA,MAC5B,OAAO;AACL,aAAK,MAAM,KAAK,IAA2B;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,SAAY,QAAgB,MAA2B;AAC7D,SAAK,WAAW,IAAI,KAAK,IAAI,IAA2B;AACxD,WAAO,YAAY,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,EAC5E;AAAA,EAEQ,aAAa,KAIZ;AACP,UAAM,OAAO,KAAK,WAAW,IAAI,IAAI,EAAE;AACvC,QAAI,CAAC,KAAM;AAEX,SAAK,WAAW,OAAO,IAAI,EAAE;AAE7B,QAAI,IAAI,OAAO;AACb,WAAK,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,IAClC,OAAO;AACL,WAAK,QAAQ,IAAI,MAAM;AAAA,IACzB;AAAA,EAMF;AAAA,EAEQ,kBAAkB,QAAgB,KAAkB;AAC1D,UAAM,MAAM,KAAK,QAAQ,QAAQ,MAAM;AACvC,QAAI,QAAQ,IAAI;AACd,aAAO,UAAU;AACjB,YAAM,YAAY,aAAAA,QAAK,YAAQ,0BAAc,aAAe,CAAC;AAC7D,YAAM,aAAa,aAAAA,QAAK,KAAK,WAAW,eAAe;AACvD,YAAM,YAAY,IAAI,6BAAO,UAAU;AACvC,gBAAU,GAAG,WAAW,CAAC,QAAQ,KAAK,aAAa,GAAG,CAAC;AACvD,gBAAU,GAAG,SAAS,CAAC,OAAO,KAAK,kBAAkB,WAAW,EAAE,CAAC;AACnE,WAAK,QAAQ,GAAG,IAAI;AACpB,WAAK,UAAU,KAAK,SAAS;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,YAA2B;AAC/B,UAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACxD,SAAK,UAAU,CAAC;AAChB,SAAK,YAAY,CAAC;AAAA,EACpB;AACF;;;AH5EO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EAER,cAAc;AACZ,UAAM,WAAW,SAAS,QAAQ,IAAI,wBAAwB,GAAG;AACjE,SAAK,OAAO,IAAI,WAAW,QAAQ;AAAA,EACrC;AAAA,EACA,MAAa,kBACX,YACAC,OAC+B;AAC/B,0BAAsBA,KAAI;AAG1B,UAAM,YAAY,YAAY,OAAO,UAAU;AAC/C,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,UAAgC,CAAC;AACvC,iBAAW,OAAO,WAAW;AAC3B,cAAMC,YAAW,MAAM,eAAe,oBAAoB,IAAI,IAAI;AAClE,YAAIA,WAAU;AACZ,gBAAM,UAAU,eAAe,cAAcA,SAAQ;AACrD,gBAAM,aAAa,QAAQ,4BAA4B,IAAI,IAAI;AAC/D,cAAI,YAAY;AACd,kBAAM,WAAW,WACd,wBAAwB,EACxB,IAAI,UAAU;AACjB,gBAAI,YAAY,SAAS,SAAS,GAAG;AACnC,sBAAQ,KAAK,KAAK,wBAAwB,SAAS,CAAC,CAAS,CAAC;AAC9D;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,QAAQ,IAAI;AAAA,UACZ,MAAM,IAAI;AAAA,UACV,SAAS;AAAA,UACT,eAAe;AAAA,QACjB,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAGA,QAAI,WAAAC,QAAG,SAASF,KAAI,EAAE,YAAY,GAAG;AACnC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,WAAW,MAAM,eAAe,oBAAoBA,KAAI;AAC9D,QAAI,CAAC,SAAU,QAAO,CAAC;AAGvB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,UACE;AAAA,UACA,MAAMA;AAAA,UACN,QAAQ;AAAA,QACV;AAAA,MACF;AACA,aAAO;AAAA,IACT,QAAQ;AAEN,YAAM,UAAU,eAAe,cAAc,QAAQ;AACrD,YAAM,aAAa,QAAQ,4BAA4BA,KAAI;AAC3D,UAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,YAAM,WAAW,WAAW,wBAAwB,EAAE,IAAI,UAAU;AACpE,UAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,aAAO,SAAS,IAAI,CAAC,SAAS,KAAK,wBAAwB,IAAY,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAa,eACX,YACAA,OACA,QAAgB,IAChB,SAAiB,GACkD;AACnE,0BAAsBA,KAAI;AAG1B,UAAM,OAAO,YAAY,OAAO,UAAU;AAC1C,QAAI,KAAK,WAAW,EAAG,QAAO,EAAE,YAAY,CAAC,GAAG,aAAa,EAAE;AAG/D,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,WAAW,MAAM,eAAe,oBAAoB,IAAI,IAAI;AAClE,QAAI,CAAC,SAAU,QAAO,EAAE,YAAY,CAAC,GAAG,aAAa,EAAE;AAEvD,UAAM,UAAU,eAAe,cAAc,QAAQ;AACrD,UAAM,aAAa,QAAQ,4BAA4B,IAAI,IAAI;AAC/D,QAAI,CAAC,WAAY,QAAO,EAAE,YAAY,CAAC,GAAG,aAAa,EAAE;AAGzD,UAAM,WAAW,WAAW,wBAAwB,EAAE,IAAI,UAAU;AACpE,QAAI,CAAC,YAAY,SAAS,WAAW;AACnC,aAAO,EAAE,YAAY,CAAC,GAAG,aAAa,EAAE;AAE1C,UAAM,aAAa,SAAS,CAAC;AAK7B,QAAI;AACF,YAAM,EAAE,YAAAG,YAAW,IAAI,MAAM;AAC7B,YAAM,gBAAgB,MAAMA;AAAA,QAC1B;AAAA,QACAH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,cAAc,CAAC,GAAG,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjE,iBAAW,QAAQ,aAAa;AAC9B,gBAAQ,4BAA4B,IAAI;AAAA,MAC1C;AAAA,IACF,SAAS,IAAI;AAAA,IAEb;AAEA,UAAM,aAAc,WAAmB,iBAAiB;AACxD,QAAI,CAAC,WAAY,QAAO,EAAE,YAAY,CAAC,GAAG,aAAa,EAAE;AAEzD,UAAM,UAA+B,CAAC;AACtC,eAAW,aAAa,YAAY;AAClC,iBAAW,OAAO,UAAU,cAAc,GAAG;AAC3C,cAAM,KAAK,IAAI,cAAc;AAC7B,cAAM,KAAK,GAAG,sBAAsB,IAAI,YAAY,EAAE,SAAS,CAAC;AAChE,gBAAQ,KAAK;AAAA,UACX,MAAM,GAAG,YAAY;AAAA,UACrB,MAAM,GAAG;AAAA,UACT,QAAQ,GAAG;AAAA,UACX,MAAM,IAAI,QAAQ,EAAE,UAAU,GAAG,QAAQ,KAAK,IAAI,QAAQ,EAAE,QAAQ;AAAA,QACtE,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,qBAAqB,OAAO;AAChD,WAAO;AAAA,MACL,YAAY,OAAO,MAAM,QAAQ,SAAS,KAAK;AAAA,MAC/C,aAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAa,oBACX,YACAA,OACA,QAAgB,IAChB,SAAiB,GACuD;AACxE,0BAAsBA,KAAI;AAC1B,UAAM,OAAO,YAAY,OAAO,UAAU;AAC1C,QAAI,KAAK,WAAW,EAAG,QAAO,EAAE,iBAAiB,CAAC,GAAG,aAAa,EAAE;AAEpE,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,WAAW,MAAM,eAAe,oBAAoB,IAAI,IAAI;AAClE,QAAI,CAAC,SAAU,QAAO,EAAE,iBAAiB,CAAC,GAAG,aAAa,EAAE;AAG5D,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK,QAG5B,wBAAwB;AAAA,QACzB;AAAA,QACA,MAAM,IAAI;AAAA,QACV,QAAQ;AAAA,MACV,CAAC;AAGD,aAAO;AAAA,QACL,iBAAiB,OAAO,gBAAgB,MAAM,QAAQ,SAAS,KAAK;AAAA,QACpE,aAAa,OAAO;AAAA,MACtB;AAAA,IACF,QAAQ;AAEN,YAAM,UAAU,eAAe,cAAc,QAAQ;AACrD,YAAM,aAAa,QAAQ,4BAA4B,IAAI,IAAI;AAC/D,UAAI,CAAC,WAAY,QAAO,EAAE,iBAAiB,CAAC,GAAG,aAAa,EAAE;AAE9D,YAAM,WAAW,WAAW,wBAAwB,EAAE,IAAI,UAAU;AACpE,UAAI,CAAC,YAAY,SAAS,WAAW;AACnC,eAAO,EAAE,iBAAiB,CAAC,GAAG,aAAa,EAAE;AAE/C,YAAM,aAAa,SAAS,CAAC;AAC7B,UACE,CAAC,sBAAK,mBAAmB,UAAU,KACnC,CAAC,sBAAK,uBAAuB,UAAU,GACvC;AACA,eAAO,EAAE,iBAAiB,CAAC,GAAG,aAAa,EAAE;AAAA,MAC/C;AAEA,UAAI;AACF,cAAM,EAAE,YAAAG,YAAW,IAAI,MAAM;AAC7B,cAAM,gBAAgB,MAAMA;AAAA,UAC1B;AAAA,UACAH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,cAAc,CAAC,GAAG,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjE,mBAAW,QAAQ,aAAa;AAC9B,kBAAQ,4BAA4B,IAAI;AAAA,QAC1C;AAAA,MACF,SAAS,IAAI;AAAA,MAEb;AAEA,YAAM,UAA+B,CAAC;AACtC,YAAM,kBAAmB,WAAmB,qBAAqB;AACjE,UAAI,iBAAiB;AACnB,mBAAW,QAAQ,iBAAiB;AAClC,gBAAM,KAAK,KAAK,cAAc;AAC9B,gBAAM,KAAK,GAAG,sBAAsB,KAAK,YAAY,EAAE,SAAS,CAAC;AACjE,kBAAQ,KAAK;AAAA,YACX,MAAM,GAAG,YAAY;AAAA,YACrB,MAAM,GAAG;AAAA,YACT,QAAQ,GAAG;AAAA,YACX,MACE,KAAK,QAAQ,EAAE,UAAU,GAAG,QAAQ,KAAK,KAAK,QAAQ,EAAE,QAAQ;AAAA,UACpE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,qBAAqB,OAAO;AAChD,aAAO;AAAA,QACL,iBAAiB,OAAO,MAAM,QAAQ,SAAS,KAAK;AAAA,QACpD,aAAa,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,iBACX,UACoC;AACpC,UAAM,WAAW,sBAAsB,QAAQ;AAC/C,UAAM,WAAW,MAAM,eAAe,oBAAoB,QAAQ;AAClE,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,UAAU,eAAe,cAAc,QAAQ;AACrD,UAAM,aAAa,QAAQ,4BAA4B,QAAQ;AAC/D,QAAI,CAAC,WAAY,QAAO;AAExB,UAAM,YAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,SAAS,WAAW,sBAAsB,EAAE,IAAI,CAAC,SAAc;AAAA,QAC7D,QAAQ,IAAI,wBAAwB;AAAA,QACpC,OAAO,IAAI,gBAAgB,EAAE,IAAI,CAAC,OAAY,GAAG,QAAQ,CAAC;AAAA,MAC5D,EAAE;AAAA,MACF,SAAS,WAAW,iBAAiB,EAAE,IAAI,CAAC,SAAc;AAAA,QACxD,MAAM,IAAI,QAAQ;AAAA,QAClB,MAAM,KAAK,cAAc,GAAG;AAAA,MAC9B,EAAE;AAAA,MACF,SAAS,WACN,WAAW,EACX,IAAI,CAAC,QAAa,KAAK,eAAe,GAAG,CAAC;AAAA,MAC7C,WAAW,WACR,aAAa,EACb,IAAI,CAAC,OAAY,KAAK,kBAAkB,EAAE,CAAC;AAAA,MAC9C,YAAY,WACT,cAAc,EACd,IAAI,CAAC,QAAa,KAAK,mBAAmB,GAAG,CAAC;AAAA,MACjD,aAAa,WACV,eAAe,EACf,IAAI,CAAC,OAAY,KAAK,mBAAmB,EAAE,CAAC;AAAA,MAC/C,OAAO,WAAW,SAAS,EAAE,IAAI,CAAC,QAAa,KAAK,cAAc,GAAG,CAAC;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,WAA0B;AACrC,UAAM,KAAK,KAAK,UAAU;AAAA,EAC5B;AAAA,EAEQ,wBAAwB,MAAgC;AAC9D,UAAM,aAAa,KAAK,cAAc;AACtC,UAAM,gBAAgB,WAAW,sBAAsB,KAAK,SAAS,CAAC;AAEtE,WAAO;AAAA,MACL,MAAM,WAAW,YAAY;AAAA,MAC7B,MAAM,cAAc;AAAA,MACpB,QAAQ,cAAc;AAAA,MACtB,MAAM,KAAK,oBAAoB,IAAI;AAAA,MACnC,SAAS,KAAK,QAAQ;AAAA,MACtB,eAAe,KAAK,SAAS,IAAI;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAAwB;AAClD,QAAI,sBAAK,mBAAmB,IAAI,EAAG,QAAO;AAC1C,QAAI,sBAAK,sBAAsB,IAAI,EAAG,QAAO;AAC7C,QAAI,sBAAK,uBAAuB,IAAI,EAAG,QAAO;AAC9C,QAAI,sBAAK,uBAAuB,IAAI,EAAG,QAAO;AAC9C,QAAI,sBAAK,kBAAkB,IAAI,EAAG,QAAO;AACzC,QAAI,sBAAK,sBAAsB,IAAI,EAAG,QAAO;AAC7C,QAAI,sBAAK,oBAAoB,IAAI,EAAG,QAAO;AAC3C,QAAI,sBAAK,sBAAsB,IAAI,EAAG,QAAO;AAC7C,QAAI,sBAAK,uBAAuB,IAAI,EAAG,QAAO;AAC9C,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,QAAyB;AAC7C,UAAM,QAAQ,OAAO,gBAAgB;AACrC,QAAI,MAAM,SAAS,EAAG,QAAO,KAAK,oBAAoB,MAAM,CAAC,CAAC;AAC9D,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAgC;AAC/C,QAAI,sBAAK,YAAY,IAAI,GAAG;AAC1B,YAAM,OAAO,KAAK,UAAU;AAC5B,UAAI,KAAK,SAAS,GAAG;AACnB,eAAO,KAAK,CAAC,EAAE,eAAe;AAAA,MAChC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEO,cAAc,MAAY;AAC/B,QAAI,sBAAK,YAAY,IAAI,GAAG;AAC1B,YAAM,OAAO,KAAK,UAAU;AAC5B,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,MAAM,KAAK,CAAC;AAClB,eAAO;AAAA,UACL,eAAe,IAAI,eAAe;AAAA,UAClC,MAAM,IAAI,QAAQ,EAAE,IAAI,CAAC,SAAS;AAAA,YAChC,MAAM,IAAI,WAAW;AAAA,YACrB,MAAM,IAAI,eAAe,KAAK;AAAA,UAChC,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,KAAqB;AAC1C,WAAO;AAAA,MACL,MAAM,IAAI,QAAQ,KAAK;AAAA,MACvB,GAAG,KAAK,cAAc,GAAG;AAAA,MACzB,SAAS,IAAI,WAAW,EAAE,IAAI,CAAC,MAAW,KAAK,kBAAkB,CAAC,CAAC;AAAA,MACnE,YAAY,IACT,cAAc,EACd,IAAI,CAAC,MAAW,KAAK,kBAAkB,CAAC,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,kBAAkB,IAAuB;AAC/C,WAAO;AAAA,MACL,MAAM,GAAG,QAAQ,KAAK;AAAA,MACtB,GAAG,KAAK,cAAc,EAAE;AAAA,MACxB,QAAQ,GAAG,cAAc,EAAE,IAAI,CAAC,OAAY;AAAA,QAC1C,MAAM,EAAE,QAAQ;AAAA,QAChB,MAAM,EAAE,QAAQ,EAAE,QAAQ;AAAA,MAC5B,EAAE;AAAA,MACF,YAAY,GAAG,cAAc,EAAE,QAAQ;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,kBAAkB,GAAQ;AAChC,WAAO;AAAA,MACL,MAAM,EAAE,QAAQ;AAAA,MAChB,MAAM,EAAE,QAAQ,EAAE,QAAQ;AAAA,MAC1B,GAAG,KAAK,cAAc,CAAC;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,mBAAmB,KAAyB;AAClD,WAAO;AAAA,MACL,MAAM,IAAI,QAAQ;AAAA,MAClB,GAAG,KAAK,cAAc,GAAG;AAAA,MACzB,YAAY,IACT,cAAc,EACd,IAAI,CAAC,MAAW,KAAK,kBAAkB,CAAC,CAAC;AAAA,MAC5C,SAAS,IAAI,WAAW,EAAE,IAAI,CAAC,MAAW,KAAK,kBAAkB,CAAC,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEQ,mBAAmB,IAAwB;AACjD,WAAO;AAAA,MACL,MAAM,GAAG,QAAQ;AAAA,MACjB,MAAM,GAAG,QAAQ,EAAE,QAAQ;AAAA,MAC3B,GAAG,KAAK,cAAc,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,cAAc,KAAoB;AACxC,WAAO;AAAA,MACL,MAAM,IAAI,QAAQ;AAAA,MAClB,GAAG,KAAK,cAAc,GAAG;AAAA,MACzB,SAAS,IAAI,WAAW,EAAE,IAAI,CAAC,MAAW,EAAE,QAAQ,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,qBAEN,WAAqB;AACrB,UAAM,OAAO,oBAAI,IAAY;AAC7B,WAAO,UAAU,OAAO,CAAC,QAAQ;AAC/B,YAAM,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM;AACjD,UAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,WAAK,IAAI,GAAG;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEO,IAAM,oBAAoB,IAAI,kBAAkB;;;AD3avD,eAAsB,kBACpB,QACAI,OAC+B;AAC/B,SAAO,MAAM,kBAAkB,kBAAkB,QAAQA,KAAI;AAC/D;;;AKRA;AAEA,eAAsB,eACpB,QACAC,OACA,QAAgB,IAChB,SAAiB,GACjB;AACA,SAAO,MAAM,kBAAkB,eAAe,QAAQA,OAAM,OAAO,MAAM;AAC3E;;;ACTA;AAEA,eAAsB,oBACpB,QACAC,OACA,QAAgB,IAChB,SAAiB,GACjB;AACA,SAAO,MAAM,kBAAkB;AAAA,IAC7B;AAAA,IACAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACdA;AAEA,eAAsB,iBAAiB,MAAc;AACnD,SAAO,MAAM,kBAAkB,iBAAiB,IAAI;AACtD;;;ATeA;;;AUnBA;AAEA,IAAAC,mBAAiC;AACjC;AAEA,eAAsB,cACpB,QACA,UACc;AACd,QAAM,WAAW,sBAAsB,QAAQ;AAC/C,QAAM,WAAW,MAAM,eAAe,oBAAoB,QAAQ;AAClE,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,UAAU,eAAe,cAAc,QAAQ;AACrD,QAAM,aAAa,QAAQ,4BAA4B,QAAQ;AAE/D,MAAI,YAAY;AACd,UAAM,OAAO,WACV,qBAAqB,4BAAW,UAAU,EAC1C,KAAK,CAAC,OAAa,GAAG,QAAQ,MAAM,MAAM;AAE7C,QAAI,MAAM;AACR,YAAM,QAAQ,KAAK,UAAU,GAAG,gBAAgB;AAChD,UAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,cAAM,OAAO,kBAAkB,cAAc,MAAM,CAAC,CAAC;AACrD,YAAI,MAAM;AACR,iBAAO;AAAA,YACL;AAAA,YACA,MAAM,WAAW,YAAY;AAAA,YAC7B,MAAM,WAAW,sBAAsB,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE;AAAA,YAC5D,GAAG;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACtCA;AAEA,eAAsB,iBAAiBC,OAAc;AACnD,SAAO,MAAM,YAAY,WAAWA,KAAI;AAC1C;;;AXsBO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA,UAAkB;AAAA,EAE1B,cAAc;AACZ,SAAK,SAAS,IAAI;AAAA,MAChB;AAAA,QACE,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,QACE,cAAc;AAAA,UACZ,OAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,SAAK,cAAc;AAEnB,SAAK,OAAO,UAAU,CAAC,UAAU;AAC/B,cAAQ,MAAM,eAAe,KAAK;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,gBAAgB;AAEtB,SAAK,OAAO,kBAAkB,qCAAwB,YAAY;AAChE,aAAO;AAAA,QACL,OAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,aAAa;AAAA,YACb,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,gBACA,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,aAAa;AAAA,gBACf;AAAA,cACF;AAAA,cACA,UAAU,CAAC,UAAU,MAAM;AAAA,YAC7B;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa;AAAA,YACb,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,QAAQ,EAAE,MAAM,UAAU,aAAa,cAAc;AAAA,gBACrD,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,gBACpD,OAAO,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,gBACrC,QAAQ,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,cACvC;AAAA,cACA,UAAU,CAAC,UAAU,MAAM;AAAA,YAC7B;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aACE;AAAA,YACF,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,gBAC9D,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,gBACpD,OAAO,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,gBACrC,QAAQ,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,cACvC;AAAA,cACA,UAAU,CAAC,UAAU,MAAM;AAAA,YAC7B;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aACE;AAAA,YACF,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,MAAM,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,cAC/D;AAAA,cACA,UAAU,CAAC,MAAM;AAAA,YACnB;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa;AAAA,YACb,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,SAAS,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,gBACzD,MAAM,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,gBAC3D,aAAa,EAAE,MAAM,UAAU,aAAa,cAAc;AAAA,gBAC1D,OAAO,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,gBACrC,OAAO,EAAE,MAAM,WAAW,SAAS,KAAK;AAAA,cAC1C;AAAA,cACA,UAAU,CAAC,WAAW,MAAM;AAAA,YAC9B;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa;AAAA,YACb,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,QAAQ,EAAE,MAAM,UAAU,aAAa,cAAc;AAAA,gBACrD,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,cACtD;AAAA,cACA,UAAU,CAAC,UAAU,MAAM;AAAA,YAC7B;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,aAAa;AAAA,YACb,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,MAAM,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,cAC/D;AAAA,cACA,UAAU,CAAC,MAAM;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAGD,SAAK,OAAO,kBAAkB,oCAAuB,OAAO,YAAY;AACtE,YAAM,EAAE,MAAM,WAAW,KAAK,IAAI,QAAQ;AAE1C,UAAI;AACF,gBAAQ,MAAM;AAAA,UACZ,KAAK,sBAAsB;AACzB,kBAAM,EAAE,QAAQ,MAAAC,MAAK,IAAI,wBAAwB,MAAM,IAAI;AAC3D,kBAAM,UAAU,MAAM,kBAAkB,QAAQA,KAAI;AACpD,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK,mBAAmB;AACtB,kBAAM,EAAE,QAAQ,MAAAA,OAAM,OAAO,OAAO,IAClC,qBAAqB,MAAM,IAAI;AACjC,kBAAM,UAAU,MAAM,eAAe,QAAQA,OAAM,OAAO,MAAM;AAChE,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK,wBAAwB;AAC3B,kBAAM,EAAE,QAAQ,MAAAA,OAAM,OAAO,OAAO,IAClC,0BAA0B,MAAM,IAAI;AACtC,kBAAM,UAAU,MAAM;AAAA,cACpB;AAAA,cACAA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK,sBAAsB;AACzB,kBAAM,EAAE,KAAK,IAAI,uBAAuB,MAAM,IAAI;AAClD,kBAAM,YAAY,MAAM,iBAAiB,IAAI;AAC7C,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,EAAE;AAAA,cAC3D;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK,eAAe;AAClB,kBAAM,EAAE,SAAS,MAAAA,OAAM,aAAa,OAAO,MAAM,IAC/C,iBAAiB,MAAM,IAAI;AAC7B,kBAAM,UAAU,MAAM;AAAA,cACpB;AAAA,cACAA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF;AAAA,UACA,KAAK,mBAAmB;AACtB,kBAAM,EAAE,QAAQ,MAAAA,MAAK,IAAI,oBAAoB,MAAM,IAAI;AACvD,kBAAM,OAAO,MAAM,cAAc,QAAQA,KAAI;AAC7C,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,YACjE;AAAA,UACF;AAAA,UACA,KAAK,sBAAsB;AACzB,kBAAM,EAAE,MAAAA,MAAK,IAAI,uBAAuB,MAAM,IAAI;AAClD,kBAAM,QAAQ,MAAM,iBAAiBA,KAAI;AACzC,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE,CAAC;AAAA,YAClE;AAAA,UACF;AAAA,UACA;AACE,kBAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,QAC3C;AAAA,MACF,SAAS,OAAY;AACnB,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,GAAG,CAAC;AAAA,UAC3D,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM;AACV,UAAM,YAAY,IAAI,kCAAqB;AAC3C,UAAM,KAAK,OAAO,QAAQ,SAAS;AACnC,YAAQ,MAAM,iCAAiC;AAAA,EACjD;AACF;AAGA,IAAM,SAAS,IAAI,kBAAkB;AACrC,OAAO,IAAI,EAAE,MAAM,CAAC,UAAU;AAC5B,UAAQ,MAAM,iDAAiD,KAAK;AACpE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["path","import_ts_morph","import_fs","import_path","path","fs","import_fs","import_path","import_ts_morph","crypto","path","fs","import_path","path","path","tsconfig","fs","searchCode","path","path","path","import_ts_morph","path","path"]}
package/dist/index.js CHANGED
@@ -243,7 +243,7 @@ var SymbolIndex = class {
243
243
  process.memoryUsage().heapUsed / 1024 / 1024
244
244
  );
245
245
  }
246
- } catch (e) {
246
+ } catch {
247
247
  }
248
248
  }
249
249
  const tsconfigs = await projectManager.getProjectsForPath(safeRoot);
@@ -378,10 +378,6 @@ var WorkerPool = class {
378
378
  } else {
379
379
  task.resolve(msg.result);
380
380
  }
381
- const worker = this.workers.find(
382
- (w) => !this.available.includes(w) && ![...this.activeJobs.values()].some((t) => t.id === msg.id)
383
- // simplistic
384
- );
385
381
  }
386
382
  handleWorkerError(worker, err) {
387
383
  const idx = this.workers.indexOf(worker);
@@ -391,7 +387,7 @@ var WorkerPool = class {
391
387
  const workerPath = path3.join(__dirname2, "ast-worker.js");
392
388
  const newWorker = new Worker(workerPath);
393
389
  newWorker.on("message", (msg) => this.handleResult(msg));
394
- newWorker.on("error", (e) => this.handleWorkerError(newWorker, e));
390
+ newWorker.on("error", (_e) => this.handleWorkerError(newWorker, _e));
395
391
  this.workers[idx] = newWorker;
396
392
  this.available.push(newWorker);
397
393
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/resolve-definition.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) return { references: [], total_count: 0 };\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const sf = ref.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(ref.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text: ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n references: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n\n public async findImplementations(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ implementations: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { implementations: [], total_count: 0 };\n\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { implementations: [], total_count: 0 };\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<{\n implementations: ReferenceLocation[];\n total_count: number;\n }>('find_implementations', {\n tsconfig,\n file: hit.file,\n symbol: symbolName,\n });\n\n // Apply pagination\n return {\n implementations: result.implementations.slice(offset, offset + limit),\n total_count: result.total_count,\n };\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { implementations: [], total_count: 0 };\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { implementations: [], total_count: 0 };\n\n const targetNode = exported[0];\n if (\n !Node.isClassDeclaration(targetNode) &&\n !Node.isInterfaceDeclaration(targetNode)\n ) {\n return { implementations: [], total_count: 0 };\n }\n\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const results: ReferenceLocation[] = [];\n const implementations = (targetNode as any).getImplementations?.();\n if (implementations) {\n for (const impl of implementations) {\n const sf = impl.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(impl.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n implementations: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n }\n\n public async getFileStructure(\n filePath: string\n ): Promise<FileStructure | undefined> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n if (!sourceFile) return undefined;\n\n const structure: FileStructure = {\n file: safePath,\n imports: sourceFile.getImportDeclarations().map((imp: any) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni: any) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym: any) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile\n .getClasses()\n .map((cls: any) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn: any) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf: any) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta: any) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm: any) => this.mapToEnumInfo(enm)),\n };\n\n return structure;\n }\n\n public async shutdown(): Promise<void> {\n await this.pool.terminate();\n }\n\n private mapToDefinitionLocation(node: Node): DefinitionLocation {\n const sourceFile = node.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(node.getStart());\n\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: this.mapNodeToSymbolKind(node),\n snippet: node.getText(),\n documentation: this.getJsDoc(node),\n };\n }\n\n private mapNodeToSymbolKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n private mapSymbolKind(symbol: any): SymbolKind {\n const decls = symbol.getDeclarations();\n if (decls.length > 0) return this.mapNodeToSymbolKind(decls[0]);\n return 'variable';\n }\n\n private getJsDoc(node: Node): string | undefined {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n }\n\n public getSymbolDocs(node: Node) {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n const doc = docs[0];\n return {\n documentation: doc.getCommentText(),\n tags: doc.getTags().map((tag) => ({\n name: tag.getTagName(),\n text: tag.getCommentText() || '',\n })),\n };\n }\n }\n return undefined;\n }\n\n private mapToClassInfo(cls: any): ClassInfo {\n return {\n name: cls.getName() || 'anonymous',\n ...this.getSymbolDocs(cls),\n methods: cls.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n properties: cls\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n };\n }\n\n private mapToFunctionInfo(fn: any): FunctionInfo {\n return {\n name: fn.getName() || 'anonymous',\n ...this.getSymbolDocs(fn),\n params: fn.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: fn.getReturnType().getText(),\n };\n }\n\n private mapToPropertyInfo(p: any) {\n return {\n name: p.getName(),\n type: p.getType().getText(),\n ...this.getSymbolDocs(p),\n };\n }\n\n private mapToInterfaceInfo(itf: any): InterfaceInfo {\n return {\n name: itf.getName(),\n ...this.getSymbolDocs(itf),\n properties: itf\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n methods: itf.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n };\n }\n\n private mapToTypeAliasInfo(ta: any): TypeAliasInfo {\n return {\n name: ta.getName(),\n type: ta.getType().getText(),\n ...this.getSymbolDocs(ta),\n };\n }\n\n private mapToEnumInfo(enm: any): EnumInfo {\n return {\n name: enm.getName(),\n ...this.getSymbolDocs(enm),\n members: enm.getMembers().map((m: any) => m.getName()),\n };\n }\n\n private deduplicateLocations<\n T extends { file: string; line: number; column: number },\n >(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport const typescriptAdapter = new TypeScriptAdapter();\n","import { Project } from 'ts-morph';\nimport path from 'path';\nimport fs from 'fs';\nimport { glob } from 'glob';\nimport { validateWorkspacePath } from './security.js';\n\n/**\n * ProjectManager handles tsconfig discovery and Project lifecycle.\n * One Project per tsconfig.json to handle monorepo project boundaries correctly.\n */\nexport class ProjectManager {\n private projects: Map<string, Project> = new Map();\n private tsconfigCache: Map<string, string[]> = new Map();\n private accessOrder: string[] = []; // MRU at front\n private maxProjects: number = 4;\n\n /**\n * Find all tsconfig.json files in a directory (recursive)\n */\n public async findTsConfigs(rootDir: string): Promise<string[]> {\n const safeRoot = validateWorkspacePath(rootDir);\n if (this.tsconfigCache.has(safeRoot)) {\n return this.tsconfigCache.get(safeRoot)!;\n }\n\n const configs = await glob('**/tsconfig.json', {\n cwd: safeRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n this.tsconfigCache.set(safeRoot, configs);\n return configs;\n }\n\n /**\n * Ensure a Project exists for a given tsconfig path, managing LRU cache\n */\n public ensureProject(tsconfigPath: string): Project {\n this.checkMemoryPressure();\n\n // Cache hit\n if (this.projects.has(tsconfigPath)) {\n this.moveToFront(tsconfigPath);\n return this.projects.get(tsconfigPath)!;\n }\n\n // Evict if full\n while (this.projects.size >= this.maxProjects) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n\n // Create with lazy file loading\n const project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true, // KEY: don't load all files\n });\n\n this.projects.set(tsconfigPath, project);\n this.accessOrder.unshift(tsconfigPath);\n return project;\n }\n\n /**\n * Move a tsconfig path to the front of the access order (MRU)\n */\n private moveToFront(tsconfigPath: string) {\n const index = this.accessOrder.indexOf(tsconfigPath);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n this.accessOrder.unshift(tsconfigPath);\n }\n }\n\n private checkMemoryPressure(): void {\n const heapUsed = process.memoryUsage().heapUsed / 1024 / 1024;\n const maxHeap = parseInt(process.env.AST_MAX_HEAP_MB || '1536', 10);\n\n while (heapUsed > maxHeap && this.projects.size > 1) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n }\n\n public disposeProject(tsconfigPath: string): void {\n const project = this.projects.get(tsconfigPath);\n if (project) {\n // Forget files explicitly\n for (const sourceFile of project.getSourceFiles()) {\n project.removeSourceFile(sourceFile);\n }\n this.projects.delete(tsconfigPath);\n }\n }\n\n /**\n * Find the nearest tsconfig.json for a file\n */\n public async findNearestTsConfig(\n filePath: string\n ): Promise<string | undefined> {\n const safePath = validateWorkspacePath(filePath);\n let currentDir = path.dirname(safePath);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const tsconfigPath = path.join(currentDir, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n return tsconfigPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return undefined;\n }\n\n /**\n * Get all tsconfigs for a path\n */\n public async getProjectsForPath(rootDir: string): Promise<string[]> {\n return this.findTsConfigs(rootDir);\n }\n\n /**\n * Dispose all projects to free memory\n */\n public disposeAll(): void {\n for (const [key] of this.projects) {\n this.disposeProject(key);\n }\n this.accessOrder = [];\n }\n}\n\nexport const projectManager = new ProjectManager();\n","import { projectManager } from '../project-manager.js';\nimport { IndexingStats, SymbolKind } from '../types.js';\nimport { validateWorkspacePath } from '../security.js';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport { Node, ExportedDeclarations } from 'ts-morph';\n\nexport interface SymbolEntry {\n name: string;\n kind: SymbolKind;\n file: string;\n line: number;\n column: number;\n exported: boolean;\n}\n\nexport interface DiskCache {\n version: 1;\n rootDir: string;\n builtAt: string;\n fileHashes: Record<string, number>; // file -> mtimeMs\n symbols: Record<string, SymbolEntry[]>;\n}\n\nexport class SymbolIndex {\n private index: Record<string, SymbolEntry[]> = {};\n\n private getCachePath(rootDir: string): string {\n const hash = crypto\n .createHash('sha256')\n .update(rootDir)\n .digest('hex')\n .slice(0, 12);\n return path.join(\n process.platform === 'win32' ? process.env.TEMP || 'c:/temp' : '/tmp',\n `ast-index-${hash}.json`\n );\n }\n\n private isCacheValid(cached: DiskCache, rootDir: string): boolean {\n if (cached.rootDir !== rootDir) return false;\n\n for (const [file, cachedMtime] of Object.entries(cached.fileHashes)) {\n if (!fs.existsSync(file)) return false;\n if (fs.statSync(file).mtimeMs !== cachedMtime) return false;\n }\n\n return true;\n }\n\n private computeStats(\n cache: DiskCache,\n duration_ms?: number,\n memory_mb?: number\n ): IndexingStats {\n const files = Object.keys(cache.fileHashes).length;\n let functions = 0;\n let classes = 0;\n let interfaces = 0;\n let types = 0;\n\n for (const entries of Object.values(cache.symbols)) {\n for (const entry of entries) {\n if (entry.kind === 'function' || entry.kind === 'method') functions++;\n if (entry.kind === 'class') classes++;\n if (entry.kind === 'interface') interfaces++;\n if (entry.kind === 'type_alias') types++;\n }\n }\n\n return {\n indexed: {\n files,\n functions,\n classes,\n interfaces,\n types,\n },\n duration_ms: duration_ms || 0,\n memory_mb: memory_mb || 0,\n };\n }\n\n private mapKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n /**\n * Build/Warm the index for a given path\n */\n public async buildIndex(rootDir: string): Promise<IndexingStats> {\n const startTime = Date.now();\n const safeRoot = validateWorkspacePath(rootDir);\n const cachePath = this.getCachePath(safeRoot);\n\n if (fs.existsSync(cachePath)) {\n try {\n const cached: DiskCache = JSON.parse(\n fs.readFileSync(cachePath, 'utf-8')\n );\n if (this.isCacheValid(cached, safeRoot)) {\n this.index = cached.symbols;\n return this.computeStats(\n cached,\n Date.now() - startTime,\n process.memoryUsage().heapUsed / 1024 / 1024\n );\n }\n } catch (e) {\n // Corrupt cache, ignore\n }\n }\n\n const tsconfigs = await projectManager.getProjectsForPath(safeRoot);\n const symbols: Record<string, SymbolEntry[]> = {};\n const fileHashes: Record<string, number> = {};\n\n for (const config of tsconfigs) {\n const project = projectManager.ensureProject(config);\n // We need to force load files for indexing\n project.addSourceFilesFromTsConfig(config);\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n try {\n fileHashes[filePath] = fs.statSync(filePath).mtimeMs;\n } catch {\n continue;\n }\n\n // Extract exported declarations\n for (const [name, decls] of sourceFile.getExportedDeclarations()) {\n for (const decl of decls) {\n const entry: SymbolEntry = {\n name,\n kind: this.mapKind(decl as Node),\n file: filePath,\n line: decl.getStartLineNumber(),\n column: decl.getStart() - decl.getStartLinePos(),\n exported: true,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n\n // Extract non-exported top-level declarations\n for (const fn of sourceFile.getFunctions()) {\n const name = fn.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === fn.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'function',\n file: filePath,\n line: fn.getStartLineNumber(),\n column: fn.getStart() - fn.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n for (const cls of sourceFile.getClasses()) {\n const name = cls.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === cls.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'class',\n file: filePath,\n line: cls.getStartLineNumber(),\n column: cls.getStart() - cls.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n }\n }\n\n const cache: DiskCache = {\n version: 1,\n rootDir: safeRoot,\n builtAt: new Date().toISOString(),\n fileHashes,\n symbols,\n };\n\n fs.mkdirSync(path.dirname(cachePath), { recursive: true });\n fs.writeFileSync(cachePath, JSON.stringify(cache));\n\n this.index = symbols;\n\n const duration = Date.now() - startTime;\n const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;\n\n return this.computeStats(cache, duration, Math.round(memoryUsage));\n }\n\n public lookup(name: string): SymbolEntry[] {\n return this.index[name] || [];\n }\n\n public lookupByFile(file: string): SymbolEntry[] {\n return Object.values(this.index)\n .flat()\n .filter((e) => e.file === file);\n }\n}\n\nexport const symbolIndex = new SymbolIndex();\n","import { Worker } from 'worker_threads';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface WorkerTask<T> {\n id: string;\n type: string;\n payload: unknown;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private available: Worker[] = [];\n private queue: WorkerTask<unknown>[] = [];\n private activeJobs = new Map<string, WorkerTask<unknown>>();\n private taskId = 0;\n\n constructor(private poolSize: number) {}\n\n async init(): Promise<void> {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js'); // Assuming tsup builds this\n\n for (let i = 0; i < this.poolSize; i++) {\n const worker = new Worker(workerPath);\n worker.on('message', (msg) => this.handleResult(msg));\n worker.on('error', (err) => this.handleWorkerError(worker, err));\n this.workers.push(worker);\n this.available.push(worker);\n }\n }\n\n async execute<T>(type: string, payload: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = String(++this.taskId);\n const task: WorkerTask<T> = { id, type, payload, resolve, reject };\n\n const worker = this.available.pop();\n if (worker) {\n this.dispatch(worker, task);\n } else {\n this.queue.push(task as WorkerTask<unknown>);\n }\n });\n }\n\n private dispatch<T>(worker: Worker, task: WorkerTask<T>): void {\n this.activeJobs.set(task.id, task as WorkerTask<unknown>);\n worker.postMessage({ id: task.id, type: task.type, payload: task.payload });\n }\n\n private handleResult(msg: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n const task = this.activeJobs.get(msg.id);\n if (!task) return;\n\n this.activeJobs.delete(msg.id);\n\n if (msg.error) {\n task.reject(new Error(msg.error));\n } else {\n task.resolve(msg.result);\n }\n\n // Return worker to pool\n const worker = this.workers.find(\n (w) =>\n !this.available.includes(w) &&\n ![...this.activeJobs.values()].some((t) => t.id === msg.id) // simplistic\n );\n // properly finding the worker is tricky without storing mapping.\n // let's just make it simpler: each message comes from a worker, but we don't know which one.\n // Actually, worker.on('message') should be tied to the worker!\n }\n\n private handleWorkerError(worker: Worker, err: Error): void {\n const idx = this.workers.indexOf(worker);\n if (idx !== -1) {\n worker.terminate();\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js');\n const newWorker = new Worker(workerPath);\n newWorker.on('message', (msg) => this.handleResult(msg));\n newWorker.on('error', (e) => this.handleWorkerError(newWorker, e));\n this.workers[idx] = newWorker;\n this.available.push(newWorker);\n }\n }\n\n async terminate(): Promise<void> {\n await Promise.all(this.workers.map((w) => w.terminate()));\n this.workers = [];\n this.available = [];\n }\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind } from 'ts-morph';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findReferences(symbol, path, limit, offset);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function getFileStructure(file: string) {\n return await typescriptAdapter.getFileStructure(file);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind, Node } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nexport async function getSymbolDocs(\n symbol: string,\n filePath: string\n): Promise<any> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n\n if (sourceFile) {\n const node = sourceFile\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .find((id: Node) => id.getText() === symbol);\n\n if (node) {\n const decls = node.getSymbol()?.getDeclarations();\n if (decls && decls.length > 0) {\n const docs = typescriptAdapter.getSymbolDocs(decls[0]);\n if (docs) {\n return {\n symbol,\n file: sourceFile.getFilePath(),\n line: sourceFile.getLineAndColumnAtPos(decls[0].getStart()).line,\n ...docs,\n };\n }\n }\n }\n }\n\n return undefined;\n}\n","import { symbolIndex } from '../index/symbol-index.js';\n\nexport async function buildSymbolIndex(path: string) {\n return await symbolIndex.buildIndex(path);\n}\n"],"mappings":"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","names":["Node","fs","fs","path","path","__dirname","path","tsconfig","fs","searchCode","Node","path","path","path","path","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/resolve-definition.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) return { references: [], total_count: 0 };\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const sf = ref.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(ref.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text: ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n references: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n\n public async findImplementations(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ implementations: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { implementations: [], total_count: 0 };\n\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { implementations: [], total_count: 0 };\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<{\n implementations: ReferenceLocation[];\n total_count: number;\n }>('find_implementations', {\n tsconfig,\n file: hit.file,\n symbol: symbolName,\n });\n\n // Apply pagination\n return {\n implementations: result.implementations.slice(offset, offset + limit),\n total_count: result.total_count,\n };\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { implementations: [], total_count: 0 };\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { implementations: [], total_count: 0 };\n\n const targetNode = exported[0];\n if (\n !Node.isClassDeclaration(targetNode) &&\n !Node.isInterfaceDeclaration(targetNode)\n ) {\n return { implementations: [], total_count: 0 };\n }\n\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const results: ReferenceLocation[] = [];\n const implementations = (targetNode as any).getImplementations?.();\n if (implementations) {\n for (const impl of implementations) {\n const sf = impl.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(impl.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n implementations: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n }\n\n public async getFileStructure(\n filePath: string\n ): Promise<FileStructure | undefined> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n if (!sourceFile) return undefined;\n\n const structure: FileStructure = {\n file: safePath,\n imports: sourceFile.getImportDeclarations().map((imp: any) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni: any) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym: any) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile\n .getClasses()\n .map((cls: any) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn: any) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf: any) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta: any) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm: any) => this.mapToEnumInfo(enm)),\n };\n\n return structure;\n }\n\n public async shutdown(): Promise<void> {\n await this.pool.terminate();\n }\n\n private mapToDefinitionLocation(node: Node): DefinitionLocation {\n const sourceFile = node.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(node.getStart());\n\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: this.mapNodeToSymbolKind(node),\n snippet: node.getText(),\n documentation: this.getJsDoc(node),\n };\n }\n\n private mapNodeToSymbolKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n private mapSymbolKind(symbol: any): SymbolKind {\n const decls = symbol.getDeclarations();\n if (decls.length > 0) return this.mapNodeToSymbolKind(decls[0]);\n return 'variable';\n }\n\n private getJsDoc(node: Node): string | undefined {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n }\n\n public getSymbolDocs(node: Node) {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n const doc = docs[0];\n return {\n documentation: doc.getCommentText(),\n tags: doc.getTags().map((tag) => ({\n name: tag.getTagName(),\n text: tag.getCommentText() || '',\n })),\n };\n }\n }\n return undefined;\n }\n\n private mapToClassInfo(cls: any): ClassInfo {\n return {\n name: cls.getName() || 'anonymous',\n ...this.getSymbolDocs(cls),\n methods: cls.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n properties: cls\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n };\n }\n\n private mapToFunctionInfo(fn: any): FunctionInfo {\n return {\n name: fn.getName() || 'anonymous',\n ...this.getSymbolDocs(fn),\n params: fn.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: fn.getReturnType().getText(),\n };\n }\n\n private mapToPropertyInfo(p: any) {\n return {\n name: p.getName(),\n type: p.getType().getText(),\n ...this.getSymbolDocs(p),\n };\n }\n\n private mapToInterfaceInfo(itf: any): InterfaceInfo {\n return {\n name: itf.getName(),\n ...this.getSymbolDocs(itf),\n properties: itf\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n methods: itf.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n };\n }\n\n private mapToTypeAliasInfo(ta: any): TypeAliasInfo {\n return {\n name: ta.getName(),\n type: ta.getType().getText(),\n ...this.getSymbolDocs(ta),\n };\n }\n\n private mapToEnumInfo(enm: any): EnumInfo {\n return {\n name: enm.getName(),\n ...this.getSymbolDocs(enm),\n members: enm.getMembers().map((m: any) => m.getName()),\n };\n }\n\n private deduplicateLocations<\n T extends { file: string; line: number; column: number },\n >(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport const typescriptAdapter = new TypeScriptAdapter();\n","import { Project } from 'ts-morph';\nimport path from 'path';\nimport fs from 'fs';\nimport { glob } from 'glob';\nimport { validateWorkspacePath } from './security.js';\n\n/**\n * ProjectManager handles tsconfig discovery and Project lifecycle.\n * One Project per tsconfig.json to handle monorepo project boundaries correctly.\n */\nexport class ProjectManager {\n private projects: Map<string, Project> = new Map();\n private tsconfigCache: Map<string, string[]> = new Map();\n private accessOrder: string[] = []; // MRU at front\n private maxProjects: number = 4;\n\n /**\n * Find all tsconfig.json files in a directory (recursive)\n */\n public async findTsConfigs(rootDir: string): Promise<string[]> {\n const safeRoot = validateWorkspacePath(rootDir);\n if (this.tsconfigCache.has(safeRoot)) {\n return this.tsconfigCache.get(safeRoot)!;\n }\n\n const configs = await glob('**/tsconfig.json', {\n cwd: safeRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n this.tsconfigCache.set(safeRoot, configs);\n return configs;\n }\n\n /**\n * Ensure a Project exists for a given tsconfig path, managing LRU cache\n */\n public ensureProject(tsconfigPath: string): Project {\n this.checkMemoryPressure();\n\n // Cache hit\n if (this.projects.has(tsconfigPath)) {\n this.moveToFront(tsconfigPath);\n return this.projects.get(tsconfigPath)!;\n }\n\n // Evict if full\n while (this.projects.size >= this.maxProjects) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n\n // Create with lazy file loading\n const project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true, // KEY: don't load all files\n });\n\n this.projects.set(tsconfigPath, project);\n this.accessOrder.unshift(tsconfigPath);\n return project;\n }\n\n /**\n * Move a tsconfig path to the front of the access order (MRU)\n */\n private moveToFront(tsconfigPath: string) {\n const index = this.accessOrder.indexOf(tsconfigPath);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n this.accessOrder.unshift(tsconfigPath);\n }\n }\n\n private checkMemoryPressure(): void {\n const heapUsed = process.memoryUsage().heapUsed / 1024 / 1024;\n const maxHeap = parseInt(process.env.AST_MAX_HEAP_MB || '1536', 10);\n\n while (heapUsed > maxHeap && this.projects.size > 1) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n }\n\n public disposeProject(tsconfigPath: string): void {\n const project = this.projects.get(tsconfigPath);\n if (project) {\n // Forget files explicitly\n for (const sourceFile of project.getSourceFiles()) {\n project.removeSourceFile(sourceFile);\n }\n this.projects.delete(tsconfigPath);\n }\n }\n\n /**\n * Find the nearest tsconfig.json for a file\n */\n public async findNearestTsConfig(\n filePath: string\n ): Promise<string | undefined> {\n const safePath = validateWorkspacePath(filePath);\n let currentDir = path.dirname(safePath);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const tsconfigPath = path.join(currentDir, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n return tsconfigPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return undefined;\n }\n\n /**\n * Get all tsconfigs for a path\n */\n public async getProjectsForPath(rootDir: string): Promise<string[]> {\n return this.findTsConfigs(rootDir);\n }\n\n /**\n * Dispose all projects to free memory\n */\n public disposeAll(): void {\n for (const [key] of this.projects) {\n this.disposeProject(key);\n }\n this.accessOrder = [];\n }\n}\n\nexport const projectManager = new ProjectManager();\n","import { projectManager } from '../project-manager.js';\nimport { IndexingStats, SymbolKind } from '../types.js';\nimport { validateWorkspacePath } from '../security.js';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport { Node } from 'ts-morph';\n\nexport interface SymbolEntry {\n name: string;\n kind: SymbolKind;\n file: string;\n line: number;\n column: number;\n exported: boolean;\n}\n\nexport interface DiskCache {\n version: 1;\n rootDir: string;\n builtAt: string;\n fileHashes: Record<string, number>; // file -> mtimeMs\n symbols: Record<string, SymbolEntry[]>;\n}\n\nexport class SymbolIndex {\n private index: Record<string, SymbolEntry[]> = {};\n\n private getCachePath(rootDir: string): string {\n const hash = crypto\n .createHash('sha256')\n .update(rootDir)\n .digest('hex')\n .slice(0, 12);\n return path.join(\n process.platform === 'win32' ? process.env.TEMP || 'c:/temp' : '/tmp',\n `ast-index-${hash}.json`\n );\n }\n\n private isCacheValid(cached: DiskCache, rootDir: string): boolean {\n if (cached.rootDir !== rootDir) return false;\n\n for (const [file, cachedMtime] of Object.entries(cached.fileHashes)) {\n if (!fs.existsSync(file)) return false;\n if (fs.statSync(file).mtimeMs !== cachedMtime) return false;\n }\n\n return true;\n }\n\n private computeStats(\n cache: DiskCache,\n duration_ms?: number,\n memory_mb?: number\n ): IndexingStats {\n const files = Object.keys(cache.fileHashes).length;\n let functions = 0;\n let classes = 0;\n let interfaces = 0;\n let types = 0;\n\n for (const entries of Object.values(cache.symbols)) {\n for (const entry of entries) {\n if (entry.kind === 'function' || entry.kind === 'method') functions++;\n if (entry.kind === 'class') classes++;\n if (entry.kind === 'interface') interfaces++;\n if (entry.kind === 'type_alias') types++;\n }\n }\n\n return {\n indexed: {\n files,\n functions,\n classes,\n interfaces,\n types,\n },\n duration_ms: duration_ms || 0,\n memory_mb: memory_mb || 0,\n };\n }\n\n private mapKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n /**\n * Build/Warm the index for a given path\n */\n public async buildIndex(rootDir: string): Promise<IndexingStats> {\n const startTime = Date.now();\n const safeRoot = validateWorkspacePath(rootDir);\n const cachePath = this.getCachePath(safeRoot);\n\n if (fs.existsSync(cachePath)) {\n try {\n const cached: DiskCache = JSON.parse(\n fs.readFileSync(cachePath, 'utf-8')\n );\n if (this.isCacheValid(cached, safeRoot)) {\n this.index = cached.symbols;\n return this.computeStats(\n cached,\n Date.now() - startTime,\n process.memoryUsage().heapUsed / 1024 / 1024\n );\n }\n } catch {\n // Corrupt cache, ignore\n }\n }\n\n const tsconfigs = await projectManager.getProjectsForPath(safeRoot);\n const symbols: Record<string, SymbolEntry[]> = {};\n const fileHashes: Record<string, number> = {};\n\n for (const config of tsconfigs) {\n const project = projectManager.ensureProject(config);\n // We need to force load files for indexing\n project.addSourceFilesFromTsConfig(config);\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n try {\n fileHashes[filePath] = fs.statSync(filePath).mtimeMs;\n } catch {\n continue;\n }\n\n // Extract exported declarations\n for (const [name, decls] of sourceFile.getExportedDeclarations()) {\n for (const decl of decls) {\n const entry: SymbolEntry = {\n name,\n kind: this.mapKind(decl as Node),\n file: filePath,\n line: decl.getStartLineNumber(),\n column: decl.getStart() - decl.getStartLinePos(),\n exported: true,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n\n // Extract non-exported top-level declarations\n for (const fn of sourceFile.getFunctions()) {\n const name = fn.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === fn.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'function',\n file: filePath,\n line: fn.getStartLineNumber(),\n column: fn.getStart() - fn.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n for (const cls of sourceFile.getClasses()) {\n const name = cls.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === cls.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'class',\n file: filePath,\n line: cls.getStartLineNumber(),\n column: cls.getStart() - cls.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n }\n }\n\n const cache: DiskCache = {\n version: 1,\n rootDir: safeRoot,\n builtAt: new Date().toISOString(),\n fileHashes,\n symbols,\n };\n\n fs.mkdirSync(path.dirname(cachePath), { recursive: true });\n fs.writeFileSync(cachePath, JSON.stringify(cache));\n\n this.index = symbols;\n\n const duration = Date.now() - startTime;\n const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;\n\n return this.computeStats(cache, duration, Math.round(memoryUsage));\n }\n\n public lookup(name: string): SymbolEntry[] {\n return this.index[name] || [];\n }\n\n public lookupByFile(file: string): SymbolEntry[] {\n return Object.values(this.index)\n .flat()\n .filter((e) => e.file === file);\n }\n}\n\nexport const symbolIndex = new SymbolIndex();\n","import { Worker } from 'worker_threads';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface WorkerTask<T> {\n id: string;\n type: string;\n payload: unknown;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private available: Worker[] = [];\n private queue: WorkerTask<unknown>[] = [];\n private activeJobs = new Map<string, WorkerTask<unknown>>();\n private taskId = 0;\n\n constructor(private poolSize: number) {}\n\n async init(): Promise<void> {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js'); // Assuming tsup builds this\n\n for (let i = 0; i < this.poolSize; i++) {\n const worker = new Worker(workerPath);\n worker.on('message', (msg) => this.handleResult(msg));\n worker.on('error', (err) => this.handleWorkerError(worker, err));\n this.workers.push(worker);\n this.available.push(worker);\n }\n }\n\n async execute<T>(type: string, payload: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = String(++this.taskId);\n const task: WorkerTask<T> = { id, type, payload, resolve, reject };\n\n const worker = this.available.pop();\n if (worker) {\n this.dispatch(worker, task);\n } else {\n this.queue.push(task as WorkerTask<unknown>);\n }\n });\n }\n\n private dispatch<T>(worker: Worker, task: WorkerTask<T>): void {\n this.activeJobs.set(task.id, task as WorkerTask<unknown>);\n worker.postMessage({ id: task.id, type: task.type, payload: task.payload });\n }\n\n private handleResult(msg: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n const task = this.activeJobs.get(msg.id);\n if (!task) return;\n\n this.activeJobs.delete(msg.id);\n\n if (msg.error) {\n task.reject(new Error(msg.error));\n } else {\n task.resolve(msg.result);\n }\n\n // Return worker to pool\n // properly finding the worker is tricky without storing mapping.\n // let's just make it simpler: each message comes from a worker, but we don't know which one.\n // Actually, worker.on('message') should be tied to the worker!\n }\n\n private handleWorkerError(worker: Worker, err: Error): void {\n const idx = this.workers.indexOf(worker);\n if (idx !== -1) {\n worker.terminate();\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js');\n const newWorker = new Worker(workerPath);\n newWorker.on('message', (msg) => this.handleResult(msg));\n newWorker.on('error', (_e) => this.handleWorkerError(newWorker, _e));\n this.workers[idx] = newWorker;\n this.available.push(newWorker);\n }\n }\n\n async terminate(): Promise<void> {\n await Promise.all(this.workers.map((w) => w.terminate()));\n this.workers = [];\n this.available = [];\n }\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findReferences(symbol, path, limit, offset);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function getFileStructure(file: string) {\n return await typescriptAdapter.getFileStructure(file);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind, Node } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nexport async function getSymbolDocs(\n symbol: string,\n filePath: string\n): Promise<any> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n\n if (sourceFile) {\n const node = sourceFile\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .find((id: Node) => id.getText() === symbol);\n\n if (node) {\n const decls = node.getSymbol()?.getDeclarations();\n if (decls && decls.length > 0) {\n const docs = typescriptAdapter.getSymbolDocs(decls[0]);\n if (docs) {\n return {\n symbol,\n file: sourceFile.getFilePath(),\n line: sourceFile.getLineAndColumnAtPos(decls[0].getStart()).line,\n ...docs,\n };\n }\n }\n }\n }\n\n return undefined;\n}\n","import { symbolIndex } from '../index/symbol-index.js';\n\nexport async function buildSymbolIndex(path: string) {\n return await symbolIndex.buildIndex(path);\n}\n"],"mappings":"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","names":["Node","fs","fs","path","path","__dirname","path","tsconfig","fs","searchCode","Node","path","path","path","path","path"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface DefinitionLocation {\n file: string;\n line: number;\n column: number;\n kind: string;\n snippet: string;\n documentation?: string;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const refSf = ref.getSourceFile();\n const lc = refSf.getLineAndColumnAtPos(\n ref.getTextSpan().getStart()\n );\n results.push({\n file: refSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = deduplicateLocations(results);\n result = {\n references: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n case 'find_implementations': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const implementations = (targetNode as any).getImplementations?.();\n if (!implementations) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const impl of implementations) {\n const implSf = impl.getSourceFile();\n const lc = implSf.getLineAndColumnAtPos(\n impl.getTextSpan().getStart()\n );\n results.push({\n file: implSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n\n const unique = deduplicateLocations(results);\n result = {\n implementations: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n default:\n throw new Error(`Unknown task type: ${msg.type}`);\n }\n\n parentPort?.postMessage({ id: msg.id, result });\n } catch (error: any) {\n parentPort?.postMessage({ id: msg.id, error: error.message });\n }\n});\n\nfunction getJsDoc(node: any): string | undefined {\n if (node.getJsDocs) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n}\n\nfunction deduplicateLocations<\n T extends { file: string; line: number; column: number },\n>(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const refSf = ref.getSourceFile();\n const lc = refSf.getLineAndColumnAtPos(\n ref.getTextSpan().getStart()\n );\n results.push({\n file: refSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = deduplicateLocations(results);\n result = {\n references: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n case 'find_implementations': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const implementations = (targetNode as any).getImplementations?.();\n if (!implementations) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const impl of implementations) {\n const implSf = impl.getSourceFile();\n const lc = implSf.getLineAndColumnAtPos(\n impl.getTextSpan().getStart()\n );\n results.push({\n file: implSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n\n const unique = deduplicateLocations(results);\n result = {\n implementations: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n default:\n throw new Error(`Unknown task type: ${msg.type}`);\n }\n\n parentPort?.postMessage({ id: msg.id, result });\n } catch (error: any) {\n parentPort?.postMessage({ id: msg.id, error: error.message });\n }\n});\n\nfunction getJsDoc(node: any): string | undefined {\n if (node.getJsDocs) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n}\n\nfunction deduplicateLocations<\n T extends { file: string; line: number; column: number },\n>(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface DefinitionLocation {\n file: string;\n line: number;\n column: number;\n kind: string;\n snippet: string;\n documentation?: string;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const refSf = ref.getSourceFile();\n const lc = refSf.getLineAndColumnAtPos(\n ref.getTextSpan().getStart()\n );\n results.push({\n file: refSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = deduplicateLocations(results);\n result = {\n references: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n case 'find_implementations': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const implementations = (targetNode as any).getImplementations?.();\n if (!implementations) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const impl of implementations) {\n const implSf = impl.getSourceFile();\n const lc = implSf.getLineAndColumnAtPos(\n impl.getTextSpan().getStart()\n );\n results.push({\n file: implSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n\n const unique = deduplicateLocations(results);\n result = {\n implementations: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n default:\n throw new Error(`Unknown task type: ${msg.type}`);\n }\n\n parentPort?.postMessage({ id: msg.id, result });\n } catch (error: any) {\n parentPort?.postMessage({ id: msg.id, error: error.message });\n }\n});\n\nfunction getJsDoc(node: any): string | undefined {\n if (node.getJsDocs) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n}\n\nfunction deduplicateLocations<\n T extends { file: string; line: number; column: number },\n>(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const refSf = ref.getSourceFile();\n const lc = refSf.getLineAndColumnAtPos(\n ref.getTextSpan().getStart()\n );\n results.push({\n file: refSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = deduplicateLocations(results);\n result = {\n references: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n case 'find_implementations': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const implementations = (targetNode as any).getImplementations?.();\n if (!implementations) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const impl of implementations) {\n const implSf = impl.getSourceFile();\n const lc = implSf.getLineAndColumnAtPos(\n impl.getTextSpan().getStart()\n );\n results.push({\n file: implSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n\n const unique = deduplicateLocations(results);\n result = {\n implementations: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n default:\n throw new Error(`Unknown task type: ${msg.type}`);\n }\n\n parentPort?.postMessage({ id: msg.id, result });\n } catch (error: any) {\n parentPort?.postMessage({ id: msg.id, error: error.message });\n }\n});\n\nfunction getJsDoc(node: any): string | undefined {\n if (node.getJsDocs) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n}\n\nfunction deduplicateLocations<\n T extends { file: string; line: number; column: number },\n>(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiready/ast-mcp-server",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "The AIReady AST-aware Model Context Protocol (MCP) Server. Explore and navigate multi-project TypeScript/JavaScript codebases with high precision using AST and type information.",
5
5
  "keywords": [
6
6
  "aiready",
@@ -57,7 +57,7 @@
57
57
  "scripts": {
58
58
  "build": "tsup",
59
59
  "dev": "tsup --watch",
60
- "test": "vitest",
60
+ "test": "vitest run",
61
61
  "lint": "eslint src",
62
62
  "type-check": "tsc --noEmit",
63
63
  "test-mcp": "node ../../tooling/scripts/mcp-test.js ./dist/index.js",