@aiready/ast-mcp-server 0.3.1 → 0.4.1

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
@@ -177,10 +177,18 @@ var GetSymbolDocsSchema = import_zod.z.object({
177
177
  var BuildSymbolIndexSchema = import_zod.z.object({
178
178
  path: import_zod.z.string().describe("Project root directory to index")
179
179
  });
180
+ var GetCallHierarchySchema = import_zod.z.object({
181
+ symbol: import_zod.z.string().describe("Symbol name to find callers/callees for"),
182
+ path: import_zod.z.string().describe("Project root directory"),
183
+ direction: import_zod.z.enum(["incoming", "outgoing", "both"]).optional().default("both").describe("Direction of calls (default: both)")
184
+ });
180
185
 
181
186
  // src/tools/resolve-definition.ts
182
187
  init_cjs_shims();
183
188
 
189
+ // src/utils/tool-utils.ts
190
+ init_cjs_shims();
191
+
184
192
  // src/adapters/typescript-adapter.ts
185
193
  init_cjs_shims();
186
194
  var import_ts_morph3 = require("ts-morph");
@@ -493,7 +501,7 @@ var WorkerPool = class {
493
501
  for (let i = 0; i < this.poolSize; i++) {
494
502
  const worker = new import_worker_threads.Worker(workerPath);
495
503
  worker.on("message", (msg) => this.handleResult(msg));
496
- worker.on("error", (err) => this.handleWorkerError(worker, err));
504
+ worker.on("error", (_err) => this.handleWorkerError(worker, _err));
497
505
  this.workers.push(worker);
498
506
  this.available.push(worker);
499
507
  }
@@ -881,21 +889,32 @@ var TypeScriptAdapter = class {
881
889
  };
882
890
  var typescriptAdapter = new TypeScriptAdapter();
883
891
 
892
+ // src/utils/tool-utils.ts
893
+ async function wrapAdapterCall(methodName, symbol, path6, ...args) {
894
+ const method = typescriptAdapter[methodName];
895
+ return await method.apply(typescriptAdapter, [symbol, path6, ...args]);
896
+ }
897
+
884
898
  // src/tools/resolve-definition.ts
885
899
  async function resolveDefinition(symbol, path6) {
886
- return await typescriptAdapter.resolveDefinition(symbol, path6);
900
+ return await wrapAdapterCall(
901
+ "resolveDefinition",
902
+ symbol,
903
+ path6
904
+ );
887
905
  }
888
906
 
889
907
  // src/tools/find-references.ts
890
908
  init_cjs_shims();
891
909
  async function findReferences(symbol, path6, limit = 50, offset = 0) {
892
- return await typescriptAdapter.findReferences(symbol, path6, limit, offset);
910
+ return await wrapAdapterCall("findReferences", symbol, path6, limit, offset);
893
911
  }
894
912
 
895
913
  // src/tools/find-implementations.ts
896
914
  init_cjs_shims();
897
915
  async function findImplementations(symbol, path6, limit = 50, offset = 0) {
898
- return await typescriptAdapter.findImplementations(
916
+ return await wrapAdapterCall(
917
+ "findImplementations",
899
918
  symbol,
900
919
  path6,
901
920
  limit,
@@ -948,7 +967,85 @@ async function buildSymbolIndex(path6) {
948
967
  return await symbolIndex.buildIndex(path6);
949
968
  }
950
969
 
970
+ // src/tools/call-hierarchy.ts
971
+ init_cjs_shims();
972
+ init_security();
973
+ var import_ts_morph5 = require("ts-morph");
974
+ async function getCallHierarchy(symbolName, rootDir, direction = "both") {
975
+ const safeRoot = validateWorkspacePath(rootDir);
976
+ const configs = await projectManager.getProjectsForPath(safeRoot);
977
+ const results = {
978
+ symbol: symbolName,
979
+ incoming: [],
980
+ outgoing: []
981
+ };
982
+ for (const config of configs) {
983
+ const project = projectManager.ensureProject(config);
984
+ project.addSourceFilesFromTsConfig(config);
985
+ const sourceFiles = project.getSourceFiles();
986
+ let targetNode;
987
+ for (const file of sourceFiles) {
988
+ const decls = file.getExportedDeclarations().get(symbolName) || [];
989
+ if (decls.length > 0) {
990
+ targetNode = decls[0];
991
+ break;
992
+ }
993
+ const fn = file.getFunction(symbolName);
994
+ if (fn) {
995
+ targetNode = fn;
996
+ break;
997
+ }
998
+ const cls = file.getClass(symbolName);
999
+ if (cls) {
1000
+ targetNode = cls;
1001
+ break;
1002
+ }
1003
+ }
1004
+ if (!targetNode) continue;
1005
+ if (direction === "incoming" || direction === "both") {
1006
+ const referencedSymbols = targetNode.findReferences?.() || [];
1007
+ for (const referencedSymbol of referencedSymbols) {
1008
+ for (const reference of referencedSymbol.getReferences()) {
1009
+ const sourceFile = reference.getSourceFile();
1010
+ const fileName = sourceFile.getFilePath();
1011
+ const line = reference.getNode().getStartLineNumber();
1012
+ const caller = reference.getNode().getFirstAncestorByKind(import_ts_morph5.SyntaxKind.FunctionDeclaration) || reference.getNode().getFirstAncestorByKind(import_ts_morph5.SyntaxKind.MethodDeclaration) || reference.getNode().getFirstAncestorByKind(import_ts_morph5.SyntaxKind.ClassDeclaration);
1013
+ results.incoming.push({
1014
+ name: caller?.getName?.() || "anonymous",
1015
+ file: fileName,
1016
+ line
1017
+ });
1018
+ }
1019
+ }
1020
+ }
1021
+ if (direction === "outgoing" || direction === "both") {
1022
+ const calls = targetNode.getDescendantsOfKind(import_ts_morph5.SyntaxKind.CallExpression);
1023
+ for (const call of calls) {
1024
+ const expression = call.getExpression();
1025
+ const symbol = call.getReturnType?.() ? call.getExpression().getSymbol() : void 0;
1026
+ results.outgoing.push({
1027
+ name: symbol?.getName() || expression.getText(),
1028
+ file: call.getSourceFile().getFilePath(),
1029
+ line: call.getStartLineNumber()
1030
+ });
1031
+ }
1032
+ }
1033
+ }
1034
+ const uniqueIncoming = /* @__PURE__ */ new Map();
1035
+ for (const item of results.incoming) {
1036
+ uniqueIncoming.set(`${item.file}:${item.line}`, item);
1037
+ }
1038
+ results.incoming = Array.from(uniqueIncoming.values());
1039
+ const uniqueOutgoing = /* @__PURE__ */ new Map();
1040
+ for (const item of results.outgoing) {
1041
+ uniqueOutgoing.set(`${item.file}:${item.line}:${item.name}`, item);
1042
+ }
1043
+ results.outgoing = Array.from(uniqueOutgoing.values());
1044
+ return results;
1045
+ }
1046
+
951
1047
  // src/index.ts
1048
+ var import_types2 = require("@modelcontextprotocol/sdk/types.js");
952
1049
  var ASTExplorerServer = class {
953
1050
  server;
954
1051
  version = "0.1.0";
@@ -960,7 +1057,8 @@ var ASTExplorerServer = class {
960
1057
  },
961
1058
  {
962
1059
  capabilities: {
963
- tools: {}
1060
+ tools: {},
1061
+ resources: {}
964
1062
  }
965
1063
  }
966
1064
  );
@@ -970,6 +1068,40 @@ var ASTExplorerServer = class {
970
1068
  };
971
1069
  }
972
1070
  setupHandlers() {
1071
+ this.server.setRequestHandler(import_types2.ListResourcesRequestSchema, async () => {
1072
+ return {
1073
+ resources: [
1074
+ {
1075
+ uri: "ast://file/symbols",
1076
+ name: "File Symbol List",
1077
+ description: "Get all symbols defined in a file.",
1078
+ mimeType: "application/json"
1079
+ }
1080
+ ]
1081
+ };
1082
+ });
1083
+ this.server.setRequestHandler(
1084
+ import_types2.ReadResourceRequestSchema,
1085
+ async (request) => {
1086
+ const { uri } = request.params;
1087
+ const url = new URL(uri);
1088
+ if (url.protocol === "ast:" && url.pathname === "//file/symbols") {
1089
+ const filePath = url.searchParams.get("path");
1090
+ if (!filePath) throw new Error('Missing "path" parameter in URI');
1091
+ const symbols = symbolIndex.lookupByFile(filePath);
1092
+ return {
1093
+ contents: [
1094
+ {
1095
+ uri,
1096
+ mimeType: "application/json",
1097
+ text: JSON.stringify(symbols, null, 2)
1098
+ }
1099
+ ]
1100
+ };
1101
+ }
1102
+ throw new Error(`Resource not found: ${uri}`);
1103
+ }
1104
+ );
973
1105
  this.server.setRequestHandler(import_types.ListToolsRequestSchema, async () => {
974
1106
  return {
975
1107
  tools: [
@@ -1068,6 +1200,23 @@ var ASTExplorerServer = class {
1068
1200
  },
1069
1201
  required: ["path"]
1070
1202
  }
1203
+ },
1204
+ {
1205
+ name: "get_call_hierarchy",
1206
+ description: "Find callers and callees for a symbol.",
1207
+ inputSchema: {
1208
+ type: "object",
1209
+ properties: {
1210
+ symbol: { type: "string", description: "Symbol name" },
1211
+ path: { type: "string", description: "Project root" },
1212
+ direction: {
1213
+ type: "string",
1214
+ enum: ["incoming", "outgoing", "both"],
1215
+ default: "both"
1216
+ }
1217
+ },
1218
+ required: ["symbol", "path"]
1219
+ }
1071
1220
  }
1072
1221
  ]
1073
1222
  };
@@ -1147,6 +1296,15 @@ var ASTExplorerServer = class {
1147
1296
  content: [{ type: "text", text: JSON.stringify(stats, null, 2) }]
1148
1297
  };
1149
1298
  }
1299
+ case "get_call_hierarchy": {
1300
+ const { symbol, path: path6, direction } = GetCallHierarchySchema.parse(args);
1301
+ const hierarchy = await getCallHierarchy(symbol, path6, direction);
1302
+ return {
1303
+ content: [
1304
+ { type: "text", text: JSON.stringify(hierarchy, null, 2) }
1305
+ ]
1306
+ };
1307
+ }
1150
1308
  default:
1151
1309
  throw new Error(`Unknown tool: ${name}`);
1152
1310
  }
@@ -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 offset: number = 0\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = ['--json', '--max-columns', '500'];\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(offset, offset + 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 offset: { type: 'number', default: 0 },\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, offset, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex,\n offset\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\n .number()\n .optional()\n .default(50)\n .describe('Max matches to return (default 50)'),\n offset: z\n .number()\n .optional()\n .default(0)\n .describe('Pagination offset (default 0)'),\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 path from 'path';\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\n private async ensureIndex(p: string): Promise<void> {\n if (!symbolIndex.isInitialized()) {\n const absolutePath = path.resolve(p);\n let searchPath = absolutePath;\n\n if (!fs.statSync(absolutePath).isDirectory()) {\n const tsconfig = await projectManager.findNearestTsConfig(absolutePath);\n searchPath = tsconfig\n ? path.dirname(tsconfig)\n : path.dirname(absolutePath);\n }\n\n console.error(\n `[AST] Index not initialized. Building for ${searchPath}...`\n );\n await symbolIndex.buildIndex(searchPath);\n }\n }\n\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n await this.ensureIndex(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 await this.ensureIndex(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 =\n 'findReferences' in targetNode &&\n typeof (targetNode as { findReferences?: () => any[] }).findReferences ===\n 'function'\n ? (targetNode as { findReferences: () => any[] }).findReferences()\n : undefined;\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 await this.ensureIndex(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 =\n 'getImplementations' in targetNode &&\n typeof (targetNode as { getImplementations?: () => any[] })\n .getImplementations === 'function'\n ? (\n targetNode as { getImplementations: () => any[] }\n ).getImplementations()\n : undefined;\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) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile.getClasses().map((cls) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm) => 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: unknown): FunctionInfo {\n return {\n name: (fn as any)?.getName?.() || 'anonymous',\n ...this.getSymbolDocs(fn as any),\n params: ((fn as any)?.getParameters?.() || []).map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: (fn as any)?.getReturnType?.()?.getText?.() || 'unknown',\n };\n }\n\n private mapToPropertyInfo(p: unknown) {\n return {\n name: (p as any)?.getName?.() || 'unknown',\n type: (p as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(p as any),\n };\n }\n\n private mapToInterfaceInfo(itf: unknown): InterfaceInfo {\n return {\n name: (itf as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(itf as any),\n properties:\n ((itf as any).getProperties?.() || []).map((p: any) =>\n this.mapToPropertyInfo(p)\n ) || [],\n methods:\n ((itf as any)?.getMethods?.() || []).map((m: any) =>\n this.mapToFunctionInfo(m)\n ) || [],\n };\n }\n\n private mapToTypeAliasInfo(ta: unknown): TypeAliasInfo {\n return {\n name: (ta as any)?.getName?.() || 'unknown',\n type: (ta as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(ta as Node),\n };\n }\n\n private mapToEnumInfo(enm: unknown): EnumInfo {\n return {\n name: (enm as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(enm as Node),\n members:\n ((enm as any)?.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 isInitialized(): boolean {\n return Object.keys(this.index).length > 0;\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":"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","names":["path","import_ts_morph","import_fs","import_path","import_path","path","fs","import_fs","import_path","import_ts_morph","crypto","path","fs","import_path","path","path","fs","tsconfig","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/utils/tool-utils.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","../src/tools/call-hierarchy.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 offset: number = 0\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = ['--json', '--max-columns', '500'];\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(offset, offset + 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 GetCallHierarchySchema,\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';\nimport { getCallHierarchy } from './tools/call-hierarchy.js';\nimport { symbolIndex } from './index/symbol-index.js';\nimport {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.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 resources: {},\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 resources\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: 'ast://file/symbols',\n name: 'File Symbol List',\n description: 'Get all symbols defined in a file.',\n mimeType: 'application/json',\n },\n ],\n };\n });\n\n // Read resource content\n this.server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n const { uri } = request.params;\n const url = new URL(uri);\n\n if (url.protocol === 'ast:' && url.pathname === '//file/symbols') {\n const filePath = url.searchParams.get('path');\n if (!filePath) throw new Error('Missing \"path\" parameter in URI');\n\n const symbols = symbolIndex.lookupByFile(filePath);\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(symbols, null, 2),\n },\n ],\n };\n }\n\n throw new Error(`Resource not found: ${uri}`);\n }\n );\n\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 offset: { type: 'number', default: 0 },\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 name: 'get_call_hierarchy',\n description: 'Find callers and callees for a symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n direction: {\n type: 'string',\n enum: ['incoming', 'outgoing', 'both'],\n default: 'both',\n },\n },\n required: ['symbol', '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, offset, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex,\n offset\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 case 'get_call_hierarchy': {\n const { symbol, path, direction } =\n GetCallHierarchySchema.parse(args);\n const hierarchy = await getCallHierarchy(symbol, path, direction);\n return {\n content: [\n { type: 'text', text: JSON.stringify(hierarchy, null, 2) },\n ],\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\n .number()\n .optional()\n .default(50)\n .describe('Max matches to return (default 50)'),\n offset: z\n .number()\n .optional()\n .default(0)\n .describe('Pagination offset (default 0)'),\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/**\n * Tool 8: get_call_hierarchy\n */\nexport const GetCallHierarchySchema = z.object({\n symbol: z.string().describe('Symbol name to find callers/callees for'),\n path: z.string().describe('Project root directory'),\n direction: z\n .enum(['incoming', 'outgoing', 'both'])\n .optional()\n .default('both')\n .describe('Direction of calls (default: both)'),\n});\n","import { wrapAdapterCall } from '../utils/tool-utils.js';\nimport { DefinitionLocation } from '../types.js';\n\n/**\n * Resolve the definition of a symbol.\n */\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await wrapAdapterCall<DefinitionLocation[]>(\n 'resolveDefinition',\n symbol,\n path\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\n/**\n * Generic wrapper for symbol-related adapter calls to reduce boilerplate.\n */\nexport async function wrapAdapterCall<T>(\n methodName: keyof typeof typescriptAdapter,\n symbol: string,\n path: string,\n ...args: any[]\n): Promise<T> {\n const method = typescriptAdapter[methodName] as (\n ...args: any[]\n ) => Promise<T>;\n return await method.apply(typescriptAdapter, [symbol, path, ...args]);\n}\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport path from 'path';\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\n private async ensureIndex(p: string): Promise<void> {\n if (!symbolIndex.isInitialized()) {\n const absolutePath = path.resolve(p);\n let searchPath = absolutePath;\n\n if (!fs.statSync(absolutePath).isDirectory()) {\n const tsconfig = await projectManager.findNearestTsConfig(absolutePath);\n searchPath = tsconfig\n ? path.dirname(tsconfig)\n : path.dirname(absolutePath);\n }\n\n console.error(\n `[AST] Index not initialized. Building for ${searchPath}...`\n );\n await symbolIndex.buildIndex(searchPath);\n }\n }\n\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n await this.ensureIndex(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 await this.ensureIndex(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 =\n 'findReferences' in targetNode &&\n typeof (targetNode as { findReferences?: () => any[] }).findReferences ===\n 'function'\n ? (targetNode as { findReferences: () => any[] }).findReferences()\n : undefined;\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 await this.ensureIndex(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 =\n 'getImplementations' in targetNode &&\n typeof (targetNode as { getImplementations?: () => any[] })\n .getImplementations === 'function'\n ? (\n targetNode as { getImplementations: () => any[] }\n ).getImplementations()\n : undefined;\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) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile.getClasses().map((cls) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm) => 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: unknown): FunctionInfo {\n return {\n name: (fn as any)?.getName?.() || 'anonymous',\n ...this.getSymbolDocs(fn as any),\n params: ((fn as any)?.getParameters?.() || []).map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: (fn as any)?.getReturnType?.()?.getText?.() || 'unknown',\n };\n }\n\n private mapToPropertyInfo(p: unknown) {\n return {\n name: (p as any)?.getName?.() || 'unknown',\n type: (p as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(p as any),\n };\n }\n\n private mapToInterfaceInfo(itf: unknown): InterfaceInfo {\n return {\n name: (itf as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(itf as any),\n properties:\n ((itf as any).getProperties?.() || []).map((p: any) =>\n this.mapToPropertyInfo(p)\n ) || [],\n methods:\n ((itf as any)?.getMethods?.() || []).map((m: any) =>\n this.mapToFunctionInfo(m)\n ) || [],\n };\n }\n\n private mapToTypeAliasInfo(ta: unknown): TypeAliasInfo {\n return {\n name: (ta as any)?.getName?.() || 'unknown',\n type: (ta as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(ta as Node),\n };\n }\n\n private mapToEnumInfo(enm: unknown): EnumInfo {\n return {\n name: (enm as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(enm as Node),\n members:\n ((enm as any)?.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 isInitialized(): boolean {\n return Object.keys(this.index).length > 0;\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 { wrapAdapterCall } from '../utils/tool-utils.js';\n\n/**\n * Find all references to a specific symbol in the project.\n */\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await wrapAdapterCall('findReferences', symbol, path, limit, offset);\n}\n","import { wrapAdapterCall } from '../utils/tool-utils.js';\n\n/**\n * Find all implementations of a specific interface or class.\n */\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await wrapAdapterCall(\n '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","import { projectManager } from '../project-manager.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { Node, SyntaxKind } from 'ts-morph';\n\nexport async function getCallHierarchy(\n symbolName: string,\n rootDir: string,\n direction: 'incoming' | 'outgoing' | 'both' = 'both'\n) {\n const safeRoot = validateWorkspacePath(rootDir);\n const configs = await projectManager.getProjectsForPath(safeRoot);\n\n const results: {\n symbol: string;\n incoming: Array<{ name: string; file: string; line: number }>;\n outgoing: Array<{ name: string; file: string; line: number }>;\n } = {\n symbol: symbolName,\n incoming: [],\n outgoing: [],\n };\n\n for (const config of configs) {\n const project = projectManager.ensureProject(config);\n project.addSourceFilesFromTsConfig(config);\n\n // Find the symbol definition\n const sourceFiles = project.getSourceFiles();\n let targetNode: Node | undefined;\n\n for (const file of sourceFiles) {\n const decls = file.getExportedDeclarations().get(symbolName) || [];\n if (decls.length > 0) {\n targetNode = decls[0] as Node;\n break;\n }\n\n // Also look for non-exported ones\n const fn = file.getFunction(symbolName);\n if (fn) {\n targetNode = fn;\n break;\n }\n\n const cls = file.getClass(symbolName);\n if (cls) {\n targetNode = cls;\n break;\n }\n }\n\n if (!targetNode) continue;\n\n // Incoming calls (references)\n if (direction === 'incoming' || direction === 'both') {\n const referencedSymbols = (targetNode as any).findReferences?.() || [];\n for (const referencedSymbol of referencedSymbols) {\n for (const reference of referencedSymbol.getReferences()) {\n const sourceFile = reference.getSourceFile();\n const fileName = sourceFile.getFilePath();\n const line = reference.getNode().getStartLineNumber();\n\n const caller =\n reference\n .getNode()\n .getFirstAncestorByKind(SyntaxKind.FunctionDeclaration) ||\n reference\n .getNode()\n .getFirstAncestorByKind(SyntaxKind.MethodDeclaration) ||\n reference\n .getNode()\n .getFirstAncestorByKind(SyntaxKind.ClassDeclaration);\n\n results.incoming.push({\n name: (caller as any)?.getName?.() || 'anonymous',\n file: fileName,\n line: line,\n });\n }\n }\n }\n\n // Outgoing calls\n if (direction === 'outgoing' || direction === 'both') {\n const calls = targetNode.getDescendantsOfKind(SyntaxKind.CallExpression);\n for (const call of calls) {\n const expression = call.getExpression();\n const symbol = (call as any).getReturnType?.()\n ? (call as any).getExpression().getSymbol()\n : undefined;\n\n results.outgoing.push({\n name: symbol?.getName() || expression.getText(),\n file: call.getSourceFile().getFilePath(),\n line: call.getStartLineNumber(),\n });\n }\n }\n }\n\n // Deduplicate results safely\n const uniqueIncoming = new Map<string, any>();\n for (const item of results.incoming) {\n uniqueIncoming.set(`${item.file}:${item.line}`, item);\n }\n results.incoming = Array.from(uniqueIncoming.values());\n\n const uniqueOutgoing = new Map<string, any>();\n for (const item of results.outgoing) {\n uniqueOutgoing.set(`${item.file}:${item.line}:${item.name}`, item);\n }\n results.outgoing = Array.from(uniqueOutgoing.values());\n\n return results;\n}\n"],"mappings":"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","names":["path","import_ts_morph","import_fs","import_path","import_path","path","fs","import_fs","import_path","import_ts_morph","crypto","path","fs","import_path","path","path","fs","tsconfig","searchCode","path","path","path","path","import_ts_morph","path","import_ts_morph","import_types","path"]}
package/dist/index.js CHANGED
@@ -50,6 +50,11 @@ var GetSymbolDocsSchema = z.object({
50
50
  var BuildSymbolIndexSchema = z.object({
51
51
  path: z.string().describe("Project root directory to index")
52
52
  });
53
+ var GetCallHierarchySchema = z.object({
54
+ symbol: z.string().describe("Symbol name to find callers/callees for"),
55
+ path: z.string().describe("Project root directory"),
56
+ direction: z.enum(["incoming", "outgoing", "both"]).optional().default("both").describe("Direction of calls (default: both)")
57
+ });
53
58
 
54
59
  // src/adapters/typescript-adapter.ts
55
60
  import { Node as Node2 } from "ts-morph";
@@ -354,7 +359,7 @@ var WorkerPool = class {
354
359
  for (let i = 0; i < this.poolSize; i++) {
355
360
  const worker = new Worker(workerPath);
356
361
  worker.on("message", (msg) => this.handleResult(msg));
357
- worker.on("error", (err) => this.handleWorkerError(worker, err));
362
+ worker.on("error", (_err) => this.handleWorkerError(worker, _err));
358
363
  this.workers.push(worker);
359
364
  this.available.push(worker);
360
365
  }
@@ -742,19 +747,30 @@ var TypeScriptAdapter = class {
742
747
  };
743
748
  var typescriptAdapter = new TypeScriptAdapter();
744
749
 
750
+ // src/utils/tool-utils.ts
751
+ async function wrapAdapterCall(methodName, symbol, path5, ...args) {
752
+ const method = typescriptAdapter[methodName];
753
+ return await method.apply(typescriptAdapter, [symbol, path5, ...args]);
754
+ }
755
+
745
756
  // src/tools/resolve-definition.ts
746
757
  async function resolveDefinition(symbol, path5) {
747
- return await typescriptAdapter.resolveDefinition(symbol, path5);
758
+ return await wrapAdapterCall(
759
+ "resolveDefinition",
760
+ symbol,
761
+ path5
762
+ );
748
763
  }
749
764
 
750
765
  // src/tools/find-references.ts
751
766
  async function findReferences(symbol, path5, limit = 50, offset = 0) {
752
- return await typescriptAdapter.findReferences(symbol, path5, limit, offset);
767
+ return await wrapAdapterCall("findReferences", symbol, path5, limit, offset);
753
768
  }
754
769
 
755
770
  // src/tools/find-implementations.ts
756
771
  async function findImplementations(symbol, path5, limit = 50, offset = 0) {
757
- return await typescriptAdapter.findImplementations(
772
+ return await wrapAdapterCall(
773
+ "findImplementations",
758
774
  symbol,
759
775
  path5,
760
776
  limit,
@@ -800,7 +816,86 @@ async function buildSymbolIndex(path5) {
800
816
  return await symbolIndex.buildIndex(path5);
801
817
  }
802
818
 
819
+ // src/tools/call-hierarchy.ts
820
+ import { SyntaxKind as SyntaxKind2 } from "ts-morph";
821
+ async function getCallHierarchy(symbolName, rootDir, direction = "both") {
822
+ const safeRoot = validateWorkspacePath(rootDir);
823
+ const configs = await projectManager.getProjectsForPath(safeRoot);
824
+ const results = {
825
+ symbol: symbolName,
826
+ incoming: [],
827
+ outgoing: []
828
+ };
829
+ for (const config of configs) {
830
+ const project = projectManager.ensureProject(config);
831
+ project.addSourceFilesFromTsConfig(config);
832
+ const sourceFiles = project.getSourceFiles();
833
+ let targetNode;
834
+ for (const file of sourceFiles) {
835
+ const decls = file.getExportedDeclarations().get(symbolName) || [];
836
+ if (decls.length > 0) {
837
+ targetNode = decls[0];
838
+ break;
839
+ }
840
+ const fn = file.getFunction(symbolName);
841
+ if (fn) {
842
+ targetNode = fn;
843
+ break;
844
+ }
845
+ const cls = file.getClass(symbolName);
846
+ if (cls) {
847
+ targetNode = cls;
848
+ break;
849
+ }
850
+ }
851
+ if (!targetNode) continue;
852
+ if (direction === "incoming" || direction === "both") {
853
+ const referencedSymbols = targetNode.findReferences?.() || [];
854
+ for (const referencedSymbol of referencedSymbols) {
855
+ for (const reference of referencedSymbol.getReferences()) {
856
+ const sourceFile = reference.getSourceFile();
857
+ const fileName = sourceFile.getFilePath();
858
+ const line = reference.getNode().getStartLineNumber();
859
+ const caller = reference.getNode().getFirstAncestorByKind(SyntaxKind2.FunctionDeclaration) || reference.getNode().getFirstAncestorByKind(SyntaxKind2.MethodDeclaration) || reference.getNode().getFirstAncestorByKind(SyntaxKind2.ClassDeclaration);
860
+ results.incoming.push({
861
+ name: caller?.getName?.() || "anonymous",
862
+ file: fileName,
863
+ line
864
+ });
865
+ }
866
+ }
867
+ }
868
+ if (direction === "outgoing" || direction === "both") {
869
+ const calls = targetNode.getDescendantsOfKind(SyntaxKind2.CallExpression);
870
+ for (const call of calls) {
871
+ const expression = call.getExpression();
872
+ const symbol = call.getReturnType?.() ? call.getExpression().getSymbol() : void 0;
873
+ results.outgoing.push({
874
+ name: symbol?.getName() || expression.getText(),
875
+ file: call.getSourceFile().getFilePath(),
876
+ line: call.getStartLineNumber()
877
+ });
878
+ }
879
+ }
880
+ }
881
+ const uniqueIncoming = /* @__PURE__ */ new Map();
882
+ for (const item of results.incoming) {
883
+ uniqueIncoming.set(`${item.file}:${item.line}`, item);
884
+ }
885
+ results.incoming = Array.from(uniqueIncoming.values());
886
+ const uniqueOutgoing = /* @__PURE__ */ new Map();
887
+ for (const item of results.outgoing) {
888
+ uniqueOutgoing.set(`${item.file}:${item.line}:${item.name}`, item);
889
+ }
890
+ results.outgoing = Array.from(uniqueOutgoing.values());
891
+ return results;
892
+ }
893
+
803
894
  // src/index.ts
895
+ import {
896
+ ListResourcesRequestSchema,
897
+ ReadResourceRequestSchema
898
+ } from "@modelcontextprotocol/sdk/types.js";
804
899
  var ASTExplorerServer = class {
805
900
  server;
806
901
  version = "0.1.0";
@@ -812,7 +907,8 @@ var ASTExplorerServer = class {
812
907
  },
813
908
  {
814
909
  capabilities: {
815
- tools: {}
910
+ tools: {},
911
+ resources: {}
816
912
  }
817
913
  }
818
914
  );
@@ -822,6 +918,40 @@ var ASTExplorerServer = class {
822
918
  };
823
919
  }
824
920
  setupHandlers() {
921
+ this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
922
+ return {
923
+ resources: [
924
+ {
925
+ uri: "ast://file/symbols",
926
+ name: "File Symbol List",
927
+ description: "Get all symbols defined in a file.",
928
+ mimeType: "application/json"
929
+ }
930
+ ]
931
+ };
932
+ });
933
+ this.server.setRequestHandler(
934
+ ReadResourceRequestSchema,
935
+ async (request) => {
936
+ const { uri } = request.params;
937
+ const url = new URL(uri);
938
+ if (url.protocol === "ast:" && url.pathname === "//file/symbols") {
939
+ const filePath = url.searchParams.get("path");
940
+ if (!filePath) throw new Error('Missing "path" parameter in URI');
941
+ const symbols = symbolIndex.lookupByFile(filePath);
942
+ return {
943
+ contents: [
944
+ {
945
+ uri,
946
+ mimeType: "application/json",
947
+ text: JSON.stringify(symbols, null, 2)
948
+ }
949
+ ]
950
+ };
951
+ }
952
+ throw new Error(`Resource not found: ${uri}`);
953
+ }
954
+ );
825
955
  this.server.setRequestHandler(ListToolsRequestSchema, async () => {
826
956
  return {
827
957
  tools: [
@@ -920,6 +1050,23 @@ var ASTExplorerServer = class {
920
1050
  },
921
1051
  required: ["path"]
922
1052
  }
1053
+ },
1054
+ {
1055
+ name: "get_call_hierarchy",
1056
+ description: "Find callers and callees for a symbol.",
1057
+ inputSchema: {
1058
+ type: "object",
1059
+ properties: {
1060
+ symbol: { type: "string", description: "Symbol name" },
1061
+ path: { type: "string", description: "Project root" },
1062
+ direction: {
1063
+ type: "string",
1064
+ enum: ["incoming", "outgoing", "both"],
1065
+ default: "both"
1066
+ }
1067
+ },
1068
+ required: ["symbol", "path"]
1069
+ }
923
1070
  }
924
1071
  ]
925
1072
  };
@@ -999,6 +1146,15 @@ var ASTExplorerServer = class {
999
1146
  content: [{ type: "text", text: JSON.stringify(stats, null, 2) }]
1000
1147
  };
1001
1148
  }
1149
+ case "get_call_hierarchy": {
1150
+ const { symbol, path: path5, direction } = GetCallHierarchySchema.parse(args);
1151
+ const hierarchy = await getCallHierarchy(symbol, path5, direction);
1152
+ return {
1153
+ content: [
1154
+ { type: "text", text: JSON.stringify(hierarchy, null, 2) }
1155
+ ]
1156
+ };
1157
+ }
1002
1158
  default:
1003
1159
  throw new Error(`Unknown tool: ${name}`);
1004
1160
  }
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 offset: { type: 'number', default: 0 },\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, offset, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex,\n offset\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\n .number()\n .optional()\n .default(50)\n .describe('Max matches to return (default 50)'),\n offset: z\n .number()\n .optional()\n .default(0)\n .describe('Pagination offset (default 0)'),\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 path from 'path';\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\n private async ensureIndex(p: string): Promise<void> {\n if (!symbolIndex.isInitialized()) {\n const absolutePath = path.resolve(p);\n let searchPath = absolutePath;\n\n if (!fs.statSync(absolutePath).isDirectory()) {\n const tsconfig = await projectManager.findNearestTsConfig(absolutePath);\n searchPath = tsconfig\n ? path.dirname(tsconfig)\n : path.dirname(absolutePath);\n }\n\n console.error(\n `[AST] Index not initialized. Building for ${searchPath}...`\n );\n await symbolIndex.buildIndex(searchPath);\n }\n }\n\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n await this.ensureIndex(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 await this.ensureIndex(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 =\n 'findReferences' in targetNode &&\n typeof (targetNode as { findReferences?: () => any[] }).findReferences ===\n 'function'\n ? (targetNode as { findReferences: () => any[] }).findReferences()\n : undefined;\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 await this.ensureIndex(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 =\n 'getImplementations' in targetNode &&\n typeof (targetNode as { getImplementations?: () => any[] })\n .getImplementations === 'function'\n ? (\n targetNode as { getImplementations: () => any[] }\n ).getImplementations()\n : undefined;\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) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile.getClasses().map((cls) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm) => 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: unknown): FunctionInfo {\n return {\n name: (fn as any)?.getName?.() || 'anonymous',\n ...this.getSymbolDocs(fn as any),\n params: ((fn as any)?.getParameters?.() || []).map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: (fn as any)?.getReturnType?.()?.getText?.() || 'unknown',\n };\n }\n\n private mapToPropertyInfo(p: unknown) {\n return {\n name: (p as any)?.getName?.() || 'unknown',\n type: (p as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(p as any),\n };\n }\n\n private mapToInterfaceInfo(itf: unknown): InterfaceInfo {\n return {\n name: (itf as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(itf as any),\n properties:\n ((itf as any).getProperties?.() || []).map((p: any) =>\n this.mapToPropertyInfo(p)\n ) || [],\n methods:\n ((itf as any)?.getMethods?.() || []).map((m: any) =>\n this.mapToFunctionInfo(m)\n ) || [],\n };\n }\n\n private mapToTypeAliasInfo(ta: unknown): TypeAliasInfo {\n return {\n name: (ta as any)?.getName?.() || 'unknown',\n type: (ta as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(ta as Node),\n };\n }\n\n private mapToEnumInfo(enm: unknown): EnumInfo {\n return {\n name: (enm as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(enm as Node),\n members:\n ((enm as any)?.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 isInitialized(): boolean {\n return Object.keys(this.index).length > 0;\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","path","fs","path","path","__dirname","path","fs","tsconfig","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/utils/tool-utils.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","../src/tools/call-hierarchy.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 GetCallHierarchySchema,\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';\nimport { getCallHierarchy } from './tools/call-hierarchy.js';\nimport { symbolIndex } from './index/symbol-index.js';\nimport {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.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 resources: {},\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 resources\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: 'ast://file/symbols',\n name: 'File Symbol List',\n description: 'Get all symbols defined in a file.',\n mimeType: 'application/json',\n },\n ],\n };\n });\n\n // Read resource content\n this.server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n const { uri } = request.params;\n const url = new URL(uri);\n\n if (url.protocol === 'ast:' && url.pathname === '//file/symbols') {\n const filePath = url.searchParams.get('path');\n if (!filePath) throw new Error('Missing \"path\" parameter in URI');\n\n const symbols = symbolIndex.lookupByFile(filePath);\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(symbols, null, 2),\n },\n ],\n };\n }\n\n throw new Error(`Resource not found: ${uri}`);\n }\n );\n\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 offset: { type: 'number', default: 0 },\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 name: 'get_call_hierarchy',\n description: 'Find callers and callees for a symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n direction: {\n type: 'string',\n enum: ['incoming', 'outgoing', 'both'],\n default: 'both',\n },\n },\n required: ['symbol', '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, offset, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex,\n offset\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 case 'get_call_hierarchy': {\n const { symbol, path, direction } =\n GetCallHierarchySchema.parse(args);\n const hierarchy = await getCallHierarchy(symbol, path, direction);\n return {\n content: [\n { type: 'text', text: JSON.stringify(hierarchy, null, 2) },\n ],\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\n .number()\n .optional()\n .default(50)\n .describe('Max matches to return (default 50)'),\n offset: z\n .number()\n .optional()\n .default(0)\n .describe('Pagination offset (default 0)'),\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/**\n * Tool 8: get_call_hierarchy\n */\nexport const GetCallHierarchySchema = z.object({\n symbol: z.string().describe('Symbol name to find callers/callees for'),\n path: z.string().describe('Project root directory'),\n direction: z\n .enum(['incoming', 'outgoing', 'both'])\n .optional()\n .default('both')\n .describe('Direction of calls (default: both)'),\n});\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport path from 'path';\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\n private async ensureIndex(p: string): Promise<void> {\n if (!symbolIndex.isInitialized()) {\n const absolutePath = path.resolve(p);\n let searchPath = absolutePath;\n\n if (!fs.statSync(absolutePath).isDirectory()) {\n const tsconfig = await projectManager.findNearestTsConfig(absolutePath);\n searchPath = tsconfig\n ? path.dirname(tsconfig)\n : path.dirname(absolutePath);\n }\n\n console.error(\n `[AST] Index not initialized. Building for ${searchPath}...`\n );\n await symbolIndex.buildIndex(searchPath);\n }\n }\n\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n await this.ensureIndex(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 await this.ensureIndex(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 =\n 'findReferences' in targetNode &&\n typeof (targetNode as { findReferences?: () => any[] }).findReferences ===\n 'function'\n ? (targetNode as { findReferences: () => any[] }).findReferences()\n : undefined;\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 await this.ensureIndex(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 =\n 'getImplementations' in targetNode &&\n typeof (targetNode as { getImplementations?: () => any[] })\n .getImplementations === 'function'\n ? (\n targetNode as { getImplementations: () => any[] }\n ).getImplementations()\n : undefined;\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) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile.getClasses().map((cls) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm) => 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: unknown): FunctionInfo {\n return {\n name: (fn as any)?.getName?.() || 'anonymous',\n ...this.getSymbolDocs(fn as any),\n params: ((fn as any)?.getParameters?.() || []).map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: (fn as any)?.getReturnType?.()?.getText?.() || 'unknown',\n };\n }\n\n private mapToPropertyInfo(p: unknown) {\n return {\n name: (p as any)?.getName?.() || 'unknown',\n type: (p as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(p as any),\n };\n }\n\n private mapToInterfaceInfo(itf: unknown): InterfaceInfo {\n return {\n name: (itf as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(itf as any),\n properties:\n ((itf as any).getProperties?.() || []).map((p: any) =>\n this.mapToPropertyInfo(p)\n ) || [],\n methods:\n ((itf as any)?.getMethods?.() || []).map((m: any) =>\n this.mapToFunctionInfo(m)\n ) || [],\n };\n }\n\n private mapToTypeAliasInfo(ta: unknown): TypeAliasInfo {\n return {\n name: (ta as any)?.getName?.() || 'unknown',\n type: (ta as any)?.getType?.()?.getText?.() || 'unknown',\n ...this.getSymbolDocs(ta as Node),\n };\n }\n\n private mapToEnumInfo(enm: unknown): EnumInfo {\n return {\n name: (enm as any)?.getName?.() || 'unknown',\n ...this.getSymbolDocs(enm as Node),\n members:\n ((enm as any)?.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 isInitialized(): boolean {\n return Object.keys(this.index).length > 0;\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\n/**\n * Generic wrapper for symbol-related adapter calls to reduce boilerplate.\n */\nexport async function wrapAdapterCall<T>(\n methodName: keyof typeof typescriptAdapter,\n symbol: string,\n path: string,\n ...args: any[]\n): Promise<T> {\n const method = typescriptAdapter[methodName] as (\n ...args: any[]\n ) => Promise<T>;\n return await method.apply(typescriptAdapter, [symbol, path, ...args]);\n}\n","import { wrapAdapterCall } from '../utils/tool-utils.js';\nimport { DefinitionLocation } from '../types.js';\n\n/**\n * Resolve the definition of a symbol.\n */\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await wrapAdapterCall<DefinitionLocation[]>(\n 'resolveDefinition',\n symbol,\n path\n );\n}\n","import { wrapAdapterCall } from '../utils/tool-utils.js';\n\n/**\n * Find all references to a specific symbol in the project.\n */\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await wrapAdapterCall('findReferences', symbol, path, limit, offset);\n}\n","import { wrapAdapterCall } from '../utils/tool-utils.js';\n\n/**\n * Find all implementations of a specific interface or class.\n */\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await wrapAdapterCall(\n '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","import { projectManager } from '../project-manager.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { Node, SyntaxKind } from 'ts-morph';\n\nexport async function getCallHierarchy(\n symbolName: string,\n rootDir: string,\n direction: 'incoming' | 'outgoing' | 'both' = 'both'\n) {\n const safeRoot = validateWorkspacePath(rootDir);\n const configs = await projectManager.getProjectsForPath(safeRoot);\n\n const results: {\n symbol: string;\n incoming: Array<{ name: string; file: string; line: number }>;\n outgoing: Array<{ name: string; file: string; line: number }>;\n } = {\n symbol: symbolName,\n incoming: [],\n outgoing: [],\n };\n\n for (const config of configs) {\n const project = projectManager.ensureProject(config);\n project.addSourceFilesFromTsConfig(config);\n\n // Find the symbol definition\n const sourceFiles = project.getSourceFiles();\n let targetNode: Node | undefined;\n\n for (const file of sourceFiles) {\n const decls = file.getExportedDeclarations().get(symbolName) || [];\n if (decls.length > 0) {\n targetNode = decls[0] as Node;\n break;\n }\n\n // Also look for non-exported ones\n const fn = file.getFunction(symbolName);\n if (fn) {\n targetNode = fn;\n break;\n }\n\n const cls = file.getClass(symbolName);\n if (cls) {\n targetNode = cls;\n break;\n }\n }\n\n if (!targetNode) continue;\n\n // Incoming calls (references)\n if (direction === 'incoming' || direction === 'both') {\n const referencedSymbols = (targetNode as any).findReferences?.() || [];\n for (const referencedSymbol of referencedSymbols) {\n for (const reference of referencedSymbol.getReferences()) {\n const sourceFile = reference.getSourceFile();\n const fileName = sourceFile.getFilePath();\n const line = reference.getNode().getStartLineNumber();\n\n const caller =\n reference\n .getNode()\n .getFirstAncestorByKind(SyntaxKind.FunctionDeclaration) ||\n reference\n .getNode()\n .getFirstAncestorByKind(SyntaxKind.MethodDeclaration) ||\n reference\n .getNode()\n .getFirstAncestorByKind(SyntaxKind.ClassDeclaration);\n\n results.incoming.push({\n name: (caller as any)?.getName?.() || 'anonymous',\n file: fileName,\n line: line,\n });\n }\n }\n }\n\n // Outgoing calls\n if (direction === 'outgoing' || direction === 'both') {\n const calls = targetNode.getDescendantsOfKind(SyntaxKind.CallExpression);\n for (const call of calls) {\n const expression = call.getExpression();\n const symbol = (call as any).getReturnType?.()\n ? (call as any).getExpression().getSymbol()\n : undefined;\n\n results.outgoing.push({\n name: symbol?.getName() || expression.getText(),\n file: call.getSourceFile().getFilePath(),\n line: call.getStartLineNumber(),\n });\n }\n }\n }\n\n // Deduplicate results safely\n const uniqueIncoming = new Map<string, any>();\n for (const item of results.incoming) {\n uniqueIncoming.set(`${item.file}:${item.line}`, item);\n }\n results.incoming = Array.from(uniqueIncoming.values());\n\n const uniqueOutgoing = new Map<string, any>();\n for (const item of results.outgoing) {\n uniqueOutgoing.set(`${item.file}:${item.line}:${item.name}`, item);\n }\n results.outgoing = Array.from(uniqueOutgoing.values());\n\n return results;\n}\n"],"mappings":"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","names":["Node","fs","path","fs","path","path","__dirname","path","fs","tsconfig","searchCode","Node","path","path","path","path","path","SyntaxKind","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiready/ast-mcp-server",
3
- "version": "0.3.1",
3
+ "version": "0.4.1",
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",
@@ -61,6 +61,8 @@
61
61
  "lint": "eslint src",
62
62
  "type-check": "tsc --noEmit",
63
63
  "test-mcp": "node ../../tooling/scripts/mcp-test.js ./dist/index.js",
64
- "clean": "rm -rf dist"
64
+ "clean": "rm -rf dist",
65
+ "format": "prettier --write . --ignore-path ../../.prettierignore",
66
+ "lint:fix": "eslint . --fix"
65
67
  }
66
68
  }