@magic5644/graph-it-live 1.13.6 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/graph-it.js +3 -3
- package/docs/CLI.md +15 -0
- package/package.json +2 -2
- package/bin/graph-it +0 -2
package/README.md
CHANGED
|
@@ -440,6 +440,12 @@ graph-it update # Update graph-it to the latest version
|
|
|
440
440
|
graph-it install # Symlink the binary into your system PATH (opt-in)
|
|
441
441
|
```
|
|
442
442
|
|
|
443
|
+
> **Troubleshooting:** if `graph-it` runs but prints nothing at all (versions
|
|
444
|
+
> ≤ v1.13.6 shipped a broken npm `bin` wrapper), `graph-it update` can't help
|
|
445
|
+
> — the CLI is silently dead on arrival. Reinstall directly instead:
|
|
446
|
+
> `npm install -g @magic5644/graph-it-live@latest`. Fixed in v1.14.0; see
|
|
447
|
+
> [`docs/CLI.md`](docs/CLI.md#installation) for details.
|
|
448
|
+
|
|
443
449
|
**Without installing globally:**
|
|
444
450
|
|
|
445
451
|
```bash
|
package/dist/graph-it.js
CHANGED
|
@@ -43030,7 +43030,7 @@ ${aw}tip:${XT} Type ${j8t}/${XT} for follow-up actions.${be}`,b)}catch(Ze){if(Ze
|
|
|
43030
43030
|
`)}else{let{run:O}=await Promise.resolve().then(()=>(r1e(),n1e)),X=await xO("explain",[p],a,d.preferredFormat,O);d.lastFile=p,d.lastSymbol=void 0,d.lastResult=X.rawData??X.output;let be=X.output??"";process.stdout.write(be.endsWith(`
|
|
43031
43031
|
`)?be:`${be}
|
|
43032
43032
|
`)}}catch(O){O instanceof vne||process.stderr.write(`Error: ${zPe(O)}
|
|
43033
|
-
`)}}var fv,tse,Eqt,BPe,aw,j8t,XT,ilt,Tfn,xfn,Efn,G8t,Cfn,Cqt,Nqt=Wi(()=>{"use strict";fv=Lc(require("node:path")),tse=require("node:fs");Gzt();gTe();dO();Gy();OC();ZH();SVt();xVt();CMt();CVt();AMt();LVt();Eqt="1.
|
|
43033
|
+
`)}}var fv,tse,Eqt,BPe,aw,j8t,XT,ilt,Tfn,xfn,Efn,G8t,Cfn,Cqt,Nqt=Wi(()=>{"use strict";fv=Lc(require("node:path")),tse=require("node:fs");Gzt();gTe();dO();Gy();OC();ZH();SVt();xVt();CMt();CVt();AMt();LVt();Eqt="1.14.0",BPe=!process.env.NO_COLOR&&process.stdout.isTTY,aw=BPe?"\x1B[2m":"",j8t=BPe?"\x1B[1m":"",XT=BPe?"\x1B[0m":"",ilt=BPe?"\x1B[38;5;33m":"",Tfn=BPe?"\x1B[38;5;214m":"",xfn=BPe?"\x1B[38;5;117m":"",Efn=`Interactive mode unavailable (no TTY).
|
|
43034
43034
|
Use direct commands: graph-it --help
|
|
43035
43035
|
`,G8t={uiMode:"legacy"},Cfn={uiMode:"ink"},Cqt={architecture:()=>Promise.resolve().then(()=>(KUe(),JUe)),summary:()=>Promise.resolve().then(()=>(Wct(),Fct)),check:()=>Promise.resolve().then(()=>(jct(),zct)),path:()=>Promise.resolve().then(()=>(Vct(),Gct)),pathIn:()=>Promise.resolve().then(()=>(Hct(),Uct)),checkDependencies:()=>Promise.resolve().then(()=>(qUe(),$Ue)),cycles:()=>Promise.resolve().then(()=>(Kct(),Jct)),trace:()=>Promise.resolve().then(()=>(FPe(),OPe)),explain:()=>Promise.resolve().then(()=>(r1e(),n1e)),scan:()=>Promise.resolve().then(()=>(R8t(),w8t)),query:()=>Promise.resolve().then(()=>(Yct(),Xct)),wiki:()=>Promise.resolve().then(()=>(tlt(),elt))}});var wqt={};Yv(wqt,{getCommandHelp:()=>dpn});function dpn(p){return lpn[p]??`Unknown command "${p}".
|
|
43036
43036
|
|
|
@@ -43358,7 +43358,7 @@ Run "npm run build:cli" first.`,zp.GENERAL_ERROR);let C=llt.platform(),O=await b
|
|
|
43358
43358
|
Add ${d} to your PATH if needed.`}function xpn(p,a){let d=nse.dirname(a);sw.mkdirSync(d,{recursive:!0});let b=`@echo off
|
|
43359
43359
|
node "${p}" %*
|
|
43360
43360
|
`,y=a.endsWith(".cmd")?a:a+".cmd";return sw.writeFileSync(y,b,"utf-8"),`\u2713 graph-it installed to ${y}
|
|
43361
|
-
Ensure ${d} is in your PATH.`}var sw,nse,llt,Vqt,Hqt=Wi(()=>{"use strict";sw=Lc(require("node:fs")),nse=Lc(require("node:path")),llt=Lc(require("node:os")),Vqt=Lc(require("node:readline"));cR()});var Kqt={};Yv(Kqt,{run:()=>Cpn});function Epn(p){let a=["install","--global",`${Jqt}@${p}`];try{(0,J8t.execFileSync)("npm",a,{stdio:"inherit"});return}catch(d){if(!(d?.code==="ENOENT"||d instanceof Error&&d.message.includes("spawnSync npm ENOENT")))throw d}(0,J8t.execFileSync)("npm.cmd",a,{stdio:"inherit"})}async function Cpn(p,a,d){let b="1.
|
|
43361
|
+
Ensure ${d} is in your PATH.`}var sw,nse,llt,Vqt,Hqt=Wi(()=>{"use strict";sw=Lc(require("node:fs")),nse=Lc(require("node:path")),llt=Lc(require("node:os")),Vqt=Lc(require("node:readline"));cR()});var Kqt={};Yv(Kqt,{run:()=>Cpn});function Epn(p){let a=["install","--global",`${Jqt}@${p}`];try{(0,J8t.execFileSync)("npm",a,{stdio:"inherit"});return}catch(d){if(!(d?.code==="ENOENT"||d instanceof Error&&d.message.includes("spawnSync npm ENOENT")))throw d}(0,J8t.execFileSync)("npm.cmd",a,{stdio:"inherit"})}async function Cpn(p,a,d){let b="1.14.0";process.stdout.write(`Current version : v${b}
|
|
43362
43362
|
`),process.stdout.write(`Checking npm registry for ${Jqt}\u2026
|
|
43363
43363
|
`);let y;try{y=await _Rt(1e4)}catch(C){let O=C instanceof Error?C.message:String(C);throw new zm(O,zp.GENERAL_ERROR)}if(y===b)return`\u2713 Already up to date (v${b})`;process.stdout.write(`Latest version : v${y}
|
|
43364
43364
|
Installing update\u2026
|
|
@@ -43366,7 +43366,7 @@ Installing update\u2026
|
|
|
43366
43366
|
`)}async function kpn(p,a,d){let b=Apn(p),y=X5.snapshot(),C=wkt(b);return d==="json"?JSON.stringify({description:Xqt,estimationNote:K8t,llmUsageNote:Yqt,currentSession:y,history:{persistedSessions:C.length,bySource:Zqt(C),byTool:eXt(C)}},null,2):Ppn(y,C)}var Xqt,K8t,Yqt,nXt=Wi(()=>{"use strict";yZe();$Se();Xqt="TOON encoding size vs JSON equivalent",K8t="estimated (chars/4 heuristic)",Yqt="llmUsage: real provider-reported tokens \u2014 reported separately, never summed into the estimated totals above."});var Lpn={};Yv(Lpn,{commandWantsHelp:()=>cXt,findCommandStart:()=>sXt});module.exports=mXt(Lpn);var q8t=Lc(require("node:path")),iXt=require("node:util");yZe();$Se();cR();dO();var QH=Lc(require("node:fs")),lR=Lc(require("node:path"));var g3t=Lc(require("node:fs")),JDe=Lc(require("node:path")),y3t=require("node:worker_threads");OC();var lne=zh("AstWorkerHost"),gae=class{worker=null;nextId=1;pendingRequests=new Map;workerPath;extensionPath;isStopping=!1;constructor(a,d){if(this.extensionPath=d,a)this.workerPath=a;else{let b=[JDe.join(__dirname,"astWorker.js"),JDe.join(__dirname,"../../../dist/astWorker.js"),JDe.join(__dirname,"../../../../dist/astWorker.js"),JDe.join(process.cwd(),"dist/astWorker.js")],y="";for(let C of b)if(g3t.existsSync(C)){y=C;break}this.workerPath=y||JDe.join(process.cwd(),"dist/astWorker.js")}}async start(){if(this.worker){lne.warn("AstWorker already started");return}lne.info(`Starting AstWorker from ${this.workerPath}`);try{this.worker=new y3t.Worker(this.workerPath,{workerData:{extensionPath:this.extensionPath}}),this.worker.on("message",a=>{this.handleResponse(a)}),this.worker.on("error",a=>{lne.error("AstWorker error:",a);for(let[d,b]of this.pendingRequests)b.reject(new Error(`AstWorker crashed: ${a.message}`)),this.pendingRequests.delete(d)}),this.worker.on("exit",a=>{a!==0&&!this.isStopping&&lne.error(`AstWorker exited with code ${a}`),this.worker=null,this.isStopping=!1}),lne.info("AstWorker started successfully")}catch(a){let d=a instanceof Error?a.message:String(a);throw lne.error(`Failed to start AstWorker: ${d}`),new Error(`Failed to start AstWorker: ${d}`,{cause:a})}}async stop(){if(this.worker){lne.info("Stopping AstWorker");for(let[a,d]of this.pendingRequests)d.reject(new Error("AstWorker stopped")),this.pendingRequests.delete(a);this.isStopping=!0,await this.worker.terminate(),this.worker=null,lne.info("AstWorker stopped")}}async analyzeFile(a,d){return await this.sendRequest({type:"analyzeFile",id:0,filePath:a,content:d})}async getInternalExportDependencyGraph(a,d){let y=await this.sendRequest({type:"getInternalExportDeps",id:0,filePath:a,content:d});return new Map(Object.entries(y).map(([C,O])=>[C,new Set(O)]))}async extractSignatures(a,d){return await this.sendRequest({type:"extractSignatures",id:0,filePath:a,content:d})}async extractInterfaceMembers(a,d){let y=await this.sendRequest({type:"extractInterfaceMembers",id:0,filePath:a,content:d});return new Map(Object.entries(y))}async extractTypeAliases(a,d){return await this.sendRequest({type:"extractTypeAliases",id:0,filePath:a,content:d})}async compareSignatures(a,d){return await this.sendRequest({type:"compareSignatures",id:0,oldSig:a,newSig:d})}async analyzeBreakingChanges(a,d,b){return await this.sendRequest({type:"analyzeBreakingChanges",id:0,filePath:a,oldContent:d,newContent:b})}async reset(){await this.sendRequest({type:"reset",id:0})}async getFileCount(){return await this.sendRequest({type:"getFileCount",id:0})}async sendRequest(a){this.worker||await this.start();let d=this.nextId++,b={...a,id:d};return new Promise((y,C)=>{this.pendingRequests.set(d,{resolve:y,reject:C}),this.worker?.postMessage(b)})}handleResponse(a){let d=this.pendingRequests.get(a.id);if(!d){lne.warn(`Received response for unknown request ${a.id}`);return}if(this.pendingRequests.delete(a.id),a.type==="success")d.resolve(a.result);else{let b=new Error(a.error);a.stack&&(b.stack=a.stack),d.reject(b)}}};var XSe=Lc(require("node:fs/promises")),AZe=Lc(require("node:fs"));FC();OC();var KXt=zh("FileReader"),$Xt=5*1024*1024,qXt=64*1024,XXt=3e4,Lx=class{maxSize;chunkSize;timeout;constructor(a={}){this.maxSize=a.maxSize??$Xt,this.chunkSize=a.chunkSize??qXt,this.timeout=a.timeout??XXt}async getFileSize(a){try{let d=await XSe.stat(a);return{size:d.size,isLarge:d.size>this.maxSize,path:a}}catch(d){throw lg.fromError(d,a)}}async readFile(a,d){let b=d?.maxSize??this.maxSize,y=d?.timeout??this.timeout,C=d?.streaming??!1,O;try{O=await XSe.stat(a)}catch(Le){throw lg.fromError(Le,a)}if(O.size>b)throw new lg(`File too large: ${a} (${this.formatSize(O.size)} > ${this.formatSize(b)})`,"FILE_TOO_LARGE",{filePath:a});let X,be=new Promise((Le,Ze)=>{X=setTimeout(()=>{Ze(new lg(`File read timed out after ${y}ms: ${a}`,"TIMEOUT",{filePath:a}))},y)});try{let Le;return C||O.size>1024*1024?(KXt.debug(`Streaming read for large file: ${a} (${this.formatSize(O.size)})`),Le=await Promise.race([this.readFileStreaming(a),be])):Le=await Promise.race([XSe.readFile(a,"utf-8"),be]),clearTimeout(X),Le}catch(Le){throw clearTimeout(X),Le instanceof lg?Le:lg.fromError(Le,a)}}async readFileStreaming(a){return new Promise((d,b)=>{let y=[],C=AZe.createReadStream(a,{highWaterMark:this.chunkSize});C.on("data",O=>{y.push(Buffer.isBuffer(O)?O:Buffer.from(O))}),C.on("end",()=>{let O=Buffer.concat(y).toString("utf-8");d(O)}),C.on("error",O=>{b(lg.fromError(O,a))})})}async readFileIfExists(a){try{return await this.readFile(a)}catch(d){if(d instanceof lg&&d.code==="FILE_NOT_FOUND")return null;throw d}}async canRead(a){try{return await XSe.access(a,AZe.constants.R_OK),!0}catch{return!1}}formatSize(a){return a<1024?`${a}B`:a<1024*1024?`${(a/1024).toFixed(1)}KB`:`${(a/(1024*1024)).toFixed(1)}MB`}};OC();function WC(p){let d=/^(.+\.(ts|tsx|js|jsx|mjs|cjs|py|pyi|rs|vue|svelte|gql|graphql)):(.+)$/i.exec(p);if(!d)return p;let b=d[1];return d[3]?(b.length>1&&b[1]===":"&&/^[a-zA-Z]:/.test(b),zh("PathExtractor").warn(`Symbol ID detected where file path expected: ${p}. Extracting file path: ${b}`),b):p}var vae=Lc(require("node:fs/promises")),Ip=Lc(require("node:path"));KDe();yae();FC();var OH=class{pathAliases=new Map;tsConfigPromise;tsConfigPath;isConfigLoaded=!1;excludeNodeModules;workspaceRoot;directoryToPackageJson=new Map;directoryToTsConfig=new Map;tsConfigPathAliases=new Map;packageJsonImports=new Map;packageJsonLoadPromises=new Map;tsConfigLoadPromises=new Map;constructor(a,d=!0,b){this.excludeNodeModules=d,this.tsConfigPath=a,this.workspaceRoot=b??(a?Ip.dirname(a):void 0)}updateConfig(a){this.excludeNodeModules=a}async ensureTsConfigLoaded(){this.isConfigLoaded||!this.tsConfigPath||(this.tsConfigPromise??=this.loadTsConfig(this.tsConfigPath),await this.tsConfigPromise,this.tsConfigPromise=void 0,this.isConfigLoaded=!0)}async loadTsConfig(a){try{let d=await vae.readFile(a,"utf-8"),b=JSON.parse(d),y=b?.compilerOptions?.paths,C=b?.compilerOptions?.baseUrl||".";if(y)for(let[O,X]of Object.entries(y)){let be=O.replace(/\/\*$/,""),Le=X[0]?.replace(/\/\*$/,"");if(Le){let Ze=Ip.dirname(a),ft=Ip.resolve(Ze,C,Le);this.pathAliases.set(be,oo(ft))}}}catch{}}async tryTsConfigAliases(a,d){let b=this.resolveAlias(d);if(b)return this.resolveWithExtensions(b);let y=await this.resolveDynamicTsConfigAlias(a,d);return y?this.resolveWithExtensions(y):null}async tryPythonImports(a,d){if(!this.isPythonFile(a))return null;if(this.isPythonRelativeImport(d)){let b=await this.resolvePythonRelativeImport(a,d);if(b)return b}if(d.includes(".")&&!d.includes("/")){let b=await this.resolvePythonModule(a,d);if(b)return b}return null}async trySpecialModulePatterns(a,d){if(this.isSubpathImport(d))return this.resolveSubpathImport(a,d);let b=await this.resolveRustModule(a,d);return b||(this.isPackageJsonAliasCandidate(d)?this.resolveScopedPackage(a,d):null)}async tryRelativePath(a,d){if(!this.isRelativePath(d))return null;let b=Ip.dirname(a),y=Ip.resolve(b,d);if(this.isPythonFile(a)&&!this.hasFileExtension(d)){let C=await this.resolveWithExtensions(y);if(C)return C}return this.resolveWithExtensions(y)}keepWithinWorkspace(a){return!a||!this.workspaceRoot||!Ip.isAbsolute(a)||LH(a,this.workspaceRoot)?a:null}isWithinWorkspace(a){return this.keepWithinWorkspace(a)!==null}async resolve(a,d){await this.ensureTsConfigLoaded();let b=await this.tryTsConfigAliases(a,d);if(b)return this.keepWithinWorkspace(b);let y=await this.trySpecialModulePatterns(a,d);if(y)return this.keepWithinWorkspace(y);let C=await this.tryPythonImports(a,d);return C?this.keepWithinWorkspace(C):this.isNodeModule(d)?this.excludeNodeModules?null:d:this.keepWithinWorkspace(await this.tryRelativePath(a,d))}async resolveSubpathImport(a,d){let b=await this.resolvePackageJsonImport(a,d);return b?this.resolveWithExtensions(b):null}async resolveScopedPackage(a,d){let b=await this.resolvePackageJsonImport(a,d);if(b)return this.resolveWithExtensions(b);let y=await this.resolveWorkspacePackage(a,d);return y||(this.excludeNodeModules?null:d)}async resolveDynamicTsConfigAlias(a,d){if(!this.isPackageJsonAliasCandidate(d))return null;let b=await this.findNearestTsConfig(a);if(!b)return null;let y=await this.getTsConfigPathAliases(b);for(let[C,O]of y.entries())if(d===C||d.startsWith(C+"/")){let X=d.replace(C,O);return oo(X)}return null}async findNearestTsConfig(a){let d=Ip.dirname(a);return this.directoryToTsConfig.has(d)?this.directoryToTsConfig.get(d)??null:await this.searchTsConfigUpward(d)}async searchTsConfigUpward(a){let d=[],b=a;for(;!this.shouldStopSearch(b);){d.push(b);let y=this.directoryToTsConfig.get(b);if(y!==void 0)return this.cacheTsConfigResultForDirs(d,y),y;let C=Ip.join(b,"tsconfig.json");if(await this.fileExists(C))return this.cacheTsConfigResultForDirs(d,C),C;let X=Ip.dirname(b);if(X===b)break;b=X}return this.cacheTsConfigResultForDirs(d,null),null}cacheTsConfigResultForDirs(a,d){for(let b of a)this.directoryToTsConfig.set(b,d)}async getTsConfigPathAliases(a){let d=this.tsConfigPathAliases.get(a);if(d!==void 0)return d;let b=this.tsConfigLoadPromises.get(a);if(b!==void 0)return b;let y=this.loadTsConfigPathAliases(a);this.tsConfigLoadPromises.set(a,y);try{let C=await y;return this.tsConfigPathAliases.set(a,C),C}finally{this.tsConfigLoadPromises.delete(a)}}async loadTsConfigPathAliases(a){let d=new Map,b=new Set;return await this.loadTsConfigPathAliasesRecursive(a,d,b),d}async loadTsConfigPathAliasesRecursive(a,d,b){let y=Ip.resolve(a);if(!b.has(y)){b.add(y);try{let C=await vae.readFile(a,"utf-8"),O=JSON.parse(C),X=Ip.dirname(a);if(O.extends){let Ze=Ip.resolve(X,O.extends),ft=Ze.endsWith(".json")?Ze:Ze+".json",he=await this.fileExists(ft)?ft:Ze;await this.fileExists(he)&&await this.loadTsConfigPathAliasesRecursive(he,d,b)}let be=O?.compilerOptions?.paths,Le=O?.compilerOptions?.baseUrl||".";if(be)for(let[Ze,ft]of Object.entries(be)){let he=Ze.replace(/\/\*$/,""),_n=ft[0]?.replace(/\/\*$/,"");if(_n){let mt=Ip.resolve(X,Le,_n);d.set(he,oo(mt))}}}catch{}}}resolveAlias(a){for(let[d,b]of this.pathAliases.entries())if(a===d||a.startsWith(d+"/"))return a.replace(d,b);return null}async resolveWithExtensions(a){let d=IZe;if(await this.fileExists(a))return oo(a);for(let b of d){let y=a+b;if(await this.fileExists(y))return oo(y)}for(let b of d){let y=Ip.join(a,`index${b}`);if(await this.fileExists(y))return oo(y)}return null}async fileExists(a){try{return(await vae.stat(a)).isFile()}catch{return!1}}isRelativePath(a){return a.startsWith("./")||a.startsWith("../")}async resolveRustModule(a,d){if(!a.endsWith(".rs")||d.startsWith(".")||d.startsWith("@")||d.startsWith("#")||d.startsWith("/")||!/^\w+(?:::\w+)*$/u.test(d))return null;let y=Ip.dirname(a),C=d.replaceAll("::",Ip.sep),O=[Ip.join(y,`${C}.rs`),Ip.join(y,C,"mod.rs")];for(let X of O)if(await this.fileExists(X))return oo(X);return null}isNodeModule(a){return!a.startsWith(".")&&!a.startsWith("/")&&!a.startsWith("#")&&!a.startsWith("@")}isSubpathImport(a){return a.startsWith("#")}isPackageJsonAliasCandidate(a){return a.startsWith("@")}isPythonFile(a){return DZe.some(d=>a.endsWith(d))}hasFileExtension(a){let d=Ip.basename(a);return d.includes(".")&&!d.startsWith(".")}isPythonRelativeImport(a){return(a.startsWith(".")||a.startsWith(".."))&&!a.includes("/")&&a!=="."&&a!==".."}async resolvePythonRelativeImport(a,d){let b=Ip.dirname(a),y=0,C=d;for(;C.startsWith(".");)y++,C=C.substring(1);let O=b;for(let X=1;X<y;X++)O=Ip.dirname(O);if(C){let X=Ip.join(O,C+".py");if(await this.fileExists(X))return oo(X);let be=Ip.join(O,C,"__init__.py");if(await this.fileExists(be))return oo(be)}return null}async resolvePythonModule(a,d){let b=d.replaceAll(".","/"),y=Ip.dirname(a),C=this.workspaceRoot||y,O=y;for(;;){let X=Ip.resolve(O,b+".py");if(await this.fileExists(X))return oo(X);let be=Ip.resolve(O,b,"__init__.py");if(await this.fileExists(be))return oo(be);if(oo(O)===oo(C))break;let Le=Ip.dirname(O);if(Le===O)break;O=Le}return null}async resolvePackageJsonImport(a,d){let b=await this.findNearestPackageJson(a);if(!b)return null;let y=await this.getPackageJsonImports(b),C=Ip.dirname(b),O=y.get(d);if(O!==void 0)return oo(Ip.resolve(C,O));for(let[X,be]of y.entries())if(X.endsWith("/*")){let Le=X.slice(0,-2);if(d.startsWith(Le+"/")){let Ze=d.slice(Le.length+1),ft=be.endsWith("/*")?be.slice(0,-2):be,he=Ip.resolve(C,ft,Ze);return oo(he)}}return null}async findNearestPackageJson(a){let d=Ip.dirname(a);return this.directoryToPackageJson.has(d)?this.directoryToPackageJson.get(d)??null:await this.searchPackageJsonUpward(d)}async searchPackageJsonUpward(a){let d=[],b=a;for(;!this.shouldStopSearch(b);){d.push(b);let y=this.directoryToPackageJson.get(b);if(y!==void 0)return this.cacheResultForDirs(d,y),y;let C=Ip.join(b,"package.json");if(await this.fileExists(C))return this.cacheResultForDirs(d,C),C;let O=Ip.dirname(b);if(O===b)break;b=O}return this.cacheResultForDirs(d,null),null}shouldStopSearch(a){return!!(this.workspaceRoot&&a===Ip.dirname(this.workspaceRoot))}cacheResultForDirs(a,d){for(let b of a)this.directoryToPackageJson.set(b,d)}async getPackageJsonImports(a){let d=this.packageJsonImports.get(a);if(d!==void 0)return d;let b=this.packageJsonLoadPromises.get(a);if(b!==void 0)return b;let y=this.loadPackageJsonImports(a);this.packageJsonLoadPromises.set(a,y);try{let C=await y;return this.packageJsonImports.set(a,C),C}finally{this.packageJsonLoadPromises.delete(a)}}async loadPackageJsonImports(a){let d=new Map;try{let b=await vae.readFile(a,"utf-8"),y=JSON.parse(b);this.parseImportsField(y?.imports,d),this.parseAliasesField(y?.aliases,d)}catch{}return d}parseImportsField(a,d){if(!(!a||typeof a!="object"))for(let[b,y]of Object.entries(a)){let C=this.resolveImportTarget(y);C&&d.set(b,C)}}resolveImportTarget(a){if(typeof a=="string")return a;if(typeof a=="object"&&a!==null){let d=a,b=d.default??d.import??d.require??d.node;if(typeof b=="string")return b}return null}parseAliasesField(a,d){if(!(!a||typeof a!="object"))for(let[b,y]of Object.entries(a))typeof y=="string"&&d.set(b,y)}async resolveWorkspacePackage(a,d){if(!d.startsWith("@"))return null;let y=/^@([^/]+)\/([^/]+)(\/.*)?$/.exec(d);if(!y)return null;let[,,C,O]=y,X=d.split("/").slice(0,2).join("/"),be=await this.resolveFileDependency(a,X);if(be)return this.resolvePackageEntry(be,d,O);if(this.workspaceRoot){let Le=await this.findWorkspacePackageDir(C);if(Le)return this.resolvePackageEntry(Le,d,O)}return null}async resolveFileDependency(a,d){let y=Ip.dirname(a);for(;!this.shouldStopSearch(y);){let C=Ip.join(y,"package.json");if(await this.fileExists(C)){let X=await this.findFileDependencyInPackageJson(C,d);if(X)return X}let O=Ip.dirname(y);if(O===y)break;y=O}return null}async findFileDependencyInPackageJson(a,d){try{let b=await vae.readFile(a,"utf-8"),y=JSON.parse(b),C=Ip.dirname(a),X={...y.dependencies,...y.devDependencies,...y.peerDependencies}[d];if(typeof X=="string"&&X.startsWith("file:")){let be=X.slice(5),Le=Ip.resolve(C,be),Ze=oo(Le),ft=Ip.join(Le,"package.json");if(await this.fileExists(ft))return Ze}}catch{}return null}async findWorkspacePackageDir(a){if(!this.workspaceRoot)return null;let d=["packages","libs","modules"];for(let b of d){let y=Ip.join(this.workspaceRoot,b,a),C=Ip.join(y,"package.json");if(await this.fileExists(C))return y}return null}async resolvePackageEntry(a,d,b){let y=Ip.join(a,"package.json");try{let C=await vae.readFile(y,"utf-8"),O=JSON.parse(C),X=d.split("/").slice(0,2).join("/"),be=d.split("/").slice(1,2).join("/"),Le=O.name;if(Le!==X&&Le!==be)return null;if(b){let Ze=O.source?Ip.dirname(O.source):"src",ft=Ip.join(a,Ze,b);return this.resolveWithExtensions(ft)}return this.findPackageEntryPoint(a,O)}catch{return null}}async findPackageEntryPoint(a,d){let b=d.main||d.module||"index",y=[Ip.join(a,"src","index"),Ip.join(a,b),Ip.join(a,"index")];for(let C of y){let O=await this.resolveWithExtensions(C);if(O)return O}return null}};var XDe=class p{fileReader;pathResolver;static STRIP_COMMENTS_RE=(()=>{let a=/'[^']*'|"[^"]*"/,d=/\/\/[^\n]*|\/\*[\s\S]*?\*\//;return new RegExp(`(${a.source})|(${d.source})`,"g")})();ignoreTypeImports;constructor(a,d){this.fileReader=new Lx,this.pathResolver=new OH(a),this.ignoreTypeImports=d??!1}patterns={importFrom:/import\s+(?:[^;'"]|'[^']*'|"[^"]*")*?\s+from\s+['"]([^'"]+)['"]/g,exportFrom:/export\s+(?:[^;'"]|'[^']*'|"[^"]*")*?\s+from\s+['"]([^'"]+)['"]/g,require:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,dynamicImport:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,graphqlImport:/#import\s+['"]([^'"]+)['"]/g};parse(a,d){d&&(d.endsWith(".vue")||d.endsWith(".svelte"))&&(a=this.extractScript(a));let b=[],y=new Set;return d?.endsWith(".gql")||d?.endsWith(".graphql")?(this.extractImports(a,this.patterns.graphqlImport,"import",b,y),b):(a=this.stripComments(a),this.extractImports(a,this.patterns.importFrom,"import",b,y),this.extractImports(a,this.patterns.exportFrom,"export",b,y),this.extractImports(a,this.patterns.require,"require",b,y),this.extractImports(a,this.patterns.dynamicImport,"dynamic",b,y),b)}extractScript(a){let d=/<script[^>]*>([\s\S]*?)<\/script\s*[^>]*>/gi;return[...a.matchAll(d)].map(y=>y[1]).join(`
|
|
43367
43367
|
`)}stripComments(a){return p.STRIP_COMMENTS_RE.lastIndex=0,a.replaceAll(p.STRIP_COMMENTS_RE,(d,b,y)=>b||y.replaceAll(/[^\n]/g," "))}extractImports(a,d,b,y,C){let O;for(d.lastIndex=0;(O=d.exec(a))!==null;){let X=O[1];if(C.has(X))continue;if(this.ignoreTypeImports){let Le=O[0].trim();if(/^(import|export)\s+type\b/.test(Le))continue;let Ze=Le.match(/^(import|export)\s+\{([\s\S]*?)\}\s+from\b/);if(Ze){let ft=Ze[2].split(",").map(he=>he.trim()).filter(Boolean);if(ft.length>0&&ft.every(he=>/^type\b/.test(he)))continue}}C.add(X);let be=this.getLineNumber(a,O.index);y.push({module:X,type:b,line:be})}}getLineNumber(a,d){return a.substring(0,d).split(`
|
|
43368
43368
|
`).length}async parseImports(a){let d=WC(a),b=await this.fileReader.readFile(d);return this.parse(b,d).map(C=>({path:"",type:C.type,line:C.line,module:C.module}))}async resolvePath(a,d){let b=WC(a);return this.pathResolver.resolve(b,d)}};var bae=class{cache=new Map;maxSize;enableLRU;hits=0;misses=0;evictions=0;constructor(a={}){this.maxSize=a.maxSize??0,this.enableLRU=a.enableLRU??!0}get(a){let d=this.cache.get(a);if(d!==void 0)return this.hits++,this.enableLRU&&this.maxSize>0&&(this.cache.delete(a),this.cache.set(a,d)),d;this.misses++}set(a,d){this.cache.has(a)?this.cache.delete(a):this.maxSize>0&&this.cache.size>=this.maxSize&&this.evictOldest(),this.cache.set(a,d)}has(a){return this.cache.has(a)}clear(){this.cache.clear(),this.resetStats()}delete(a){return this.cache.delete(a)}get size(){return this.cache.size}getStats(){let a=this.hits+this.misses;return{hits:this.hits,misses:this.misses,evictions:this.evictions,size:this.cache.size,maxSize:this.maxSize,hitRate:a>0?this.hits/a:0}}resetStats(){this.hits=0,this.misses=0,this.evictions=0}keys(){return this.cache.keys()}entries(){return this.cache.entries()}evictOldest(){let a=this.cache.keys().next().value;a!==void 0&&(this.cache.delete(a),this.evictions++)}};OC();var oYt=zh("IndexerStatus"),YDe=class{_state="idle";_processed=0;_total=0;_currentFile;_startTime;_errorMessage;_cancelled=!1;_listeners=new Set;_lastNotifyTime=0;_notifyThrottleMs;constructor(a){this._notifyThrottleMs=a?.notifyThrottleMs??250}subscribe(a){return this._listeners.add(a),a(this.getSnapshot()),()=>this._listeners.delete(a)}getSnapshot(){let a=this._total>0?Math.round(this._processed/this._total*100):0,d;if(this._startTime&&this._processed>0&&this._total>0&&this._state==="indexing"){let y=(Date.now()-this._startTime)/this._processed,C=this._total-this._processed;d=Math.round(y*C)}return{state:this._state,processed:this._processed,total:this._total,currentFile:this._currentFile,percentage:a,startTime:this._startTime,estimatedTimeRemaining:d,errorMessage:this._errorMessage,cancelled:this._cancelled}}startCounting(){this._state="counting",this._processed=0,this._total=0,this._currentFile=void 0,this._startTime=Date.now(),this._errorMessage=void 0,this._cancelled=!1,this._notifyListeners(!0)}setTotal(a){this._total=a,this._notifyListeners(!0)}startIndexing(){this._state="indexing",this._startTime=Date.now(),this._notifyListeners(!0)}startValidating(){this._state="validating",this._notifyListeners(!0)}updateProgress(a,d){this._processed=a,this._currentFile=d,this._notifyListeners(!1)}complete(){this._state="complete",this._currentFile=void 0,this._notifyListeners(!0)}setError(a){this._state="error",this._errorMessage=a,this._currentFile=void 0,this._notifyListeners(!0)}setCancelled(){this._cancelled=!0,this._state="idle",this._currentFile=void 0,this._notifyListeners(!0)}reset(){this._state="idle",this._processed=0,this._total=0,this._currentFile=void 0,this._startTime=void 0,this._errorMessage=void 0,this._cancelled=!1,this._notifyListeners(!0)}isActive(){return this._state==="counting"||this._state==="indexing"||this._state==="validating"}isReady(){return this._state==="complete"}_notifyListeners(a){let d=Date.now();if(!a&&d-this._lastNotifyTime<this._notifyThrottleMs)return;this._lastNotifyTime=d;let b=this.getSnapshot();for(let y of this._listeners)try{y(b)}catch(C){oYt.error("Listener error:",C)}}get state(){return this._state}get total(){return this._total}get processed(){return this._processed}};var tzt=Lc(require("node:path"));var dv=Lc(tRt());OC();function nRt(p){switch(p){case"FunctionDeclaration":case"ArrowFunction":case"MethodDeclaration":case"GetAccessor":case"SetAccessor":return"function";case"ClassDeclaration":return"class";case"InterfaceDeclaration":return"interface";case"TypeAliasDeclaration":return"type";case"VariableDeclaration":case"PropertyDeclaration":case"EnumDeclaration":return"variable";default:return"other"}}var YBt=zh("SymbolAnalyzer"),fot=class{project;maxFiles;fileCount=0;fileReader;constructor(a,d={}){this.maxFiles=d.maxFiles??100,this.project=this.createProject(),this.fileReader=new Lx}createProject(){return new dv.Project({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!0,compilerOptions:{target:99,module:99}})}maybeResetProject(){this.fileCount>=this.maxFiles&&(YBt.debug(`Resetting ts-morph project (${this.fileCount} files in memory)`),this.project=this.createProject(),this.fileCount=0)}getFileCount(){return this.fileCount}reset(){YBt.debug("Forcing ts-morph project reset"),this.project=this.createProject(),this.fileCount=0}analyzeFileContent(a,d){this.maybeResetProject();let b=this.getOrCreateSourceFile(a,d),y=[],C=[],O=this.extractExportedSymbols(b,a,y);return this.extractNonExportedSymbols(b,a,O,y),this.buildDependencies(b,C),{symbols:y,dependencies:C}}getOrCreateSourceFile(a,d){let b=this.project.getSourceFile(a);return b?b.replaceWithText(d):(b=this.project.createSourceFile(a,d),this.fileCount++),b}extractExportedSymbols(a,d,b){let y=a.getExportedDeclarations(),C=new Set(y.keys());for(let[O,X]of y){let be=X[0];be&&(this.addSymbol(b,O,be.getKindName(),be.getStartLineNumber(),d,!0),be.getKindName()==="ClassDeclaration"&&dv.Node.isClassDeclaration(be)&&this.extractClassMembers(be,d,b))}return C}extractNonExportedSymbols(a,d,b,y){let C=a.getStatements();for(let O of C)dv.Node.isVariableStatement(O)?this.extractVariableDeclarations(O,d,b,y):this.extractOtherDeclarations(O,d,b,y)}extractVariableDeclarations(a,d,b,y){let C=a.getDeclarations();for(let O of C){let X=O.getName();b.has(X)||this.addSymbol(y,X,"VariableDeclaration",O.getStartLineNumber(),d,!1)}}extractOtherDeclarations(a,d,b,y){let C=this.getDeclarationInfo(a);!C||b.has(C.name)||(this.addSymbol(y,C.name,C.kind,a.getStartLineNumber(),d,!1),C.isClass&&dv.Node.isClassDeclaration(a)&&this.extractClassMembers(a,d,y))}getDeclarationInfo(a){if(dv.Node.isClassDeclaration(a)){let d=a.getName();if(d)return{name:d,kind:"ClassDeclaration",isClass:!0}}else if(dv.Node.isFunctionDeclaration(a)){let d=a.getName();if(d)return{name:d,kind:"FunctionDeclaration",isClass:!1}}else{if(dv.Node.isInterfaceDeclaration(a))return{name:a.getName(),kind:"InterfaceDeclaration",isClass:!1};if(dv.Node.isTypeAliasDeclaration(a))return{name:a.getName(),kind:"TypeAliasDeclaration",isClass:!1};if(dv.Node.isEnumDeclaration(a))return{name:a.getName(),kind:"EnumDeclaration",isClass:!1}}return null}addSymbol(a,d,b,y,C,O){a.push({name:d,kind:b,line:y,isExported:O,id:`${C}:${d}`,category:nRt(b)})}buildDependencies(a,d){let b=this.buildImportMap(a),y=this.findSymbolUsage(a,b);for(let[C,O]of Object.entries(y))for(let X of O)d.push({sourceSymbolId:C,targetSymbolId:X.symbolId,targetFilePath:X.filePath,isTypeOnly:X.isTypeOnly})}getInternalExportDependencyGraph(a,d){this.maybeResetProject();let y=this.getOrCreateSourceFile(a,d).getExportedDeclarations(),C=new Set(y.keys()),O=new Map;for(let[X,be]of y){let Le=`${a}:${X}`,Ze=this.getOrCreateDependencySet(O,Le);this.collectExportDependencies(be,X,C,a,Ze)}return O}getOrCreateDependencySet(a,d){let b=a.get(d);return b||(b=new Set,a.set(d,b)),b}collectExportDependencies(a,d,b,y,C){for(let O of a){let X=O.getDescendantsOfKind(dv.SyntaxKind.Identifier);for(let be of X){let Le=be.getText();this.isValidDependency(Le,d,b)&&C.add(`${y}:${Le}`)}}}isValidDependency(a,d,b){return b.has(a)&&a!==d}buildImportMap(a){let d=new Map,b=a.getImportDeclarations();for(let y of b){let C=y.getModuleSpecifierValue(),O=y.isTypeOnly(),X=y.getDefaultImport();if(X){let Ze=X.getText();d.set(Ze,{originalName:"default",modulePath:C,isType:O})}let be=y.getNamedImports();for(let Ze of be){let ft=Ze.getNameNode().getText(),he=Ze.getAliasNode(),_n=he?he.getText():ft;d.set(_n,{originalName:ft,modulePath:C,isType:O||Ze.isTypeOnly()})}let Le=y.getNamespaceImport();if(Le){let Ze=Le.getText();d.set(Ze,{originalName:"*",modulePath:C,isType:O})}}return d}extractIntraFileCalls(a,d){let b=[],y=d.getFilePath(),C=this.collectFunctionNames(d),O=a.getDescendantsOfKind(dv.SyntaxKind.CallExpression);for(let X of O)this.processCallExpression(X,C,y,b);return b}collectFunctionNames(a){let d=new Set;for(let b of a.getFunctions()){let y=b.getName();y&&d.add(y)}for(let b of a.getClasses())for(let y of b.getMethods()){let C=y.getName();C&&d.add(C)}return d}processCallExpression(a,d,b,y){if(!dv.Node.isCallExpression(a))return;let C=a.getExpression();if(dv.Node.isIdentifier(C)){this.addDirectFunctionCall(C,d,b,y);return}dv.Node.isPropertyAccessExpression(C)&&this.addPropertyAccessCall(C,d,b,y)}addDirectFunctionCall(a,d,b,y){let C=a.getText();d.has(C)&&y.push({symbolId:`${b}:${C}`,filePath:b,isTypeOnly:!1})}addPropertyAccessCall(a,d,b,y){if(dv.Node.isPropertyAccessExpression(a)){let C=a.getName();d.has(C)&&y.push({symbolId:`${b}:${C}`,filePath:b,isTypeOnly:!1})}}findSymbolUsage(a,d){let b={},y=a.getFilePath(),C=[...a.getFunctions(),...a.getClasses(),...a.getVariableDeclarations()];for(let be of C){let Le=be.getName();if(!Le)continue;let Ze=`${y}:${Le}`,ft=this.extractSymbolDependencies(be,d),he=this.extractIntraFileCalls(be,a);ft.push(...he),b[Ze]=ft}let O=a.getStatements(),X=[];for(let be of O){if(dv.Node.isFunctionDeclaration(be)||dv.Node.isClassDeclaration(be)||dv.Node.isVariableStatement(be)||dv.Node.isInterfaceDeclaration(be)||dv.Node.isTypeAliasDeclaration(be)||dv.Node.isEnumDeclaration(be)||dv.Node.isImportDeclaration(be))continue;let Le=this.extractSymbolDependencies(be,d);X.push(...Le)}if(X.length>0){let be=`${y}:(file)`;b[be]=X}return b}extractSymbolDependencies(a,d){let b=[];return this.extractStaticImportDependencies(a,d,b),this.extractDynamicImportDependencies(a,b),b}extractStaticImportDependencies(a,d,b){let y=a.getDescendantsOfKind(dv.SyntaxKind.Identifier);for(let C of y){let O=d.get(C.getText());if(!O)continue;let X=this.buildTargetSymbolId(O);b.some(be=>be.symbolId===X)||b.push({symbolId:X,filePath:O.modulePath,isTypeOnly:O.isType})}}extractDynamicImportDependencies(a,d){let b=a.getDescendantsOfKind(dv.SyntaxKind.CallExpression);for(let y of b){let C=this.extractDynamicImportPath(y);if(!C)continue;let O=`${C}:default`;d.some(X=>X.symbolId===O)||d.push({symbolId:O,filePath:C,isTypeOnly:!1})}}extractDynamicImportPath(a){if(!dv.Node.isCallExpression(a)||a.getExpression().getKind()!==dv.SyntaxKind.ImportKeyword)return null;let b=a.getArguments();if(b.length===0)return null;let y=b[0];return dv.Node.isStringLiteral(y)?y.getLiteralValue():null}buildTargetSymbolId(a){return a.originalName==="default"?`${a.modulePath}:default`:`${a.modulePath}:${a.originalName}`}extractClassMembers(a,d,b){let y=a.getName();if(!y)return;let C=`${d}:${y}`,O=a.getMembers();for(let X of O){let be=X.getKindName();if(!dv.Node.isMethodDeclaration(X)&&!dv.Node.isPropertyDeclaration(X)&&!dv.Node.isGetAccessorDeclaration(X)&&!dv.Node.isSetAccessorDeclaration(X))continue;let Le=X.getName();if(!Le)continue;let Ze=X.isStatic()??!1,ft=`${y}.${Le}`,he=Ze?`Static${be}`:be;b.push({name:ft,kind:he,line:X.getStartLineNumber(),isExported:!1,id:`${d}:${ft}`,parentSymbolId:C,category:nRt(be)})}}getExportedSymbols(a,d){let b=this.project.getSourceFile(a);b?b.replaceWithText(d):b=this.project.createSourceFile(a,d);let y=[],C=b.getExportedDeclarations();for(let[O,X]of C){let be=X[0];if(!be)continue;let Le=be.getKindName();y.push({name:O,kind:Le,line:be.getStartLineNumber(),isExported:!0,id:`${a}:${O}`,category:nRt(Le)})}return y}filterRuntimeSymbols(a){let d=new Set(["InterfaceDeclaration","TypeAliasDeclaration","TypeParameter"]);return a.filter(b=>!d.has(b.kind))}async analyzeFile(a){let d=await this.fileReader.readFile(a),b=this.analyzeFileContent(a,d),y=new Map;for(let C of b.symbols)y.set(C.id,C);return y}async getSymbolDependencies(a){let d=await this.fileReader.readFile(a);return this.analyzeFileContent(a,d).dependencies}};var rRt=Lc(require("node:fs/promises")),Mae=Lc(require("node:path"));Gy();yae();FC();gne();var pot=class p{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,d){this.fileReader=new Lx,this.rootDir=a??process.cwd(),this.extensionPath=d}async ensureInitialized(){if(!this.parser)return this.initPromise!==null?this.initPromise:(this.initPromise=(async()=>{let a=this.extensionPath;if(!a)throw new Error("Extension path required for WASM parser initialization. Ensure CSharpParser is constructed with extensionPath parameter.");try{let d=s2.getInstance(),b=Mae.default.join(a,"dist","wasm","tree-sitter.wasm");await d.init(b);let y=Mae.default.join(a,"dist","wasm","tree-sitter-c_sharp.wasm");this.parser=await d.getParser("c_sharp",y)}catch(d){this.initPromise=null;let b=d instanceof Error?d.message:String(d);throw new Error(`Failed to initialize C# WASM parser: ${b}`,{cause:d})}})(),this.initPromise)}async parseImports(a){let d=WC(a),b;try{b=await this.fileReader.readFile(d)}catch(C){throw lg.fromError(C,d)}if(await this.ensureInitialized(),!this.parser)return[];let y=this.parser.parse(b);if(!y)return[];try{let C=[];return this.extractUsings(y.rootNode,d,C),C}finally{y.delete()}}extractUsings(a,d,b){if(a.type==="using_directive"){let y=a.children.find(C=>C.type==="identifier"||C.type==="qualified_name"||C.type==="member_access_expression");if(y){let C=y.text.trim();C&&b.push({path:oo(d),type:"import",line:y.startPosition.row+1,module:C})}}for(let y of a.children)this.extractUsings(y,d,b)}async resolvePath(a,d){if(this.isFrameworkNamespace(d))return null;let b=d.split(".");return b.length<2||b.some(p.isUnsafeSegment)?null:this.resolveNamespace(b)}async resolveNamespace(a){try{return await this.resolveViaSuffix(a)??await this.resolveViaLastSegment(a)}catch{return null}}static isUnsafeSegment(a){return a===""||a===".."||a.includes("/")}async resolveViaSuffix(a){for(let d=a.length-1;d>=1;d--){let b=Mae.default.resolve(this.rootDir,a.slice(d).join(Mae.default.sep));if(!this.isWithinRoot(b))continue;let y=await this.findFirstCsFile(b);if(y)return oo(y)}return null}async resolveViaLastSegment(a){let d=a.at(-1)??"";if(!d)return null;let b=await this.findDirectory(this.rootDir,d,3);if(!b||!this.isWithinRoot(b))return null;let y=await this.findFirstCsFile(b);return y?oo(y):null}isWithinRoot(a){return LH(a,this.rootDir)}isFrameworkNamespace(a){return["System","Microsoft","Newtonsoft","NUnit","Xunit","MSTest","AutoMapper","FluentValidation","MediatR","Serilog"].some(b=>a===b||a.startsWith(b+"."))}async findFirstCsFile(a){try{let b=(await rRt.default.readdir(a,{withFileTypes:!0})).filter(y=>y.isFile()&&y.name.endsWith(".cs")).sort((y,C)=>y.name.localeCompare(C.name));return b.length>0?Mae.default.join(a,b[0].name):null}catch{return null}}async findDirectory(a,d,b){if(b<=0)return null;try{let C=(await rRt.default.readdir(a,{withFileTypes:!0})).filter(p.isTraversableDir);for(let O of C){if(O.name===d)return Mae.default.join(a,O.name);let X=await this.findDirectory(Mae.default.join(a,O.name),d,b-1);if(X)return X}}catch{}return null}static isTraversableDir(a){return a.isDirectory()&&!a.name.startsWith(".")&&a.name!=="node_modules"}};var _ot=Lc(require("node:fs/promises")),YH=Lc(require("node:path"));Gy();yae();FC();gne();var mot=class p{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,d){this.fileReader=new Lx,this.rootDir=a??process.cwd(),this.extensionPath=d}async ensureInitialized(){if(!this.parser)return this.initPromise!==null?this.initPromise:(this.initPromise=(async()=>{let a=this.extensionPath;if(!a)throw new Error("Extension path required for WASM parser initialization. Ensure GoParser is constructed with extensionPath parameter.");try{let d=s2.getInstance(),b=YH.default.join(a,"dist","wasm","tree-sitter.wasm");await d.init(b);let y=YH.default.join(a,"dist","wasm","tree-sitter-go.wasm");this.parser=await d.getParser("go",y)}catch(d){this.initPromise=null;let b=d instanceof Error?d.message:String(d);throw new Error(`Failed to initialize Go WASM parser: ${b}`,{cause:d})}})(),this.initPromise)}async parseImports(a){let d=WC(a),b;try{b=await this.fileReader.readFile(d)}catch(C){throw lg.fromError(C,d)}if(await this.ensureInitialized(),!this.parser)return[];let y=this.parser.parse(b);if(!y)return[];try{let C=[];return this.extractImports(y.rootNode,d,C),C}finally{y.delete()}}extractImports(a,d,b){if(a.type==="import_spec"){let y=a.children.find(C=>C.type==="interpreted_string_literal"||C.type==="raw_string_literal");if(y){let C=y.text.replaceAll(/^["`]|["`]$/g,"").trim();C&&b.push({path:oo(d),type:"import",line:y.startPosition.row+1,module:C})}}for(let y of a.children)this.extractImports(y,d,b)}async resolvePath(a,d){if(this.isGoStdlibImport(d))return null;let b=d.split("/");return b.some(p.isUnsafePart)?null:this.resolveGoImport(WC(a),d,b)}async resolveGoImport(a,d,b){try{let y=await this.resolveViaGoMod(a,d)??await this.resolveViaLastSegment(b);return y?oo(y):null}catch{return null}}static isUnsafePart(a){return a===".."||a===""}async resolveViaGoMod(a,d){let b=await this.findGoModuleInfo(YH.default.dirname(a));if(!b||!d.startsWith(b.moduleName+"/"))return null;let C=d.slice(b.moduleName.length+1).split("/");if(C.some(p.isUnsafePart))return null;let O=YH.default.resolve(b.moduleDir,...C);return this.isWithinRoot(O)?this.findFirstGoFile(O):null}async resolveViaLastSegment(a){let d=a.at(-1)??"";if(!d)return null;let b=await this.findDirectory(this.rootDir,d,3);return!b||!this.isWithinRoot(b)?null:this.findFirstGoFile(b)}isWithinRoot(a){return LH(a,this.rootDir)}isGoStdlibImport(a){return!(a.split("/")[0]??"").includes(".")}async findGoModuleInfo(a){let d=a,b=oo(this.rootDir);for(;;){let y=await this.readGoModuleName(YH.default.join(d,"go.mod"));if(y)return{moduleDir:d,moduleName:y};let C=YH.default.dirname(d);if(C===d||!oo(C).startsWith(b))break;d=C}return null}async readGoModuleName(a){try{let d=await _ot.default.readFile(a,"utf-8"),b=/^module\s+(\S+)/mu.exec(d);return b?b[1]:null}catch{return null}}async findFirstGoFile(a){try{let b=(await _ot.default.readdir(a,{withFileTypes:!0})).filter(y=>y.isFile()&&y.name.endsWith(".go")&&!y.name.endsWith("_test.go")).sort((y,C)=>y.name.localeCompare(C.name));return b.length>0?YH.default.join(a,b[0].name):null}catch{return null}}async findDirectory(a,d,b){if(b<=0)return null;try{let C=(await _ot.default.readdir(a,{withFileTypes:!0})).filter(p.isTraversableDir);for(let O of C){if(O.name===d)return YH.default.join(a,O.name);let X=await this.findDirectory(YH.default.join(a,O.name),d,b-1);if(X)return X}}catch{}return null}static isTraversableDir(a){return a.isDirectory()&&!a.name.startsWith(".")&&a.name!=="node_modules"}};var iRt=Lc(require("node:fs/promises")),hTe=Lc(require("node:path"));Gy();yae();FC();gne();var hot=class{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,d){this.fileReader=new Lx,this.rootDir=a??process.cwd(),this.extensionPath=d}async ensureInitialized(){if(!this.parser)return this.initPromise!==null?this.initPromise:(this.initPromise=(async()=>{let a=this.extensionPath;if(!a)throw new Error("Extension path required for WASM parser initialization. Ensure JavaParser is constructed with extensionPath parameter.");try{let d=s2.getInstance(),b=hTe.default.join(a,"dist","wasm","tree-sitter.wasm");await d.init(b);let y=hTe.default.join(a,"dist","wasm","tree-sitter-java.wasm");this.parser=await d.getParser("java",y)}catch(d){this.initPromise=null;let b=d instanceof Error?d.message:String(d);throw new Error(`Failed to initialize Java WASM parser: ${b}`,{cause:d})}})(),this.initPromise)}async parseImports(a){let d=WC(a),b;try{b=await this.fileReader.readFile(d)}catch(C){throw lg.fromError(C,d)}if(await this.ensureInitialized(),!this.parser)return[];let y=this.parser.parse(b);if(!y)return[];try{let C=[];return this.extractImports(y.rootNode,d,C),C}finally{y.delete()}}extractImports(a,d,b){if(a.type==="import_declaration"){let y=a.children.find(C=>C.type==="identifier"||C.type==="scoped_identifier");if(y){let C=y.text.trim();C&&b.push({path:oo(d),type:"import",line:y.startPosition.row+1,module:C})}}for(let y of a.children)this.extractImports(y,d,b)}async resolvePath(a,d){try{if(this.isJavaStdlibImport(d)||d.endsWith(".*"))return null;let b=d.split(".");if(b.some(be=>be===""||be===".."||be.includes("/")))return null;let y=b.at(-1)??"",C=b.join(hTe.default.sep)+".java",O=hTe.default.resolve(this.rootDir,C);if(this.isWithinRoot(O)&&await this.fileExists(O))return oo(O);let X=await this.findFile(this.rootDir,y+".java",4);return X?oo(X):null}catch{return null}}isWithinRoot(a){return LH(a,this.rootDir)}isJavaStdlibImport(a){return["java.","javax.","sun.","com.sun.","org.w3c.","org.xml.","org.ietf.","org.omg.","jdk.","javafx."].some(b=>a.startsWith(b))}async findFile(a,d,b){if(b<=0)return null;try{let y=await iRt.default.readdir(a,{withFileTypes:!0});for(let C of y)if(C.isFile()&&C.name===d)return hTe.default.join(a,C.name);for(let C of y)if(C.isDirectory()&&!C.name.startsWith(".")&&C.name!=="node_modules"){let O=await this.findFile(hTe.default.join(a,C.name),d,b-1);if(O)return O}}catch{}return null}async fileExists(a){try{return await iRt.default.access(a),!0}catch{return!1}}};var oRt=Lc(require("node:fs/promises")),gO=Lc(require("node:path"));Gy();FC();gne();var got=class{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,d){this.fileReader=new Lx,this.rootDir=a||process.cwd(),this.extensionPath=d}async ensureInitialized(){this.parser||(this.initPromise??=(async()=>{let a=await this.resolveExtensionPath();if(!a)throw new Error("Extension path required for WASM parser initialization. Ensure PythonParser is constructed with extensionPath parameter.");try{let d=s2.getInstance(),b=gO.default.join(a,"dist","wasm","tree-sitter.wasm");await d.init(b);let y=gO.default.join(a,"dist","wasm","tree-sitter-python.wasm");this.parser=await d.getParser("python",y)}catch(d){this.initPromise=null;let b=d instanceof Error?d.message:String(d);throw new Error(`Failed to initialize Python WASM parser: ${b}`,{cause:d})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),d=gO.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await oRt.default.access(d),a}catch{return}}async parseImports(a){try{await this.ensureInitialized();let d=WC(a),b=await this.fileReader.readFile(d),y=this.parser?.parse(b);if(!y)throw new Error(`Failed to parse Python file: ${d}`);let C=[],O=new Set;return this.traverseTree(y.rootNode,X=>{X.type==="import_statement"?this.extractImportStatement(X,C,O,b):X.type==="import_from_statement"&&this.extractImportFromStatement(X,C,O,b)}),C}catch(d){throw lg.fromError(d,a)}}async resolvePath(a,d){try{await this.ensureInitialized();let b=WC(a),y=gO.default.dirname(b);return d.startsWith(".")?await this.resolveRelativeImport(y,d):await this.resolveAbsoluteImport(y,d)}catch{return null}}extractImportStatement(a,d,b,y){let C=this.findChildrenByType(a,"dotted_name");for(let O of C){let X=this.getNodeText(O,y);X&&!b.has(X)&&(b.add(X),d.push({path:"",type:"import",line:O.startPosition.row+1,module:X}))}}extractImportFromStatement(a,d,b,y){let C=null,O=this.findChildByType(a,"relative_import");if(O)C=this.getNodeText(O,y);else{let X=this.findChildByType(a,"dotted_name");X&&(C=this.getNodeText(X,y))}C&&!b.has(C)&&(b.add(C),d.push({path:"",type:"import",line:a.startPosition.row+1,module:C}))}async resolveRelativeImport(a,d){let b=/^\.*/u.exec(d),y=b?b[0].length:0,C=d.slice(y).replaceAll(".","/"),O=a;for(let be=1;be<y;be++)O=gO.default.dirname(O);let X=[gO.default.join(O,C+".py"),gO.default.join(O,C+".pyi"),gO.default.join(O,C,"__init__.py"),gO.default.join(O,C,"__init__.pyi")];for(let be of X)if(await this.fileExists(be))return oo(be);return null}async resolveAbsoluteImport(a,d){let b=d.replaceAll(".","/"),y=oo(this.rootDir),C=new Set,O=async be=>{let Le=oo(be);if(C.has(Le))return null;C.add(Le);let Ze=[gO.default.join(be,b+".py"),gO.default.join(be,b+".pyi"),gO.default.join(be,b,"__init__.py"),gO.default.join(be,b,"__init__.pyi")];for(let ft of Ze)if(await this.fileExists(ft))return oo(ft);return null},X=a;for(;;){let be=await O(X);if(be)return be;let Le=gO.default.dirname(X);if(Le===X)break;if(oo(Le)===y){let Ze=await O(Le);if(Ze)return Ze;break}X=Le}if(!C.has(y)){let be=await O(this.rootDir);if(be)return be}return null}async fileExists(a){try{return await oRt.default.access(a),!0}catch{return!1}}traverseTree(a,d){d(a);for(let b of a.children)this.traverseTree(b,d)}findChildrenByType(a,d){let b=[];for(let y of a.children)y.type===d&&b.push(y);return b}findChildByType(a,d){for(let b of a.children)if(b.type===d)return b;return null}getNodeText(a,d){return d.slice(a.startIndex,a.endIndex)}};var ZBt=Lc(require("node:fs/promises")),yot=Lc(require("node:path"));Gy();FC();gne();var vot=class{parser=null;fileReader;initPromise=null;extensionPath;constructor(a,d){this.extensionPath=d??a,this.fileReader=new Lx}async ensureInitialized(){this.parser||(this.initPromise??=(async()=>{let a=await this.resolveExtensionPath();if(!a)throw new Error("Extension path required for WASM parser initialization. Ensure PythonSymbolAnalyzer is constructed with extensionPath parameter.");try{let d=s2.getInstance(),b=yot.default.join(a,"dist","wasm","tree-sitter.wasm");await d.init(b);let y=yot.default.join(a,"dist","wasm","tree-sitter-python.wasm");this.parser=await d.getParser("python",y)}catch(d){this.initPromise=null;let b=d instanceof Error?d.message:String(d);throw new Error(`Failed to initialize Python WASM parser for symbol analysis: ${b}`,{cause:d})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),d=yot.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await ZBt.default.access(d),a}catch{return}}async analyzeFile(a){try{await this.ensureInitialized();let d=await this.fileReader.readFile(a);return this.analyzeFileFromContent(a,d)}catch(d){throw lg.fromError(d,a)}}analyzeFileFromContent(a,d){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileFromContent().");let b=this.parser.parse(d);if(!b)throw new Error(`Failed to parse Python file: ${a}`);try{let y=new Map,C=oo(a);return this.extractSymbols(b.rootNode,C,d,y),y}finally{b.delete()}}analyzeFileContent(a,d){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileContent().");let b=this.parser.parse(d);if(!b)throw new Error(`Failed to parse Python file: ${a}`);try{let y=new Map,C=[],O=oo(a);this.extractSymbols(b.rootNode,O,d,y);let X=this.buildImportMap(b.rootNode,d);return this.extractDependencies(b.rootNode,O,d,C,y,void 0,X),{symbols:Array.from(y.values()),dependencies:C}}finally{b.delete()}}async getSymbolDependencies(a){try{await this.ensureInitialized();let d=await this.fileReader.readFile(a);return this.analyzeFileContent(a,d).dependencies}catch(d){throw lg.fromError(d,a)}}extractSymbols(a,d,b,y,C){this.tryExtractSymbolFromNode(a,d,b,y,C)||this.extractSymbolsFromChildren(a,d,b,y,C)}tryExtractSymbolFromNode(a,d,b,y,C){return a.type==="function_definition"?(this.handleFunctionDefinition(a,d,b,y,C),!0):a.type==="class_definition"?(this.handleClassDefinition(a,d,b,y,C),!0):a.type==="decorated_definition"?(this.handleDecoratedDefinition(a,d,b,y,C),!0):!1}handleFunctionDefinition(a,d,b,y,C){let O=a.childForFieldName("name");if(!O)return;let X=this.getNodeText(O,b),be=`${d}:${X}`,Le=this.hasChild(a,"async");y.set(be,{name:X,kind:Le?"AsyncFunction":"FunctionDeclaration",line:O.startPosition.row+1,isExported:this.isExported(a,b),id:be,parentSymbolId:C,category:"function"}),this.extractSymbolsFromChildren(a,d,b,y,be)}handleClassDefinition(a,d,b,y,C){let O=a.childForFieldName("name");if(!O)return;let X=this.getNodeText(O,b),be=`${d}:${X}`;y.set(be,{name:X,kind:"ClassDeclaration",line:O.startPosition.row+1,isExported:this.isExported(a,b),id:be,parentSymbolId:C,category:"class"}),this.extractSymbolsFromChildren(a,d,b,y,be)}handleDecoratedDefinition(a,d,b,y,C){for(let O of a.children)(O.type==="function_definition"||O.type==="class_definition")&&this.extractSymbols(O,d,b,y,C)}extractSymbolsFromChildren(a,d,b,y,C){for(let O of a.children)this.extractSymbols(O,d,b,y,C)}buildImportMap(a,d){let b=new Map;return this.traverseForImports(a,b,d),b}traverseForImports(a,d,b){a.type==="import_from_statement"?this.processFromImport(a,d,b):a.type==="import_statement"&&this.processImportStatement(a,d,b);for(let y of a.children)this.traverseForImports(y,d,b)}processFromImport(a,d,b){let y=a.childForFieldName("module_name");if(!y)return;let C=this.getNodeText(y,b);for(let O of a.children)this.processFromImportChild(O,d,b,C)}processFromImportChild(a,d,b,y){if(a.type==="aliased_import"){this.addAliasedFromImport(a,d,b,y);return}if(a.type==="dotted_name"||a.type==="identifier"){let C=this.getNodeText(a,b);if(C===y||a.parent?.type==="aliased_import")return;d.set(C,y)}}addAliasedFromImport(a,d,b,y){let C=a.childForFieldName("name");if(!C)return;let O=this.getNodeText(C,b),X=a.childForFieldName("alias"),be=X?this.getNodeText(X,b):O;d.set(be,y)}processImportStatement(a,d,b){for(let y of a.children)this.processImportStatementChild(y,d,b)}processImportStatementChild(a,d,b){if(a.type==="aliased_import"){let y=a.childForFieldName("name");if(!y)return;let C=this.getNodeText(y,b),O=a.childForFieldName("alias"),X=O?this.getNodeText(O,b):C;d.set(X,C);return}if(a.type==="dotted_name"||a.type==="identifier"){let y=this.getNodeText(a,b);y!=="import"&&d.set(y,y)}}extractDependencies(a,d,b,y,C,O,X){let be=this.getScopeForNode(a,d,b,O);this.addCallDependencyIfAny(a,d,b,y,C,be,X);for(let Le of a.children)this.extractDependencies(Le,d,b,y,C,be,X)}getScopeForNode(a,d,b,y){if(a.type!=="function_definition"&&a.type!=="class_definition")return y;let C=a.childForFieldName("name");if(!C)return y;let O=this.getNodeText(C,b);return`${d}:${O}`}addCallDependencyIfAny(a,d,b,y,C,O,X){if(a.type!=="call")return;let be=a.childForFieldName("function");if(!be||!O)return;let Le=this.getCalledName(be,b),Ze=`${d}:${Le}`;if(C.has(Ze)){y.push({sourceSymbolId:O,targetSymbolId:Ze,targetFilePath:d,isTypeOnly:!1});return}if(X?.has(Le)){let ft=X.get(Le);if(ft===void 0)return;y.push({sourceSymbolId:O,targetSymbolId:`${ft}:${Le}`,targetFilePath:ft,isTypeOnly:!1})}}getCalledName(a,d){if(a.type!=="attribute")return this.getNodeText(a,d);let b=a.childForFieldName("attribute");return b?this.getNodeText(b,d):this.getNodeText(a,d)}isExported(a,d){let b=a.childForFieldName("name");return b?!this.getNodeText(b,d).startsWith("_"):!1}hasChild(a,d){for(let b of a.children)if(b.type===d)return!0;return!1}getNodeText(a,d){return d.slice(a.startIndex,a.endIndex)}};var aRt=Lc(require("node:fs/promises")),yne=Lc(require("node:path"));Gy();FC();gne();var bot=class{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,d){this.fileReader=new Lx,this.rootDir=a||process.cwd(),this.extensionPath=d}async ensureInitialized(){this.parser||(this.initPromise??=(async()=>{let a=await this.resolveExtensionPath();if(!a)throw new Error("Extension path required for WASM parser initialization. Ensure RustParser is constructed with extensionPath parameter.");try{let d=s2.getInstance(),b=yne.default.join(a,"dist","wasm","tree-sitter.wasm");await d.init(b);let y=yne.default.join(a,"dist","wasm","tree-sitter-rust.wasm");this.parser=await d.getParser("rust",y)}catch(d){this.initPromise=null;let b=d instanceof Error?d.message:String(d);throw new Error(`Failed to initialize Rust WASM parser: ${b}`,{cause:d})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),d=yne.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await aRt.default.access(d),a}catch{return}}async parseImports(a){try{await this.ensureInitialized();let d=WC(a),b=await this.fileReader.readFile(d),y=this.parser?.parse(b);if(!y)throw new Error(`Failed to parse Rust file: ${d}`);let C=[],O=new Set;return this.traverseTree(y.rootNode,X=>{X.type==="use_declaration"?this.extractUseDeclaration(X,C,O,b):X.type==="mod_item"?this.extractModItem(X,C,O,b,a):X.type==="extern_crate_declaration"&&this.extractExternCrate(X,C,O,b)}),C}catch(d){throw lg.fromError(d,a)}}async resolvePath(a,d){try{await this.ensureInitialized();let b=d.split("::")[0];if(new Set(["std","core","alloc","proc_macro","test","serde","tokio","async_std","futures","vm","rustpython_vm","rustpython","rustpython_parser","rustpython_compiler","num_traits","enum_dispatch","dashmap"]).has(b))return null;let C=WC(a),O=yne.default.dirname(C);return d.startsWith("self::")||d.startsWith("super::")||d.startsWith("crate::")?await this.resolveRelativeModule(a,d):await this.resolveModDeclaration(O,d)}catch{return null}}extractUseDeclaration(a,d,b,y){let C=this.collectIdentifiers(a,y);for(let O of C){if(!O)continue;let X=O.split("::")[0];if(new Set(["std","core","alloc","proc_macro","test","serde","tokio","async_std","futures","vm","rustpython_vm","rustpython","rustpython_parser","rustpython_compiler","num_traits","enum_dispatch","dashmap"]).has(X))continue;let Le=O.toLowerCase();b.has(Le)||(b.add(Le),d.push({path:"",type:"import",line:a.startPosition.row+1,module:Le}))}}extractModItem(a,d,b,y,C){if(this.findChildByType(a,"declaration_list"))return;let X=this.findChildByType(a,"identifier");if(X){let be=this.getNodeText(X,y);be=be.toLowerCase(),be&&!b.has(be)&&(b.add(be),d.push({path:"",type:"import",line:a.startPosition.row+1,module:be}))}}extractExternCrate(a,d,b,y){let C=this.findChildByType(a,"identifier");if(C){let O=this.getNodeText(C,y);if(!O||new Set(["std","core","alloc","proc_macro","test","serde","tokio","async_std","futures","vm","rustpython_vm","rustpython","rustpython_parser","rustpython_compiler","num_traits","enum_dispatch","dashmap"]).has(O))return;let be=O.toLowerCase();b.has(be)||(b.add(be),d.push({path:"",type:"import",line:a.startPosition.row+1,module:be}))}}collectIdentifiers(a,d){let b=[],y=this.findAllByType(a,"scoped_identifier");for(let O of y){let X=this.getNodeText(O,d);X&&b.push(X)}let C=this.findAllByType(a,"identifier");for(let O of C){let X=this.getNodeText(O,d);if(!X||X==="self"||X==="super"||X==="crate")continue;let be=X.charAt(0);be===be.toUpperCase()&&be!==be.toLowerCase()||b.push(X)}return b}async resolveRelativeModule(a,d){let b=yne.default.dirname(a);if(d.startsWith("crate::")){let y=d.slice(7).replaceAll("::","/");return await this.resolveModDeclaration(this.rootDir,y)}if(d.startsWith("super::")){let y=yne.default.dirname(b),C=d.slice(7).replaceAll("::","/");return await this.resolveModDeclaration(y,C)}if(d.startsWith("self::")){let y=d.slice(6).replaceAll("::","/");return await this.resolveModDeclaration(b,y)}return null}async resolveModDeclaration(a,d){if(d!==d.toLowerCase())return null;let b=d.replaceAll("::","/");b=b.toLowerCase();let y=[yne.default.join(a,b+".rs"),yne.default.join(a,b,"mod.rs")];for(let C of y)if(await this.fileExists(C))return oo(C);return null}async fileExists(a){try{return await aRt.default.access(a),!0}catch{return!1}}traverseTree(a,d){d(a);for(let b of a.children)this.traverseTree(b,d)}findChildByType(a,d){for(let b of a.children)if(b.type===d)return b;return null}findAllByType(a,d){let b=[],y=C=>{C.type===d&&b.push(C);for(let O of C.children)y(O)};return y(a),b}getNodeText(a,d){return d.slice(a.startIndex,a.endIndex)}};var ezt=Lc(require("node:fs/promises")),Sot=Lc(require("node:path"));Gy();FC();gne();var Tot=class{parser=null;fileReader;initPromise=null;extensionPath;constructor(a,d){this.extensionPath=d??a,this.fileReader=new Lx}async ensureInitialized(){this.parser||(this.initPromise??=(async()=>{let a=await this.resolveExtensionPath();if(!a)throw new Error("Extension path required for WASM parser initialization. Ensure RustSymbolAnalyzer is constructed with extensionPath parameter.");try{let d=s2.getInstance(),b=Sot.default.join(a,"dist","wasm","tree-sitter.wasm");await d.init(b);let y=Sot.default.join(a,"dist","wasm","tree-sitter-rust.wasm");this.parser=await d.getParser("rust",y)}catch(d){this.initPromise=null;let b=d instanceof Error?d.message:String(d);throw new Error(`Failed to initialize Rust WASM parser for symbol analysis: ${b}`,{cause:d})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),d=Sot.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await ezt.default.access(d),a}catch{return}}async analyzeFile(a){try{await this.ensureInitialized();let d=await this.fileReader.readFile(a);return this.analyzeFileFromContent(a,d)}catch(d){throw lg.fromError(d,a)}}analyzeFileFromContent(a,d){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileFromContent().");let b=this.parser.parse(d);if(!b)throw new Error(`Failed to parse Rust file: ${a}`);try{let y=new Map,C=oo(a);return this.extractSymbols(b.rootNode,C,d,y),y}finally{b.delete()}}analyzeFileContent(a,d){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileContent().");let b=this.parser.parse(d);if(!b)throw new Error(`Failed to parse Rust file: ${a}`);try{let y=new Map,C=[],O=oo(a);this.extractSymbols(b.rootNode,O,d,y);let X=this.buildImportMap(b.rootNode,d);return this.extractDependencies(b.rootNode,O,d,C,y,void 0,X),{symbols:Array.from(y.values()),dependencies:C}}finally{b.delete()}}async getSymbolDependencies(a){try{await this.ensureInitialized();let d=await this.fileReader.readFile(a);return this.analyzeFileContent(a,d).dependencies}catch(d){throw lg.fromError(d,a)}}extractSymbols(a,d,b,y,C){this.tryExtractSymbolFromNode(a,d,b,y,C)||this.extractSymbolsFromChildren(a,d,b,y,C)}tryExtractSymbolFromNode(a,d,b,y,C){return a.type==="function_item"?(this.handleFunctionItem(a,d,b,y,C),!0):a.type==="struct_item"?(this.handleStructItem(a,d,b,y,C),!0):a.type==="enum_item"?(this.handleEnumItem(a,d,b,y,C),!0):a.type==="trait_item"?(this.handleTraitItem(a,d,b,y,C),!0):a.type==="impl_item"?(this.handleImplItem(a,d,b,y,C),!0):!1}handleFunctionItem(a,d,b,y,C){let O=a.childForFieldName("name");if(!O)return;let X=this.getNodeText(O,b),be=`${d}:${X}`,Le=this.hasModifier(a,"async"),Ze=this.hasVisibilityModifier(a,"pub");y.set(be,{name:X,kind:Le?"AsyncFunction":"FunctionDeclaration",line:O.startPosition.row+1,isExported:Ze,id:be,parentSymbolId:C,category:"function"}),this.extractSymbolsFromChildren(a,d,b,y,be)}handleStructItem(a,d,b,y,C){let O=a.childForFieldName("name");if(!O)return;let X=this.getNodeText(O,b),be=`${d}:${X}`,Le=this.hasVisibilityModifier(a,"pub");y.set(be,{name:X,kind:"StructDeclaration",line:O.startPosition.row+1,isExported:Le,id:be,parentSymbolId:C,category:"class"}),this.extractSymbolsFromChildren(a,d,b,y,be)}handleEnumItem(a,d,b,y,C){let O=a.childForFieldName("name");if(!O)return;let X=this.getNodeText(O,b),be=`${d}:${X}`,Le=this.hasVisibilityModifier(a,"pub");y.set(be,{name:X,kind:"EnumDeclaration",line:O.startPosition.row+1,isExported:Le,id:be,parentSymbolId:C,category:"type"}),this.extractSymbolsFromChildren(a,d,b,y,be)}handleTraitItem(a,d,b,y,C){let O=a.childForFieldName("name");if(!O)return;let X=this.getNodeText(O,b),be=`${d}:${X}`,Le=this.hasVisibilityModifier(a,"pub");y.set(be,{name:X,kind:"InterfaceDeclaration",line:O.startPosition.row+1,isExported:Le,id:be,parentSymbolId:C,category:"type"}),this.extractSymbolsFromChildren(a,d,b,y,be)}handleImplItem(a,d,b,y,C){this.extractSymbolsFromChildren(a,d,b,y,C)}extractSymbolsFromChildren(a,d,b,y,C){for(let O of a.children)this.extractSymbols(O,d,b,y,C)}buildImportMap(a,d){let b=new Map,y=C=>{if(C.type==="use_declaration"&&this.extractUseDeclarationImports(C,d,b),C.type==="mod_item"){let O=C.childForFieldName("name");if(O){let X=this.getNodeText(O,d);b.set(X,X)}}for(let O of C.children)y(O)};return y(a),b}extractUseDeclarationImports(a,d,b){this.extractFromUseLists(a,d,b),this.extractFromScopedIdentifiers(a,d,b),this.extractFromUseAsClauses(a,d,b)}extractFromUseLists(a,d,b){let y=this.findAllByType(a,"use_list");for(let C of y){let O=this.findBaseModuleForUseList(C,d);this.extractIdentifiersFromUseList(C,O,d,b)}}findBaseModuleForUseList(a,d){let b=a.parent;for(;b;){if(b.type==="scoped_use_list"){let y=this.findScopedIdentifierInChildren(b,d);if(y)return y}b=b.parent}return""}findScopedIdentifierInChildren(a,d){for(let b of a.children)if(b.type==="scoped_identifier")return this.getNodeText(b,d);return""}extractIdentifiersFromUseList(a,d,b,y){for(let C of a.children)if(C.type==="identifier"){let O=this.getNodeText(C,b);y.set(O,d)}}extractFromScopedIdentifiers(a,d,b){let y=this.findAllByType(a,"scoped_identifier");for(let C of y){if(this.hasAncestorOfType(C,"use_list"))continue;let O=this.getNodeText(C,d),{localName:X,modulePath:be}=this.splitModulePath(O);b.set(X,be)}}splitModulePath(a){let d=a.split("::"),b=d.at(-1)??"",y=d.slice(0,-1).join("::");return{localName:b,modulePath:y}}extractFromUseAsClauses(a,d,b){let y=this.findAllByType(a,"use_as_clause");for(let C of y){let O=C.childForFieldName("path"),X=C.childForFieldName("alias");if(O&&X){let be=this.getNodeText(O,d),Le=this.getNodeText(X,d);b.set(Le,be)}}}extractDependencies(a,d,b,y,C,O,X){let be=this.getScopeForNode(a,d,b,O);this.addCallDependencyIfAny(a,d,b,y,C,be,X);for(let Le of a.children)this.extractDependencies(Le,d,b,y,C,be,X)}getScopeForNode(a,d,b,y){if(a.type!=="function_item")return y;let C=a.childForFieldName("name");if(!C)return y;let O=this.getNodeText(C,b);return`${d}:${O}`}addCallDependencyIfAny(a,d,b,y,C,O,X){if(a.type!=="call_expression")return;let be=a.childForFieldName("function");if(!be||!O)return;let{moduleName:Le,symbolName:Ze}=this.extractModuleAndSymbolName(be,b),ft=`${d}:${Ze}`;if(C.has(ft)){y.push({sourceSymbolId:O,targetSymbolId:ft,targetFilePath:d,isTypeOnly:!1});return}if(Le&&X?.has(Le)){let he=X.get(Le);if(he===void 0)return;y.push({sourceSymbolId:O,targetSymbolId:`${he}:${Ze}`,targetFilePath:he,isTypeOnly:!1});return}if(X?.has(Ze)){let he=X.get(Ze);if(he===void 0)return;y.push({sourceSymbolId:O,targetSymbolId:`${he}:${Ze}`,targetFilePath:he,isTypeOnly:!1})}}extractModuleAndSymbolName(a,d){if(a.type==="field_expression"){let b=a.childForFieldName("field");if(b)return{moduleName:void 0,symbolName:this.getNodeText(b,d)}}if(a.type==="scoped_identifier"){let y=this.getNodeText(a,d).split("::");if(y.length>=2){let C=y.at(-1)??"";return{moduleName:y.slice(0,-1).join("::"),symbolName:C}}return{moduleName:void 0,symbolName:y[0]}}return{moduleName:void 0,symbolName:this.getNodeText(a,d)}}hasVisibilityModifier(a,d){if(a.childForFieldName("visibility_modifier"))return!0;for(let y of a.children)if(y.type==="visibility_modifier")return!0;return!1}hasAncestorOfType(a,d){let b=a.parent;for(;b;){if(b.type===d)return!0;b=b.parent}return!1}hasModifier(a,d){for(let b of a.children)if(b.type===d)return!0;return!1}findAllByType(a,d){let b=[],y=C=>{C.type===d&&b.push(C);for(let O of C.children)y(O)};return y(a),b}getNodeText(a,d){return d.slice(a.startIndex,a.endIndex)}};var EIe=class p{static typeScriptParsers=new Map;static typeScriptSymbolAnalyzers=new Map;static pythonParsers=new Map;static pythonSymbolAnalyzers=new Map;static rustParsers=new Map;static rustSymbolAnalyzers=new Map;static csharpParsers=new Map;static goParsers=new Map;static javaParsers=new Map;rootDir;extensionPath;ignoreTypeImports;constructor(a,d,b,y){this.rootDir=a,this.extensionPath=b,this.ignoreTypeImports=y}getAnalyzer(a){let d=WC(a);return p.getAnalyzer(d,this.rootDir,this.extensionPath,this.ignoreTypeImports)}getSymbolAnalyzer(a){let d=WC(a);return p.getSymbolAnalyzer(d,this.rootDir,this.extensionPath)}static detectLanguage(a){let d=WC(a);switch(tzt.default.extname(d).toLowerCase()){case".ts":case".tsx":case".js":case".jsx":case".mjs":case".cjs":case".vue":case".svelte":case".gql":case".graphql":return"typescript";case".py":case".pyi":return"python";case".rs":case".toml":return"rust";case".cs":case".csproj":return"csharp";case".go":return"go";case".java":return"java";default:return"unknown"}}static getAnalyzer(a,d,b,y){let C=WC(a);switch(this.detectLanguage(C)){case"typescript":{let X=this.buildCacheKey(d,y?"ignore-types":""),be=this.typeScriptParsers.get(X);if(be)return be;let Le=new XDe(d,y);return this.typeScriptParsers.set(X,Le),Le}case"python":{let X=this.buildCacheKey(d,b),be=this.pythonParsers.get(X);if(be)return be;let Le=new got(d,b);return this.pythonParsers.set(X,Le),Le}case"rust":{let X=this.buildCacheKey(d,b),be=this.rustParsers.get(X);if(be)return be;let Le=new bot(d,b);return this.rustParsers.set(X,Le),Le}case"csharp":{let X=this.buildCacheKey(d,b),be=this.csharpParsers.get(X);if(be)return be;let Le=new pot(d,b);return this.csharpParsers.set(X,Le),Le}case"go":{let X=this.buildCacheKey(d,b),be=this.goParsers.get(X);if(be)return be;let Le=new mot(d,b);return this.goParsers.set(X,Le),Le}case"java":{let X=this.buildCacheKey(d,b),be=this.javaParsers.get(X);if(be)return be;let Le=new hot(d,b);return this.javaParsers.set(X,Le),Le}default:throw new Error(`Unsupported language for file: ${a}`)}}static getSymbolAnalyzer(a,d,b){let y=WC(a);switch(this.detectLanguage(y)){case"typescript":{let O=this.buildCacheKey(d),X=this.typeScriptSymbolAnalyzers.get(O);if(X)return X;let be=new fot(d);return this.typeScriptSymbolAnalyzers.set(O,be),be}case"python":{let O=this.buildCacheKey(d,b),X=this.pythonSymbolAnalyzers.get(O);if(X)return X;let be=new vot(d,b);return this.pythonSymbolAnalyzers.set(O,be),be}case"rust":{let O=this.buildCacheKey(d,b),X=this.rustSymbolAnalyzers.get(O);if(X)return X;let be=new Tot(d,b);return this.rustSymbolAnalyzers.set(O,be),be}default:throw new Error(`Unsupported language for file: ${a}`)}}static isSupported(a){return this.detectLanguage(a)!=="unknown"}static reset(){this.typeScriptParsers.clear(),this.typeScriptSymbolAnalyzers.clear(),this.pythonParsers.clear(),this.pythonSymbolAnalyzers.clear(),this.rustParsers.clear(),this.rustSymbolAnalyzers.clear(),this.csharpParsers.clear(),this.goParsers.clear(),this.javaParsers.clear()}static buildCacheKey(...a){return a.map(d=>d??"").join("\0")}};OC();FC();var nzt=zh("ReferencingFilesFinder"),CIe=class{sourceFileCollector;getRootDir;getConcurrency;findReferenceInFile;constructor(a){this.sourceFileCollector=a.sourceFileCollector,this.getRootDir=a.getRootDir,this.getConcurrency=a.getConcurrency,this.findReferenceInFile=a.findReferenceInFile}async findReferencingFilesFallback(a){let d=oo(a),b=this.extractBasename(d);if(!b)return[];nzt.debug("findReferencingFilesFallback for",d,"basename:",b);let y=await this.sourceFileCollector.collectAllSourceFiles(this.getRootDir()),C=[],O=this.getConcurrency()??8;for(let X=0;X<y.length;X+=O){let be=y.slice(X,X+O),Le=await Promise.all(be.filter(Ze=>oo(Ze)!==d).map(Ze=>this.findReferenceInFile(Ze,d,b)));for(let Ze of Le)Ze&&C.push(Ze)}return nzt.debug("findReferencingFilesFallback found",C.length,"referencing files"),C}extractBasename(a){return a.split(/[/\\]/).pop()?.replace(/\.[^/.]+$/,"")}};var izt=Lc(require("node:fs/promises"));FC();OC();var rzt=zh("ReverseIndex"),sRt=1,Lae=class p{reverseMap=new Map;fileHashes=new Map;rootDir;constructor(a){this.rootDir=oo(a)}addDependencies(a,d,b){let y=oo(a);this.removeDependenciesFromSource(y);for(let C of d){let O=oo(C.path),X={sourcePath:y,type:C.type,line:C.line,module:C.module},be=this.reverseMap.get(O);be||(be=new Map,this.reverseMap.set(O,be)),be.set(y,X)}b&&this.fileHashes.set(y,b)}removeDependenciesFromSource(a){let d=oo(a);for(let[,b]of this.reverseMap)b.delete(d);this.fileHashes.delete(d)}getReferencingFiles(a){let d=oo(a),b=this.reverseMap.get(d);return b?.size===0?(this.reverseMap.delete(d),[]):b?Array.from(b.values()).map(y=>({path:y.sourcePath,type:y.type,line:y.line,module:y.module})):[]}getCallerCount(a){let d=oo(a);return this.reverseMap.get(d)?.size??0}isFileStale(a,d){let b=oo(a),y=this.fileHashes.get(b);return y?y.mtime!==d.mtime||y.size!==d.size:!0}getFileHash(a){return this.fileHashes.get(oo(a))}updateFileHash(a,d){this.fileHashes.set(oo(a),d)}hasEntries(){return this.reverseMap.size>0}hasFile(a){return this.fileHashes.has(oo(a))}get indexedFileCount(){return this.fileHashes.size}get targetFileCount(){return this.reverseMap.size}clear(){this.reverseMap.clear(),this.fileHashes.clear()}getEmptyMapCount(){let a=0;for(let d of this.reverseMap.values())d.size===0&&a++;return a}cleanup(){let a=0,d=[];for(let[b,y]of this.reverseMap)y.size===0&&d.push(b);for(let b of d)this.reverseMap.delete(b),a++;return a}static async getFileHashFromDisk(a){try{let d=await izt.stat(a);return{mtime:d.mtimeMs,size:d.size}}catch{return null}}serialize(){let a={};for(let[b,y]of this.reverseMap)a[b]=Array.from(y.values());let d={};for(let[b,y]of this.fileHashes)d[b]=y;return{version:sRt,timestamp:Date.now(),rootDir:this.rootDir,reverseMap:a,fileHashes:d}}static deserialize(a,d){let b=oo(d),y=oo(a.rootDir);if(a.version!==sRt)return rzt.warn("Version mismatch:",a.version,"!==",sRt),null;if(y!==b)return rzt.warn("Root dir mismatch:",a.rootDir,"!==",d),null;let C=new p(d);for(let[O,X]of Object.entries(a.fileHashes))C.fileHashes.set(oo(O),X);for(let[O,X]of Object.entries(a.reverseMap)){let be=oo(O),Le=new Map;for(let Ze of X){let ft=oo(Ze.sourcePath);Le.set(ft,{...Ze,sourcePath:ft})}C.reverseMap.set(be,Le)}return C}async validateIndex(a=.2){let d=[],b=[];for(let X of this.fileHashes.keys()){let be=await p.getFileHashFromDisk(X);if(!be){b.push(X);continue}this.isFileStale(X,be)&&d.push(X)}let y=this.fileHashes.size,C=d.length+b.length,O=y>0?C/y:0;return{isValid:O<=a,staleFiles:d,stalePercentage:O,missingFiles:b}}getStats(){let a=0;for(let d of this.reverseMap.values())a+=d.size;return{indexedFiles:this.fileHashes.size,targetFiles:this.reverseMap.size,totalReferences:a}}};cRt();var IIe=class{constructor(a){this.rootDir=a}rootDir;reverseIndex=null;symbolReverseIndex=null;enable(a){let d=!1;if(this.reverseIndex??=new Lae(this.rootDir),this.symbolReverseIndex??=new AIe(this.rootDir),a)try{let b=JSON.parse(a),y=Lae.deserialize(b,this.rootDir);y&&(this.reverseIndex=y,d=!0)}catch{d=!1}return d}disable(){this.reverseIndex?.clear(),this.reverseIndex=null,this.symbolReverseIndex?.clear(),this.symbolReverseIndex=null}clear(){this.reverseIndex?.clear(),this.symbolReverseIndex?.clear()}isEnabled(){return this.reverseIndex!==null}hasEntries(){return this.reverseIndex?.hasEntries()??!1}ensure(){this.reverseIndex??=new Lae(this.rootDir)}addDependencies(a,d,b){this.reverseIndex?.addDependencies(a,d,b)}removeDependenciesFromSource(a){this.reverseIndex?.removeDependenciesFromSource(a)}getReferencingFiles(a){return this.reverseIndex?this.reverseIndex.getReferencingFiles(a):[]}getCallerCount(a){return this.reverseIndex?this.reverseIndex.getCallerCount(a):0}getSerialized(){return this.reverseIndex?JSON.stringify(this.reverseIndex.serialize()):null}validate(a=.2){return this.reverseIndex?.validateIndex(a)??null}getStats(){return this.reverseIndex?.getStats()}addSymbolDependencies(a,d,b){this.symbolReverseIndex?.addDependencies(a,d,b)}removeSymbolDependenciesFromSource(a){this.symbolReverseIndex?.removeDependenciesFromSource(a)}getSymbolReferencingFiles(a){return this.symbolReverseIndex?.getCallerFiles(a)??[]}getSymbolStats(){return this.symbolReverseIndex?.getStats()}};gTe();gTe();FC();var PIe=class{constructor(a,d,b){this.dependencyCache=a;this.symbolCache=d;this.reverseIndexManager=b}dependencyCache;symbolCache;reverseIndexManager;clearAll(){this.dependencyCache.clear(),this.symbolCache.clear(),this.reverseIndexManager.clear()}invalidateFile(a){let d=oo(a),b=this.dependencyCache.has(d);return this.dependencyCache.delete(d),this.symbolCache.delete(d),this.reverseIndexManager.removeDependenciesFromSource(d),b}invalidateFiles(a){let d=0;for(let b of a)this.invalidateFile(b)&&d++;return d}handleFileDeleted(a){let d=oo(a);this.dependencyCache.delete(d),this.symbolCache.delete(d),this.reverseIndexManager.removeDependenciesFromSource(d)}};FC();OC();var Oae=zh("SpiderDependencyAnalyzer"),kIe=class{constructor(a,d,b,y){this.languageService=a;this.resolver=d;this.dependencyCache=b;this.reverseIndexManager=y}languageService;resolver;dependencyCache;reverseIndexManager;async analyze(a){let d=oo(a),b=this.dependencyCache.get(d);if(b)return Oae.debug(`Returning ${b.length} cached dependencies for ${a}`),await this.updateReverseIndexIfEnabled(a,d,b),b;Oae.debug(`Analyzing ${a}...`);try{let y=this.languageService.getAnalyzer(a),C=await y.parseImports(a);Oae.debug(`Parsed ${C.length} imports from ${a}`);let O=[],X=new Set;for(let be of C){let Le=await y.resolvePath(a,be.module);if(!Le){Oae.debug(`Failed to resolve module "${be.module}" from ${a}`);continue}if(!this.resolver.isWithinWorkspace(Le)){Oae.warn(`Skipping dependency outside workspace: ${be.module}`);continue}let Ze=oo(Le);X.has(Ze)||(X.add(Ze),O.push({path:Ze,type:be.type,line:be.line,module:be.module}))}return Oae.debug(`Resolved ${O.length} dependencies for ${a}`),this.dependencyCache.set(d,O),await this.updateReverseIndexIfEnabled(a,d,O),O}catch(y){let C=lg.fromError(y,a);if(C.code==="FILE_TOO_LARGE"||C.code==="TIMEOUT")return Oae.warn(`Skipping ${a}: ${C.toUserMessage()}`),[];throw Oae.error("Analysis failed:",C.toUserMessage(),C.code),C}}async resolveModuleSpecifier(a,d){try{return await this.resolver.resolve(a,d)}catch{return null}}invalidateDependencyCache(a){this.dependencyCache.delete(oo(a))}async updateReverseIndexIfEnabled(a,d,b){if(!this.reverseIndexManager.isEnabled()||b.length===0)return;let y=await Lae.getFileHashFromDisk(a);y&&this.reverseIndexManager.addDependencies(d,b,y)}};FC();KDe();FC();function yTe(p){let d=oo(p).split("/");for(let b=0;b<d.length-1;b++)if(PZe.includes(d[b]))return!0;return!1}OC();var Fae=zh("SpiderGraphCrawler"),NIe=class{constructor(a,d){this.dependencyAnalyzer=a;this.getConfig=d}dependencyAnalyzer;getConfig;async crawl(a,d){let b=new Set,y=[],C=new Set,O=new Set,X={},be=d?.maxDepth??this.getConfig().maxDepth??3,Le=()=>{if(d?.signal?.aborted){let ft=new Error("Crawl cancelled");throw ft.name="AbortError",ft}};Fae.debug(`Starting crawl from: ${a}`);let Ze=async(ft,he)=>{Le();let _n=oo(ft);if(he>be){Fae.debug(`Skipping ${ft}: max depth ${be} reached`);return}if(O.has(_n)){Fae.debug(`Skipping ${ft}: already visited`);return}O.add(_n),b.add(_n);try{let mt=await this.dependencyAnalyzer.analyze(ft);Le(),Fae.debug(`Found ${mt.length} dependencies for ${ft}`);for(let yt of mt){Le(),b.add(yt.path);let $r=`${_n}->${yt.path}`;C.has($r)||(C.add($r),y.push({source:_n,target:yt.path}),Fae.debug(`Added edge: ${_n} -> ${yt.path}`)),yt.module.startsWith("@")&&yt.module.includes("/")&&!yt.module.startsWith("@/")&&(X[yt.path]=yt.module),yTe(yt.path)?Fae.debug(`Skipping ${yt.path}: in ignored directory`):await Ze(yt.path,he+1)}}catch(mt){if(mt instanceof Error&&mt.name==="AbortError")throw mt;Fae.debug(`Failed to analyze ${ft}: ${mt}`)}};return await Ze(a,0),Fae.debug(`Crawl completed: ${b.size} nodes, ${y.length} edges`),{nodes:Array.from(b),edges:y,nodeLabels:Object.keys(X).length>0?X:void 0}}async crawlFrom(a,d,b=10,y){let C=new Set,O=[],X=new Set,be={},Le=new Set(Array.from(d).map(tr=>oo(tr))),Ze=oo(a),ft=new Set,he=[],_n=new Set,mt={},yt=y?.batchSize??200,$r=()=>{if(y?.signal?.aborted){let tr=new Error("Expansion cancelled");throw tr.name="AbortError",tr}},Gr=(tr,jn)=>jn>b?!0:tr===Ze?jn!==0&&X.has(tr):X.has(tr),Ii=tr=>{Le.has(tr)||(C.add(tr),ft.add(tr))},Qo=(tr,jn)=>{let Zi=`${jn}->${tr.path}`;_n.has(Zi)||(_n.add(Zi),O.push({source:jn,target:tr.path}),he.push({source:jn,target:tr.path})),!X.has(tr.path)&&!Le.has(tr.path)&&(C.add(tr.path),ft.add(tr.path)),tr.module.startsWith("@")&&tr.module.includes("/")&&!tr.module.startsWith("@/")&&(be[tr.path]=tr.module,mt[tr.path]=tr.module)},Ua=async()=>{if(!y?.onBatch){ft.clear(),he.length=0;return}if(ft.size===0&&he.length===0)return;let tr={nodes:Array.from(ft),edges:[...he],nodeLabels:Object.keys(mt).length>0?{...mt}:void 0};ft.clear(),he.length=0;for(let jn of Object.keys(mt))delete mt[jn];await y.onBatch(tr)},Va=async(tr,jn)=>{$r();let Zi=oo(tr);if(!Gr(Zi,jn)){X.add(Zi),Ii(Zi);try{let ei=await this.dependencyAnalyzer.analyze(tr);for(let Fi of ei)Qo(Fi,Zi),yTe(Fi.path)||await Va(Fi.path,jn+1);ft.size+he.length>=yt&&await Ua()}catch{}}};return await Va(a,0),await Ua(),{nodes:Array.from(C),edges:O,nodeLabels:Object.keys(be).length>0?be:void 0}}};var wIe=class{cancelled=!1;reset(){this.cancelled=!1}cancel(){this.cancelled=!0}isCancelled(){return this.cancelled}};OC();FC();function RIe(){return new Promise(p=>setTimeout(p,1))}var MIe=50;var vTe=zh("SpiderIndexingService"),LIe=class{constructor(a,d,b,y,C,O,X,be,Le,Ze){this.dependencyAnalyzer=a;this.dependencyCache=d;this.reverseIndexManager=b;this.sourceFileCollector=y;this.indexerStatus=C;this.workerManager=O;this.cancellation=X;this.getConfig=be;this.yieldToEventLoop=Le;this.getSymbolGraph=Ze}dependencyAnalyzer;dependencyCache;reverseIndexManager;sourceFileCollector;indexerStatus;workerManager;cancellation;getConfig;yieldToEventLoop;getSymbolGraph;cancel(){this.cancellation.cancel(),this.workerManager.cancel()}disposeWorker(){this.workerManager.dispose()}async analyzeFileForIndex(a,d){try{if(await this.dependencyAnalyzer.analyze(a),this.getSymbolGraph&&d<(this.getConfig().maxSymbolAnalyzerFiles??100))try{let b=await this.getSymbolGraph(a);b.dependencies.length>0&&this.reverseIndexManager.addSymbolDependencies(a,b.dependencies)}catch{}return!0}catch{return!1}}checkCancellation(a){if(this.cancellation.isCancelled())return this.indexerStatus.setCancelled(),{indexedFiles:a,duration:Date.now()-(this.indexerStatus.getSnapshot().startTime??Date.now()),cancelled:!0}}async buildFullIndex(a){this.reverseIndexManager.ensure(),this.cancellation.reset(),this.indexerStatus.startCounting();let d=await this.sourceFileCollector.collectAllSourceFiles(this.getConfig().rootDir),b=this.checkCancellation(0);if(b)return b;let y=d.length;this.indexerStatus.setTotal(y),await this.yieldToEventLoop(),this.indexerStatus.startIndexing();let C=0,O=Date.now();try{for(let Le of d){let Ze=this.checkCancellation(C);if(Ze)return Ze;await this.analyzeFileForIndex(Le,C),C++,this.indexerStatus.updateProgress(C,Le),a?.(C,y,Le),Date.now()-O>=MIe&&(await this.yieldToEventLoop(),O=Date.now())}this.indexerStatus.complete();let X=this.indexerStatus.getSnapshot(),be=Date.now()-(X.startTime??Date.now());return{indexedFiles:C,duration:be,cancelled:!1}}catch(X){let be=lg.fromError(X);throw this.indexerStatus.setError(be.toUserMessage()),vTe.error("Indexing failed:",be.toUserMessage(),be.code),be}}async buildFullIndexInWorker(a,d){let b=this.getConfig();return this.workerManager.buildFullIndexInWorker({workerPath:a,progressCallback:d,config:{rootDir:b.rootDir,excludeNodeModules:b.excludeNodeModules,tsConfigPath:b.tsConfigPath,progressInterval:b.indexingProgressInterval,extensionPath:b.extensionPath,ignoreTypeImports:b.ignoreTypeImports}})}async reindexStaleFiles(a,d){if(!this.reverseIndexManager.isEnabled())return 0;vTe.info(`Re-indexing ${a.length} stale files`);let b=this.getConfig().indexingConcurrency??8,y=0;for(let C=0;C<a.length;C+=b){let O=a.slice(C,C+b);await Promise.all(O.map(async X=>{let be=oo(X);vTe.debug(`Re-indexing stale file: ${X}`);try{this.reverseIndexManager.removeDependenciesFromSource(be),this.dependencyCache.delete(be),vTe.debug(`Deleted cache for ${X}, re-analyzing...`),await this.dependencyAnalyzer.analyze(X),vTe.debug(`Successfully re-analyzed ${X}`)}catch(Le){vTe.error(`Failed to re-index ${X}:`,Le),this.reverseIndexManager.removeDependenciesFromSource(be)}})),y+=O.length,d?.(y,a.length,O.at(-1)),await this.yieldToEventLoop()}return vTe.info(`Completed re-indexing ${y} files`),y}};FC();var OIe=class{constructor(a,d,b,y=()=>!0,C=()=>!1){this.reverseIndexManager=a;this.dependencyAnalyzer=d;this.fileReader=b;this.isIndexReady=y;this.isIndexingActive=C}reverseIndexManager;dependencyAnalyzer;fileReader;isIndexReady;isIndexingActive;fallbackFinder=null;_fallbackCache=new Map;_fallbackCacheVersion=0;_fallbackCacheEntryVersion=new Map;setFallbackFinder(a){this.fallbackFinder=a}clearFallbackCache(){this._fallbackCacheVersion++}async findReferencingFiles(a){let d=oo(a),b=this.reverseIndexManager.hasEntries();if(b&&this.isIndexReady())return this.reverseIndexManager.getReferencingFiles(d);let y=b?this.reverseIndexManager.getReferencingFiles(d):[];if(b&&!this.isIndexingActive()||!this.fallbackFinder)return y;let C=await this.getFallbackReferencingFiles(d);return y.length===0?C:C.length===0?y:this.mergeDependencies(y,C)}async getFallbackReferencingFiles(a){if(!this.fallbackFinder)return[];if(this._fallbackCacheEntryVersion.get(a)===this._fallbackCacheVersion){let y=this._fallbackCache.get(a);if(y!==void 0)return y}let b=await this.fallbackFinder.findReferencingFilesFallback(a);return this._fallbackCache.set(a,b),this._fallbackCacheEntryVersion.set(a,this._fallbackCacheVersion),b}mergeDependencies(a,d){let b=new Map;for(let y of[...a,...d]){let C=oo(y.path);b.has(C)||b.set(C,y)}return[...b.values()]}async findReferenceInFile(a,d,b){try{if(!(await this.fileReader.readFile(a)).includes(b))return null;let O=(await this.dependencyAnalyzer.analyze(a)).find(X=>oo(X.path)===d);return O?{path:oo(a),type:O.type,line:O.line,module:O.module}:null}catch{return null}}};var lRt=Lc(require("node:path"));KDe();OC();gTe();FC();var Wae=zh("SpiderSymbolService"),FIe=class{constructor(a,d,b,y,C,O,X,be){this.astWorkerHost=a;this.symbolCache=d;this.fileReader=b;this.resolver=y;this.symbolDependencyHelper=C;this.getConfig=O;this.findReferencingFiles=X;this.languageService=be}astWorkerHost;symbolCache;fileReader;resolver;symbolDependencyHelper;getConfig;findReferencingFiles;languageService;async getSymbolGraph(a){if(!lRt.default.isAbsolute(a))try{let y=await this.resolveModuleSpecifier(this.getConfig().rootDir,a);y&&(a=y)}catch{}let d=oo(a),b=this.symbolCache.get(d);if(b)return b;try{let y=await this.fileReader.readFile(a),C=await this.astWorkerHost.analyzeFile(d,y),O=await Promise.all(C.dependencies.map(async be=>{try{let Ze=await this.languageService.getAnalyzer(d).resolvePath(d,be.targetFilePath);if(Ze)return{...be,targetFilePath:oo(Ze)}}catch{}return be})),X={symbols:C.symbols,dependencies:O};return this.symbolCache.set(d,X),X}catch(y){let C=lg.fromError(y,a);if(Wae.error("Symbol analysis failed:",C.toUserMessage()),C.isRecoverable())return{symbols:[],dependencies:[]};throw C}}async findUnusedSymbols(a){try{let d=oo(a),{symbols:b}=await this.getSymbolGraph(d),y=b.filter(Ze=>Ze.isExported);if(y.length===0)return[];let C=await this.findReferencingFiles(d),O=await this.collectUsedSymbolIds(C,d),X=await this.fileReader.readFile(d),be=await this.astWorkerHost.getInternalExportDependencyGraph(d,X),Le=this.expandUsedSymbolsViaInternalGraph(O,be);return y.filter(Ze=>!Le.has(Ze.id))}catch(d){let b=lg.fromError(d,a);return Wae.error("Find unused symbols failed:",b.toUserMessage()),[]}}async getSymbolDependents(a,d){let b=await this.findReferencingFiles(a);return this.collectSymbolDependents(b,a,d)}async traceFunctionExecution(a,d,b=10){let y=`${a}:${d}`,C=[],O=new Set,X=!1,be=async(Le,Ze,ft)=>{if(ft>b){X=!0;return}let he=`${Le}:${Ze}`;if(!O.has(he)){O.add(he);try{let{symbols:_n,dependencies:mt}=await this.getSymbolGraph(Le),yt=_n.find(Gr=>Gr.name===Ze);if(!yt)return;let $r=mt.filter(Gr=>Gr.sourceSymbolId===yt.id);for(let Gr of $r){let Ii=null;try{Ii=await this.resolver.resolve(Le,Gr.targetFilePath)}catch{}let Qo=Gr.targetSymbolId.split(":").pop()||"";C.push({depth:ft,callerSymbolId:he,calledSymbolId:Gr.targetSymbolId,calledFilePath:Gr.targetFilePath,resolvedFilePath:Ii}),Ii&&!yTe(Ii)&&await be(Ii,Qo,ft+1)}}catch(_n){let mt=lg.fromError(_n,Le);Wae.error("Trace execution failed:",he,mt.toUserMessage())}}};return await be(a,d,1),{rootSymbol:{id:y,filePath:a,symbolName:d},callChain:C,visitedSymbols:Array.from(O),maxDepthReached:X}}async resolveModuleSpecifier(a,d){try{return await this.resolver.resolve(a,d)}catch{return null}}expandUsedSymbolsViaInternalGraph(a,d){let b=new Set(a),y=Array.from(b);for(;y.length>0;){let C=y.pop();if(C===void 0)continue;let O=d.get(C);if(O)for(let X of O)b.has(X)||(b.add(X),y.push(X))}return b}async collectUsedSymbolIds(a,d){let b=new Set;for(let y of a){let{dependencies:C}=await this.getSymbolGraph(y.path);for(let O of C)if(await this.symbolDependencyHelper.doesDependencyTargetFile(O,y.path,d)){let be=this.symbolDependencyHelper.extractSymbolName(O.targetSymbolId);b.add(this.symbolDependencyHelper.buildUsedSymbolId(d,be))}}return b}async collectSymbolDependents(a,d,b){let y=[],C=oo(d);for(let O of a){let{dependencies:X}=await this.getSymbolGraph(O.path);for(let be of X)await this.symbolDependencyHelper.doesDependencyTargetFile(be,O.path,C)&&this.symbolDependencyHelper.extractSymbolName(be.targetSymbolId)===b&&y.push(be)}return y}async verifyDependencyUsage(a,d){try{let b=oo(a),y=oo(d);if(yTe(y))return!0;if(this.isAstUnsupportedFile(b))return Wae.debug(`Skipping symbol analysis for unsupported file type: ${b}`),!0;let{dependencies:C}=await this.getSymbolGraph(b);if(C.length===0)return!1;let O=y.split("/").pop()||"",X=C.filter(be=>be.targetFilePath===y||be.targetFilePath.includes(O)||!be.targetFilePath.startsWith("/"));for(let be of X)if(await this.symbolDependencyHelper.doesDependencyTargetFile(be,b,y))return!0;return!1}catch(b){let y=lg.fromError(b,a);return Wae.warn("Usage verification failed, assuming used:",y.message),!0}}async verifyDependencyUsageBatch(a,d){try{let b=oo(a);if(this.isAstUnsupportedFile(b))return Wae.debug(`Skipping symbol analysis for unsupported file type: ${b}`),this.markAllAsUsed(d);let{dependencies:y}=await this.getSymbolGraph(b);if(y.length===0)return this.markAllAsUnused(d);let C=await this.buildResolvedTargetsSet(y,b);return this.checkTargetsAgainstResolved(d,C)}catch(b){let y=lg.fromError(b,a);return Wae.warn("Batch usage verification failed, assuming all used:",y.message),this.markAllAsUsed(d)}}markAllAsUsed(a){let d=new Map;for(let b of a)d.set(oo(b),!0);return d}markAllAsUnused(a){let d=new Map;for(let b of a)d.set(oo(b),!1);return d}async buildResolvedTargetsSet(a,d){let b=new Set;for(let y of a)try{let C=await this.symbolDependencyHelper.resolveTargetPath(y,d);C&&b.add(oo(C))}catch{}return b}checkTargetsAgainstResolved(a,d){let b=new Map;for(let y of a){let C=oo(y);if(yTe(C)){b.set(C,!0);continue}b.set(C,d.has(C))}return b}isAstUnsupportedFile(a){return a.endsWith(".gql")||a.endsWith(".graphql")||a.endsWith(".cs")||a.endsWith(".csproj")||a.endsWith(".go")||a.endsWith(".java")}async scanDeadCode(a,d){let{maxFiles:b=500,hasReverseIndex:y}=d;if(!y)throw new lg("Dead code scan requires the reverse index. Wait for indexing to complete or call rebuild_index first.","INDEX_NOT_READY");let C=this.getConfig(),X=await new GF({excludeNodeModules:C.excludeNodeModules??!0}).collectAllSourceFiles(a),be=new Set($Ge),Ze=X.filter(_n=>{let mt=lRt.default.extname(_n).toLowerCase();return be.has(mt)}).slice(0,b),ft=[],he=0;for(let _n of Ze)try{let mt=await this.findUnusedSymbols(_n);mt.length>0&&ft.push({filePath:_n,unusedSymbols:mt})}catch(mt){let yt=lg.fromError(mt,_n);Wae.warn("scanDeadCode: skipping file due to error:",_n,yt.message),he++}return{entries:ft,scannedFiles:Ze.length,skippedFiles:he}}};var fzt=require("node:worker_threads"),pzt=Lc(require("node:path")),xot=class{worker=null;statusCallbacks=new Set;currentState="idle";currentProgress=0;currentTotal=0;currentFile="";startTime=void 0;cancelled=!1;workerPath;constructor(a){this.workerPath=a??pzt.join(__dirname,"indexerWorker.js")}subscribeToStatus(a){return this.statusCallbacks.add(a),a(this.getSnapshot()),()=>this.statusCallbacks.delete(a)}getSnapshot(){let a=this.currentTotal>0?Math.round(this.currentProgress/this.currentTotal*100):0;return{state:this.currentState,processed:this.currentProgress,total:this.currentTotal,currentFile:this.currentFile,percentage:a,startTime:this.startTime,cancelled:this.cancelled}}notifySubscribers(){let a=this.getSnapshot();for(let d of this.statusCallbacks)try{d(a)}catch{}}updateState(a,d=0,b=0,y=""){this.currentState=a,this.currentProgress=d,this.currentTotal=b,this.currentFile=y,this.notifySubscribers()}getPendingCount(){return this.worker?1:0}async startIndexing(a){if(this.worker)throw new Error("Indexing already in progress");this.cancelled=!1,this.startTime=Date.now(),this.updateState("counting");let d=a.timeoutMs??600*1e3;return new Promise((b,y)=>{let C=be=>{clearTimeout(X),b(be)},O=be=>{clearTimeout(X),y(be)},X=setTimeout(()=>{this.cancel(),this.updateState("error"),this.cleanupWorker(),y(new Error(`Indexing timed out after ${Math.round(d/6e4)} minute(s)`))},d);try{this.worker=new fzt.Worker(this.workerPath,{workerData:a});let be={indexedFiles:0,duration:0,cancelled:!1,data:[]};this.worker.on("message",Le=>{switch(Le.type){case"counting":this.updateState("counting");break;case"progress":Le.data&&this.updateState("indexing",Le.data.processed??0,Le.data.total??0,Le.data.currentFile??"");break;case"complete":Le.data&&(be={indexedFiles:Le.data.processed??0,duration:Le.data.duration??0,cancelled:this.cancelled,data:Le.data.indexData??[]}),this.updateState("complete"),this.cleanupWorker(),C(be);break;case"error":this.updateState("error"),this.cleanupWorker(),O(new Error(Le.error??"Unknown worker error"));break}}),this.worker.on("error",Le=>{this.updateState("error"),this.cleanupWorker(),O(Le)}),this.worker.on("exit",Le=>{Le!==0&&this.currentState!=="complete"&&this.currentState!=="error"&&(this.updateState("error"),this.cleanupWorker(),O(new Error(`Worker stopped with exit code ${Le}`)))}),this.worker.postMessage({type:"start"})}catch(be){this.updateState("error"),this.cleanupWorker(),O(be)}})}cancel(){this.cancelled=!0,this.worker&&this.worker.postMessage({type:"cancel"})}isIndexing(){return this.currentState==="indexing"||this.currentState==="counting"}cleanupWorker(){if(this.worker){let a=this.worker;this.worker=null,a.removeAllListeners(),a.on("error",()=>{}),a.terminate().catch(()=>{})}}dispose(){this.cancel(),this.cleanupWorker(),this.statusCallbacks.clear()}};FC();var WIe=class{constructor(a,d,b){this.indexerStatus=a;this.reverseIndexManager=d;this.dependencyCache=b}indexerStatus;reverseIndexManager;dependencyCache;workerHost=null;async buildFullIndexInWorker(a){let{workerPath:d,config:b,progressCallback:y}=a;this.workerHost??=new xot(d),this.reverseIndexManager.ensure();let C=this.workerHost.subscribeToStatus(O=>{switch(O.state){case"counting":this.indexerStatus.startCounting();break;case"indexing":O.total>0&&(this.indexerStatus.setTotal(O.total),this.indexerStatus.startIndexing()),this.indexerStatus.updateProgress(O.processed,O.currentFile);break;case"complete":this.indexerStatus.complete();break;case"error":this.indexerStatus.setError(O.errorMessage??"Unknown error");break}y&&O.state==="indexing"&&y(O.processed,O.total,O.currentFile)});try{let O=await this.workerHost.startIndexing({rootDir:b.rootDir,excludeNodeModules:b.excludeNodeModules,tsConfigPath:b.tsConfigPath,extensionPath:b.extensionPath,ignoreTypeImports:b.ignoreTypeImports});return this.importWorkerResult(O),{indexedFiles:O.indexedFiles,duration:O.duration,cancelled:O.cancelled}}finally{C()}}cancel(){this.workerHost?.cancel()}dispose(){this.workerHost?.dispose(),this.workerHost=null}importWorkerResult(a){for(let d of a.data){let b=oo(d.filePath);this.dependencyCache.set(b,d.dependencies),this.reverseIndexManager.addDependencies(b,d.dependencies,{mtime:d.mtime,size:d.size})}}};FC();OC();var BIe=zh("SymbolDependencyHelper"),zIe=class{resolveFn;constructor(a){this.resolveFn=a.resolve}async doesDependencyTargetFile(a,d,b){let y=oo(a.targetFilePath),C=oo(b);if(BIe.debug(`Comparing: dep.targetFilePath='${y}' vs targetFilePath='${C}'`),y===C)return BIe.debug("\u2713 Direct match"),!0;BIe.debug(`Attempting fallback resolution for '${a.targetFilePath}' from '${d}'`);let O=await this.resolveFn(d,a.targetFilePath);if(O){let X=oo(O);BIe.debug(`Resolved to: '${X}'`);let be=X===C;return BIe.debug(be?"\u2713 Fallback match":"\u2717 No match after resolution"),be}return BIe.debug("\u2717 Resolution failed, no match"),!1}extractSymbolName(a){return a.split(":").pop()||""}extractBasename(a){return a.split(/[/\\]/).pop()?.replace(/\.[^/.]+$/,"")}buildUsedSymbolId(a,d){return`${oo(a)}:${d}`}async resolveTargetPath(a,d){let b=oo(a.targetFilePath);if(b.startsWith("/")||/^[a-zA-Z]:\//.test(b))return b;try{let y=await this.resolveFn(d,a.targetFilePath);return y?oo(y):null}catch{return null}}};var Eot=class{config;languageService;resolver;cache;symbolCache;fileReader;astWorkerHost;reverseIndexManager;indexerStatus;workerManager;cancellation;sourceFileCollector;referencingFilesFinder;symbolDependencyHelper;dependencyAnalyzer;referenceLookup;symbolService;graphCrawler;indexingService;cacheCoordinator;constructor(a){if("dependencyAnalyzer"in a){let d=a;this.config=d.config,this.languageService=d.languageService,this.resolver=d.resolver,this.cache=d.cache,this.symbolCache=d.symbolCache,this.fileReader=d.fileReader,this.astWorkerHost=d.astWorkerHost,this.reverseIndexManager=d.reverseIndexManager,this.indexerStatus=d.indexerStatus,this.workerManager=d.workerManager,this.cancellation=d.cancellation,this.sourceFileCollector=d.sourceFileCollector,this.referencingFilesFinder=d.referencingFilesFinder,this.symbolDependencyHelper=d.symbolDependencyHelper,this.dependencyAnalyzer=d.dependencyAnalyzer,this.referenceLookup=d.referenceLookup,this.symbolService=d.symbolService,this.graphCrawler=d.graphCrawler,this.indexingService=d.indexingService,this.cacheCoordinator=d.cacheCoordinator}else{let d=a;this.config={maxDepth:50,excludeNodeModules:!0,enableReverseIndex:!1,indexingConcurrency:4,maxCacheSize:500,maxSymbolCacheSize:200,maxSymbolAnalyzerFiles:100,...d},this.languageService=new EIe(d.rootDir,d.tsConfigPath,d.extensionPath),this.resolver=new OH(d.tsConfigPath,this.config.excludeNodeModules,d.rootDir),this.cache=new bae({maxSize:this.config.maxCacheSize,enableLRU:!0}),this.symbolCache=new bae({maxSize:this.config.maxSymbolCacheSize,enableLRU:!0}),this.astWorkerHost=new gae(void 0,d.extensionPath),this.reverseIndexManager=new IIe(this.config.rootDir),this.fileReader=new Lx,this.indexerStatus=new YDe,this.cancellation=new wIe,this.workerManager=new WIe(this.indexerStatus,this.reverseIndexManager,this.cache),this.dependencyAnalyzer=new kIe(this.languageService,this.resolver,this.cache,this.reverseIndexManager),this.sourceFileCollector=new GF({excludeNodeModules:this.config.excludeNodeModules??!0,yieldIntervalMs:MIe,yieldCallback:()=>RIe(),isCancelled:()=>this.cancellation.isCancelled()}),this.referenceLookup=new OIe(this.reverseIndexManager,this.dependencyAnalyzer,this.fileReader,()=>this.indexerStatus.isReady(),()=>this.indexerStatus.isActive()),this.referencingFilesFinder=new CIe({sourceFileCollector:this.sourceFileCollector,getRootDir:()=>this.config.rootDir,getConcurrency:()=>this.config.indexingConcurrency,findReferenceInFile:(b,y,C)=>this.referenceLookup.findReferenceInFile(b,y,C)}),this.referenceLookup.setFallbackFinder(this.referencingFilesFinder),this.symbolDependencyHelper=new zIe({resolve:async(b,y)=>{try{return await this.resolver.resolve(b,y)}catch{return null}}}),this.symbolService=new FIe(this.astWorkerHost,this.symbolCache,this.fileReader,this.resolver,this.symbolDependencyHelper,()=>this.config,b=>this.findReferencingFiles(b),this.languageService),this.graphCrawler=new NIe(this.dependencyAnalyzer,()=>this.config),this.indexingService=new LIe(this.dependencyAnalyzer,this.cache,this.reverseIndexManager,this.sourceFileCollector,this.indexerStatus,this.workerManager,this.cancellation,()=>this.config,()=>RIe(),b=>this.symbolService.getSymbolGraph(b)),this.cacheCoordinator=new PIe(this.cache,this.symbolCache,this.reverseIndexManager),d.enableReverseIndex&&this.enableReverseIndex()}}get workspaceRoot(){return this.config.rootDir}async dispose(){await this.astWorkerHost.stop()}updateConfig(a){this.config.excludeNodeModules=a.excludeNodeModules??this.config.excludeNodeModules,this.config.maxDepth=a.maxDepth??this.config.maxDepth,a.excludeNodeModules!==void 0&&(this.resolver.updateConfig(a.excludeNodeModules),this.sourceFileCollector.updateOptions({excludeNodeModules:a.excludeNodeModules})),a.enableReverseIndex!==void 0&&(this.config.enableReverseIndex=a.enableReverseIndex,a.enableReverseIndex?this.reverseIndexManager.enable():this.reverseIndexManager.disable()),a.indexingConcurrency!==void 0&&(this.config.indexingConcurrency=a.indexingConcurrency),this.clearCache()}async analyze(a){return this.dependencyAnalyzer.analyze(a)}clearCache(){this.cacheCoordinator.clearAll(),this.referenceLookup.clearFallbackCache()}invalidateFile(a){return this.referenceLookup.clearFallbackCache(),this.cacheCoordinator.invalidateFile(a)}invalidateFiles(a){return this.referenceLookup.clearFallbackCache(),this.cacheCoordinator.invalidateFiles(a)}async reanalyzeFile(a){this.invalidateFile(a);try{return await this.analyze(a)}catch{return null}}handleFileDeleted(a){this.referenceLookup.clearFallbackCache(),this.cacheCoordinator.handleFileDeleted(a)}enableReverseIndex(a){let d=this.reverseIndexManager.enable(a);return this.config.enableReverseIndex=!0,d}disableReverseIndex(){this.config.enableReverseIndex=!1,this.reverseIndexManager.disable()}getSerializedReverseIndex(){return this.reverseIndexManager.getSerialized()}async validateReverseIndex(a=.2){return this.reverseIndexManager.validate(a)}getIndexStatus(){return this.indexerStatus.getSnapshot()}subscribeToIndexStatus(a){return this.indexerStatus.subscribe(a)}isReverseIndexEnabled(){return this.reverseIndexManager.isEnabled()}hasReverseIndex(){return this.reverseIndexManager.hasEntries()}getCallerCount(a){return this.reverseIndexManager.hasEntries()?this.reverseIndexManager.getCallerCount(a):0}cancelIndexing(){this.indexingService.cancel()}async buildFullIndex(a){return this.indexingService.buildFullIndex(a)}async buildFullIndexInWorker(a,d){return this.indexingService.buildFullIndexInWorker(a,d)}disposeWorker(){this.indexingService.disposeWorker()}async reindexStaleFiles(a,d){return this.indexingService.reindexStaleFiles(a,d)}async crawl(a,d){return this.graphCrawler.crawl(a,d)}async crawlFrom(a,d,b=10,y){return this.graphCrawler.crawlFrom(a,d,b,y)}async findReferencingFiles(a){return this.referenceLookup.findReferencingFiles(a)}getSymbolReferencingFiles(a){if(!this.reverseIndexManager.hasEntries())return new Set;let d=this.reverseIndexManager.getSymbolReferencingFiles(a);return new Set(d)}async getSymbolGraph(a){return this.symbolService.getSymbolGraph(a)}async resolveModuleSpecifier(a,d){return this.dependencyAnalyzer.resolveModuleSpecifier(a,d)}async findUnusedSymbols(a){return this.symbolService.findUnusedSymbols(a)}async scanDeadCode(a,d){let b=a??this.config.rootDir;return this.symbolService.scanDeadCode(b,{maxFiles:d?.maxFiles,hasReverseIndex:this.hasReverseIndex()})}async verifyDependencyUsage(a,d){return this.symbolService.verifyDependencyUsage(a,d)}async verifyDependencyUsageBatch(a,d){return this.symbolService.verifyDependencyUsageBatch(a,d)}async getSymbolDependents(a,d){return this.symbolService.getSymbolDependents(a,d)}async traceFunctionExecution(a,d,b=10){return this.symbolService.traceFunctionExecution(a,d,b)}getCacheStats(){return{dependencyCache:this.cache.getStats(),symbolCache:this.symbolCache.getStats(),symbolAnalyzerFileCount:0,reverseIndexStats:this.reverseIndexManager.getStats()}}async getCacheStatsAsync(){let a=0;try{a=await this.astWorkerHost.getFileCount()}catch{}return{dependencyCache:this.cache.getStats(),symbolCache:this.symbolCache.getStats(),symbolAnalyzerFileCount:a,reverseIndexStats:this.reverseIndexManager.getStats()}}};var Cot=class{rootDir;tsConfigPath;extensionPath;maxDepth=50;excludeNodeModules=!0;enableReverseIndex=!1;indexingConcurrency=4;maxCacheSize=500;maxSymbolCacheSize=200;maxSymbolAnalyzerFiles=100;indexingProgressInterval;ignoreTypeImports=!1;customCache;customSymbolCache;customLanguageService;customPathResolver;customAstWorkerHost;customReverseIndexManager;withRootDir(a){return this.rootDir=a,this}withTsConfigPath(a){return this.tsConfigPath=a,this}withExtensionPath(a){return this.extensionPath=a,this}withMaxDepth(a){return this.maxDepth=a,this}withExcludeNodeModules(a){return this.excludeNodeModules=a,this}withIgnoreTypeImports(a){return this.ignoreTypeImports=a,this}withReverseIndex(a){return this.enableReverseIndex=a,this}withIndexingConcurrency(a){return this.indexingConcurrency=a,this}withCacheConfig(a){return a.maxCacheSize!==void 0&&(this.maxCacheSize=a.maxCacheSize),a.maxSymbolCacheSize!==void 0&&(this.maxSymbolCacheSize=a.maxSymbolCacheSize),a.maxSymbolAnalyzerFiles!==void 0&&(this.maxSymbolAnalyzerFiles=a.maxSymbolAnalyzerFiles),this}withIndexingProgressInterval(a){return this.indexingProgressInterval=a,this}withConfig(a){return this.rootDir=a.rootDir,a.tsConfigPath!==void 0&&(this.tsConfigPath=a.tsConfigPath),a.extensionPath!==void 0&&(this.extensionPath=a.extensionPath),a.maxDepth!==void 0&&(this.maxDepth=a.maxDepth),a.excludeNodeModules!==void 0&&(this.excludeNodeModules=a.excludeNodeModules),a.ignoreTypeImports!==void 0&&(this.ignoreTypeImports=a.ignoreTypeImports),a.enableReverseIndex!==void 0&&(this.enableReverseIndex=a.enableReverseIndex),a.indexingConcurrency!==void 0&&(this.indexingConcurrency=a.indexingConcurrency),a.maxCacheSize!==void 0&&(this.maxCacheSize=a.maxCacheSize),a.maxSymbolCacheSize!==void 0&&(this.maxSymbolCacheSize=a.maxSymbolCacheSize),a.maxSymbolAnalyzerFiles!==void 0&&(this.maxSymbolAnalyzerFiles=a.maxSymbolAnalyzerFiles),a.indexingProgressInterval!==void 0&&(this.indexingProgressInterval=a.indexingProgressInterval),this}withCache(a){return this.customCache=a,this}withSymbolCache(a){return this.customSymbolCache=a,this}withLanguageService(a){return this.customLanguageService=a,this}withPathResolver(a){return this.customPathResolver=a,this}withAstWorkerHost(a){return this.customAstWorkerHost=a,this}withReverseIndexManager(a){return this.customReverseIndexManager=a,this}build(){this.validate();let a=this.initializeServices();return new Eot(a)}initializeServices(){let a=this.buildConfig(),d=this.customLanguageService??new EIe(this.rootDir,this.tsConfigPath,this.extensionPath,this.ignoreTypeImports),b=this.customPathResolver??new OH(this.tsConfigPath,this.excludeNodeModules,this.rootDir),y=this.customCache??new bae({maxSize:this.maxCacheSize,enableLRU:!0}),C=this.customSymbolCache??new bae({maxSize:this.maxSymbolCacheSize,enableLRU:!0}),O=this.customAstWorkerHost??new gae(void 0,this.extensionPath),X=this.customReverseIndexManager??new IIe(this.rootDir),be=new Lx,Le=new YDe,Ze=new wIe,ft=new WIe(Le,X,y),he=new kIe(d,b,y,X),_n=new GF({excludeNodeModules:this.excludeNodeModules,yieldIntervalMs:MIe,yieldCallback:()=>RIe(),isCancelled:()=>Ze.isCancelled()}),mt=new OIe(X,he,be,()=>Le.isReady(),()=>Le.isActive()),yt=new CIe({sourceFileCollector:_n,getRootDir:()=>this.rootDir,getConcurrency:()=>this.indexingConcurrency,findReferenceInFile:(Va,tr,jn)=>mt.findReferenceInFile(Va,tr,jn)});mt.setFallbackFinder(yt);let $r=new zIe({resolve:async(Va,tr)=>{try{return await b.resolve(Va,tr)}catch{return null}}}),Gr=new FIe(O,C,be,b,$r,()=>a,Va=>mt.findReferencingFiles(Va),d),Ii=new NIe(he,()=>a),Qo=new LIe(he,y,X,_n,Le,ft,Ze,()=>a,()=>RIe(),Va=>Gr.getSymbolGraph(Va)),Ua=new PIe(y,C,X);return this.enableReverseIndex&&X.enable(),{config:a,languageService:d,resolver:b,cache:y,symbolCache:C,fileReader:be,astWorkerHost:O,reverseIndexManager:X,indexerStatus:Le,workerManager:ft,cancellation:Ze,sourceFileCollector:_n,referencingFilesFinder:yt,symbolDependencyHelper:$r,dependencyAnalyzer:he,referenceLookup:mt,symbolService:Gr,graphCrawler:Ii,indexingService:Qo,cacheCoordinator:Ua}}validate(){if(!this.rootDir)throw new Error("rootDir is required");if(this.maxDepth<0)throw new Error("maxDepth must be non-negative");if(this.indexingConcurrency<1)throw new Error("indexingConcurrency must be at least 1");if(this.maxCacheSize<0)throw new Error("maxCacheSize must be non-negative");if(this.maxSymbolCacheSize<0)throw new Error("maxSymbolCacheSize must be non-negative");if(this.maxSymbolAnalyzerFiles<0)throw new Error("maxSymbolAnalyzerFiles must be non-negative")}buildConfig(){return{rootDir:this.rootDir,tsConfigPath:this.tsConfigPath,extensionPath:this.extensionPath,maxDepth:this.maxDepth,excludeNodeModules:this.excludeNodeModules,ignoreTypeImports:this.ignoreTypeImports,enableReverseIndex:this.enableReverseIndex,indexingConcurrency:this.indexingConcurrency,maxCacheSize:this.maxCacheSize,maxSymbolCacheSize:this.maxSymbolCacheSize,maxSymbolAnalyzerFiles:this.maxSymbolAnalyzerFiles,indexingProgressInterval:this.indexingProgressInterval}}};iw();OC();cR();var dRt=class{constructor(a,d="info",b=[]){this.source=a;this.entries=b;this.level=d}source;entries;level;setLevel(a){this.level=a}debug(a){this.record("debug",a)}info(a){this.record("info",a)}warn(a){this.record("warn",a)}error(a){this.record("error",a)}record(a,d){this.entries.length>=1e3&&this.entries.shift(),this.entries.push({level:a,source:this.source,message:d,timestamp:Date.now()})}getEntries(){return[...this.entries]}clear(){this.entries.length=0}},Aot=class{sharedEntries=[];createLogger(a,d){return new dRt(a,d??"info",this.sharedEntries)}getCollectedEntries(){return[...this.sharedEntries]}clear(){this.sharedEntries.length=0}getErrorCount(){let a=0,d=0;for(let b of this.sharedEntries)b.level==="error"?a+=1:b.level==="warn"&&(d+=1);return{errors:a,warnings:d,total:this.sharedEntries.length}}};xZe({createLogger(p,a){return new KGe(p,a)}});hae.setDefaultLevel(h3t("LOG_LEVEL"));var fRt=zh("CliRuntime");function pRt(p){let a=lR.resolve(p),{root:d}=lR.parse(a);for(;a!==d;){if(QH.existsSync(lR.join(a,"package.json"))||QH.existsSync(lR.join(a,"tsconfig.json")))return a;a=lR.dirname(a)}return lR.resolve(p)}function xin(p){let a=lR.join(p,"tsconfig.json");return QH.existsSync(a)?a:void 0}var DVe=class{workspaceRoot;stateDir;_initialized=!1;_indexReady=!1;errorCollectorBackend=null;constructor(a){this.workspaceRoot=lR.resolve(a),this.stateDir=lR.join(this.workspaceRoot,".graph-it")}get initialized(){return this._initialized}enableErrorCollection(){this.errorCollectorBackend||(this.errorCollectorBackend=new Aot,xZe(this.errorCollectorBackend))}disableErrorCollection(){if(!this.errorCollectorBackend)return[];let a=this.errorCollectorBackend.getCollectedEntries();return xZe({createLogger(d,b){return new KGe(d,b)}}),this.errorCollectorBackend=null,a}getCollectedErrors(){return this.errorCollectorBackend?.getCollectedEntries()??[]}clearCollectedErrors(){this.errorCollectorBackend?.clear()}async init(){if(this._initialized)return;QH.mkdirSync(this.stateDir,{recursive:!0});let a=xin(this.workspaceRoot);hl.parser=new XDe,hl.resolver=new OH(a,!0,this.workspaceRoot);let d=lR.resolve(__dirname,"..");hl.astWorkerHost=new gae(void 0,d),await hl.astWorkerHost.start();let b=new Cot().withRootDir(this.workspaceRoot).withMaxDepth(50).withExcludeNodeModules(!0).withReverseIndex(!0).withExtensionPath(d);a&&b.withTsConfigPath(a),hl.spider=b.build(),hl.config={rootDir:this.workspaceRoot,tsConfigPath:a,excludeNodeModules:!0,maxDepth:50,extensionPath:d},hl.isReady=!0,this._initialized=!0,fRt.info("Runtime initialized for",this.workspaceRoot)}async ensureIndexed(a){if(!this._initialized||!hl.spider)throw new zm("Runtime not initialized. Call init() first.",zp.WORKSPACE_NOT_FOUND);if(this._indexReady){let O=hl.warmupInfo;return{filesIndexed:O?.filesIndexed??0,durationMs:O?.durationMs??0}}let d=hl.spider,b=Date.now(),y=a?.silent??!1,C=d.subscribeToIndexStatus(O=>{!y&&O.state==="indexing"&&process.stderr.write(`\r Indexing: ${O.processed}/${O.total} files...`)});try{let O=await d.buildFullIndex(),X=Date.now()-b;return y||process.stderr.write(`
|
|
43369
|
-
`),fRt.info("Indexed",O.indexedFiles,"files in",O.duration,"ms"),this.saveState({lastScanTimestamp:new Date().toISOString(),filesIndexed:O.indexedFiles,workspaceRoot:this.workspaceRoot}),hl.warmupInfo={completed:!0,durationMs:O.duration,filesIndexed:O.indexedFiles},this._indexReady=!0,{filesIndexed:O.indexedFiles,durationMs:X}}finally{C()}}async dispose(){hl.astWorkerHost&&await hl.astWorkerHost.stop(),hl.spider&&await hl.spider.dispose(),hl.reset(),this._initialized=!1,this._indexReady=!1}saveState(a){try{QH.writeFileSync(lR.join(this.stateDir,"state.json"),JSON.stringify(a,null,2))}catch(d){fRt.warn("Could not save state:",d instanceof Error?d.message:String(d))}}loadState(){try{let a=QH.readFileSync(lR.join(this.stateDir,"state.json"),"utf-8");return JSON.parse(a)}catch{return null}}};hRt();var X8t="1.
|
|
43369
|
+
`),fRt.info("Indexed",O.indexedFiles,"files in",O.duration,"ms"),this.saveState({lastScanTimestamp:new Date().toISOString(),filesIndexed:O.indexedFiles,workspaceRoot:this.workspaceRoot}),hl.warmupInfo={completed:!0,durationMs:O.duration,filesIndexed:O.indexedFiles},this._indexReady=!0,{filesIndexed:O.indexedFiles,durationMs:X}}finally{C()}}async dispose(){hl.astWorkerHost&&await hl.astWorkerHost.stop(),hl.spider&&await hl.spider.dispose(),hl.reset(),this._initialized=!1,this._indexReady=!1}saveState(a){try{QH.writeFileSync(lR.join(this.stateDir,"state.json"),JSON.stringify(a,null,2))}catch(d){fRt.warn("Could not save state:",d instanceof Error?d.message:String(d))}}loadState(){try{let a=QH.readFileSync(lR.join(this.stateDir,"state.json"),"utf-8");return JSON.parse(a)}catch{return null}}};hRt();var X8t="1.14.0",$8t={workspace:{type:"string",short:"w"},format:{type:"string",short:"f"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"}};X5.setSource("cli");var rXt=!1;function oXt(){if(!rXt){rXt=!0;try{e3t(X5.snapshot())}catch{}}}process.on("exit",()=>{oXt()});for(let p of["SIGINT","SIGTERM"])process.on(p,()=>{oXt(),process.exit(p==="SIGINT"?130:143)});var aXt=`
|
|
43370
43370
|
graph-it \u2014 Graph-It-Live standalone CLI
|
|
43371
43371
|
|
|
43372
43372
|
Usage: graph-it <command> [options]
|
package/docs/CLI.md
CHANGED
|
@@ -74,6 +74,21 @@ If you have the VS Code extension installed, you can expose the bundled binary t
|
|
|
74
74
|
graph-it install # adds graph-it to your system PATH
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
+
**Troubleshooting: `graph-it` runs but prints nothing (fixed in v1.14.0)**
|
|
78
|
+
|
|
79
|
+
Versions v1.13.6 and earlier shipped a `bin/graph-it` wrapper that silently
|
|
80
|
+
broke `npm install -g` installs — every command exited `0` with no output at
|
|
81
|
+
all. If you're stuck on an affected version, `graph-it update` can't fix
|
|
82
|
+
itself (the whole CLI is dead on arrival, including the update command).
|
|
83
|
+
Reinstall manually instead:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm install -g @magic5644/graph-it-live@latest
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Once you're on v1.14.0+, `graph-it update` works normally again for future
|
|
90
|
+
releases.
|
|
91
|
+
|
|
77
92
|
---
|
|
78
93
|
|
|
79
94
|
## Quick Start
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@magic5644/graph-it-live",
|
|
3
3
|
"displayName": "Graph-It-Live",
|
|
4
4
|
"description": "AI-first dependency graph & code intelligence for VS Code. Visualize file imports, symbol call hierarchies, and cross-file call graphs. Detect circular dependencies, dead code, and breaking changes. Built-in MCP Server with 21 tools for GitHub Copilot, Cursor, Claude, Windsurf, and Antigravity. Generate AI-friendly codemaps. TypeScript, JavaScript, C#, Go, Java, Python, Rust, Vue, Svelte, GraphQL.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.14.0",
|
|
6
6
|
"publisher": "magic5644",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "magic56"
|
|
@@ -1102,7 +1102,7 @@
|
|
|
1102
1102
|
}
|
|
1103
1103
|
},
|
|
1104
1104
|
"bin": {
|
|
1105
|
-
"graph-it": "./
|
|
1105
|
+
"graph-it": "./dist/graph-it.js"
|
|
1106
1106
|
},
|
|
1107
1107
|
"scripts": {
|
|
1108
1108
|
"vscode:prepublish": "npm run build -- --production",
|
package/bin/graph-it
DELETED