@magic5644/graph-it-live 1.13.1 → 1.13.2
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 +1 -1
- package/dist/graph-it.js +4 -4
- package/dist/mcpServer.mjs +13 -13
- package/dist/mcpWorker.js +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -54,7 +54,7 @@ The Action does not trigger itself: add a consumer workflow such as [`docs/examp
|
|
|
54
54
|
- uses: magic5644/Graph-It-Live/.github/actions/graph-it-review-gate@v1.13.0
|
|
55
55
|
with:
|
|
56
56
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
57
|
-
cli-version: 1.13.
|
|
57
|
+
cli-version: 1.13.2 # optional; omitted means npm latest
|
|
58
58
|
comment: true
|
|
59
59
|
fail-on-risk: high
|
|
60
60
|
```
|
package/dist/graph-it.js
CHANGED
|
@@ -42381,7 +42381,7 @@ END;
|
|
|
42381
42381
|
WHERE ${A} = ?`,Ee=[a];if(S&&S.length>0){let et=S.map(()=>"?").join(",");Y+=` AND e.type_relation IN (${et})`,Ee.push(...S)}Y+=` AND ${O} NOT LIKE '@@external:%'`;let Be=p.exec(Y,Ee);return Be[0]?Be[0].values.map(et=>({sourceId:et[0],targetId:et[1],relation:et[2],isCyclic:et[3]===1,sourceLine:et[4],sourceName:et[5],sourceFile:et[6],targetName:et[7],targetFile:et[8]})):[]}function IUt(p){let a=p.exec("SELECT COUNT(*) FROM file_index");return a[0]?a[0].values[0][0]:0}var ZFt,PUt,QFt,$Ve,rst=wo(()=>{"use strict";xUt();est();AUt();eTe();zC();Qv();ZFt=bl(require("node:fs/promises")),PUt=bl(require("node:path"));rw();QFt=Hh("McpCallGraph"),$Ve=null});var oPe,t6t=wo(()=>{"use strict";Qv();oPe=class{buildIntraFileGraph(a,f,S=!1){let y=$i(a),A=this.convertLspSymbolsToNodes(y,f.symbols),O=this.buildCallEdges(y,f.outgoingCalls,A),Y=S&&f.incomingCalls?this.buildIncomingCallEdges(y,f.incomingCalls,A):void 0,{hasCycle:Ee,cycleNodes:Be,cycleType:et}=this.detectCycles(A,O);return{filePath:y,nodes:A,edges:O,incomingEdges:Y,hasCycle:Ee,cycleNodes:Ee?Be:void 0,cycleType:Ee?et:void 0}}convertLspSymbolsToNodes(a,f){return f.map(S=>{let y=this.generateSymbolId(a,S.name,S.containerName),A=this.mapKindToType(S.kind),O=this.generateContextualName(S);return{id:y,name:O||S.name,originalName:O?S.name:void 0,kind:S.kind,type:A,range:S.range,isExported:this.isSymbolExported(S),isExternal:!1,parentSymbolId:S.containerName?this.generateSymbolId(a,S.containerName):void 0}})}buildCallEdges(a,f,S){let y=[],A=$i(a),O=new Set(S.map(Y=>Y.id));for(let[Y,Ee]of f.entries())for(let Be of Ee){if($i(Be.to.uri)!==A)continue;let ft=this.generateSymbolId(a,Be.to.name);if(O.has(Y)&&O.has(ft)){let he=Be.fromRanges[0]?.start??0;y.push({source:Y,target:ft,relation:"calls",direction:"outgoing",line:he})}}return y}buildIncomingCallEdges(a,f,S){let y=[],A=$i(a),O=new Set(S.map(Y=>Y.id));for(let[Y,Ee]of f.entries())for(let Be of Ee){if($i(Be.from.uri)!==A)continue;let ft=this.generateSymbolId(a,Be.from.name);if(O.has(ft)&&O.has(Y)){let he=Be.fromRanges[0]?.start??0;y.push({source:ft,target:Y,relation:"calls",direction:"incoming",line:he})}}return y}detectCycles(a,f){let S=new Map,y=new Set,A=new Set,O=new Set;for(let Be of f)S.has(Be.source)||S.set(Be.source,[]),S.get(Be.source)?.push(Be.target);let Y=Be=>{y.add(Be),A.add(Be);let et=S.get(Be)||[];for(let ft of et)if(y.has(ft)){if(A.has(ft)){for(let he of A)O.add(he);return O.add(ft),!0}}else if(Y(ft))return!0;return A.delete(Be),!1},Ee=!1;for(let Be of a)y.has(Be.id)||Y(Be.id)&&(Ee=!0);if(Ee){let Be=this.analyzeCyclePattern(Array.from(O),f);return{hasCycle:Ee,cycleNodes:Array.from(O),cycleType:Be}}return{hasCycle:Ee,cycleNodes:[]}}analyzeCyclePattern(a,f){return f.filter(y=>y.source===y.target).length>0&&a.length===1?"self-recursive":a.length===2?"mutual-recursive":"complex"}generateSymbolId(a,f,S){let y=$i(a);return S?`${y}:${S}.${f}`:`${y}:${f}`}mapKindToType(a){return a===12||a===6||a===9?"function":a===5||a===11||a===10||a===2?"class":"variable"}isSymbolExported(a){return!a.containerName}getArrayMethodCallbackName(a){if(a.includes("map"))return"map callback";if(a.includes("filter"))return"filter predicate";if(a.includes("reduce"))return"reduce callback";if(a.includes("foreach"))return"forEach callback";if(a.includes("find"))return"find predicate";if(a.includes("some")||a.includes("every"))return"predicate callback";if(a.includes("sort"))return"sort comparator"}getEventHandlerName(a){if(a.includes("onclick"))return"onClick handler";if(a.includes("onsubmit"))return"onSubmit handler";if(a.includes("onchange"))return"onChange handler";if(a.includes("onload"))return"onLoad handler";if(/on[a-z]+/.exec(a))return`${a} handler`}getPromiseCallbackName(a){if(a.includes("then"))return"then callback";if(a.includes("catch"))return"catch handler";if(a.includes("finally"))return"finally callback"}getTimerCallbackName(a){if(a.includes("settimeout"))return"setTimeout callback";if(a.includes("setinterval"))return"setInterval callback";if(a.includes("requestanimationframe"))return"animation frame callback"}getGenericCallbackName(a){if(a.includes("callback"))return"callback function";if(a.includes("handler"))return"handler function"}generateContextualName(a){let f=a.name.toLowerCase(),S=a.containerName?.toLowerCase()||"";if(!(!f.includes("anonymous")&&!f.includes("arrow")&&!f.includes("<function>")))return this.getArrayMethodCallbackName(S)||this.getEventHandlerName(S)||this.getPromiseCallbackName(S)||this.getTimerCallbackName(S)||this.getGenericCallbackName(S)}}});async function qVe(p){let{filePath:a}=p,f=ml.getSpider(),S=ml.getConfig(),y=Date.now();await JC(a);let A=NUt.extname(a).toLowerCase(),O=iot(A),Y=bT(a,S.rootDir),et=(await(await import("node:fs/promises")).readFile(a,"utf-8")).split(`
|
|
42382
42382
|
`).length,{symbols:ft,dependencies:he}=await f.getSymbolGraph(a),hn=ft.filter(ar=>ar.isExported).map(kUt),mt=ft.filter(ar=>!ar.isExported).map(kUt),xi=(await f.analyze(a)).map(ar=>({module:ar.module,resolvedPath:ar.path,relativePath:ar.path?bT(ar.path,S.rootDir):null,type:ar.type,line:ar.line})),fi=[];try{fi=(await f.findReferencingFiles(a)).map(jn=>({path:jn.path,relativePath:bT(jn.path,S.rootDir),type:jn.type,line:jn.line}))}catch{}let Vi=[],is=!1,Rs=[];try{let ar=cVe({symbols:ft,dependencies:he},a),ao=new oPe().buildIntraFileGraph(a,ar);Vi=ao.edges.map(vi=>({caller:n6t(vi.source),callee:n6t(vi.target),line:vi.line})),is=ao.hasCycle,Rs=(ao.cycleNodes??[]).map(n6t)}catch{}let us=Date.now()-y;return{filePath:a,relativePath:Y,language:O,lineCount:et,exports:hn,internals:mt,dependencies:xi,dependents:fi,callFlow:Vi,hasCycle:is,cycleSymbols:Rs,analysisTimeMs:us}}function kUt(p){return{name:p.name,kind:p.kind,line:p.line,category:p.category}}function n6t(p){let a=p.lastIndexOf(":");return a>=0?p.slice(a+1):p}var NUt,wUt=wo(()=>{"use strict";NUt=bl(require("node:path"));t6t();Iwt();KH();rw()});function Ean(p){return p.includes("Function")?"function":p.includes("Class")?"class":p.includes("Variable")||p.includes("Const")||p.includes("Let")?"variable":p.includes("Interface")?"interface":p.includes("Type")?"type":"other"}async function aPe(p){let a=ml.getSpider(),f=ml.getConfig(),{scopePath:S,maxFiles:y}=p,A=S??f.rootDir;_zt(A,f.rootDir);let O=Date.now(),Y=await a.scanDeadCode(A,{maxFiles:y}),Ee=Date.now()-O,Be=Y.entries.map(et=>{let ft=et.unusedSymbols.map(he=>({...he,category:Ean(he.kind)}));return{filePath:et.filePath,relativePath:bT(et.filePath,f.rootDir),unusedCount:ft.length,unusedSymbols:ft}});return{rootDir:f.rootDir,scopePath:A,scannedFiles:Y.scannedFiles,filesWithDeadCode:Be.length,totalUnusedSymbols:Be.reduce((et,ft)=>et+ft.unusedCount,0),entries:Be,skippedFiles:Y.skippedFiles,analysisTimeMs:Ee}}var RUt=wo(()=>{"use strict";KH();rw()});async function XVe(p){let{filePath:a,symbolName:f,maxDepth:S}=p,y=ml.getSpider(),A=ml.getConfig();await JC(a);let O=await y.traceFunctionExecution(a,f,S??10),Y=O.callChain.map(Be=>({depth:Be.depth,callerSymbolId:Be.callerSymbolId,calledSymbolId:Be.calledSymbolId,calledFilePath:Be.calledFilePath,resolvedFilePath:Be.resolvedFilePath,resolvedRelativePath:Be.resolvedFilePath?bT(Be.resolvedFilePath,A.rootDir):null})),Ee=bT(a,A.rootDir);return{rootSymbol:{id:O.rootSymbol.id,filePath:O.rootSymbol.filePath,relativePath:Ee,symbolName:O.rootSymbol.symbolName},maxDepth:S??10,callCount:O.callChain.length,uniqueSymbolCount:O.visitedSymbols.length,maxDepthReached:O.maxDepthReached,callChain:Y,visitedSymbols:O.visitedSymbols}}async function r6t(p){let{filePath:a,symbolName:f,includeTypeOnly:S=!0}=p,y=ml.getConfig(),A=`${a}:${f}`;ml.symbolReverseIndex||(ml.symbolReverseIndex=new nIe(y.rootDir),await Can());let O=S?ml.symbolReverseIndex.getCallers(A):ml.symbolReverseIndex.getRuntimeCallers(A),Y=O.map(et=>({callerSymbolId:et.callerSymbolId,callerFilePath:et.callerFilePath,callerRelativePath:bT(et.callerFilePath,y.rootDir),isTypeOnly:et.isTypeOnly})),Ee=O.filter(et=>!et.isTypeOnly),Be=O.filter(et=>et.isTypeOnly);return{symbolId:A,callerCount:O.length,runtimeCallerCount:Ee.length,typeOnlyCallerCount:Be.length,callers:Y,callerFiles:ml.symbolReverseIndex.getCallerFiles(A)}}async function Can(){let p=ml.spider;if(!p||!ml.symbolReverseIndex||p.getIndexStatus().state!=="complete")return;if(!p.hasReverseIndex()){ist.warn("File-level reverse index not enabled. Symbol reverse index will be built incrementally.");return}let S=p.getCacheStats().reverseIndexStats;if(!S||S.indexedFiles===0){ist.warn("No files in reverse index yet. Symbol reverse index will be built incrementally.");return}ist.info(`Building symbol reverse index from ${S.indexedFiles} indexed files...`),ist.info("Symbol reverse index ready (lazy loading mode)")}var ist,MUt=wo(()=>{"use strict";zNt();zC();KH();rw();ist=Hh("McpWorker")});function Dan(p){if(!p.length)return 0;let a=p.map(A=>A.split("/").slice(0,-1)),f=Math.min(...a.map(A=>A.length)),S=Math.max(0,f-1),y=0;for(;y<S&&a.every(A=>A[y]===a[0][y]);)y++;return y}function Ian(p,a){let f=a;for(let S=a;S<p.length;S++)Aan.has(p[S])&&(f=S+1);return p[f]}function OUt(p,a){if(p.length===0)return new Map;let f=p.map($i),S=a?$i(a):(()=>{let Be=f.map(he=>he.split("/")),et=Math.min(...Be.map(he=>he.length)),ft=[];for(let he=0;he<et&&Be.every(hn=>hn[he]===Be[0][he]);he++)ft.push(Be[0][he]);return ft.join("/")})(),y=f.map(Be=>S?LUt.relative(S,Be).replaceAll("\\","/"):Be),A=Dan(y),O=new Map,Y=new Map,Ee=1;for(let Be=0;Be<f.length;Be++){let et=f[Be],ft=y[Be].split("/").slice(0,-1),he=Ian(ft,A);if(!he){Y.set(et,0);continue}O.has(he)||O.set(he,Ee++),Y.set(et,O.get(he))}return Y}var LUt,Aan,FUt=wo(()=>{"use strict";LUt=bl(require("node:path"));Qv();Aan=new Set(["src","tests","test","lib","app","packages","dist","out"])});function ost(p,a){let f=p.nodes;if(f.length===0)return;let S=p.parentCounts??{},y=Math.max(...f.map(O=>S[$i(O)]??0),1),A={};for(let O of f){let Y=$i(O),Ee=S[Y]??0,Be=Math.round(Ee/y*1e3)/1e3,et=WUt.extname(O).slice(1).toLowerCase(),ft={hubScore:Be};et&&(ft.fileExtension=et),A[Y]=ft}p.nodeMetadata=A;try{let O=OUt(p.nodes,a);for(let[Y,Ee]of O){let Be=p.nodeMetadata?.[$i(Y)];Be&&(Be.communityId=Ee)}}catch(O){console.warn("[NodeMetadataBuilder] Community detection failed, skipping:",O)}}var WUt,i6t=wo(()=>{"use strict";WUt=bl(require("node:path"));Qv();FUt()});async function Pan(p){let a=ml.getSpider(),f=Hh("McpWorker");return(await Promise.all(p.map(async y=>{try{let A=await a.verifyDependencyUsage(y.source,y.target);return{edge:y,isUsed:A}}catch(A){return f.warn(`Failed to verify usage for edge ${y.source} -> ${y.target}`,A),{edge:y,isUsed:!0}}}))).filter(y=>y.isUsed).map(y=>y.edge)}async function ATe(p){let{entryFile:a,maxDepth:f,limit:S,offset:y,onlyUsed:A}=p,O=ml.getSpider(),Y=ml.getConfig();await JC(a);let Ee=O.config.maxDepth;f!==void 0&&O.updateConfig({maxDepth:f});try{let Be=await O.crawl(a);f!==void 0&&O.updateConfig({maxDepth:Ee});let{dependencyCount:et,dependentCount:ft}=Pwt(Be.edges),he=fzt(Be.edges),hn={};for(let[is,Rs]of ft)hn[$i(is)]=Rs;let mt={nodes:Be.nodes.map($i),edges:Be.edges,parentCounts:hn};ost(mt,Y.rootDir);let Et=czt(mt.nodes,et,ft,Y.rootDir,mt.nodeMetadata),xi=lzt(Be.edges,Y.rootDir);A===!0&&(xi=await Pan(xi),uzt(Et,xi));let fi=Et.length,Vi=xi.length;if(S!==void 0||y!==void 0){let is=dzt(Et,xi,S,y);Et=is.nodes,xi=is.edges}return{entryFile:a,maxDepth:f??Ee??3,nodeCount:fi,edgeCount:Vi,nodes:Et,edges:xi,circularDependencies:he}}catch(Be){throw f!==void 0&&O.updateConfig({maxDepth:Ee}),Be}}async function o6t(p){let{filePath:a,knownPaths:f,extraDepth:S}=p,y=ml.getSpider(),A=ml.getConfig();await JC(a);let O=new Set(f),Y=await y.crawlFrom(a,O,S??10);return{expandedNode:a,newNodeCount:Y.nodes.length,newEdgeCount:Y.edges.length,newNodes:Y.nodes,newEdges:Y.edges.map(Ee=>({source:Ee.source,target:Ee.target,sourceRelative:bT(Ee.source,A.rootDir),targetRelative:bT(Ee.target,A.rootDir)}))}}async function DTe(p){let{targetPath:a}=p,f=ml.getSpider(),S=ml.getConfig();await JC(a);let y=await f.findReferencingFiles(a);return{targetPath:a,referencingFileCount:y.length,referencingFiles:y.map(A=>({path:A.path,relativePath:bT(A.path,S.rootDir),type:A.type,line:A.line,module:A.module}))}}var BUt=wo(()=>{"use strict";zC();Qv();i6t();KH();rw()});var YVe,ast,zUt=wo(()=>{"use strict";YVe=bl(RNt()),ast=class{project;constructor(){this.project=new YVe.Project({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!0,compilerOptions:{target:99,module:99,strict:!0}})}extractSignatures(a,f){let S=this.getOrCreateSourceFile(a,f),y=[];for(let A of S.getFunctions()){let O=this.extractFunctionSignature(A);O&&y.push(O)}for(let A of S.getClasses()){let O=A.getName()??"Anonymous",Y=A.getConstructors()[0];Y&&y.push({name:`${O}.constructor`,kind:"constructor",isExported:A.isExported(),parameters:this.extractParameters(Y.getParameters()),returnType:O,isAsync:!1,line:Y.getStartLineNumber()});for(let Ee of A.getMethods()){let Be=Ee.getName(),et=this.getVisibility(Ee);y.push({name:`${O}.${Be}`,kind:"method",isExported:A.isExported()&&et!=="private",parameters:this.extractParameters(Ee.getParameters()),returnType:this.safeGetTypeNodeText(Ee.getReturnTypeNode(),"void"),isAsync:Ee.isAsync(),isStatic:Ee.isStatic(),visibility:et,typeParameters:Ee.getTypeParameters().map(ft=>this.safeGetText(ft)),line:Ee.getStartLineNumber()})}}for(let A of S.getVariableDeclarations()){let O=A.getInitializer();if(O?.getKind()===YVe.SyntaxKind.ArrowFunction){let Y=O.asKindOrThrow(YVe.SyntaxKind.ArrowFunction);y.push({name:A.getName(),kind:"arrow",isExported:A.getVariableStatement()?.isExported()??!1,parameters:this.extractParameters(Y.getParameters()),returnType:this.safeGetTypeNodeText(Y.getReturnTypeNode(),"unknown"),isAsync:Y.isAsync(),line:A.getStartLineNumber()})}}return y}extractInterfaceMembers(a,f){let S=this.getOrCreateSourceFile(a,f),y=new Map;for(let A of S.getInterfaces().filter(O=>O.isExported())){let O=A.getName(),Y=[];for(let Ee of A.getProperties())Y.push({name:Ee.getName(),kind:"property",type:this.safeGetTypeNodeText(Ee.getTypeNode(),"unknown"),isOptional:Ee.hasQuestionToken(),isReadonly:Ee.isReadonly()});for(let Ee of A.getMethods()){let Be=Ee.getParameters().map(ft=>`${ft.getName()}: ${this.safeGetTypeNodeText(ft.getTypeNode(),"unknown")}`).join(", "),et=this.safeGetTypeNodeText(Ee.getReturnTypeNode(),"unknown");Y.push({name:Ee.getName(),kind:"method",type:`(${Be}) => ${et}`,isOptional:Ee.hasQuestionToken(),isReadonly:!1})}y.set(O,Y)}return y}extractTypeAliases(a,f){let S=this.getOrCreateSourceFile(a,f),y=[];for(let A of S.getTypeAliases().filter(O=>O.isExported()))y.push({name:A.getName(),type:this.safeGetTypeNodeText(A.getTypeNode(),"unknown"),typeParameters:A.getTypeParameters().map(O=>this.safeGetText(O))});return y}compareSignatures(a,f){let S=[],y=[];if(this.compareParameters(a,f,S,y),a.returnType!==f.returnType&&S.push({type:"return-type-changed",symbolName:f.name,description:`Return type changed from '${a.returnType}' to '${f.returnType}'`,severity:"error",oldValue:a.returnType,newValue:f.returnType,line:f.line}),a.visibility&&f.visibility){let A={public:3,protected:2,private:1},O=A[a.visibility];A[f.visibility]<O&&S.push({type:"visibility-reduced",symbolName:f.name,description:`Visibility reduced from '${a.visibility}' to '${f.visibility}'`,severity:"error",oldValue:a.visibility,newValue:f.visibility,line:f.line})}return{symbolName:f.name,hasBreakingChanges:S.length>0,breakingChanges:S,nonBreakingChanges:y}}compareInterfaces(a,f,S){let y=[],A=[],O=new Map(f.map(Ee=>[Ee.name,Ee])),Y=new Map(S.map(Ee=>[Ee.name,Ee]));for(let[Ee,Be]of O)Y.has(Ee)||y.push({type:"member-removed",symbolName:`${a}.${Ee}`,description:`Member '${Ee}' was removed from interface '${a}'`,severity:"error",oldValue:Be.type});for(let[Ee,Be]of Y){let et=O.get(Ee);if(!et){Be.isOptional?A.push(`New optional member '${Ee}' added`):y.push({type:"member-optional-to-required",symbolName:`${a}.${Ee}`,description:`New required member '${Ee}' added to interface '${a}'`,severity:"error",newValue:Be.type});continue}et.type!==Be.type&&y.push({type:"member-type-changed",symbolName:`${a}.${Ee}`,description:`Type of member '${Ee}' changed from '${et.type}' to '${Be.type}'`,severity:"error",oldValue:et.type,newValue:Be.type}),et.isOptional&&!Be.isOptional&&y.push({type:"member-optional-to-required",symbolName:`${a}.${Ee}`,description:`Member '${Ee}' changed from optional to required`,severity:"error"})}return{symbolName:a,hasBreakingChanges:y.length>0,breakingChanges:y,nonBreakingChanges:A}}compareTypeAliases(a,f){let S=[],y=[];return a.type!==f.type&&S.push({type:"type-alias-changed",symbolName:f.name,description:`Type alias '${f.name}' changed from '${a.type}' to '${f.type}'`,severity:"warning",oldValue:a.type,newValue:f.type}),{symbolName:f.name,hasBreakingChanges:S.length>0,breakingChanges:S,nonBreakingChanges:y}}analyzeBreakingChanges(a,f,S){let y=[];return this.compareFunctions(a,f,S,y),this.compareInterfaceDefinitions(a,f,S,y),this.compareTypeAliasDefinitions(a,f,S,y),y}compareFunctions(a,f,S,y){let A=this.extractSignatures(`${a}.old`,f),O=this.extractSignatures(`${a}.new`,S),Y=new Map(A.map(Be=>[Be.name,Be])),Ee=new Map(O.map(Be=>[Be.name,Be]));for(let[Be,et]of Y){if(et.isExported===!1)continue;let ft=Ee.get(Be);if(ft){let he=this.compareSignatures(et,ft);(he.hasBreakingChanges||he.nonBreakingChanges.length>0)&&y.push(he)}else y.push(this.createRemovedResult(Be,"member-removed",`Function '${Be}' was removed`,et.line))}}compareInterfaceDefinitions(a,f,S,y){let A=this.extractInterfaceMembers(`${a}.old`,f),O=this.extractInterfaceMembers(`${a}.new`,S);for(let[Y,Ee]of A){let Be=O.get(Y);if(Be){let et=this.compareInterfaces(Y,Ee,Be);(et.hasBreakingChanges||et.nonBreakingChanges.length>0)&&y.push(et)}else y.push(this.createRemovedResult(Y,"member-removed",`Interface '${Y}' was removed`))}}compareTypeAliasDefinitions(a,f,S,y){let A=this.extractTypeAliases(`${a}.old`,f),O=this.extractTypeAliases(`${a}.new`,S),Y=new Map(A.map(Be=>[Be.name,Be])),Ee=new Map(O.map(Be=>[Be.name,Be]));for(let[Be,et]of Y){let ft=Ee.get(Be);if(ft){let he=this.compareTypeAliases(et,ft);he.hasBreakingChanges&&y.push(he)}else y.push(this.createRemovedResult(Be,"type-alias-changed",`Type alias '${Be}' was removed`))}}createRemovedResult(a,f,S,y){return{symbolName:a,hasBreakingChanges:!0,breakingChanges:[{type:f,symbolName:a,description:S,severity:"error",line:y}],nonBreakingChanges:[]}}getOrCreateSourceFile(a,f){let S=this.project.getSourceFile(a);return S&&this.project.removeSourceFile(S),this.project.createSourceFile(a,f)}extractFunctionSignature(a){let f=a.getName();return f?{name:f,kind:"function",isExported:a.isExported(),parameters:this.extractParameters(a.getParameters()),returnType:this.safeGetTypeNodeText(a.getReturnTypeNode(),"void"),isAsync:a.isAsync(),typeParameters:a.getTypeParameters().map(S=>this.safeGetText(S)),line:a.getStartLineNumber()}:null}extractParameters(a){return a.map((f,S)=>({name:f.getName(),type:this.safeGetTypeNodeText(f.getTypeNode(),"unknown"),isOptional:f.isOptional(),hasDefault:f.hasInitializer(),isRest:f.isRestParameter(),position:S}))}safeGetTypeNodeText(a,f){if(!a)return f;try{let S=a.getText?.()??"";return S.length<=200&&S||f}catch{return f}}safeGetText(a){if(!a)return"";try{return a.getText?.()??""}catch{return""}}getVisibility(a){let f=a.getScope?.();if(!f)return"public";let S=f.toString().toLowerCase();return S.includes("private")?"private":S.includes("protected")?"protected":"public"}compareParameters(a,f,S,y){let A=a.parameters,O=f.parameters,Y=new Map(A.map(Be=>[Be.name,Be])),Ee=new Map(O.map(Be=>[Be.name,Be]));this.detectRemovedParameters(A,Ee,f,S),this.detectNewAndChangedParameters(O,Y,f,S,y),this.detectPositionChanges(A,O,y)}detectRemovedParameters(a,f,S,y){for(let A of a)f.has(A.name)||y.push({type:"parameter-removed",symbolName:S.name,description:`Parameter '${A.name}' was removed`,severity:"error",oldValue:`${A.name}: ${A.type}`,line:S.line})}detectNewAndChangedParameters(a,f,S,y,A){for(let O of a){let Y=f.get(O.name);if(!Y){this.handleNewParameter(O,S,y,A);continue}this.handleChangedParameter(Y,O,S,y)}}handleNewParameter(a,f,S,y){a.isOptional||a.hasDefault?y.push(`New optional parameter '${a.name}' added`):S.push({type:"parameter-added-required",symbolName:f.name,description:`New required parameter '${a.name}' added`,severity:"error",newValue:`${a.name}: ${a.type}`,line:f.line})}handleChangedParameter(a,f,S,y){a.type!==f.type&&y.push({type:"parameter-type-changed",symbolName:S.name,description:`Type of parameter '${f.name}' changed from '${a.type}' to '${f.type}'`,severity:"error",oldValue:a.type,newValue:f.type,line:S.line});let A=a.isOptional||a.hasDefault,O=!f.isOptional&&!f.hasDefault;A&&O&&y.push({type:"parameter-optional-to-required",symbolName:S.name,description:`Parameter '${f.name}' changed from optional to required`,severity:"error",line:S.line})}detectPositionChanges(a,f,S){let y=Math.min(a.length,f.length);for(let A=0;A<y;A++)a[A].name!==f[A].name&&S.push(`Parameter order changed at position ${A}: '${a[A].name}' \u2192 '${f[A].name}'`)}}});function GUt(p){return p>=80?"critical":p>=50?"high":p>=20?"medium":"low"}function HUt(p){let a=S=>S.replaceAll(/[\r\n|<>]/g," ").replaceAll("`","'").trim(),f=p.symbols.slice(0,20).map(S=>`| ${a(S.risk)} | ${S.score} | ${a(S.filePath)} | ${a(S.name)} | ${S.impactedSymbolCount} |`);return["<!-- graph-it-review-gate -->",`## Graph-It Review Gate: ${p.risk.toUpperCase()} (${p.score}/100)`,"",`Changed files: ${p.changedFiles.length}. ${p.isPartial?"Partial analysis; see limitations.":"Complete within configured limits."}`,"","| Risk | Score | File | Symbol | Dependents |","| --- | ---: | --- | --- | ---: |",...f.length>0?f:["| low | 0 | \u2014 | No breaking signatures detected | 0 |"],...p.limitations.length>0?["","### Limitations",...p.limitations.map(S=>`- ${a(S)}`)]:[]].join(`
|
|
42383
42383
|
`)}var VUt,sst,EO,UUt,jUt,kan,Nan,wan,Ran,Man,QVe,a6t=wo(()=>{"use strict";VUt=require("node:child_process"),sst=bl(require("node:fs/promises")),EO=bl(require("node:path")),UUt=require("node:util");Qv();est();zUt();jUt=(0,UUt.promisify)(VUt.execFile),kan=200,Nan=3,wan=1e3,Ran=10,Man=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),QVe=class{constructor(a,f){this.workspaceRoot=a;this.dependents=f;this.normalizedRoot=$i(EO.resolve(a))}workspaceRoot;dependents;normalizedRoot;signatures=new ast;async analyze(a){let f=this.validateLimit(a.maxFiles,kan,wan,"maxFiles"),S=this.validateLimit(a.maxDepth,Nan,Ran,"maxDepth"),y=a.headRef??"HEAD",A=await this.getChangedFiles(a.baseRef,y,f),O=[],Y=[],Ee={cycle:!1,unused:!1};A.length===f&&Y.push(`Analysis limited to ${f} changed files.`);for(let et of A)O.push(...await this.analyzeChangedFile(et,a.baseRef,y,S,Y,Ee));O.sort((et,ft)=>ft.score-et.score||et.filePath.localeCompare(ft.filePath)||et.name.localeCompare(ft.name));let Be=O.reduce((et,ft)=>Math.max(et,ft.score),0);return{baseRef:a.baseRef,headRef:y,changedFiles:A,symbols:O,score:Be,risk:GUt(Be),isPartial:Y.length>0,limitations:Y}}validateLimit(a,f,S,y){let A=a??f;if(!Number.isInteger(A)||A<1||A>S)throw new Error(`${y} must be an integer between 1 and ${S}`);return A}async analyzeChangedFile(a,f,S,y,A,O){if(!Man.has(EO.extname(a).toLowerCase()))return A.push(`Signature and symbol evidence unavailable for unsupported file type: ${a}.`),[];let Y=this.resolveWorkspacePath(a),[Ee,Be]=await Promise.all([this.gitShow(f,a),this.readHeadContent(S,Y,a)]);if(Ee===null||Be===null)return A.push(`Could not compare ${a}; file was added, deleted, or unreadable.`),[];let et=await this.collectFileEvidence(Y,a,A,O),ft=this.analyzeSignatures(Y,a,Ee,Be,A);return Promise.all(ft.map(he=>this.createReviewSymbol(he,Y,a,y,et)))}analyzeSignatures(a,f,S,y,A){try{return this.signatures.analyzeBreakingChanges(a,S,y)}catch(O){let Y=O instanceof Error?O.message:"unknown parser error";return A.push(`Signature evidence unavailable for ${f}: ${Y}.`),[]}}async createReviewSymbol(a,f,S,y,A){let O=a.breakingChanges.length>0?await this.getImpact(f,a.symbolName,y):{count:0,partial:!1},Y=A.cycleSymbols.has(this.toSymbolId(f,a.symbolName)),Ee=A.unusedSymbols.has(a.symbolName),Be=this.getScoreFactors(a.breakingChanges.length,O,Y,Ee,A.testCandidates.length),et=Math.min(100,Object.values(Be).reduce((ft,he)=>ft+he,0));return{name:a.symbolName,filePath:S,score:et,risk:GUt(et),breakingChanges:a.breakingChanges,impactedSymbolCount:O.count,cycleEvidence:Y?[a.symbolName]:[],unusedExportEvidence:Ee,testCandidates:A.testCandidates,scoreFactors:Be,evidence:this.getEvidence(a.breakingChanges,O,Y,Ee,A.testCandidates)}}getScoreFactors(a,f,S,y,A){return{breakingChanges:a*50,dependents:f.count*5,cycles:S?20:0,unusedExport:y?10:0,missingTestCandidate:A===0?10:0,partialImpact:f.partial?10:0}}getEvidence(a,f,S,y,A){let O=a.map(Y=>({kind:"breaking-change",detail:Y.description}));return f.count>0&&O.push({kind:"impact",detail:`${f.count} known dependent symbol(s).`}),S&&O.push({kind:"cycle",detail:"Changed symbol participates in a detected symbol dependency cycle."}),y&&O.push({kind:"unused-export",detail:"Changed exported symbol is currently reported as unused."}),O.push(A.length>0?{kind:"test-candidate",detail:`Conventional test candidate(s): ${A.join(", ")}.`}:{kind:"test-candidate",detail:"No conventional test candidate found; manual test selection is required."}),f.partial&&O.push({kind:"partial",detail:"Impact traversal reached its configured depth limit."}),O}async getChangedFiles(a,f,S){let y=f==="HEAD"?a:`${a}...${f}`,{stdout:A}=await jUt("git",["diff","--name-only","--diff-filter=ACMR",y],{cwd:this.workspaceRoot,maxBuffer:1024*1024});return A.split(`
|
|
42384
|
-
`).filter(Boolean).slice(0,S).map(O=>$i(O)).sort()}resolveWorkspacePath(a){let f=$i(EO.resolve(this.workspaceRoot,a));if(f!==this.normalizedRoot&&!f.startsWith(`${this.normalizedRoot}/`))throw new Error(`Changed path resolves outside workspace: ${a}`);return f}async gitShow(a,f){try{let{stdout:S}=await jUt("git",["show",`${a}:${f}`],{cwd:this.workspaceRoot,maxBuffer:2097152});return S}catch{return null}}async readHeadContent(a,f,S){if(a==="HEAD")try{return await sst.readFile(f,"utf8")}catch{return null}return this.gitShow(a,S)}async getImpact(a,f,S){if(!this.dependents)return{count:0,partial:!1};let y=new Set,A=[{filePath:a,symbolName:f}];for(let O=0;O<S&&A.length>0;O+=1)A=await this.collectDependentFrontier(A,y);return{count:y.size,partial:A.length>0}}async collectDependentFrontier(a,f){let S=[];for(let y of a){let A=await this.dependents.getSymbolDependents(y.filePath,y.symbolName);for(let O of A){let Y=this.parseDependent(O.sourceSymbolId,f);Y&&S.push(Y)}}return S}parseDependent(a,f){let S=a.lastIndexOf(":");if(S<=0)return null;let y=$i(a.slice(0,S)),A=a.slice(S+1),O=`${y}:${A}`;return f.has(O)?null:(f.add(O),{filePath:y,symbolName:A})}async collectFileEvidence(a,f,S,y){let A=await this.findTestCandidates(f),O=await this.collectCycleEvidence(a,f,S,y),Y=await this.collectUnusedEvidence(a,f,S,y);return{cycleSymbols:O,unusedSymbols:Y,testCandidates:A}}async collectCycleEvidence(a,f,S,y){let A=new Set;if(!this.dependents?.getSymbolGraph)return y.cycle||S.push("Cycle evidence unavailable: symbol graph provider is not configured."),A;try{let O=await this.dependents.getSymbolGraph(a),Y=EUt(O.dependencies.map(Ee=>({source:Ee.sourceSymbolId,target:Ee.targetSymbolId})));for(let Ee of Y)A.add(this.normalizeSymbolId(Ee));y.cycle=!0}catch{S.push(`Cycle evidence unavailable for ${f}.`)}return A}async collectUnusedEvidence(a,f,S,y){let A=new Set;if(!this.dependents?.findUnusedSymbols)return y.unused||S.push("Unused-export evidence unavailable: unused-symbol provider is not configured."),A;try{for(let O of await this.dependents.findUnusedSymbols(a))A.add(O.name);y.unused=!0}catch{S.push(`Unused-export evidence unavailable for ${f}.`)}return A}async findTestCandidates(a){let f=EO.extname(a),S=a.slice(0,-f.length),y=EO.basename(S),A=[`${S}.test${f}`,`${S}.spec${f}`,EO.join("tests",`${a}.test${f}`),EO.join("tests",EO.dirname(a),`${y}.test${f}`),EO.join("tests",EO.dirname(a),`${y}.spec${f}`)].map($i),O=[];for(let Y of[...new Set(A)].sort((Ee,Be)=>Ee.localeCompare(Be)))try{await sst.access(this.resolveWorkspacePath(Y)),O.push(Y)}catch{}return O}toSymbolId(a,f){return`${$i(a)}:${f}`}normalizeSymbolId(a){let f=a.lastIndexOf(":");return f>0?this.toSymbolId(a.slice(0,f),a.slice(f+1)):a}}});function KUt(p){return{getSymbolDependents:(a,f)=>p.getSymbolDependents(a,f),getSymbolGraph:a=>p.getSymbolGraph(a),findUnusedSymbols:a=>p.findUnusedSymbols(a)}}async function s6t(p){let{filePath:a,symbolName:f,oldContent:S}=p,y=p.newContent;if(!y)try{y=await JUt.readFile(a,"utf-8")}catch{throw new Error(`Cannot read current file: ${a}`)}let A=ml.getAstWorkerHost(),O;try{O=await A.analyzeBreakingChanges(a,S,y)}catch(hn){let mt=hn instanceof Error?hn.message:"Unknown error";throw new Error(`Failed to analyze breaking changes: ${mt}`,{cause:hn})}f&&(O=O.filter(hn=>hn.symbolName===f));let Y=[],Ee=[],Be=[],et=[];for(let hn of O){for(let mt of hn.breakingChanges)Y.push({type:mt.type,symbolName:mt.symbolName,description:mt.description,severity:mt.severity,oldValue:mt.oldValue,newValue:mt.newValue,line:mt.line}),mt.type==="member-removed"&&Be.push(mt.symbolName);Ee.push(...hn.nonBreakingChanges)}let ft=Y.filter(hn=>hn.severity==="error").length,he=Y.filter(hn=>hn.severity==="warning").length;return{filePath:a,breakingChangeCount:Y.length,errorCount:ft,warningCount:he,breakingChanges:Y,nonBreakingChanges:Ee,removedSymbols:Be,addedSymbols:et}}function $Ut(p,a,f){return{symbolId:p.sourceSymbolId,filePath:p.targetFilePath,relativePath:bT(p.targetFilePath,f),usageType:p.isTypeOnly?"type-only":"runtime",depth:a}}function Lan(p,a){return p>=10||a>=20?"high":p>=3||a>=5?"medium":"low"}function Oan(p){return{directCount:p.filter(a=>a.depth===1).length,transitiveCount:p.filter(a=>a.depth>1).length,runtimeCount:p.filter(a=>a.usageType==="runtime").length,typeOnlyCount:p.filter(a=>a.usageType==="type-only").length}}function Fan(p){let a=p.split(":");if(a.length<2)return null;let f=a.at(-1);return f?{filePath:a.slice(0,-1).join(":"),symbolName:f}:null}function Wan(p,a,f){f.visitedSymbols.has(p.sourceSymbolId)||(f.impactedItems.push($Ut(p,a,f.rootDir)),f.visitedSymbols.add(p.sourceSymbolId),f.affectedFilesSet.add(p.targetFilePath),a<f.maxDepth&&f.queue.push({symbolId:p.sourceSymbolId,depth:a+1}))}async function Ban(p,a,f,S,y,A){let O=ml.getSpider(),Y=p.map(Be=>({symbolId:Be.sourceSymbolId,depth:2})),Ee={maxDepth:a,rootDir:f,visitedSymbols:S,affectedFilesSet:y,impactedItems:A,queue:Y};for(;Ee.queue.length>0;){let Be=Ee.queue.shift();if(Be.depth>a)continue;let et=Fan(Be.symbolId);if(et)try{let ft=await O.getSymbolDependents(et.filePath,et.symbolName);for(let he of ft)Wan(he,Be.depth,Ee)}catch{}}}function zan(p,a,f,S,y,A){if(a===0)return`Symbol '${p}' has no known dependents. Changes should be safe.`;let O;A==="high"?O="\u{1F534}":A==="medium"?O="\u{1F7E1}":O="\u{1F7E2}";let Y=`${O} Impact Level: ${A.toUpperCase()}
|
|
42384
|
+
`).filter(Boolean).slice(0,S).map(O=>$i(O)).sort((O,Y)=>O.localeCompare(Y))}resolveWorkspacePath(a){let f=$i(EO.resolve(this.workspaceRoot,a));if(f!==this.normalizedRoot&&!f.startsWith(`${this.normalizedRoot}/`))throw new Error(`Changed path resolves outside workspace: ${a}`);return f}async gitShow(a,f){try{let{stdout:S}=await jUt("git",["show",`${a}:${f}`],{cwd:this.workspaceRoot,maxBuffer:2097152});return S}catch{return null}}async readHeadContent(a,f,S){if(a==="HEAD")try{return await sst.readFile(f,"utf8")}catch{return null}return this.gitShow(a,S)}async getImpact(a,f,S){if(!this.dependents)return{count:0,partial:!1};let y=new Set,A=[{filePath:a,symbolName:f}];for(let O=0;O<S&&A.length>0;O+=1)A=await this.collectDependentFrontier(A,y);return{count:y.size,partial:A.length>0}}async collectDependentFrontier(a,f){let S=[];for(let y of a){let A=await this.dependents.getSymbolDependents(y.filePath,y.symbolName);for(let O of A){let Y=this.parseDependent(O.sourceSymbolId,f);Y&&S.push(Y)}}return S}parseDependent(a,f){let S=a.lastIndexOf(":");if(S<=0)return null;let y=$i(a.slice(0,S)),A=a.slice(S+1),O=`${y}:${A}`;return f.has(O)?null:(f.add(O),{filePath:y,symbolName:A})}async collectFileEvidence(a,f,S,y){let A=await this.findTestCandidates(f),O=await this.collectCycleEvidence(a,f,S,y),Y=await this.collectUnusedEvidence(a,f,S,y);return{cycleSymbols:O,unusedSymbols:Y,testCandidates:A}}async collectCycleEvidence(a,f,S,y){let A=new Set;if(!this.dependents?.getSymbolGraph)return y.cycle||S.push("Cycle evidence unavailable: symbol graph provider is not configured."),A;try{let O=await this.dependents.getSymbolGraph(a),Y=EUt(O.dependencies.map(Ee=>({source:Ee.sourceSymbolId,target:Ee.targetSymbolId})));for(let Ee of Y)A.add(this.normalizeSymbolId(Ee));y.cycle=!0}catch{S.push(`Cycle evidence unavailable for ${f}.`)}return A}async collectUnusedEvidence(a,f,S,y){let A=new Set;if(!this.dependents?.findUnusedSymbols)return y.unused||S.push("Unused-export evidence unavailable: unused-symbol provider is not configured."),A;try{for(let O of await this.dependents.findUnusedSymbols(a))A.add(O.name);y.unused=!0}catch{S.push(`Unused-export evidence unavailable for ${f}.`)}return A}async findTestCandidates(a){let f=EO.extname(a),S=a.slice(0,-f.length),y=EO.basename(S),A=[`${S}.test${f}`,`${S}.spec${f}`,EO.join("tests",`${a}.test${f}`),EO.join("tests",EO.dirname(a),`${y}.test${f}`),EO.join("tests",EO.dirname(a),`${y}.spec${f}`)].map($i),O=[];for(let Y of[...new Set(A)].sort((Ee,Be)=>Ee.localeCompare(Be)))try{await sst.access(this.resolveWorkspacePath(Y)),O.push(Y)}catch{}return O}toSymbolId(a,f){return`${$i(a)}:${f}`}normalizeSymbolId(a){let f=a.lastIndexOf(":");return f>0?this.toSymbolId(a.slice(0,f),a.slice(f+1)):a}}});function KUt(p){return{getSymbolDependents:(a,f)=>p.getSymbolDependents(a,f),getSymbolGraph:a=>p.getSymbolGraph(a),findUnusedSymbols:a=>p.findUnusedSymbols(a)}}async function s6t(p){let{filePath:a,symbolName:f,oldContent:S}=p,y=p.newContent;if(!y)try{y=await JUt.readFile(a,"utf-8")}catch{throw new Error(`Cannot read current file: ${a}`)}let A=ml.getAstWorkerHost(),O;try{O=await A.analyzeBreakingChanges(a,S,y)}catch(hn){let mt=hn instanceof Error?hn.message:"Unknown error";throw new Error(`Failed to analyze breaking changes: ${mt}`,{cause:hn})}f&&(O=O.filter(hn=>hn.symbolName===f));let Y=[],Ee=[],Be=[],et=[];for(let hn of O){for(let mt of hn.breakingChanges)Y.push({type:mt.type,symbolName:mt.symbolName,description:mt.description,severity:mt.severity,oldValue:mt.oldValue,newValue:mt.newValue,line:mt.line}),mt.type==="member-removed"&&Be.push(mt.symbolName);Ee.push(...hn.nonBreakingChanges)}let ft=Y.filter(hn=>hn.severity==="error").length,he=Y.filter(hn=>hn.severity==="warning").length;return{filePath:a,breakingChangeCount:Y.length,errorCount:ft,warningCount:he,breakingChanges:Y,nonBreakingChanges:Ee,removedSymbols:Be,addedSymbols:et}}function $Ut(p,a,f){return{symbolId:p.sourceSymbolId,filePath:p.targetFilePath,relativePath:bT(p.targetFilePath,f),usageType:p.isTypeOnly?"type-only":"runtime",depth:a}}function Lan(p,a){return p>=10||a>=20?"high":p>=3||a>=5?"medium":"low"}function Oan(p){return{directCount:p.filter(a=>a.depth===1).length,transitiveCount:p.filter(a=>a.depth>1).length,runtimeCount:p.filter(a=>a.usageType==="runtime").length,typeOnlyCount:p.filter(a=>a.usageType==="type-only").length}}function Fan(p){let a=p.split(":");if(a.length<2)return null;let f=a.at(-1);return f?{filePath:a.slice(0,-1).join(":"),symbolName:f}:null}function Wan(p,a,f){f.visitedSymbols.has(p.sourceSymbolId)||(f.impactedItems.push($Ut(p,a,f.rootDir)),f.visitedSymbols.add(p.sourceSymbolId),f.affectedFilesSet.add(p.targetFilePath),a<f.maxDepth&&f.queue.push({symbolId:p.sourceSymbolId,depth:a+1}))}async function Ban(p,a,f,S,y,A){let O=ml.getSpider(),Y=p.map(Be=>({symbolId:Be.sourceSymbolId,depth:2})),Ee={maxDepth:a,rootDir:f,visitedSymbols:S,affectedFilesSet:y,impactedItems:A,queue:Y};for(;Ee.queue.length>0;){let Be=Ee.queue.shift();if(Be.depth>a)continue;let et=Fan(Be.symbolId);if(et)try{let ft=await O.getSymbolDependents(et.filePath,et.symbolName);for(let he of ft)Wan(he,Be.depth,Ee)}catch{}}}function zan(p,a,f,S,y,A){if(a===0)return`Symbol '${p}' has no known dependents. Changes should be safe.`;let O;A==="high"?O="\u{1F534}":A==="medium"?O="\u{1F7E1}":O="\u{1F7E2}";let Y=`${O} Impact Level: ${A.toUpperCase()}
|
|
42385
42385
|
|
|
42386
42386
|
`;return Y+=`Modifying '${p}' will affect:
|
|
42387
42387
|
`,Y+=`- ${a} symbol(s) across ${y} file(s)
|
|
@@ -43001,7 +43001,7 @@ ${ow}tip:${XT} Type ${F6t}/${XT} for follow-up actions.${Ee}`,S)}catch(et){if(et
|
|
|
43001
43001
|
`)}else{let{run:O}=await Promise.resolve().then(()=>(NTe(),kTe)),Y=await CO("explain",[p],a,f.preferredFormat,O);f.lastFile=p,f.lastSymbol=void 0,f.lastResult=Y.rawData??Y.output;let Ee=Y.output??"";process.stdout.write(Ee.endsWith(`
|
|
43002
43002
|
`)?Ee:`${Ee}
|
|
43003
43003
|
`)}}catch(O){O instanceof Z5||process.stderr.write(`Error: ${pPe(O)}
|
|
43004
|
-
`)}}var mv,Wae,GHt,fPe,ow,F6t,XT,Lst,Qsn,Zsn,ecn,W6t,tcn,VHt,qHt=wo(()=>{"use strict";mv=bl(require("node:path")),Wae=require("node:fs");SIe();eTe();fO();Qv();zC();JH();VBt();HBt();vwt();KBt();bwt();rzt();GHt="1.13.
|
|
43004
|
+
`)}}var mv,Wae,GHt,fPe,ow,F6t,XT,Lst,Qsn,Zsn,ecn,W6t,tcn,VHt,qHt=wo(()=>{"use strict";mv=bl(require("node:path")),Wae=require("node:fs");SIe();eTe();fO();Qv();zC();JH();VBt();HBt();vwt();KBt();bwt();rzt();GHt="1.13.2",fPe=!process.env.NO_COLOR&&process.stdout.isTTY,ow=fPe?"\x1B[2m":"",F6t=fPe?"\x1B[1m":"",XT=fPe?"\x1B[0m":"",Lst=fPe?"\x1B[38;5;33m":"",Qsn=fPe?"\x1B[38;5;214m":"",Zsn=fPe?"\x1B[38;5;117m":"",ecn=`Interactive mode unavailable (no TTY).
|
|
43005
43005
|
Use direct commands: graph-it --help
|
|
43006
43006
|
`,W6t={uiMode:"legacy"},tcn={uiMode:"ink"},VHt={architecture:()=>Promise.resolve().then(()=>(oUe(),iUe)),summary:()=>Promise.resolve().then(()=>(mst(),_st)),check:()=>Promise.resolve().then(()=>(yst(),gst)),path:()=>Promise.resolve().then(()=>(bst(),vst)),pathIn:()=>Promise.resolve().then(()=>(Tst(),Sst)),checkDependencies:()=>Promise.resolve().then(()=>(sUe(),aUe)),cycles:()=>Promise.resolve().then(()=>(Est(),xst)),trace:()=>Promise.resolve().then(()=>(uPe(),lPe)),explain:()=>Promise.resolve().then(()=>(NTe(),kTe)),scan:()=>Promise.resolve().then(()=>(P6t(),I6t)),query:()=>Promise.resolve().then(()=>(Ist(),Dst)),wiki:()=>Promise.resolve().then(()=>(wst(),Nst))}});var XHt={};bb(XHt,{getCommandHelp:()=>jcn});function jcn(p){return Bcn[p]??`Unknown command "${p}".
|
|
43007
43007
|
|
|
@@ -43238,7 +43238,7 @@ Run "npm run build:cli" first.`,Wp.GENERAL_ERROR);let A=zst.platform(),O=await X
|
|
|
43238
43238
|
Add ${f} to your PATH if needed.`}function Zcn(p,a){let f=Bae.dirname(a);aw.mkdirSync(f,{recursive:!0});let S=`@echo off
|
|
43239
43239
|
node "${p}" %*
|
|
43240
43240
|
`,y=a.endsWith(".cmd")?a:a+".cmd";return aw.writeFileSync(y,S,"utf-8"),`\u2713 graph-it installed to ${y}
|
|
43241
|
-
Ensure ${f} is in your PATH.`}var aw,Bae,zst,sJt,lJt=wo(()=>{"use strict";aw=bl(require("node:fs")),Bae=bl(require("node:path")),zst=bl(require("node:os")),sJt=bl(require("node:readline"));cR()});var dJt={};bb(dJt,{run:()=>tln});function eln(p){let a=["install","--global",`${uJt}@${p}`];try{(0,G6t.execFileSync)("npm",a,{stdio:"inherit"});return}catch(f){if(!(f?.code==="ENOENT"||f instanceof Error&&f.message.includes("spawnSync npm ENOENT")))throw f}(0,G6t.execFileSync)("npm.cmd",a,{stdio:"inherit"})}async function tln(p,a,f){let S="1.13.
|
|
43241
|
+
Ensure ${f} is in your PATH.`}var aw,Bae,zst,sJt,lJt=wo(()=>{"use strict";aw=bl(require("node:fs")),Bae=bl(require("node:path")),zst=bl(require("node:os")),sJt=bl(require("node:readline"));cR()});var dJt={};bb(dJt,{run:()=>tln});function eln(p){let a=["install","--global",`${uJt}@${p}`];try{(0,G6t.execFileSync)("npm",a,{stdio:"inherit"});return}catch(f){if(!(f?.code==="ENOENT"||f instanceof Error&&f.message.includes("spawnSync npm ENOENT")))throw f}(0,G6t.execFileSync)("npm.cmd",a,{stdio:"inherit"})}async function tln(p,a,f){let S="1.13.2";process.stdout.write(`Current version : v${S}
|
|
43242
43242
|
`),process.stdout.write(`Checking npm registry for ${uJt}\u2026
|
|
43243
43243
|
`);let y;try{y=await JNt(1e4)}catch(A){let O=A instanceof Error?A.message:String(A);throw new jm(O,Wp.GENERAL_ERROR)}if(y===S)return`\u2713 Already up to date (v${S})`;process.stdout.write(`Latest version : v${y}
|
|
43244
43244
|
Installing update\u2026
|
|
@@ -43246,7 +43246,7 @@ Installing update\u2026
|
|
|
43246
43246
|
`)}async function aln(p,a,f){let S=nln(p),y=J5.snapshot(),A=fPt(S);return f==="json"?JSON.stringify({description:_Jt,estimationNote:V6t,llmUsageNote:mJt,currentSession:y,history:{persistedSessions:A.length,bySource:gJt(A),byTool:yJt(A)}},null,2):oln(y,A)}var _Jt,V6t,mJt,bJt=wo(()=>{"use strict";PQe();wSe();_Jt="TOON encoding size vs JSON equivalent",V6t="estimated (chars/4 heuristic)",mJt="llmUsage: real provider-reported tokens \u2014 reported separately, never summed into the estimated totals above."});var U6t=bl(require("node:path")),TJt=require("node:util");PQe();wSe();cR();fO();var HH=bl(require("node:fs")),lR=bl(require("node:path"));var d4t=bl(require("node:fs")),TDe=bl(require("node:path")),f4t=require("node:worker_threads");zC();var Qte=Hh("AstWorkerHost"),aae=class{worker=null;nextId=1;pendingRequests=new Map;workerPath;extensionPath;isStopping=!1;constructor(a,f){if(this.extensionPath=f,a)this.workerPath=a;else{let S=[TDe.join(__dirname,"astWorker.js"),TDe.join(__dirname,"../../../dist/astWorker.js"),TDe.join(__dirname,"../../../../dist/astWorker.js"),TDe.join(process.cwd(),"dist/astWorker.js")],y="";for(let A of S)if(d4t.existsSync(A)){y=A;break}this.workerPath=y||TDe.join(process.cwd(),"dist/astWorker.js")}}async start(){if(this.worker){Qte.warn("AstWorker already started");return}Qte.info(`Starting AstWorker from ${this.workerPath}`);try{this.worker=new f4t.Worker(this.workerPath,{workerData:{extensionPath:this.extensionPath}}),this.worker.on("message",a=>{this.handleResponse(a)}),this.worker.on("error",a=>{Qte.error("AstWorker error:",a);for(let[f,S]of this.pendingRequests)S.reject(new Error(`AstWorker crashed: ${a.message}`)),this.pendingRequests.delete(f)}),this.worker.on("exit",a=>{a!==0&&!this.isStopping&&Qte.error(`AstWorker exited with code ${a}`),this.worker=null,this.isStopping=!1}),Qte.info("AstWorker started successfully")}catch(a){let f=a instanceof Error?a.message:String(a);throw Qte.error(`Failed to start AstWorker: ${f}`),new Error(`Failed to start AstWorker: ${f}`,{cause:a})}}async stop(){if(this.worker){Qte.info("Stopping AstWorker");for(let[a,f]of this.pendingRequests)f.reject(new Error("AstWorker stopped")),this.pendingRequests.delete(a);this.isStopping=!0,await this.worker.terminate(),this.worker=null,Qte.info("AstWorker stopped")}}async analyzeFile(a,f){return await this.sendRequest({type:"analyzeFile",id:0,filePath:a,content:f})}async getInternalExportDependencyGraph(a,f){let y=await this.sendRequest({type:"getInternalExportDeps",id:0,filePath:a,content:f});return new Map(Object.entries(y).map(([A,O])=>[A,new Set(O)]))}async extractSignatures(a,f){return await this.sendRequest({type:"extractSignatures",id:0,filePath:a,content:f})}async extractInterfaceMembers(a,f){let y=await this.sendRequest({type:"extractInterfaceMembers",id:0,filePath:a,content:f});return new Map(Object.entries(y))}async extractTypeAliases(a,f){return await this.sendRequest({type:"extractTypeAliases",id:0,filePath:a,content:f})}async compareSignatures(a,f){return await this.sendRequest({type:"compareSignatures",id:0,oldSig:a,newSig:f})}async analyzeBreakingChanges(a,f,S){return await this.sendRequest({type:"analyzeBreakingChanges",id:0,filePath:a,oldContent:f,newContent:S})}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 f=this.nextId++,S={...a,id:f};return new Promise((y,A)=>{this.pendingRequests.set(f,{resolve:y,reject:A}),this.worker?.postMessage(S)})}handleResponse(a){let f=this.pendingRequests.get(a.id);if(!f){Qte.warn(`Received response for unknown request ${a.id}`);return}if(this.pendingRequests.delete(a.id),a.type==="success")f.resolve(a.result);else{let S=new Error(a.error);a.stack&&(S.stack=a.stack),f.reject(S)}}};var MSe=bl(require("node:fs/promises")),OQe=bl(require("node:fs"));jC();zC();var lKt=Hh("FileReader"),uKt=5*1024*1024,dKt=64*1024,fKt=3e4,Lx=class{maxSize;chunkSize;timeout;constructor(a={}){this.maxSize=a.maxSize??uKt,this.chunkSize=a.chunkSize??dKt,this.timeout=a.timeout??fKt}async getFileSize(a){try{let f=await MSe.stat(a);return{size:f.size,isLarge:f.size>this.maxSize,path:a}}catch(f){throw pg.fromError(f,a)}}async readFile(a,f){let S=f?.maxSize??this.maxSize,y=f?.timeout??this.timeout,A=f?.streaming??!1,O;try{O=await MSe.stat(a)}catch(Be){throw pg.fromError(Be,a)}if(O.size>S)throw new pg(`File too large: ${a} (${this.formatSize(O.size)} > ${this.formatSize(S)})`,"FILE_TOO_LARGE",{filePath:a});let Y,Ee=new Promise((Be,et)=>{Y=setTimeout(()=>{et(new pg(`File read timed out after ${y}ms: ${a}`,"TIMEOUT",{filePath:a}))},y)});try{let Be;return A||O.size>1024*1024?(lKt.debug(`Streaming read for large file: ${a} (${this.formatSize(O.size)})`),Be=await Promise.race([this.readFileStreaming(a),Ee])):Be=await Promise.race([MSe.readFile(a,"utf-8"),Ee]),clearTimeout(Y),Be}catch(Be){throw clearTimeout(Y),Be instanceof pg?Be:pg.fromError(Be,a)}}async readFileStreaming(a){return new Promise((f,S)=>{let y=[],A=OQe.createReadStream(a,{highWaterMark:this.chunkSize});A.on("data",O=>{y.push(Buffer.isBuffer(O)?O:Buffer.from(O))}),A.on("end",()=>{let O=Buffer.concat(y).toString("utf-8");f(O)}),A.on("error",O=>{S(pg.fromError(O,a))})})}async readFileIfExists(a){try{return await this.readFile(a)}catch(f){if(f instanceof pg&&f.code==="FILE_NOT_FOUND")return null;throw f}}async canRead(a){try{return await MSe.access(a,OQe.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`}};zC();function GC(p){let f=/^(.+\.(ts|tsx|js|jsx|mjs|cjs|py|pyi|rs|vue|svelte|gql|graphql)):(.+)$/i.exec(p);if(!f)return p;let S=f[1];return f[3]?(S.length>1&&S[1]===":"&&/^[a-zA-Z]:/.test(S),Hh("PathExtractor").warn(`Symbol ID detected where file path expected: ${p}. Extracting file path: ${S}`),S):p}var sae=bl(require("node:fs/promises")),Vp=bl(require("node:path"));EDe();jC();var PH=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,f=!0,S){this.excludeNodeModules=f,this.tsConfigPath=a,this.workspaceRoot=S??(a?Vp.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 f=await sae.readFile(a,"utf-8"),S=JSON.parse(f),y=S?.compilerOptions?.paths,A=S?.compilerOptions?.baseUrl||".";if(y)for(let[O,Y]of Object.entries(y)){let Ee=O.replace(/\/\*$/,""),Be=Y[0]?.replace(/\/\*$/,"");if(Be){let et=Vp.dirname(a),ft=Vp.resolve(et,A,Be);this.pathAliases.set(Ee,$i(ft))}}}catch{}}async tryTsConfigAliases(a,f){let S=this.resolveAlias(f);if(S)return this.resolveWithExtensions(S);let y=await this.resolveDynamicTsConfigAlias(a,f);return y?this.resolveWithExtensions(y):null}async tryPythonImports(a,f){if(!this.isPythonFile(a))return null;if(this.isPythonRelativeImport(f)){let S=await this.resolvePythonRelativeImport(a,f);if(S)return S}if(f.includes(".")&&!f.includes("/")){let S=await this.resolvePythonModule(a,f);if(S)return S}return null}async trySpecialModulePatterns(a,f){if(this.isSubpathImport(f))return this.resolveSubpathImport(a,f);let S=await this.resolveRustModule(a,f);return S||(this.isPackageJsonAliasCandidate(f)?this.resolveScopedPackage(a,f):null)}async tryRelativePath(a,f){if(!this.isRelativePath(f))return null;let S=Vp.dirname(a),y=Vp.resolve(S,f);if(this.isPythonFile(a)&&!this.hasFileExtension(f)){let A=await this.resolveWithExtensions(y);if(A)return A}return this.resolveWithExtensions(y)}async resolve(a,f){await this.ensureTsConfigLoaded();let S=await this.tryTsConfigAliases(a,f);if(S)return S;let y=await this.trySpecialModulePatterns(a,f);if(y)return y;let A=await this.tryPythonImports(a,f);return A||(this.isNodeModule(f)?this.excludeNodeModules?null:f:this.tryRelativePath(a,f))}async resolveSubpathImport(a,f){let S=await this.resolvePackageJsonImport(a,f);return S?this.resolveWithExtensions(S):null}async resolveScopedPackage(a,f){let S=await this.resolvePackageJsonImport(a,f);if(S)return this.resolveWithExtensions(S);let y=await this.resolveWorkspacePackage(a,f);return y||(this.excludeNodeModules?null:f)}async resolveDynamicTsConfigAlias(a,f){if(!this.isPackageJsonAliasCandidate(f))return null;let S=await this.findNearestTsConfig(a);if(!S)return null;let y=await this.getTsConfigPathAliases(S);for(let[A,O]of y.entries())if(f===A||f.startsWith(A+"/")){let Y=f.replace(A,O);return $i(Y)}return null}async findNearestTsConfig(a){let f=Vp.dirname(a);return this.directoryToTsConfig.has(f)?this.directoryToTsConfig.get(f)??null:await this.searchTsConfigUpward(f)}async searchTsConfigUpward(a){let f=[],S=a;for(;!this.shouldStopSearch(S);){f.push(S);let y=this.directoryToTsConfig.get(S);if(y!==void 0)return this.cacheTsConfigResultForDirs(f,y),y;let A=Vp.join(S,"tsconfig.json");if(await this.fileExists(A))return this.cacheTsConfigResultForDirs(f,A),A;let Y=Vp.dirname(S);if(Y===S)break;S=Y}return this.cacheTsConfigResultForDirs(f,null),null}cacheTsConfigResultForDirs(a,f){for(let S of a)this.directoryToTsConfig.set(S,f)}async getTsConfigPathAliases(a){let f=this.tsConfigPathAliases.get(a);if(f!==void 0)return f;let S=this.tsConfigLoadPromises.get(a);if(S!==void 0)return S;let y=this.loadTsConfigPathAliases(a);this.tsConfigLoadPromises.set(a,y);try{let A=await y;return this.tsConfigPathAliases.set(a,A),A}finally{this.tsConfigLoadPromises.delete(a)}}async loadTsConfigPathAliases(a){let f=new Map,S=new Set;return await this.loadTsConfigPathAliasesRecursive(a,f,S),f}async loadTsConfigPathAliasesRecursive(a,f,S){let y=Vp.resolve(a);if(!S.has(y)){S.add(y);try{let A=await sae.readFile(a,"utf-8"),O=JSON.parse(A),Y=Vp.dirname(a);if(O.extends){let et=Vp.resolve(Y,O.extends),ft=et.endsWith(".json")?et:et+".json",he=await this.fileExists(ft)?ft:et;await this.fileExists(he)&&await this.loadTsConfigPathAliasesRecursive(he,f,S)}let Ee=O?.compilerOptions?.paths,Be=O?.compilerOptions?.baseUrl||".";if(Ee)for(let[et,ft]of Object.entries(Ee)){let he=et.replace(/\/\*$/,""),hn=ft[0]?.replace(/\/\*$/,"");if(hn){let mt=Vp.resolve(Y,Be,hn);f.set(he,$i(mt))}}}catch{}}}resolveAlias(a){for(let[f,S]of this.pathAliases.entries())if(a===f||a.startsWith(f+"/"))return a.replace(f,S);return null}async resolveWithExtensions(a){let f=WQe;if(await this.fileExists(a))return $i(a);for(let S of f){let y=a+S;if(await this.fileExists(y))return $i(y)}for(let S of f){let y=Vp.join(a,`index${S}`);if(await this.fileExists(y))return $i(y)}return null}async fileExists(a){try{return(await sae.stat(a)).isFile()}catch{return!1}}isRelativePath(a){return a.startsWith("./")||a.startsWith("../")}async resolveRustModule(a,f){if(!a.endsWith(".rs")||f.startsWith(".")||f.startsWith("@")||f.startsWith("#")||f.startsWith("/")||!/^\w+(?:::\w+)*$/u.test(f))return null;let y=Vp.dirname(a),A=f.replaceAll("::",Vp.sep),O=[Vp.join(y,`${A}.rs`),Vp.join(y,A,"mod.rs")];for(let Y of O)if(await this.fileExists(Y))return $i(Y);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 FQe.some(f=>a.endsWith(f))}hasFileExtension(a){let f=Vp.basename(a);return f.includes(".")&&!f.startsWith(".")}isPythonRelativeImport(a){return(a.startsWith(".")||a.startsWith(".."))&&!a.includes("/")&&a!=="."&&a!==".."}async resolvePythonRelativeImport(a,f){let S=Vp.dirname(a),y=0,A=f;for(;A.startsWith(".");)y++,A=A.substring(1);let O=S;for(let Y=1;Y<y;Y++)O=Vp.dirname(O);if(A){let Y=Vp.join(O,A+".py");if(await this.fileExists(Y))return $i(Y);let Ee=Vp.join(O,A,"__init__.py");if(await this.fileExists(Ee))return $i(Ee)}return null}async resolvePythonModule(a,f){let S=f.replaceAll(".","/"),y=Vp.dirname(a),A=this.workspaceRoot||y,O=y;for(;;){let Y=Vp.resolve(O,S+".py");if(await this.fileExists(Y))return $i(Y);let Ee=Vp.resolve(O,S,"__init__.py");if(await this.fileExists(Ee))return $i(Ee);if($i(O)===$i(A))break;let Be=Vp.dirname(O);if(Be===O)break;O=Be}return null}async resolvePackageJsonImport(a,f){let S=await this.findNearestPackageJson(a);if(!S)return null;let y=await this.getPackageJsonImports(S),A=Vp.dirname(S),O=y.get(f);if(O!==void 0)return $i(Vp.resolve(A,O));for(let[Y,Ee]of y.entries())if(Y.endsWith("/*")){let Be=Y.slice(0,-2);if(f.startsWith(Be+"/")){let et=f.slice(Be.length+1),ft=Ee.endsWith("/*")?Ee.slice(0,-2):Ee,he=Vp.resolve(A,ft,et);return $i(he)}}return null}async findNearestPackageJson(a){let f=Vp.dirname(a);return this.directoryToPackageJson.has(f)?this.directoryToPackageJson.get(f)??null:await this.searchPackageJsonUpward(f)}async searchPackageJsonUpward(a){let f=[],S=a;for(;!this.shouldStopSearch(S);){f.push(S);let y=this.directoryToPackageJson.get(S);if(y!==void 0)return this.cacheResultForDirs(f,y),y;let A=Vp.join(S,"package.json");if(await this.fileExists(A))return this.cacheResultForDirs(f,A),A;let O=Vp.dirname(S);if(O===S)break;S=O}return this.cacheResultForDirs(f,null),null}shouldStopSearch(a){return!!(this.workspaceRoot&&a===Vp.dirname(this.workspaceRoot))}cacheResultForDirs(a,f){for(let S of a)this.directoryToPackageJson.set(S,f)}async getPackageJsonImports(a){let f=this.packageJsonImports.get(a);if(f!==void 0)return f;let S=this.packageJsonLoadPromises.get(a);if(S!==void 0)return S;let y=this.loadPackageJsonImports(a);this.packageJsonLoadPromises.set(a,y);try{let A=await y;return this.packageJsonImports.set(a,A),A}finally{this.packageJsonLoadPromises.delete(a)}}async loadPackageJsonImports(a){let f=new Map;try{let S=await sae.readFile(a,"utf-8"),y=JSON.parse(S);this.parseImportsField(y?.imports,f),this.parseAliasesField(y?.aliases,f)}catch{}return f}parseImportsField(a,f){if(!(!a||typeof a!="object"))for(let[S,y]of Object.entries(a)){let A=this.resolveImportTarget(y);A&&f.set(S,A)}}resolveImportTarget(a){if(typeof a=="string")return a;if(typeof a=="object"&&a!==null){let f=a,S=f.default??f.import??f.require??f.node;if(typeof S=="string")return S}return null}parseAliasesField(a,f){if(!(!a||typeof a!="object"))for(let[S,y]of Object.entries(a))typeof y=="string"&&f.set(S,y)}async resolveWorkspacePackage(a,f){if(!f.startsWith("@"))return null;let y=/^@([^/]+)\/([^/]+)(\/.*)?$/.exec(f);if(!y)return null;let[,,A,O]=y,Y=f.split("/").slice(0,2).join("/"),Ee=await this.resolveFileDependency(a,Y);if(Ee)return this.resolvePackageEntry(Ee,f,O);if(this.workspaceRoot){let Be=await this.findWorkspacePackageDir(A);if(Be)return this.resolvePackageEntry(Be,f,O)}return null}async resolveFileDependency(a,f){let y=Vp.dirname(a);for(;!this.shouldStopSearch(y);){let A=Vp.join(y,"package.json");if(await this.fileExists(A)){let Y=await this.findFileDependencyInPackageJson(A,f);if(Y)return Y}let O=Vp.dirname(y);if(O===y)break;y=O}return null}async findFileDependencyInPackageJson(a,f){try{let S=await sae.readFile(a,"utf-8"),y=JSON.parse(S),A=Vp.dirname(a),Y={...y.dependencies,...y.devDependencies,...y.peerDependencies}[f];if(typeof Y=="string"&&Y.startsWith("file:")){let Ee=Y.slice(5),Be=Vp.resolve(A,Ee),et=$i(Be),ft=Vp.join(Be,"package.json");if(await this.fileExists(ft))return et}}catch{}return null}async findWorkspacePackageDir(a){if(!this.workspaceRoot)return null;let f=["packages","libs","modules"];for(let S of f){let y=Vp.join(this.workspaceRoot,S,a),A=Vp.join(y,"package.json");if(await this.fileExists(A))return y}return null}async resolvePackageEntry(a,f,S){let y=Vp.join(a,"package.json");try{let A=await sae.readFile(y,"utf-8"),O=JSON.parse(A),Y=f.split("/").slice(0,2).join("/"),Ee=f.split("/").slice(1,2).join("/"),Be=O.name;if(Be!==Y&&Be!==Ee)return null;if(S){let et=O.source?Vp.dirname(O.source):"src",ft=Vp.join(a,et,S);return this.resolveWithExtensions(ft)}return this.findPackageEntryPoint(a,O)}catch{return null}}async findPackageEntryPoint(a,f){let S=f.main||f.module||"index",y=[Vp.join(a,"src","index"),Vp.join(a,S),Vp.join(a,"index")];for(let A of y){let O=await this.resolveWithExtensions(A);if(O)return O}return null}};var CDe=class p{fileReader;pathResolver;static STRIP_COMMENTS_RE=(()=>{let a=/'[^']*'|"[^"]*"/,f=/\/\/[^\n]*|\/\*[\s\S]*?\*\//;return new RegExp(`(${a.source})|(${f.source})`,"g")})();ignoreTypeImports;constructor(a,f){this.fileReader=new Lx,this.pathResolver=new PH(a),this.ignoreTypeImports=f??!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,f){f&&(f.endsWith(".vue")||f.endsWith(".svelte"))&&(a=this.extractScript(a));let S=[],y=new Set;return f?.endsWith(".gql")||f?.endsWith(".graphql")?(this.extractImports(a,this.patterns.graphqlImport,"import",S,y),S):(a=this.stripComments(a),this.extractImports(a,this.patterns.importFrom,"import",S,y),this.extractImports(a,this.patterns.exportFrom,"export",S,y),this.extractImports(a,this.patterns.require,"require",S,y),this.extractImports(a,this.patterns.dynamicImport,"dynamic",S,y),S)}extractScript(a){let f=/<script[^>]*>([\s\S]*?)<\/script\s*[^>]*>/gi;return[...a.matchAll(f)].map(y=>y[1]).join(`
|
|
43247
43247
|
`)}stripComments(a){return p.STRIP_COMMENTS_RE.lastIndex=0,a.replaceAll(p.STRIP_COMMENTS_RE,(f,S,y)=>S||y.replaceAll(/[^\n]/g," "))}extractImports(a,f,S,y,A){let O;for(f.lastIndex=0;(O=f.exec(a))!==null;){let Y=O[1];if(A.has(Y))continue;if(this.ignoreTypeImports){let Be=O[0].trim();if(/^(import|export)\s+type\b/.test(Be))continue;let et=Be.match(/^(import|export)\s+\{([\s\S]*?)\}\s+from\b/);if(et){let ft=et[2].split(",").map(he=>he.trim()).filter(Boolean);if(ft.length>0&&ft.every(he=>/^type\b/.test(he)))continue}}A.add(Y);let Ee=this.getLineNumber(a,O.index);y.push({module:Y,type:S,line:Ee})}}getLineNumber(a,f){return a.substring(0,f).split(`
|
|
43248
43248
|
`).length}async parseImports(a){let f=GC(a),S=await this.fileReader.readFile(f);return this.parse(S,f).map(A=>({path:"",type:A.type,line:A.line,module:A.module}))}async resolvePath(a,f){let S=GC(a);return this.pathResolver.resolve(S,f)}};var cae=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 f=this.cache.get(a);if(f!==void 0)return this.hits++,this.enableLRU&&this.maxSize>0&&(this.cache.delete(a),this.cache.set(a,f)),f;this.misses++}set(a,f){this.cache.has(a)?this.cache.delete(a):this.maxSize>0&&this.cache.size>=this.maxSize&&this.evictOldest(),this.cache.set(a,f)}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++)}};zC();var bKt=Hh("IndexerStatus"),ADe=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,f;if(this._startTime&&this._processed>0&&this._total>0&&this._state==="indexing"){let y=(Date.now()-this._startTime)/this._processed,A=this._total-this._processed;f=Math.round(y*A)}return{state:this._state,processed:this._processed,total:this._total,currentFile:this._currentFile,percentage:a,startTime:this._startTime,estimatedTimeRemaining:f,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,f){this._processed=a,this._currentFile=f,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 f=Date.now();if(!a&&f-this._lastNotifyTime<this._notifyThrottleMs)return;this._lastNotifyTime=f;let S=this.getSnapshot();for(let y of this._listeners)try{y(S)}catch(A){bKt.error("Listener error:",A)}}get state(){return this._state}get total(){return this._total}get processed(){return this._processed}};var qWt=bl(require("node:path"));var _v=bl(RNt());zC();function MNt(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 HWt=Hh("SymbolAnalyzer"),Tit=class{project;maxFiles;fileCount=0;fileReader;constructor(a,f={}){this.maxFiles=f.maxFiles??100,this.project=this.createProject(),this.fileReader=new Lx}createProject(){return new _v.Project({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!0,compilerOptions:{target:99,module:99}})}maybeResetProject(){this.fileCount>=this.maxFiles&&(HWt.debug(`Resetting ts-morph project (${this.fileCount} files in memory)`),this.project=this.createProject(),this.fileCount=0)}getFileCount(){return this.fileCount}reset(){HWt.debug("Forcing ts-morph project reset"),this.project=this.createProject(),this.fileCount=0}analyzeFileContent(a,f){this.maybeResetProject();let S=this.getOrCreateSourceFile(a,f),y=[],A=[],O=this.extractExportedSymbols(S,a,y);return this.extractNonExportedSymbols(S,a,O,y),this.buildDependencies(S,A),{symbols:y,dependencies:A}}getOrCreateSourceFile(a,f){let S=this.project.getSourceFile(a);return S?S.replaceWithText(f):(S=this.project.createSourceFile(a,f),this.fileCount++),S}extractExportedSymbols(a,f,S){let y=a.getExportedDeclarations(),A=new Set(y.keys());for(let[O,Y]of y){let Ee=Y[0];Ee&&(this.addSymbol(S,O,Ee.getKindName(),Ee.getStartLineNumber(),f,!0),Ee.getKindName()==="ClassDeclaration"&&_v.Node.isClassDeclaration(Ee)&&this.extractClassMembers(Ee,f,S))}return A}extractNonExportedSymbols(a,f,S,y){let A=a.getStatements();for(let O of A)_v.Node.isVariableStatement(O)?this.extractVariableDeclarations(O,f,S,y):this.extractOtherDeclarations(O,f,S,y)}extractVariableDeclarations(a,f,S,y){let A=a.getDeclarations();for(let O of A){let Y=O.getName();S.has(Y)||this.addSymbol(y,Y,"VariableDeclaration",O.getStartLineNumber(),f,!1)}}extractOtherDeclarations(a,f,S,y){let A=this.getDeclarationInfo(a);!A||S.has(A.name)||(this.addSymbol(y,A.name,A.kind,a.getStartLineNumber(),f,!1),A.isClass&&_v.Node.isClassDeclaration(a)&&this.extractClassMembers(a,f,y))}getDeclarationInfo(a){if(_v.Node.isClassDeclaration(a)){let f=a.getName();if(f)return{name:f,kind:"ClassDeclaration",isClass:!0}}else if(_v.Node.isFunctionDeclaration(a)){let f=a.getName();if(f)return{name:f,kind:"FunctionDeclaration",isClass:!1}}else{if(_v.Node.isInterfaceDeclaration(a))return{name:a.getName(),kind:"InterfaceDeclaration",isClass:!1};if(_v.Node.isTypeAliasDeclaration(a))return{name:a.getName(),kind:"TypeAliasDeclaration",isClass:!1};if(_v.Node.isEnumDeclaration(a))return{name:a.getName(),kind:"EnumDeclaration",isClass:!1}}return null}addSymbol(a,f,S,y,A,O){a.push({name:f,kind:S,line:y,isExported:O,id:`${A}:${f}`,category:MNt(S)})}buildDependencies(a,f){let S=this.buildImportMap(a),y=this.findSymbolUsage(a,S);for(let[A,O]of Object.entries(y))for(let Y of O)f.push({sourceSymbolId:A,targetSymbolId:Y.symbolId,targetFilePath:Y.filePath,isTypeOnly:Y.isTypeOnly})}getInternalExportDependencyGraph(a,f){this.maybeResetProject();let y=this.getOrCreateSourceFile(a,f).getExportedDeclarations(),A=new Set(y.keys()),O=new Map;for(let[Y,Ee]of y){let Be=`${a}:${Y}`,et=this.getOrCreateDependencySet(O,Be);this.collectExportDependencies(Ee,Y,A,a,et)}return O}getOrCreateDependencySet(a,f){let S=a.get(f);return S||(S=new Set,a.set(f,S)),S}collectExportDependencies(a,f,S,y,A){for(let O of a){let Y=O.getDescendantsOfKind(_v.SyntaxKind.Identifier);for(let Ee of Y){let Be=Ee.getText();this.isValidDependency(Be,f,S)&&A.add(`${y}:${Be}`)}}}isValidDependency(a,f,S){return S.has(a)&&a!==f}buildImportMap(a){let f=new Map,S=a.getImportDeclarations();for(let y of S){let A=y.getModuleSpecifierValue(),O=y.isTypeOnly(),Y=y.getDefaultImport();if(Y){let et=Y.getText();f.set(et,{originalName:"default",modulePath:A,isType:O})}let Ee=y.getNamedImports();for(let et of Ee){let ft=et.getNameNode().getText(),he=et.getAliasNode(),hn=he?he.getText():ft;f.set(hn,{originalName:ft,modulePath:A,isType:O||et.isTypeOnly()})}let Be=y.getNamespaceImport();if(Be){let et=Be.getText();f.set(et,{originalName:"*",modulePath:A,isType:O})}}return f}extractIntraFileCalls(a,f){let S=[],y=f.getFilePath(),A=this.collectFunctionNames(f),O=a.getDescendantsOfKind(_v.SyntaxKind.CallExpression);for(let Y of O)this.processCallExpression(Y,A,y,S);return S}collectFunctionNames(a){let f=new Set;for(let S of a.getFunctions()){let y=S.getName();y&&f.add(y)}for(let S of a.getClasses())for(let y of S.getMethods()){let A=y.getName();A&&f.add(A)}return f}processCallExpression(a,f,S,y){if(!_v.Node.isCallExpression(a))return;let A=a.getExpression();if(_v.Node.isIdentifier(A)){this.addDirectFunctionCall(A,f,S,y);return}_v.Node.isPropertyAccessExpression(A)&&this.addPropertyAccessCall(A,f,S,y)}addDirectFunctionCall(a,f,S,y){let A=a.getText();f.has(A)&&y.push({symbolId:`${S}:${A}`,filePath:S,isTypeOnly:!1})}addPropertyAccessCall(a,f,S,y){if(_v.Node.isPropertyAccessExpression(a)){let A=a.getName();f.has(A)&&y.push({symbolId:`${S}:${A}`,filePath:S,isTypeOnly:!1})}}findSymbolUsage(a,f){let S={},y=a.getFilePath(),A=[...a.getFunctions(),...a.getClasses(),...a.getVariableDeclarations()];for(let Ee of A){let Be=Ee.getName();if(!Be)continue;let et=`${y}:${Be}`,ft=this.extractSymbolDependencies(Ee,f),he=this.extractIntraFileCalls(Ee,a);ft.push(...he),S[et]=ft}let O=a.getStatements(),Y=[];for(let Ee of O){if(_v.Node.isFunctionDeclaration(Ee)||_v.Node.isClassDeclaration(Ee)||_v.Node.isVariableStatement(Ee)||_v.Node.isInterfaceDeclaration(Ee)||_v.Node.isTypeAliasDeclaration(Ee)||_v.Node.isEnumDeclaration(Ee)||_v.Node.isImportDeclaration(Ee))continue;let Be=this.extractSymbolDependencies(Ee,f);Y.push(...Be)}if(Y.length>0){let Ee=`${y}:(file)`;S[Ee]=Y}return S}extractSymbolDependencies(a,f){let S=[];return this.extractStaticImportDependencies(a,f,S),this.extractDynamicImportDependencies(a,S),S}extractStaticImportDependencies(a,f,S){let y=a.getDescendantsOfKind(_v.SyntaxKind.Identifier);for(let A of y){let O=f.get(A.getText());if(!O)continue;let Y=this.buildTargetSymbolId(O);S.some(Ee=>Ee.symbolId===Y)||S.push({symbolId:Y,filePath:O.modulePath,isTypeOnly:O.isType})}}extractDynamicImportDependencies(a,f){let S=a.getDescendantsOfKind(_v.SyntaxKind.CallExpression);for(let y of S){let A=this.extractDynamicImportPath(y);if(!A)continue;let O=`${A}:default`;f.some(Y=>Y.symbolId===O)||f.push({symbolId:O,filePath:A,isTypeOnly:!1})}}extractDynamicImportPath(a){if(!_v.Node.isCallExpression(a)||a.getExpression().getKind()!==_v.SyntaxKind.ImportKeyword)return null;let S=a.getArguments();if(S.length===0)return null;let y=S[0];return _v.Node.isStringLiteral(y)?y.getLiteralValue():null}buildTargetSymbolId(a){return a.originalName==="default"?`${a.modulePath}:default`:`${a.modulePath}:${a.originalName}`}extractClassMembers(a,f,S){let y=a.getName();if(!y)return;let A=`${f}:${y}`,O=a.getMembers();for(let Y of O){let Ee=Y.getKindName();if(!_v.Node.isMethodDeclaration(Y)&&!_v.Node.isPropertyDeclaration(Y)&&!_v.Node.isGetAccessorDeclaration(Y)&&!_v.Node.isSetAccessorDeclaration(Y))continue;let Be=Y.getName();if(!Be)continue;let et=Y.isStatic()??!1,ft=`${y}.${Be}`,he=et?`Static${Ee}`:Ee;S.push({name:ft,kind:he,line:Y.getStartLineNumber(),isExported:!1,id:`${f}:${ft}`,parentSymbolId:A,category:MNt(Ee)})}}getExportedSymbols(a,f){let S=this.project.getSourceFile(a);S?S.replaceWithText(f):S=this.project.createSourceFile(a,f);let y=[],A=S.getExportedDeclarations();for(let[O,Y]of A){let Ee=Y[0];if(!Ee)continue;let Be=Ee.getKindName();y.push({name:O,kind:Be,line:Ee.getStartLineNumber(),isExported:!0,id:`${a}:${O}`,category:MNt(Be)})}return y}filterRuntimeSymbols(a){let f=new Set(["InterfaceDeclaration","TypeAliasDeclaration","TypeParameter"]);return a.filter(S=>!f.has(S.kind))}async analyzeFile(a){let f=await this.fileReader.readFile(a),S=this.analyzeFileContent(a,f),y=new Map;for(let A of S.symbols)y.set(A.id,A);return y}async getSymbolDependencies(a){let f=await this.fileReader.readFile(a);return this.analyzeFileContent(a,f).dependencies}};var LNt=bl(require("node:fs/promises")),UH=bl(require("node:path"));Qv();jC();one();var xit=class p{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,f){this.fileReader=new Lx,this.rootDir=a??process.cwd(),this.extensionPath=f}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 f=i2.getInstance(),S=UH.default.join(a,"dist","wasm","tree-sitter.wasm");await f.init(S);let y=UH.default.join(a,"dist","wasm","tree-sitter-c_sharp.wasm");this.parser=await f.getParser("c_sharp",y)}catch(f){this.initPromise=null;let S=f instanceof Error?f.message:String(f);throw new Error(`Failed to initialize C# WASM parser: ${S}`,{cause:f})}})(),this.initPromise)}async parseImports(a){let f=GC(a),S;try{S=await this.fileReader.readFile(f)}catch(O){throw pg.fromError(O,f)}if(await this.ensureInitialized(),!this.parser)return[];let y=this.parser.parse(S);if(!y)return[];let A=[];return this.extractUsings(y.rootNode,f,A),A}extractUsings(a,f,S){if(a.type==="using_directive"){let y=a.children.find(A=>A.type==="identifier"||A.type==="qualified_name"||A.type==="member_access_expression");if(y){let A=y.text.trim();A&&S.push({path:$i(f),type:"import",line:y.startPosition.row+1,module:A})}}for(let y of a.children)this.extractUsings(y,f,S)}async resolvePath(a,f){if(this.isFrameworkNamespace(f))return null;let S=f.split(".");return S.length<2||S.some(p.isUnsafeSegment)?null:this.resolveNamespace(S)}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 f=a.length-1;f>=1;f--){let S=UH.default.resolve(this.rootDir,a.slice(f).join(UH.default.sep));if(!this.isWithinRoot(S))continue;let y=await this.findFirstCsFile(S);if(y)return $i(y)}return null}async resolveViaLastSegment(a){let f=a.at(-1)??"";if(!f)return null;let S=await this.findDirectory(this.rootDir,f,3);if(!S||!this.isWithinRoot(S))return null;let y=await this.findFirstCsFile(S);return y?$i(y):null}isWithinRoot(a){let f=$i(UH.default.resolve(a)),S=$i(UH.default.resolve(this.rootDir));return f===S||f.startsWith(S+"/")}isFrameworkNamespace(a){return["System","Microsoft","Newtonsoft","NUnit","Xunit","MSTest","AutoMapper","FluentValidation","MediatR","Serilog"].some(S=>a===S||a.startsWith(S+"."))}async findFirstCsFile(a){try{let S=(await LNt.default.readdir(a,{withFileTypes:!0})).filter(y=>y.isFile()&&y.name.endsWith(".cs")).sort((y,A)=>y.name.localeCompare(A.name));return S.length>0?UH.default.join(a,S[0].name):null}catch{return null}}async findDirectory(a,f,S){if(S<=0)return null;try{let A=(await LNt.default.readdir(a,{withFileTypes:!0})).filter(p.isTraversableDir);for(let O of A){if(O.name===f)return UH.default.join(a,O.name);let Y=await this.findDirectory(UH.default.join(a,O.name),f,S-1);if(Y)return Y}}catch{}return null}static isTraversableDir(a){return a.isDirectory()&&!a.name.startsWith(".")&&a.name!=="node_modules"}};var Eit=bl(require("node:fs/promises")),Q5=bl(require("node:path"));Qv();jC();one();var Cit=class p{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,f){this.fileReader=new Lx,this.rootDir=a??process.cwd(),this.extensionPath=f}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 f=i2.getInstance(),S=Q5.default.join(a,"dist","wasm","tree-sitter.wasm");await f.init(S);let y=Q5.default.join(a,"dist","wasm","tree-sitter-go.wasm");this.parser=await f.getParser("go",y)}catch(f){this.initPromise=null;let S=f instanceof Error?f.message:String(f);throw new Error(`Failed to initialize Go WASM parser: ${S}`,{cause:f})}})(),this.initPromise)}async parseImports(a){let f=GC(a),S;try{S=await this.fileReader.readFile(f)}catch(O){throw pg.fromError(O,f)}if(await this.ensureInitialized(),!this.parser)return[];let y=this.parser.parse(S);if(!y)return[];let A=[];return this.extractImports(y.rootNode,f,A),A}extractImports(a,f,S){if(a.type==="import_spec"){let y=a.children.find(A=>A.type==="interpreted_string_literal"||A.type==="raw_string_literal");if(y){let A=y.text.replaceAll(/^["`]|["`]$/g,"").trim();A&&S.push({path:$i(f),type:"import",line:y.startPosition.row+1,module:A})}}for(let y of a.children)this.extractImports(y,f,S)}async resolvePath(a,f){if(this.isGoStdlibImport(f))return null;let S=f.split("/");return S.some(p.isUnsafePart)?null:this.resolveGoImport(GC(a),f,S)}async resolveGoImport(a,f,S){try{let y=await this.resolveViaGoMod(a,f)??await this.resolveViaLastSegment(S);return y?$i(y):null}catch{return null}}static isUnsafePart(a){return a===".."||a===""}async resolveViaGoMod(a,f){let S=await this.findGoModuleInfo(Q5.default.dirname(a));if(!S||!f.startsWith(S.moduleName+"/"))return null;let A=f.slice(S.moduleName.length+1).split("/");if(A.some(p.isUnsafePart))return null;let O=Q5.default.resolve(S.moduleDir,...A);return this.isWithinRoot(O)?this.findFirstGoFile(O):null}async resolveViaLastSegment(a){let f=a.at(-1)??"";if(!f)return null;let S=await this.findDirectory(this.rootDir,f,3);return!S||!this.isWithinRoot(S)?null:this.findFirstGoFile(S)}isWithinRoot(a){let f=$i(Q5.default.resolve(a)),S=$i(Q5.default.resolve(this.rootDir));return f===S||f.startsWith(S+"/")}isGoStdlibImport(a){return!(a.split("/")[0]??"").includes(".")}async findGoModuleInfo(a){let f=a,S=$i(this.rootDir);for(;;){let y=await this.readGoModuleName(Q5.default.join(f,"go.mod"));if(y)return{moduleDir:f,moduleName:y};let A=Q5.default.dirname(f);if(A===f||!$i(A).startsWith(S))break;f=A}return null}async readGoModuleName(a){try{let f=await Eit.default.readFile(a,"utf-8"),S=/^module\s+(\S+)/mu.exec(f);return S?S[1]:null}catch{return null}}async findFirstGoFile(a){try{let S=(await Eit.default.readdir(a,{withFileTypes:!0})).filter(y=>y.isFile()&&y.name.endsWith(".go")&&!y.name.endsWith("_test.go")).sort((y,A)=>y.name.localeCompare(A.name));return S.length>0?Q5.default.join(a,S[0].name):null}catch{return null}}async findDirectory(a,f,S){if(S<=0)return null;try{let A=(await Eit.default.readdir(a,{withFileTypes:!0})).filter(p.isTraversableDir);for(let O of A){if(O.name===f)return Q5.default.join(a,O.name);let Y=await this.findDirectory(Q5.default.join(a,O.name),f,S-1);if(Y)return Y}}catch{}return null}static isTraversableDir(a){return a.isDirectory()&&!a.name.startsWith(".")&&a.name!=="node_modules"}};var ONt=bl(require("node:fs/promises")),ane=bl(require("node:path"));Qv();jC();one();var Ait=class{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,f){this.fileReader=new Lx,this.rootDir=a??process.cwd(),this.extensionPath=f}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 f=i2.getInstance(),S=ane.default.join(a,"dist","wasm","tree-sitter.wasm");await f.init(S);let y=ane.default.join(a,"dist","wasm","tree-sitter-java.wasm");this.parser=await f.getParser("java",y)}catch(f){this.initPromise=null;let S=f instanceof Error?f.message:String(f);throw new Error(`Failed to initialize Java WASM parser: ${S}`,{cause:f})}})(),this.initPromise)}async parseImports(a){let f=GC(a),S;try{S=await this.fileReader.readFile(f)}catch(O){throw pg.fromError(O,f)}if(await this.ensureInitialized(),!this.parser)return[];let y=this.parser.parse(S);if(!y)return[];let A=[];return this.extractImports(y.rootNode,f,A),A}extractImports(a,f,S){if(a.type==="import_declaration"){let y=a.children.find(A=>A.type==="identifier"||A.type==="scoped_identifier");if(y){let A=y.text.trim();A&&S.push({path:$i(f),type:"import",line:y.startPosition.row+1,module:A})}}for(let y of a.children)this.extractImports(y,f,S)}async resolvePath(a,f){try{if(this.isJavaStdlibImport(f)||f.endsWith(".*"))return null;let S=f.split(".");if(S.some(Ee=>Ee===""||Ee===".."||Ee.includes("/")))return null;let y=S.at(-1)??"",A=S.join(ane.default.sep)+".java",O=ane.default.resolve(this.rootDir,A);if(this.isWithinRoot(O)&&await this.fileExists(O))return $i(O);let Y=await this.findFile(this.rootDir,y+".java",4);return Y?$i(Y):null}catch{return null}}isWithinRoot(a){let f=$i(ane.default.resolve(a)),S=$i(ane.default.resolve(this.rootDir));return f===S||f.startsWith(S+"/")}isJavaStdlibImport(a){return["java.","javax.","sun.","com.sun.","org.w3c.","org.xml.","org.ietf.","org.omg.","jdk.","javafx."].some(S=>a.startsWith(S))}async findFile(a,f,S){if(S<=0)return null;try{let y=await ONt.default.readdir(a,{withFileTypes:!0});for(let A of y)if(A.isFile()&&A.name===f)return ane.default.join(a,A.name);for(let A of y)if(A.isDirectory()&&!A.name.startsWith(".")&&A.name!=="node_modules"){let O=await this.findFile(ane.default.join(a,A.name),f,S-1);if(O)return O}}catch{}return null}async fileExists(a){try{return await ONt.default.access(a),!0}catch{return!1}}};var FNt=bl(require("node:fs/promises")),yO=bl(require("node:path"));Qv();jC();one();var Dit=class{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,f){this.fileReader=new Lx,this.rootDir=a||process.cwd(),this.extensionPath=f}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 f=i2.getInstance(),S=yO.default.join(a,"dist","wasm","tree-sitter.wasm");await f.init(S);let y=yO.default.join(a,"dist","wasm","tree-sitter-python.wasm");this.parser=await f.getParser("python",y)}catch(f){this.initPromise=null;let S=f instanceof Error?f.message:String(f);throw new Error(`Failed to initialize Python WASM parser: ${S}`,{cause:f})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),f=yO.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await FNt.default.access(f),a}catch{return}}async parseImports(a){try{await this.ensureInitialized();let f=GC(a),S=await this.fileReader.readFile(f),y=this.parser?.parse(S);if(!y)throw new Error(`Failed to parse Python file: ${f}`);let A=[],O=new Set;return this.traverseTree(y.rootNode,Y=>{Y.type==="import_statement"?this.extractImportStatement(Y,A,O,S):Y.type==="import_from_statement"&&this.extractImportFromStatement(Y,A,O,S)}),A}catch(f){throw pg.fromError(f,a)}}async resolvePath(a,f){try{await this.ensureInitialized();let S=GC(a),y=yO.default.dirname(S);return f.startsWith(".")?await this.resolveRelativeImport(y,f):await this.resolveAbsoluteImport(y,f)}catch{return null}}extractImportStatement(a,f,S,y){let A=this.findChildrenByType(a,"dotted_name");for(let O of A){let Y=this.getNodeText(O,y);Y&&!S.has(Y)&&(S.add(Y),f.push({path:"",type:"import",line:O.startPosition.row+1,module:Y}))}}extractImportFromStatement(a,f,S,y){let A=null,O=this.findChildByType(a,"relative_import");if(O)A=this.getNodeText(O,y);else{let Y=this.findChildByType(a,"dotted_name");Y&&(A=this.getNodeText(Y,y))}A&&!S.has(A)&&(S.add(A),f.push({path:"",type:"import",line:a.startPosition.row+1,module:A}))}async resolveRelativeImport(a,f){let S=/^\.*/u.exec(f),y=S?S[0].length:0,A=f.slice(y).replaceAll(".","/"),O=a;for(let Ee=1;Ee<y;Ee++)O=yO.default.dirname(O);let Y=[yO.default.join(O,A+".py"),yO.default.join(O,A+".pyi"),yO.default.join(O,A,"__init__.py"),yO.default.join(O,A,"__init__.pyi")];for(let Ee of Y)if(await this.fileExists(Ee))return $i(Ee);return null}async resolveAbsoluteImport(a,f){let S=f.replaceAll(".","/"),y=$i(this.rootDir),A=new Set,O=async Ee=>{let Be=$i(Ee);if(A.has(Be))return null;A.add(Be);let et=[yO.default.join(Ee,S+".py"),yO.default.join(Ee,S+".pyi"),yO.default.join(Ee,S,"__init__.py"),yO.default.join(Ee,S,"__init__.pyi")];for(let ft of et)if(await this.fileExists(ft))return $i(ft);return null},Y=a;for(;;){let Ee=await O(Y);if(Ee)return Ee;let Be=yO.default.dirname(Y);if(Be===Y)break;if($i(Be)===y){let et=await O(Be);if(et)return et;break}Y=Be}if(!A.has(y)){let Ee=await O(this.rootDir);if(Ee)return Ee}return null}async fileExists(a){try{return await FNt.default.access(a),!0}catch{return!1}}traverseTree(a,f){f(a);for(let S of a.children)this.traverseTree(S,f)}findChildrenByType(a,f){let S=[];for(let y of a.children)y.type===f&&S.push(y);return S}findChildByType(a,f){for(let S of a.children)if(S.type===f)return S;return null}getNodeText(a,f){return f.slice(a.startIndex,a.endIndex)}};var KWt=bl(require("node:fs/promises")),Iit=bl(require("node:path"));Qv();jC();one();var Pit=class{parser=null;fileReader;initPromise=null;extensionPath;constructor(a,f){this.extensionPath=f??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 f=i2.getInstance(),S=Iit.default.join(a,"dist","wasm","tree-sitter.wasm");await f.init(S);let y=Iit.default.join(a,"dist","wasm","tree-sitter-python.wasm");this.parser=await f.getParser("python",y)}catch(f){this.initPromise=null;let S=f instanceof Error?f.message:String(f);throw new Error(`Failed to initialize Python WASM parser for symbol analysis: ${S}`,{cause:f})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),f=Iit.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await KWt.default.access(f),a}catch{return}}async analyzeFile(a){try{await this.ensureInitialized();let f=await this.fileReader.readFile(a);return this.analyzeFileFromContent(a,f)}catch(f){throw pg.fromError(f,a)}}analyzeFileFromContent(a,f){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileFromContent().");let S=this.parser.parse(f);if(!S)throw new Error(`Failed to parse Python file: ${a}`);let y=new Map,A=$i(a);return this.extractSymbols(S.rootNode,A,f,y),y}analyzeFileContent(a,f){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileContent().");let S=this.parser.parse(f);if(!S)throw new Error(`Failed to parse Python file: ${a}`);let y=new Map,A=[],O=$i(a);this.extractSymbols(S.rootNode,O,f,y);let Y=this.buildImportMap(S.rootNode,f);return this.extractDependencies(S.rootNode,O,f,A,y,void 0,Y),{symbols:Array.from(y.values()),dependencies:A}}async getSymbolDependencies(a){try{await this.ensureInitialized();let f=await this.fileReader.readFile(a);return this.analyzeFileContent(a,f).dependencies}catch(f){throw pg.fromError(f,a)}}extractSymbols(a,f,S,y,A){this.tryExtractSymbolFromNode(a,f,S,y,A)||this.extractSymbolsFromChildren(a,f,S,y,A)}tryExtractSymbolFromNode(a,f,S,y,A){return a.type==="function_definition"?(this.handleFunctionDefinition(a,f,S,y,A),!0):a.type==="class_definition"?(this.handleClassDefinition(a,f,S,y,A),!0):a.type==="decorated_definition"?(this.handleDecoratedDefinition(a,f,S,y,A),!0):!1}handleFunctionDefinition(a,f,S,y,A){let O=a.childForFieldName("name");if(!O)return;let Y=this.getNodeText(O,S),Ee=`${f}:${Y}`,Be=this.hasChild(a,"async");y.set(Ee,{name:Y,kind:Be?"AsyncFunction":"FunctionDeclaration",line:O.startPosition.row+1,isExported:this.isExported(a,S),id:Ee,parentSymbolId:A,category:"function"}),this.extractSymbolsFromChildren(a,f,S,y,Ee)}handleClassDefinition(a,f,S,y,A){let O=a.childForFieldName("name");if(!O)return;let Y=this.getNodeText(O,S),Ee=`${f}:${Y}`;y.set(Ee,{name:Y,kind:"ClassDeclaration",line:O.startPosition.row+1,isExported:this.isExported(a,S),id:Ee,parentSymbolId:A,category:"class"}),this.extractSymbolsFromChildren(a,f,S,y,Ee)}handleDecoratedDefinition(a,f,S,y,A){for(let O of a.children)(O.type==="function_definition"||O.type==="class_definition")&&this.extractSymbols(O,f,S,y,A)}extractSymbolsFromChildren(a,f,S,y,A){for(let O of a.children)this.extractSymbols(O,f,S,y,A)}buildImportMap(a,f){let S=new Map;return this.traverseForImports(a,S,f),S}traverseForImports(a,f,S){a.type==="import_from_statement"?this.processFromImport(a,f,S):a.type==="import_statement"&&this.processImportStatement(a,f,S);for(let y of a.children)this.traverseForImports(y,f,S)}processFromImport(a,f,S){let y=a.childForFieldName("module_name");if(!y)return;let A=this.getNodeText(y,S);for(let O of a.children)this.processFromImportChild(O,f,S,A)}processFromImportChild(a,f,S,y){if(a.type==="aliased_import"){this.addAliasedFromImport(a,f,S,y);return}if(a.type==="dotted_name"||a.type==="identifier"){let A=this.getNodeText(a,S);if(A===y||a.parent?.type==="aliased_import")return;f.set(A,y)}}addAliasedFromImport(a,f,S,y){let A=a.childForFieldName("name");if(!A)return;let O=this.getNodeText(A,S),Y=a.childForFieldName("alias"),Ee=Y?this.getNodeText(Y,S):O;f.set(Ee,y)}processImportStatement(a,f,S){for(let y of a.children)this.processImportStatementChild(y,f,S)}processImportStatementChild(a,f,S){if(a.type==="aliased_import"){let y=a.childForFieldName("name");if(!y)return;let A=this.getNodeText(y,S),O=a.childForFieldName("alias"),Y=O?this.getNodeText(O,S):A;f.set(Y,A);return}if(a.type==="dotted_name"||a.type==="identifier"){let y=this.getNodeText(a,S);y!=="import"&&f.set(y,y)}}extractDependencies(a,f,S,y,A,O,Y){let Ee=this.getScopeForNode(a,f,S,O);this.addCallDependencyIfAny(a,f,S,y,A,Ee,Y);for(let Be of a.children)this.extractDependencies(Be,f,S,y,A,Ee,Y)}getScopeForNode(a,f,S,y){if(a.type!=="function_definition"&&a.type!=="class_definition")return y;let A=a.childForFieldName("name");if(!A)return y;let O=this.getNodeText(A,S);return`${f}:${O}`}addCallDependencyIfAny(a,f,S,y,A,O,Y){if(a.type!=="call")return;let Ee=a.childForFieldName("function");if(!Ee||!O)return;let Be=this.getCalledName(Ee,S),et=`${f}:${Be}`;if(A.has(et)){y.push({sourceSymbolId:O,targetSymbolId:et,targetFilePath:f,isTypeOnly:!1});return}if(Y?.has(Be)){let ft=Y.get(Be);if(ft===void 0)return;y.push({sourceSymbolId:O,targetSymbolId:`${ft}:${Be}`,targetFilePath:ft,isTypeOnly:!1})}}getCalledName(a,f){if(a.type!=="attribute")return this.getNodeText(a,f);let S=a.childForFieldName("attribute");return S?this.getNodeText(S,f):this.getNodeText(a,f)}isExported(a,f){let S=a.childForFieldName("name");return S?!this.getNodeText(S,f).startsWith("_"):!1}hasChild(a,f){for(let S of a.children)if(S.type===f)return!0;return!1}getNodeText(a,f){return f.slice(a.startIndex,a.endIndex)}};var WNt=bl(require("node:fs/promises")),sne=bl(require("node:path"));Qv();jC();one();var kit=class{parser=null;fileReader;rootDir;extensionPath;initPromise=null;constructor(a,f){this.fileReader=new Lx,this.rootDir=a||process.cwd(),this.extensionPath=f}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 f=i2.getInstance(),S=sne.default.join(a,"dist","wasm","tree-sitter.wasm");await f.init(S);let y=sne.default.join(a,"dist","wasm","tree-sitter-rust.wasm");this.parser=await f.getParser("rust",y)}catch(f){this.initPromise=null;let S=f instanceof Error?f.message:String(f);throw new Error(`Failed to initialize Rust WASM parser: ${S}`,{cause:f})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),f=sne.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await WNt.default.access(f),a}catch{return}}async parseImports(a){try{await this.ensureInitialized();let f=GC(a),S=await this.fileReader.readFile(f),y=this.parser?.parse(S);if(!y)throw new Error(`Failed to parse Rust file: ${f}`);let A=[],O=new Set;return this.traverseTree(y.rootNode,Y=>{Y.type==="use_declaration"?this.extractUseDeclaration(Y,A,O,S):Y.type==="mod_item"?this.extractModItem(Y,A,O,S,a):Y.type==="extern_crate_declaration"&&this.extractExternCrate(Y,A,O,S)}),A}catch(f){throw pg.fromError(f,a)}}async resolvePath(a,f){try{await this.ensureInitialized();let S=f.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(S))return null;let A=GC(a),O=sne.default.dirname(A);return f.startsWith("self::")||f.startsWith("super::")||f.startsWith("crate::")?await this.resolveRelativeModule(a,f):await this.resolveModDeclaration(O,f)}catch{return null}}extractUseDeclaration(a,f,S,y){let A=this.collectIdentifiers(a,y);for(let O of A){if(!O)continue;let Y=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(Y))continue;let Be=O.toLowerCase();S.has(Be)||(S.add(Be),f.push({path:"",type:"import",line:a.startPosition.row+1,module:Be}))}}extractModItem(a,f,S,y,A){if(this.findChildByType(a,"declaration_list"))return;let Y=this.findChildByType(a,"identifier");if(Y){let Ee=this.getNodeText(Y,y);Ee=Ee.toLowerCase(),Ee&&!S.has(Ee)&&(S.add(Ee),f.push({path:"",type:"import",line:a.startPosition.row+1,module:Ee}))}}extractExternCrate(a,f,S,y){let A=this.findChildByType(a,"identifier");if(A){let O=this.getNodeText(A,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 Ee=O.toLowerCase();S.has(Ee)||(S.add(Ee),f.push({path:"",type:"import",line:a.startPosition.row+1,module:Ee}))}}collectIdentifiers(a,f){let S=[],y=this.findAllByType(a,"scoped_identifier");for(let O of y){let Y=this.getNodeText(O,f);Y&&S.push(Y)}let A=this.findAllByType(a,"identifier");for(let O of A){let Y=this.getNodeText(O,f);if(!Y||Y==="self"||Y==="super"||Y==="crate")continue;let Ee=Y.charAt(0);Ee===Ee.toUpperCase()&&Ee!==Ee.toLowerCase()||S.push(Y)}return S}async resolveRelativeModule(a,f){let S=sne.default.dirname(a);if(f.startsWith("crate::")){let y=f.slice(7).replaceAll("::","/");return await this.resolveModDeclaration(this.rootDir,y)}if(f.startsWith("super::")){let y=sne.default.dirname(S),A=f.slice(7).replaceAll("::","/");return await this.resolveModDeclaration(y,A)}if(f.startsWith("self::")){let y=f.slice(6).replaceAll("::","/");return await this.resolveModDeclaration(S,y)}return null}async resolveModDeclaration(a,f){if(f!==f.toLowerCase())return null;let S=f.replaceAll("::","/");S=S.toLowerCase();let y=[sne.default.join(a,S+".rs"),sne.default.join(a,S,"mod.rs")];for(let A of y)if(await this.fileExists(A))return $i(A);return null}async fileExists(a){try{return await WNt.default.access(a),!0}catch{return!1}}traverseTree(a,f){f(a);for(let S of a.children)this.traverseTree(S,f)}findChildByType(a,f){for(let S of a.children)if(S.type===f)return S;return null}findAllByType(a,f){let S=[],y=A=>{A.type===f&&S.push(A);for(let O of A.children)y(O)};return y(a),S}getNodeText(a,f){return f.slice(a.startIndex,a.endIndex)}};var $Wt=bl(require("node:fs/promises")),Nit=bl(require("node:path"));Qv();jC();one();var wit=class{parser=null;fileReader;initPromise=null;extensionPath;constructor(a,f){this.extensionPath=f??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 f=i2.getInstance(),S=Nit.default.join(a,"dist","wasm","tree-sitter.wasm");await f.init(S);let y=Nit.default.join(a,"dist","wasm","tree-sitter-rust.wasm");this.parser=await f.getParser("rust",y)}catch(f){this.initPromise=null;let S=f instanceof Error?f.message:String(f);throw new Error(`Failed to initialize Rust WASM parser for symbol analysis: ${S}`,{cause:f})}})(),await this.initPromise)}async resolveExtensionPath(){if(this.extensionPath)return this.extensionPath;let a=process.cwd(),f=Nit.default.join(a,"dist","wasm","tree-sitter.wasm");try{return await $Wt.default.access(f),a}catch{return}}async analyzeFile(a){try{await this.ensureInitialized();let f=await this.fileReader.readFile(a);return this.analyzeFileFromContent(a,f)}catch(f){throw pg.fromError(f,a)}}analyzeFileFromContent(a,f){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileFromContent().");let S=this.parser.parse(f);if(!S)throw new Error(`Failed to parse Rust file: ${a}`);let y=new Map,A=$i(a);return this.extractSymbols(S.rootNode,A,f,y),y}analyzeFileContent(a,f){if(!this.parser)throw new Error("Parser not initialized. Call ensureInitialized() before using analyzeFileContent().");let S=this.parser.parse(f);if(!S)throw new Error(`Failed to parse Rust file: ${a}`);let y=new Map,A=[],O=$i(a);this.extractSymbols(S.rootNode,O,f,y);let Y=this.buildImportMap(S.rootNode,f);return this.extractDependencies(S.rootNode,O,f,A,y,void 0,Y),{symbols:Array.from(y.values()),dependencies:A}}async getSymbolDependencies(a){try{await this.ensureInitialized();let f=await this.fileReader.readFile(a);return this.analyzeFileContent(a,f).dependencies}catch(f){throw pg.fromError(f,a)}}extractSymbols(a,f,S,y,A){this.tryExtractSymbolFromNode(a,f,S,y,A)||this.extractSymbolsFromChildren(a,f,S,y,A)}tryExtractSymbolFromNode(a,f,S,y,A){return a.type==="function_item"?(this.handleFunctionItem(a,f,S,y,A),!0):a.type==="struct_item"?(this.handleStructItem(a,f,S,y,A),!0):a.type==="enum_item"?(this.handleEnumItem(a,f,S,y,A),!0):a.type==="trait_item"?(this.handleTraitItem(a,f,S,y,A),!0):a.type==="impl_item"?(this.handleImplItem(a,f,S,y,A),!0):!1}handleFunctionItem(a,f,S,y,A){let O=a.childForFieldName("name");if(!O)return;let Y=this.getNodeText(O,S),Ee=`${f}:${Y}`,Be=this.hasModifier(a,"async"),et=this.hasVisibilityModifier(a,"pub");y.set(Ee,{name:Y,kind:Be?"AsyncFunction":"FunctionDeclaration",line:O.startPosition.row+1,isExported:et,id:Ee,parentSymbolId:A,category:"function"}),this.extractSymbolsFromChildren(a,f,S,y,Ee)}handleStructItem(a,f,S,y,A){let O=a.childForFieldName("name");if(!O)return;let Y=this.getNodeText(O,S),Ee=`${f}:${Y}`,Be=this.hasVisibilityModifier(a,"pub");y.set(Ee,{name:Y,kind:"StructDeclaration",line:O.startPosition.row+1,isExported:Be,id:Ee,parentSymbolId:A,category:"class"}),this.extractSymbolsFromChildren(a,f,S,y,Ee)}handleEnumItem(a,f,S,y,A){let O=a.childForFieldName("name");if(!O)return;let Y=this.getNodeText(O,S),Ee=`${f}:${Y}`,Be=this.hasVisibilityModifier(a,"pub");y.set(Ee,{name:Y,kind:"EnumDeclaration",line:O.startPosition.row+1,isExported:Be,id:Ee,parentSymbolId:A,category:"type"}),this.extractSymbolsFromChildren(a,f,S,y,Ee)}handleTraitItem(a,f,S,y,A){let O=a.childForFieldName("name");if(!O)return;let Y=this.getNodeText(O,S),Ee=`${f}:${Y}`,Be=this.hasVisibilityModifier(a,"pub");y.set(Ee,{name:Y,kind:"InterfaceDeclaration",line:O.startPosition.row+1,isExported:Be,id:Ee,parentSymbolId:A,category:"type"}),this.extractSymbolsFromChildren(a,f,S,y,Ee)}handleImplItem(a,f,S,y,A){this.extractSymbolsFromChildren(a,f,S,y,A)}extractSymbolsFromChildren(a,f,S,y,A){for(let O of a.children)this.extractSymbols(O,f,S,y,A)}buildImportMap(a,f){let S=new Map,y=A=>{if(A.type==="use_declaration"&&this.extractUseDeclarationImports(A,f,S),A.type==="mod_item"){let O=A.childForFieldName("name");if(O){let Y=this.getNodeText(O,f);S.set(Y,Y)}}for(let O of A.children)y(O)};return y(a),S}extractUseDeclarationImports(a,f,S){this.extractFromUseLists(a,f,S),this.extractFromScopedIdentifiers(a,f,S),this.extractFromUseAsClauses(a,f,S)}extractFromUseLists(a,f,S){let y=this.findAllByType(a,"use_list");for(let A of y){let O=this.findBaseModuleForUseList(A,f);this.extractIdentifiersFromUseList(A,O,f,S)}}findBaseModuleForUseList(a,f){let S=a.parent;for(;S;){if(S.type==="scoped_use_list"){let y=this.findScopedIdentifierInChildren(S,f);if(y)return y}S=S.parent}return""}findScopedIdentifierInChildren(a,f){for(let S of a.children)if(S.type==="scoped_identifier")return this.getNodeText(S,f);return""}extractIdentifiersFromUseList(a,f,S,y){for(let A of a.children)if(A.type==="identifier"){let O=this.getNodeText(A,S);y.set(O,f)}}extractFromScopedIdentifiers(a,f,S){let y=this.findAllByType(a,"scoped_identifier");for(let A of y){if(this.hasAncestorOfType(A,"use_list"))continue;let O=this.getNodeText(A,f),{localName:Y,modulePath:Ee}=this.splitModulePath(O);S.set(Y,Ee)}}splitModulePath(a){let f=a.split("::"),S=f.at(-1)??"",y=f.slice(0,-1).join("::");return{localName:S,modulePath:y}}extractFromUseAsClauses(a,f,S){let y=this.findAllByType(a,"use_as_clause");for(let A of y){let O=A.childForFieldName("path"),Y=A.childForFieldName("alias");if(O&&Y){let Ee=this.getNodeText(O,f),Be=this.getNodeText(Y,f);S.set(Be,Ee)}}}extractDependencies(a,f,S,y,A,O,Y){let Ee=this.getScopeForNode(a,f,S,O);this.addCallDependencyIfAny(a,f,S,y,A,Ee,Y);for(let Be of a.children)this.extractDependencies(Be,f,S,y,A,Ee,Y)}getScopeForNode(a,f,S,y){if(a.type!=="function_item")return y;let A=a.childForFieldName("name");if(!A)return y;let O=this.getNodeText(A,S);return`${f}:${O}`}addCallDependencyIfAny(a,f,S,y,A,O,Y){if(a.type!=="call_expression")return;let Ee=a.childForFieldName("function");if(!Ee||!O)return;let{moduleName:Be,symbolName:et}=this.extractModuleAndSymbolName(Ee,S),ft=`${f}:${et}`;if(A.has(ft)){y.push({sourceSymbolId:O,targetSymbolId:ft,targetFilePath:f,isTypeOnly:!1});return}if(Be&&Y?.has(Be)){let he=Y.get(Be);if(he===void 0)return;y.push({sourceSymbolId:O,targetSymbolId:`${he}:${et}`,targetFilePath:he,isTypeOnly:!1});return}if(Y?.has(et)){let he=Y.get(et);if(he===void 0)return;y.push({sourceSymbolId:O,targetSymbolId:`${he}:${et}`,targetFilePath:he,isTypeOnly:!1})}}extractModuleAndSymbolName(a,f){if(a.type==="field_expression"){let S=a.childForFieldName("field");if(S)return{moduleName:void 0,symbolName:this.getNodeText(S,f)}}if(a.type==="scoped_identifier"){let y=this.getNodeText(a,f).split("::");if(y.length>=2){let A=y.at(-1)??"";return{moduleName:y.slice(0,-1).join("::"),symbolName:A}}return{moduleName:void 0,symbolName:y[0]}}return{moduleName:void 0,symbolName:this.getNodeText(a,f)}}hasVisibilityModifier(a,f){if(a.childForFieldName("visibility_modifier"))return!0;for(let y of a.children)if(y.type==="visibility_modifier")return!0;return!1}hasAncestorOfType(a,f){let S=a.parent;for(;S;){if(S.type===f)return!0;S=S.parent}return!1}hasModifier(a,f){for(let S of a.children)if(S.type===f)return!0;return!1}findAllByType(a,f){let S=[],y=A=>{A.type===f&&S.push(A);for(let O of A.children)y(O)};return y(a),S}getNodeText(a,f){return f.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,f,S,y){this.rootDir=a,this.extensionPath=S,this.ignoreTypeImports=y}getAnalyzer(a){let f=GC(a);return p.getAnalyzer(f,this.rootDir,this.extensionPath,this.ignoreTypeImports)}getSymbolAnalyzer(a){let f=GC(a);return p.getSymbolAnalyzer(f,this.rootDir,this.extensionPath)}static detectLanguage(a){let f=GC(a);switch(qWt.default.extname(f).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,f,S,y){let A=GC(a);switch(this.detectLanguage(A)){case"typescript":{let Y=this.buildCacheKey(f,y?"ignore-types":""),Ee=this.typeScriptParsers.get(Y);if(Ee)return Ee;let Be=new CDe(f,y);return this.typeScriptParsers.set(Y,Be),Be}case"python":{let Y=this.buildCacheKey(f,S),Ee=this.pythonParsers.get(Y);if(Ee)return Ee;let Be=new Dit(f,S);return this.pythonParsers.set(Y,Be),Be}case"rust":{let Y=this.buildCacheKey(f,S),Ee=this.rustParsers.get(Y);if(Ee)return Ee;let Be=new kit(f,S);return this.rustParsers.set(Y,Be),Be}case"csharp":{let Y=this.buildCacheKey(f,S),Ee=this.csharpParsers.get(Y);if(Ee)return Ee;let Be=new xit(f,S);return this.csharpParsers.set(Y,Be),Be}case"go":{let Y=this.buildCacheKey(f,S),Ee=this.goParsers.get(Y);if(Ee)return Ee;let Be=new Cit(f,S);return this.goParsers.set(Y,Be),Be}case"java":{let Y=this.buildCacheKey(f,S),Ee=this.javaParsers.get(Y);if(Ee)return Ee;let Be=new Ait(f,S);return this.javaParsers.set(Y,Be),Be}default:throw new Error(`Unsupported language for file: ${a}`)}}static getSymbolAnalyzer(a,f,S){let y=GC(a);switch(this.detectLanguage(y)){case"typescript":{let O=this.buildCacheKey(f),Y=this.typeScriptSymbolAnalyzers.get(O);if(Y)return Y;let Ee=new Tit(f);return this.typeScriptSymbolAnalyzers.set(O,Ee),Ee}case"python":{let O=this.buildCacheKey(f,S),Y=this.pythonSymbolAnalyzers.get(O);if(Y)return Y;let Ee=new Pit(f,S);return this.pythonSymbolAnalyzers.set(O,Ee),Ee}case"rust":{let O=this.buildCacheKey(f,S),Y=this.rustSymbolAnalyzers.get(O);if(Y)return Y;let Ee=new wit(f,S);return this.rustSymbolAnalyzers.set(O,Ee),Ee}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(f=>f??"").join("\0")}};zC();jC();var XWt=Hh("ReferencingFilesFinder"),tIe=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 f=$i(a),S=this.extractBasename(f);if(!S)return[];XWt.debug("findReferencingFilesFallback for",f,"basename:",S);let y=await this.sourceFileCollector.collectAllSourceFiles(this.getRootDir()),A=[],O=this.getConcurrency()??8;for(let Y=0;Y<y.length;Y+=O){let Ee=y.slice(Y,Y+O),Be=await Promise.all(Ee.filter(et=>$i(et)!==f).map(et=>this.findReferenceInFile(et,f,S)));for(let et of Be)et&&A.push(et)}return XWt.debug("findReferencingFilesFallback found",A.length,"referencing files"),A}extractBasename(a){return a.split(/[/\\]/).pop()?.replace(/\.[^/.]+$/,"")}};var QWt=bl(require("node:fs/promises"));jC();zC();var YWt=Hh("ReverseIndex"),BNt=1,Tae=class p{reverseMap=new Map;fileHashes=new Map;rootDir;constructor(a){this.rootDir=$i(a)}addDependencies(a,f,S){let y=$i(a);this.removeDependenciesFromSource(y);for(let A of f){let O=$i(A.path),Y={sourcePath:y,type:A.type,line:A.line,module:A.module},Ee=this.reverseMap.get(O);Ee||(Ee=new Map,this.reverseMap.set(O,Ee)),Ee.set(y,Y)}S&&this.fileHashes.set(y,S)}removeDependenciesFromSource(a){let f=$i(a);for(let[,S]of this.reverseMap)S.delete(f);this.fileHashes.delete(f)}getReferencingFiles(a){let f=$i(a),S=this.reverseMap.get(f);return S?.size===0?(this.reverseMap.delete(f),[]):S?Array.from(S.values()).map(y=>({path:y.sourcePath,type:y.type,line:y.line,module:y.module})):[]}getCallerCount(a){let f=$i(a);return this.reverseMap.get(f)?.size??0}isFileStale(a,f){let S=$i(a),y=this.fileHashes.get(S);return y?y.mtime!==f.mtime||y.size!==f.size:!0}getFileHash(a){return this.fileHashes.get($i(a))}updateFileHash(a,f){this.fileHashes.set($i(a),f)}hasEntries(){return this.reverseMap.size>0}hasFile(a){return this.fileHashes.has($i(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 f of this.reverseMap.values())f.size===0&&a++;return a}cleanup(){let a=0,f=[];for(let[S,y]of this.reverseMap)y.size===0&&f.push(S);for(let S of f)this.reverseMap.delete(S),a++;return a}static async getFileHashFromDisk(a){try{let f=await QWt.stat(a);return{mtime:f.mtimeMs,size:f.size}}catch{return null}}serialize(){let a={};for(let[S,y]of this.reverseMap)a[S]=Array.from(y.values());let f={};for(let[S,y]of this.fileHashes)f[S]=y;return{version:BNt,timestamp:Date.now(),rootDir:this.rootDir,reverseMap:a,fileHashes:f}}static deserialize(a,f){let S=$i(f),y=$i(a.rootDir);if(a.version!==BNt)return YWt.warn("Version mismatch:",a.version,"!==",BNt),null;if(y!==S)return YWt.warn("Root dir mismatch:",a.rootDir,"!==",f),null;let A=new p(f);for(let[O,Y]of Object.entries(a.fileHashes))A.fileHashes.set($i(O),Y);for(let[O,Y]of Object.entries(a.reverseMap)){let Ee=$i(O),Be=new Map;for(let et of Y){let ft=$i(et.sourcePath);Be.set(ft,{...et,sourcePath:ft})}A.reverseMap.set(Ee,Be)}return A}async validateIndex(a=.2){let f=[],S=[];for(let Y of this.fileHashes.keys()){let Ee=await p.getFileHashFromDisk(Y);if(!Ee){S.push(Y);continue}this.isFileStale(Y,Ee)&&f.push(Y)}let y=this.fileHashes.size,A=f.length+S.length,O=y>0?A/y:0;return{isValid:O<=a,staleFiles:f,stalePercentage:O,missingFiles:S}}getStats(){let a=0;for(let f of this.reverseMap.values())a+=f.size;return{indexedFiles:this.fileHashes.size,targetFiles:this.reverseMap.size,totalReferences:a}}};zNt();var iIe=class{constructor(a){this.rootDir=a}rootDir;reverseIndex=null;symbolReverseIndex=null;enable(a){let f=!1;if(this.reverseIndex??=new Tae(this.rootDir),this.symbolReverseIndex??=new nIe(this.rootDir),a)try{let S=JSON.parse(a),y=Tae.deserialize(S,this.rootDir);y&&(this.reverseIndex=y,f=!0)}catch{f=!1}return f}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 Tae(this.rootDir)}addDependencies(a,f,S){this.reverseIndex?.addDependencies(a,f,S)}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,f,S){this.symbolReverseIndex?.addDependencies(a,f,S)}removeSymbolDependenciesFromSource(a){this.symbolReverseIndex?.removeDependenciesFromSource(a)}getSymbolReferencingFiles(a){return this.symbolReverseIndex?.getCallerFiles(a)??[]}getSymbolStats(){return this.symbolReverseIndex?.getStats()}};eTe();eTe();jC();var oIe=class{constructor(a,f,S){this.dependencyCache=a;this.symbolCache=f;this.reverseIndexManager=S}dependencyCache;symbolCache;reverseIndexManager;clearAll(){this.dependencyCache.clear(),this.symbolCache.clear(),this.reverseIndexManager.clear()}invalidateFile(a){let f=$i(a),S=this.dependencyCache.has(f);return this.dependencyCache.delete(f),this.symbolCache.delete(f),this.reverseIndexManager.removeDependenciesFromSource(f),S}invalidateFiles(a){let f=0;for(let S of a)this.invalidateFile(S)&&f++;return f}handleFileDeleted(a){let f=$i(a);this.dependencyCache.delete(f),this.symbolCache.delete(f),this.reverseIndexManager.removeDependenciesFromSource(f)}};jC();zC();var tTe=Hh("SpiderDependencyAnalyzer"),aIe=class{constructor(a,f,S,y){this.languageService=a;this.resolver=f;this.dependencyCache=S;this.reverseIndexManager=y}languageService;resolver;dependencyCache;reverseIndexManager;async analyze(a){let f=$i(a),S=this.dependencyCache.get(f);if(S)return tTe.debug(`Returning ${S.length} cached dependencies for ${a}`),await this.updateReverseIndexIfEnabled(a,f,S),S;tTe.debug(`Analyzing ${a}...`);try{let y=this.languageService.getAnalyzer(a),A=await y.parseImports(a);tTe.debug(`Parsed ${A.length} imports from ${a}`);let O=[],Y=new Set;for(let Ee of A){let Be=await y.resolvePath(a,Ee.module);if(!Be){tTe.debug(`Failed to resolve module "${Ee.module}" from ${a}`);continue}let et=$i(Be);Y.has(et)||(Y.add(et),O.push({path:et,type:Ee.type,line:Ee.line,module:Ee.module}))}return tTe.debug(`Resolved ${O.length} dependencies for ${a}`),this.dependencyCache.set(f,O),await this.updateReverseIndexIfEnabled(a,f,O),O}catch(y){let A=pg.fromError(y,a);if(A.code==="FILE_TOO_LARGE"||A.code==="TIMEOUT")return tTe.warn(`Skipping ${a}: ${A.toUserMessage()}`),[];throw tTe.error("Analysis failed:",A.toUserMessage(),A.code),A}}async resolveModuleSpecifier(a,f){try{return await this.resolver.resolve(a,f)}catch{return null}}invalidateDependencyCache(a){this.dependencyCache.delete($i(a))}async updateReverseIndexIfEnabled(a,f,S){if(!this.reverseIndexManager.isEnabled()||S.length===0)return;let y=await Tae.getFileHashFromDisk(a);y&&this.reverseIndexManager.addDependencies(f,S,y)}};jC();EDe();jC();function nTe(p){let f=$i(p).split("/");for(let S=0;S<f.length-1;S++)if(BQe.includes(f[S]))return!0;return!1}zC();var xae=Hh("SpiderGraphCrawler"),sIe=class{constructor(a,f){this.dependencyAnalyzer=a;this.getConfig=f}dependencyAnalyzer;getConfig;async crawl(a){let f=new Set,S=[],y=new Set,A=new Set,O={};xae.debug(`Starting crawl from: ${a}`);let Y=async(Ee,Be)=>{let et=$i(Ee),ft=this.getConfig().maxDepth??3;if(Be>ft){xae.debug(`Skipping ${Ee}: max depth ${ft} reached`);return}if(A.has(et)){xae.debug(`Skipping ${Ee}: already visited`);return}A.add(et),f.add(et);try{let he=await this.dependencyAnalyzer.analyze(Ee);xae.debug(`Found ${he.length} dependencies for ${Ee}`);for(let hn of he){f.add(hn.path);let mt=`${et}->${hn.path}`;y.has(mt)||(y.add(mt),S.push({source:et,target:hn.path}),xae.debug(`Added edge: ${et} -> ${hn.path}`)),hn.module.startsWith("@")&&hn.module.includes("/")&&!hn.module.startsWith("@/")&&(O[hn.path]=hn.module),nTe(hn.path)?xae.debug(`Skipping ${hn.path}: in ignored directory`):await Y(hn.path,Be+1)}}catch(he){xae.debug(`Failed to analyze ${Ee}: ${he}`)}};return await Y(a,0),xae.debug(`Crawl completed: ${f.size} nodes, ${S.length} edges`),{nodes:Array.from(f),edges:S,nodeLabels:Object.keys(O).length>0?O:void 0}}async crawlFrom(a,f,S=10,y){let A=new Set,O=[],Y=new Set,Ee={},Be=new Set(Array.from(f).map(ar=>$i(ar))),et=$i(a),ft=new Set,he=[],hn=new Set,mt={},Et=y?.batchSize??200,xi=()=>{if(y?.signal?.aborted){let ar=new Error("Expansion cancelled");throw ar.name="AbortError",ar}},fi=(ar,jn)=>jn>S?!0:ar===et?jn!==0&&Y.has(ar):Y.has(ar),Vi=ar=>{Be.has(ar)||(A.add(ar),ft.add(ar))},is=(ar,jn)=>{let ao=`${jn}->${ar.path}`;hn.has(ao)||(hn.add(ao),O.push({source:jn,target:ar.path}),he.push({source:jn,target:ar.path})),!Y.has(ar.path)&&!Be.has(ar.path)&&(A.add(ar.path),ft.add(ar.path)),ar.module.startsWith("@")&&ar.module.includes("/")&&!ar.module.startsWith("@/")&&(Ee[ar.path]=ar.module,mt[ar.path]=ar.module)},Rs=async()=>{if(!y?.onBatch){ft.clear(),he.length=0;return}if(ft.size===0&&he.length===0)return;let ar={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(ar)},us=async(ar,jn)=>{xi();let ao=$i(ar);if(!fi(ao,jn)){Y.add(ao),Vi(ao);try{let vi=await this.dependencyAnalyzer.analyze(ar);for(let Fi of vi)is(Fi,ao),nTe(Fi.path)||await us(Fi.path,jn+1);ft.size+he.length>=Et&&await Rs()}catch{}}};return await us(a,0),await Rs(),{nodes:Array.from(A),edges:O,nodeLabels:Object.keys(Ee).length>0?Ee:void 0}}};var cIe=class{cancelled=!1;reset(){this.cancelled=!1}cancel(){this.cancelled=!0}isCancelled(){return this.cancelled}};zC();jC();function lIe(){return new Promise(p=>setTimeout(p,1))}var uIe=50;var rTe=Hh("SpiderIndexingService"),dIe=class{constructor(a,f,S,y,A,O,Y,Ee,Be,et){this.dependencyAnalyzer=a;this.dependencyCache=f;this.reverseIndexManager=S;this.sourceFileCollector=y;this.indexerStatus=A;this.workerManager=O;this.cancellation=Y;this.getConfig=Ee;this.yieldToEventLoop=Be;this.getSymbolGraph=et}dependencyAnalyzer;dependencyCache;reverseIndexManager;sourceFileCollector;indexerStatus;workerManager;cancellation;getConfig;yieldToEventLoop;getSymbolGraph;cancel(){this.cancellation.cancel(),this.workerManager.cancel()}disposeWorker(){this.workerManager.dispose()}async analyzeFileForIndex(a,f){try{if(await this.dependencyAnalyzer.analyze(a),this.getSymbolGraph&&f<(this.getConfig().maxSymbolAnalyzerFiles??100))try{let S=await this.getSymbolGraph(a);S.dependencies.length>0&&this.reverseIndexManager.addSymbolDependencies(a,S.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 f=await this.sourceFileCollector.collectAllSourceFiles(this.getConfig().rootDir),S=this.checkCancellation(0);if(S)return S;let y=f.length;this.indexerStatus.setTotal(y),await this.yieldToEventLoop(),this.indexerStatus.startIndexing();let A=0,O=Date.now();try{for(let Be of f){let et=this.checkCancellation(A);if(et)return et;await this.analyzeFileForIndex(Be,A),A++,this.indexerStatus.updateProgress(A,Be),a?.(A,y,Be),Date.now()-O>=uIe&&(await this.yieldToEventLoop(),O=Date.now())}this.indexerStatus.complete();let Y=this.indexerStatus.getSnapshot(),Ee=Date.now()-(Y.startTime??Date.now());return{indexedFiles:A,duration:Ee,cancelled:!1}}catch(Y){let Ee=pg.fromError(Y);throw this.indexerStatus.setError(Ee.toUserMessage()),rTe.error("Indexing failed:",Ee.toUserMessage(),Ee.code),Ee}}async buildFullIndexInWorker(a,f){let S=this.getConfig();return this.workerManager.buildFullIndexInWorker({workerPath:a,progressCallback:f,config:{rootDir:S.rootDir,excludeNodeModules:S.excludeNodeModules,tsConfigPath:S.tsConfigPath,progressInterval:S.indexingProgressInterval,extensionPath:S.extensionPath,ignoreTypeImports:S.ignoreTypeImports}})}async reindexStaleFiles(a,f){if(!this.reverseIndexManager.isEnabled())return 0;rTe.info(`Re-indexing ${a.length} stale files`);let S=this.getConfig().indexingConcurrency??8,y=0;for(let A=0;A<a.length;A+=S){let O=a.slice(A,A+S);await Promise.all(O.map(async Y=>{let Ee=$i(Y);rTe.debug(`Re-indexing stale file: ${Y}`);try{this.reverseIndexManager.removeDependenciesFromSource(Ee),this.dependencyCache.delete(Ee),rTe.debug(`Deleted cache for ${Y}, re-analyzing...`),await this.dependencyAnalyzer.analyze(Y),rTe.debug(`Successfully re-analyzed ${Y}`)}catch(Be){rTe.error(`Failed to re-index ${Y}:`,Be),this.reverseIndexManager.removeDependenciesFromSource(Ee)}})),y+=O.length,f?.(y,a.length,O.at(-1)),await this.yieldToEventLoop()}return rTe.info(`Completed re-indexing ${y} files`),y}};jC();var fIe=class{constructor(a,f,S,y=()=>!0,A=()=>!1){this.reverseIndexManager=a;this.dependencyAnalyzer=f;this.fileReader=S;this.isIndexReady=y;this.isIndexingActive=A}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 f=$i(a),S=this.reverseIndexManager.hasEntries();if(S&&this.isIndexReady())return this.reverseIndexManager.getReferencingFiles(f);let y=S?this.reverseIndexManager.getReferencingFiles(f):[];if(S&&!this.isIndexingActive()||!this.fallbackFinder)return y;let A=await this.getFallbackReferencingFiles(f);return y.length===0?A:A.length===0?y:this.mergeDependencies(y,A)}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 S=await this.fallbackFinder.findReferencingFilesFallback(a);return this._fallbackCache.set(a,S),this._fallbackCacheEntryVersion.set(a,this._fallbackCacheVersion),S}mergeDependencies(a,f){let S=new Map;for(let y of[...a,...f]){let A=$i(y.path);S.has(A)||S.set(A,y)}return[...S.values()]}async findReferenceInFile(a,f,S){try{if(!(await this.fileReader.readFile(a)).includes(S))return null;let O=(await this.dependencyAnalyzer.analyze(a)).find(Y=>$i(Y.path)===f);return O?{path:$i(a),type:O.type,line:O.line,module:O.module}:null}catch{return null}}};var jNt=bl(require("node:path"));EDe();zC();eTe();jC();var Eae=Hh("SpiderSymbolService"),pIe=class{constructor(a,f,S,y,A,O,Y,Ee){this.astWorkerHost=a;this.symbolCache=f;this.fileReader=S;this.resolver=y;this.symbolDependencyHelper=A;this.getConfig=O;this.findReferencingFiles=Y;this.languageService=Ee}astWorkerHost;symbolCache;fileReader;resolver;symbolDependencyHelper;getConfig;findReferencingFiles;languageService;async getSymbolGraph(a){if(!jNt.default.isAbsolute(a))try{let y=await this.resolveModuleSpecifier(this.getConfig().rootDir,a);y&&(a=y)}catch{}let f=$i(a),S=this.symbolCache.get(f);if(S)return S;try{let y=await this.fileReader.readFile(a),A=await this.astWorkerHost.analyzeFile(f,y),O=await Promise.all(A.dependencies.map(async Ee=>{try{let et=await this.languageService.getAnalyzer(f).resolvePath(f,Ee.targetFilePath);if(et)return{...Ee,targetFilePath:$i(et)}}catch{}return Ee})),Y={symbols:A.symbols,dependencies:O};return this.symbolCache.set(f,Y),Y}catch(y){let A=pg.fromError(y,a);if(Eae.error("Symbol analysis failed:",A.toUserMessage()),A.isRecoverable())return{symbols:[],dependencies:[]};throw A}}async findUnusedSymbols(a){try{let f=$i(a),{symbols:S}=await this.getSymbolGraph(f),y=S.filter(et=>et.isExported);if(y.length===0)return[];let A=await this.findReferencingFiles(f),O=await this.collectUsedSymbolIds(A,f),Y=await this.fileReader.readFile(f),Ee=await this.astWorkerHost.getInternalExportDependencyGraph(f,Y),Be=this.expandUsedSymbolsViaInternalGraph(O,Ee);return y.filter(et=>!Be.has(et.id))}catch(f){let S=pg.fromError(f,a);return Eae.error("Find unused symbols failed:",S.toUserMessage()),[]}}async getSymbolDependents(a,f){let S=await this.findReferencingFiles(a);return this.collectSymbolDependents(S,a,f)}async traceFunctionExecution(a,f,S=10){let y=`${a}:${f}`,A=[],O=new Set,Y=!1,Ee=async(Be,et,ft)=>{if(ft>S){Y=!0;return}let he=`${Be}:${et}`;if(!O.has(he)){O.add(he);try{let{symbols:hn,dependencies:mt}=await this.getSymbolGraph(Be),Et=hn.find(fi=>fi.name===et);if(!Et)return;let xi=mt.filter(fi=>fi.sourceSymbolId===Et.id);for(let fi of xi){let Vi=null;try{Vi=await this.resolver.resolve(Be,fi.targetFilePath)}catch{}let is=fi.targetSymbolId.split(":").pop()||"";A.push({depth:ft,callerSymbolId:he,calledSymbolId:fi.targetSymbolId,calledFilePath:fi.targetFilePath,resolvedFilePath:Vi}),Vi&&!nTe(Vi)&&await Ee(Vi,is,ft+1)}}catch(hn){let mt=pg.fromError(hn,Be);Eae.error("Trace execution failed:",he,mt.toUserMessage())}}};return await Ee(a,f,1),{rootSymbol:{id:y,filePath:a,symbolName:f},callChain:A,visitedSymbols:Array.from(O),maxDepthReached:Y}}async resolveModuleSpecifier(a,f){try{return await this.resolver.resolve(a,f)}catch{return null}}expandUsedSymbolsViaInternalGraph(a,f){let S=new Set(a),y=Array.from(S);for(;y.length>0;){let A=y.pop();if(A===void 0)continue;let O=f.get(A);if(O)for(let Y of O)S.has(Y)||(S.add(Y),y.push(Y))}return S}async collectUsedSymbolIds(a,f){let S=new Set;for(let y of a){let{dependencies:A}=await this.getSymbolGraph(y.path);for(let O of A)if(await this.symbolDependencyHelper.doesDependencyTargetFile(O,y.path,f)){let Ee=this.symbolDependencyHelper.extractSymbolName(O.targetSymbolId);S.add(this.symbolDependencyHelper.buildUsedSymbolId(f,Ee))}}return S}async collectSymbolDependents(a,f,S){let y=[],A=$i(f);for(let O of a){let{dependencies:Y}=await this.getSymbolGraph(O.path);for(let Ee of Y)await this.symbolDependencyHelper.doesDependencyTargetFile(Ee,O.path,A)&&this.symbolDependencyHelper.extractSymbolName(Ee.targetSymbolId)===S&&y.push(Ee)}return y}async verifyDependencyUsage(a,f){try{let S=$i(a),y=$i(f);if(nTe(y))return!0;if(this.isAstUnsupportedFile(S))return Eae.debug(`Skipping symbol analysis for unsupported file type: ${S}`),!0;let{dependencies:A}=await this.getSymbolGraph(S);if(A.length===0)return!1;let O=y.split("/").pop()||"",Y=A.filter(Ee=>Ee.targetFilePath===y||Ee.targetFilePath.includes(O)||!Ee.targetFilePath.startsWith("/"));for(let Ee of Y)if(await this.symbolDependencyHelper.doesDependencyTargetFile(Ee,S,y))return!0;return!1}catch(S){let y=pg.fromError(S,a);return Eae.warn("Usage verification failed, assuming used:",y.message),!0}}async verifyDependencyUsageBatch(a,f){try{let S=$i(a);if(this.isAstUnsupportedFile(S))return Eae.debug(`Skipping symbol analysis for unsupported file type: ${S}`),this.markAllAsUsed(f);let{dependencies:y}=await this.getSymbolGraph(S);if(y.length===0)return this.markAllAsUnused(f);let A=await this.buildResolvedTargetsSet(y,S);return this.checkTargetsAgainstResolved(f,A)}catch(S){let y=pg.fromError(S,a);return Eae.warn("Batch usage verification failed, assuming all used:",y.message),this.markAllAsUsed(f)}}markAllAsUsed(a){let f=new Map;for(let S of a)f.set($i(S),!0);return f}markAllAsUnused(a){let f=new Map;for(let S of a)f.set($i(S),!1);return f}async buildResolvedTargetsSet(a,f){let S=new Set;for(let y of a)try{let A=await this.symbolDependencyHelper.resolveTargetPath(y,f);A&&S.add($i(A))}catch{}return S}checkTargetsAgainstResolved(a,f){let S=new Map;for(let y of a){let A=$i(y);if(nTe(A)){S.set(A,!0);continue}S.set(A,f.has(A))}return S}isAstUnsupportedFile(a){return a.endsWith(".gql")||a.endsWith(".graphql")||a.endsWith(".cs")||a.endsWith(".csproj")||a.endsWith(".go")||a.endsWith(".java")}async scanDeadCode(a,f){let{maxFiles:S=500,hasReverseIndex:y}=f;if(!y)throw new pg("Dead code scan requires the reverse index. Wait for indexing to complete or call rebuild_index first.","INDEX_NOT_READY");let A=this.getConfig(),Y=await new KF({excludeNodeModules:A.excludeNodeModules??!0}).collectAllSourceFiles(a),Ee=new Set(TGe),et=Y.filter(hn=>{let mt=jNt.default.extname(hn).toLowerCase();return Ee.has(mt)}).slice(0,S),ft=[],he=0;for(let hn of et)try{let mt=await this.findUnusedSymbols(hn);mt.length>0&&ft.push({filePath:hn,unusedSymbols:mt})}catch(mt){let Et=pg.fromError(mt,hn);Eae.warn("scanDeadCode: skipping file due to error:",hn,Et.message),he++}return{entries:ft,scannedFiles:et.length,skippedFiles:he}}};var a9t=require("node:worker_threads"),s9t=bl(require("node:path")),Rit=class{worker=null;statusCallbacks=new Set;currentState="idle";currentProgress=0;currentTotal=0;currentFile="";startTime=void 0;cancelled=!1;workerPath;constructor(a){this.workerPath=a??s9t.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 f of this.statusCallbacks)try{f(a)}catch{}}updateState(a,f=0,S=0,y=""){this.currentState=a,this.currentProgress=f,this.currentTotal=S,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 f=a.timeoutMs??600*1e3;return new Promise((S,y)=>{let A=Ee=>{clearTimeout(Y),S(Ee)},O=Ee=>{clearTimeout(Y),y(Ee)},Y=setTimeout(()=>{this.cancel(),this.updateState("error"),this.cleanupWorker(),y(new Error(`Indexing timed out after ${Math.round(f/6e4)} minute(s)`))},f);try{this.worker=new a9t.Worker(this.workerPath,{workerData:a});let Ee={indexedFiles:0,duration:0,cancelled:!1,data:[]};this.worker.on("message",Be=>{switch(Be.type){case"counting":this.updateState("counting");break;case"progress":Be.data&&this.updateState("indexing",Be.data.processed??0,Be.data.total??0,Be.data.currentFile??"");break;case"complete":Be.data&&(Ee={indexedFiles:Be.data.processed??0,duration:Be.data.duration??0,cancelled:this.cancelled,data:Be.data.indexData??[]}),this.updateState("complete"),this.cleanupWorker(),A(Ee);break;case"error":this.updateState("error"),this.cleanupWorker(),O(new Error(Be.error??"Unknown worker error"));break}}),this.worker.on("error",Be=>{this.updateState("error"),this.cleanupWorker(),O(Be)}),this.worker.on("exit",Be=>{Be!==0&&this.currentState!=="complete"&&this.currentState!=="error"&&(this.updateState("error"),this.cleanupWorker(),O(new Error(`Worker stopped with exit code ${Be}`)))}),this.worker.postMessage({type:"start"})}catch(Ee){this.updateState("error"),this.cleanupWorker(),O(Ee)}})}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()}};jC();var _Ie=class{constructor(a,f,S){this.indexerStatus=a;this.reverseIndexManager=f;this.dependencyCache=S}indexerStatus;reverseIndexManager;dependencyCache;workerHost=null;async buildFullIndexInWorker(a){let{workerPath:f,config:S,progressCallback:y}=a;this.workerHost??=new Rit(f),this.reverseIndexManager.ensure();let A=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:S.rootDir,excludeNodeModules:S.excludeNodeModules,tsConfigPath:S.tsConfigPath,extensionPath:S.extensionPath,ignoreTypeImports:S.ignoreTypeImports});return this.importWorkerResult(O),{indexedFiles:O.indexedFiles,duration:O.duration,cancelled:O.cancelled}}finally{A()}}cancel(){this.workerHost?.cancel()}dispose(){this.workerHost?.dispose(),this.workerHost=null}importWorkerResult(a){for(let f of a.data){let S=$i(f.filePath);this.dependencyCache.set(S,f.dependencies),this.reverseIndexManager.addDependencies(S,f.dependencies,{mtime:f.mtime,size:f.size})}}};jC();zC();var mIe=Hh("SymbolDependencyHelper"),hIe=class{resolveFn;constructor(a){this.resolveFn=a.resolve}async doesDependencyTargetFile(a,f,S){let y=$i(a.targetFilePath),A=$i(S);if(mIe.debug(`Comparing: dep.targetFilePath='${y}' vs targetFilePath='${A}'`),y===A)return mIe.debug("\u2713 Direct match"),!0;mIe.debug(`Attempting fallback resolution for '${a.targetFilePath}' from '${f}'`);let O=await this.resolveFn(f,a.targetFilePath);if(O){let Y=$i(O);mIe.debug(`Resolved to: '${Y}'`);let Ee=Y===A;return mIe.debug(Ee?"\u2713 Fallback match":"\u2717 No match after resolution"),Ee}return mIe.debug("\u2717 Resolution failed, no match"),!1}extractSymbolName(a){return a.split(":").pop()||""}extractBasename(a){return a.split(/[/\\]/).pop()?.replace(/\.[^/.]+$/,"")}buildUsedSymbolId(a,f){return`${$i(a)}:${f}`}async resolveTargetPath(a,f){let S=$i(a.targetFilePath);if(S.startsWith("/")||/^[a-zA-Z]:\//.test(S))return S;try{let y=await this.resolveFn(f,a.targetFilePath);return y?$i(y):null}catch{return null}}};var Mit=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 f=a;this.config=f.config,this.languageService=f.languageService,this.resolver=f.resolver,this.cache=f.cache,this.symbolCache=f.symbolCache,this.fileReader=f.fileReader,this.astWorkerHost=f.astWorkerHost,this.reverseIndexManager=f.reverseIndexManager,this.indexerStatus=f.indexerStatus,this.workerManager=f.workerManager,this.cancellation=f.cancellation,this.sourceFileCollector=f.sourceFileCollector,this.referencingFilesFinder=f.referencingFilesFinder,this.symbolDependencyHelper=f.symbolDependencyHelper,this.dependencyAnalyzer=f.dependencyAnalyzer,this.referenceLookup=f.referenceLookup,this.symbolService=f.symbolService,this.graphCrawler=f.graphCrawler,this.indexingService=f.indexingService,this.cacheCoordinator=f.cacheCoordinator}else{let f=a;this.config={maxDepth:50,excludeNodeModules:!0,enableReverseIndex:!1,indexingConcurrency:4,maxCacheSize:500,maxSymbolCacheSize:200,maxSymbolAnalyzerFiles:100,...f},this.languageService=new eIe(f.rootDir,f.tsConfigPath,f.extensionPath),this.resolver=new PH(f.tsConfigPath,this.config.excludeNodeModules,f.rootDir),this.cache=new cae({maxSize:this.config.maxCacheSize,enableLRU:!0}),this.symbolCache=new cae({maxSize:this.config.maxSymbolCacheSize,enableLRU:!0}),this.astWorkerHost=new aae(void 0,f.extensionPath),this.reverseIndexManager=new iIe(this.config.rootDir),this.fileReader=new Lx,this.indexerStatus=new ADe,this.cancellation=new cIe,this.workerManager=new _Ie(this.indexerStatus,this.reverseIndexManager,this.cache),this.dependencyAnalyzer=new aIe(this.languageService,this.resolver,this.cache,this.reverseIndexManager),this.sourceFileCollector=new KF({excludeNodeModules:this.config.excludeNodeModules??!0,yieldIntervalMs:uIe,yieldCallback:()=>lIe(),isCancelled:()=>this.cancellation.isCancelled()}),this.referenceLookup=new fIe(this.reverseIndexManager,this.dependencyAnalyzer,this.fileReader,()=>this.indexerStatus.isReady(),()=>this.indexerStatus.isActive()),this.referencingFilesFinder=new tIe({sourceFileCollector:this.sourceFileCollector,getRootDir:()=>this.config.rootDir,getConcurrency:()=>this.config.indexingConcurrency,findReferenceInFile:(S,y,A)=>this.referenceLookup.findReferenceInFile(S,y,A)}),this.referenceLookup.setFallbackFinder(this.referencingFilesFinder),this.symbolDependencyHelper=new hIe({resolve:async(S,y)=>{try{return await this.resolver.resolve(S,y)}catch{return null}}}),this.symbolService=new pIe(this.astWorkerHost,this.symbolCache,this.fileReader,this.resolver,this.symbolDependencyHelper,()=>this.config,S=>this.findReferencingFiles(S),this.languageService),this.graphCrawler=new sIe(this.dependencyAnalyzer,()=>this.config),this.indexingService=new dIe(this.dependencyAnalyzer,this.cache,this.reverseIndexManager,this.sourceFileCollector,this.indexerStatus,this.workerManager,this.cancellation,()=>this.config,()=>lIe(),S=>this.symbolService.getSymbolGraph(S)),this.cacheCoordinator=new oIe(this.cache,this.symbolCache,this.reverseIndexManager),f.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 f=this.reverseIndexManager.enable(a);return this.config.enableReverseIndex=!0,f}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,f){return this.indexingService.buildFullIndexInWorker(a,f)}disposeWorker(){this.indexingService.disposeWorker()}async reindexStaleFiles(a,f){return this.indexingService.reindexStaleFiles(a,f)}async crawl(a){return this.graphCrawler.crawl(a)}async crawlFrom(a,f,S=10,y){return this.graphCrawler.crawlFrom(a,f,S,y)}async findReferencingFiles(a){return this.referenceLookup.findReferencingFiles(a)}getSymbolReferencingFiles(a){if(!this.reverseIndexManager.hasEntries())return new Set;let f=this.reverseIndexManager.getSymbolReferencingFiles(a);return new Set(f)}async getSymbolGraph(a){return this.symbolService.getSymbolGraph(a)}async resolveModuleSpecifier(a,f){return this.dependencyAnalyzer.resolveModuleSpecifier(a,f)}async findUnusedSymbols(a){return this.symbolService.findUnusedSymbols(a)}async scanDeadCode(a,f){let S=a??this.config.rootDir;return this.symbolService.scanDeadCode(S,{maxFiles:f?.maxFiles,hasReverseIndex:this.hasReverseIndex()})}async verifyDependencyUsage(a,f){return this.symbolService.verifyDependencyUsage(a,f)}async verifyDependencyUsageBatch(a,f){return this.symbolService.verifyDependencyUsageBatch(a,f)}async getSymbolDependents(a,f){return this.symbolService.getSymbolDependents(a,f)}async traceFunctionExecution(a,f,S=10){return this.symbolService.traceFunctionExecution(a,f,S)}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 Lit=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 Mit(a)}initializeServices(){let a=this.buildConfig(),f=this.customLanguageService??new eIe(this.rootDir,this.tsConfigPath,this.extensionPath,this.ignoreTypeImports),S=this.customPathResolver??new PH(this.tsConfigPath,this.excludeNodeModules,this.rootDir),y=this.customCache??new cae({maxSize:this.maxCacheSize,enableLRU:!0}),A=this.customSymbolCache??new cae({maxSize:this.maxSymbolCacheSize,enableLRU:!0}),O=this.customAstWorkerHost??new aae(void 0,this.extensionPath),Y=this.customReverseIndexManager??new iIe(this.rootDir),Ee=new Lx,Be=new ADe,et=new cIe,ft=new _Ie(Be,Y,y),he=new aIe(f,S,y,Y),hn=new KF({excludeNodeModules:this.excludeNodeModules,yieldIntervalMs:uIe,yieldCallback:()=>lIe(),isCancelled:()=>et.isCancelled()}),mt=new fIe(Y,he,Ee,()=>Be.isReady(),()=>Be.isActive()),Et=new tIe({sourceFileCollector:hn,getRootDir:()=>this.rootDir,getConcurrency:()=>this.indexingConcurrency,findReferenceInFile:(us,ar,jn)=>mt.findReferenceInFile(us,ar,jn)});mt.setFallbackFinder(Et);let xi=new hIe({resolve:async(us,ar)=>{try{return await S.resolve(us,ar)}catch{return null}}}),fi=new pIe(O,A,Ee,S,xi,()=>a,us=>mt.findReferencingFiles(us),f),Vi=new sIe(he,()=>a),is=new dIe(he,y,Y,hn,Be,ft,et,()=>a,()=>lIe(),us=>fi.getSymbolGraph(us)),Rs=new oIe(y,A,Y);return this.enableReverseIndex&&Y.enable(),{config:a,languageService:f,resolver:S,cache:y,symbolCache:A,fileReader:Ee,astWorkerHost:O,reverseIndexManager:Y,indexerStatus:Be,workerManager:ft,cancellation:et,sourceFileCollector:hn,referencingFilesFinder:Et,symbolDependencyHelper:xi,dependencyAnalyzer:he,referenceLookup:mt,symbolService:fi,graphCrawler:Vi,indexingService:is,cacheCoordinator:Rs}}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}}};rw();zC();cR();var VNt=class{constructor(a,f="info",S=[]){this.source=a;this.entries=S;this.level=f}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,f){this.entries.length>=1e3&&this.entries.shift(),this.entries.push({level:a,source:this.source,message:f,timestamp:Date.now()})}getEntries(){return[...this.entries]}clear(){this.entries.length=0}},Oit=class{sharedEntries=[];createLogger(a,f){return new VNt(a,f??"info",this.sharedEntries)}getCollectedEntries(){return[...this.sharedEntries]}clear(){this.sharedEntries.length=0}getErrorCount(){let a=0,f=0;for(let S of this.sharedEntries)S.level==="error"?a+=1:S.level==="warn"&&(f+=1);return{errors:a,warnings:f,total:this.sharedEntries.length}}};MQe({createLogger(p,a){return new SGe(p,a)}});oae.setDefaultLevel(u4t("LOG_LEVEL"));var UNt=Hh("CliRuntime");function HNt(p){let a=lR.resolve(p),{root:f}=lR.parse(a);for(;a!==f;){if(HH.existsSync(lR.join(a,"package.json"))||HH.existsSync(lR.join(a,"tsconfig.json")))return a;a=lR.dirname(a)}return lR.resolve(p)}function Fen(p){let a=lR.join(p,"tsconfig.json");return HH.existsSync(a)?a:void 0}var tVe=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 Oit,MQe(this.errorCollectorBackend))}disableErrorCollection(){if(!this.errorCollectorBackend)return[];let a=this.errorCollectorBackend.getCollectedEntries();return MQe({createLogger(f,S){return new SGe(f,S)}}),this.errorCollectorBackend=null,a}getCollectedErrors(){return this.errorCollectorBackend?.getCollectedEntries()??[]}clearCollectedErrors(){this.errorCollectorBackend?.clear()}async init(){if(this._initialized)return;HH.mkdirSync(this.stateDir,{recursive:!0});let a=Fen(this.workspaceRoot);ml.parser=new CDe,ml.resolver=new PH(a,!0,this.workspaceRoot);let f=lR.resolve(__dirname,"..");ml.astWorkerHost=new aae(void 0,f),await ml.astWorkerHost.start();let S=new Lit().withRootDir(this.workspaceRoot).withMaxDepth(50).withExcludeNodeModules(!0).withReverseIndex(!0).withExtensionPath(f);a&&S.withTsConfigPath(a),ml.spider=S.build(),ml.config={rootDir:this.workspaceRoot,tsConfigPath:a,excludeNodeModules:!0,maxDepth:50,extensionPath:f},ml.isReady=!0,this._initialized=!0,UNt.info("Runtime initialized for",this.workspaceRoot)}async ensureIndexed(a){if(!this._initialized||!ml.spider)throw new jm("Runtime not initialized. Call init() first.",Wp.WORKSPACE_NOT_FOUND);if(this._indexReady){let O=ml.warmupInfo;return{filesIndexed:O?.filesIndexed??0,durationMs:O?.durationMs??0}}let f=ml.spider,S=Date.now(),y=a?.silent??!1,A=f.subscribeToIndexStatus(O=>{!y&&O.state==="indexing"&&process.stderr.write(`\r Indexing: ${O.processed}/${O.total} files...`)});try{let O=await f.buildFullIndex(),Y=Date.now()-S;return y||process.stderr.write(`
|
|
43249
|
-
`),UNt.info("Indexed",O.indexedFiles,"files in",O.duration,"ms"),this.saveState({lastScanTimestamp:new Date().toISOString(),filesIndexed:O.indexedFiles,workspaceRoot:this.workspaceRoot}),ml.warmupInfo={completed:!0,durationMs:O.duration,filesIndexed:O.indexedFiles},this._indexReady=!0,{filesIndexed:O.indexedFiles,durationMs:Y}}finally{A()}}async dispose(){ml.astWorkerHost&&await ml.astWorkerHost.stop(),ml.spider&&await ml.spider.dispose(),ml.reset(),this._initialized=!1,this._indexReady=!1}saveState(a){try{HH.writeFileSync(lR.join(this.stateDir,"state.json"),JSON.stringify(a,null,2))}catch(f){UNt.warn("Could not save state:",f instanceof Error?f.message:String(f))}}loadState(){try{let a=HH.readFileSync(lR.join(this.stateDir,"state.json"),"utf-8");return JSON.parse(a)}catch{return null}}};$Nt();var H6t="1.13.
|
|
43249
|
+
`),UNt.info("Indexed",O.indexedFiles,"files in",O.duration,"ms"),this.saveState({lastScanTimestamp:new Date().toISOString(),filesIndexed:O.indexedFiles,workspaceRoot:this.workspaceRoot}),ml.warmupInfo={completed:!0,durationMs:O.duration,filesIndexed:O.indexedFiles},this._indexReady=!0,{filesIndexed:O.indexedFiles,durationMs:Y}}finally{A()}}async dispose(){ml.astWorkerHost&&await ml.astWorkerHost.stop(),ml.spider&&await ml.spider.dispose(),ml.reset(),this._initialized=!1,this._indexReady=!1}saveState(a){try{HH.writeFileSync(lR.join(this.stateDir,"state.json"),JSON.stringify(a,null,2))}catch(f){UNt.warn("Could not save state:",f instanceof Error?f.message:String(f))}}loadState(){try{let a=HH.readFileSync(lR.join(this.stateDir,"state.json"),"utf-8");return JSON.parse(a)}catch{return null}}};$Nt();var H6t="1.13.2";J5.setSource("cli");var SJt=!1;function xJt(){if(!SJt){SJt=!0;try{$6t(J5.snapshot())}catch{}}}process.on("exit",()=>{xJt()});for(let p of["SIGINT","SIGTERM"])process.on(p,()=>{xJt(),process.exit(p==="SIGINT"?130:143)});var EJt=`
|
|
43250
43250
|
graph-it \u2014 Graph-It-Live standalone CLI
|
|
43251
43251
|
|
|
43252
43252
|
Usage: graph-it <command> [options]
|