@aiready/ast-mcp-server 0.1.5 → 0.1.6
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/{chunk-PRWMQQYW.js → chunk-KTDNJP4B.js} +3 -1
- package/dist/{chunk-PRWMQQYW.js.map → chunk-KTDNJP4B.js.map} +1 -1
- package/dist/index.cjs +19 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +22 -17
- package/dist/index.js.map +1 -1
- package/dist/search-code-NPNOCF3R.js +8 -0
- package/dist/worker/ast-worker.cjs +3 -2
- package/dist/worker/ast-worker.cjs.map +1 -1
- package/dist/worker/ast-worker.js +4 -2
- package/dist/worker/ast-worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/search-code-V3LACKQ6.js +0 -7
- /package/dist/{search-code-V3LACKQ6.js.map → search-code-NPNOCF3R.js.map} +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
1
3
|
// src/tools/search-code.ts
|
|
2
4
|
import { execFile } from "child_process";
|
|
3
5
|
import { promisify } from "util";
|
|
@@ -77,4 +79,4 @@ export {
|
|
|
77
79
|
validateWorkspacePath,
|
|
78
80
|
searchCode
|
|
79
81
|
};
|
|
80
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-KTDNJP4B.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/search-code.ts","../src/security.ts"],"sourcesContent":["import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { rgPath } from '@vscode/ripgrep';\nimport { validateWorkspacePath } from '../security.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface SearchResult {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nexport async function searchCode(\n pattern: string,\n searchPath: string,\n filePattern?: string,\n limit: number = 50,\n regex: boolean = true\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = [\n '--json',\n '--max-count',\n limit.toString(),\n '--max-columns',\n '500',\n ];\n\n if (!regex) {\n args.push('--fixed-strings');\n }\n\n args.push(pattern, safePath);\n\n if (filePattern) {\n args.push('--glob', filePattern);\n }\n\n // Common exclusions\n args.push('--glob', '!**/node_modules/**');\n args.push('--glob', '!**/dist/**');\n args.push('--glob', '!**/.git/**');\n\n try {\n const { stdout } = await execFileAsync(rgPath, args);\n const lines = stdout.split('\\n').filter(Boolean);\n const results: SearchResult[] = [];\n\n for (const line of lines) {\n const data = JSON.parse(line);\n if (data.type === 'match') {\n const file = data.data.path.text;\n const lineNumber = data.data.line_number;\n const submatches = data.data.submatches;\n\n for (const submatch of submatches) {\n results.push({\n file,\n line: lineNumber,\n column: submatch.start,\n text: data.data.lines.text.trim(),\n });\n }\n }\n }\n\n return results.slice(0, limit);\n } catch (error: any) {\n if (error.code === 1) {\n // rg returns 1 if no matches found\n return [];\n }\n throw error;\n }\n}\n","import 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"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/tools/search-code.ts","../src/security.ts"],"sourcesContent":["import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { rgPath } from '@vscode/ripgrep';\nimport { validateWorkspacePath } from '../security.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface SearchResult {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nexport async function searchCode(\n pattern: string,\n searchPath: string,\n filePattern?: string,\n limit: number = 50,\n regex: boolean = true\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = [\n '--json',\n '--max-count',\n limit.toString(),\n '--max-columns',\n '500',\n ];\n\n if (!regex) {\n args.push('--fixed-strings');\n }\n\n args.push(pattern, safePath);\n\n if (filePattern) {\n args.push('--glob', filePattern);\n }\n\n // Common exclusions\n args.push('--glob', '!**/node_modules/**');\n args.push('--glob', '!**/dist/**');\n args.push('--glob', '!**/.git/**');\n\n try {\n const { stdout } = await execFileAsync(rgPath, args);\n const lines = stdout.split('\\n').filter(Boolean);\n const results: SearchResult[] = [];\n\n for (const line of lines) {\n const data = JSON.parse(line);\n if (data.type === 'match') {\n const file = data.data.path.text;\n const lineNumber = data.data.line_number;\n const submatches = data.data.submatches;\n\n for (const submatch of submatches) {\n results.push({\n file,\n line: lineNumber,\n column: submatch.start,\n text: data.data.lines.text.trim(),\n });\n }\n }\n }\n\n return results.slice(0, limit);\n } catch (error: any) {\n if (error.code === 1) {\n // rg returns 1 if no matches found\n return [];\n }\n throw error;\n }\n}\n","import 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"],"mappings":";;;AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;;;ACFvB,OAAO,UAAU;AAGV,SAAS,uBAA+B;AAC7C,SAAO,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AACvD;AAEO,SAAS,sBAAsB,WAA2B;AAC/D,QAAM,OAAO,qBAAqB;AAClC,QAAM,WAAW,KAAK,QAAQ,MAAM,SAAS;AAC7C,QAAM,aAAa,KAAK,UAAU,QAAQ;AAG1C,MAAI,CAAC,WAAW,WAAW,IAAI,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,4BAA4B,SAAS;AAAA,IACvC;AAAA,EACF;AAGA,MAAI,WAAW,SAAS,IAAI,GAAG;AAC7B,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,SAAO;AACT;;;ADpBA,IAAM,gBAAgB,UAAU,QAAQ;AASxC,eAAsB,WACpB,SACA,YACA,aACA,QAAgB,IAChB,QAAiB,MACQ;AACzB,QAAM,WAAW,sBAAsB,UAAU;AAEjD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,SAAK,KAAK,iBAAiB;AAAA,EAC7B;AAEA,OAAK,KAAK,SAAS,QAAQ;AAE3B,MAAI,aAAa;AACf,SAAK,KAAK,UAAU,WAAW;AAAA,EACjC;AAGA,OAAK,KAAK,UAAU,qBAAqB;AACzC,OAAK,KAAK,UAAU,aAAa;AACjC,OAAK,KAAK,UAAU,aAAa;AAEjC,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,QAAQ,IAAI;AACnD,UAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAC/C,UAAM,UAA0B,CAAC;AAEjC,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAI,KAAK,SAAS,SAAS;AACzB,cAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,cAAM,aAAa,KAAK,KAAK;AAC7B,cAAM,aAAa,KAAK,KAAK;AAE7B,mBAAW,YAAY,YAAY;AACjC,kBAAQ,KAAK;AAAA,YACX;AAAA,YACA,MAAM;AAAA,YACN,QAAQ,SAAS;AAAA,YACjB,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK;AAAA,UAClC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,MAAM,GAAG,KAAK;AAAA,EAC/B,SAAS,OAAY;AACnB,QAAI,MAAM,SAAS,GAAG;AAEpB,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACF;","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
"use strict";
|
|
2
3
|
var __create = Object.create;
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
@@ -633,7 +634,7 @@ var TypeScriptAdapter = class {
|
|
|
633
634
|
}
|
|
634
635
|
} catch (_e) {
|
|
635
636
|
}
|
|
636
|
-
const refSymbols = targetNode.findReferences
|
|
637
|
+
const refSymbols = "findReferences" in targetNode && typeof targetNode.findReferences === "function" ? targetNode.findReferences() : void 0;
|
|
637
638
|
if (!refSymbols) return { references: [], total_count: 0 };
|
|
638
639
|
const results = [];
|
|
639
640
|
for (const refSymbol of refSymbols) {
|
|
@@ -698,7 +699,7 @@ var TypeScriptAdapter = class {
|
|
|
698
699
|
} catch (_e) {
|
|
699
700
|
}
|
|
700
701
|
const results = [];
|
|
701
|
-
const implementations = targetNode.getImplementations
|
|
702
|
+
const implementations = "getImplementations" in targetNode && typeof targetNode.getImplementations === "function" ? targetNode.getImplementations() : void 0;
|
|
702
703
|
if (implementations) {
|
|
703
704
|
for (const impl of implementations) {
|
|
704
705
|
const sf = impl.getSourceFile();
|
|
@@ -810,42 +811,46 @@ var TypeScriptAdapter = class {
|
|
|
810
811
|
}
|
|
811
812
|
mapToFunctionInfo(fn) {
|
|
812
813
|
return {
|
|
813
|
-
name: fn
|
|
814
|
+
name: fn?.getName?.() || "anonymous",
|
|
814
815
|
...this.getSymbolDocs(fn),
|
|
815
|
-
params: fn
|
|
816
|
+
params: (fn?.getParameters?.() || []).map((p) => ({
|
|
816
817
|
name: p.getName(),
|
|
817
818
|
type: p.getType().getText()
|
|
818
819
|
})),
|
|
819
|
-
returnType: fn
|
|
820
|
+
returnType: fn?.getReturnType?.()?.getText?.() || "unknown"
|
|
820
821
|
};
|
|
821
822
|
}
|
|
822
823
|
mapToPropertyInfo(p) {
|
|
823
824
|
return {
|
|
824
|
-
name: p
|
|
825
|
-
type: p
|
|
825
|
+
name: p?.getName?.() || "unknown",
|
|
826
|
+
type: p?.getType?.()?.getText?.() || "unknown",
|
|
826
827
|
...this.getSymbolDocs(p)
|
|
827
828
|
};
|
|
828
829
|
}
|
|
829
830
|
mapToInterfaceInfo(itf) {
|
|
830
831
|
return {
|
|
831
|
-
name: itf
|
|
832
|
+
name: itf?.getName?.() || "unknown",
|
|
832
833
|
...this.getSymbolDocs(itf),
|
|
833
|
-
properties: itf.getProperties()
|
|
834
|
-
|
|
834
|
+
properties: (itf.getProperties?.() || []).map(
|
|
835
|
+
(p) => this.mapToPropertyInfo(p)
|
|
836
|
+
) || [],
|
|
837
|
+
methods: (itf?.getMethods?.() || []).map(
|
|
838
|
+
(m) => this.mapToFunctionInfo(m)
|
|
839
|
+
) || []
|
|
835
840
|
};
|
|
836
841
|
}
|
|
837
842
|
mapToTypeAliasInfo(ta) {
|
|
838
843
|
return {
|
|
839
|
-
name: ta
|
|
840
|
-
type: ta
|
|
844
|
+
name: ta?.getName?.() || "unknown",
|
|
845
|
+
type: ta?.getType?.()?.getText?.() || "unknown",
|
|
841
846
|
...this.getSymbolDocs(ta)
|
|
842
847
|
};
|
|
843
848
|
}
|
|
844
849
|
mapToEnumInfo(enm) {
|
|
845
850
|
return {
|
|
846
|
-
name: enm
|
|
851
|
+
name: enm?.getName?.() || "unknown",
|
|
847
852
|
...this.getSymbolDocs(enm),
|
|
848
|
-
members: enm
|
|
853
|
+
members: (enm?.getMembers?.() || []).map((m) => m.getName()) || []
|
|
849
854
|
};
|
|
850
855
|
}
|
|
851
856
|
deduplicateLocations(locations) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","../src/security.ts","../src/tools/search-code.ts","../src/index.ts","../src/schemas.ts","../src/tools/resolve-definition.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import path from 'path';\nimport fs from 'fs';\n\nexport function resolveWorkspaceRoot(): string {\n return process.env.AST_WORKSPACE_ROOT || process.cwd();\n}\n\nexport function validateWorkspacePath(inputPath: string): string {\n const root = resolveWorkspaceRoot();\n const resolved = path.resolve(root, inputPath);\n const normalized = path.normalize(resolved);\n\n // Reject path traversal\n if (!normalized.startsWith(root)) {\n throw new Error(\n `Path traversal detected: ${inputPath} escapes workspace root`\n );\n }\n\n // Reject null bytes\n if (normalized.includes('\\0')) {\n throw new Error('Path contains null bytes');\n }\n\n return normalized;\n}\n\nexport function validateFileExists(filePath: string): string {\n const safe = validateWorkspacePath(filePath);\n if (!fs.existsSync(safe)) {\n throw new Error(`File not found: ${filePath}`);\n }\n if (!fs.statSync(safe).isFile()) {\n throw new Error(`Not a file: ${filePath}`);\n }\n return safe;\n}\n","import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { rgPath } from '@vscode/ripgrep';\nimport { validateWorkspacePath } from '../security.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface SearchResult {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nexport async function searchCode(\n pattern: string,\n searchPath: string,\n filePattern?: string,\n limit: number = 50,\n regex: boolean = true\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = [\n '--json',\n '--max-count',\n limit.toString(),\n '--max-columns',\n '500',\n ];\n\n if (!regex) {\n args.push('--fixed-strings');\n }\n\n args.push(pattern, safePath);\n\n if (filePattern) {\n args.push('--glob', filePattern);\n }\n\n // Common exclusions\n args.push('--glob', '!**/node_modules/**');\n args.push('--glob', '!**/dist/**');\n args.push('--glob', '!**/.git/**');\n\n try {\n const { stdout } = await execFileAsync(rgPath, args);\n const lines = stdout.split('\\n').filter(Boolean);\n const results: SearchResult[] = [];\n\n for (const line of lines) {\n const data = JSON.parse(line);\n if (data.type === 'match') {\n const file = data.data.path.text;\n const lineNumber = data.data.line_number;\n const submatches = data.data.submatches;\n\n for (const submatch of submatches) {\n results.push({\n file,\n line: lineNumber,\n column: submatch.start,\n text: data.data.lines.text.trim(),\n });\n }\n }\n }\n\n return results.slice(0, limit);\n } catch (error: any) {\n if (error.code === 1) {\n // rg returns 1 if no matches found\n return [];\n }\n throw error;\n }\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) return { references: [], total_count: 0 };\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const sf = ref.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(ref.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text: ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n references: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n\n public async findImplementations(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ implementations: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { implementations: [], total_count: 0 };\n\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { implementations: [], total_count: 0 };\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<{\n implementations: ReferenceLocation[];\n total_count: number;\n }>('find_implementations', {\n tsconfig,\n file: hit.file,\n symbol: symbolName,\n });\n\n // Apply pagination\n return {\n implementations: result.implementations.slice(offset, offset + limit),\n total_count: result.total_count,\n };\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { implementations: [], total_count: 0 };\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { implementations: [], total_count: 0 };\n\n const targetNode = exported[0];\n if (\n !Node.isClassDeclaration(targetNode) &&\n !Node.isInterfaceDeclaration(targetNode)\n ) {\n return { implementations: [], total_count: 0 };\n }\n\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const results: ReferenceLocation[] = [];\n const implementations = (targetNode as any).getImplementations?.();\n if (implementations) {\n for (const impl of implementations) {\n const sf = impl.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(impl.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n implementations: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n }\n\n public async getFileStructure(\n filePath: string\n ): Promise<FileStructure | undefined> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n if (!sourceFile) return undefined;\n\n const structure: FileStructure = {\n file: safePath,\n imports: sourceFile.getImportDeclarations().map((imp: any) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni: any) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym: any) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile\n .getClasses()\n .map((cls: any) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn: any) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf: any) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta: any) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm: any) => this.mapToEnumInfo(enm)),\n };\n\n return structure;\n }\n\n public async shutdown(): Promise<void> {\n await this.pool.terminate();\n }\n\n private mapToDefinitionLocation(node: Node): DefinitionLocation {\n const sourceFile = node.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(node.getStart());\n\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: this.mapNodeToSymbolKind(node),\n snippet: node.getText(),\n documentation: this.getJsDoc(node),\n };\n }\n\n private mapNodeToSymbolKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n private mapSymbolKind(symbol: any): SymbolKind {\n const decls = symbol.getDeclarations();\n if (decls.length > 0) return this.mapNodeToSymbolKind(decls[0]);\n return 'variable';\n }\n\n private getJsDoc(node: Node): string | undefined {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n }\n\n public getSymbolDocs(node: Node) {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n const doc = docs[0];\n return {\n documentation: doc.getCommentText(),\n tags: doc.getTags().map((tag) => ({\n name: tag.getTagName(),\n text: tag.getCommentText() || '',\n })),\n };\n }\n }\n return undefined;\n }\n\n private mapToClassInfo(cls: any): ClassInfo {\n return {\n name: cls.getName() || 'anonymous',\n ...this.getSymbolDocs(cls),\n methods: cls.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n properties: cls\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n };\n }\n\n private mapToFunctionInfo(fn: any): FunctionInfo {\n return {\n name: fn.getName() || 'anonymous',\n ...this.getSymbolDocs(fn),\n params: fn.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: fn.getReturnType().getText(),\n };\n }\n\n private mapToPropertyInfo(p: any) {\n return {\n name: p.getName(),\n type: p.getType().getText(),\n ...this.getSymbolDocs(p),\n };\n }\n\n private mapToInterfaceInfo(itf: any): InterfaceInfo {\n return {\n name: itf.getName(),\n ...this.getSymbolDocs(itf),\n properties: itf\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n methods: itf.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n };\n }\n\n private mapToTypeAliasInfo(ta: any): TypeAliasInfo {\n return {\n name: ta.getName(),\n type: ta.getType().getText(),\n ...this.getSymbolDocs(ta),\n };\n }\n\n private mapToEnumInfo(enm: any): EnumInfo {\n return {\n name: enm.getName(),\n ...this.getSymbolDocs(enm),\n members: enm.getMembers().map((m: any) => m.getName()),\n };\n }\n\n private deduplicateLocations<\n T extends { file: string; line: number; column: number },\n >(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport const typescriptAdapter = new TypeScriptAdapter();\n","import { Project } from 'ts-morph';\nimport path from 'path';\nimport fs from 'fs';\nimport { glob } from 'glob';\nimport { validateWorkspacePath } from './security.js';\n\n/**\n * ProjectManager handles tsconfig discovery and Project lifecycle.\n * One Project per tsconfig.json to handle monorepo project boundaries correctly.\n */\nexport class ProjectManager {\n private projects: Map<string, Project> = new Map();\n private tsconfigCache: Map<string, string[]> = new Map();\n private accessOrder: string[] = []; // MRU at front\n private maxProjects: number = 4;\n\n /**\n * Find all tsconfig.json files in a directory (recursive)\n */\n public async findTsConfigs(rootDir: string): Promise<string[]> {\n const safeRoot = validateWorkspacePath(rootDir);\n if (this.tsconfigCache.has(safeRoot)) {\n return this.tsconfigCache.get(safeRoot)!;\n }\n\n const configs = await glob('**/tsconfig.json', {\n cwd: safeRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n this.tsconfigCache.set(safeRoot, configs);\n return configs;\n }\n\n /**\n * Ensure a Project exists for a given tsconfig path, managing LRU cache\n */\n public ensureProject(tsconfigPath: string): Project {\n this.checkMemoryPressure();\n\n // Cache hit\n if (this.projects.has(tsconfigPath)) {\n this.moveToFront(tsconfigPath);\n return this.projects.get(tsconfigPath)!;\n }\n\n // Evict if full\n while (this.projects.size >= this.maxProjects) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n\n // Create with lazy file loading\n const project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true, // KEY: don't load all files\n });\n\n this.projects.set(tsconfigPath, project);\n this.accessOrder.unshift(tsconfigPath);\n return project;\n }\n\n /**\n * Move a tsconfig path to the front of the access order (MRU)\n */\n private moveToFront(tsconfigPath: string) {\n const index = this.accessOrder.indexOf(tsconfigPath);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n this.accessOrder.unshift(tsconfigPath);\n }\n }\n\n private checkMemoryPressure(): void {\n const heapUsed = process.memoryUsage().heapUsed / 1024 / 1024;\n const maxHeap = parseInt(process.env.AST_MAX_HEAP_MB || '1536', 10);\n\n while (heapUsed > maxHeap && this.projects.size > 1) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n }\n\n public disposeProject(tsconfigPath: string): void {\n const project = this.projects.get(tsconfigPath);\n if (project) {\n // Forget files explicitly\n for (const sourceFile of project.getSourceFiles()) {\n project.removeSourceFile(sourceFile);\n }\n this.projects.delete(tsconfigPath);\n }\n }\n\n /**\n * Find the nearest tsconfig.json for a file\n */\n public async findNearestTsConfig(\n filePath: string\n ): Promise<string | undefined> {\n const safePath = validateWorkspacePath(filePath);\n let currentDir = path.dirname(safePath);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const tsconfigPath = path.join(currentDir, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n return tsconfigPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return undefined;\n }\n\n /**\n * Get all tsconfigs for a path\n */\n public async getProjectsForPath(rootDir: string): Promise<string[]> {\n return this.findTsConfigs(rootDir);\n }\n\n /**\n * Dispose all projects to free memory\n */\n public disposeAll(): void {\n for (const [key] of this.projects) {\n this.disposeProject(key);\n }\n this.accessOrder = [];\n }\n}\n\nexport const projectManager = new ProjectManager();\n","import { projectManager } from '../project-manager.js';\nimport { IndexingStats, SymbolKind } from '../types.js';\nimport { validateWorkspacePath } from '../security.js';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport { Node } from 'ts-morph';\n\nexport interface SymbolEntry {\n name: string;\n kind: SymbolKind;\n file: string;\n line: number;\n column: number;\n exported: boolean;\n}\n\nexport interface DiskCache {\n version: 1;\n rootDir: string;\n builtAt: string;\n fileHashes: Record<string, number>; // file -> mtimeMs\n symbols: Record<string, SymbolEntry[]>;\n}\n\nexport class SymbolIndex {\n private index: Record<string, SymbolEntry[]> = {};\n\n private getCachePath(rootDir: string): string {\n const hash = crypto\n .createHash('sha256')\n .update(rootDir)\n .digest('hex')\n .slice(0, 12);\n return path.join(\n process.platform === 'win32' ? process.env.TEMP || 'c:/temp' : '/tmp',\n `ast-index-${hash}.json`\n );\n }\n\n private isCacheValid(cached: DiskCache, rootDir: string): boolean {\n if (cached.rootDir !== rootDir) return false;\n\n for (const [file, cachedMtime] of Object.entries(cached.fileHashes)) {\n if (!fs.existsSync(file)) return false;\n if (fs.statSync(file).mtimeMs !== cachedMtime) return false;\n }\n\n return true;\n }\n\n private computeStats(\n cache: DiskCache,\n duration_ms?: number,\n memory_mb?: number\n ): IndexingStats {\n const files = Object.keys(cache.fileHashes).length;\n let functions = 0;\n let classes = 0;\n let interfaces = 0;\n let types = 0;\n\n for (const entries of Object.values(cache.symbols)) {\n for (const entry of entries) {\n if (entry.kind === 'function' || entry.kind === 'method') functions++;\n if (entry.kind === 'class') classes++;\n if (entry.kind === 'interface') interfaces++;\n if (entry.kind === 'type_alias') types++;\n }\n }\n\n return {\n indexed: {\n files,\n functions,\n classes,\n interfaces,\n types,\n },\n duration_ms: duration_ms || 0,\n memory_mb: memory_mb || 0,\n };\n }\n\n private mapKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n /**\n * Build/Warm the index for a given path\n */\n public async buildIndex(rootDir: string): Promise<IndexingStats> {\n const startTime = Date.now();\n const safeRoot = validateWorkspacePath(rootDir);\n const cachePath = this.getCachePath(safeRoot);\n\n if (fs.existsSync(cachePath)) {\n try {\n const cached: DiskCache = JSON.parse(\n fs.readFileSync(cachePath, 'utf-8')\n );\n if (this.isCacheValid(cached, safeRoot)) {\n this.index = cached.symbols;\n return this.computeStats(\n cached,\n Date.now() - startTime,\n process.memoryUsage().heapUsed / 1024 / 1024\n );\n }\n } catch {\n // Corrupt cache, ignore\n }\n }\n\n const tsconfigs = await projectManager.getProjectsForPath(safeRoot);\n const symbols: Record<string, SymbolEntry[]> = {};\n const fileHashes: Record<string, number> = {};\n\n for (const config of tsconfigs) {\n const project = projectManager.ensureProject(config);\n // We need to force load files for indexing\n project.addSourceFilesFromTsConfig(config);\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n try {\n fileHashes[filePath] = fs.statSync(filePath).mtimeMs;\n } catch {\n continue;\n }\n\n // Extract exported declarations\n for (const [name, decls] of sourceFile.getExportedDeclarations()) {\n for (const decl of decls) {\n const entry: SymbolEntry = {\n name,\n kind: this.mapKind(decl as Node),\n file: filePath,\n line: decl.getStartLineNumber(),\n column: decl.getStart() - decl.getStartLinePos(),\n exported: true,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n\n // Extract non-exported top-level declarations\n for (const fn of sourceFile.getFunctions()) {\n const name = fn.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === fn.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'function',\n file: filePath,\n line: fn.getStartLineNumber(),\n column: fn.getStart() - fn.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n for (const cls of sourceFile.getClasses()) {\n const name = cls.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === cls.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'class',\n file: filePath,\n line: cls.getStartLineNumber(),\n column: cls.getStart() - cls.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n }\n }\n\n const cache: DiskCache = {\n version: 1,\n rootDir: safeRoot,\n builtAt: new Date().toISOString(),\n fileHashes,\n symbols,\n };\n\n fs.mkdirSync(path.dirname(cachePath), { recursive: true });\n fs.writeFileSync(cachePath, JSON.stringify(cache));\n\n this.index = symbols;\n\n const duration = Date.now() - startTime;\n const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;\n\n return this.computeStats(cache, duration, Math.round(memoryUsage));\n }\n\n public lookup(name: string): SymbolEntry[] {\n return this.index[name] || [];\n }\n\n public lookupByFile(file: string): SymbolEntry[] {\n return Object.values(this.index)\n .flat()\n .filter((e) => e.file === file);\n }\n}\n\nexport const symbolIndex = new SymbolIndex();\n","import { Worker } from 'worker_threads';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface WorkerTask<T> {\n id: string;\n type: string;\n payload: unknown;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private available: Worker[] = [];\n private queue: WorkerTask<unknown>[] = [];\n private activeJobs = new Map<string, WorkerTask<unknown>>();\n private taskId = 0;\n\n constructor(private poolSize: number) {}\n\n async init(): Promise<void> {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js'); // Assuming tsup builds this\n\n for (let i = 0; i < this.poolSize; i++) {\n const worker = new Worker(workerPath);\n worker.on('message', (msg) => this.handleResult(msg));\n worker.on('error', (err) => this.handleWorkerError(worker, err));\n this.workers.push(worker);\n this.available.push(worker);\n }\n }\n\n async execute<T>(type: string, payload: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = String(++this.taskId);\n const task: WorkerTask<T> = { id, type, payload, resolve, reject };\n\n const worker = this.available.pop();\n if (worker) {\n this.dispatch(worker, task);\n } else {\n this.queue.push(task as WorkerTask<unknown>);\n }\n });\n }\n\n private dispatch<T>(worker: Worker, task: WorkerTask<T>): void {\n this.activeJobs.set(task.id, task as WorkerTask<unknown>);\n worker.postMessage({ id: task.id, type: task.type, payload: task.payload });\n }\n\n private handleResult(msg: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n const task = this.activeJobs.get(msg.id);\n if (!task) return;\n\n this.activeJobs.delete(msg.id);\n\n if (msg.error) {\n task.reject(new Error(msg.error));\n } else {\n task.resolve(msg.result);\n }\n\n // Return worker to pool\n // properly finding the worker is tricky without storing mapping.\n // let's just make it simpler: each message comes from a worker, but we don't know which one.\n // Actually, worker.on('message') should be tied to the worker!\n }\n\n private handleWorkerError(worker: Worker, err: Error): void {\n const idx = this.workers.indexOf(worker);\n if (idx !== -1) {\n worker.terminate();\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js');\n const newWorker = new Worker(workerPath);\n newWorker.on('message', (msg) => this.handleResult(msg));\n newWorker.on('error', (_e) => this.handleWorkerError(newWorker, _e));\n this.workers[idx] = newWorker;\n this.available.push(newWorker);\n }\n }\n\n async terminate(): Promise<void> {\n await Promise.all(this.workers.map((w) => w.terminate()));\n this.workers = [];\n this.available = [];\n }\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findReferences(symbol, path, limit, offset);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function getFileStructure(file: string) {\n return await typescriptAdapter.getFileStructure(file);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind, Node } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nexport async function getSymbolDocs(\n symbol: string,\n filePath: string\n): Promise<any> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n\n if (sourceFile) {\n const node = sourceFile\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .find((id: Node) => id.getText() === symbol);\n\n if (node) {\n const decls = node.getSymbol()?.getDeclarations();\n if (decls && decls.length > 0) {\n const docs = typescriptAdapter.getSymbolDocs(decls[0]);\n if (docs) {\n return {\n symbol,\n file: sourceFile.getFilePath(),\n line: sourceFile.getLineAndColumnAtPos(decls[0].getStart()).line,\n ...docs,\n };\n }\n }\n }\n }\n\n return undefined;\n}\n","import { symbolIndex } from '../index/symbol-index.js';\n\nexport async function buildSymbolIndex(path: string) {\n return await symbolIndex.buildIndex(path);\n}\n"],"mappings":"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","names":["path","import_ts_morph","import_fs","import_path","path","fs","import_fs","import_path","import_ts_morph","crypto","path","fs","import_path","path","path","tsconfig","fs","searchCode","path","path","path","import_ts_morph","path","path"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","../src/security.ts","../src/tools/search-code.ts","../src/index.ts","../src/schemas.ts","../src/tools/resolve-definition.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import path from 'path';\nimport fs from 'fs';\n\nexport function resolveWorkspaceRoot(): string {\n return process.env.AST_WORKSPACE_ROOT || process.cwd();\n}\n\nexport function validateWorkspacePath(inputPath: string): string {\n const root = resolveWorkspaceRoot();\n const resolved = path.resolve(root, inputPath);\n const normalized = path.normalize(resolved);\n\n // Reject path traversal\n if (!normalized.startsWith(root)) {\n throw new Error(\n `Path traversal detected: ${inputPath} escapes workspace root`\n );\n }\n\n // Reject null bytes\n if (normalized.includes('\\0')) {\n throw new Error('Path contains null bytes');\n }\n\n return normalized;\n}\n\nexport function validateFileExists(filePath: string): string {\n const safe = validateWorkspacePath(filePath);\n if (!fs.existsSync(safe)) {\n throw new Error(`File not found: ${filePath}`);\n }\n if (!fs.statSync(safe).isFile()) {\n throw new Error(`Not a file: ${filePath}`);\n }\n return safe;\n}\n","import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { rgPath } from '@vscode/ripgrep';\nimport { validateWorkspacePath } from '../security.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface SearchResult {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nexport async function searchCode(\n pattern: string,\n searchPath: string,\n filePattern?: string,\n limit: number = 50,\n regex: boolean = true\n): Promise<SearchResult[]> {\n const safePath = validateWorkspacePath(searchPath);\n\n const args = [\n '--json',\n '--max-count',\n limit.toString(),\n '--max-columns',\n '500',\n ];\n\n if (!regex) {\n args.push('--fixed-strings');\n }\n\n args.push(pattern, safePath);\n\n if (filePattern) {\n args.push('--glob', filePattern);\n }\n\n // Common exclusions\n args.push('--glob', '!**/node_modules/**');\n args.push('--glob', '!**/dist/**');\n args.push('--glob', '!**/.git/**');\n\n try {\n const { stdout } = await execFileAsync(rgPath, args);\n const lines = stdout.split('\\n').filter(Boolean);\n const results: SearchResult[] = [];\n\n for (const line of lines) {\n const data = JSON.parse(line);\n if (data.type === 'match') {\n const file = data.data.path.text;\n const lineNumber = data.data.line_number;\n const submatches = data.data.submatches;\n\n for (const submatch of submatches) {\n results.push({\n file,\n line: lineNumber,\n column: submatch.start,\n text: data.data.lines.text.trim(),\n });\n }\n }\n }\n\n return results.slice(0, limit);\n } catch (error: any) {\n if (error.code === 1) {\n // rg returns 1 if no matches found\n return [];\n }\n throw error;\n }\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols =\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 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 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","path","fs","import_fs","import_path","import_ts_morph","crypto","path","fs","import_path","path","path","tsconfig","fs","searchCode","path","path","path","import_ts_morph","path","path"]}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
import {
|
|
2
3
|
searchCode,
|
|
3
4
|
validateWorkspacePath
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-KTDNJP4B.js";
|
|
5
6
|
|
|
6
7
|
// src/index.ts
|
|
7
8
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -474,7 +475,7 @@ var TypeScriptAdapter = class {
|
|
|
474
475
|
return { references: [], total_count: 0 };
|
|
475
476
|
const targetNode = exported[0];
|
|
476
477
|
try {
|
|
477
|
-
const { searchCode: searchCode2 } = await import("./search-code-
|
|
478
|
+
const { searchCode: searchCode2 } = await import("./search-code-NPNOCF3R.js");
|
|
478
479
|
const searchResults = await searchCode2(
|
|
479
480
|
symbolName,
|
|
480
481
|
path4,
|
|
@@ -488,7 +489,7 @@ var TypeScriptAdapter = class {
|
|
|
488
489
|
}
|
|
489
490
|
} catch (_e) {
|
|
490
491
|
}
|
|
491
|
-
const refSymbols = targetNode.findReferences
|
|
492
|
+
const refSymbols = "findReferences" in targetNode && typeof targetNode.findReferences === "function" ? targetNode.findReferences() : void 0;
|
|
492
493
|
if (!refSymbols) return { references: [], total_count: 0 };
|
|
493
494
|
const results = [];
|
|
494
495
|
for (const refSymbol of refSymbols) {
|
|
@@ -538,7 +539,7 @@ var TypeScriptAdapter = class {
|
|
|
538
539
|
return { implementations: [], total_count: 0 };
|
|
539
540
|
}
|
|
540
541
|
try {
|
|
541
|
-
const { searchCode: searchCode2 } = await import("./search-code-
|
|
542
|
+
const { searchCode: searchCode2 } = await import("./search-code-NPNOCF3R.js");
|
|
542
543
|
const searchResults = await searchCode2(
|
|
543
544
|
symbolName,
|
|
544
545
|
path4,
|
|
@@ -553,7 +554,7 @@ var TypeScriptAdapter = class {
|
|
|
553
554
|
} catch (_e) {
|
|
554
555
|
}
|
|
555
556
|
const results = [];
|
|
556
|
-
const implementations = targetNode.getImplementations
|
|
557
|
+
const implementations = "getImplementations" in targetNode && typeof targetNode.getImplementations === "function" ? targetNode.getImplementations() : void 0;
|
|
557
558
|
if (implementations) {
|
|
558
559
|
for (const impl of implementations) {
|
|
559
560
|
const sf = impl.getSourceFile();
|
|
@@ -665,42 +666,46 @@ var TypeScriptAdapter = class {
|
|
|
665
666
|
}
|
|
666
667
|
mapToFunctionInfo(fn) {
|
|
667
668
|
return {
|
|
668
|
-
name: fn
|
|
669
|
+
name: fn?.getName?.() || "anonymous",
|
|
669
670
|
...this.getSymbolDocs(fn),
|
|
670
|
-
params: fn
|
|
671
|
+
params: (fn?.getParameters?.() || []).map((p) => ({
|
|
671
672
|
name: p.getName(),
|
|
672
673
|
type: p.getType().getText()
|
|
673
674
|
})),
|
|
674
|
-
returnType: fn
|
|
675
|
+
returnType: fn?.getReturnType?.()?.getText?.() || "unknown"
|
|
675
676
|
};
|
|
676
677
|
}
|
|
677
678
|
mapToPropertyInfo(p) {
|
|
678
679
|
return {
|
|
679
|
-
name: p
|
|
680
|
-
type: p
|
|
680
|
+
name: p?.getName?.() || "unknown",
|
|
681
|
+
type: p?.getType?.()?.getText?.() || "unknown",
|
|
681
682
|
...this.getSymbolDocs(p)
|
|
682
683
|
};
|
|
683
684
|
}
|
|
684
685
|
mapToInterfaceInfo(itf) {
|
|
685
686
|
return {
|
|
686
|
-
name: itf
|
|
687
|
+
name: itf?.getName?.() || "unknown",
|
|
687
688
|
...this.getSymbolDocs(itf),
|
|
688
|
-
properties: itf.getProperties()
|
|
689
|
-
|
|
689
|
+
properties: (itf.getProperties?.() || []).map(
|
|
690
|
+
(p) => this.mapToPropertyInfo(p)
|
|
691
|
+
) || [],
|
|
692
|
+
methods: (itf?.getMethods?.() || []).map(
|
|
693
|
+
(m) => this.mapToFunctionInfo(m)
|
|
694
|
+
) || []
|
|
690
695
|
};
|
|
691
696
|
}
|
|
692
697
|
mapToTypeAliasInfo(ta) {
|
|
693
698
|
return {
|
|
694
|
-
name: ta
|
|
695
|
-
type: ta
|
|
699
|
+
name: ta?.getName?.() || "unknown",
|
|
700
|
+
type: ta?.getType?.()?.getText?.() || "unknown",
|
|
696
701
|
...this.getSymbolDocs(ta)
|
|
697
702
|
};
|
|
698
703
|
}
|
|
699
704
|
mapToEnumInfo(enm) {
|
|
700
705
|
return {
|
|
701
|
-
name: enm
|
|
706
|
+
name: enm?.getName?.() || "unknown",
|
|
702
707
|
...this.getSymbolDocs(enm),
|
|
703
|
-
members: enm
|
|
708
|
+
members: (enm?.getMembers?.() || []).map((m) => m.getName()) || []
|
|
704
709
|
};
|
|
705
710
|
}
|
|
706
711
|
deduplicateLocations(locations) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/resolve-definition.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols = (targetNode as any).findReferences?.();\n if (!refSymbols) return { references: [], total_count: 0 };\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const sf = ref.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(ref.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text: ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n references: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n\n public async findImplementations(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ implementations: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { implementations: [], total_count: 0 };\n\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { implementations: [], total_count: 0 };\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<{\n implementations: ReferenceLocation[];\n total_count: number;\n }>('find_implementations', {\n tsconfig,\n file: hit.file,\n symbol: symbolName,\n });\n\n // Apply pagination\n return {\n implementations: result.implementations.slice(offset, offset + limit),\n total_count: result.total_count,\n };\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { implementations: [], total_count: 0 };\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { implementations: [], total_count: 0 };\n\n const targetNode = exported[0];\n if (\n !Node.isClassDeclaration(targetNode) &&\n !Node.isInterfaceDeclaration(targetNode)\n ) {\n return { implementations: [], total_count: 0 };\n }\n\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const results: ReferenceLocation[] = [];\n const implementations = (targetNode as any).getImplementations?.();\n if (implementations) {\n for (const impl of implementations) {\n const sf = impl.getSourceFile();\n const lc = sf.getLineAndColumnAtPos(impl.getTextSpan().getStart());\n results.push({\n file: sf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n }\n\n const unique = this.deduplicateLocations(results);\n return {\n implementations: unique.slice(offset, offset + limit),\n total_count: unique.length,\n };\n }\n }\n\n public async getFileStructure(\n filePath: string\n ): Promise<FileStructure | undefined> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n if (!sourceFile) return undefined;\n\n const structure: FileStructure = {\n file: safePath,\n imports: sourceFile.getImportDeclarations().map((imp: any) => ({\n module: imp.getModuleSpecifierValue(),\n names: imp.getNamedImports().map((ni: any) => ni.getName()),\n })),\n exports: sourceFile.getExportSymbols().map((sym: any) => ({\n name: sym.getName(),\n kind: this.mapSymbolKind(sym),\n })),\n classes: sourceFile\n .getClasses()\n .map((cls: any) => this.mapToClassInfo(cls)),\n functions: sourceFile\n .getFunctions()\n .map((fn: any) => this.mapToFunctionInfo(fn)),\n interfaces: sourceFile\n .getInterfaces()\n .map((itf: any) => this.mapToInterfaceInfo(itf)),\n typeAliases: sourceFile\n .getTypeAliases()\n .map((ta: any) => this.mapToTypeAliasInfo(ta)),\n enums: sourceFile.getEnums().map((enm: any) => this.mapToEnumInfo(enm)),\n };\n\n return structure;\n }\n\n public async shutdown(): Promise<void> {\n await this.pool.terminate();\n }\n\n private mapToDefinitionLocation(node: Node): DefinitionLocation {\n const sourceFile = node.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(node.getStart());\n\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: this.mapNodeToSymbolKind(node),\n snippet: node.getText(),\n documentation: this.getJsDoc(node),\n };\n }\n\n private mapNodeToSymbolKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n private mapSymbolKind(symbol: any): SymbolKind {\n const decls = symbol.getDeclarations();\n if (decls.length > 0) return this.mapNodeToSymbolKind(decls[0]);\n return 'variable';\n }\n\n private getJsDoc(node: Node): string | undefined {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n }\n\n public getSymbolDocs(node: Node) {\n if (Node.isJSDocable(node)) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n const doc = docs[0];\n return {\n documentation: doc.getCommentText(),\n tags: doc.getTags().map((tag) => ({\n name: tag.getTagName(),\n text: tag.getCommentText() || '',\n })),\n };\n }\n }\n return undefined;\n }\n\n private mapToClassInfo(cls: any): ClassInfo {\n return {\n name: cls.getName() || 'anonymous',\n ...this.getSymbolDocs(cls),\n methods: cls.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n properties: cls\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n };\n }\n\n private mapToFunctionInfo(fn: any): FunctionInfo {\n return {\n name: fn.getName() || 'anonymous',\n ...this.getSymbolDocs(fn),\n params: fn.getParameters().map((p: any) => ({\n name: p.getName(),\n type: p.getType().getText(),\n })),\n returnType: fn.getReturnType().getText(),\n };\n }\n\n private mapToPropertyInfo(p: any) {\n return {\n name: p.getName(),\n type: p.getType().getText(),\n ...this.getSymbolDocs(p),\n };\n }\n\n private mapToInterfaceInfo(itf: any): InterfaceInfo {\n return {\n name: itf.getName(),\n ...this.getSymbolDocs(itf),\n properties: itf\n .getProperties()\n .map((p: any) => this.mapToPropertyInfo(p)),\n methods: itf.getMethods().map((m: any) => this.mapToFunctionInfo(m)),\n };\n }\n\n private mapToTypeAliasInfo(ta: any): TypeAliasInfo {\n return {\n name: ta.getName(),\n type: ta.getType().getText(),\n ...this.getSymbolDocs(ta),\n };\n }\n\n private mapToEnumInfo(enm: any): EnumInfo {\n return {\n name: enm.getName(),\n ...this.getSymbolDocs(enm),\n members: enm.getMembers().map((m: any) => m.getName()),\n };\n }\n\n private deduplicateLocations<\n T extends { file: string; line: number; column: number },\n >(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport const typescriptAdapter = new TypeScriptAdapter();\n","import { Project } from 'ts-morph';\nimport path from 'path';\nimport fs from 'fs';\nimport { glob } from 'glob';\nimport { validateWorkspacePath } from './security.js';\n\n/**\n * ProjectManager handles tsconfig discovery and Project lifecycle.\n * One Project per tsconfig.json to handle monorepo project boundaries correctly.\n */\nexport class ProjectManager {\n private projects: Map<string, Project> = new Map();\n private tsconfigCache: Map<string, string[]> = new Map();\n private accessOrder: string[] = []; // MRU at front\n private maxProjects: number = 4;\n\n /**\n * Find all tsconfig.json files in a directory (recursive)\n */\n public async findTsConfigs(rootDir: string): Promise<string[]> {\n const safeRoot = validateWorkspacePath(rootDir);\n if (this.tsconfigCache.has(safeRoot)) {\n return this.tsconfigCache.get(safeRoot)!;\n }\n\n const configs = await glob('**/tsconfig.json', {\n cwd: safeRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n this.tsconfigCache.set(safeRoot, configs);\n return configs;\n }\n\n /**\n * Ensure a Project exists for a given tsconfig path, managing LRU cache\n */\n public ensureProject(tsconfigPath: string): Project {\n this.checkMemoryPressure();\n\n // Cache hit\n if (this.projects.has(tsconfigPath)) {\n this.moveToFront(tsconfigPath);\n return this.projects.get(tsconfigPath)!;\n }\n\n // Evict if full\n while (this.projects.size >= this.maxProjects) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n\n // Create with lazy file loading\n const project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true, // KEY: don't load all files\n });\n\n this.projects.set(tsconfigPath, project);\n this.accessOrder.unshift(tsconfigPath);\n return project;\n }\n\n /**\n * Move a tsconfig path to the front of the access order (MRU)\n */\n private moveToFront(tsconfigPath: string) {\n const index = this.accessOrder.indexOf(tsconfigPath);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n this.accessOrder.unshift(tsconfigPath);\n }\n }\n\n private checkMemoryPressure(): void {\n const heapUsed = process.memoryUsage().heapUsed / 1024 / 1024;\n const maxHeap = parseInt(process.env.AST_MAX_HEAP_MB || '1536', 10);\n\n while (heapUsed > maxHeap && this.projects.size > 1) {\n const oldest = this.accessOrder.pop()!;\n this.disposeProject(oldest);\n }\n }\n\n public disposeProject(tsconfigPath: string): void {\n const project = this.projects.get(tsconfigPath);\n if (project) {\n // Forget files explicitly\n for (const sourceFile of project.getSourceFiles()) {\n project.removeSourceFile(sourceFile);\n }\n this.projects.delete(tsconfigPath);\n }\n }\n\n /**\n * Find the nearest tsconfig.json for a file\n */\n public async findNearestTsConfig(\n filePath: string\n ): Promise<string | undefined> {\n const safePath = validateWorkspacePath(filePath);\n let currentDir = path.dirname(safePath);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const tsconfigPath = path.join(currentDir, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n return tsconfigPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return undefined;\n }\n\n /**\n * Get all tsconfigs for a path\n */\n public async getProjectsForPath(rootDir: string): Promise<string[]> {\n return this.findTsConfigs(rootDir);\n }\n\n /**\n * Dispose all projects to free memory\n */\n public disposeAll(): void {\n for (const [key] of this.projects) {\n this.disposeProject(key);\n }\n this.accessOrder = [];\n }\n}\n\nexport const projectManager = new ProjectManager();\n","import { projectManager } from '../project-manager.js';\nimport { IndexingStats, SymbolKind } from '../types.js';\nimport { validateWorkspacePath } from '../security.js';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport { Node } from 'ts-morph';\n\nexport interface SymbolEntry {\n name: string;\n kind: SymbolKind;\n file: string;\n line: number;\n column: number;\n exported: boolean;\n}\n\nexport interface DiskCache {\n version: 1;\n rootDir: string;\n builtAt: string;\n fileHashes: Record<string, number>; // file -> mtimeMs\n symbols: Record<string, SymbolEntry[]>;\n}\n\nexport class SymbolIndex {\n private index: Record<string, SymbolEntry[]> = {};\n\n private getCachePath(rootDir: string): string {\n const hash = crypto\n .createHash('sha256')\n .update(rootDir)\n .digest('hex')\n .slice(0, 12);\n return path.join(\n process.platform === 'win32' ? process.env.TEMP || 'c:/temp' : '/tmp',\n `ast-index-${hash}.json`\n );\n }\n\n private isCacheValid(cached: DiskCache, rootDir: string): boolean {\n if (cached.rootDir !== rootDir) return false;\n\n for (const [file, cachedMtime] of Object.entries(cached.fileHashes)) {\n if (!fs.existsSync(file)) return false;\n if (fs.statSync(file).mtimeMs !== cachedMtime) return false;\n }\n\n return true;\n }\n\n private computeStats(\n cache: DiskCache,\n duration_ms?: number,\n memory_mb?: number\n ): IndexingStats {\n const files = Object.keys(cache.fileHashes).length;\n let functions = 0;\n let classes = 0;\n let interfaces = 0;\n let types = 0;\n\n for (const entries of Object.values(cache.symbols)) {\n for (const entry of entries) {\n if (entry.kind === 'function' || entry.kind === 'method') functions++;\n if (entry.kind === 'class') classes++;\n if (entry.kind === 'interface') interfaces++;\n if (entry.kind === 'type_alias') types++;\n }\n }\n\n return {\n indexed: {\n files,\n functions,\n classes,\n interfaces,\n types,\n },\n duration_ms: duration_ms || 0,\n memory_mb: memory_mb || 0,\n };\n }\n\n private mapKind(node: Node): SymbolKind {\n if (Node.isClassDeclaration(node)) return 'class';\n if (Node.isFunctionDeclaration(node)) return 'function';\n if (Node.isInterfaceDeclaration(node)) return 'interface';\n if (Node.isTypeAliasDeclaration(node)) return 'type_alias';\n if (Node.isEnumDeclaration(node)) return 'enum';\n if (Node.isVariableDeclaration(node)) return 'variable';\n if (Node.isMethodDeclaration(node)) return 'method';\n if (Node.isPropertyDeclaration(node)) return 'property';\n if (Node.isParameterDeclaration(node)) return 'parameter';\n return 'variable';\n }\n\n /**\n * Build/Warm the index for a given path\n */\n public async buildIndex(rootDir: string): Promise<IndexingStats> {\n const startTime = Date.now();\n const safeRoot = validateWorkspacePath(rootDir);\n const cachePath = this.getCachePath(safeRoot);\n\n if (fs.existsSync(cachePath)) {\n try {\n const cached: DiskCache = JSON.parse(\n fs.readFileSync(cachePath, 'utf-8')\n );\n if (this.isCacheValid(cached, safeRoot)) {\n this.index = cached.symbols;\n return this.computeStats(\n cached,\n Date.now() - startTime,\n process.memoryUsage().heapUsed / 1024 / 1024\n );\n }\n } catch {\n // Corrupt cache, ignore\n }\n }\n\n const tsconfigs = await projectManager.getProjectsForPath(safeRoot);\n const symbols: Record<string, SymbolEntry[]> = {};\n const fileHashes: Record<string, number> = {};\n\n for (const config of tsconfigs) {\n const project = projectManager.ensureProject(config);\n // We need to force load files for indexing\n project.addSourceFilesFromTsConfig(config);\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n try {\n fileHashes[filePath] = fs.statSync(filePath).mtimeMs;\n } catch {\n continue;\n }\n\n // Extract exported declarations\n for (const [name, decls] of sourceFile.getExportedDeclarations()) {\n for (const decl of decls) {\n const entry: SymbolEntry = {\n name,\n kind: this.mapKind(decl as Node),\n file: filePath,\n line: decl.getStartLineNumber(),\n column: decl.getStart() - decl.getStartLinePos(),\n exported: true,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n\n // Extract non-exported top-level declarations\n for (const fn of sourceFile.getFunctions()) {\n const name = fn.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === fn.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'function',\n file: filePath,\n line: fn.getStartLineNumber(),\n column: fn.getStart() - fn.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n for (const cls of sourceFile.getClasses()) {\n const name = cls.getName();\n if (\n name &&\n !symbols[name]?.some(\n (s) => s.file === filePath && s.line === cls.getStartLineNumber()\n )\n ) {\n const entry: SymbolEntry = {\n name,\n kind: 'class',\n file: filePath,\n line: cls.getStartLineNumber(),\n column: cls.getStart() - cls.getStartLinePos(),\n exported: false,\n };\n (symbols[name] ||= []).push(entry);\n }\n }\n }\n }\n\n const cache: DiskCache = {\n version: 1,\n rootDir: safeRoot,\n builtAt: new Date().toISOString(),\n fileHashes,\n symbols,\n };\n\n fs.mkdirSync(path.dirname(cachePath), { recursive: true });\n fs.writeFileSync(cachePath, JSON.stringify(cache));\n\n this.index = symbols;\n\n const duration = Date.now() - startTime;\n const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;\n\n return this.computeStats(cache, duration, Math.round(memoryUsage));\n }\n\n public lookup(name: string): SymbolEntry[] {\n return this.index[name] || [];\n }\n\n public lookupByFile(file: string): SymbolEntry[] {\n return Object.values(this.index)\n .flat()\n .filter((e) => e.file === file);\n }\n}\n\nexport const symbolIndex = new SymbolIndex();\n","import { Worker } from 'worker_threads';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface WorkerTask<T> {\n id: string;\n type: string;\n payload: unknown;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private available: Worker[] = [];\n private queue: WorkerTask<unknown>[] = [];\n private activeJobs = new Map<string, WorkerTask<unknown>>();\n private taskId = 0;\n\n constructor(private poolSize: number) {}\n\n async init(): Promise<void> {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js'); // Assuming tsup builds this\n\n for (let i = 0; i < this.poolSize; i++) {\n const worker = new Worker(workerPath);\n worker.on('message', (msg) => this.handleResult(msg));\n worker.on('error', (err) => this.handleWorkerError(worker, err));\n this.workers.push(worker);\n this.available.push(worker);\n }\n }\n\n async execute<T>(type: string, payload: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = String(++this.taskId);\n const task: WorkerTask<T> = { id, type, payload, resolve, reject };\n\n const worker = this.available.pop();\n if (worker) {\n this.dispatch(worker, task);\n } else {\n this.queue.push(task as WorkerTask<unknown>);\n }\n });\n }\n\n private dispatch<T>(worker: Worker, task: WorkerTask<T>): void {\n this.activeJobs.set(task.id, task as WorkerTask<unknown>);\n worker.postMessage({ id: task.id, type: task.type, payload: task.payload });\n }\n\n private handleResult(msg: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n const task = this.activeJobs.get(msg.id);\n if (!task) return;\n\n this.activeJobs.delete(msg.id);\n\n if (msg.error) {\n task.reject(new Error(msg.error));\n } else {\n task.resolve(msg.result);\n }\n\n // Return worker to pool\n // properly finding the worker is tricky without storing mapping.\n // let's just make it simpler: each message comes from a worker, but we don't know which one.\n // Actually, worker.on('message') should be tied to the worker!\n }\n\n private handleWorkerError(worker: Worker, err: Error): void {\n const idx = this.workers.indexOf(worker);\n if (idx !== -1) {\n worker.terminate();\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js');\n const newWorker = new Worker(workerPath);\n newWorker.on('message', (msg) => this.handleResult(msg));\n newWorker.on('error', (_e) => this.handleWorkerError(newWorker, _e));\n this.workers[idx] = newWorker;\n this.available.push(newWorker);\n }\n }\n\n async terminate(): Promise<void> {\n await Promise.all(this.workers.map((w) => w.terminate()));\n this.workers = [];\n this.available = [];\n }\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findReferences(symbol, path, limit, offset);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function getFileStructure(file: string) {\n return await typescriptAdapter.getFileStructure(file);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind, Node } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nexport async function getSymbolDocs(\n symbol: string,\n filePath: string\n): Promise<any> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n\n if (sourceFile) {\n const node = sourceFile\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .find((id: Node) => id.getText() === symbol);\n\n if (node) {\n const decls = node.getSymbol()?.getDeclarations();\n if (decls && decls.length > 0) {\n const docs = typescriptAdapter.getSymbolDocs(decls[0]);\n if (docs) {\n return {\n symbol,\n file: sourceFile.getFilePath(),\n line: sourceFile.getLineAndColumnAtPos(decls[0].getStart()).line,\n ...docs,\n };\n }\n }\n }\n }\n\n return undefined;\n}\n","import { symbolIndex } from '../index/symbol-index.js';\n\nexport async function buildSymbolIndex(path: string) {\n return await symbolIndex.buildIndex(path);\n}\n"],"mappings":"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","names":["Node","fs","fs","path","path","__dirname","path","tsconfig","fs","searchCode","Node","path","path","path","path","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/adapters/typescript-adapter.ts","../src/project-manager.ts","../src/index/symbol-index.ts","../src/worker/pool.ts","../src/tools/resolve-definition.ts","../src/tools/find-references.ts","../src/tools/find-implementations.ts","../src/tools/get-file-structure.ts","../src/tools/get-symbol-docs.ts","../src/tools/build-symbol-index.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n ResolveDefinitionSchema,\n FindReferencesSchema,\n FindImplementationsSchema,\n GetFileStructureSchema,\n SearchCodeSchema,\n GetSymbolDocsSchema,\n BuildSymbolIndexSchema,\n} from './schemas.js';\nimport { resolveDefinition } from './tools/resolve-definition.js';\nimport { findReferences } from './tools/find-references.js';\nimport { findImplementations } from './tools/find-implementations.js';\nimport { getFileStructure } from './tools/get-file-structure.js';\nimport { searchCode } from './tools/search-code.js';\nimport { getSymbolDocs } from './tools/get-symbol-docs.js';\nimport { buildSymbolIndex } from './tools/build-symbol-index.js';\n\n/**\n * AST-aware Code Exploration MCP Server\n */\nexport class ASTExplorerServer {\n private server: Server;\n private version: string = '0.1.0';\n\n constructor() {\n this.server = new Server(\n {\n name: 'ast-explorer-server',\n version: this.version,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n\n this.server.onerror = (error) => {\n console.error('[MCP Error]', error);\n };\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'resolve_definition',\n description: 'Find where a symbol is defined using TypeScript AST.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: {\n type: 'string',\n description: 'Symbol name (e.g., function, class)',\n },\n path: {\n type: 'string',\n description: 'Project root or target directory',\n },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_references',\n description: 'Find all usages of a symbol across the project.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'find_implementations',\n description:\n 'Find implementations of interfaces or abstract classes.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Interface/Class name' },\n path: { type: 'string', description: 'Project root' },\n limit: { type: 'number', default: 50 },\n offset: { type: 'number', default: 0 },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'get_file_structure',\n description:\n 'Get structural overview of a file (imports, exports, symbols).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Absolute path to file' },\n },\n required: ['file'],\n },\n },\n {\n name: 'search_code',\n description: 'Fast regex search via bundled ripgrep.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search' },\n filePattern: { type: 'string', description: 'Glob filter' },\n limit: { type: 'number', default: 50 },\n regex: { type: 'boolean', default: true },\n },\n required: ['pattern', 'path'],\n },\n },\n {\n name: 'get_symbol_docs',\n description: 'Get JSDoc/TSDoc for a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name' },\n path: { type: 'string', description: 'Project root' },\n },\n required: ['symbol', 'path'],\n },\n },\n {\n name: 'build_symbol_index',\n description: 'Warm the symbol index for faster navigation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Project root to index' },\n },\n required: ['path'],\n },\n },\n ],\n };\n });\n\n // Tool execution handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'resolve_definition': {\n const { symbol, path } = ResolveDefinitionSchema.parse(args);\n const results = await resolveDefinition(symbol, path);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_references': {\n const { symbol, path, limit, offset } =\n FindReferencesSchema.parse(args);\n const results = await findReferences(symbol, path, limit, offset);\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'find_implementations': {\n const { symbol, path, limit, offset } =\n FindImplementationsSchema.parse(args);\n const results = await findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_file_structure': {\n const { file } = GetFileStructureSchema.parse(args);\n const structure = await getFileStructure(file);\n return {\n content: [\n { type: 'text', text: JSON.stringify(structure, null, 2) },\n ],\n };\n }\n case 'search_code': {\n const { pattern, path, filePattern, limit, regex } =\n SearchCodeSchema.parse(args);\n const results = await searchCode(\n pattern,\n path,\n filePattern,\n limit,\n regex\n );\n return {\n content: [\n { type: 'text', text: JSON.stringify(results, null, 2) },\n ],\n };\n }\n case 'get_symbol_docs': {\n const { symbol, path } = GetSymbolDocsSchema.parse(args);\n const docs = await getSymbolDocs(symbol, path);\n return {\n content: [{ type: 'text', text: JSON.stringify(docs, null, 2) }],\n };\n }\n case 'build_symbol_index': {\n const { path } = BuildSymbolIndexSchema.parse(args);\n const stats = await buildSymbolIndex(path);\n return {\n content: [{ type: 'text', text: JSON.stringify(stats, null, 2) }],\n };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: any) {\n return {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n };\n }\n });\n }\n\n async run() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('AST Explorer MCP Server started');\n }\n}\n\n// Start the server\nconst server = new ASTExplorerServer();\nserver.run().catch((error) => {\n console.error('Fatal error starting AST Explorer MCP Server:', error);\n process.exit(1);\n});\n","import { z } from 'zod';\n\n/**\n * Tool 1: resolve_definition\n */\nexport const ResolveDefinitionSchema = z.object({\n symbol: z\n .string()\n .describe(\n 'Symbol name to resolve (function, class, type, interface, etc.)'\n ),\n path: z.string().describe('Project root or target directory'),\n});\n\n/**\n * Tool 2: find_references\n */\nexport const FindReferencesSchema = z.object({\n symbol: z.string().describe('Symbol name to find references for'),\n path: z.string().describe('Project root directory'),\n limit: z\n .number()\n .optional()\n .default(50)\n .describe('Max results per page (default 50)'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 3: find_implementations\n */\nexport const FindImplementationsSchema = z.object({\n symbol: z\n .string()\n .describe('Interface or abstract class name to find implementations for'),\n path: z.string().describe('Project root directory'),\n limit: z.number().optional().default(50).describe('Max results per page'),\n offset: z.number().optional().default(0).describe('Pagination offset'),\n});\n\n/**\n * Tool 4: get_file_structure\n */\nexport const GetFileStructureSchema = z.object({\n file: z.string().describe('Absolute path to the file to analyze'),\n});\n\n/**\n * Tool 5: search_code\n */\nexport const SearchCodeSchema = z.object({\n pattern: z.string().describe('Search pattern (regex by default)'),\n path: z.string().describe('Directory to search in'),\n filePattern: z.string().optional().describe('Glob filter (e.g., \"*.ts\")'),\n limit: z.number().optional().default(50).describe('Max matches to return'),\n regex: z\n .boolean()\n .optional()\n .default(true)\n .describe('Use regex mode (default true)'),\n});\n\n/**\n * Tool 6: get_symbol_docs\n */\nexport const GetSymbolDocsSchema = z.object({\n symbol: z.string().describe('Symbol name to get documentation for'),\n path: z.string().describe('Project root directory'),\n});\n\n/**\n * Tool 7: build_symbol_index\n */\nexport const BuildSymbolIndexSchema = z.object({\n path: z.string().describe('Project root directory to index'),\n});\n","import { Node } from 'ts-morph';\nimport fs from 'fs';\nimport {\n DefinitionLocation,\n ReferenceLocation,\n FileStructure,\n SymbolKind,\n ClassInfo,\n FunctionInfo,\n InterfaceInfo,\n TypeAliasInfo,\n EnumInfo,\n} from '../types.js';\nimport { projectManager } from '../project-manager.js';\nimport { symbolIndex } from '../index/symbol-index.js';\nimport { validateWorkspacePath } from '../security.js';\nimport { WorkerPool } from '../worker/pool.js';\n\nexport class TypeScriptAdapter {\n private pool: WorkerPool;\n\n constructor() {\n const poolSize = parseInt(process.env.AST_WORKER_POOL_SIZE || '2');\n this.pool = new WorkerPool(poolSize);\n }\n public async resolveDefinition(\n symbolName: string,\n path: string\n ): Promise<DefinitionLocation[]> {\n validateWorkspacePath(path);\n\n // Fast path: index lookup (O(1)) to find the file\n const indexHits = symbolIndex.lookup(symbolName);\n if (indexHits.length > 0) {\n const results: DefinitionLocation[] = [];\n for (const hit of indexHits) {\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (tsconfig) {\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (sourceFile) {\n const exported = sourceFile\n .getExportedDeclarations()\n .get(symbolName);\n if (exported && exported.length > 0) {\n results.push(this.mapToDefinitionLocation(exported[0] as Node));\n continue;\n }\n }\n }\n // Fallback if ts-morph loading fails for the hit\n results.push({\n file: hit.file,\n line: hit.line,\n column: hit.column,\n kind: hit.kind,\n snippet: '',\n documentation: undefined,\n });\n }\n return results;\n }\n\n // Fallback: search specific file via ts-morph (useful for local files without full index)\n if (fs.statSync(path).isDirectory()) {\n return []; // Cannot load a directory as a single file\n }\n\n const tsconfig = await projectManager.findNearestTsConfig(path);\n if (!tsconfig) return [];\n\n // Use worker pool for heavy ts-morph operations\n try {\n const result = await this.pool.execute<DefinitionLocation[]>(\n 'resolve_definition',\n {\n tsconfig,\n file: path,\n symbol: symbolName,\n }\n );\n return result;\n } catch {\n // Fallback to main thread if worker fails\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(path);\n if (!sourceFile) return [];\n\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported) return [];\n\n return exported.map((decl) => this.mapToDefinitionLocation(decl as Node));\n }\n }\n\n public async findReferences(\n symbolName: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ references: ReferenceLocation[]; total_count: number }> {\n validateWorkspacePath(path);\n\n // Index lookup to find definition location\n const hits = symbolIndex.lookup(symbolName);\n if (hits.length === 0) return { references: [], total_count: 0 };\n\n // Load only the definition file\n const hit = hits[0];\n const tsconfig = await projectManager.findNearestTsConfig(hit.file);\n if (!tsconfig) return { references: [], total_count: 0 };\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(hit.file);\n if (!sourceFile) return { references: [], total_count: 0 };\n\n // We need the actual node. Instead of calculating position from line/col, let's just find the exported declaration.\n const exported = sourceFile.getExportedDeclarations().get(symbolName);\n if (!exported || exported.length === 0)\n return { references: [], total_count: 0 };\n\n const targetNode = exported[0];\n\n // Hybrid approach: to prevent OOM, we don't load all files in the project.\n // Instead, we use rg to find files that literally contain the symbol name,\n // and only load those into ts-morph for accurate reference resolution.\n try {\n const { searchCode } = await import('../tools/search-code.js');\n const searchResults = await searchCode(\n symbolName,\n path,\n '*.{ts,tsx,js,jsx}',\n 1000,\n false\n );\n const filesToLoad = [...new Set(searchResults.map((r) => r.file))];\n for (const file of filesToLoad) {\n project.addSourceFileAtPathIfExists(file);\n }\n } catch (_e) {\n // Ignore search failures - fallback to existing project files\n }\n\n const refSymbols =\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 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 lookup(name: string): SymbolEntry[] {\n return this.index[name] || [];\n }\n\n public lookupByFile(file: string): SymbolEntry[] {\n return Object.values(this.index)\n .flat()\n .filter((e) => e.file === file);\n }\n}\n\nexport const symbolIndex = new SymbolIndex();\n","import { Worker } from 'worker_threads';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\ninterface WorkerTask<T> {\n id: string;\n type: string;\n payload: unknown;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private available: Worker[] = [];\n private queue: WorkerTask<unknown>[] = [];\n private activeJobs = new Map<string, WorkerTask<unknown>>();\n private taskId = 0;\n\n constructor(private poolSize: number) {}\n\n async init(): Promise<void> {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js'); // Assuming tsup builds this\n\n for (let i = 0; i < this.poolSize; i++) {\n const worker = new Worker(workerPath);\n worker.on('message', (msg) => this.handleResult(msg));\n worker.on('error', (err) => this.handleWorkerError(worker, err));\n this.workers.push(worker);\n this.available.push(worker);\n }\n }\n\n async execute<T>(type: string, payload: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = String(++this.taskId);\n const task: WorkerTask<T> = { id, type, payload, resolve, reject };\n\n const worker = this.available.pop();\n if (worker) {\n this.dispatch(worker, task);\n } else {\n this.queue.push(task as WorkerTask<unknown>);\n }\n });\n }\n\n private dispatch<T>(worker: Worker, task: WorkerTask<T>): void {\n this.activeJobs.set(task.id, task as WorkerTask<unknown>);\n worker.postMessage({ id: task.id, type: task.type, payload: task.payload });\n }\n\n private handleResult(msg: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n const task = this.activeJobs.get(msg.id);\n if (!task) return;\n\n this.activeJobs.delete(msg.id);\n\n if (msg.error) {\n task.reject(new Error(msg.error));\n } else {\n task.resolve(msg.result);\n }\n\n // Return worker to pool\n // properly finding the worker is tricky without storing mapping.\n // let's just make it simpler: each message comes from a worker, but we don't know which one.\n // Actually, worker.on('message') should be tied to the worker!\n }\n\n private handleWorkerError(worker: Worker, err: Error): void {\n const idx = this.workers.indexOf(worker);\n if (idx !== -1) {\n worker.terminate();\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const workerPath = path.join(__dirname, 'ast-worker.js');\n const newWorker = new Worker(workerPath);\n newWorker.on('message', (msg) => this.handleResult(msg));\n newWorker.on('error', (_e) => this.handleWorkerError(newWorker, _e));\n this.workers[idx] = newWorker;\n this.available.push(newWorker);\n }\n }\n\n async terminate(): Promise<void> {\n await Promise.all(this.workers.map((w) => w.terminate()));\n this.workers = [];\n this.available = [];\n }\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { DefinitionLocation } from '../types.js';\n\nexport async function resolveDefinition(\n symbol: string,\n path: string\n): Promise<DefinitionLocation[]> {\n return await typescriptAdapter.resolveDefinition(symbol, path);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findReferences(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findReferences(symbol, path, limit, offset);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function findImplementations(\n symbol: string,\n path: string,\n limit: number = 50,\n offset: number = 0\n) {\n return await typescriptAdapter.findImplementations(\n symbol,\n path,\n limit,\n offset\n );\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\n\nexport async function getFileStructure(file: string) {\n return await typescriptAdapter.getFileStructure(file);\n}\n","import { typescriptAdapter } from '../adapters/typescript-adapter.js';\nimport { projectManager } from '../project-manager.js';\nimport { SyntaxKind, Node } from 'ts-morph';\nimport { validateWorkspacePath } from '../security.js';\n\nexport async function getSymbolDocs(\n symbol: string,\n filePath: string\n): Promise<any> {\n const safePath = validateWorkspacePath(filePath);\n const tsconfig = await projectManager.findNearestTsConfig(safePath);\n if (!tsconfig) return undefined;\n\n const project = projectManager.ensureProject(tsconfig);\n const sourceFile = project.addSourceFileAtPathIfExists(safePath);\n\n if (sourceFile) {\n const node = sourceFile\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .find((id: Node) => id.getText() === symbol);\n\n if (node) {\n const decls = node.getSymbol()?.getDeclarations();\n if (decls && decls.length > 0) {\n const docs = typescriptAdapter.getSymbolDocs(decls[0]);\n if (docs) {\n return {\n symbol,\n file: sourceFile.getFilePath(),\n line: sourceFile.getLineAndColumnAtPos(decls[0].getStart()).line,\n ...docs,\n };\n }\n }\n }\n }\n\n return undefined;\n}\n","import { symbolIndex } from '../index/symbol-index.js';\n\nexport async function buildSymbolIndex(path: string) {\n return await symbolIndex.buildIndex(path);\n}\n"],"mappings":"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","names":["Node","fs","fs","path","path","__dirname","path","tsconfig","fs","searchCode","Node","path","path","path","path","path"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
"use strict";
|
|
2
3
|
|
|
3
4
|
// src/worker/ast-worker.ts
|
|
@@ -63,7 +64,7 @@ import_worker_threads.parentPort?.on("message", async (msg) => {
|
|
|
63
64
|
break;
|
|
64
65
|
}
|
|
65
66
|
const targetNode = exported[0];
|
|
66
|
-
const refSymbols = targetNode.findReferences
|
|
67
|
+
const refSymbols = "findReferences" in targetNode && typeof targetNode.findReferences === "function" ? targetNode.findReferences() : void 0;
|
|
67
68
|
if (!refSymbols) {
|
|
68
69
|
result = { references: [], total_count: 0 };
|
|
69
70
|
break;
|
|
@@ -104,7 +105,7 @@ import_worker_threads.parentPort?.on("message", async (msg) => {
|
|
|
104
105
|
break;
|
|
105
106
|
}
|
|
106
107
|
const targetNode = exported[0];
|
|
107
|
-
const implementations = targetNode.getImplementations
|
|
108
|
+
const implementations = "getImplementations" in targetNode && typeof targetNode.getImplementations === "function" ? targetNode.getImplementations() : void 0;
|
|
108
109
|
if (!implementations) {
|
|
109
110
|
result = { implementations: [], total_count: 0 };
|
|
110
111
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols
|
|
1
|
+
{"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols =\n 'findReferences' in targetNode &&\n typeof (targetNode as { findReferences?: () => any[] })\n .findReferences === 'function'\n ? (targetNode as { findReferences: () => any[] }).findReferences()\n : undefined;\n if (!refSymbols) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const refSf = ref.getSourceFile();\n const lc = refSf.getLineAndColumnAtPos(\n ref.getTextSpan().getStart()\n );\n results.push({\n file: refSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = deduplicateLocations(results);\n result = {\n references: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n case 'find_implementations': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const implementations =\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 result = { implementations: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const impl of implementations) {\n const implSf = impl.getSourceFile();\n const lc = implSf.getLineAndColumnAtPos(\n impl.getTextSpan().getStart()\n );\n results.push({\n file: implSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n\n const unique = deduplicateLocations(results);\n result = {\n implementations: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n default:\n throw new Error(`Unknown task type: ${msg.type}`);\n }\n\n parentPort?.postMessage({ id: msg.id, result });\n } catch (error: any) {\n parentPort?.postMessage({ id: msg.id, error: error.message });\n }\n});\n\nfunction getJsDoc(node: any): string | undefined {\n if (node.getJsDocs) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n}\n\nfunction deduplicateLocations<\n T extends { file: string; line: number; column: number },\n>(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
1
3
|
// src/worker/ast-worker.ts
|
|
2
4
|
import { parentPort } from "worker_threads";
|
|
3
5
|
import { Project } from "ts-morph";
|
|
@@ -61,7 +63,7 @@ parentPort?.on("message", async (msg) => {
|
|
|
61
63
|
break;
|
|
62
64
|
}
|
|
63
65
|
const targetNode = exported[0];
|
|
64
|
-
const refSymbols = targetNode.findReferences
|
|
66
|
+
const refSymbols = "findReferences" in targetNode && typeof targetNode.findReferences === "function" ? targetNode.findReferences() : void 0;
|
|
65
67
|
if (!refSymbols) {
|
|
66
68
|
result = { references: [], total_count: 0 };
|
|
67
69
|
break;
|
|
@@ -102,7 +104,7 @@ parentPort?.on("message", async (msg) => {
|
|
|
102
104
|
break;
|
|
103
105
|
}
|
|
104
106
|
const targetNode = exported[0];
|
|
105
|
-
const implementations = targetNode.getImplementations
|
|
107
|
+
const implementations = "getImplementations" in targetNode && typeof targetNode.getImplementations === "function" ? targetNode.getImplementations() : void 0;
|
|
106
108
|
if (!implementations) {
|
|
107
109
|
result = { implementations: [], total_count: 0 };
|
|
108
110
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols
|
|
1
|
+
{"version":3,"sources":["../../src/worker/ast-worker.ts"],"sourcesContent":["import { parentPort } from 'worker_threads';\nimport { Project } from 'ts-morph';\n\nconst projects = new Map<string, Project>();\n\nfunction getProject(tsconfigPath: string): Project {\n if (!projects.has(tsconfigPath)) {\n projects.set(\n tsconfigPath,\n new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: true,\n })\n );\n }\n return projects.get(tsconfigPath)!;\n}\n\ninterface WorkerMessage {\n id: string;\n type: string;\n payload: any;\n}\n\ninterface ReferenceLocation {\n file: string;\n line: number;\n column: number;\n text: string;\n}\n\nparentPort?.on('message', async (msg: WorkerMessage) => {\n try {\n let result: unknown;\n\n switch (msg.type) {\n case 'resolve_definition': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = [];\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = [];\n break;\n }\n\n result = exported.map((decl) => {\n const sourceFile = decl.getSourceFile();\n const lineAndColumn = sourceFile.getLineAndColumnAtPos(\n decl.getStart()\n );\n return {\n file: sourceFile.getFilePath(),\n line: lineAndColumn.line,\n column: lineAndColumn.column,\n kind: decl.getKindName(),\n snippet: decl.getText(),\n documentation: getJsDoc(decl),\n };\n });\n break;\n }\n\n case 'find_references': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const refSymbols =\n 'findReferences' in targetNode &&\n typeof (targetNode as { findReferences?: () => any[] })\n .findReferences === 'function'\n ? (targetNode as { findReferences: () => any[] }).findReferences()\n : undefined;\n if (!refSymbols) {\n result = { references: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const refSymbol of refSymbols) {\n for (const ref of refSymbol.getReferences()) {\n const refSf = ref.getSourceFile();\n const lc = refSf.getLineAndColumnAtPos(\n ref.getTextSpan().getStart()\n );\n results.push({\n file: refSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n ref.getNode().getParent()?.getText() || ref.getNode().getText(),\n });\n }\n }\n\n const unique = deduplicateLocations(results);\n result = {\n references: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n case 'find_implementations': {\n const { tsconfig, file, symbol } = msg.payload;\n const project = getProject(tsconfig);\n const sf = project.addSourceFileAtPath(file);\n if (!sf) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const exported = sf.getExportedDeclarations().get(symbol);\n if (!exported || exported.length === 0) {\n result = { implementations: [], total_count: 0 };\n break;\n }\n\n const targetNode = exported[0];\n const implementations =\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 result = { implementations: [], total_count: 0 };\n break;\n }\n\n const results: ReferenceLocation[] = [];\n for (const impl of implementations) {\n const implSf = impl.getSourceFile();\n const lc = implSf.getLineAndColumnAtPos(\n impl.getTextSpan().getStart()\n );\n results.push({\n file: implSf.getFilePath(),\n line: lc.line,\n column: lc.column,\n text:\n impl.getNode().getParent()?.getText() || impl.getNode().getText(),\n });\n }\n\n const unique = deduplicateLocations(results);\n result = {\n implementations: unique.slice(0, 50),\n total_count: unique.length,\n };\n break;\n }\n\n default:\n throw new Error(`Unknown task type: ${msg.type}`);\n }\n\n parentPort?.postMessage({ id: msg.id, result });\n } catch (error: any) {\n parentPort?.postMessage({ id: msg.id, error: error.message });\n }\n});\n\nfunction getJsDoc(node: any): string | undefined {\n if (node.getJsDocs) {\n const docs = node.getJsDocs();\n if (docs.length > 0) {\n return docs[0].getCommentText();\n }\n }\n return undefined;\n}\n\nfunction deduplicateLocations<\n T extends { file: string; line: number; column: number },\n>(locations: T[]): T[] {\n const seen = new Set<string>();\n return locations.filter((loc) => {\n const key = `${loc.file}:${loc.line}:${loc.column}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiready/ast-mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
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",
|
|
File without changes
|