@zipbul/gildash 0.29.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -353,6 +353,10 @@ Requires `semantic: true` at open time.
353
353
  | `getResolvedTypesAtPositions(filePath, positions)` | `Map<number, ResolvedType>` | Batch type lookup across positions |
354
354
  | `getSemanticReferencesAtPosition(filePath, position)` | `SemanticReference[]` | References to the symbol at a position |
355
355
  | `getEnrichedReferencesAtPosition(filePath, position)` | `EnrichedReference[]` | Enriched references to the symbol at a position |
356
+ | `getFileBindings(filePath)` | `FileBinding[]` | All bindings in a file (single pass), each with its in-file enriched references — `O(identifiers)` for dataflow |
357
+ | `getFileBindingsBatch(files)` | `Map<string, FileBinding[]>` | Batch `getFileBindings` over many in-memory `{ filePath, content }` — one tsc rebuild for the whole batch |
358
+ | `notifyFileChanged(filePath, content)` | `void` | Register/replace an ad-hoc in-memory source (idempotent on identical content) |
359
+ | `notifyFileDeleted(filePath)` | `void` | Remove an ad-hoc in-memory source |
356
360
  | `getImplementationsAtPosition(filePath, position)` | `Implementation[]` | Implementations of the symbol at a position |
357
361
  | `isTypeAssignableToAtPosition(opts)` | `boolean` | Assignability check between two byte positions |
358
362
  | `isTypeAssignableToTypeAtPositions(opts)` | `boolean` | Assignability check from a position to an arbitrary type string |
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  // @bun
2
- var y$=Object.defineProperty;var x$=(_)=>_;function h$(_,$){this[_]=x$.bind(null,$)}var m$=(_,$)=>{for(var J in $)y$(_,J,{get:$[J],enumerable:!0,configurable:!0,set:h$.bind($,J)})};var h0=import.meta.require;import{isErr as i_}from"@zipbul/result";import b_ from"path";import{existsSync as TQ}from"fs";import{err as m0,isErr as c$}from"@zipbul/result";import{Database as a$}from"bun:sqlite";import{mkdirSync as s$,unlinkSync as n0,existsSync as d0}from"fs";import{dirname as r$,join as p0}from"path";import{drizzle as o$}from"drizzle-orm/bun-sqlite";import{migrate as t$}from"drizzle-orm/bun-sqlite/migrator";class O extends Error{type;constructor(_,$,J){super($,J);this.type=_;this.name="GildashError"}}var C_=".gildash",c_="gildash.db";var V0={};m$(V0,{watcherOwner:()=>i$,symbols:()=>y,symbolChangelog:()=>__,relations:()=>E,files:()=>r,annotations:()=>Y_});import{sql as n$}from"drizzle-orm";import{sqliteTable as F_,text as P,integer as s,real as d$,index as J_,primaryKey as p$,foreignKey as U0,check as l$}from"drizzle-orm/sqlite-core";var r=F_("files",{project:P("project").notNull(),filePath:P("file_path").notNull(),mtimeMs:d$("mtime_ms").notNull(),size:s("size").notNull(),contentHash:P("content_hash").notNull(),updatedAt:P("updated_at").notNull(),lineCount:s("line_count")},(_)=>[p$({columns:[_.project,_.filePath]})]),y=F_("symbols",{id:s("id").primaryKey({autoIncrement:!0}),project:P("project").notNull(),filePath:P("file_path").notNull(),kind:P("kind").notNull(),name:P("name").notNull(),startLine:s("start_line").notNull(),startColumn:s("start_column").notNull(),endLine:s("end_line").notNull(),endColumn:s("end_column").notNull(),isExported:s("is_exported").notNull().default(0),signature:P("signature"),fingerprint:P("fingerprint"),detailJson:P("detail_json"),contentHash:P("content_hash").notNull(),indexedAt:P("indexed_at").notNull(),resolvedType:P("resolved_type"),structuralFingerprint:P("structural_fingerprint")},(_)=>[J_("idx_symbols_project_file").on(_.project,_.filePath),J_("idx_symbols_project_kind").on(_.project,_.kind),J_("idx_symbols_project_name").on(_.project,_.name),J_("idx_symbols_fingerprint").on(_.project,_.fingerprint),U0({columns:[_.project,_.filePath],foreignColumns:[r.project,r.filePath]}).onDelete("cascade")]),E=F_("relations",{id:s("id").primaryKey({autoIncrement:!0}),project:P("project").notNull(),type:P("type").notNull(),srcFilePath:P("src_file_path").notNull(),srcSymbolName:P("src_symbol_name"),dstProject:P("dst_project"),dstFilePath:P("dst_file_path"),dstSymbolName:P("dst_symbol_name"),metaJson:P("meta_json"),specifier:P("specifier"),isExternal:s("is_external").notNull().default(0)},(_)=>[J_("idx_relations_src").on(_.project,_.srcFilePath),J_("idx_relations_dst").on(_.dstProject,_.dstFilePath),J_("idx_relations_type").on(_.project,_.type),J_("idx_relations_project_type_src").on(_.project,_.type,_.srcFilePath),J_("idx_relations_specifier").on(_.project,_.specifier),U0({columns:[_.project,_.srcFilePath],foreignColumns:[r.project,r.filePath]}).onDelete("cascade")]),Y_=F_("annotations",{id:s("id").primaryKey({autoIncrement:!0}),project:P("project").notNull(),filePath:P("file_path").notNull(),tag:P("tag").notNull(),value:P("value").notNull().default(""),source:P("source").notNull(),symbolName:P("symbol_name"),startLine:s("start_line").notNull(),startColumn:s("start_column").notNull(),endLine:s("end_line").notNull(),endColumn:s("end_column").notNull(),indexedAt:P("indexed_at").notNull()},(_)=>[J_("idx_annotations_project_file").on(_.project,_.filePath),J_("idx_annotations_project_tag").on(_.project,_.tag),J_("idx_annotations_project_symbol").on(_.project,_.symbolName),U0({columns:[_.project,_.filePath],foreignColumns:[r.project,r.filePath]}).onDelete("cascade")]),__=F_("symbol_changelog",{id:s("id").primaryKey({autoIncrement:!0}),project:P("project").notNull(),changeType:P("change_type").notNull(),symbolName:P("symbol_name").notNull(),symbolKind:P("symbol_kind").notNull(),filePath:P("file_path").notNull(),oldName:P("old_name"),oldFilePath:P("old_file_path"),fingerprint:P("fingerprint"),changedAt:P("changed_at").notNull(),isFullIndex:s("is_full_index").notNull().default(0),indexRunId:P("index_run_id").notNull()},(_)=>[J_("idx_changelog_project_changed_at").on(_.project,_.changedAt),J_("idx_changelog_project_name").on(_.project,_.symbolName),J_("idx_changelog_project_run").on(_.project,_.indexRunId)]),i$=F_("watcher_owner",{id:s("id").primaryKey(),pid:s("pid").notNull(),startedAt:P("started_at").notNull(),heartbeatAt:P("heartbeat_at").notNull(),instanceId:P("instance_id")},(_)=>[l$("watcher_owner_singleton",n$`${_.id} = 1`)]);class O0{client=null;drizzle=null;dbPath;txDepth=0;constructor(_){this.dbPath=p0(_.projectRoot,C_,c_)}get drizzleDb(){if(!this.drizzle)throw Error("Database is not open. Call open() first.");return this.drizzle}open(){try{s$(r$(this.dbPath),{recursive:!0}),this.client=new a$(this.dbPath),this.client.run("PRAGMA journal_mode = WAL"),this.client.run("PRAGMA foreign_keys = OFF"),this.client.run("PRAGMA busy_timeout = 5000"),this.drizzle=o$(this.client,{schema:V0}),t$(this.drizzle,{migrationsFolder:p0(import.meta.dirname,"migrations")});let _=this.client.prepare("PRAGMA foreign_key_check").all();if(_.length>0)throw Error(`FK integrity violation after migration: ${JSON.stringify(_.slice(0,5))}`);this.client.run("PRAGMA foreign_keys = ON"),this.registerRegexpUdf(this.client)}catch(_){if(this.isCorruptionError(_)&&d0(this.dbPath)){this.closeClient(),n0(this.dbPath);for(let J of["-wal","-shm"]){let Q=this.dbPath+J;if(d0(Q))n0(Q)}let $=this.open();if(c$($))return m0(new O("store",`Failed to recover database at ${this.dbPath}`,{cause:$.data}));return $}return m0(new O("store",`Failed to open database at ${this.dbPath}`,{cause:_}))}}close(){this.closeClient(),this.drizzle=null}transaction(_){let $=this.requireClient();if(this.txDepth===0){this.txDepth++;try{return $.transaction(()=>_(this))()}finally{this.txDepth--}}let J=`sp_${this.txDepth++}`;$.run(`SAVEPOINT "${J}"`);try{let Q=_(this);return $.run(`RELEASE SAVEPOINT "${J}"`),Q}catch(Q){throw $.run(`ROLLBACK TO SAVEPOINT "${J}"`),$.run(`RELEASE SAVEPOINT "${J}"`),Q}finally{this.txDepth--}}immediateTransaction(_){let $=this.requireClient();this.txDepth++,$.run("BEGIN IMMEDIATE");try{let J=_();return $.run("COMMIT"),J}catch(J){throw $.run("ROLLBACK"),J}finally{this.txDepth--}}getTableNames(){return this.requireClient().query("SELECT name FROM sqlite_master WHERE type = 'table'").all().map(($)=>$.name)}selectOwner(){return this.requireClient().prepare("SELECT pid, heartbeat_at, instance_id FROM watcher_owner WHERE id = 1").get()??void 0}insertOwner(_,$){let J=new Date().toISOString();this.requireClient().prepare("INSERT INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(_,J,J,$??null)}replaceOwner(_,$){let J=new Date().toISOString();this.requireClient().prepare("INSERT OR REPLACE INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(_,J,J,$??null)}touchOwner(_){let $=new Date().toISOString();this.requireClient().prepare("UPDATE watcher_owner SET heartbeat_at = ? WHERE id = 1 AND pid = ?").run($,_)}deleteOwner(_){this.requireClient().prepare("DELETE FROM watcher_owner WHERE id = 1 AND pid = ?").run(_)}registerRegexpUdf(_){let $=_;if(typeof $.function!=="function")return;$.function.call(_,"regexp",(J,Q)=>{try{return new RegExp(J).test(Q)?1:0}catch{return 0}})}requireClient(){if(!this.client)throw Error("Database is not open. Call open() first.");return this.client}closeClient(){if(this.client)this.client.close(),this.client=null}isCorruptionError(_){if(!(_ instanceof Error))return!1;let $=_.message.toLowerCase();return $.includes("malformed")||$.includes("corrupt")||$.includes("not a database")||$.includes("disk i/o error")||$.includes("sqlite_corrupt")}}import{eq as f_,and as l0}from"drizzle-orm";class H0{db;constructor(_){this.db=_}getFile(_,$){return this.db.drizzleDb.select().from(r).where(l0(f_(r.project,_),f_(r.filePath,$))).get()??null}upsertFile(_){this.db.drizzleDb.insert(r).values({project:_.project,filePath:_.filePath,mtimeMs:_.mtimeMs,size:_.size,contentHash:_.contentHash,updatedAt:_.updatedAt,lineCount:_.lineCount??null}).onConflictDoUpdate({target:[r.project,r.filePath],set:{mtimeMs:_.mtimeMs,size:_.size,contentHash:_.contentHash,updatedAt:_.updatedAt,lineCount:_.lineCount??null}}).run()}getAllFiles(_){return this.db.drizzleDb.select().from(r).where(f_(r.project,_)).all()}getFilesMap(_){let $=this.getAllFiles(_),J=new Map;for(let Q of $)J.set(Q.filePath,Q);return J}deleteFile(_,$){this.db.drizzleDb.delete(r).where(l0(f_(r.project,_),f_(r.filePath,$))).run()}}import{eq as o,and as q_,sql as a_,count as e$}from"drizzle-orm";function j_(_){return _.replaceAll("\x00","").trim().split(/\s+/).map(($)=>$.trim()).filter(($)=>$.length>0).map(($)=>`"${$.replaceAll('"','""')}"*`).join(" ")}var i0=50;class M0{db;constructor(_){this.db=_}replaceFileSymbols(_,$,J,Q){if(this.db.drizzleDb.delete(y).where(q_(o(y.project,_),o(y.filePath,$))).run(),!Q.length)return;let z=new Date().toISOString(),W=Q.map((Z)=>({project:_,filePath:$,kind:Z.kind??"unknown",name:Z.name??"",startLine:Z.startLine??0,startColumn:Z.startColumn??0,endLine:Z.endLine??0,endColumn:Z.endColumn??0,isExported:Z.isExported??0,signature:Z.signature??null,fingerprint:Z.fingerprint??null,detailJson:Z.detailJson??null,contentHash:J,indexedAt:Z.indexedAt??z,resolvedType:Z.resolvedType??null,structuralFingerprint:Z.structuralFingerprint??null}));for(let Z=0;Z<W.length;Z+=i0)this.db.drizzleDb.insert(y).values(W.slice(Z,Z+i0)).run()}getFileSymbols(_,$){return this.db.drizzleDb.select().from(y).where(q_(o(y.project,_),o(y.filePath,$))).all()}searchByName(_,$,J={}){let Q=J.limit??50,z=j_($);if(!z)return[];return this.db.drizzleDb.select().from(y).where(q_(a_`${y.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${z})`,o(y.project,_),J.kind?o(y.kind,J.kind):void 0)).orderBy(y.name).limit(Q).all()}searchByKind(_,$){return this.db.drizzleDb.select().from(y).where(q_(o(y.project,_),o(y.kind,$))).orderBy(y.name).all()}getStats(_){let $=this.db.drizzleDb.select({symbolCount:e$(),fileCount:a_`COUNT(DISTINCT ${y.filePath})`}).from(y).where(o(y.project,_)).get();return{symbolCount:$?.symbolCount??0,fileCount:$?.fileCount??0}}getByFingerprint(_,$){return this.db.drizzleDb.select().from(y).where(q_(o(y.project,_),o(y.fingerprint,$))).all()}deleteFileSymbols(_,$){this.db.drizzleDb.delete(y).where(q_(o(y.project,_),o(y.filePath,$))).run()}searchByQuery(_){let $=this.db.drizzleDb.select().from(y).where(q_(_.ftsQuery?a_`${y.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${_.ftsQuery})`:void 0,_.exactName?o(y.name,_.exactName):void 0,_.project!==void 0?o(y.project,_.project):void 0,_.kind?o(y.kind,_.kind):void 0,_.filePath!==void 0?o(y.filePath,_.filePath):void 0,_.isExported!==void 0?o(y.isExported,_.isExported?1:0):void 0,_.decorator?a_`${y.id} IN (SELECT s.id FROM symbols s, json_each(s.detail_json, '$.decorators') je WHERE json_extract(je.value, '$.name') = ${_.decorator})`:void 0,_.resolvedType!==void 0?o(y.resolvedType,_.resolvedType):void 0)).orderBy(y.name);if(!_.regex)return(_.limit!==void 0?$.limit(_.limit):$).all();let J;try{J=new RegExp(_.regex)}catch{throw new O("validation",`Invalid regex pattern: ${_.regex}`)}if(_.limit===void 0)return $.all().filter((W)=>J.test(W.name));let Q=[];for(let z of[5,20,100]){let W=_.limit*z,Z=$.limit(W).all();if(Q=Z.filter((Y)=>J.test(Y.name)),Q.length>=_.limit||Z.length<W)return Q.slice(0,_.limit)}return Q.slice(0,_.limit)}}import{eq as m,and as M_,isNull as c0,or as _J}from"drizzle-orm";var y_={project:E.project,type:E.type,srcFilePath:E.srcFilePath,srcSymbolName:E.srcSymbolName,dstProject:E.dstProject,dstFilePath:E.dstFilePath,dstSymbolName:E.dstSymbolName,metaJson:E.metaJson,specifier:E.specifier,isExternal:E.isExternal};class K0{db;constructor(_){this.db=_}replaceFileRelations(_,$,J){this.db.transaction((Q)=>{if(Q.drizzleDb.delete(E).where(M_(m(E.project,_),m(E.srcFilePath,$))).run(),!J.length)return;for(let z of J)Q.drizzleDb.insert(E).values({project:_,type:z.type??"unknown",srcFilePath:z.srcFilePath??$,srcSymbolName:z.srcSymbolName??null,dstProject:z.dstProject??(z.dstFilePath!=null?_:null),dstFilePath:z.dstFilePath??null,dstSymbolName:z.dstSymbolName??null,metaJson:z.metaJson??null,specifier:z.specifier??null,isExternal:z.isExternal??0}).run()})}getOutgoing(_,$,J){if(J!==void 0)return this.db.drizzleDb.select(y_).from(E).where(M_(m(E.project,_),m(E.srcFilePath,$),_J(m(E.srcSymbolName,J),c0(E.srcSymbolName)))).all();return this.db.drizzleDb.select(y_).from(E).where(M_(m(E.project,_),m(E.srcFilePath,$))).all()}getIncoming(_){let{dstProject:$,dstFilePath:J}=_;return this.db.drizzleDb.select(y_).from(E).where(M_(m(E.dstProject,$),m(E.dstFilePath,J))).all()}getByType(_,$){return this.db.drizzleDb.select(y_).from(E).where(M_(m(E.project,_),m(E.type,$))).all()}deleteFileRelations(_,$){this.db.drizzleDb.delete(E).where(M_(m(E.project,_),m(E.srcFilePath,$))).run()}deleteIncomingRelations(_,$){this.db.drizzleDb.delete(E).where(M_(m(E.dstProject,_),m(E.dstFilePath,$))).run()}searchRelations(_){let $=this.db.drizzleDb.select(y_).from(E).where(M_(_.project!==void 0?m(E.project,_.project):void 0,_.srcFilePath!==void 0?m(E.srcFilePath,_.srcFilePath):void 0,_.srcSymbolName!==void 0?m(E.srcSymbolName,_.srcSymbolName):void 0,_.dstProject!==void 0?m(E.dstProject,_.dstProject):void 0,_.dstFilePath!==void 0?m(E.dstFilePath,_.dstFilePath):void 0,_.dstSymbolName!==void 0?m(E.dstSymbolName,_.dstSymbolName):void 0,_.type!==void 0?m(E.type,_.type):void 0,_.specifier!==void 0?m(E.specifier,_.specifier):void 0,_.isExternal!==void 0?m(E.isExternal,_.isExternal?1:0):void 0));return(_.limit!==void 0?$.limit(_.limit):$).all()}retargetRelations(_){let{dstProject:$,oldFile:J,oldSymbol:Q,newFile:z,newSymbol:W,newDstProject:Z}=_,Y=Q===null?M_(m(E.dstProject,$),m(E.dstFilePath,J),c0(E.dstSymbolName)):M_(m(E.dstProject,$),m(E.dstFilePath,J),m(E.dstSymbolName,Q)),X={dstFilePath:z,dstSymbolName:W};if(Z!==void 0)X.dstProject=Z;this.db.drizzleDb.update(E).set(X).where(Y).run()}}import{err as s0}from"@zipbul/result";import{subscribe as $J}from"@parcel/watcher";import L0 from"path";import a0 from"path";function Q_(_){return _.replaceAll("\\","/")}function x_(_,$){return Q_(a0.relative(_,$))}function g_(_,$){return Q_(a0.resolve(_,$))}var JJ=["**/.git/**",`**/${C_}/**`,"**/dist/**","**/node_modules/**"],QJ=new Set(["package.json","tsconfig.json"]);function zJ(_){if(_==="update")return"change";if(_==="create")return"create";return"delete"}class B0{#_;#$;#J;#W;#z;#Y;constructor(_,$=$J,J=console){this.#$=_.projectRoot,this.#J=[...JJ,..._.ignorePatterns??[]],this.#W=new Set((_.extensions??[".ts",".mts",".cts"]).map((Q)=>Q.toLowerCase())),this.#z=$,this.#Y=J}async start(_){try{this.#_=await this.#z(this.#$,($,J)=>{if($){this.#Y.error(new O("watcher","Callback error",{cause:$}));return}try{for(let Q of J){let z=Q_(L0.relative(this.#$,Q.path));if(z.startsWith(".."))continue;let W=L0.basename(z),Z=L0.extname(z).toLowerCase();if(!QJ.has(W)&&!this.#W.has(Z))continue;if(z.endsWith(".d.ts"))continue;_({eventType:zJ(Q.type),filePath:z})}}catch(Q){this.#Y.error(new O("watcher","Callback error",{cause:Q}))}},{ignore:this.#J})}catch($){return s0(new O("watcher","Failed to subscribe watcher",{cause:$}))}}async close(){if(!this.#_)return;try{await this.#_.unsubscribe(),this.#_=void 0}catch(_){return s0(new O("watcher","Failed to close watcher",{cause:_}))}}}import w0 from"path";var WJ=["**/node_modules/**","**/.git/**",`**/${C_}/**`,"**/dist/**"],YJ=WJ.map((_)=>new Bun.Glob(_));function ZJ(_){return new Bun.Glob("**/package.json").scan({cwd:_,followSymlinks:!1})}async function s_(_,$=ZJ){let J=[];for await(let Q of $(_)){let z=Q_(Q);if(YJ.some((K)=>K.match(z)))continue;let W=Q_(w0.dirname(Q)),Z=w0.join(_,Q),Y=await Bun.file(Z).json(),X=typeof Y?.name==="string"&&Y.name.length>0?Y.name:w0.basename(W==="."?_:W);J.push({dir:W,project:X})}return J.sort((Q,z)=>z.dir.length-Q.dir.length),J}function c(_,$,J="default"){let Q=Q_(_);for(let z of $){if(z.dir===".")return z.project;if(Q===z.dir||Q.startsWith(`${z.dir}/`))return z.project}return J}import h_ from"path";var A_=new Map;async function XJ(_){let $=Bun.file(_);if(!await $.exists())return null;try{let J=await $.text(),Q=Bun.JSONC.parse(J);return typeof Q==="object"&&Q!==null?Q:null}catch{return null}}function UJ(_,$){if($.startsWith(".")){let J=h_.resolve(_,$);return J.endsWith(".json")?J:J+".json"}return h_.resolve(_,"node_modules",$)}async function r0(_,$=5){if($<=0)return null;let J=await XJ(_);if(!J)return null;let Q=J.extends;if(typeof Q!=="string"||!Q)return J;let z=UJ(h_.dirname(_),Q),W=await r0(z,$-1);if(!W)return J;let Z=typeof W.compilerOptions==="object"&&W.compilerOptions!==null?W.compilerOptions:{},Y=typeof J.compilerOptions==="object"&&J.compilerOptions!==null?J.compilerOptions:{};return{...W,...J,compilerOptions:{...Z,...Y}}}async function m_(_){if(A_.has(_))return A_.get(_)??null;let $=h_.join(_,"tsconfig.json"),J=await r0($);if(!J)return A_.set(_,null),null;let Q=typeof J.compilerOptions==="object"&&J.compilerOptions!==null?J.compilerOptions:null;if(!Q)return A_.set(_,null),null;let z=typeof Q.baseUrl==="string"?Q.baseUrl:null,W=typeof Q.paths==="object"&&Q.paths!==null?Q.paths:null;if(!z&&!W)return A_.set(_,null),null;let Z=z?h_.resolve(_,z):_,Y=new Map;if(W)for(let[K,V]of Object.entries(W)){if(!Array.isArray(V))continue;let L=V.filter((C)=>typeof C==="string");Y.set(K,L)}let X={baseUrl:Z,paths:Y};return A_.set(_,X),X}function r_(_){if(_){A_.delete(_);return}A_.clear()}function O_(_){let $=Bun.hash.xxHash64(_);return BigInt.asUintN(64,BigInt($)).toString(16).padStart(16,"0")}import{isErr as Z1}from"@zipbul/result";import{err as VJ}from"@zipbul/result";import{parseSync as OJ}from"oxc-parser";function k_(_,$,J,Q=OJ){try{let z={preserveParens:!1,...J},W=Q(_,$,z);return{filePath:_,program:W.program,errors:W.errors,comments:W.comments,sourceText:$,module:W.module}}catch(z){return VJ(new O("parse",`Failed to parse file: ${_}`,{cause:z}))}}import{join as HJ}from"path";function MJ(_,$){let J=$.length===1?`**/*${$[0]}`:`**/*{${$.join(",")}}`;return new Bun.Glob(J).scan({cwd:_,followSymlinks:!1})}async function o0(_){let{projectRoot:$,extensions:J,ignorePatterns:Q,fileRepo:z,scanFilesFn:W=MJ}=_,Z=z.getFilesMap(),Y=new Set,X=[],K=[],V=Q.map((C)=>new Bun.Glob(C));for await(let C of W($,J)){let N=Q_(C);if(!J.some((p)=>N.endsWith(p)))continue;if(N.startsWith("node_modules/")||N.includes("/node_modules/"))continue;if(V.some((p)=>p.match(N)))continue;Y.add(N);let w=HJ($,N),T=Bun.file(w),{size:F,lastModified:S}=T,v=Z.get(N);if(!v){let p=await T.text(),l=O_(p);X.push({filePath:N,contentHash:l,mtimeMs:S,size:F});continue}if(v.mtimeMs===S&&v.size===F){K.push({filePath:N,contentHash:v.contentHash,mtimeMs:S,size:F});continue}let u=await T.text(),x=O_(u);if(x===v.contentHash)K.push({filePath:N,contentHash:x,mtimeMs:S,size:F});else X.push({filePath:N,contentHash:x,mtimeMs:S,size:F})}let L=[];for(let C of Z.keys())if(!Y.has(C))L.push(C);return{changed:X,unchanged:K,deleted:L}}function n_(_){let $=[0];for(let J=0;J<_.length;J++)if(_[J]===`
3
- `)$.push(J+1);return $}function V_(_,$){let J=0,Q=_.length-1;while(J<Q){let z=J+Q+1>>1;if(_[z]<=$)J=z;else Q=z-1}return{line:J+1,column:$-_[J]}}import{err as KJ}from"@zipbul/result";import{parse as LJ}from"comment-parser";function o_(_){try{let $=_.trim();if($.startsWith("/**"))$=$.slice(3);if($.endsWith("*/"))$=$.slice(0,-2);let Q=LJ(`/** ${$} */`)[0]??{description:"",tags:[]};return{description:(Q.description??"").trim(),tags:(Q.tags??[]).map((z)=>({tag:z.tag??"",name:z.name??"",type:z.type??"",description:z.description??"",optional:z.optional??!1,...z.default!==void 0?{default:z.default}:{}}))}}catch($){return KJ(new O("parse","Failed to parse JSDoc comment",{cause:$}))}}import{isErr as BJ}from"@zipbul/result";function wJ(_){if("name"in _&&typeof _.name==="string")return _.name;if("value"in _){let $=_.value;if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="bigint"||typeof $==="boolean")return String($)}return"unknown"}function E_(_){if(_.type==="Identifier")return[{name:_.name,start:_.start,end:_.end}];if(_.type==="ObjectPattern"){let $=[];for(let J of _.properties)if(J.type==="RestElement")$.push(...E_(J.argument));else $.push(...E_(J.value));return $}if(_.type==="ArrayPattern"){let $=[];for(let J of _.elements){if(!J)continue;if(J.type==="RestElement")$.push(...E_(J.argument));else $.push(...E_(J))}return $}if(_.type==="AssignmentPattern")return E_(_.left);return[]}function IJ(_){let $=new Map;for(let J of _.module.staticImports){let Q=J.moduleRequest.value;for(let z of J.entries){let W=z.localName.value,Z=z.importName.kind==="Name"?z.importName.name:void 0,Y={specifier:Q};if(Z&&Z!==W)Y.originalName=Z;$.set(W,Y)}}return $}function N_(_){let{program:$,sourceText:J,comments:Q}=_,z=n_(J),W=IJ(_),Z=Q.filter((D)=>D.type==="Block"&&D.value.startsWith("*")).sort((D,q)=>D.end-q.end),Y=$.body.map((D)=>D.start).sort((D,q)=>D-q);function X(D,q){return S(D,q)}function K(D,q,U){if(D.type==="PrivateIdentifier")return{kind:"private"};if(!q&&D.type==="Identifier")return;return X(D,U)}function V(D,q){if(q)return J.slice(D.start,D.end);if(D.type==="PrivateIdentifier")return`#${D.name}`;return wJ(D)}function L(D,q,U){let H=D;if(!q&&H.type==="Identifier")return{kind:"string",value:H.name};return X(D,U)}function C(D,q){return{start:V_(z,D),end:V_(z,q)}}function N(D){let q=0,U=Z.length-1,H=-1;while(q<=U){let B=q+U>>>1;if(Z[B].end<=D)H=B,q=B+1;else U=B-1}if(H<0)return;let M=Z[H];q=0,U=Y.length-1;while(q<=U){let B=q+U>>>1,A=Y[B];if(A<=M.end)q=B+1;else if(A>=D)U=B-1;else return}return`/*${M.value}*/`}function w(D){if(!D)return;let q="typeAnnotation"in D&&D.typeAnnotation?D.typeAnnotation:D;return J.slice(q.start,q.end)}let T=8;function F(D){if(D.type==="Identifier")return W.get(D.name);if(D.type==="MemberExpression"){let q=D.object;if(q.type==="Identifier")return W.get(q.name)}return}function S(D,q=0){let U=D;if(q>=T)return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)};let H=U.type;if(H==="Literal"){let M=U.value;if(typeof M==="bigint")return{kind:"bigint",value:typeof U.bigint==="string"?U.bigint:M.toString()};if(typeof U.regex==="object"&&U.regex!==null)return{kind:"regex",value:J.slice(U.start,U.end)};if(M===null)return{kind:"null",value:null};if(typeof M==="string")return{kind:"string",value:M};if(typeof M==="number")return{kind:"number",value:M};if(typeof M==="boolean")return{kind:"boolean",value:M};return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}if(H==="Identifier"){let M=U.name;if(M==="undefined")return{kind:"undefined",value:null};let B=W.get(M),A={kind:"identifier",name:M};if(B){if(A.importSource=B.specifier,B.originalName)A.originalName=B.originalName}return A}if(H==="MemberExpression"){if(U.computed){let j=U.property;if(j.type==="Literal"&&typeof j.value==="string"){let k=U.object,b=J.slice(k.start,k.end),d=k.type==="Identifier"?k.name:void 0,$_=d?W.get(d):void 0,U_={kind:"member",object:b,property:j.value};if($_)U_.importSource=$_.specifier;return U_}return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}let M=U.object,B=J.slice(M.start,M.end),A=U.property.name??J.slice(U.property.start,U.property.end),I=M.type==="Identifier"?M.name:void 0,G=I?W.get(I):void 0,R={kind:"member",object:B,property:A};if(G)R.importSource=G.specifier;return R}if(H==="CallExpression"){let M=U.callee,B=J.slice(M.start,M.end),I=(U.arguments??[]).map((j)=>S(j,q+1)),G=F(M),R={kind:"call",callee:B,arguments:I};if(G)R.importSource=G.specifier;return R}if(H==="NewExpression"){let M=U.callee,B=J.slice(M.start,M.end),I=(U.arguments??[]).map((j)=>S(j,q+1)),G=F(M),R={kind:"new",callee:B,arguments:I};if(G)R.importSource=G.specifier;return R}if(H==="ObjectExpression"){let M=U.properties??[],B=[];for(let A of M){if(A.type==="SpreadElement"){let d=A.argument;B.push({kind:"spread",argument:S(d,q+1)});continue}let I=A.key,G=A.computed===!0,R=A.value,j=A.shorthand||void 0,b={kind:"property",key:L(I,G,q+1),value:S(R,q+1)};if(j)b.shorthand=!0;B.push(b)}return{kind:"object",properties:B}}if(H==="ArrayExpression")return{kind:"array",elements:(U.elements??[]).map((A)=>{if(!A)return{kind:"undefined",value:null};return S(A,q+1)})};if(H==="SpreadElement"){let M=U.argument;return{kind:"spread",argument:S(M,q+1)}}if(H==="ArrowFunctionExpression"||H==="FunctionExpression"){let B=U.params.map(u),A={kind:"function",sourceText:J.slice(U.start,U.end)};if(B.length>0)A.parameters=B;return A}if(H==="TemplateLiteral"||H==="TaggedTemplateExpression")return{kind:"template",sourceText:J.slice(U.start,U.end)};if(H==="UnaryExpression"){let{operator:M,argument:B}=U;if(M==="-"&&B.type==="Literal"&&typeof B.value==="number")return{kind:"number",value:-B.value};if(M==="void")return{kind:"undefined",value:null};return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}if(H==="TSAsExpression"||H==="TSSatisfiesExpression"||H==="TSNonNullExpression"||H==="TSTypeAssertion"||H==="TSInstantiationExpression"||H==="ParenthesizedExpression"||H==="ChainExpression"){let M=U.expression;if(M)return S(M,q)}return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}function v(D){if(!D||D.length===0)return[];return D.map((q)=>{let U=q.expression;if(U.type==="CallExpression"){let H=U,M=H.callee,B="name"in M&&typeof M.name==="string"?M.name:("property"in M)&&M.property&&typeof M.property.name==="string"?M.property.name:"unknown",A=H.arguments.map((I)=>S(I));return{name:B,arguments:A.length>0?A:void 0}}if(U.type==="Identifier")return{name:U.name??"unknown"};return{name:J.slice(U.start,U.end)}})}function u(D){if(D.type==="TSParameterProperty"){let U=D;return p(U.parameter,U.decorators)}if(D.type==="RestElement"){let U=D,H=U.argument,B=`...${"name"in H&&typeof H.name==="string"?H.name:"unknown"}`,A=U.typeAnnotation,I=A?w(A):void 0,G={name:B,isOptional:!1};if(I)G.type=I;return G}let q=D;return p(q,q.decorators)}function x(D){if(!D)return;let q="typeAnnotation"in D&&D.typeAnnotation?D.typeAnnotation:null;if(!q)return;let H=q.typeName?.name;if(!H)return;return W.get(H)?.specifier}function p(D,q){if(D.type==="AssignmentPattern"){let{left:R,right:j}=D,k="name"in R&&typeof R.name==="string"?R.name:"unknown",b="typeAnnotation"in R?R.typeAnnotation:null,d=b?w(b):void 0,$_=x(b),U_=J.slice(j.start,j.end),L_="decorators"in R&&Array.isArray(R.decorators)?R.decorators:[],X0=v(L_),D_={name:k,isOptional:!0,defaultValue:U_};if(d)D_.type=d;if($_)D_.typeImportSource=$_;if(X0.length>0)D_.decorators=X0;return D_}let U="name"in D&&typeof D.name==="string"?D.name:("pattern"in D)&&D.pattern&&typeof D.pattern.name==="string"?D.pattern.name:"unknown",H=!!(("optional"in D)&&D.optional),M="typeAnnotation"in D?D.typeAnnotation:null,B=M?w(M):void 0,A=x(M),I=v(q??[]),G={name:U,isOptional:H};if(B)G.type=B;if(A)G.typeImportSource=A;if(I.length>0)G.decorators=I;return G}function l(D,q){let U=[];if(q?.async)U.push("async");if(D.static)U.push("static");if(D.abstract)U.push("abstract");if(D.readonly)U.push("readonly");if(D.override)U.push("override");if(D.declare)U.push("declare");if(D.const)U.push("const");let H=D.accessibility;if(H==="private")U.push("private");else if(H==="protected")U.push("protected");else if(H==="public")U.push("public");return U}function z_(D){if(!D)return;let q=D.params.flatMap((U)=>{let H=U.name.name;return H?[H]:[]});return q.length>0?q:void 0}function Z_(D){let q=[];if(D.superClass){let H=J.slice(D.superClass.start,D.superClass.end);q.push({kind:"extends",name:H})}let U=D.implements??[];for(let H of U){let M=H.expression,B=J.slice(M.start,M.end);q.push({kind:"implements",name:B})}return q}function H_(D){let q=[],U=D.extends;for(let H of U){let M=H.expression,B=J.slice(M.start,M.end);q.push({kind:"extends",name:B})}return q}function X_(D){let q=[];for(let U of D)if(U.type==="MethodDefinition"||U.type==="TSAbstractMethodDefinition"){let H=U,M=V(H.key,H.computed),B=K(H.key,H.computed,0),A=H.value,I=H.kind,G=I==="constructor"?"constructor":I==="get"?"getter":I==="set"?"setter":"method",R=l(H,A);if(U.type==="TSAbstractMethodDefinition"&&!R.includes("abstract"))R.push("abstract");let j=A.params.map(u),k=w(A.returnType),b=v(H.decorators??[]),d={kind:"method",name:M,span:C(U.start,U.end),isExported:!1,methodKind:G,modifiers:R,parameters:j.length>0?j:void 0,returnType:k};if(B)d.key=B;if(b.length>0)d.decorators=b;q.push(d)}else if(U.type==="PropertyDefinition"||U.type==="TSAbstractPropertyDefinition"||U.type==="AccessorProperty"||U.type==="TSAbstractAccessorProperty"){let H=U,M=V(H.key,H.computed),B=K(H.key,H.computed,0),A=l(H);if(U.type==="TSAbstractPropertyDefinition"||U.type==="TSAbstractAccessorProperty"){if(!A.includes("abstract"))A.push("abstract")}if(U.type==="AccessorProperty"||U.type==="TSAbstractAccessorProperty")A.push("accessor");let I=w(H.typeAnnotation),G=H.value,R=G?S(G):void 0,j=v(H.decorators??[]),k={kind:"property",name:M,span:C(U.start,U.end),isExported:!1,modifiers:A,returnType:I,initializer:R};if(B)k.key=B;if(j.length>0)k.decorators=j;q.push(k)}return q}function W_(D){let q=[];for(let U of D)if(U.type==="TSMethodSignature"){let H=U,M=V(H.key,H.computed),B=K(H.key,H.computed,0),A=H.params.map(u),I=w(H.returnType),G={kind:"method",name:M,span:C(U.start,U.end),isExported:!1,modifiers:[],methodKind:"method",parameters:A.length>0?A:void 0,returnType:I};if(B)G.key=B;q.push(G)}else if(U.type==="TSPropertySignature"){let H=U,M=V(H.key,H.computed),B=K(H.key,H.computed,0),A=w(H.typeAnnotation),I={kind:"property",name:M,span:C(U.start,U.end),isExported:!1,modifiers:H.readonly?["readonly"]:[],returnType:A};if(B)I.key=B;q.push(I)}return q}function i(D,q){let U=D.type;if(U==="FunctionDeclaration"||U==="FunctionExpression"||U==="TSDeclareFunction"||U==="TSEmptyBodyFunctionExpression"){let H=D,M=H.id?.name??"default",B=H.params.map(u),A=w(H.returnType),I=l(H,H),G=v(H.decorators??[]),R=z_(H.typeParameters),j={kind:"function",name:M,span:C(D.start,D.end),isExported:q,modifiers:I,parameters:B.length>0?B:void 0,returnType:A,decorators:G.length>0?G:void 0};if(R&&R.length>0)j.typeParameters=R;return j}if(U==="ClassDeclaration"||U==="ClassExpression"){let H=D,M=H.id?.name??"default",B=Z_(H),A=X_(H.body.body),I=v(H.decorators),G=l(H),R=z_(H.typeParameters),j={kind:"class",name:M,span:C(D.start,D.end),isExported:q,modifiers:G,heritage:B.length>0?B:void 0,members:A.length>0?A:void 0,decorators:I.length>0?I:void 0};if(R&&R.length>0)j.typeParameters=R;return j}if(U==="VariableDeclaration"){let H=D,M=[];for(let B of H.declarations){let{id:A,init:I}=B;if(A.type==="ObjectPattern"||A.type==="ArrayPattern"){let U_=E_(A);for(let L_ of U_)M.push({kind:"variable",name:L_.name,span:C(L_.start,L_.end),isExported:q,modifiers:[]});continue}let G="name"in A&&typeof A.name==="string"?A.name:"unknown",R="variable",j,k,b;if(I)if(I.type==="FunctionExpression"||I.type==="ArrowFunctionExpression"){R="function";let U_=I;j=U_.params.map(u),k=w(U_.returnType)}else b=S(I);let d=[],$_={kind:R,name:G,span:C(B.start,B.end),isExported:q,modifiers:d,parameters:j,returnType:k};if(b)$_.initializer=b;M.push($_)}if(M.length===0)return null;if(M.length===1)return M[0];return M}if(U==="TSTypeAliasDeclaration")return{kind:"type",name:D.id.name,span:C(D.start,D.end),isExported:q,modifiers:[]};if(U==="TSInterfaceDeclaration"){let H=D,M=H.id.name,B=H_(H),A=W_(H.body.body),I=z_(H.typeParameters),G={kind:"interface",name:M,span:C(D.start,D.end),isExported:q,modifiers:[],heritage:B.length>0?B:void 0,members:A.length>0?A:void 0};if(I&&I.length>0)G.typeParameters=I;return G}if(U==="TSEnumDeclaration"){let H=D,M=H.id.name,B=l(H),I=H.body.members.map((G)=>{let R=G.id,j=R.type!=="Identifier",k="name"in R&&typeof R.name==="string"?R.name:("value"in R)&&typeof R.value==="string"?R.value:"unknown",b=G.initializer?S(G.initializer):void 0,d={kind:"property",name:k,span:C(G.start,G.end),isExported:!1,modifiers:[]};if(j)d.key=X(R,0);if(b)d.initializer=b;return d});return{kind:"enum",name:M,span:C(D.start,D.end),isExported:q,modifiers:B,members:I.length>0?I:void 0}}if(U==="TSModuleDeclaration"){let H=D,M=H.id.name??H.id.value??"unknown",B=l(H),A=[];if(H.body?.type==="TSModuleBlock")for(let I of H.body.body??[]){if(I.type!=="ExportNamedDeclaration")continue;let G=I.declaration;if(!G)continue;let R=i(G,!1);if(R)if(Array.isArray(R))A.push(...R);else A.push(R)}return{kind:"namespace",name:M,span:C(D.start,D.end),isExported:q,modifiers:B,members:A.length>0?A:void 0}}return null}let a=[],I_=new Set;for(let D of $.body){let q=null,U=D;if(U.type==="ExportNamedDeclaration"){let M=U;if(M.declaration){if(q=i(M.declaration,!0),q&&!Array.isArray(q))q.span=C(M.start,M.end)}else if(!M.source&&M.specifiers)for(let B of M.specifiers){let A=B.local,I="name"in A?A.name:A.value;if(I)I_.add(I)}}else if(U.type==="ExportDefaultDeclaration"){let M=U,B=M.declaration;if(B){if(q=i(B,!0),q&&!Array.isArray(q))q.name="id"in B&&B.id&&typeof B.id.name==="string"?B.id.name:"default",q.isExported=!0,q.span=C(M.start,M.end);else if(!q&&"type"in B&&B.type==="Identifier"){let A=B.name;if(A)I_.add(A)}}}else{let M=U.type;if(M==="FunctionDeclaration"||M==="TSDeclareFunction"||M==="ClassDeclaration"||M==="VariableDeclaration"||M==="TSTypeAliasDeclaration"||M==="TSInterfaceDeclaration"||M==="TSEnumDeclaration"||M==="TSModuleDeclaration")q=i(U,!1)}let H=Array.isArray(q)?q:q?[q]:[];for(let M of H){let B=D.start,A=N(B);if(A){let I=o_(A);if(!BJ(I))M.jsDoc=I}a.push(M)}}if(I_.size>0){for(let D of a)if(!D.isExported&&I_.has(D.name))D.isExported=!0}return a}function t_(_){if(_===null||typeof _!=="object")return JSON.stringify(_);if(Array.isArray(_))return`[${_.map(t_).join(",")}]`;let $=_;return`{${Object.keys($).sort().map((Q)=>`${JSON.stringify(Q)}:${t_($[Q])}`).join(",")}}`}function DJ(_){if(_.kind==="function"||_.kind==="method"){let $=_.parameters?.length??0,J=_.modifiers.includes("async")?1:0;return`params:${$}|async:${J}`}return null}function CJ(_){let $={};if(_.jsDoc)$.jsDoc=_.jsDoc;if(_.kind==="function"||_.kind==="method"){if(_.parameters!==void 0)$.parameters=_.parameters;if(_.returnType!==void 0)$.returnType=_.returnType}if(_.heritage?.length)$.heritage=_.heritage;if(_.decorators?.length)$.decorators=_.decorators;if(_.typeParameters?.length)$.typeParameters=_.typeParameters;if(_.modifiers?.length)$.modifiers=_.modifiers;if(_.initializer)$.initializer=_.initializer;if(_.key)$.key=_.key;if(_.members?.length)$.members=_.members.map((J)=>{let Q=J.modifiers.find((W)=>W==="private"||W==="protected"||W==="public"),z={name:J.name,kind:J.methodKind??J.kind,type:J.returnType,visibility:Q,isStatic:J.modifiers.includes("static")||void 0,isReadonly:J.modifiers.includes("readonly")||void 0,isAccessor:J.modifiers.includes("accessor")||void 0};if(J.key)z.key=J.key;if(J.initializer)z.initializer=J.initializer;if(J.decorators?.length)z.decorators=J.decorators;return z});return Object.keys($).length>0?JSON.stringify($):null}function AJ(_){let $=[_.kind];if(_.modifiers.length)$.push(`mod:${[..._.modifiers].sort().join(",")}`);if(_.typeParameters?.length)$.push(`tp:${_.typeParameters.length}`);if(_.heritage?.length){let J=[..._.heritage].sort((Q,z)=>Q.name.localeCompare(z.name)).map((Q)=>`${Q.kind}:${Q.name}`).join(",");$.push(`her:${J}`)}if(_.decorators?.length)$.push(`dec:${[..._.decorators].map((J)=>J.name).sort().join(",")}`);if(_.methodKind)$.push(`mk:${_.methodKind}`);if(_.parameters)$.push(`p:${_.parameters.length}`);if(_.returnType)$.push(`rt:${_.returnType}`);if(_.key)$.push(`k:${t_(_.key)}`);if(_.members?.length){let J=_.members.map((Q)=>`${Q.kind}:${Q.modifiers.join(",")}:${Q.parameters?.length??""}:${Q.returnType??""}:${Q.key?t_(Q.key):""}`).sort().join(";");$.push(`mem:${_.members.length}:${O_(J)}`)}return O_($.join("|"))}function t0(_,$,J,Q,z){let W=DJ(_),Z=O_(`${$}|${_.kind}|${W??""}`),Y=AJ(_);return{project:J,filePath:Q,kind:_.kind,name:$,startLine:_.span.start.line,startColumn:_.span.start.column,endLine:_.span.end.line,endColumn:_.span.end.column,isExported:_.isExported?1:0,signature:W,fingerprint:Z,detailJson:CJ(_),contentHash:z,indexedAt:new Date().toISOString(),structuralFingerprint:Y}}function I0(_){let{parsed:$,project:J,filePath:Q,contentHash:z,symbolRepo:W}=_,Z=N_($),Y=[];for(let X of Z){Y.push(t0(X,X.name,J,Q,z));for(let K of X.members??[])Y.push(t0(K,`${X.name}.${K.name}`,J,Q,z))}W.replaceFileSymbols(J,Q,z,Y)}import{resolve as D0,dirname as qJ,extname as NJ}from"path";function R_(_,$,J){let Q=(z)=>{let W=NJ(z);if(W===".js")return[z.slice(0,-3)+".ts"];if(W===".mjs")return[z.slice(0,-4)+".mts"];if(W===".cjs")return[z.slice(0,-4)+".cts"];if(W===".ts"||W===".mts"||W===".cts"||W===".d.ts")return[z];return[z+".ts",z+".d.ts",z+"/index.ts",z+"/index.d.ts",z+".mts",z+"/index.mts",z+".cts",z+"/index.cts"]};if($.startsWith(".")){let z=Q_(D0(qJ(_),$));return Q(z)}if(J)for(let[z,W]of J.paths){if(W.length===0)continue;let Z=z.indexOf("*");if(Z===-1){if($===z){let Y=[];for(let X of W)Y.push(...Q(Q_(D0(J.baseUrl,X))));return Y}}else{let Y=z.slice(0,Z),X=z.slice(Z+1);if($.startsWith(Y)&&(X===""||$.endsWith(X))){let K=$.slice(Y.length,X===""?void 0:$.length-X.length),V=[];for(let L of W)V.push(...Q(Q_(D0(J.baseUrl,L.replace("*",K)))));return V}}}return[]}function e0(_,$,J,Q=R_){let z=new Map,W=_.body??[];for(let Z of W){if(Z.type!=="ImportDeclaration")continue;let Y=Z.source?.value??"",X=Q($,Y,J);if(X.length===0)continue;let K=X[0],V=Z.specifiers??[];for(let L of V)switch(L.type){case"ImportSpecifier":z.set(L.local.name,{path:K,importedName:L.imported.name});break;case"ImportDefaultSpecifier":z.set(L.local.name,{path:K,importedName:"default"});break;case"ImportNamespaceSpecifier":z.set(L.local.name,{path:K,importedName:"*"});break}}return z}import{Visitor as RJ}from"oxc-parser";function e_(_){return"name"in _&&typeof _.name==="string"?_.name:("value"in _)&&typeof _.value==="string"?_.value:"unknown"}function TJ(_){return!_.startsWith(".")&&!_.startsWith("/")}function T_(_,$,J,Q){let z=Q(_,$,J),W=z.length>0?z[0]:null,Z=W===null&&TJ($);return{resolved:W,isExternal:Z}}function GJ(_,$,J,Q,z){for(let W of _.staticImports){let Z=W.moduleRequest.value,{resolved:Y,isExternal:X}=T_($,Z,J,Q),K={dstFilePath:Y,specifier:Z};if(W.entries.length===0){let V={};if(X)V.isExternal=!0;if(Y===null&&!X)V.isUnresolved=!0;z.push({type:"imports",srcFilePath:$,srcSymbolName:null,...K,dstSymbolName:null,...Object.keys(V).length>0?{metaJson:JSON.stringify(V)}:{}});continue}for(let V of W.entries){let L=V.isType,C={};if(L)C.isType=!0;if(X)C.isExternal=!0;if(Y===null&&!X)C.isUnresolved=!0;let N,w,T=V.importName.kind;if(T==="Default")N="default",w=V.localName.value;else if(T==="NamespaceObject")N="*",w=V.localName.value,C.importKind="namespace";else N=V.importName.name??"unknown",w=V.localName.value;z.push({type:L?"type-references":"imports",srcFilePath:$,srcSymbolName:w,...K,dstSymbolName:N,...Object.keys(C).length>0?{metaJson:JSON.stringify(C)}:{}})}}}function SJ(_,$,J,Q,z){let W=new Map;for(let Z of _.staticImports)for(let Y of Z.entries)W.set(Y.localName.value,Z.moduleRequest.value);for(let Z of _.staticExports)for(let Y of Z.entries){let X=null;if(Y.moduleRequest)X=Y.moduleRequest.value;else if(Y.localName.name)X=W.get(Y.localName.name)??null;if(!X)continue;let{resolved:K,isExternal:V}=T_($,X,J,Q),L=Y.exportName.name??"default",C=Y.exportName.kind,N=Y.localName.name??Y.importName.name??L,w=Y.isType,T={isReExport:!0};if(C==="None");else T.specifiers=[{local:N,exported:L}];if(w)T.isType=!0;if(V)T.isExternal=!0;if(K===null&&!V)T.isUnresolved=!0;let F=null,S=null,v=Y.importName.kind;if(v==="All"||v==="AllButDefault"){if(C==="Name"&&L)S=L,T.namespaceAlias=L}else S=N,F=L;z.push({type:w?"type-references":"re-exports",srcFilePath:$,srcSymbolName:F,dstFilePath:K,dstSymbolName:S,specifier:X,metaJson:JSON.stringify(T)})}}function FJ(_,$,J,Q,z){for(let W of _.body){let Z=W;if(Z.type==="ImportDeclaration"){let Y=Z,X=Y.source.value,{resolved:K,isExternal:V}=T_($,X,J,Q),L=Y.importKind==="type",C=Y.specifiers,N={dstFilePath:K,specifier:X};if(C.length===0){let w={};if(L)w.isType=!0;if(V)w.isExternal=!0;if(K===null&&!V)w.isUnresolved=!0;z.push({type:L?"type-references":"imports",srcFilePath:$,srcSymbolName:null,...N,dstSymbolName:null,...Object.keys(w).length>0?{metaJson:JSON.stringify(w)}:{}})}else for(let w of C){let T=w.type,F=L||T==="ImportSpecifier"&&w.importKind==="type",S={};if(F)S.isType=!0;if(V)S.isExternal=!0;if(K===null&&!V)S.isUnresolved=!0;let v,u;if(T==="ImportDefaultSpecifier")v="default",u=w.local.name;else if(T==="ImportNamespaceSpecifier")v="*",u=w.local.name,S.importKind="namespace";else v=e_(w.imported),u=w.local.name;z.push({type:F?"type-references":"imports",srcFilePath:$,srcSymbolName:u,...N,dstSymbolName:v,...Object.keys(S).length>0?{metaJson:JSON.stringify(S)}:{}})}continue}if(Z.type==="ExportAllDeclaration"){let Y=Z,X=Y.source.value,{resolved:K,isExternal:V}=T_($,X,J,Q),L=Y.exportKind==="type",C=Y.exported,N=C?e_(C):null,w={isReExport:!0};if(L)w.isType=!0;if(V)w.isExternal=!0;if(K===null&&!V)w.isUnresolved=!0;if(N)w.namespaceAlias=N;z.push({type:L?"type-references":"re-exports",srcFilePath:$,srcSymbolName:null,dstFilePath:K,dstSymbolName:N,specifier:X,metaJson:JSON.stringify(w)});continue}if(Z.type==="ExportNamedDeclaration"){let Y=Z;if(!Y.source)continue;let X=Y.source.value,{resolved:K,isExternal:V}=T_($,X,J,Q),L=Y.exportKind==="type",C=Y.specifiers??[];for(let N of C){let w=L||N.exportKind==="type",T=e_(N.local),F=e_(N.exported),S={isReExport:!0,specifiers:[{local:T,exported:F}]};if(w)S.isType=!0;if(V)S.isExternal=!0;if(K===null&&!V)S.isUnresolved=!0;z.push({type:w?"type-references":"re-exports",srcFilePath:$,srcSymbolName:F,dstFilePath:K,dstSymbolName:T,specifier:X,metaJson:JSON.stringify(S)})}}}}function jJ(_,$,J,Q,z){new RJ({ImportExpression(Z){let Y=Z.source;if(Y.type!=="Literal"||typeof Y.value!=="string")return;let X=Y.value,{resolved:K,isExternal:V}=T_($,X,J,Q),L={isDynamic:!0};if(V)L.isExternal=!0;if(K===null&&!V)L.isUnresolved=!0;z.push({type:"imports",srcFilePath:$,srcSymbolName:null,dstFilePath:K,dstSymbolName:null,specifier:X,metaJson:JSON.stringify(L)})},CallExpression(Z){let Y=Z.callee,X=!1;if(Y.type==="Identifier"&&Y.name==="require");else if(Y.type==="MemberExpression"&&!Y.computed){let T=Y,F=T.object,S=T.property;if(F.type==="Identifier"&&F.name==="require"&&S.name==="resolve")X=!0;else return}else return;let K=Z.arguments;if(K.length===0)return;let V=K[0];if(V.type!=="Literal"||typeof V.value!=="string")return;let L=V.value,{resolved:C,isExternal:N}=T_($,L,J,Q),w={isRequire:!0};if(X)w.isRequireResolve=!0;if(N)w.isExternal=!0;if(C===null&&!N)w.isUnresolved=!0;z.push({type:"imports",srcFilePath:$,srcSymbolName:null,dstFilePath:C,dstSymbolName:null,specifier:L,metaJson:JSON.stringify(w)})}}).visit(_)}function _1(_,$,J,Q=R_,z){let W=[];if(z)GJ(z,$,J,Q,W),SJ(z,$,J,Q,W);else FJ(_,$,J,Q,W);return jJ(_,$,J,Q,W),W}import{walk as mJ}from"oxc-walker";function gJ(_){return _.type==="FunctionDeclaration"||_.type==="FunctionExpression"||_.type==="ArrowFunctionExpression"}function kJ(_){return _.type==="ArrowFunctionExpression"}function EJ(_){return _.type==="AssignmentExpression"}function uJ(_){return _.type==="CallExpression"}function vJ(_){return _.type==="FunctionDeclaration"}function bJ(_){return _.type==="FunctionExpression"}function PJ(_){return _.type==="Identifier"}function fJ(_){return _.type==="MemberExpression"}function yJ(_){return _.type==="TSQualifiedName"}function xJ(_){return _.type==="VariableDeclaration"}var $1=new Map,hJ=new Proxy({},{get(_,$,J){if(typeof $!=="string")return Reflect.get(_,$,J);let Q=$.charCodeAt(0);if(Q<65||Q>90)return Reflect.get(_,$,J);let z=$1.get($);if(z===void 0)z=(W)=>W!==null&&W!==void 0&&W.type===$,$1.set($,z);return z}});function u_(_){if(!_||typeof _!=="object"||Array.isArray(_))return null;let $=_;if($.type==="Identifier"){let J=$.name;return{root:J,parts:[],full:J}}if($.type==="ThisExpression")return{root:"this",parts:[],full:"this"};if($.type==="Super")return{root:"super",parts:[],full:"super"};if($.type==="MemberExpression"){let J=[],Q=$;while(Q.type==="MemberExpression"){let Z=Q.property;if(!Z||typeof Z.name!=="string")return null;J.push(Z.name),Q=Q.object}let z;if(Q.type==="Identifier")z=Q.name;else if(Q.type==="ThisExpression")z="this";else if(Q.type==="Super")z="super";else return null;J.reverse();let W=[z,...J].join(".");return{root:z,parts:J,full:W}}return null}function J1(_,$,J){let Q=[],z=[],W=[];function Z(){if(z.length>0)return z[z.length-1]??null;return null}function Y(V){if(!V)return null;let L=J.get(V.root);if(V.parts.length===0){if(L)return{dstFilePath:L.path,dstSymbolName:L.importedName,resolution:"import"};return{dstFilePath:$,dstSymbolName:V.root,resolution:"local"}}else{if(L&&L.importedName==="*"){let C=V.parts[V.parts.length-1];return{dstFilePath:L.path,dstSymbolName:C,resolution:"namespace"}}return{dstFilePath:$,dstSymbolName:V.full,resolution:"local-member"}}}function X(V,L){let C=u_(V.callee),N=Y(C);if(N){let w=Z(),T={};if(L)T.isNew=!0;if(w===null)T.scope="module";Q.push({type:"calls",srcFilePath:$,srcSymbolName:w,dstFilePath:N.dstFilePath,dstSymbolName:N.dstSymbolName,...Object.keys(T).length>0?{metaJson:JSON.stringify(T)}:{}})}}function K(V,L){if(V.type==="FunctionDeclaration"){z.push(V.id?.name??"anonymous");return}if(V.type==="FunctionExpression"||V.type==="ArrowFunctionExpression"){if(L?.type==="VariableDeclarator"){let w=L.id,T=w.type==="Identifier"?w.name:"anonymous";z.push(T);return}if(L?.type==="MethodDefinition"||L?.type==="TSAbstractMethodDefinition"){let w=L.key,T=W[W.length-1]??"",F="name"in w?w.name:"anonymous",S=T?`${T}.${F}`:F;z.push(S);return}let C=Z(),N=C?`${C}.<anonymous>`:"<anonymous>";z.push(N)}}return mJ(_,{enter(V,L){if(V.type==="ClassDeclaration"||V.type==="ClassExpression"){W.push(V.id?.name??"AnonymousClass");return}if(V.type==="FunctionDeclaration"||V.type==="FunctionExpression"||V.type==="ArrowFunctionExpression"){K(V,L);return}if(V.type==="CallExpression"){X(V,!1);return}if(V.type==="NewExpression"){X(V,!0);return}},leave(V){if(V.type==="ClassDeclaration"||V.type==="ClassExpression"){W.pop();return}if(V.type==="FunctionDeclaration"||V.type==="FunctionExpression"||V.type==="ArrowFunctionExpression"){z.pop();return}}}),Q}import{Visitor as nJ}from"oxc-parser";function Q1(_,$,J){let Q=[];function z(Z){let Y=Z.id?.name??"AnonymousClass";if(Z.superClass){let K=u_(Z.superClass);if(K){let V=C0(K,$,J);Q.push({type:"extends",srcFilePath:$,srcSymbolName:Y,...V})}}let X=Z.implements??[];for(let K of X){let V=u_(K.expression);if(!V)continue;let L=C0(V,$,J);Q.push({type:"implements",srcFilePath:$,srcSymbolName:Y,...L})}}return new nJ({TSInterfaceDeclaration(Z){let Y=Z.id.name??"AnonymousInterface",X=Z.extends;for(let K of X){let V=u_(K.expression);if(!V)continue;let L=C0(V,$,J);Q.push({type:"extends",srcFilePath:$,srcSymbolName:Y,...L})}},ClassDeclaration(Z){z(Z)},ClassExpression(Z){z(Z)}}).visit(_),Q}function C0(_,$,J){let Q=J.get(_.root);if(Q){if(Q.importedName==="*"){let z=_.parts[_.parts.length-1]??_.root;return{dstFilePath:Q.path,dstSymbolName:z,metaJson:JSON.stringify({isNamespaceImport:!0})}}return{dstFilePath:Q.path,dstSymbolName:_.parts.length>0?_.full:Q.importedName}}return{dstFilePath:$,dstSymbolName:_.full,metaJson:JSON.stringify({isLocal:!0})}}function d_(_,$,J,Q=R_,z){let W=e0(_,$,J,Q),Z=_1(_,$,J,Q,z),Y=J1(_,$,W),X=Q1(_,$,W);return[...Z,...Y,...X]}function A0(_){let{ast:$,project:J,filePath:Q,relationRepo:z,projectRoot:W,tsconfigPaths:Z,knownFiles:Y,boundaries:X,module:K}=_,V=g_(W,Q),C=d_($,V,Z,Y?(w,T,F)=>{let S=R_(w,T,F);for(let v of S){let u=x_(W,v);if(X){let x=c(u,X);if(Y.has(`${x}::${u}`))return[v]}else if(Y.has(`${J}::${u}`))return[v]}return[]}:void 0,K),N=[];for(let w of C){if(w.dstFilePath===null){let v=x_(W,w.srcFilePath),u;if(w.metaJson)try{u=JSON.parse(w.metaJson)}catch{}let x=u?.isExternal===!0;N.push({project:J,type:w.type,srcFilePath:v,srcSymbolName:w.srcSymbolName??null,dstProject:null,dstFilePath:null,dstSymbolName:w.dstSymbolName??null,metaJson:w.metaJson??null,specifier:w.specifier??null,isExternal:x?1:0});continue}let T=x_(W,w.dstFilePath);if(T.startsWith(".."))continue;let F=x_(W,w.srcFilePath),S=X?c(T,X):J;N.push({project:J,type:w.type,srcFilePath:F,srcSymbolName:w.srcSymbolName??null,dstProject:S,dstFilePath:T,dstSymbolName:w.dstSymbolName??null,metaJson:w.metaJson??null,specifier:w.specifier??null,isExternal:0})}return z.replaceFileRelations(J,Q,N),N.length}import{isErr as dJ}from"@zipbul/result";var z1=/(?:^|\s)@([a-zA-Z][\w-]*\w|[a-zA-Z])\s*(.*)$/m;function pJ(_){let $=N_(_),J=[];for(let Q of $){J.push({name:Q.name,startLine:Q.span.start.line});for(let z of Q.members??[])J.push({name:`${Q.name}.${z.name}`,startLine:z.span.start.line})}return J.sort((Q,z)=>Q.startLine-z.startLine),J}function q0(_,$,J){let Q=0,z=_.length-1;while(Q<=z){let W=Q+z>>1;if(_[W].startLine<=$)Q=W+1;else z=W-1}if(Q<_.length){let W=_[Q];if(W.startLine-$<=J)return W.name}return null}function _0(_,$,J){let Q=V_(_,$),z=V_(_,J);return{start:Q,end:z}}function W1(_){let{comments:$,sourceText:J}=_;if(!$.length)return[];let Q=n_(J),z=pJ(_),W=[],Z=[...$].sort((X,K)=>X.start-K.start),Y=null;for(let X of Z)if(X.type==="Block"&&X.value.startsWith("*")){Y=null;let K=`/*${X.value}*/`,V=o_(K);if(dJ(V))continue;let L=V;if(!L.tags?.length)continue;let C=V_(Q,X.end),N=q0(z,C.line,3),w=J.slice(X.start,X.end);for(let T of L.tags){let F=[T.name,T.description].filter(Boolean).join(" "),S=`@${T.tag}`,v=w.indexOf(S),u;if(v>=0){let x=X.start+v,p=J.indexOf(`
4
- `,x),l=p>=0?Math.min(p,X.end):X.end;u=_0(Q,x,l)}else u=_0(Q,X.start,X.end);W.push({tag:T.tag,value:F,source:"jsdoc",span:u,symbolName:N})}}else if(X.type==="Block"){Y=null;let K=X.value.split(`
5
- `),V=0;for(let L of K){let C=L.replace(/^\s*\*?\s?/,""),N=z1.exec(C);if(N){let w=N[1],T=N[2]?.trim()??"",F=`@${w}`,S=L.indexOf(F),v=X.start+2+V+(S>=0?S:0),u=X.start+2+V+L.length,x=_0(Q,v,u),p=V_(Q,X.end),l=q0(z,p.line,3);W.push({tag:w,value:T,source:"block",span:x,symbolName:l})}V+=L.length+1}}else{let K=X.value,V=z1.exec(K),L=V_(Q,X.start),C=V_(Q,X.end);if(V){let N=V[1],w=V[2]?.trim()??"",T=`@${N}`,F=K.indexOf(T),S=X.start+2+(F>=0?F:0),v=_0(Q,S,X.end),u=q0(z,C.line,3),x={tag:N,value:w,source:"line",span:v,symbolName:u};W.push(x),Y={annotation:x,endLine:C.line}}else if(Y&&L.line===Y.endLine+1){let N=K.trim();if(N)Y.annotation.value+=" "+N,Y.annotation.span.end=V_(Q,X.end),Y.endLine=C.line}else Y=null}return W}function N0(_){let{parsed:$,project:J,filePath:Q,annotationRepo:z}=_,W=W1($);if(z.deleteFileAnnotations(J,Q),!W.length)return 0;let Z=new Date().toISOString(),Y=W.map((X)=>({project:J,filePath:Q,tag:X.tag,value:X.value,source:X.source,symbolName:X.symbolName,startLine:X.span.start.line,startColumn:X.span.start.column,endLine:X.span.end.line,endColumn:X.span.end.column,indexedAt:Z}));return z.insertBatch(J,Q,Y),W.length}function Y1(_,$){let J=[],Q=[],z=[];for(let[V,L]of $)if(!_.has(V))J.push({name:L.name,filePath:L.filePath,kind:L.kind,fingerprint:L.fingerprint});for(let[V,L]of _)if(!$.has(V))Q.push({name:L.name,filePath:L.filePath,kind:L.kind,fingerprint:L.fingerprint});if(!J.length||!Q.length)return{renamed:z,added:J,removed:Q};let W=new Map,Z=new Map;for(let V of J){let L=W.get(V.filePath)??[];L.push(V),W.set(V.filePath,L)}for(let V of Q){let L=Z.get(V.filePath)??[];L.push(V),Z.set(V.filePath,L)}let Y=new Set,X=new Set;for(let[V,L]of W){let C=Z.get(V);if(!C)continue;for(let N of new Set(L.map((w)=>w.kind))){let w=L.filter((u)=>u.kind===N&&!Y.has(u)),T=C.filter((u)=>u.kind===N&&!X.has(u));if(!w.length||!T.length)continue;let F=(u,x)=>{return x.get(`${u.filePath}::${u.name}`)?.structuralFingerprint??null},S=(u,x)=>{return x.get(`${u.filePath}::${u.name}`)?.startLine??0},v=new Map;for(let u of T){let x=F(u,_);if(!x)continue;let p=v.get(x)??[];p.push(u),v.set(x,p)}for(let u of w){if(Y.has(u))continue;let x=F(u,$);if(!x)continue;let p=v.get(x);if(!p)continue;let l=p.filter((Z_)=>!X.has(Z_));if(!l.length)continue;let z_=l[0];if(l.length>1){let Z_=S(u,$),H_=Math.abs(S(z_,_)-Z_);for(let X_=1;X_<l.length;X_++){let W_=Math.abs(S(l[X_],_)-Z_);if(W_<H_)H_=W_,z_=l[X_]}}z.push({oldName:z_.name,newName:u.name,filePath:V,kind:N}),Y.add(u),X.add(z_)}}}let K=z.filter((V)=>!V.oldName.includes("."));for(let V of K){let L=`${V.oldName}.`,C=`${V.newName}.`,N=Q.filter((T)=>T.filePath===V.filePath&&T.name.startsWith(L)&&!X.has(T)),w=J.filter((T)=>T.filePath===V.filePath&&T.name.startsWith(C)&&!Y.has(T));for(let T of N){let F=T.name.slice(L.length),S=w.find((v)=>v.name.slice(C.length)===F);if(S)z.push({oldName:T.name,newName:S.name,filePath:V.filePath,kind:T.kind}),Y.add(S),X.add(T)}}return{renamed:z,added:J.filter((V)=>!Y.has(V)),removed:Q.filter((V)=>!X.has(V))}}var lJ=100,X1=50;class R0{opts;logger;callbacks=new Set;indexingLock=!1;pendingEvents=[];debounceTimer=null;currentIndexing=null;pendingFullIndex=!1;pendingFullIndexWaiters=[];tsconfigPathsRaw;boundariesRefresh=null;lastPruneAt=0;constructor(_){this.opts=_,this.logger=_.logger??console,this.tsconfigPathsRaw=m_(_.projectRoot)}get tsconfigPaths(){return this.tsconfigPathsRaw}fullIndex(){return this.startIndex(void 0,!0)}incrementalIndex(_){return this.startIndex(_,!1)}onIndexed(_){return this.callbacks.add(_),()=>this.callbacks.delete(_)}handleWatcherEvent(_){if(_.filePath.endsWith("tsconfig.json")){r_(this.opts.projectRoot),this.tsconfigPathsRaw=m_(this.opts.projectRoot),this.fullIndex().catch(($)=>{this.logger.error("[IndexCoordinator] fullIndex failed after tsconfig change:",$)});return}if(_.filePath.endsWith("package.json")){let $=this.opts.discoverProjectsFn??s_;this.boundariesRefresh=$(this.opts.projectRoot).then((J)=>{this.opts.boundaries=J,this.opts.onBoundariesChanged?.(J)}),this.fullIndex().catch((J)=>{this.logger.error("[IndexCoordinator] fullIndex failed after package.json change:",J)});return}if(this.pendingEvents.push(_),this.debounceTimer===null)this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.flushPending()},lJ)}async shutdown(){if(this.debounceTimer!==null)clearTimeout(this.debounceTimer),this.debounceTimer=null;if(this.currentIndexing)await this.currentIndexing}startIndex(_,$){if(this.indexingLock){if($)return this.pendingFullIndex=!0,new Promise((Q,z)=>{this.pendingFullIndexWaiters.push({resolve:Q,reject:z})});return this.currentIndexing}this.indexingLock=!0;let J=this.doIndex(_,$).then((Q)=>{return this.fireCallbacks(Q),Q}).finally(()=>{if(this.indexingLock=!1,this.currentIndexing=null,this.pendingFullIndex){this.pendingFullIndex=!1;let Q=this.pendingFullIndexWaiters.splice(0);this.startIndex(void 0,!0).then((z)=>{for(let W of Q)W.resolve(z)}).catch((z)=>{for(let W of Q)W.reject(z)})}else if(this.pendingEvents.length>0){let Q=this.pendingEvents.splice(0);this.startIndex(Q,!1).catch((z)=>this.logger.error("[IndexCoordinator] incremental drain error",z))}});return this.currentIndexing=J,J}async doIndex(_,$){let J=Date.now(),{fileRepo:Q,symbolRepo:z,relationRepo:W,dbConnection:Z}=this.opts;if(this.boundariesRefresh)await this.boundariesRefresh,this.boundariesRefresh=null;let Y,X;if(_!==void 0)Y=_.filter((U)=>U.eventType==="create"||U.eventType==="change").map((U)=>({filePath:U.filePath,contentHash:"",mtimeMs:0,size:0})),X=_.filter((U)=>U.eventType==="delete").map((U)=>U.filePath);else{let U=new Map;for(let M of this.opts.boundaries)for(let[B,A]of Q.getFilesMap(M.project))U.set(B,A);let H=await o0({projectRoot:this.opts.projectRoot,extensions:this.opts.extensions,ignorePatterns:this.opts.ignorePatterns,fileRepo:{getFilesMap:()=>U}});Y=H.changed,X=H.deleted}let K=await this.tsconfigPathsRaw??void 0,V=new Map;for(let U of X){let H=c(U,this.opts.boundaries),M=z.getFileSymbols(H,U);V.set(U,M)}let L=crypto.randomUUID(),C=new Map,N=new Map,w=(U)=>({name:U.name,filePath:U.filePath,kind:U.kind,fingerprint:U.fingerprint,structuralFingerprint:U.structuralFingerprint??null,startLine:U.startLine,isExported:U.isExported??0});if($)for(let U of this.opts.boundaries)for(let H of Q.getAllFiles(U.project))for(let M of z.getFileSymbols(U.project,H.filePath))C.set(`${M.filePath}::${M.name}`,w(M));else{for(let U of Y){let H=c(U.filePath,this.opts.boundaries);for(let M of z.getFileSymbols(H,U.filePath))C.set(`${M.filePath}::${M.name}`,w(M))}for(let[,U]of V)for(let H of U)C.set(`${H.filePath}::${H.name}`,w(H))}let T=(U)=>`${U.type}|${U.srcFilePath}|${U.dstFilePath??""}|${U.srcSymbolName??""}|${U.dstSymbolName??""}|${O_(U.metaJson??"")}`,F=new Map;if($)for(let U of this.opts.boundaries)for(let H of Q.getAllFiles(U.project))for(let M of W.getOutgoing(U.project,H.filePath))F.set(T(M),M);else{for(let U of Y){let H=c(U.filePath,this.opts.boundaries);for(let M of W.getOutgoing(H,U.filePath))F.set(T(M),M)}for(let U of X){let H=c(U,this.opts.boundaries);for(let M of W.getOutgoing(H,U))F.set(T(M),M)}}let{annotationRepo:S,changelogRepo:v}=this.opts,u=()=>{for(let U of X){let H=c(U,this.opts.boundaries);if(z.deleteFileSymbols(H,U),W.deleteFileRelations(H,U),W.deleteIncomingRelations(H,U),S)S.deleteFileAnnotations(H,U);Q.deleteFile(H,U)}},x=0,p=async()=>{let{projectRoot:U,boundaries:H}=this.opts,{parseCache:M}=this.opts,B=0,A=0,I=0,G=[],R=[];for(let k of Y)try{let b=g_(U,k.filePath),d=Bun.file(b),$_=await d.text(),U_=k.contentHash||O_($_),L_=c(k.filePath,H);Q.upsertFile({project:L_,filePath:k.filePath,mtimeMs:d.lastModified,size:d.size,contentHash:U_,updatedAt:new Date().toISOString(),lineCount:$_.split(`
6
- `).length});let D_=(this.opts.parseSourceFn??k_)(b,$_);if(Z1(D_))throw D_.data;let f$=D_;R.push({filePath:k.filePath,text:$_,contentHash:U_,parsed:f$,project:L_})}catch(b){this.logger.error(`[IndexCoordinator] Failed to prepare ${k.filePath}:`,b),G.push(k.filePath)}let j=new Set;for(let k of H)for(let[b]of Q.getFilesMap(k.project))j.add(`${k.project}::${b}`);return Z.transaction(()=>{for(let k of R){if(I0({parsed:k.parsed,project:k.project,filePath:k.filePath,contentHash:k.contentHash,symbolRepo:z}),A+=A0({ast:k.parsed.program,project:k.project,filePath:k.filePath,relationRepo:W,projectRoot:U,tsconfigPaths:K,knownFiles:j,boundaries:H,module:k.parsed.module}),S)I+=N0({parsed:k.parsed,project:k.project,filePath:k.filePath,annotationRepo:S});M.set(k.filePath,k.parsed),B+=z.getFileSymbols(k.project,k.filePath).length}}),{symbols:B,relations:A,annotations:I,failedFiles:G}},l=0,z_=0,Z_=[];if($){let{projectRoot:U,boundaries:H}=this.opts,{parseCache:M}=this.opts,B=[];for(let I=0;I<Y.length;I+=X1){let G=Y.slice(I,I+X1),R=await Promise.allSettled(G.map(async(j)=>{let k=g_(U,j.filePath),b=Bun.file(k),d=await b.text(),$_=j.contentHash||O_(d);return{filePath:j.filePath,text:d,contentHash:$_,mtimeMs:b.lastModified,size:b.size}}));for(let j=0;j<R.length;j++){let k=R[j];if(k.status==="fulfilled")B.push(k.value);else this.logger.error("[IndexCoordinator] Failed to pre-read file:",k.reason),Z_.push(G[j].filePath)}}let A=[];Z.transaction(()=>{for(let R of B){let j=c(R.filePath,H);Q.deleteFile(j,R.filePath)}for(let R of X){let j=c(R,H);if(z.deleteFileSymbols(j,R),W.deleteFileRelations(j,R),W.deleteIncomingRelations(j,R),S)S.deleteFileAnnotations(j,R);Q.deleteFile(j,R)}for(let R of B){let j=c(R.filePath,H);Q.upsertFile({project:j,filePath:R.filePath,mtimeMs:R.mtimeMs,size:R.size,contentHash:R.contentHash,updatedAt:new Date().toISOString(),lineCount:R.text.split(`
7
- `).length})}let I=new Set;for(let R of H)for(let[j]of Q.getFilesMap(R.project))I.add(`${R.project}::${j}`);let G=this.opts.parseSourceFn??k_;for(let R of B){let j=c(R.filePath,H),k=G(g_(U,R.filePath),R.text);if(Z1(k))throw k.data;let b=k;if(A.push({filePath:R.filePath,parsed:b}),I0({parsed:b,project:j,filePath:R.filePath,contentHash:R.contentHash,symbolRepo:z}),S)x+=N0({parsed:b,project:j,filePath:R.filePath,annotationRepo:S});z_+=A0({ast:b.program,project:j,filePath:R.filePath,relationRepo:W,projectRoot:U,tsconfigPaths:K,knownFiles:I,boundaries:H,module:b.module}),l+=z.getFileSymbols(j,R.filePath).length}});for(let I of A)M.set(I.filePath,I.parsed)}else{u();let U=await p();l=U.symbols,z_=U.relations,x=U.annotations,Z_=U.failedFiles}for(let U of Y){let H=c(U.filePath,this.opts.boundaries);for(let M of z.getFileSymbols(H,U.filePath))N.set(`${M.filePath}::${M.name}`,w(M))}let H_=new Map;for(let U of Y){let H=c(U.filePath,this.opts.boundaries);for(let M of W.getOutgoing(H,U.filePath))H_.set(T(M),M)}let X_=(U)=>({type:U.type,srcFilePath:U.srcFilePath,dstFilePath:U.dstFilePath,srcSymbolName:U.srcSymbolName,dstSymbolName:U.dstSymbolName,dstProject:U.dstProject,metaJson:U.metaJson}),W_={added:[...H_.entries()].filter(([U])=>!F.has(U)).map(([,U])=>X_(U)),removed:[...F.entries()].filter(([U])=>!H_.has(U)).map(([,U])=>X_(U))},i={added:[],modified:[],removed:[]};for(let[U,H]of N){let M=C.get(U);if(!M)i.added.push({name:H.name,filePath:H.filePath,kind:H.kind,isExported:Boolean(H.isExported)});else{let B=M.fingerprint!==H.fingerprint,A=M.isExported!==H.isExported,I=M.structuralFingerprint!==null&&H.structuralFingerprint!==null&&M.structuralFingerprint!==H.structuralFingerprint;if(B||A||I)i.modified.push({name:H.name,filePath:H.filePath,kind:H.kind,isExported:Boolean(H.isExported)})}}for(let[U,H]of C)if(!N.has(U))i.removed.push({name:H.name,filePath:H.filePath,kind:H.kind,isExported:Boolean(H.isExported)});let a=Y1(C,N),I_=new Set(a.renamed.map((U)=>`${U.filePath}::${U.oldName}`)),D=new Set(a.renamed.map((U)=>`${U.filePath}::${U.newName}`));i.added=i.added.filter((U)=>!D.has(`${U.filePath}::${U.name}`)),i.removed=i.removed.filter((U)=>!I_.has(`${U.filePath}::${U.name}`));let q=[];if(!$){for(let[H,M]of V)for(let B of M){if(!B.fingerprint)continue;let A=c(H,this.opts.boundaries),I=z.getByFingerprint(A,B.fingerprint);if(I.length===1){let G=I[0];W.retargetRelations({dstProject:A,oldFile:H,oldSymbol:B.name,newFile:G.filePath,newSymbol:G.name}),q.push({name:G.name,filePath:G.filePath,kind:G.kind,oldFilePath:H,isExported:G.isExported??0})}}let U=new Set(q.map((H)=>`${H.oldFilePath}::${H.name}`));for(let H of a.removed){if(U.has(`${H.filePath}::${H.name}`))continue;let B=C.get(`${H.filePath}::${H.name}`)?.fingerprint;if(!B)continue;let A=c(H.filePath,this.opts.boundaries),I=z.getByFingerprint(A,B);if(I.length===1){let G=I[0];if(G.filePath!==H.filePath||G.name!==H.name)W.retargetRelations({dstProject:A,oldFile:H.filePath,oldSymbol:H.name,newFile:G.filePath,newSymbol:G.name}),q.push({name:G.name,filePath:G.filePath,kind:G.kind,oldFilePath:H.filePath,isExported:G.isExported??0})}}}if(q.length){let U=new Set(q.map((M)=>`${M.filePath}::${M.name}`)),H=new Set(q.map((M)=>`${M.oldFilePath}::${M.name}`));i.added=i.added.filter((M)=>!U.has(`${M.filePath}::${M.name}`)),i.removed=i.removed.filter((M)=>!H.has(`${M.filePath}::${M.name}`))}if(v){let U=new Date().toISOString(),H=$?1:0,M=[];for(let B of i.added){let A=`${B.filePath}::${B.name}`,I=N.get(A),G=c(B.filePath,this.opts.boundaries);M.push({project:G,changeType:"added",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:null,fingerprint:I?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of i.modified){let A=N.get(`${B.filePath}::${B.name}`),I=c(B.filePath,this.opts.boundaries);M.push({project:I,changeType:"modified",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:null,fingerprint:A?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of i.removed){let A=`${B.filePath}::${B.name}`,I=C.get(A),G=c(B.filePath,this.opts.boundaries);M.push({project:G,changeType:"removed",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:null,fingerprint:I?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of a.renamed){let A=N.get(`${B.filePath}::${B.newName}`),I=c(B.filePath,this.opts.boundaries);M.push({project:I,changeType:"renamed",symbolName:B.newName,symbolKind:B.kind,filePath:B.filePath,oldName:B.oldName,oldFilePath:null,fingerprint:A?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of q){let A=N.get(`${B.filePath}::${B.name}`),I=c(B.filePath,this.opts.boundaries);M.push({project:I,changeType:"moved",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:B.oldFilePath,fingerprint:A?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}if(M.length)try{Z.transaction(()=>{v.insertBatch(M)})}catch(B){this.logger.error("[IndexCoordinator] changelog insert failed:",B)}if(Date.now()-this.lastPruneAt>3600000){this.lastPruneAt=Date.now();let B=new Date(Date.now()-2592000000).toISOString();try{for(let A of this.opts.boundaries)v.pruneOlderThan(A.project,B)}catch(A){this.logger.error("[IndexCoordinator] changelog pruning failed:",A)}}}return{indexedFiles:Y.length,removedFiles:X.length,totalSymbols:l,totalRelations:z_,totalAnnotations:x,durationMs:Date.now()-J,changedFiles:Y.map((U)=>U.filePath),deletedFiles:[...X],failedFiles:Z_,changedSymbols:i,renamedSymbols:a.renamed.map((U)=>({oldName:U.oldName,newName:U.newName,filePath:U.filePath,kind:U.kind,isExported:Boolean(N.get(`${U.filePath}::${U.newName}`)?.isExported)})),movedSymbols:q.map((U)=>({name:U.name,oldFilePath:U.oldFilePath,newFilePath:U.filePath,kind:U.kind,isExported:Boolean(U.isExported)})),changedRelations:W_}}fireCallbacks(_){for(let $ of this.callbacks)try{$(_)}catch(J){this.logger.error("[IndexCoordinator] onIndexed callback threw:",J)}}flushPending(){if(this.indexingLock)return;if(this.pendingEvents.length>0){let _=this.pendingEvents.splice(0);this.startIndex(_,!1).catch(($)=>this.logger.error("[IndexCoordinator] flushPending startIndex error:",$))}}}function iJ(_){try{return process.kill(_,0),!0}catch($){if(typeof $==="object"&&$&&"code"in $)return $.code!=="ESRCH";return!0}}function cJ(_){let $=new Date(_).getTime();return Number.isNaN($)?0:$}function U1(_,$,J={}){let Q=J.now??Date.now,z=J.isAlive??iJ,W=J.staleAfterSeconds??60,Z=J.instanceId;return _.immediateTransaction(()=>{let Y=_.selectOwner();if(!Y)return _.insertOwner($,Z),"owner";let X=Math.floor((Q()-cJ(Y.heartbeat_at))/1000),K=z(Y.pid);if(K&&Z&&Y.instance_id&&Y.instance_id!==Z&&Y.pid===$)return _.replaceOwner($,Z),"owner";if(K&&X<W)return"reader";return _.replaceOwner($,Z),"owner"})}function V1(_,$){_.deleteOwner($)}function O1(_,$){_.touchOwner($)}class p_{#_;#$=new Map;constructor(_){this.#_=Math.max(1,_)}get size(){return this.#$.size}has(_){return this.#$.has(_)}get(_){if(!this.#$.has(_))return;let $=this.#$.get(_);return this.#$.delete(_),this.#$.set(_,$),$}set(_,$){if(this.#$.has(_))this.#$.delete(_);if(this.#$.set(_,$),this.#$.size>this.#_){let J=this.#$.keys().next().value;if(J!==void 0)this.#$.delete(J)}}delete(_){return this.#$.delete(_)}clear(){this.#$.clear()}}class T0{lru;constructor(_=500){this.lru=new p_(_)}get(_){return this.lru.get(_)}set(_,$){this.lru.set(_,$)}invalidate(_){this.lru.delete(_)}invalidateAll(){this.lru.clear()}size(){return this.lru.size}}function G0(_){let{symbolRepo:$,project:J,query:Q}=_,z=Q.project??J,W={kind:Q.kind,filePath:Q.filePath,isExported:Q.isExported,project:z,limit:Q.limit,resolvedType:Q.resolvedType};if(Q.text)if(Q.exact)W.exactName=Q.text;else{let Y=j_(Q.text);if(Y)W.ftsQuery=Y}if(Q.decorator)W.decorator=Q.decorator;if(Q.regex)W.regex=Q.regex;return $.searchByQuery(W).map((Y)=>{let X=Y.name.indexOf(".");return{id:Y.id,filePath:Y.filePath,kind:Y.kind,name:Y.name,memberName:X>=0?Y.name.slice(X+1):null,span:{start:{line:Y.startLine,column:Y.startColumn},end:{line:Y.endLine,column:Y.endColumn}},isExported:Y.isExported===1,signature:Y.signature,fingerprint:Y.fingerprint,detail:Y.detailJson?(()=>{try{return JSON.parse(Y.detailJson)}catch{return{}}})():{}}})}function S0(_){let{relationRepo:$,project:J,query:Q}=_;if(Q.srcFilePath&&Q.srcFilePathPattern)throw new O("validation","srcFilePath and srcFilePathPattern are mutually exclusive");if(Q.dstFilePath&&Q.dstFilePathPattern)throw new O("validation","dstFilePath and dstFilePathPattern are mutually exclusive");let z=Q.project??J,W=Q.limit,Z=!!(Q.srcFilePathPattern||Q.dstFilePathPattern),Y=Z?void 0:W,K=$.searchRelations({srcFilePath:Q.srcFilePath,srcSymbolName:Q.srcSymbolName,dstFilePath:Q.dstFilePath,dstSymbolName:Q.dstSymbolName,dstProject:Q.dstProject,type:Q.type,project:z,specifier:Q.specifier,isExternal:Q.isExternal,limit:Y}).map((V)=>{let L;if(V.metaJson)try{L=JSON.parse(V.metaJson)}catch{}return{type:V.type,srcFilePath:V.srcFilePath,srcSymbolName:V.srcSymbolName,dstFilePath:V.dstFilePath,dstSymbolName:V.dstSymbolName,dstProject:V.dstProject,isExternal:V.isExternal===1,specifier:V.specifier,metaJson:V.metaJson??void 0,meta:L}});if(Q.srcFilePathPattern||Q.dstFilePathPattern){let V=Q.srcFilePathPattern?new Bun.Glob(Q.srcFilePathPattern):null,L=Q.dstFilePathPattern?new Bun.Glob(Q.dstFilePathPattern):null;K=K.filter((C)=>(!V||V.match(C.srcFilePath))&&(!L||C.dstFilePath===null||L.match(C.dstFilePath)))}if(Z&&W!==void 0&&K.length>W)K=K.slice(0,W);return K}import{findInFiles as aJ,Lang as sJ}from"@ast-grep/napi";function rJ(_){let $=new Set,J=/\${1,3}([A-Z_][A-Z_0-9]*)/g,Q;while((Q=J.exec(_))!==null)$.add(Q[0]);return[...$]}function oJ(_){return _.replace(/^\$+/,"")}function tJ(_,$){if($.length===0)return;let J={},Q=!1;for(let z of $){let W=oJ(z),Z=_.getMatch(W);if(Z){let X=Z.range();J[z]={text:Z.text(),startLine:X.start.line+1,endLine:X.end.line+1,startColumn:X.start.column,endColumn:X.end.column,startOffset:X.start.index,endOffset:X.end.index},Q=!0;continue}let Y=_.getMultipleMatches(W);if(Y.length>0){let X=Y[0].range(),K=Y[Y.length-1].range();J[z]={text:Y.map((V)=>V.text()).join(", "),startLine:X.start.line+1,endLine:K.end.line+1,startColumn:X.start.column,endColumn:K.end.column,startOffset:X.start.index,endOffset:K.end.index},Q=!0}}return Q?J:void 0}async function F0(_){if(_.filePaths.length===0)return[];let $=rJ(_.pattern),J=[];return await aJ(sJ.TypeScript,{paths:_.filePaths,matcher:{rule:{pattern:_.pattern}}},(Q,z)=>{if(Q){console.warn("[patternSearch] findInFiles callback error:",Q);return}for(let W of z){let Z=W.range(),Y={filePath:W.getRoot().filename(),startLine:Z.start.line+1,endLine:Z.end.line+1,startColumn:Z.start.column,endColumn:Z.end.column,startOffset:Z.start.index,endOffset:Z.end.index,matchedText:W.text()},X=tJ(W,$);if(X)Y.captures=X;J.push(Y)}}),J}import e from"typescript";import{isErr as MQ}from"@zipbul/result";import B_ from"typescript";import eJ from"path";import{err as j0}from"@zipbul/result";function _Q(_){try{return h0("fs").readFileSync(_,"utf-8")}catch{return}}function $Q(_){try{return h0("fs").readFileSync(_,"utf-8")}catch{return}}class $0{#_;#$;#J=!1;__testing__;constructor(_,$){this.#_=_,this.#$=$,this.__testing__={host:$}}static create(_,$={}){let J=$.readConfigFile??_Q,Q=$.resolveNonTrackedFile??$Q,z=eJ.dirname(_),W=J(_);if(W===void 0)return j0(new O("semantic",`tsconfig not found: ${_}`));let Z=B_.parseJsonText(_,W),Y=Z.parseDiagnostics;if(Y&&Y.length>0){let L=Y.map((C)=>B_.flattenDiagnosticMessageText(C.messageText,`
8
- `)).join("; ");return j0(new O("semantic",`tsconfig parse error: ${L}`))}let X=B_.parseJsonSourceFileConfigFileContent(Z,{useCaseSensitiveFileNames:!0,readDirectory:()=>[],fileExists:(L)=>J(L)!==void 0||Q(L)!==void 0,readFile:(L)=>J(L)??Q(L)},z);if(X.errors.length>0){let L=X.errors.filter((C)=>C.category===B_.DiagnosticCategory.Error&&C.code!==18003);if(L.length>0){let C=L.map((N)=>B_.flattenDiagnosticMessageText(N.messageText,`
9
- `)).join("; ");return j0(new O("semantic",`tsconfig compile error: ${C}`))}}let K=new H1(X.fileNames,X.options,z,Q),V=B_.createLanguageService(K);return new $0(V,K)}get isDisposed(){return this.#J}getProgram(){this.#W();let _=this.#_.getProgram();if(!_)throw Error("TscProgram: LanguageService returned null Program");return _}getChecker(){return this.#W(),this.getProgram().getTypeChecker()}getLanguageService(){return this.#W(),this.#_}notifyFileChanged(_,$){if(this.#J)return;this.#$.updateFile(_,$)}removeFile(_){if(this.#J)return;this.#$.removeFile(_)}dispose(){if(this.#J)return;this.#J=!0,this.#_.dispose()}#W(){if(this.#J)throw Error("TscProgram is disposed")}}class H1{#_;#$;#J;#W;#z=new Map;#Y=new Map;#Q=new Map;constructor(_,$,J,Q){this.#_=new Set(_),this.#$=$,this.#J=J,this.#W=Q}updateFile(_,$){let J=this.#z.get(_);if(J)this.#Y.delete(`${_}:${J.version}`),J.version+=1,J.content=$;else this.#z.set(_,{version:1,content:$})}removeFile(_){let $=this.#z.get(_);if($)this.#Y.delete(`${_}:${$.version}`);this.#z.delete(_),this.#_.delete(_)}getScriptFileNames(){let _=[...this.#z.keys()];return[...[...this.#_].filter((J)=>!this.#z.has(J)),..._]}getScriptVersion(_){let $=this.#z.get(_);return $?String($.version):"0"}getScriptSnapshot(_){let $=this.#z.get(_);if($){let z=`${_}:${$.version}`,W=this.#Y.get(z);if(!W)W=B_.ScriptSnapshot.fromString($.content),this.#Y.set(z,W);return W}let J=this.#Q.get(_);if(J)return J;let Q=this.#W(_);if(Q!==void 0)return J=B_.ScriptSnapshot.fromString(Q),this.#Q.set(_,J),J;return}getCurrentDirectory(){return this.#J}getCompilationSettings(){return this.#$}getDefaultLibFileName(_){return B_.getDefaultLibFilePath(_)}fileExists(_){if(this.#z.has(_))return!0;return this.#W(_)!==void 0}readFile(_){let $=this.#z.get(_);if($)return $.content;return this.#W(_)}}import n from"typescript";import M1 from"typescript";function t(_,$){if($<0||$>=_.getEnd())return;let J,Q=(z)=>{if($<z.getStart(_,!1)||$>=z.getEnd())return;J=z,M1.forEachChild(z,Q)};return M1.forEachChild(_,Q),J}var J0=8;function JQ(_){return!!(_.flags&n.TypeFlags.Object)&&!!(_.objectFlags&n.ObjectFlags.Reference)}function K_(_,$,J=0,Q){if(Q){let w=Q.get($);if(w)return w}let z=_.typeToString($),W=$.flags,Z=!!(W&n.TypeFlags.Union),Y=!!(W&n.TypeFlags.Intersection),X;if(J<J0&&JQ($)){let w=_.getTypeArguments($);if(w.length>0)X=w}let K=!!(W&n.TypeFlags.TypeParameter)||X!==void 0&&X.length>0,V;if(Z&&J<J0)V=$.types.map((w)=>K_(_,w,J+1,Q));else if(Y&&J<J0)V=$.types.map((w)=>K_(_,w,J+1,Q));let L;if(X&&X.length>0)L=X.map((w)=>K_(_,w,J+1,Q));let C;if(J<J0&&!!(W&n.TypeFlags.Object)&&!Z&&!Y){let w=_.getPropertiesOfType($);if(w.length>0&&w.length<=50){let T=$.symbol?.declarations?.[0];C=[];for(let F of w){let S=F.declarations?.[0]??T;if(!S)continue;try{let v=_.getTypeOfSymbolAtLocation(F,S);C.push({name:F.getName(),type:K_(_,v,J+1,Q)})}catch{}}if(C.length===0)C=void 0}}let N={text:z,flags:W,isUnion:Z,isIntersection:Y,isGeneric:K,members:V,typeArguments:L,properties:C};if(Q)Q.set($,N);return N}function QQ(_){return n.isFunctionDeclaration(_)||n.isVariableDeclaration(_)||n.isClassDeclaration(_)||n.isInterfaceDeclaration(_)||n.isTypeAliasDeclaration(_)||n.isEnumDeclaration(_)||n.isMethodDeclaration(_)||n.isPropertyDeclaration(_)||n.isPropertySignature(_)||n.isMethodSignature(_)}var g0="/__gildash_type_probe__.ts";class k0{program;#_=null;constructor(_){this.program=_}#$(_){if(this.#_===_)return;this.program.notifyFileChanged(g0,`declare const __gildash_probe__: ${_};`),this.#_=_}#J(_,$){let J=_.getSourceFile(g0);if(!J)return null;let Q=J.statements[0];if(!Q||!n.isVariableStatement(Q))return null;let z=Q.declarationList.declarations[0];if(!z)return null;return $.getTypeAtLocation(z.name)}clearProbe(){if(this.#_!==null)this.program.removeFile(g0),this.#_=null}collectAt(_,$){let J=this.program.getProgram(),Q=J.getTypeChecker();if($<0)return null;let z=J.getSourceFile(_);if(!z)return null;if($>=z.getEnd())return null;let W=t(z,$);if(!W)return null;if(!n.isIdentifier(W)&&!n.isTypeNode(W))return null;try{let Z=Q.getTypeAtLocation(W);return K_(Q,Z,0,new Map)}catch{return null}}isAssignableTo(_,$,J,Q){let z=this.program.getProgram(),W=z.getTypeChecker(),Z=z.getSourceFile(_);if(!Z)return null;let Y=t(Z,$);if(!Y||!n.isIdentifier(Y))return null;let X=z.getSourceFile(J);if(!X)return null;let K=t(X,Q);if(!K||!n.isIdentifier(K))return null;try{let V=W.getTypeAtLocation(Y),L=W.getTypeAtLocation(K);return W.isTypeAssignableTo(V,L)}catch{return null}}isAssignableToType(_,$,J,Q){this.#$(J);let z=this.program.getProgram(),W=z.getTypeChecker(),Z=z.getSourceFile(_);if(!Z)return null;let Y=t(Z,$);if(!Y||!n.isIdentifier(Y)&&!n.isTypeNode(Y))return null;try{let X=this.#J(z,W);if(!X)return null;let K=W.getTypeAtLocation(Y);if(Q?.anyConstituent&&K.isUnion())return K.types.some((V)=>W.isTypeAssignableTo(V,X));return W.isTypeAssignableTo(K,X)}catch{return null}}isAssignableToTypeAtPositions(_,$,J,Q){let z=new Map;if($.length===0)return z;this.#$(J);let W=this.program.getProgram(),Z=W.getTypeChecker(),Y=W.getSourceFile(_);if(!Y)return z;try{let X=this.#J(W,Z);if(!X)return z;let K=Y.getEnd();for(let V of $){if(V<0||V>=K)continue;let L=t(Y,V);if(!L||!n.isIdentifier(L)&&!n.isTypeNode(L))continue;try{let C=Z.getTypeAtLocation(L);if(Q?.anyConstituent&&C.isUnion())z.set(V,C.types.some((N)=>Z.isTypeAssignableTo(N,X)));else z.set(V,Z.isTypeAssignableTo(C,X))}catch{}}}catch{}return z}collectAtPositions(_,$){let J=new Map;if($.length===0)return J;let Q=this.program.getProgram(),z=Q.getTypeChecker(),W=Q.getSourceFile(_);if(!W)return J;let Z=W.getEnd(),Y=new Map;for(let X of $){if(X<0||X>=Z)continue;let K=t(W,X);if(!K)continue;if(!n.isIdentifier(K)&&!n.isTypeNode(K))continue;try{let V=z.getTypeAtLocation(K);J.set(X,K_(z,V,0,Y))}catch{}}return J}collectFile(_){let $=new Map,J=this.program.getProgram(),Q=J.getTypeChecker(),z=J.getSourceFile(_);if(!z)return $;let W=new Map;function Z(Y){if(QQ(Y)&&Y.name&&n.isIdentifier(Y.name)){let X=Y.name;try{let K=Q.getTypeAtLocation(X),V=X.getStart(z);$.set(V,K_(Q,K,0,W))}catch{}}n.forEachChild(Y,Z)}return Z(z),$}}import w_ from"typescript";var zQ=1000,WQ=1;function YQ(_){let $=_.declarations?.[0],J=$?.getSourceFile(),Q=$?w_.getNameOfDeclaration($):void 0;return{name:_.getName(),filePath:J?.fileName??"",position:Q?.getStart(J,!1)??$?.getStart(J,!1)??0}}function Q0(_,$=0,J){let Q=_.declarations?.[0],z=Q?.getSourceFile(),W=Q?w_.getNameOfDeclaration(Q):void 0,Z=z?.fileName??"",Y=W?.getStart(z,!1)??Q?.getStart(z,!1)??0,X={name:_.getName(),filePath:Z,position:Y},K=_;if(K.parent)X.parent=YQ(K.parent);let V=J&&!!(_.flags&w_.SymbolFlags.Alias)?J.getAliasedSymbol(_):_;if($<WQ){let L=V.flags,C=!!(L&w_.SymbolFlags.Enum),N=!!(L&(w_.SymbolFlags.NamespaceModule|w_.SymbolFlags.ValueModule)),w=!!(L&(w_.SymbolFlags.Class|w_.SymbolFlags.Interface));if(C&&V.exports&&V.exports.size>0){let T=[];V.exports.forEach((F)=>{T.push(Q0(F,$+1,J))}),X.members=T}else if(w&&V.members&&V.members.size>0){let T=[];V.members.forEach((F)=>{T.push(Q0(F,$+1,J))}),X.members=T}if(N&&V.exports&&V.exports.size>0){let T=[];V.exports.forEach((F)=>{T.push(Q0(F,$+1,J))}),X.exports=T}}return X}class E0{#_;#$;#J=new Map;constructor(_,$=zQ){this.#_=_,this.#$=new p_($)}get(_,$){if(this.#_.isDisposed)return null;let J=`${_}:${$}`,Q=this.#$.get(J);if(Q!==void 0)return Q;let z=this.#_.getProgram(),W=z.getSourceFile(_);if(!W)return null;let Z=t(W,$);if(!Z||!w_.isIdentifier(Z))return null;let Y=z.getTypeChecker(),X=Y.getSymbolAtLocation(Z);if(!X)return null;let K=Q0(X,0,Y);this.#$.set(J,K);let V=this.#J.get(_);if(!V)V=new Set,this.#J.set(_,V);return V.add(J),K}invalidate(_){let $=this.#J.get(_);if($){for(let J of $)this.#$.delete(J);this.#J.delete(_)}}clear(){this.#$.clear(),this.#J.clear()}}import w1 from"typescript";import g from"typescript";function K1(_){if(_.getSourceFile().isDeclarationFile)return!0;for(let $=_;$;$=$.parent)if(ZQ($))return!0;return!1}function ZQ(_){if(!g.canHaveModifiers(_))return!1;return g.getModifiers(_)?.some((J)=>J.kind===g.SyntaxKind.DeclareKeyword)??!1}function L1(_){let $=(Q,z)=>({kind:Q,pos:z.getStart(),end:z.getEnd()}),J=_.parent;while(J){if(g.isSourceFile(J)||g.isModuleDeclaration(J))return $("module",J);if(g.isFunctionLike(J))return $("function",J);if(g.isClassStaticBlockDeclaration(J))return $("function",J);if(g.isPropertyDeclaration(J))return $("function",J);if(g.isBlock(J)){let Q=J.parent;if(Q&&(g.isFunctionLike(Q)||g.isClassStaticBlockDeclaration(Q)))return $("function",Q);return $("block",J)}if(g.isForStatement(J)||g.isForInStatement(J)||g.isForOfStatement(J)||g.isCatchClause(J)||g.isCaseBlock(J)||g.isWithStatement(J))return $("block",J);J=J.parent}return $("module",_.getSourceFile())}function B1(_){let $=_.parent;if(!$)return;if(g.isVariableDeclaration($)&&$.name===_)return"declaration";if(g.isParameter($)&&$.name===_)return"declaration";if(g.isBindingElement($)&&$.name===_)return"declaration";if((g.isForOfStatement($)||g.isForInStatement($))&&$.initializer===_)return"assignment";if((g.isPrefixUnaryExpression($)||g.isPostfixUnaryExpression($))&&$.operand===_&&($.operator===g.SyntaxKind.PlusPlusToken||$.operator===g.SyntaxKind.MinusMinusToken))return"update";let J=_;while(J.parent&&g.isParenthesizedExpression(J.parent))J=J.parent;let Q=J.parent;if(Q&&g.isBinaryExpression(Q)&&Q.left===J)return XQ(Q.operatorToken.kind);if(UQ(_))return"assignment";return}function XQ(_){switch(_){case g.SyntaxKind.EqualsToken:return"assignment";case g.SyntaxKind.PlusEqualsToken:case g.SyntaxKind.MinusEqualsToken:case g.SyntaxKind.AsteriskEqualsToken:case g.SyntaxKind.AsteriskAsteriskEqualsToken:case g.SyntaxKind.SlashEqualsToken:case g.SyntaxKind.PercentEqualsToken:case g.SyntaxKind.LessThanLessThanEqualsToken:case g.SyntaxKind.GreaterThanGreaterThanEqualsToken:case g.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:case g.SyntaxKind.AmpersandEqualsToken:case g.SyntaxKind.BarEqualsToken:case g.SyntaxKind.CaretEqualsToken:return"compound-assignment";case g.SyntaxKind.AmpersandAmpersandEqualsToken:case g.SyntaxKind.BarBarEqualsToken:case g.SyntaxKind.QuestionQuestionEqualsToken:return"logical-assignment";default:return}}function UQ(_){let $=_.parent;if(!$)return!1;if(!(g.isShorthandPropertyAssignment($)&&$.name===_||g.isPropertyAssignment($)&&$.initializer===_||g.isArrayLiteralExpression($)||g.isSpreadAssignment($)&&$.expression===_||g.isSpreadElement($)&&$.expression===_))return!1;let Q=$;while(Q.parent){let z=Q.parent;if(g.isBinaryExpression(z)&&z.left===Q&&z.operatorToken.kind===g.SyntaxKind.EqualsToken)return!0;if(g.isObjectLiteralExpression(z)||g.isArrayLiteralExpression(z)||g.isPropertyAssignment(z)||g.isShorthandPropertyAssignment(z)||g.isSpreadAssignment(z)||g.isSpreadElement(z)){Q=z;continue}return!1}return!1}class u0{#_;constructor(_){this.#_=_}findAt(_,$){let J=this.#$(_,$);if(!J)return[];let Q=this.#_.getProgram(),z=[];for(let W of J)for(let Z of W.references){let Y=Q.getSourceFile(Z.fileName);if(!Y)continue;z.push(I1(Z,Y))}return z}findEnrichedAt(_,$){let J=this.#$(_,$);if(!J)return[];let Q=this.#_.getProgram(),z=Q.getTypeChecker(),W=[];for(let Z of J){let Y=this.#J(Z,Q,z);for(let X of Z.references){let K=Q.getSourceFile(X.fileName);if(!K)continue;let V=t(K,X.textSpan.start),L=V&&w1.isIdentifier(V)?V:void 0;W.push({...I1(X,K),writeKind:L?B1(L):void 0,isAmbient:Y,enclosingScope:L1(L??K)})}}return W}#$(_,$){if(this.#_.isDisposed)return null;let Q=this.#_.getProgram().getSourceFile(_);if(!Q)return null;let z=t(Q,$);if(!z||!w1.isIdentifier(z))return null;let W=this.#_.getLanguageService().findReferences(_,$);if(!W||W.length===0)return null;return W}#J(_,$,J){let Q=_.definition,z=$.getSourceFile(Q.fileName);if(!z)return!1;let W=t(z,Q.textSpan.start);if(!W)return!1;let Y=J.getSymbolAtLocation(W)?.declarations;if(!Y||Y.length===0)return!1;return Y.every(K1)}}function I1(_,$){let{line:J,character:Q}=$.getLineAndCharacterOfPosition(_.textSpan.start);return{filePath:_.fileName,position:_.textSpan.start,line:J+1,column:Q,isDefinition:_.isDefinition??!1,isWrite:_.isWriteAccess??!1}}import h from"typescript";function VQ(_,$){let J=t(_,$);if(!J)return;if(D1(J))return J;let Q=J.parent;for(let z=0;z<5&&Q;z++){if(D1(Q))return Q;Q=Q.parent}return J}function D1(_){return h.isClassDeclaration(_)||h.isClassExpression(_)||h.isFunctionDeclaration(_)||h.isFunctionExpression(_)||h.isArrowFunction(_)||h.isVariableDeclaration(_)||h.isObjectLiteralExpression(_)}function C1(_){if(h.isClassDeclaration(_)||h.isClassExpression(_))return"class";if(h.isFunctionDeclaration(_)||h.isFunctionExpression(_)||h.isArrowFunction(_))return"function";if(h.isObjectLiteralExpression(_))return"object";if(h.isVariableDeclaration(_)&&_.initializer)return C1(_.initializer);return"class"}function OQ(_,$){if(h.isClassDeclaration(_)||h.isFunctionDeclaration(_))return _.name?.getText($)??"";if(h.isClassExpression(_))return _.name?.getText($)??"";if(h.isVariableDeclaration(_)&&h.isIdentifier(_.name))return _.name.getText($);if(h.isFunctionExpression(_))return _.name?.getText($)??"";if(h.isArrowFunction(_)&&_.parent&&h.isVariableDeclaration(_.parent)){if(h.isIdentifier(_.parent.name))return _.parent.name.getText($)}if(h.isObjectLiteralExpression(_)&&_.parent&&h.isVariableDeclaration(_.parent)){if(h.isIdentifier(_.parent.name))return _.parent.name.getText($)}return""}function HQ(_){if(!h.isClassDeclaration(_)&&!h.isClassExpression(_))return!1;let $=_.heritageClauses;if(!$)return!1;return $.some((J)=>J.token===h.SyntaxKind.ImplementsKeyword)}class v0{#_;constructor(_){this.#_=_}findAt(_,$){if(this.#_.isDisposed)return[];let J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return[];let z=t(Q,$);if(!z||!h.isIdentifier(z))return[];let Z=this.#_.getLanguageService().getImplementationAtPosition(_,$);if(!Z||Z.length===0)return[];let Y=[];for(let X of Z){if(X.kind===h.ScriptElementKind.interfaceElement||X.kind===h.ScriptElementKind.typeElement)continue;let K=J.getSourceFile(X.fileName);if(!K)continue;let V=VQ(K,X.textSpan.start);if(!V)continue;let L=C1(V),C=OQ(V,K),N=HQ(V);Y.push({filePath:X.fileName,symbolName:C,position:X.textSpan.start,kind:L,isExplicit:N})}return Y}}function KQ(_){if(e.isFunctionDeclaration(_))return"function";if(e.isClassDeclaration(_))return"class";if(e.isInterfaceDeclaration(_))return"interface";if(e.isTypeAliasDeclaration(_))return"type";if(e.isEnumDeclaration(_))return"enum";if(e.isVariableDeclaration(_))return"const";if(e.isVariableStatement(_))return"const";return"unknown"}function A1(_){if(_>=97&&_<=122)return!0;if(_>=65&&_<=90)return!0;if(_>=48&&_<=57)return!0;if(_===95||_===36)return!0;return!1}class z0{#_;#$;#J;#W;#z;#Y=!1;constructor(_,$,J,Q,z){this.#_=_,this.#$=$,this.#J=J,this.#W=Q,this.#z=z}static create(_,$={}){let J=$0.create(_,{readConfigFile:$.readConfigFile,resolveNonTrackedFile:$.resolveNonTrackedFile});if(MQ(J))return J;let Q=J,z=$.typeCollector??new k0(Q),W=$.symbolGraph??new E0(Q),Z=$.referenceResolver??new u0(Q),Y=$.implementationFinder??new v0(Q);return new z0(Q,z,W,Z,Y)}get isDisposed(){return this.#Y}collectTypeAt(_,$){return this.#Q(),this.#$.collectAt(_,$)}collectFileTypes(_){return this.#Q(),this.#$.collectFile(_)}collectTypesAtPositions(_,$){return this.#Q(),this.#$.collectAtPositions(_,$)}findReferences(_,$){return this.#Q(),this.#W.findAt(_,$)}findEnrichedReferences(_,$){return this.#Q(),this.#W.findEnrichedAt(_,$)}findImplementations(_,$){return this.#Q(),this.#z.findAt(_,$)}isTypeAssignableTo(_,$,J,Q){return this.#Q(),this.#$.isAssignableTo(_,$,J,Q)}isTypeAssignableToType(_,$,J,Q){return this.#Q(),this.#$.isAssignableToType(_,$,J,Q)}isTypeAssignableToTypeAtPositions(_,$,J,Q){return this.#Q(),this.#$.isAssignableToTypeAtPositions(_,$,J,Q)}getSymbolNode(_,$){return this.#Q(),this.#J.get(_,$)}getBaseTypes(_,$){this.#Q();let J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return null;let z=t(Q,$);if(!z)return null;let W=J.getTypeChecker(),Z=W.getTypeAtLocation(z);if(!(Z.flags&e.TypeFlags.Object)||!(Z.objectFlags&e.ObjectFlags.ClassOrInterface))return null;let Y=W.getBaseTypes(Z);if(!Y||Y.length===0)return[];let X=new Map;return Y.map((K)=>K_(W,K,0,X))}getModuleInterface(_){this.#Q();let $=[],J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return{filePath:_,exports:$};let z=J.getTypeChecker(),W=z.getSymbolAtLocation(Q);if(W){let Z=z.getExportsOfModule(W),Y=new Map;for(let X of Z){let K=X.getName(),V=X.declarations?.[0],L="unknown";if(V){if(L=KQ(V),L==="unknown"&&e.isExportAssignment(V))L="const"}let C=null;try{let N=z.getTypeOfSymbolAtLocation(X,V??Q);C=K_(z,N,0,Y)}catch{}$.push({name:K,kind:L,resolvedType:C})}}return{filePath:_,exports:$}}notifyFileChanged(_,$){if(this.#Y)return;this.#_.notifyFileChanged(_,$),this.#J.invalidate(_)}notifyFileDeleted(_){if(this.#Y)return;this.#_.removeFile(_),this.#J.invalidate(_)}lineColumnToPosition(_,$,J){this.#Q();let Q=this.#_.getProgram().getSourceFile(_);if(!Q)return null;try{return e.getPositionOfLineAndCharacter(Q,$-1,J)}catch{return null}}findNamePosition(_,$,J){this.#Q();let Q=this.#_.getProgram().getSourceFile(_);if(!Q)return null;let z=Q.getFullText(),W=$;while(W<z.length){let Z=z.indexOf(J,W);if(Z<0)return null;let Y=Z>0?z.charCodeAt(Z-1):32,X=Z+J.length<z.length?z.charCodeAt(Z+J.length):32;if(!A1(Y)&&!A1(X))return Z;W=Z+1}return null}getDiagnostics(_,$){this.#Q();let J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return[];let z={[e.DiagnosticCategory.Error]:"error",[e.DiagnosticCategory.Warning]:"warning",[e.DiagnosticCategory.Suggestion]:"suggestion",[e.DiagnosticCategory.Message]:"suggestion"};return(($?.preEmit)?e.getPreEmitDiagnostics(J,Q):J.getSemanticDiagnostics(Q)).map((Z)=>{let Y=1,X=0;if(Z.file&&Z.start!==void 0){let K=e.getLineAndCharacterOfPosition(Z.file,Z.start);Y=K.line+1,X=K.character}return{filePath:Z.file?.fileName??_,line:Y,column:X,message:e.flattenDiagnosticMessageText(Z.messageText,`
10
- `),code:Z.code,category:z[Z.category]??"error"}})}dispose(){if(this.#Y)return;this.#Y=!0,this.#$.clearProbe(),this.#_.dispose(),this.#J.clear()}#Q(){if(this.#Y)throw Error("SemanticLayer is disposed")}}import{eq as G_,and as q1,sql as LQ}from"drizzle-orm";var N1=80;class b0{db;constructor(_){this.db=_}insertBatch(_,$,J){if(!J.length)return;let Q=J.map((z)=>({project:_,filePath:$,tag:z.tag,value:z.value,source:z.source,symbolName:z.symbolName,startLine:z.startLine,startColumn:z.startColumn,endLine:z.endLine,endColumn:z.endColumn,indexedAt:z.indexedAt}));for(let z=0;z<Q.length;z+=N1)this.db.drizzleDb.insert(Y_).values(Q.slice(z,z+N1)).run()}deleteFileAnnotations(_,$){this.db.drizzleDb.delete(Y_).where(q1(G_(Y_.project,_),G_(Y_.filePath,$))).run()}search(_){let $=this.db.drizzleDb.select().from(Y_).where(q1(_.project?G_(Y_.project,_.project):void 0,_.tag?G_(Y_.tag,_.tag):void 0,_.filePath?G_(Y_.filePath,_.filePath):void 0,_.symbolName?G_(Y_.symbolName,_.symbolName):void 0,_.source?G_(Y_.source,_.source):void 0,_.ftsQuery?LQ`${Y_.id} IN (SELECT rowid FROM annotations_fts WHERE annotations_fts MATCH ${_.ftsQuery})`:void 0));return(_.limit!==void 0?$.limit(_.limit):$).all()}}import{eq as v_,and as R1,sql as l_,gt as BQ,gte as wQ}from"drizzle-orm";var T1=80;class P0{db;constructor(_){this.db=_}insertBatch(_){if(!_.length)return;let $=_.map((J)=>({project:J.project,changeType:J.changeType,symbolName:J.symbolName,symbolKind:J.symbolKind,filePath:J.filePath,oldName:J.oldName,oldFilePath:J.oldFilePath,fingerprint:J.fingerprint,changedAt:J.changedAt,isFullIndex:J.isFullIndex,indexRunId:J.indexRunId}));for(let J=0;J<$.length;J+=T1)this.db.drizzleDb.insert(__).values($.slice(J,J+T1)).run()}getSince(_){return this.db.drizzleDb.select().from(__).where(R1(v_(__.project,_.project),wQ(__.changedAt,_.since),_.symbolName?v_(__.symbolName,_.symbolName):void 0,_.changeTypes?.length?l_`${__.changeType} IN (${l_.join(_.changeTypes.map(($)=>l_`${$}`),l_`, `)})`:void 0,_.filePath?v_(__.filePath,_.filePath):void 0,_.includeFullIndex?void 0:v_(__.isFullIndex,0),_.indexRunId?v_(__.indexRunId,_.indexRunId):void 0,_.afterId?BQ(__.id,_.afterId):void 0)).orderBy(__.id).limit(_.limit).all()}pruneOlderThan(_,$){return this.db.drizzleDb.delete(__).where(R1(v_(__.project,_),l_`${__.changedAt} < ${$}`)).run().changes}}function G1(_){let{annotationRepo:$,project:J,query:Q}=_,z=Q.project??J,W;if(Q.text){let Y=j_(Q.text);if(Y)W=Y}return $.search({project:z,tag:Q.tag,filePath:Q.filePath,symbolName:Q.symbolName,source:Q.source,ftsQuery:W,limit:Q.limit}).map((Y)=>({tag:Y.tag,value:Y.value,source:Y.source,filePath:Y.filePath,symbolName:Y.symbolName,span:{start:{line:Y.startLine,column:Y.startColumn},end:{line:Y.endLine,column:Y.endColumn}}}))}class W0{options;adjacencyList=new Map;reverseAdjacencyList=new Map;constructor(_){this.options=_}build(){this.adjacencyList=new Map,this.reverseAdjacencyList=new Map;let $=[this.options.project,...this.options.additionalProjects??[]].flatMap((J)=>[...this.options.relationRepo.getByType(J,"imports"),...this.options.relationRepo.getByType(J,"type-references"),...this.options.relationRepo.getByType(J,"re-exports")]);for(let J of $){let{srcFilePath:Q,dstFilePath:z}=J;if(z===null)continue;if(!this.adjacencyList.has(Q))this.adjacencyList.set(Q,new Set);if(this.adjacencyList.get(Q).add(z),!this.adjacencyList.has(z))this.adjacencyList.set(z,new Set);if(!this.reverseAdjacencyList.has(z))this.reverseAdjacencyList.set(z,new Set);this.reverseAdjacencyList.get(z).add(Q)}}patchFiles(_,$,J){let Q=new Set([..._,...$]);for(let z of Q){let W=this.adjacencyList.get(z);if(W){for(let Y of W)this.reverseAdjacencyList.get(Y)?.delete(z);W.clear()}let Z=this.reverseAdjacencyList.get(z);if(Z){for(let Y of Z)this.adjacencyList.get(Y)?.delete(z);Z.clear()}}for(let z of $)this.adjacencyList.delete(z),this.reverseAdjacencyList.delete(z);for(let z of _){let W=J(z);for(let Z of W){if(!this.adjacencyList.has(Z.srcFilePath))this.adjacencyList.set(Z.srcFilePath,new Set);if(this.adjacencyList.get(Z.srcFilePath).add(Z.dstFilePath),!this.adjacencyList.has(Z.dstFilePath))this.adjacencyList.set(Z.dstFilePath,new Set);if(!this.reverseAdjacencyList.has(Z.dstFilePath))this.reverseAdjacencyList.set(Z.dstFilePath,new Set);this.reverseAdjacencyList.get(Z.dstFilePath).add(Z.srcFilePath)}}}getDependencies(_){return Array.from(this.adjacencyList.get(_)??[])}getDependents(_){return Array.from(this.reverseAdjacencyList.get(_)??[])}getTransitiveDependents(_){let $=new Set,J=[_];while(J.length>0){let Q=J.shift();for(let z of this.reverseAdjacencyList.get(Q)??[])if(!$.has(z))$.add(z),J.push(z)}return Array.from($)}hasCycle(){let _=new Set,$=new Set;for(let J of this.adjacencyList.keys()){if(_.has(J))continue;let Q=[{node:J,entered:!1}];while(Q.length>0){let z=Q.pop();if(z.entered){$.delete(z.node);continue}if($.has(z.node))return!0;if(_.has(z.node))continue;_.add(z.node),$.add(z.node),Q.push({node:z.node,entered:!0});for(let W of this.adjacencyList.get(z.node)??[]){if($.has(W))return!0;if(!_.has(W))Q.push({node:W,entered:!1})}}}return!1}getAffectedByChange(_){let $=new Set;for(let J of _)for(let Q of this.getTransitiveDependents(J))$.add(Q);return Array.from($)}getAdjacencyList(){let _=new Map;for(let[$,J]of this.adjacencyList)_.set($,Array.from(J));return _}getTransitiveDependencies(_){let $=new Set,J=[_];while(J.length>0){let Q=J.shift();for(let z of this.adjacencyList.get(Q)??[])if(!$.has(z))$.add(z),J.push(z)}return Array.from($)}getCyclePaths(_){let $=_?.maxCycles??1/0;if($<=0)return[];let J=new Map;for(let[Q,z]of this.adjacencyList)J.set(Q,Array.from(z));return qQ(J,$)}}var IQ=(_,$)=>_.localeCompare($);function DQ(_){let $=_.length>1&&_[0]===_[_.length-1]?_.slice(0,-1):[..._];if($.length===0)return[];let J=$;for(let Q=1;Q<$.length;Q++){let z=$.slice(Q).concat($.slice(0,Q));if(z.join("::")<J.join("::"))J=z}return[...J]}function f0(_,$,J){let Q=DQ(J);if(Q.length===0)return!1;let z=Q.join("->");if(_.has(z))return!1;return _.add(z),$.push(Q),!0}function CQ(_){let $=0,J=[],Q=new Set,z=new Map,W=new Map,Z=[],Y=(X)=>{z.set(X,$),W.set(X,$),$+=1,J.push(X),Q.add(X);for(let K of _.get(X)??[])if(!z.has(K))Y(K),W.set(X,Math.min(W.get(X)??0,W.get(K)??0));else if(Q.has(K))W.set(X,Math.min(W.get(X)??0,z.get(K)??0));if(W.get(X)===z.get(X)){let K=[],V="";do V=J.pop()??"",Q.delete(V),K.push(V);while(V!==X&&J.length>0);Z.push(K)}};for(let X of _.keys())if(!z.has(X))Y(X);return{components:Z}}function AQ(_,$,J){let Q=[],z=new Set,W=[..._].sort(IQ),Z=(Y,X,K)=>{X.delete(Y);let V=K.get(Y);if(!V)return;for(let L of V)if(X.has(L))Z(L,X,K);V.clear()};for(let Y=0;Y<W.length&&Q.length<J;Y++){let X=W[Y]??"",K=new Set(W.slice(Y)),V=new Set,L=new Map,C=[],N=(T)=>($.get(T)??[]).filter((F)=>K.has(F)),w=(T)=>{if(Q.length>=J)return!0;let F=!1;C.push(T),V.add(T);for(let S of N(T)){if(Q.length>=J)break;if(S===X)f0(z,Q,C.concat(X)),F=!0;else if(!V.has(S)){if(w(S))F=!0}}if(F)Z(T,V,L);else for(let S of N(T)){let v=L.get(S)??new Set;v.add(T),L.set(S,v)}return C.pop(),F};w(X)}return Q}function qQ(_,$){let{components:J}=CQ(_),Q=[],z=new Set;for(let W of J){if(Q.length>=$)break;if(W.length===0)continue;if(W.length===1){let X=W[0]??"";if((_.get(X)??[]).includes(X))f0(z,Q,[X,X]);continue}let Z=$-Q.length,Y=AQ(W,_,Z);for(let X of Y){if(Q.length>=$)break;f0(z,Q,X)}}return Q}var NQ=15000;function Y0(_){_.graphCache=null,_.graphCacheKey=null,_.graphCacheBuiltAt=null}function S_(_,$){let J=$??"__cross__";if(_.graphCache&&_.graphCacheBuiltAt!==null){if(Date.now()-_.graphCacheBuiltAt>NQ)_.graphCache=null,_.graphCacheKey=null,_.graphCacheBuiltAt=null}if(_.graphCache&&_.graphCacheKey===J)return _.graphCache;let Q=new W0({relationRepo:_.relationRepo,project:$??_.defaultProject,additionalProjects:$?void 0:_.boundaries?.map((z)=>z.project)});return Q.build(),_.graphCache=Q,_.graphCacheKey=J,_.graphCacheBuiltAt=Date.now(),Q}function S1(_,$,J,Q=1e4){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:J??_.defaultProject,query:{srcFilePath:$,type:"imports",project:J??_.defaultProject,limit:Q}}).filter((z)=>z.dstFilePath!==null).map((z)=>z.dstFilePath)}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getDependencies failed",{cause:z})}}function F1(_,$,J,Q=1e4){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:J??_.defaultProject,query:{dstFilePath:$,type:"imports",project:J??_.defaultProject,limit:Q}}).map((z)=>z.srcFilePath)}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getDependents failed",{cause:z})}}async function j1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return S_(_,J).getAffectedByChange($)}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: getAffected failed",{cause:Q})}}async function g1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return S_(_,$).hasCycle()}catch(J){if(J instanceof O)throw J;throw new O("search","Gildash: hasCycle failed",{cause:J})}}async function k1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return S_(_,$).getAdjacencyList()}catch(J){if(J instanceof O)throw J;throw new O("search","Gildash: getImportGraph failed",{cause:J})}}async function E1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return S_(_,J).getTransitiveDependencies($)}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: getTransitiveDependencies failed",{cause:Q})}}async function u1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return S_(_,J).getTransitiveDependents($)}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: getTransitiveDependents failed",{cause:Q})}}async function v1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return S_(_,$).getCyclePaths(J)}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: getCyclePaths failed",{cause:Q})}}async function b1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{let Q=S_(_,J);return{filePath:$,fanIn:Q.getDependents($).length,fanOut:Q.getDependencies($).length}}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: getFanMetrics failed",{cause:Q})}}var GQ=30000,P1=15000,SQ=10;function FQ(_,$){_.boundaries=$,_.defaultProject=$[0]?.project??b_.basename(_.projectRoot)}function jQ(_,$){return(J)=>{for(let Q of _.onFileChangedCallbacks)try{Q(J)}catch(z){_.logger.error("[Gildash] onFileChanged callback threw:",z)}if($.handleWatcherEvent?.(J),_.semanticLayer)if(J.eventType==="delete")try{_.semanticLayer.notifyFileDeleted(J.filePath)}catch(Q){_.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw:",Q);for(let z of _.onErrorCallbacks)try{z(Q instanceof O?Q:new O("semantic","semantic notifyFileDeleted failed",{cause:Q}))}catch{}}else _.readFileFn(J.filePath).then((Q)=>{try{_.semanticLayer?.notifyFileChanged(J.filePath,Q)}catch(z){_.logger.error("[Gildash] semanticLayer.notifyFileChanged threw:",z);for(let W of _.onErrorCallbacks)try{W(z instanceof O?z:new O("semantic","semantic notifyFileChanged failed",{cause:z}))}catch{}}}).catch((Q)=>{_.logger.error("[Gildash] failed to read file for semantic layer",J.filePath,Q);try{_.semanticLayer?.notifyFileDeleted(J.filePath)}catch(z){_.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw during read error recovery:",z)}})}}async function gQ(_){if(!_.semanticLayer)return;let $=_.fileRepo.getAllFiles(_.defaultProject);await Promise.all($.map(async(J)=>{try{let Q=b_.resolve(_.projectRoot,J.filePath),z=await _.readFileFn(Q);_.semanticLayer?.notifyFileChanged(Q,z)}catch{}}))}async function f1(_,$){let J=_.coordinatorFactory?_.coordinatorFactory():new R0({projectRoot:_.projectRoot,boundaries:_.boundaries,extensions:_.extensions,ignorePatterns:_.ignorePatterns,dbConnection:_.db,parseCache:_.parseCache,fileRepo:_.fileRepo,symbolRepo:_.symbolRepo,relationRepo:_.relationRepo,annotationRepo:_.annotationRepo??void 0,changelogRepo:_.changelogRepo??void 0,onBoundariesChanged:(Q)=>FQ(_,Q),logger:_.logger});_.coordinator=J;for(let Q of _.onIndexedCallbacks)J.onIndexed(Q);if(J.onIndexed((Q)=>{let z=Q.changedFiles.length+Q.deletedFiles.length;if(_.graphCache&&z>0&&z<100){let W=_.relationRepo;_.graphCache.patchFiles(Q.changedFiles,Q.deletedFiles,(Z)=>{return[_.defaultProject,..._.boundaries.map((X)=>X.project)].flatMap((X)=>W.getByType(X,"imports").concat(W.getByType(X,"type-references")).concat(W.getByType(X,"re-exports"))).filter((X)=>X.dstFilePath!==null&&(X.srcFilePath===Z||X.dstFilePath===Z)).map((X)=>({srcFilePath:X.srcFilePath,dstFilePath:X.dstFilePath}))}),_.graphCacheBuiltAt=Date.now()}else Y0(_)}),$.isWatchMode){let Q=_.watcherFactory?_.watcherFactory():new B0({projectRoot:_.projectRoot,ignorePatterns:_.ignorePatterns,extensions:_.extensions},void 0,_.logger);await Q.start(jQ(_,J)).then((z)=>{if(i_(z))throw z.data}),_.watcher=Q,_.timer=setInterval(()=>{if(_.closed)return;_.updateHeartbeatFn(_.db,process.pid)},GQ)}await J.fullIndex(),await gQ(_)}function kQ(_,$){let J=["SIGTERM","SIGINT","beforeExit"];for(let Q of J){let z=()=>{$().catch((W)=>_.logger.error("[Gildash] close error during signal",Q,W))};if(Q==="beforeExit")process.on("beforeExit",z);else process.on(Q,z);_.signalHandlers.push([Q,z])}}async function y1(_){let{projectRoot:$,extensions:J=[".ts",".mts",".cts"],ignorePatterns:Q=["**/node_modules/**"],parseCacheCapacity:z=500,logger:W=console,existsSyncFn:Z=TQ,dbConnectionFactory:Y,watcherFactory:X,coordinatorFactory:K,repositoryFactory:V,acquireWatcherRoleFn:L=U1,releaseWatcherRoleFn:C=V1,updateHeartbeatFn:N=O1,discoverProjectsFn:w=s_,parseSourceFn:T=k_,extractSymbolsFn:F=N_,extractRelationsFn:S=d_,symbolSearchFn:v=G0,relationSearchFn:u=S0,patternSearchFn:x=F0,loadTsconfigPathsFn:p=m_,readFileFn:l=async(a)=>Bun.file(a).text(),unlinkFn:z_=async(a)=>{await Bun.file(a).unlink()},watchMode:Z_,semantic:H_,semanticLayerFactory:X_}=_;if(!b_.isAbsolute($))throw new O("validation",`Gildash: projectRoot must be an absolute path, got: "${$}"`);if(!Z($))throw new O("validation",`Gildash: projectRoot does not exist: "${$}"`);let W_=Y?Y():new O0({projectRoot:$}),i=W_.open();if(i_(i))throw i.data;try{let a=await w($),I_=a[0]?.project??b_.basename($),D=V?V():(()=>{let G=W_;return{fileRepo:new H0(G),symbolRepo:new M0(G),relationRepo:new K0(G),parseCache:new T0(z)}})(),q=V?null:W_,U=q?new b0(q):null,H=q?new P0(q):null,M=Z_??!0,B=crypto.randomUUID(),A;if(M)A=await Promise.resolve(L(W_,process.pid,{instanceId:B}));else A="owner";let I={projectRoot:$,extensions:J,ignorePatterns:Q,logger:W,defaultProject:I_,role:A,db:W_,symbolRepo:D.symbolRepo,relationRepo:D.relationRepo,fileRepo:D.fileRepo,parseCache:D.parseCache,annotationRepo:U,changelogRepo:H,annotationSearchFn:G1,releaseWatcherRoleFn:C,parseSourceFn:T,extractSymbolsFn:F,extractRelationsFn:S,symbolSearchFn:v,relationSearchFn:u,patternSearchFn:x,readFileFn:l,unlinkFn:z_,existsSyncFn:Z,acquireWatcherRoleFn:L,updateHeartbeatFn:N,watcherFactory:X,coordinatorFactory:K,instanceId:B,closed:!1,coordinator:null,watcher:null,timer:null,signalHandlers:[],tsconfigPaths:null,boundaries:a,onIndexedCallbacks:new Set,onFileChangedCallbacks:new Set,onErrorCallbacks:new Set,onRoleChangedCallbacks:new Set,graphCache:null,graphCacheKey:null,graphCacheBuiltAt:null,semanticLayer:null};if(r_($),I.tsconfigPaths=await p($),H_){let G=b_.join($,"tsconfig.json");try{if(X_)I.semanticLayer=X_(G);else{let R=z0.create(G);if(i_(R))throw R.data;I.semanticLayer=R}}catch(R){if(R instanceof O)throw R;throw new O("semantic","Gildash: semantic layer creation failed",{cause:R})}}if(A==="owner")await f1(I,{isWatchMode:M});else{let G=0,R=async()=>{try{let j=await Promise.resolve(I.acquireWatcherRoleFn(I.db,process.pid,{instanceId:I.instanceId}));if(G=0,j==="owner"){I.role="owner";for(let k of I.onRoleChangedCallbacks)try{k("owner")}catch(b){I.logger.error("[Gildash] onRoleChanged callback threw:",b)}clearInterval(I.timer),I.timer=null;try{await f1(I,{isWatchMode:!0})}catch(k){if(I.logger.error("[Gildash] owner promotion failed, reverting to reader",k),I.role="reader",I.timer!==null)clearInterval(I.timer),I.timer=null;if(I.watcher){let b=await I.watcher.close();if(i_(b))I.logger.error("[Gildash] watcher close error during promotion rollback",b.data);I.watcher=null}if(I.coordinator)await I.coordinator.shutdown().catch((b)=>I.logger.error("[Gildash] coordinator shutdown error during promotion rollback",b)),I.coordinator=null;try{I.releaseWatcherRoleFn(I.db,process.pid)}catch(b){I.logger.error("[Gildash] failed to release watcher role during promotion rollback",b)}I.timer=setInterval(R,P1)}}}catch(j){G++;let k=j instanceof O?j:new O("watcher","Gildash: healthcheck error",{cause:j});for(let b of I.onErrorCallbacks)try{b(k)}catch(d){I.logger.error("[Gildash] onError callback threw:",d)}if(I.logger.error("[Gildash] healthcheck error",j),G>=SQ)I.logger.error("[Gildash] healthcheck failed too many times, shutting down"),clearInterval(I.timer),I.timer=null,Z0(I).catch((b)=>I.logger.error("[Gildash] close error during healthcheck shutdown",b))}};I.timer=setInterval(R,P1)}if(M)kQ(I,()=>Z0(I));return I}catch(a){if(W_.close(),a instanceof O)throw a;throw new O("store","Gildash: initialization failed",{cause:a})}}async function Z0(_,$){if(_.closed)return;_.closed=!0;let J=[];for(let[Q,z]of _.signalHandlers)if(Q==="beforeExit")process.off("beforeExit",z);else process.off(Q,z);if(_.signalHandlers=[],_.semanticLayer){try{_.semanticLayer.dispose()}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}_.semanticLayer=null}if(_.coordinator)try{await _.coordinator.shutdown()}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}if(_.watcher){let Q=await _.watcher.close();if(i_(Q))J.push(Q.data)}if(_.timer!==null)clearInterval(_.timer),_.timer=null;try{_.releaseWatcherRoleFn(_.db,process.pid)}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}try{_.db.close()}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}if($?.cleanup)for(let Q of["","-wal","-shm"])try{await _.unlinkFn(b_.join(_.projectRoot,C_,c_+Q))}catch{}if(J.length>0)throw new O("close","Gildash: one or more errors occurred during close()",{cause:J})}import{isErr as x1}from"@zipbul/result";function h1(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");let z=_.parseSourceFn($,J,Q);if(x1(z))throw z.data;return _.parseCache.set($,z),z}async function m1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");let Q=new Map,z=[];return await Promise.all($.map(async(W)=>{try{let Z=await _.readFileFn(W),Y=_.parseSourceFn(W,Z,J);if(!x1(Y))Q.set(W,Y);else z.push({filePath:W,error:Y.data})}catch(Z){z.push({filePath:W,error:Z instanceof Error?Z:Error(String(Z))})}})),{parsed:Q,failures:z}}function n1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");return _.parseCache.get($)}function d1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");return _.extractSymbolsFn($)}function p1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");return _.extractRelationsFn($.program,$.filePath,_.tsconfigPaths??void 0)}import l1 from"path";function i1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.symbolRepo.getStats($??_.defaultProject)}catch(J){if(J instanceof O)throw J;throw new O("store","Gildash: getStats failed",{cause:J})}}function y0(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.symbolSearchFn({symbolRepo:_.symbolRepo,project:_.defaultProject,query:$})}catch(J){if(J instanceof O)throw J;throw new O("search","Gildash: searchSymbols failed",{cause:J})}}function c1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:_.defaultProject,query:$})}catch(J){if(J instanceof O)throw J;throw new O("search","Gildash: searchRelations failed",{cause:J})}}function a1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.symbolSearchFn({symbolRepo:_.symbolRepo,project:void 0,query:$})}catch(J){if(J instanceof O)throw J;throw new O("search","Gildash: searchAllSymbols failed",{cause:J})}}function s1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:void 0,query:$})}catch(J){if(J instanceof O)throw J;throw new O("search","Gildash: searchAllRelations failed",{cause:J})}}function r1(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.fileRepo.getAllFiles($??_.defaultProject)}catch(J){if(J instanceof O)throw J;throw new O("store","Gildash: listIndexedFiles failed",{cause:J})}}function o1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:J??_.defaultProject,query:{srcFilePath:$,dstFilePath:$,limit:1e4}})}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: getInternalRelations failed",{cause:Q})}}function t1(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");try{let z=Q??_.defaultProject,W=_.symbolSearchFn({symbolRepo:_.symbolRepo,project:z,query:{text:$,exact:!0,filePath:J,limit:1}});if(W.length===0)return null;let Z=W[0],Y=Z.detail,X={...Z,members:Y.members,jsDoc:Y.jsDoc,parameters:Y.parameters,returnType:Y.returnType,heritage:Y.heritage,decorators:Y.decorators,typeParameters:Y.typeParameters,initializer:Y.initializer};if(_.semanticLayer)try{let K=l1.isAbsolute(J)?J:l1.resolve(_.projectRoot,J),V=_.semanticLayer.lineColumnToPosition(K,Z.span.start.line,Z.span.start.column);if(V!==null){let L=_.semanticLayer.findNamePosition(K,V,Z.name)??V,C=_.semanticLayer.collectTypeAt(K,L);if(C)X.resolvedType=C}}catch{}return X}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getFullSymbol failed",{cause:z})}}function e1(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{let Q=J??_.defaultProject,z=_.fileRepo.getFile(Q,$);if(!z)throw new O("search",`Gildash: file '${$}' is not in the index`);let W=_.symbolRepo.getFileSymbols(Q,$),Z=_.relationRepo.getOutgoing(Q,$);return{filePath:z.filePath,lineCount:z.lineCount??0,size:z.size,symbolCount:W.length,exportedSymbolCount:W.filter((Y)=>Y.isExported).length,relationCount:Z.length}}catch(Q){if(Q instanceof O)throw Q;throw new O("store","Gildash: getFileStats failed",{cause:Q})}}function _$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{return _.fileRepo.getFile(J??_.defaultProject,$)}catch(Q){if(Q instanceof O)throw Q;throw new O("store","Gildash: getFileInfo failed",{cause:Q})}}function $$(_,$,J){return y0(_,{filePath:$,project:J??void 0,limit:1e4})}function J$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{let z=_.symbolSearchFn({symbolRepo:_.symbolRepo,project:J??_.defaultProject,query:{filePath:$,isExported:!0}}).map((W)=>({name:W.name,kind:W.kind,parameters:W.detail.parameters?`(${W.detail.parameters.map((Z)=>`${Z.name}${Z.isOptional?"?":""}: ${Z.type??"unknown"}`).join(", ")})`:void 0,returnType:W.detail.returnType??void 0,jsDoc:W.detail.jsDoc?.description??void 0}));return{filePath:$,exports:z}}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: getModuleInterface failed",{cause:Q})}}import f from"path";function P_(_,$,J,Q){let z=Q??_.defaultProject,W=f.isAbsolute(J)?f.relative(_.projectRoot,J):J,Z=_.symbolSearchFn({symbolRepo:_.symbolRepo,project:z,query:{text:$,exact:!0,filePath:W,limit:1}});if(Z.length===0)return null;let Y=Z[0],X=f.isAbsolute(J)?J:f.resolve(_.projectRoot,J),K=_.semanticLayer.lineColumnToPosition(X,Y.span.start.line,Y.span.start.column);if(K===null)return null;let V=_.semanticLayer.findNamePosition(X,K,Y.name)??K;return{sym:Y,position:V,absPath:X}}function Q$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let z=P_(_,$,J,Q);if(!z)return null;return _.semanticLayer.collectTypeAt(z.absPath,z.position)}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getResolvedType failed",{cause:z})}}function z$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let z=P_(_,$,J,Q);if(!z)throw new O("search",`Gildash: symbol '${$}' not found in '${J}'`);return _.semanticLayer.findReferences(z.absPath,z.position)}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getSemanticReferences failed",{cause:z})}}function W$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let z=P_(_,$,J,Q);if(!z)throw new O("search",`Gildash: symbol '${$}' not found in '${J}'`);return _.semanticLayer.findEnrichedReferences(z.absPath,z.position)}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getEnrichedReferences failed",{cause:z})}}function Y$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let z=P_(_,$,J,Q);if(!z)throw new O("search",`Gildash: symbol '${$}' not found in '${J}'`);return _.semanticLayer.findImplementations(z.absPath,z.position)}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getImplementations failed",{cause:z})}}function Z$(_,$,J,Q,z,W){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Z=P_(_,$,J,W);if(!Z)throw new O("search",`Gildash: source symbol '${$}' not found in '${J}'`);let Y=P_(_,Q,z,W);if(!Y)throw new O("search",`Gildash: target symbol '${Q}' not found in '${z}'`);return _.semanticLayer.isTypeAssignableTo(Z.absPath,Z.position,Y.absPath,Y.position)}catch(Z){if(Z instanceof O)throw Z;throw new O("semantic","Gildash: isTypeAssignableTo failed",{cause:Z})}}function X$(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let J=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.collectFileTypes(J)}catch(J){if(J instanceof O)throw J;throw new O("semantic","Gildash: getFileTypes failed",{cause:J})}}function U$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let z=f.isAbsolute($)?$:f.resolve(_.projectRoot,$),W=_.semanticLayer.lineColumnToPosition(z,J,Q);if(W===null)return null;return _.semanticLayer.collectTypeAt(z,W)}catch(z){if(z instanceof O)throw z;throw new O("semantic","Gildash: getResolvedTypeAt failed",{cause:z})}}function V$(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let J=f.isAbsolute($.source.filePath)?$.source.filePath:f.resolve(_.projectRoot,$.source.filePath),Q=f.isAbsolute($.target.filePath)?$.target.filePath:f.resolve(_.projectRoot,$.target.filePath),z=_.semanticLayer.lineColumnToPosition(J,$.source.line,$.source.column);if(z===null)return null;let W=_.semanticLayer.lineColumnToPosition(Q,$.target.line,$.target.column);if(W===null)return null;return _.semanticLayer.isTypeAssignableTo(J,z,Q,W)}catch(J){if(J instanceof O)throw J;throw new O("semantic","Gildash: isTypeAssignableToAt failed",{cause:J})}}function O$(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{return _.semanticLayer.getModuleInterface($)}catch(J){if(J instanceof O)throw J;throw new O("search","Gildash: getSemanticModuleInterface failed",{cause:J})}}function H$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.getBaseTypes(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getBaseTypes failed",{cause:Q})}}function M$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.collectTypesAtPositions(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getResolvedTypesAtPositions failed",{cause:Q})}}function K$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.collectTypeAt(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getResolvedTypeAtPosition failed",{cause:Q})}}function L$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.findReferences(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getSemanticReferencesAtPosition failed",{cause:Q})}}function B$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.findEnrichedReferences(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getEnrichedReferencesAtPosition failed",{cause:Q})}}function w$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.findImplementations(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getImplementationsAtPosition failed",{cause:Q})}}function I$(_,$,J,Q,z){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let W=f.isAbsolute($)?$:f.resolve(_.projectRoot,$),Z=f.isAbsolute(Q)?Q:f.resolve(_.projectRoot,Q);return _.semanticLayer.isTypeAssignableTo(W,J,Z,z)}catch(W){if(W instanceof O)throw W;throw new O("semantic","Gildash: isTypeAssignableToAtPosition failed",{cause:W})}}function D$(_,$,J,Q,z){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let W=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.isTypeAssignableToType(W,J,Q,z)}catch(W){if(W instanceof O)throw W;throw new O("semantic","Gildash: isTypeAssignableToType failed",{cause:W})}}function C$(_,$,J,Q,z){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let W=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.isTypeAssignableToTypeAtPositions(W,J,Q,z)}catch(W){if(W instanceof O)throw W;throw new O("semantic","Gildash: isTypeAssignableToTypeAtPositions failed",{cause:W})}}function A$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let z=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.lineColumnToPosition(z,J,Q)}catch(z){if(z instanceof O)throw z;throw new O("semantic","Gildash: lineColumnToPosition failed",{cause:z})}}function q$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let z=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.findNamePosition(z,J,Q)}catch(z){if(z instanceof O)throw z;throw new O("semantic","Gildash: findNamePosition failed",{cause:z})}}function N$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.getSymbolNode(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getSymbolNode failed",{cause:Q})}}function R$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new O("semantic","Gildash: semantic layer is not enabled");try{let Q=f.isAbsolute($)?$:f.resolve(_.projectRoot,$);return _.semanticLayer.getDiagnostics(Q,J)}catch(Q){if(Q instanceof O)throw Q;throw new O("semantic","Gildash: getSemanticDiagnostics failed",{cause:Q})}}function T$(_,$){let J=new Map(_.map((Y)=>[`${Y.name}::${Y.filePath}`,Y])),Q=new Map($.map((Y)=>[`${Y.name}::${Y.filePath}`,Y])),z=[],W=[],Z=[];for(let[Y,X]of Q){let K=J.get(Y);if(!K)z.push(X);else if(K.fingerprint!==X.fingerprint)Z.push({before:K,after:X})}for(let[Y,X]of J)if(!Q.has(Y))W.push(X);return{added:z,removed:W,modified:Z}}function G$(_,$){if(_.onIndexedCallbacks.add($),!_.coordinator)return()=>{_.onIndexedCallbacks.delete($)};let J=_.coordinator.onIndexed($);return()=>{_.onIndexedCallbacks.delete($),J()}}async function S$(_){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.coordinator)throw new O("closed","Gildash: reindex() is not available for readers");try{let $=await _.coordinator.fullIndex();return Y0(_),$}catch($){if($ instanceof O)throw $;throw new O("index","Gildash: reindex failed",{cause:$})}}function F$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");let z=Q??_.defaultProject,W=new Set,Z=[],Y=$,X=J;for(;;){let K=`${X}::${Y}`;if(W.has(K))return{originalName:Y,originalFilePath:X,reExportChain:Z,circular:!0};W.add(K);let V=_.relationSearchFn({relationRepo:_.relationRepo,project:z,query:{type:"re-exports",srcFilePath:X,limit:500}}),L,C;for(let N of V){let w;if(N.metaJson)try{let F=JSON.parse(N.metaJson);if(Array.isArray(F.specifiers))w=F.specifiers}catch{}if(!w)continue;let T=w.find((F)=>F.exported===Y);if(!T)continue;L=N.dstFilePath??void 0,C=T.local;break}if(!L||!C)return{originalName:Y,originalFilePath:X,reExportChain:Z,circular:!1};Z.push({filePath:X,exportedAs:Y}),X=L,Y=C}}function j$(_,$){return _.onFileChangedCallbacks.add($),()=>{_.onFileChangedCallbacks.delete($)}}function g$(_,$){return _.onErrorCallbacks.add($),()=>{_.onErrorCallbacks.delete($)}}function k$(_,$){return _.onRoleChangedCallbacks.add($),()=>{_.onRoleChangedCallbacks.delete($)}}async function E$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");try{let Q=J?.project??_.defaultProject,z=J?.filePaths?J.filePaths:_.fileRepo.getAllFiles(Q).map((W)=>W.filePath);return await _.patternSearchFn({pattern:$,filePaths:z})}catch(Q){if(Q instanceof O)throw Q;throw new O("search","Gildash: findPattern failed",{cause:Q})}}async function u$(_,$,J,Q){if(_.closed)throw new O("closed","Gildash: instance is closed");try{let z=Q??_.defaultProject,W=new Set,Z=(Y,X,K)=>{let V=`${Y}::${X}`;if(W.has(V))return{symbolName:Y,filePath:X,kind:K,children:[]};W.add(V);let N=_.relationSearchFn({relationRepo:_.relationRepo,project:z,query:{srcFilePath:X,srcSymbolName:Y,limit:1000}}).filter((w)=>w.type==="extends"||w.type==="implements").filter((w)=>w.dstSymbolName!=null&&w.dstFilePath!=null).map((w)=>Z(w.dstSymbolName,w.dstFilePath,w.type));return{symbolName:Y,filePath:X,kind:K,children:N}};return Z($,J)}catch(z){if(z instanceof O)throw z;throw new O("search","Gildash: getHeritageChain failed",{cause:z})}}function v$(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.annotationRepo||!_.annotationSearchFn)return[];return _.annotationSearchFn({annotationRepo:_.annotationRepo,project:$.project??_.defaultProject,query:$})}function b$(_,$,J){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.changelogRepo)return[];let Q=$ instanceof Date?$.toISOString():$,z=J?.project??_.defaultProject,W=J?.limit??1000;return _.changelogRepo.getSince({project:z,since:Q,symbolName:J?.symbolName,changeTypes:J?.changeTypes,filePath:J?.filePath,includeFullIndex:J?.includeFullIndex,indexRunId:J?.indexRunId,afterId:J?.afterId,limit:W}).map((Y)=>({changeType:Y.changeType,symbolName:Y.symbolName,symbolKind:Y.symbolKind,filePath:Y.filePath,oldName:Y.oldName,oldFilePath:Y.oldFilePath,fingerprint:Y.fingerprint,changedAt:Y.changedAt,isFullIndex:Y.isFullIndex===1,indexRunId:Y.indexRunId}))}function P$(_,$){if(_.closed)throw new O("closed","Gildash: instance is closed");if(!_.changelogRepo)return 0;let J=$ instanceof Date?$.toISOString():$,Q=0,z=[_.defaultProject,..._.boundaries.map((Z)=>Z.project)],W=[...new Set(z)];for(let Z of W)Q+=_.changelogRepo.pruneOlderThan(Z,J);return Q}class x0{_ctx;get projectRoot(){return this._ctx.projectRoot}get role(){return this._ctx.role}get projects(){return[...this._ctx.boundaries]}constructor(_){this._ctx=_}static async open(_){let $=await y1(_);return new x0($)}async close(_){return Z0(this._ctx,_)}parseSource(_,$,J){return h1(this._ctx,_,$,J)}async batchParse(_,$){return m1(this._ctx,_,$)}getParsedAst(_){return n1(this._ctx,_)}extractSymbols(_){return d1(this._ctx,_)}extractRelations(_){return p1(this._ctx,_)}getStats(_){return i1(this._ctx,_)}searchSymbols(_){return y0(this._ctx,_)}searchRelations(_){return c1(this._ctx,_)}searchAllSymbols(_){return a1(this._ctx,_)}searchAllRelations(_){return s1(this._ctx,_)}listIndexedFiles(_){return r1(this._ctx,_)}getInternalRelations(_,$){return o1(this._ctx,_,$)}getFullSymbol(_,$,J){return t1(this._ctx,_,$,J)}getFileStats(_,$){return e1(this._ctx,_,$)}getFileInfo(_,$){return _$(this._ctx,_,$)}getSymbolsByFile(_,$){return $$(this._ctx,_,$)}getModuleInterface(_,$){return J$(this._ctx,_,$)}getDependencies(_,$,J=1e4){return S1(this._ctx,_,$,J)}getDependents(_,$,J=1e4){return F1(this._ctx,_,$,J)}async getAffected(_,$){return j1(this._ctx,_,$)}async hasCycle(_){return g1(this._ctx,_)}async getImportGraph(_){return k1(this._ctx,_)}async getTransitiveDependencies(_,$){return E1(this._ctx,_,$)}async getTransitiveDependents(_,$){return u1(this._ctx,_,$)}async getCyclePaths(_,$){return v1(this._ctx,_,$)}async getFanMetrics(_,$){return b1(this._ctx,_,$)}getResolvedType(_,$,J){return Q$(this._ctx,_,$,J)}getSemanticReferences(_,$,J){return z$(this._ctx,_,$,J)}getEnrichedReferences(_,$,J){return W$(this._ctx,_,$,J)}getImplementations(_,$,J){return Y$(this._ctx,_,$,J)}isTypeAssignableTo(_,$,J,Q,z){return Z$(this._ctx,_,$,J,Q,z)}getSemanticModuleInterface(_){return O$(this._ctx,_)}getFileTypes(_){return X$(this._ctx,_)}getResolvedTypeAt(_,$,J){return U$(this._ctx,_,$,J)}isTypeAssignableToAt(_){return V$(this._ctx,_)}getResolvedTypeAtPosition(_,$){return K$(this._ctx,_,$)}getResolvedTypesAtPositions(_,$){return M$(this._ctx,_,$)}getSemanticReferencesAtPosition(_,$){return L$(this._ctx,_,$)}getEnrichedReferencesAtPosition(_,$){return B$(this._ctx,_,$)}getImplementationsAtPosition(_,$){return w$(this._ctx,_,$)}isTypeAssignableToAtPosition(_,$,J,Q){return I$(this._ctx,_,$,J,Q)}isTypeAssignableToType(_,$,J,Q){return D$(this._ctx,_,$,J,Q)}isTypeAssignableToTypeAtPositions(_,$,J,Q){return C$(this._ctx,_,$,J,Q)}lineColumnToPosition(_,$,J){return A$(this._ctx,_,$,J)}findNamePosition(_,$,J){return q$(this._ctx,_,$,J)}getSymbolNode(_,$){return N$(this._ctx,_,$)}getBaseTypes(_,$){return H$(this._ctx,_,$)}getSemanticDiagnostics(_,$){return R$(this._ctx,_,$)}diffSymbols(_,$){return T$(_,$)}onIndexed(_){return G$(this._ctx,_)}async reindex(){return S$(this._ctx)}resolveSymbol(_,$,J){return F$(this._ctx,_,$,J)}async findPattern(_,$){return E$(this._ctx,_,$)}async getHeritageChain(_,$,J){return u$(this._ctx,_,$,J)}onFileChanged(_){return j$(this._ctx,_)}onError(_){return g$(this._ctx,_)}onRoleChanged(_){return k$(this._ctx,_)}searchAnnotations(_){return v$(this._ctx,_)}getSymbolChanges(_,$){return b$(this._ctx,_,$)}pruneChangelog(_){return P$(this._ctx,_)}}import{Visitor as P5,visitorKeys as f5}from"oxc-parser";import{walk as x5,parseAndWalk as h5,ScopeTracker as m5}from"oxc-walker";export{x5 as walk,f5 as visitorKeys,G0 as symbolSearch,S0 as relationSearch,F0 as patternSearch,k_ as parseSource,h5 as parseAndWalk,Q_ as normalizePath,xJ as isVariableDeclaration,yJ as isTSQualifiedName,fJ as isMemberExpression,PJ as isIdentifier,gJ as isFunctionNode,bJ as isFunctionExpression,vJ as isFunctionDeclaration,uJ as isCallExpression,EJ as isAssignmentExpression,kJ as isArrowFunctionExpression,hJ as is,V_ as getLineColumn,N_ as extractSymbols,d_ as extractRelations,n_ as buildLineOffsets,P5 as Visitor,m5 as ScopeTracker,O as GildashError,x0 as Gildash,W0 as DependencyGraph};
2
+ var n$=Object.defineProperty;var p$=(_)=>_;function d$(_,$){this[_]=p$.bind(null,$)}var l$=(_,$)=>{for(var J in $)n$(_,J,{get:$[J],enumerable:!0,configurable:!0,set:d$.bind($,J)})};var d0=import.meta.require;import{isErr as c_}from"@zipbul/result";import P_ from"path";import{existsSync as EQ}from"fs";import{err as l0,isErr as o$}from"@zipbul/result";import{Database as t$}from"bun:sqlite";import{mkdirSync as e$,unlinkSync as i0,existsSync as c0}from"fs";import{dirname as _J,join as a0}from"path";import{drizzle as $J}from"drizzle-orm/bun-sqlite";import{migrate as JJ}from"drizzle-orm/bun-sqlite/migrator";class V extends Error{type;constructor(_,$,J){super($,J);this.type=_;this.name="GildashError"}}var A_=".gildash",a_="gildash.db";var O0={};l$(O0,{watcherOwner:()=>r$,symbols:()=>x,symbolChangelog:()=>$_,relations:()=>v,files:()=>o,annotations:()=>Z_});import{sql as i$}from"drizzle-orm";import{sqliteTable as j_,text as f,integer as r,real as c$,index as Q_,primaryKey as a$,foreignKey as V0,check as s$}from"drizzle-orm/sqlite-core";var o=j_("files",{project:f("project").notNull(),filePath:f("file_path").notNull(),mtimeMs:c$("mtime_ms").notNull(),size:r("size").notNull(),contentHash:f("content_hash").notNull(),updatedAt:f("updated_at").notNull(),lineCount:r("line_count")},(_)=>[a$({columns:[_.project,_.filePath]})]),x=j_("symbols",{id:r("id").primaryKey({autoIncrement:!0}),project:f("project").notNull(),filePath:f("file_path").notNull(),kind:f("kind").notNull(),name:f("name").notNull(),startLine:r("start_line").notNull(),startColumn:r("start_column").notNull(),endLine:r("end_line").notNull(),endColumn:r("end_column").notNull(),isExported:r("is_exported").notNull().default(0),signature:f("signature"),fingerprint:f("fingerprint"),detailJson:f("detail_json"),contentHash:f("content_hash").notNull(),indexedAt:f("indexed_at").notNull(),resolvedType:f("resolved_type"),structuralFingerprint:f("structural_fingerprint")},(_)=>[Q_("idx_symbols_project_file").on(_.project,_.filePath),Q_("idx_symbols_project_kind").on(_.project,_.kind),Q_("idx_symbols_project_name").on(_.project,_.name),Q_("idx_symbols_fingerprint").on(_.project,_.fingerprint),V0({columns:[_.project,_.filePath],foreignColumns:[o.project,o.filePath]}).onDelete("cascade")]),v=j_("relations",{id:r("id").primaryKey({autoIncrement:!0}),project:f("project").notNull(),type:f("type").notNull(),srcFilePath:f("src_file_path").notNull(),srcSymbolName:f("src_symbol_name"),dstProject:f("dst_project"),dstFilePath:f("dst_file_path"),dstSymbolName:f("dst_symbol_name"),metaJson:f("meta_json"),specifier:f("specifier"),isExternal:r("is_external").notNull().default(0)},(_)=>[Q_("idx_relations_src").on(_.project,_.srcFilePath),Q_("idx_relations_dst").on(_.dstProject,_.dstFilePath),Q_("idx_relations_type").on(_.project,_.type),Q_("idx_relations_project_type_src").on(_.project,_.type,_.srcFilePath),Q_("idx_relations_specifier").on(_.project,_.specifier),V0({columns:[_.project,_.srcFilePath],foreignColumns:[o.project,o.filePath]}).onDelete("cascade")]),Z_=j_("annotations",{id:r("id").primaryKey({autoIncrement:!0}),project:f("project").notNull(),filePath:f("file_path").notNull(),tag:f("tag").notNull(),value:f("value").notNull().default(""),source:f("source").notNull(),symbolName:f("symbol_name"),startLine:r("start_line").notNull(),startColumn:r("start_column").notNull(),endLine:r("end_line").notNull(),endColumn:r("end_column").notNull(),indexedAt:f("indexed_at").notNull()},(_)=>[Q_("idx_annotations_project_file").on(_.project,_.filePath),Q_("idx_annotations_project_tag").on(_.project,_.tag),Q_("idx_annotations_project_symbol").on(_.project,_.symbolName),V0({columns:[_.project,_.filePath],foreignColumns:[o.project,o.filePath]}).onDelete("cascade")]),$_=j_("symbol_changelog",{id:r("id").primaryKey({autoIncrement:!0}),project:f("project").notNull(),changeType:f("change_type").notNull(),symbolName:f("symbol_name").notNull(),symbolKind:f("symbol_kind").notNull(),filePath:f("file_path").notNull(),oldName:f("old_name"),oldFilePath:f("old_file_path"),fingerprint:f("fingerprint"),changedAt:f("changed_at").notNull(),isFullIndex:r("is_full_index").notNull().default(0),indexRunId:f("index_run_id").notNull()},(_)=>[Q_("idx_changelog_project_changed_at").on(_.project,_.changedAt),Q_("idx_changelog_project_name").on(_.project,_.symbolName),Q_("idx_changelog_project_run").on(_.project,_.indexRunId)]),r$=j_("watcher_owner",{id:r("id").primaryKey(),pid:r("pid").notNull(),startedAt:f("started_at").notNull(),heartbeatAt:f("heartbeat_at").notNull(),instanceId:f("instance_id")},(_)=>[s$("watcher_owner_singleton",i$`${_.id} = 1`)]);class H0{client=null;drizzle=null;dbPath;txDepth=0;constructor(_){this.dbPath=a0(_.projectRoot,A_,a_)}get drizzleDb(){if(!this.drizzle)throw Error("Database is not open. Call open() first.");return this.drizzle}open(){try{e$(_J(this.dbPath),{recursive:!0}),this.client=new t$(this.dbPath),this.client.run("PRAGMA journal_mode = WAL"),this.client.run("PRAGMA foreign_keys = OFF"),this.client.run("PRAGMA busy_timeout = 5000"),this.drizzle=$J(this.client,{schema:O0}),JJ(this.drizzle,{migrationsFolder:a0(import.meta.dirname,"migrations")});let _=this.client.prepare("PRAGMA foreign_key_check").all();if(_.length>0)throw Error(`FK integrity violation after migration: ${JSON.stringify(_.slice(0,5))}`);this.client.run("PRAGMA foreign_keys = ON"),this.registerRegexpUdf(this.client)}catch(_){if(this.isCorruptionError(_)&&c0(this.dbPath)){this.closeClient(),i0(this.dbPath);for(let J of["-wal","-shm"]){let Q=this.dbPath+J;if(c0(Q))i0(Q)}let $=this.open();if(o$($))return l0(new V("store",`Failed to recover database at ${this.dbPath}`,{cause:$.data}));return $}return l0(new V("store",`Failed to open database at ${this.dbPath}`,{cause:_}))}}close(){this.closeClient(),this.drizzle=null}transaction(_){let $=this.requireClient();if(this.txDepth===0){this.txDepth++;try{return $.transaction(()=>_(this))()}finally{this.txDepth--}}let J=`sp_${this.txDepth++}`;$.run(`SAVEPOINT "${J}"`);try{let Q=_(this);return $.run(`RELEASE SAVEPOINT "${J}"`),Q}catch(Q){throw $.run(`ROLLBACK TO SAVEPOINT "${J}"`),$.run(`RELEASE SAVEPOINT "${J}"`),Q}finally{this.txDepth--}}immediateTransaction(_){let $=this.requireClient();this.txDepth++,$.run("BEGIN IMMEDIATE");try{let J=_();return $.run("COMMIT"),J}catch(J){throw $.run("ROLLBACK"),J}finally{this.txDepth--}}getTableNames(){return this.requireClient().query("SELECT name FROM sqlite_master WHERE type = 'table'").all().map(($)=>$.name)}selectOwner(){return this.requireClient().prepare("SELECT pid, heartbeat_at, instance_id FROM watcher_owner WHERE id = 1").get()??void 0}insertOwner(_,$){let J=new Date().toISOString();this.requireClient().prepare("INSERT INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(_,J,J,$??null)}replaceOwner(_,$){let J=new Date().toISOString();this.requireClient().prepare("INSERT OR REPLACE INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(_,J,J,$??null)}touchOwner(_){let $=new Date().toISOString();this.requireClient().prepare("UPDATE watcher_owner SET heartbeat_at = ? WHERE id = 1 AND pid = ?").run($,_)}deleteOwner(_){this.requireClient().prepare("DELETE FROM watcher_owner WHERE id = 1 AND pid = ?").run(_)}registerRegexpUdf(_){let $=_;if(typeof $.function!=="function")return;$.function.call(_,"regexp",(J,Q)=>{try{return new RegExp(J).test(Q)?1:0}catch{return 0}})}requireClient(){if(!this.client)throw Error("Database is not open. Call open() first.");return this.client}closeClient(){if(this.client)this.client.close(),this.client=null}isCorruptionError(_){if(!(_ instanceof Error))return!1;let $=_.message.toLowerCase();return $.includes("malformed")||$.includes("corrupt")||$.includes("not a database")||$.includes("disk i/o error")||$.includes("sqlite_corrupt")}}import{eq as y_,and as s0}from"drizzle-orm";class K0{db;constructor(_){this.db=_}getFile(_,$){return this.db.drizzleDb.select().from(o).where(s0(y_(o.project,_),y_(o.filePath,$))).get()??null}upsertFile(_){this.db.drizzleDb.insert(o).values({project:_.project,filePath:_.filePath,mtimeMs:_.mtimeMs,size:_.size,contentHash:_.contentHash,updatedAt:_.updatedAt,lineCount:_.lineCount??null}).onConflictDoUpdate({target:[o.project,o.filePath],set:{mtimeMs:_.mtimeMs,size:_.size,contentHash:_.contentHash,updatedAt:_.updatedAt,lineCount:_.lineCount??null}}).run()}getAllFiles(_){return this.db.drizzleDb.select().from(o).where(y_(o.project,_)).all()}getFilesMap(_){let $=this.getAllFiles(_),J=new Map;for(let Q of $)J.set(Q.filePath,Q);return J}deleteFile(_,$){this.db.drizzleDb.delete(o).where(s0(y_(o.project,_),y_(o.filePath,$))).run()}}import{eq as t,and as N_,sql as s_,count as QJ}from"drizzle-orm";function k_(_){return _.replaceAll("\x00","").trim().split(/\s+/).map(($)=>$.trim()).filter(($)=>$.length>0).map(($)=>`"${$.replaceAll('"','""')}"*`).join(" ")}var r0=50;class M0{db;constructor(_){this.db=_}replaceFileSymbols(_,$,J,Q){if(this.db.drizzleDb.delete(x).where(N_(t(x.project,_),t(x.filePath,$))).run(),!Q.length)return;let z=new Date().toISOString(),W=Q.map((Z)=>({project:_,filePath:$,kind:Z.kind??"unknown",name:Z.name??"",startLine:Z.startLine??0,startColumn:Z.startColumn??0,endLine:Z.endLine??0,endColumn:Z.endColumn??0,isExported:Z.isExported??0,signature:Z.signature??null,fingerprint:Z.fingerprint??null,detailJson:Z.detailJson??null,contentHash:J,indexedAt:Z.indexedAt??z,resolvedType:Z.resolvedType??null,structuralFingerprint:Z.structuralFingerprint??null}));for(let Z=0;Z<W.length;Z+=r0)this.db.drizzleDb.insert(x).values(W.slice(Z,Z+r0)).run()}getFileSymbols(_,$){return this.db.drizzleDb.select().from(x).where(N_(t(x.project,_),t(x.filePath,$))).all()}searchByName(_,$,J={}){let Q=J.limit??50,z=k_($);if(!z)return[];return this.db.drizzleDb.select().from(x).where(N_(s_`${x.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${z})`,t(x.project,_),J.kind?t(x.kind,J.kind):void 0)).orderBy(x.name).limit(Q).all()}searchByKind(_,$){return this.db.drizzleDb.select().from(x).where(N_(t(x.project,_),t(x.kind,$))).orderBy(x.name).all()}getStats(_){let $=this.db.drizzleDb.select({symbolCount:QJ(),fileCount:s_`COUNT(DISTINCT ${x.filePath})`}).from(x).where(t(x.project,_)).get();return{symbolCount:$?.symbolCount??0,fileCount:$?.fileCount??0}}getByFingerprint(_,$){return this.db.drizzleDb.select().from(x).where(N_(t(x.project,_),t(x.fingerprint,$))).all()}deleteFileSymbols(_,$){this.db.drizzleDb.delete(x).where(N_(t(x.project,_),t(x.filePath,$))).run()}searchByQuery(_){let $=this.db.drizzleDb.select().from(x).where(N_(_.ftsQuery?s_`${x.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${_.ftsQuery})`:void 0,_.exactName?t(x.name,_.exactName):void 0,_.project!==void 0?t(x.project,_.project):void 0,_.kind?t(x.kind,_.kind):void 0,_.filePath!==void 0?t(x.filePath,_.filePath):void 0,_.isExported!==void 0?t(x.isExported,_.isExported?1:0):void 0,_.decorator?s_`${x.id} IN (SELECT s.id FROM symbols s, json_each(s.detail_json, '$.decorators') je WHERE json_extract(je.value, '$.name') = ${_.decorator})`:void 0,_.resolvedType!==void 0?t(x.resolvedType,_.resolvedType):void 0)).orderBy(x.name);if(!_.regex)return(_.limit!==void 0?$.limit(_.limit):$).all();let J;try{J=new RegExp(_.regex)}catch{throw new V("validation",`Invalid regex pattern: ${_.regex}`)}if(_.limit===void 0)return $.all().filter((W)=>J.test(W.name));let Q=[];for(let z of[5,20,100]){let W=_.limit*z,Z=$.limit(W).all();if(Q=Z.filter((Y)=>J.test(Y.name)),Q.length>=_.limit||Z.length<W)return Q.slice(0,_.limit)}return Q.slice(0,_.limit)}}import{eq as m,and as M_,isNull as o0,or as zJ}from"drizzle-orm";var x_={project:v.project,type:v.type,srcFilePath:v.srcFilePath,srcSymbolName:v.srcSymbolName,dstProject:v.dstProject,dstFilePath:v.dstFilePath,dstSymbolName:v.dstSymbolName,metaJson:v.metaJson,specifier:v.specifier,isExternal:v.isExternal};class L0{db;constructor(_){this.db=_}replaceFileRelations(_,$,J){this.db.transaction((Q)=>{if(Q.drizzleDb.delete(v).where(M_(m(v.project,_),m(v.srcFilePath,$))).run(),!J.length)return;for(let z of J)Q.drizzleDb.insert(v).values({project:_,type:z.type??"unknown",srcFilePath:z.srcFilePath??$,srcSymbolName:z.srcSymbolName??null,dstProject:z.dstProject??(z.dstFilePath!=null?_:null),dstFilePath:z.dstFilePath??null,dstSymbolName:z.dstSymbolName??null,metaJson:z.metaJson??null,specifier:z.specifier??null,isExternal:z.isExternal??0}).run()})}getOutgoing(_,$,J){if(J!==void 0)return this.db.drizzleDb.select(x_).from(v).where(M_(m(v.project,_),m(v.srcFilePath,$),zJ(m(v.srcSymbolName,J),o0(v.srcSymbolName)))).all();return this.db.drizzleDb.select(x_).from(v).where(M_(m(v.project,_),m(v.srcFilePath,$))).all()}getIncoming(_){let{dstProject:$,dstFilePath:J}=_;return this.db.drizzleDb.select(x_).from(v).where(M_(m(v.dstProject,$),m(v.dstFilePath,J))).all()}getByType(_,$){return this.db.drizzleDb.select(x_).from(v).where(M_(m(v.project,_),m(v.type,$))).all()}deleteFileRelations(_,$){this.db.drizzleDb.delete(v).where(M_(m(v.project,_),m(v.srcFilePath,$))).run()}deleteIncomingRelations(_,$){this.db.drizzleDb.delete(v).where(M_(m(v.dstProject,_),m(v.dstFilePath,$))).run()}searchRelations(_){let $=this.db.drizzleDb.select(x_).from(v).where(M_(_.project!==void 0?m(v.project,_.project):void 0,_.srcFilePath!==void 0?m(v.srcFilePath,_.srcFilePath):void 0,_.srcSymbolName!==void 0?m(v.srcSymbolName,_.srcSymbolName):void 0,_.dstProject!==void 0?m(v.dstProject,_.dstProject):void 0,_.dstFilePath!==void 0?m(v.dstFilePath,_.dstFilePath):void 0,_.dstSymbolName!==void 0?m(v.dstSymbolName,_.dstSymbolName):void 0,_.type!==void 0?m(v.type,_.type):void 0,_.specifier!==void 0?m(v.specifier,_.specifier):void 0,_.isExternal!==void 0?m(v.isExternal,_.isExternal?1:0):void 0));return(_.limit!==void 0?$.limit(_.limit):$).all()}retargetRelations(_){let{dstProject:$,oldFile:J,oldSymbol:Q,newFile:z,newSymbol:W,newDstProject:Z}=_,Y=Q===null?M_(m(v.dstProject,$),m(v.dstFilePath,J),o0(v.dstSymbolName)):M_(m(v.dstProject,$),m(v.dstFilePath,J),m(v.dstSymbolName,Q)),X={dstFilePath:z,dstSymbolName:W};if(Z!==void 0)X.dstProject=Z;this.db.drizzleDb.update(v).set(X).where(Y).run()}}import{err as e0}from"@zipbul/result";import{subscribe as WJ}from"@parcel/watcher";import B0 from"path";import t0 from"path";function z_(_){return _.replaceAll("\\","/")}function h_(_,$){return z_(t0.relative(_,$))}function g_(_,$){return z_(t0.resolve(_,$))}var YJ=["**/.git/**",`**/${A_}/**`,"**/dist/**","**/node_modules/**"],ZJ=new Set(["package.json","tsconfig.json"]);function XJ(_){if(_==="update")return"change";if(_==="create")return"create";return"delete"}class w0{#_;#$;#J;#z;#W;#Y;constructor(_,$=WJ,J=console){this.#$=_.projectRoot,this.#J=[...YJ,..._.ignorePatterns??[]],this.#z=new Set((_.extensions??[".ts",".mts",".cts"]).map((Q)=>Q.toLowerCase())),this.#W=$,this.#Y=J}async start(_){try{this.#_=await this.#W(this.#$,($,J)=>{if($){this.#Y.error(new V("watcher","Callback error",{cause:$}));return}try{for(let Q of J){let z=z_(B0.relative(this.#$,Q.path));if(z.startsWith(".."))continue;let W=B0.basename(z),Z=B0.extname(z).toLowerCase();if(!ZJ.has(W)&&!this.#z.has(Z))continue;if(z.endsWith(".d.ts"))continue;_({eventType:XJ(Q.type),filePath:z})}}catch(Q){this.#Y.error(new V("watcher","Callback error",{cause:Q}))}},{ignore:this.#J})}catch($){return e0(new V("watcher","Failed to subscribe watcher",{cause:$}))}}async close(){if(!this.#_)return;try{await this.#_.unsubscribe(),this.#_=void 0}catch(_){return e0(new V("watcher","Failed to close watcher",{cause:_}))}}}import I0 from"path";var UJ=["**/node_modules/**","**/.git/**",`**/${A_}/**`,"**/dist/**"],VJ=UJ.map((_)=>new Bun.Glob(_));function OJ(_){return new Bun.Glob("**/package.json").scan({cwd:_,followSymlinks:!1})}async function r_(_,$=OJ){let J=[];for await(let Q of $(_)){let z=z_(Q);if(VJ.some((M)=>M.match(z)))continue;let W=z_(I0.dirname(Q)),Z=I0.join(_,Q),Y=await Bun.file(Z).json(),X=typeof Y?.name==="string"&&Y.name.length>0?Y.name:I0.basename(W==="."?_:W);J.push({dir:W,project:X})}return J.sort((Q,z)=>z.dir.length-Q.dir.length),J}function a(_,$,J="default"){let Q=z_(_);for(let z of $){if(z.dir===".")return z.project;if(Q===z.dir||Q.startsWith(`${z.dir}/`))return z.project}return J}import m_ from"path";var q_=new Map;async function HJ(_){let $=Bun.file(_);if(!await $.exists())return null;try{let J=await $.text(),Q=Bun.JSONC.parse(J);return typeof Q==="object"&&Q!==null?Q:null}catch{return null}}function KJ(_,$){if($.startsWith(".")){let J=m_.resolve(_,$);return J.endsWith(".json")?J:J+".json"}return m_.resolve(_,"node_modules",$)}async function _1(_,$=5){if($<=0)return null;let J=await HJ(_);if(!J)return null;let Q=J.extends;if(typeof Q!=="string"||!Q)return J;let z=KJ(m_.dirname(_),Q),W=await _1(z,$-1);if(!W)return J;let Z=typeof W.compilerOptions==="object"&&W.compilerOptions!==null?W.compilerOptions:{},Y=typeof J.compilerOptions==="object"&&J.compilerOptions!==null?J.compilerOptions:{};return{...W,...J,compilerOptions:{...Z,...Y}}}async function n_(_){if(q_.has(_))return q_.get(_)??null;let $=m_.join(_,"tsconfig.json"),J=await _1($);if(!J)return q_.set(_,null),null;let Q=typeof J.compilerOptions==="object"&&J.compilerOptions!==null?J.compilerOptions:null;if(!Q)return q_.set(_,null),null;let z=typeof Q.baseUrl==="string"?Q.baseUrl:null,W=typeof Q.paths==="object"&&Q.paths!==null?Q.paths:null;if(!z&&!W)return q_.set(_,null),null;let Z=z?m_.resolve(_,z):_,Y=new Map;if(W)for(let[M,O]of Object.entries(W)){if(!Array.isArray(O))continue;let L=O.filter((D)=>typeof D==="string");Y.set(M,L)}let X={baseUrl:Z,paths:Y};return q_.set(_,X),X}function o_(_){if(_){q_.delete(_);return}q_.clear()}function H_(_){let $=Bun.hash.xxHash64(_);return BigInt.asUintN(64,BigInt($)).toString(16).padStart(16,"0")}import{isErr as O1}from"@zipbul/result";import{err as MJ}from"@zipbul/result";import{parseSync as LJ}from"oxc-parser";function E_(_,$,J,Q=LJ){try{let z={preserveParens:!1,...J},W=Q(_,$,z);return{filePath:_,program:W.program,errors:W.errors,comments:W.comments,sourceText:$,module:W.module}}catch(z){return MJ(new V("parse",`Failed to parse file: ${_}`,{cause:z}))}}import{join as BJ}from"path";function wJ(_,$){let J=$.length===1?`**/*${$[0]}`:`**/*{${$.join(",")}}`;return new Bun.Glob(J).scan({cwd:_,followSymlinks:!1})}async function $1(_){let{projectRoot:$,extensions:J,ignorePatterns:Q,fileRepo:z,scanFilesFn:W=wJ}=_,Z=z.getFilesMap(),Y=new Set,X=[],M=[],O=Q.map((D)=>new Bun.Glob(D));for await(let D of W($,J)){let N=z_(D);if(!J.some((l)=>N.endsWith(l)))continue;if(N.startsWith("node_modules/")||N.includes("/node_modules/"))continue;if(O.some((l)=>l.match(N)))continue;Y.add(N);let w=BJ($,N),R=Bun.file(w),{size:G,lastModified:F}=R,u=Z.get(N);if(!u){let l=await R.text(),i=H_(l);X.push({filePath:N,contentHash:i,mtimeMs:F,size:G});continue}if(u.mtimeMs===F&&u.size===G){M.push({filePath:N,contentHash:u.contentHash,mtimeMs:F,size:G});continue}let E=await R.text(),y=H_(E);if(y===u.contentHash)M.push({filePath:N,contentHash:y,mtimeMs:F,size:G});else X.push({filePath:N,contentHash:y,mtimeMs:F,size:G})}let L=[];for(let D of Z.keys())if(!Y.has(D))L.push(D);return{changed:X,unchanged:M,deleted:L}}function p_(_){let $=[0];for(let J=0;J<_.length;J++)if(_[J]===`
3
+ `)$.push(J+1);return $}function O_(_,$){let J=0,Q=_.length-1;while(J<Q){let z=J+Q+1>>1;if(_[z]<=$)J=z;else Q=z-1}return{line:J+1,column:$-_[J]}}import{err as IJ}from"@zipbul/result";import{parse as CJ}from"comment-parser";function t_(_){try{let $=_.trim();if($.startsWith("/**"))$=$.slice(3);if($.endsWith("*/"))$=$.slice(0,-2);let Q=CJ(`/** ${$} */`)[0]??{description:"",tags:[]};return{description:(Q.description??"").trim(),tags:(Q.tags??[]).map((z)=>({tag:z.tag??"",name:z.name??"",type:z.type??"",description:z.description??"",optional:z.optional??!1,...z.default!==void 0?{default:z.default}:{}}))}}catch($){return IJ(new V("parse","Failed to parse JSDoc comment",{cause:$}))}}import{isErr as DJ}from"@zipbul/result";function AJ(_){if("name"in _&&typeof _.name==="string")return _.name;if("value"in _){let $=_.value;if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="bigint"||typeof $==="boolean")return String($)}return"unknown"}function v_(_){if(_.type==="Identifier")return[{name:_.name,start:_.start,end:_.end}];if(_.type==="ObjectPattern"){let $=[];for(let J of _.properties)if(J.type==="RestElement")$.push(...v_(J.argument));else $.push(...v_(J.value));return $}if(_.type==="ArrayPattern"){let $=[];for(let J of _.elements){if(!J)continue;if(J.type==="RestElement")$.push(...v_(J.argument));else $.push(...v_(J))}return $}if(_.type==="AssignmentPattern")return v_(_.left);return[]}function qJ(_){let $=new Map;for(let J of _.module.staticImports){let Q=J.moduleRequest.value;for(let z of J.entries){let W=z.localName.value,Z=z.importName.kind==="Name"?z.importName.name:void 0,Y={specifier:Q};if(Z&&Z!==W)Y.originalName=Z;$.set(W,Y)}}return $}function R_(_){let{program:$,sourceText:J,comments:Q}=_,z=p_(J),W=qJ(_),Z=Q.filter((C)=>C.type==="Block"&&C.value.startsWith("*")).sort((C,q)=>C.end-q.end),Y=$.body.map((C)=>C.start).sort((C,q)=>C-q);function X(C,q){return F(C,q)}function M(C,q,U){if(C.type==="PrivateIdentifier")return{kind:"private"};if(!q&&C.type==="Identifier")return;return X(C,U)}function O(C,q){if(q)return J.slice(C.start,C.end);if(C.type==="PrivateIdentifier")return`#${C.name}`;return AJ(C)}function L(C,q,U){let H=C;if(!q&&H.type==="Identifier")return{kind:"string",value:H.name};return X(C,U)}function D(C,q){return{start:O_(z,C),end:O_(z,q)}}function N(C){let q=0,U=Z.length-1,H=-1;while(q<=U){let B=q+U>>>1;if(Z[B].end<=C)H=B,q=B+1;else U=B-1}if(H<0)return;let K=Z[H];q=0,U=Y.length-1;while(q<=U){let B=q+U>>>1,A=Y[B];if(A<=K.end)q=B+1;else if(A>=C)U=B-1;else return}return`/*${K.value}*/`}function w(C){if(!C)return;let q="typeAnnotation"in C&&C.typeAnnotation?C.typeAnnotation:C;return J.slice(q.start,q.end)}let R=8;function G(C){if(C.type==="Identifier")return W.get(C.name);if(C.type==="MemberExpression"){let q=C.object;if(q.type==="Identifier")return W.get(q.name)}return}function F(C,q=0){let U=C;if(q>=R)return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)};let H=U.type;if(H==="Literal"){let K=U.value;if(typeof K==="bigint")return{kind:"bigint",value:typeof U.bigint==="string"?U.bigint:K.toString()};if(typeof U.regex==="object"&&U.regex!==null)return{kind:"regex",value:J.slice(U.start,U.end)};if(K===null)return{kind:"null",value:null};if(typeof K==="string")return{kind:"string",value:K};if(typeof K==="number")return{kind:"number",value:K};if(typeof K==="boolean")return{kind:"boolean",value:K};return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}if(H==="Identifier"){let K=U.name;if(K==="undefined")return{kind:"undefined",value:null};let B=W.get(K),A={kind:"identifier",name:K};if(B){if(A.importSource=B.specifier,B.originalName)A.originalName=B.originalName}return A}if(H==="MemberExpression"){if(U.computed){let j=U.property;if(j.type==="Literal"&&typeof j.value==="string"){let g=U.object,b=J.slice(g.start,g.end),d=g.type==="Identifier"?g.name:void 0,J_=d?W.get(d):void 0,V_={kind:"member",object:b,property:j.value};if(J_)V_.importSource=J_.specifier;return V_}return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}let K=U.object,B=J.slice(K.start,K.end),A=U.property.name??J.slice(U.property.start,U.property.end),I=K.type==="Identifier"?K.name:void 0,S=I?W.get(I):void 0,T={kind:"member",object:B,property:A};if(S)T.importSource=S.specifier;return T}if(H==="CallExpression"){let K=U.callee,B=J.slice(K.start,K.end),I=(U.arguments??[]).map((j)=>F(j,q+1)),S=G(K),T={kind:"call",callee:B,arguments:I};if(S)T.importSource=S.specifier;return T}if(H==="NewExpression"){let K=U.callee,B=J.slice(K.start,K.end),I=(U.arguments??[]).map((j)=>F(j,q+1)),S=G(K),T={kind:"new",callee:B,arguments:I};if(S)T.importSource=S.specifier;return T}if(H==="ObjectExpression"){let K=U.properties??[],B=[];for(let A of K){if(A.type==="SpreadElement"){let d=A.argument;B.push({kind:"spread",argument:F(d,q+1)});continue}let I=A.key,S=A.computed===!0,T=A.value,j=A.shorthand||void 0,b={kind:"property",key:L(I,S,q+1),value:F(T,q+1)};if(j)b.shorthand=!0;B.push(b)}return{kind:"object",properties:B}}if(H==="ArrayExpression")return{kind:"array",elements:(U.elements??[]).map((A)=>{if(!A)return{kind:"undefined",value:null};return F(A,q+1)})};if(H==="SpreadElement"){let K=U.argument;return{kind:"spread",argument:F(K,q+1)}}if(H==="ArrowFunctionExpression"||H==="FunctionExpression"){let B=U.params.map(E),A={kind:"function",sourceText:J.slice(U.start,U.end)};if(B.length>0)A.parameters=B;return A}if(H==="TemplateLiteral"||H==="TaggedTemplateExpression")return{kind:"template",sourceText:J.slice(U.start,U.end)};if(H==="UnaryExpression"){let{operator:K,argument:B}=U;if(K==="-"&&B.type==="Literal"&&typeof B.value==="number")return{kind:"number",value:-B.value};if(K==="void")return{kind:"undefined",value:null};return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}if(H==="TSAsExpression"||H==="TSSatisfiesExpression"||H==="TSNonNullExpression"||H==="TSTypeAssertion"||H==="TSInstantiationExpression"||H==="ParenthesizedExpression"||H==="ChainExpression"){let K=U.expression;if(K)return F(K,q)}return{kind:"unresolvable",sourceText:J.slice(U.start,U.end)}}function u(C){if(!C||C.length===0)return[];return C.map((q)=>{let U=q.expression;if(U.type==="CallExpression"){let H=U,K=H.callee,B="name"in K&&typeof K.name==="string"?K.name:("property"in K)&&K.property&&typeof K.property.name==="string"?K.property.name:"unknown",A=H.arguments.map((I)=>F(I));return{name:B,arguments:A.length>0?A:void 0}}if(U.type==="Identifier")return{name:U.name??"unknown"};return{name:J.slice(U.start,U.end)}})}function E(C){if(C.type==="TSParameterProperty"){let U=C;return l(U.parameter,U.decorators)}if(C.type==="RestElement"){let U=C,H=U.argument,B=`...${"name"in H&&typeof H.name==="string"?H.name:"unknown"}`,A=U.typeAnnotation,I=A?w(A):void 0,S={name:B,isOptional:!1};if(I)S.type=I;return S}let q=C;return l(q,q.decorators)}function y(C){if(!C)return;let q="typeAnnotation"in C&&C.typeAnnotation?C.typeAnnotation:null;if(!q)return;let H=q.typeName?.name;if(!H)return;return W.get(H)?.specifier}function l(C,q){if(C.type==="AssignmentPattern"){let{left:T,right:j}=C,g="name"in T&&typeof T.name==="string"?T.name:"unknown",b="typeAnnotation"in T?T.typeAnnotation:null,d=b?w(b):void 0,J_=y(b),V_=J.slice(j.start,j.end),B_="decorators"in T&&Array.isArray(T.decorators)?T.decorators:[],U0=u(B_),D_={name:g,isOptional:!0,defaultValue:V_};if(d)D_.type=d;if(J_)D_.typeImportSource=J_;if(U0.length>0)D_.decorators=U0;return D_}let U="name"in C&&typeof C.name==="string"?C.name:("pattern"in C)&&C.pattern&&typeof C.pattern.name==="string"?C.pattern.name:"unknown",H=!!(("optional"in C)&&C.optional),K="typeAnnotation"in C?C.typeAnnotation:null,B=K?w(K):void 0,A=y(K),I=u(q??[]),S={name:U,isOptional:H};if(B)S.type=B;if(A)S.typeImportSource=A;if(I.length>0)S.decorators=I;return S}function i(C,q){let U=[];if(q?.async)U.push("async");if(C.static)U.push("static");if(C.abstract)U.push("abstract");if(C.readonly)U.push("readonly");if(C.override)U.push("override");if(C.declare)U.push("declare");if(C.const)U.push("const");let H=C.accessibility;if(H==="private")U.push("private");else if(H==="protected")U.push("protected");else if(H==="public")U.push("public");return U}function W_(C){if(!C)return;let q=C.params.flatMap((U)=>{let H=U.name.name;return H?[H]:[]});return q.length>0?q:void 0}function X_(C){let q=[];if(C.superClass){let H=J.slice(C.superClass.start,C.superClass.end);q.push({kind:"extends",name:H})}let U=C.implements??[];for(let H of U){let K=H.expression,B=J.slice(K.start,K.end);q.push({kind:"implements",name:B})}return q}function K_(C){let q=[],U=C.extends;for(let H of U){let K=H.expression,B=J.slice(K.start,K.end);q.push({kind:"extends",name:B})}return q}function U_(C){let q=[];for(let U of C)if(U.type==="MethodDefinition"||U.type==="TSAbstractMethodDefinition"){let H=U,K=O(H.key,H.computed),B=M(H.key,H.computed,0),A=H.value,I=H.kind,S=I==="constructor"?"constructor":I==="get"?"getter":I==="set"?"setter":"method",T=i(H,A);if(U.type==="TSAbstractMethodDefinition"&&!T.includes("abstract"))T.push("abstract");let j=A.params.map(E),g=w(A.returnType),b=u(H.decorators??[]),d={kind:"method",name:K,span:D(U.start,U.end),isExported:!1,methodKind:S,modifiers:T,parameters:j.length>0?j:void 0,returnType:g};if(B)d.key=B;if(b.length>0)d.decorators=b;q.push(d)}else if(U.type==="PropertyDefinition"||U.type==="TSAbstractPropertyDefinition"||U.type==="AccessorProperty"||U.type==="TSAbstractAccessorProperty"){let H=U,K=O(H.key,H.computed),B=M(H.key,H.computed,0),A=i(H);if(U.type==="TSAbstractPropertyDefinition"||U.type==="TSAbstractAccessorProperty"){if(!A.includes("abstract"))A.push("abstract")}if(U.type==="AccessorProperty"||U.type==="TSAbstractAccessorProperty")A.push("accessor");let I=w(H.typeAnnotation),S=H.value,T=S?F(S):void 0,j=u(H.decorators??[]),g={kind:"property",name:K,span:D(U.start,U.end),isExported:!1,modifiers:A,returnType:I,initializer:T};if(B)g.key=B;if(j.length>0)g.decorators=j;q.push(g)}return q}function Y_(C){let q=[];for(let U of C)if(U.type==="TSMethodSignature"){let H=U,K=O(H.key,H.computed),B=M(H.key,H.computed,0),A=H.params.map(E),I=w(H.returnType),S={kind:"method",name:K,span:D(U.start,U.end),isExported:!1,modifiers:[],methodKind:"method",parameters:A.length>0?A:void 0,returnType:I};if(B)S.key=B;q.push(S)}else if(U.type==="TSPropertySignature"){let H=U,K=O(H.key,H.computed),B=M(H.key,H.computed,0),A=w(H.typeAnnotation),I={kind:"property",name:K,span:D(U.start,U.end),isExported:!1,modifiers:H.readonly?["readonly"]:[],returnType:A};if(B)I.key=B;q.push(I)}return q}function c(C,q){let U=C.type;if(U==="FunctionDeclaration"||U==="FunctionExpression"||U==="TSDeclareFunction"||U==="TSEmptyBodyFunctionExpression"){let H=C,K=H.id?.name??"default",B=H.params.map(E),A=w(H.returnType),I=i(H,H),S=u(H.decorators??[]),T=W_(H.typeParameters),j={kind:"function",name:K,span:D(C.start,C.end),isExported:q,modifiers:I,parameters:B.length>0?B:void 0,returnType:A,decorators:S.length>0?S:void 0};if(T&&T.length>0)j.typeParameters=T;return j}if(U==="ClassDeclaration"||U==="ClassExpression"){let H=C,K=H.id?.name??"default",B=X_(H),A=U_(H.body.body),I=u(H.decorators),S=i(H),T=W_(H.typeParameters),j={kind:"class",name:K,span:D(C.start,C.end),isExported:q,modifiers:S,heritage:B.length>0?B:void 0,members:A.length>0?A:void 0,decorators:I.length>0?I:void 0};if(T&&T.length>0)j.typeParameters=T;return j}if(U==="VariableDeclaration"){let H=C,K=[];for(let B of H.declarations){let{id:A,init:I}=B;if(A.type==="ObjectPattern"||A.type==="ArrayPattern"){let V_=v_(A);for(let B_ of V_)K.push({kind:"variable",name:B_.name,span:D(B_.start,B_.end),isExported:q,modifiers:[]});continue}let S="name"in A&&typeof A.name==="string"?A.name:"unknown",T="variable",j,g,b;if(I)if(I.type==="FunctionExpression"||I.type==="ArrowFunctionExpression"){T="function";let V_=I;j=V_.params.map(E),g=w(V_.returnType)}else b=F(I);let d=[],J_={kind:T,name:S,span:D(B.start,B.end),isExported:q,modifiers:d,parameters:j,returnType:g};if(b)J_.initializer=b;K.push(J_)}if(K.length===0)return null;if(K.length===1)return K[0];return K}if(U==="TSTypeAliasDeclaration")return{kind:"type",name:C.id.name,span:D(C.start,C.end),isExported:q,modifiers:[]};if(U==="TSInterfaceDeclaration"){let H=C,K=H.id.name,B=K_(H),A=Y_(H.body.body),I=W_(H.typeParameters),S={kind:"interface",name:K,span:D(C.start,C.end),isExported:q,modifiers:[],heritage:B.length>0?B:void 0,members:A.length>0?A:void 0};if(I&&I.length>0)S.typeParameters=I;return S}if(U==="TSEnumDeclaration"){let H=C,K=H.id.name,B=i(H),I=H.body.members.map((S)=>{let T=S.id,j=T.type!=="Identifier",g="name"in T&&typeof T.name==="string"?T.name:("value"in T)&&typeof T.value==="string"?T.value:"unknown",b=S.initializer?F(S.initializer):void 0,d={kind:"property",name:g,span:D(S.start,S.end),isExported:!1,modifiers:[]};if(j)d.key=X(T,0);if(b)d.initializer=b;return d});return{kind:"enum",name:K,span:D(C.start,C.end),isExported:q,modifiers:B,members:I.length>0?I:void 0}}if(U==="TSModuleDeclaration"){let H=C,K=H.id.name??H.id.value??"unknown",B=i(H),A=[];if(H.body?.type==="TSModuleBlock")for(let I of H.body.body??[]){if(I.type!=="ExportNamedDeclaration")continue;let S=I.declaration;if(!S)continue;let T=c(S,!1);if(T)if(Array.isArray(T))A.push(...T);else A.push(T)}return{kind:"namespace",name:K,span:D(C.start,C.end),isExported:q,modifiers:B,members:A.length>0?A:void 0}}return null}let s=[],C_=new Set;for(let C of $.body){let q=null,U=C;if(U.type==="ExportNamedDeclaration"){let K=U;if(K.declaration){if(q=c(K.declaration,!0),q&&!Array.isArray(q))q.span=D(K.start,K.end)}else if(!K.source&&K.specifiers)for(let B of K.specifiers){let A=B.local,I="name"in A?A.name:A.value;if(I)C_.add(I)}}else if(U.type==="ExportDefaultDeclaration"){let K=U,B=K.declaration;if(B){if(q=c(B,!0),q&&!Array.isArray(q))q.name="id"in B&&B.id&&typeof B.id.name==="string"?B.id.name:"default",q.isExported=!0,q.span=D(K.start,K.end);else if(!q&&"type"in B&&B.type==="Identifier"){let A=B.name;if(A)C_.add(A)}}}else{let K=U.type;if(K==="FunctionDeclaration"||K==="TSDeclareFunction"||K==="ClassDeclaration"||K==="VariableDeclaration"||K==="TSTypeAliasDeclaration"||K==="TSInterfaceDeclaration"||K==="TSEnumDeclaration"||K==="TSModuleDeclaration")q=c(U,!1)}let H=Array.isArray(q)?q:q?[q]:[];for(let K of H){let B=C.start,A=N(B);if(A){let I=t_(A);if(!DJ(I))K.jsDoc=I}s.push(K)}}if(C_.size>0){for(let C of s)if(!C.isExported&&C_.has(C.name))C.isExported=!0}return s}function e_(_){if(_===null||typeof _!=="object")return JSON.stringify(_);if(Array.isArray(_))return`[${_.map(e_).join(",")}]`;let $=_;return`{${Object.keys($).sort().map((Q)=>`${JSON.stringify(Q)}:${e_($[Q])}`).join(",")}}`}function NJ(_){if(_.kind==="function"||_.kind==="method"){let $=_.parameters?.length??0,J=_.modifiers.includes("async")?1:0;return`params:${$}|async:${J}`}return null}function RJ(_){let $={};if(_.jsDoc)$.jsDoc=_.jsDoc;if(_.kind==="function"||_.kind==="method"){if(_.parameters!==void 0)$.parameters=_.parameters;if(_.returnType!==void 0)$.returnType=_.returnType}if(_.heritage?.length)$.heritage=_.heritage;if(_.decorators?.length)$.decorators=_.decorators;if(_.typeParameters?.length)$.typeParameters=_.typeParameters;if(_.modifiers?.length)$.modifiers=_.modifiers;if(_.initializer)$.initializer=_.initializer;if(_.key)$.key=_.key;if(_.members?.length)$.members=_.members.map((J)=>{let Q=J.modifiers.find((W)=>W==="private"||W==="protected"||W==="public"),z={name:J.name,kind:J.methodKind??J.kind,type:J.returnType,visibility:Q,isStatic:J.modifiers.includes("static")||void 0,isReadonly:J.modifiers.includes("readonly")||void 0,isAccessor:J.modifiers.includes("accessor")||void 0};if(J.key)z.key=J.key;if(J.initializer)z.initializer=J.initializer;if(J.decorators?.length)z.decorators=J.decorators;return z});return Object.keys($).length>0?JSON.stringify($):null}function TJ(_){let $=[_.kind];if(_.modifiers.length)$.push(`mod:${[..._.modifiers].sort().join(",")}`);if(_.typeParameters?.length)$.push(`tp:${_.typeParameters.length}`);if(_.heritage?.length){let J=[..._.heritage].sort((Q,z)=>Q.name.localeCompare(z.name)).map((Q)=>`${Q.kind}:${Q.name}`).join(",");$.push(`her:${J}`)}if(_.decorators?.length)$.push(`dec:${[..._.decorators].map((J)=>J.name).sort().join(",")}`);if(_.methodKind)$.push(`mk:${_.methodKind}`);if(_.parameters)$.push(`p:${_.parameters.length}`);if(_.returnType)$.push(`rt:${_.returnType}`);if(_.key)$.push(`k:${e_(_.key)}`);if(_.members?.length){let J=_.members.map((Q)=>`${Q.kind}:${Q.modifiers.join(",")}:${Q.parameters?.length??""}:${Q.returnType??""}:${Q.key?e_(Q.key):""}`).sort().join(";");$.push(`mem:${_.members.length}:${H_(J)}`)}return H_($.join("|"))}function J1(_,$,J,Q,z){let W=NJ(_),Z=H_(`${$}|${_.kind}|${W??""}`),Y=TJ(_);return{project:J,filePath:Q,kind:_.kind,name:$,startLine:_.span.start.line,startColumn:_.span.start.column,endLine:_.span.end.line,endColumn:_.span.end.column,isExported:_.isExported?1:0,signature:W,fingerprint:Z,detailJson:RJ(_),contentHash:z,indexedAt:new Date().toISOString(),structuralFingerprint:Y}}function C0(_){let{parsed:$,project:J,filePath:Q,contentHash:z,symbolRepo:W}=_,Z=R_($),Y=[];for(let X of Z){Y.push(J1(X,X.name,J,Q,z));for(let M of X.members??[])Y.push(J1(M,`${X.name}.${M.name}`,J,Q,z))}W.replaceFileSymbols(J,Q,z,Y)}import{resolve as D0,dirname as SJ,extname as FJ}from"path";function T_(_,$,J){let Q=(z)=>{let W=FJ(z);if(W===".js")return[z.slice(0,-3)+".ts"];if(W===".mjs")return[z.slice(0,-4)+".mts"];if(W===".cjs")return[z.slice(0,-4)+".cts"];if(W===".ts"||W===".mts"||W===".cts"||W===".d.ts")return[z];return[z+".ts",z+".d.ts",z+"/index.ts",z+"/index.d.ts",z+".mts",z+"/index.mts",z+".cts",z+"/index.cts"]};if($.startsWith(".")){let z=z_(D0(SJ(_),$));return Q(z)}if(J)for(let[z,W]of J.paths){if(W.length===0)continue;let Z=z.indexOf("*");if(Z===-1){if($===z){let Y=[];for(let X of W)Y.push(...Q(z_(D0(J.baseUrl,X))));return Y}}else{let Y=z.slice(0,Z),X=z.slice(Z+1);if($.startsWith(Y)&&(X===""||$.endsWith(X))){let M=$.slice(Y.length,X===""?void 0:$.length-X.length),O=[];for(let L of W)O.push(...Q(z_(D0(J.baseUrl,L.replace("*",M)))));return O}}}return[]}function Q1(_,$,J,Q=T_){let z=new Map,W=_.body??[];for(let Z of W){if(Z.type!=="ImportDeclaration")continue;let Y=Z.source?.value??"",X=Q($,Y,J);if(X.length===0)continue;let M=X[0],O=Z.specifiers??[];for(let L of O)switch(L.type){case"ImportSpecifier":z.set(L.local.name,{path:M,importedName:L.imported.name});break;case"ImportDefaultSpecifier":z.set(L.local.name,{path:M,importedName:"default"});break;case"ImportNamespaceSpecifier":z.set(L.local.name,{path:M,importedName:"*"});break}}return z}import{Visitor as GJ}from"oxc-parser";function _0(_){return"name"in _&&typeof _.name==="string"?_.name:("value"in _)&&typeof _.value==="string"?_.value:"unknown"}function jJ(_){return!_.startsWith(".")&&!_.startsWith("/")}function S_(_,$,J,Q){let z=Q(_,$,J),W=z.length>0?z[0]:null,Z=W===null&&jJ($);return{resolved:W,isExternal:Z}}function kJ(_,$,J,Q,z){for(let W of _.staticImports){let Z=W.moduleRequest.value,{resolved:Y,isExternal:X}=S_($,Z,J,Q),M={dstFilePath:Y,specifier:Z};if(W.entries.length===0){let O={};if(X)O.isExternal=!0;if(Y===null&&!X)O.isUnresolved=!0;z.push({type:"imports",srcFilePath:$,srcSymbolName:null,...M,dstSymbolName:null,...Object.keys(O).length>0?{metaJson:JSON.stringify(O)}:{}});continue}for(let O of W.entries){let L=O.isType,D={};if(L)D.isType=!0;if(X)D.isExternal=!0;if(Y===null&&!X)D.isUnresolved=!0;let N,w,R=O.importName.kind;if(R==="Default")N="default",w=O.localName.value;else if(R==="NamespaceObject")N="*",w=O.localName.value,D.importKind="namespace";else N=O.importName.name??"unknown",w=O.localName.value;z.push({type:L?"type-references":"imports",srcFilePath:$,srcSymbolName:w,...M,dstSymbolName:N,...Object.keys(D).length>0?{metaJson:JSON.stringify(D)}:{}})}}}function gJ(_,$,J,Q,z){let W=new Map;for(let Z of _.staticImports)for(let Y of Z.entries)W.set(Y.localName.value,Z.moduleRequest.value);for(let Z of _.staticExports)for(let Y of Z.entries){let X=null;if(Y.moduleRequest)X=Y.moduleRequest.value;else if(Y.localName.name)X=W.get(Y.localName.name)??null;if(!X)continue;let{resolved:M,isExternal:O}=S_($,X,J,Q),L=Y.exportName.name??"default",D=Y.exportName.kind,N=Y.localName.name??Y.importName.name??L,w=Y.isType,R={isReExport:!0};if(D==="None");else R.specifiers=[{local:N,exported:L}];if(w)R.isType=!0;if(O)R.isExternal=!0;if(M===null&&!O)R.isUnresolved=!0;let G=null,F=null,u=Y.importName.kind;if(u==="All"||u==="AllButDefault"){if(D==="Name"&&L)F=L,R.namespaceAlias=L}else F=N,G=L;z.push({type:w?"type-references":"re-exports",srcFilePath:$,srcSymbolName:G,dstFilePath:M,dstSymbolName:F,specifier:X,metaJson:JSON.stringify(R)})}}function EJ(_,$,J,Q,z){for(let W of _.body){let Z=W;if(Z.type==="ImportDeclaration"){let Y=Z,X=Y.source.value,{resolved:M,isExternal:O}=S_($,X,J,Q),L=Y.importKind==="type",D=Y.specifiers,N={dstFilePath:M,specifier:X};if(D.length===0){let w={};if(L)w.isType=!0;if(O)w.isExternal=!0;if(M===null&&!O)w.isUnresolved=!0;z.push({type:L?"type-references":"imports",srcFilePath:$,srcSymbolName:null,...N,dstSymbolName:null,...Object.keys(w).length>0?{metaJson:JSON.stringify(w)}:{}})}else for(let w of D){let R=w.type,G=L||R==="ImportSpecifier"&&w.importKind==="type",F={};if(G)F.isType=!0;if(O)F.isExternal=!0;if(M===null&&!O)F.isUnresolved=!0;let u,E;if(R==="ImportDefaultSpecifier")u="default",E=w.local.name;else if(R==="ImportNamespaceSpecifier")u="*",E=w.local.name,F.importKind="namespace";else u=_0(w.imported),E=w.local.name;z.push({type:G?"type-references":"imports",srcFilePath:$,srcSymbolName:E,...N,dstSymbolName:u,...Object.keys(F).length>0?{metaJson:JSON.stringify(F)}:{}})}continue}if(Z.type==="ExportAllDeclaration"){let Y=Z,X=Y.source.value,{resolved:M,isExternal:O}=S_($,X,J,Q),L=Y.exportKind==="type",D=Y.exported,N=D?_0(D):null,w={isReExport:!0};if(L)w.isType=!0;if(O)w.isExternal=!0;if(M===null&&!O)w.isUnresolved=!0;if(N)w.namespaceAlias=N;z.push({type:L?"type-references":"re-exports",srcFilePath:$,srcSymbolName:null,dstFilePath:M,dstSymbolName:N,specifier:X,metaJson:JSON.stringify(w)});continue}if(Z.type==="ExportNamedDeclaration"){let Y=Z;if(!Y.source)continue;let X=Y.source.value,{resolved:M,isExternal:O}=S_($,X,J,Q),L=Y.exportKind==="type",D=Y.specifiers??[];for(let N of D){let w=L||N.exportKind==="type",R=_0(N.local),G=_0(N.exported),F={isReExport:!0,specifiers:[{local:R,exported:G}]};if(w)F.isType=!0;if(O)F.isExternal=!0;if(M===null&&!O)F.isUnresolved=!0;z.push({type:w?"type-references":"re-exports",srcFilePath:$,srcSymbolName:G,dstFilePath:M,dstSymbolName:R,specifier:X,metaJson:JSON.stringify(F)})}}}}function vJ(_,$,J,Q,z){new GJ({ImportExpression(Z){let Y=Z.source;if(Y.type!=="Literal"||typeof Y.value!=="string")return;let X=Y.value,{resolved:M,isExternal:O}=S_($,X,J,Q),L={isDynamic:!0};if(O)L.isExternal=!0;if(M===null&&!O)L.isUnresolved=!0;z.push({type:"imports",srcFilePath:$,srcSymbolName:null,dstFilePath:M,dstSymbolName:null,specifier:X,metaJson:JSON.stringify(L)})},CallExpression(Z){let Y=Z.callee,X=!1;if(Y.type==="Identifier"&&Y.name==="require");else if(Y.type==="MemberExpression"&&!Y.computed){let R=Y,G=R.object,F=R.property;if(G.type==="Identifier"&&G.name==="require"&&F.name==="resolve")X=!0;else return}else return;let M=Z.arguments;if(M.length===0)return;let O=M[0];if(O.type!=="Literal"||typeof O.value!=="string")return;let L=O.value,{resolved:D,isExternal:N}=S_($,L,J,Q),w={isRequire:!0};if(X)w.isRequireResolve=!0;if(N)w.isExternal=!0;if(D===null&&!N)w.isUnresolved=!0;z.push({type:"imports",srcFilePath:$,srcSymbolName:null,dstFilePath:D,dstSymbolName:null,specifier:L,metaJson:JSON.stringify(w)})}}).visit(_)}function z1(_,$,J,Q=T_,z){let W=[];if(z)kJ(z,$,J,Q,W),gJ(z,$,J,Q,W);else EJ(_,$,J,Q,W);return vJ(_,$,J,Q,W),W}import{walk as lJ}from"oxc-walker";function uJ(_){return _.type==="FunctionDeclaration"||_.type==="FunctionExpression"||_.type==="ArrowFunctionExpression"}function bJ(_){return _.type==="ArrowFunctionExpression"}function PJ(_){return _.type==="AssignmentExpression"}function fJ(_){return _.type==="CallExpression"}function yJ(_){return _.type==="FunctionDeclaration"}function xJ(_){return _.type==="FunctionExpression"}function hJ(_){return _.type==="Identifier"}function mJ(_){return _.type==="MemberExpression"}function nJ(_){return _.type==="TSQualifiedName"}function pJ(_){return _.type==="VariableDeclaration"}var W1=new Map,dJ=new Proxy({},{get(_,$,J){if(typeof $!=="string")return Reflect.get(_,$,J);let Q=$.charCodeAt(0);if(Q<65||Q>90)return Reflect.get(_,$,J);let z=W1.get($);if(z===void 0)z=(W)=>W!==null&&W!==void 0&&W.type===$,W1.set($,z);return z}});function u_(_){if(!_||typeof _!=="object"||Array.isArray(_))return null;let $=_;if($.type==="Identifier"){let J=$.name;return{root:J,parts:[],full:J}}if($.type==="ThisExpression")return{root:"this",parts:[],full:"this"};if($.type==="Super")return{root:"super",parts:[],full:"super"};if($.type==="MemberExpression"){let J=[],Q=$;while(Q.type==="MemberExpression"){let Z=Q.property;if(!Z||typeof Z.name!=="string")return null;J.push(Z.name),Q=Q.object}let z;if(Q.type==="Identifier")z=Q.name;else if(Q.type==="ThisExpression")z="this";else if(Q.type==="Super")z="super";else return null;J.reverse();let W=[z,...J].join(".");return{root:z,parts:J,full:W}}return null}function Y1(_,$,J){let Q=[],z=[],W=[];function Z(){if(z.length>0)return z[z.length-1]??null;return null}function Y(O){if(!O)return null;let L=J.get(O.root);if(O.parts.length===0){if(L)return{dstFilePath:L.path,dstSymbolName:L.importedName,resolution:"import"};return{dstFilePath:$,dstSymbolName:O.root,resolution:"local"}}else{if(L&&L.importedName==="*"){let D=O.parts[O.parts.length-1];return{dstFilePath:L.path,dstSymbolName:D,resolution:"namespace"}}return{dstFilePath:$,dstSymbolName:O.full,resolution:"local-member"}}}function X(O,L){let D=u_(O.callee),N=Y(D);if(N){let w=Z(),R={};if(L)R.isNew=!0;if(w===null)R.scope="module";Q.push({type:"calls",srcFilePath:$,srcSymbolName:w,dstFilePath:N.dstFilePath,dstSymbolName:N.dstSymbolName,...Object.keys(R).length>0?{metaJson:JSON.stringify(R)}:{}})}}function M(O,L){if(O.type==="FunctionDeclaration"){z.push(O.id?.name??"anonymous");return}if(O.type==="FunctionExpression"||O.type==="ArrowFunctionExpression"){if(L?.type==="VariableDeclarator"){let w=L.id,R=w.type==="Identifier"?w.name:"anonymous";z.push(R);return}if(L?.type==="MethodDefinition"||L?.type==="TSAbstractMethodDefinition"){let w=L.key,R=W[W.length-1]??"",G="name"in w?w.name:"anonymous",F=R?`${R}.${G}`:G;z.push(F);return}let D=Z(),N=D?`${D}.<anonymous>`:"<anonymous>";z.push(N)}}return lJ(_,{enter(O,L){if(O.type==="ClassDeclaration"||O.type==="ClassExpression"){W.push(O.id?.name??"AnonymousClass");return}if(O.type==="FunctionDeclaration"||O.type==="FunctionExpression"||O.type==="ArrowFunctionExpression"){M(O,L);return}if(O.type==="CallExpression"){X(O,!1);return}if(O.type==="NewExpression"){X(O,!0);return}},leave(O){if(O.type==="ClassDeclaration"||O.type==="ClassExpression"){W.pop();return}if(O.type==="FunctionDeclaration"||O.type==="FunctionExpression"||O.type==="ArrowFunctionExpression"){z.pop();return}}}),Q}import{Visitor as iJ}from"oxc-parser";function Z1(_,$,J){let Q=[];function z(Z){let Y=Z.id?.name??"AnonymousClass";if(Z.superClass){let M=u_(Z.superClass);if(M){let O=A0(M,$,J);Q.push({type:"extends",srcFilePath:$,srcSymbolName:Y,...O})}}let X=Z.implements??[];for(let M of X){let O=u_(M.expression);if(!O)continue;let L=A0(O,$,J);Q.push({type:"implements",srcFilePath:$,srcSymbolName:Y,...L})}}return new iJ({TSInterfaceDeclaration(Z){let Y=Z.id.name??"AnonymousInterface",X=Z.extends;for(let M of X){let O=u_(M.expression);if(!O)continue;let L=A0(O,$,J);Q.push({type:"extends",srcFilePath:$,srcSymbolName:Y,...L})}},ClassDeclaration(Z){z(Z)},ClassExpression(Z){z(Z)}}).visit(_),Q}function A0(_,$,J){let Q=J.get(_.root);if(Q){if(Q.importedName==="*"){let z=_.parts[_.parts.length-1]??_.root;return{dstFilePath:Q.path,dstSymbolName:z,metaJson:JSON.stringify({isNamespaceImport:!0})}}return{dstFilePath:Q.path,dstSymbolName:_.parts.length>0?_.full:Q.importedName}}return{dstFilePath:$,dstSymbolName:_.full,metaJson:JSON.stringify({isLocal:!0})}}function d_(_,$,J,Q=T_,z){let W=Q1(_,$,J,Q),Z=z1(_,$,J,Q,z),Y=Y1(_,$,W),X=Z1(_,$,W);return[...Z,...Y,...X]}function q0(_){let{ast:$,project:J,filePath:Q,relationRepo:z,projectRoot:W,tsconfigPaths:Z,knownFiles:Y,boundaries:X,module:M}=_,O=g_(W,Q),D=d_($,O,Z,Y?(w,R,G)=>{let F=T_(w,R,G);for(let u of F){let E=h_(W,u);if(X){let y=a(E,X);if(Y.has(`${y}::${E}`))return[u]}else if(Y.has(`${J}::${E}`))return[u]}return[]}:void 0,M),N=[];for(let w of D){if(w.dstFilePath===null){let u=h_(W,w.srcFilePath),E;if(w.metaJson)try{E=JSON.parse(w.metaJson)}catch{}let y=E?.isExternal===!0;N.push({project:J,type:w.type,srcFilePath:u,srcSymbolName:w.srcSymbolName??null,dstProject:null,dstFilePath:null,dstSymbolName:w.dstSymbolName??null,metaJson:w.metaJson??null,specifier:w.specifier??null,isExternal:y?1:0});continue}let R=h_(W,w.dstFilePath);if(R.startsWith(".."))continue;let G=h_(W,w.srcFilePath),F=X?a(R,X):J;N.push({project:J,type:w.type,srcFilePath:G,srcSymbolName:w.srcSymbolName??null,dstProject:F,dstFilePath:R,dstSymbolName:w.dstSymbolName??null,metaJson:w.metaJson??null,specifier:w.specifier??null,isExternal:0})}return z.replaceFileRelations(J,Q,N),N.length}import{isErr as cJ}from"@zipbul/result";var X1=/(?:^|\s)@([a-zA-Z][\w-]*\w|[a-zA-Z])\s*(.*)$/m;function aJ(_){let $=R_(_),J=[];for(let Q of $){J.push({name:Q.name,startLine:Q.span.start.line});for(let z of Q.members??[])J.push({name:`${Q.name}.${z.name}`,startLine:z.span.start.line})}return J.sort((Q,z)=>Q.startLine-z.startLine),J}function N0(_,$,J){let Q=0,z=_.length-1;while(Q<=z){let W=Q+z>>1;if(_[W].startLine<=$)Q=W+1;else z=W-1}if(Q<_.length){let W=_[Q];if(W.startLine-$<=J)return W.name}return null}function $0(_,$,J){let Q=O_(_,$),z=O_(_,J);return{start:Q,end:z}}function U1(_){let{comments:$,sourceText:J}=_;if(!$.length)return[];let Q=p_(J),z=aJ(_),W=[],Z=[...$].sort((X,M)=>X.start-M.start),Y=null;for(let X of Z)if(X.type==="Block"&&X.value.startsWith("*")){Y=null;let M=`/*${X.value}*/`,O=t_(M);if(cJ(O))continue;let L=O;if(!L.tags?.length)continue;let D=O_(Q,X.end),N=N0(z,D.line,3),w=J.slice(X.start,X.end);for(let R of L.tags){let G=[R.name,R.description].filter(Boolean).join(" "),F=`@${R.tag}`,u=w.indexOf(F),E;if(u>=0){let y=X.start+u,l=J.indexOf(`
4
+ `,y),i=l>=0?Math.min(l,X.end):X.end;E=$0(Q,y,i)}else E=$0(Q,X.start,X.end);W.push({tag:R.tag,value:G,source:"jsdoc",span:E,symbolName:N})}}else if(X.type==="Block"){Y=null;let M=X.value.split(`
5
+ `),O=0;for(let L of M){let D=L.replace(/^\s*\*?\s?/,""),N=X1.exec(D);if(N){let w=N[1],R=N[2]?.trim()??"",G=`@${w}`,F=L.indexOf(G),u=X.start+2+O+(F>=0?F:0),E=X.start+2+O+L.length,y=$0(Q,u,E),l=O_(Q,X.end),i=N0(z,l.line,3);W.push({tag:w,value:R,source:"block",span:y,symbolName:i})}O+=L.length+1}}else{let M=X.value,O=X1.exec(M),L=O_(Q,X.start),D=O_(Q,X.end);if(O){let N=O[1],w=O[2]?.trim()??"",R=`@${N}`,G=M.indexOf(R),F=X.start+2+(G>=0?G:0),u=$0(Q,F,X.end),E=N0(z,D.line,3),y={tag:N,value:w,source:"line",span:u,symbolName:E};W.push(y),Y={annotation:y,endLine:D.line}}else if(Y&&L.line===Y.endLine+1){let N=M.trim();if(N)Y.annotation.value+=" "+N,Y.annotation.span.end=O_(Q,X.end),Y.endLine=D.line}else Y=null}return W}function R0(_){let{parsed:$,project:J,filePath:Q,annotationRepo:z}=_,W=U1($);if(z.deleteFileAnnotations(J,Q),!W.length)return 0;let Z=new Date().toISOString(),Y=W.map((X)=>({project:J,filePath:Q,tag:X.tag,value:X.value,source:X.source,symbolName:X.symbolName,startLine:X.span.start.line,startColumn:X.span.start.column,endLine:X.span.end.line,endColumn:X.span.end.column,indexedAt:Z}));return z.insertBatch(J,Q,Y),W.length}function V1(_,$){let J=[],Q=[],z=[];for(let[O,L]of $)if(!_.has(O))J.push({name:L.name,filePath:L.filePath,kind:L.kind,fingerprint:L.fingerprint});for(let[O,L]of _)if(!$.has(O))Q.push({name:L.name,filePath:L.filePath,kind:L.kind,fingerprint:L.fingerprint});if(!J.length||!Q.length)return{renamed:z,added:J,removed:Q};let W=new Map,Z=new Map;for(let O of J){let L=W.get(O.filePath)??[];L.push(O),W.set(O.filePath,L)}for(let O of Q){let L=Z.get(O.filePath)??[];L.push(O),Z.set(O.filePath,L)}let Y=new Set,X=new Set;for(let[O,L]of W){let D=Z.get(O);if(!D)continue;for(let N of new Set(L.map((w)=>w.kind))){let w=L.filter((E)=>E.kind===N&&!Y.has(E)),R=D.filter((E)=>E.kind===N&&!X.has(E));if(!w.length||!R.length)continue;let G=(E,y)=>{return y.get(`${E.filePath}::${E.name}`)?.structuralFingerprint??null},F=(E,y)=>{return y.get(`${E.filePath}::${E.name}`)?.startLine??0},u=new Map;for(let E of R){let y=G(E,_);if(!y)continue;let l=u.get(y)??[];l.push(E),u.set(y,l)}for(let E of w){if(Y.has(E))continue;let y=G(E,$);if(!y)continue;let l=u.get(y);if(!l)continue;let i=l.filter((X_)=>!X.has(X_));if(!i.length)continue;let W_=i[0];if(i.length>1){let X_=F(E,$),K_=Math.abs(F(W_,_)-X_);for(let U_=1;U_<i.length;U_++){let Y_=Math.abs(F(i[U_],_)-X_);if(Y_<K_)K_=Y_,W_=i[U_]}}z.push({oldName:W_.name,newName:E.name,filePath:O,kind:N}),Y.add(E),X.add(W_)}}}let M=z.filter((O)=>!O.oldName.includes("."));for(let O of M){let L=`${O.oldName}.`,D=`${O.newName}.`,N=Q.filter((R)=>R.filePath===O.filePath&&R.name.startsWith(L)&&!X.has(R)),w=J.filter((R)=>R.filePath===O.filePath&&R.name.startsWith(D)&&!Y.has(R));for(let R of N){let G=R.name.slice(L.length),F=w.find((u)=>u.name.slice(D.length)===G);if(F)z.push({oldName:R.name,newName:F.name,filePath:O.filePath,kind:R.kind}),Y.add(F),X.add(R)}}return{renamed:z,added:J.filter((O)=>!Y.has(O)),removed:Q.filter((O)=>!X.has(O))}}var sJ=100,H1=50;class T0{opts;logger;callbacks=new Set;indexingLock=!1;pendingEvents=[];debounceTimer=null;currentIndexing=null;pendingFullIndex=!1;pendingFullIndexWaiters=[];tsconfigPathsRaw;boundariesRefresh=null;lastPruneAt=0;constructor(_){this.opts=_,this.logger=_.logger??console,this.tsconfigPathsRaw=n_(_.projectRoot)}get tsconfigPaths(){return this.tsconfigPathsRaw}fullIndex(){return this.startIndex(void 0,!0)}incrementalIndex(_){return this.startIndex(_,!1)}onIndexed(_){return this.callbacks.add(_),()=>this.callbacks.delete(_)}handleWatcherEvent(_){if(_.filePath.endsWith("tsconfig.json")){o_(this.opts.projectRoot),this.tsconfigPathsRaw=n_(this.opts.projectRoot),this.fullIndex().catch(($)=>{this.logger.error("[IndexCoordinator] fullIndex failed after tsconfig change:",$)});return}if(_.filePath.endsWith("package.json")){let $=this.opts.discoverProjectsFn??r_;this.boundariesRefresh=$(this.opts.projectRoot).then((J)=>{this.opts.boundaries=J,this.opts.onBoundariesChanged?.(J)}),this.fullIndex().catch((J)=>{this.logger.error("[IndexCoordinator] fullIndex failed after package.json change:",J)});return}if(this.pendingEvents.push(_),this.debounceTimer===null)this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.flushPending()},sJ)}async shutdown(){if(this.debounceTimer!==null)clearTimeout(this.debounceTimer),this.debounceTimer=null;if(this.currentIndexing)await this.currentIndexing}startIndex(_,$){if(this.indexingLock){if($)return this.pendingFullIndex=!0,new Promise((Q,z)=>{this.pendingFullIndexWaiters.push({resolve:Q,reject:z})});return this.currentIndexing}this.indexingLock=!0;let J=this.doIndex(_,$).then((Q)=>{return this.fireCallbacks(Q),Q}).finally(()=>{if(this.indexingLock=!1,this.currentIndexing=null,this.pendingFullIndex){this.pendingFullIndex=!1;let Q=this.pendingFullIndexWaiters.splice(0);this.startIndex(void 0,!0).then((z)=>{for(let W of Q)W.resolve(z)}).catch((z)=>{for(let W of Q)W.reject(z)})}else if(this.pendingEvents.length>0){let Q=this.pendingEvents.splice(0);this.startIndex(Q,!1).catch((z)=>this.logger.error("[IndexCoordinator] incremental drain error",z))}});return this.currentIndexing=J,J}async doIndex(_,$){let J=Date.now(),{fileRepo:Q,symbolRepo:z,relationRepo:W,dbConnection:Z}=this.opts;if(this.boundariesRefresh)await this.boundariesRefresh,this.boundariesRefresh=null;let Y,X;if(_!==void 0)Y=_.filter((U)=>U.eventType==="create"||U.eventType==="change").map((U)=>({filePath:U.filePath,contentHash:"",mtimeMs:0,size:0})),X=_.filter((U)=>U.eventType==="delete").map((U)=>U.filePath);else{let U=new Map;for(let K of this.opts.boundaries)for(let[B,A]of Q.getFilesMap(K.project))U.set(B,A);let H=await $1({projectRoot:this.opts.projectRoot,extensions:this.opts.extensions,ignorePatterns:this.opts.ignorePatterns,fileRepo:{getFilesMap:()=>U}});Y=H.changed,X=H.deleted}let M=await this.tsconfigPathsRaw??void 0,O=new Map;for(let U of X){let H=a(U,this.opts.boundaries),K=z.getFileSymbols(H,U);O.set(U,K)}let L=crypto.randomUUID(),D=new Map,N=new Map,w=(U)=>({name:U.name,filePath:U.filePath,kind:U.kind,fingerprint:U.fingerprint,structuralFingerprint:U.structuralFingerprint??null,startLine:U.startLine,isExported:U.isExported??0});if($)for(let U of this.opts.boundaries)for(let H of Q.getAllFiles(U.project))for(let K of z.getFileSymbols(U.project,H.filePath))D.set(`${K.filePath}::${K.name}`,w(K));else{for(let U of Y){let H=a(U.filePath,this.opts.boundaries);for(let K of z.getFileSymbols(H,U.filePath))D.set(`${K.filePath}::${K.name}`,w(K))}for(let[,U]of O)for(let H of U)D.set(`${H.filePath}::${H.name}`,w(H))}let R=(U)=>`${U.type}|${U.srcFilePath}|${U.dstFilePath??""}|${U.srcSymbolName??""}|${U.dstSymbolName??""}|${H_(U.metaJson??"")}`,G=new Map;if($)for(let U of this.opts.boundaries)for(let H of Q.getAllFiles(U.project))for(let K of W.getOutgoing(U.project,H.filePath))G.set(R(K),K);else{for(let U of Y){let H=a(U.filePath,this.opts.boundaries);for(let K of W.getOutgoing(H,U.filePath))G.set(R(K),K)}for(let U of X){let H=a(U,this.opts.boundaries);for(let K of W.getOutgoing(H,U))G.set(R(K),K)}}let{annotationRepo:F,changelogRepo:u}=this.opts,E=()=>{for(let U of X){let H=a(U,this.opts.boundaries);if(z.deleteFileSymbols(H,U),W.deleteFileRelations(H,U),W.deleteIncomingRelations(H,U),F)F.deleteFileAnnotations(H,U);Q.deleteFile(H,U)}},y=0,l=async()=>{let{projectRoot:U,boundaries:H}=this.opts,{parseCache:K}=this.opts,B=0,A=0,I=0,S=[],T=[];for(let g of Y)try{let b=g_(U,g.filePath),d=Bun.file(b),J_=await d.text(),V_=g.contentHash||H_(J_),B_=a(g.filePath,H);Q.upsertFile({project:B_,filePath:g.filePath,mtimeMs:d.lastModified,size:d.size,contentHash:V_,updatedAt:new Date().toISOString(),lineCount:J_.split(`
6
+ `).length});let D_=(this.opts.parseSourceFn??E_)(b,J_);if(O1(D_))throw D_.data;let m$=D_;T.push({filePath:g.filePath,text:J_,contentHash:V_,parsed:m$,project:B_})}catch(b){this.logger.error(`[IndexCoordinator] Failed to prepare ${g.filePath}:`,b),S.push(g.filePath)}let j=new Set;for(let g of H)for(let[b]of Q.getFilesMap(g.project))j.add(`${g.project}::${b}`);return Z.transaction(()=>{for(let g of T){if(C0({parsed:g.parsed,project:g.project,filePath:g.filePath,contentHash:g.contentHash,symbolRepo:z}),A+=q0({ast:g.parsed.program,project:g.project,filePath:g.filePath,relationRepo:W,projectRoot:U,tsconfigPaths:M,knownFiles:j,boundaries:H,module:g.parsed.module}),F)I+=R0({parsed:g.parsed,project:g.project,filePath:g.filePath,annotationRepo:F});K.set(g.filePath,g.parsed),B+=z.getFileSymbols(g.project,g.filePath).length}}),{symbols:B,relations:A,annotations:I,failedFiles:S}},i=0,W_=0,X_=[];if($){let{projectRoot:U,boundaries:H}=this.opts,{parseCache:K}=this.opts,B=[];for(let I=0;I<Y.length;I+=H1){let S=Y.slice(I,I+H1),T=await Promise.allSettled(S.map(async(j)=>{let g=g_(U,j.filePath),b=Bun.file(g),d=await b.text(),J_=j.contentHash||H_(d);return{filePath:j.filePath,text:d,contentHash:J_,mtimeMs:b.lastModified,size:b.size}}));for(let j=0;j<T.length;j++){let g=T[j];if(g.status==="fulfilled")B.push(g.value);else this.logger.error("[IndexCoordinator] Failed to pre-read file:",g.reason),X_.push(S[j].filePath)}}let A=[];Z.transaction(()=>{for(let T of B){let j=a(T.filePath,H);Q.deleteFile(j,T.filePath)}for(let T of X){let j=a(T,H);if(z.deleteFileSymbols(j,T),W.deleteFileRelations(j,T),W.deleteIncomingRelations(j,T),F)F.deleteFileAnnotations(j,T);Q.deleteFile(j,T)}for(let T of B){let j=a(T.filePath,H);Q.upsertFile({project:j,filePath:T.filePath,mtimeMs:T.mtimeMs,size:T.size,contentHash:T.contentHash,updatedAt:new Date().toISOString(),lineCount:T.text.split(`
7
+ `).length})}let I=new Set;for(let T of H)for(let[j]of Q.getFilesMap(T.project))I.add(`${T.project}::${j}`);let S=this.opts.parseSourceFn??E_;for(let T of B){let j=a(T.filePath,H),g=S(g_(U,T.filePath),T.text);if(O1(g))throw g.data;let b=g;if(A.push({filePath:T.filePath,parsed:b}),C0({parsed:b,project:j,filePath:T.filePath,contentHash:T.contentHash,symbolRepo:z}),F)y+=R0({parsed:b,project:j,filePath:T.filePath,annotationRepo:F});W_+=q0({ast:b.program,project:j,filePath:T.filePath,relationRepo:W,projectRoot:U,tsconfigPaths:M,knownFiles:I,boundaries:H,module:b.module}),i+=z.getFileSymbols(j,T.filePath).length}});for(let I of A)K.set(I.filePath,I.parsed)}else{E();let U=await l();i=U.symbols,W_=U.relations,y=U.annotations,X_=U.failedFiles}for(let U of Y){let H=a(U.filePath,this.opts.boundaries);for(let K of z.getFileSymbols(H,U.filePath))N.set(`${K.filePath}::${K.name}`,w(K))}let K_=new Map;for(let U of Y){let H=a(U.filePath,this.opts.boundaries);for(let K of W.getOutgoing(H,U.filePath))K_.set(R(K),K)}let U_=(U)=>({type:U.type,srcFilePath:U.srcFilePath,dstFilePath:U.dstFilePath,srcSymbolName:U.srcSymbolName,dstSymbolName:U.dstSymbolName,dstProject:U.dstProject,metaJson:U.metaJson}),Y_={added:[...K_.entries()].filter(([U])=>!G.has(U)).map(([,U])=>U_(U)),removed:[...G.entries()].filter(([U])=>!K_.has(U)).map(([,U])=>U_(U))},c={added:[],modified:[],removed:[]};for(let[U,H]of N){let K=D.get(U);if(!K)c.added.push({name:H.name,filePath:H.filePath,kind:H.kind,isExported:Boolean(H.isExported)});else{let B=K.fingerprint!==H.fingerprint,A=K.isExported!==H.isExported,I=K.structuralFingerprint!==null&&H.structuralFingerprint!==null&&K.structuralFingerprint!==H.structuralFingerprint;if(B||A||I)c.modified.push({name:H.name,filePath:H.filePath,kind:H.kind,isExported:Boolean(H.isExported)})}}for(let[U,H]of D)if(!N.has(U))c.removed.push({name:H.name,filePath:H.filePath,kind:H.kind,isExported:Boolean(H.isExported)});let s=V1(D,N),C_=new Set(s.renamed.map((U)=>`${U.filePath}::${U.oldName}`)),C=new Set(s.renamed.map((U)=>`${U.filePath}::${U.newName}`));c.added=c.added.filter((U)=>!C.has(`${U.filePath}::${U.name}`)),c.removed=c.removed.filter((U)=>!C_.has(`${U.filePath}::${U.name}`));let q=[];if(!$){for(let[H,K]of O)for(let B of K){if(!B.fingerprint)continue;let A=a(H,this.opts.boundaries),I=z.getByFingerprint(A,B.fingerprint);if(I.length===1){let S=I[0];W.retargetRelations({dstProject:A,oldFile:H,oldSymbol:B.name,newFile:S.filePath,newSymbol:S.name}),q.push({name:S.name,filePath:S.filePath,kind:S.kind,oldFilePath:H,isExported:S.isExported??0})}}let U=new Set(q.map((H)=>`${H.oldFilePath}::${H.name}`));for(let H of s.removed){if(U.has(`${H.filePath}::${H.name}`))continue;let B=D.get(`${H.filePath}::${H.name}`)?.fingerprint;if(!B)continue;let A=a(H.filePath,this.opts.boundaries),I=z.getByFingerprint(A,B);if(I.length===1){let S=I[0];if(S.filePath!==H.filePath||S.name!==H.name)W.retargetRelations({dstProject:A,oldFile:H.filePath,oldSymbol:H.name,newFile:S.filePath,newSymbol:S.name}),q.push({name:S.name,filePath:S.filePath,kind:S.kind,oldFilePath:H.filePath,isExported:S.isExported??0})}}}if(q.length){let U=new Set(q.map((K)=>`${K.filePath}::${K.name}`)),H=new Set(q.map((K)=>`${K.oldFilePath}::${K.name}`));c.added=c.added.filter((K)=>!U.has(`${K.filePath}::${K.name}`)),c.removed=c.removed.filter((K)=>!H.has(`${K.filePath}::${K.name}`))}if(u){let U=new Date().toISOString(),H=$?1:0,K=[];for(let B of c.added){let A=`${B.filePath}::${B.name}`,I=N.get(A),S=a(B.filePath,this.opts.boundaries);K.push({project:S,changeType:"added",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:null,fingerprint:I?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of c.modified){let A=N.get(`${B.filePath}::${B.name}`),I=a(B.filePath,this.opts.boundaries);K.push({project:I,changeType:"modified",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:null,fingerprint:A?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of c.removed){let A=`${B.filePath}::${B.name}`,I=D.get(A),S=a(B.filePath,this.opts.boundaries);K.push({project:S,changeType:"removed",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:null,fingerprint:I?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of s.renamed){let A=N.get(`${B.filePath}::${B.newName}`),I=a(B.filePath,this.opts.boundaries);K.push({project:I,changeType:"renamed",symbolName:B.newName,symbolKind:B.kind,filePath:B.filePath,oldName:B.oldName,oldFilePath:null,fingerprint:A?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}for(let B of q){let A=N.get(`${B.filePath}::${B.name}`),I=a(B.filePath,this.opts.boundaries);K.push({project:I,changeType:"moved",symbolName:B.name,symbolKind:B.kind,filePath:B.filePath,oldName:null,oldFilePath:B.oldFilePath,fingerprint:A?.fingerprint??null,changedAt:U,isFullIndex:H,indexRunId:L})}if(K.length)try{Z.transaction(()=>{u.insertBatch(K)})}catch(B){this.logger.error("[IndexCoordinator] changelog insert failed:",B)}if(Date.now()-this.lastPruneAt>3600000){this.lastPruneAt=Date.now();let B=new Date(Date.now()-2592000000).toISOString();try{for(let A of this.opts.boundaries)u.pruneOlderThan(A.project,B)}catch(A){this.logger.error("[IndexCoordinator] changelog pruning failed:",A)}}}return{indexedFiles:Y.length,removedFiles:X.length,totalSymbols:i,totalRelations:W_,totalAnnotations:y,durationMs:Date.now()-J,changedFiles:Y.map((U)=>U.filePath),deletedFiles:[...X],failedFiles:X_,changedSymbols:c,renamedSymbols:s.renamed.map((U)=>({oldName:U.oldName,newName:U.newName,filePath:U.filePath,kind:U.kind,isExported:Boolean(N.get(`${U.filePath}::${U.newName}`)?.isExported)})),movedSymbols:q.map((U)=>({name:U.name,oldFilePath:U.oldFilePath,newFilePath:U.filePath,kind:U.kind,isExported:Boolean(U.isExported)})),changedRelations:Y_}}fireCallbacks(_){for(let $ of this.callbacks)try{$(_)}catch(J){this.logger.error("[IndexCoordinator] onIndexed callback threw:",J)}}flushPending(){if(this.indexingLock)return;if(this.pendingEvents.length>0){let _=this.pendingEvents.splice(0);this.startIndex(_,!1).catch(($)=>this.logger.error("[IndexCoordinator] flushPending startIndex error:",$))}}}function rJ(_){try{return process.kill(_,0),!0}catch($){if(typeof $==="object"&&$&&"code"in $)return $.code!=="ESRCH";return!0}}function oJ(_){let $=new Date(_).getTime();return Number.isNaN($)?0:$}function K1(_,$,J={}){let Q=J.now??Date.now,z=J.isAlive??rJ,W=J.staleAfterSeconds??60,Z=J.instanceId;return _.immediateTransaction(()=>{let Y=_.selectOwner();if(!Y)return _.insertOwner($,Z),"owner";let X=Math.floor((Q()-oJ(Y.heartbeat_at))/1000),M=z(Y.pid);if(M&&Z&&Y.instance_id&&Y.instance_id!==Z&&Y.pid===$)return _.replaceOwner($,Z),"owner";if(M&&X<W)return"reader";return _.replaceOwner($,Z),"owner"})}function M1(_,$){_.deleteOwner($)}function L1(_,$){_.touchOwner($)}class l_{#_;#$=new Map;constructor(_){this.#_=Math.max(1,_)}get size(){return this.#$.size}has(_){return this.#$.has(_)}get(_){if(!this.#$.has(_))return;let $=this.#$.get(_);return this.#$.delete(_),this.#$.set(_,$),$}set(_,$){if(this.#$.has(_))this.#$.delete(_);if(this.#$.set(_,$),this.#$.size>this.#_){let J=this.#$.keys().next().value;if(J!==void 0)this.#$.delete(J)}}delete(_){return this.#$.delete(_)}clear(){this.#$.clear()}}class S0{lru;constructor(_=500){this.lru=new l_(_)}get(_){return this.lru.get(_)}set(_,$){this.lru.set(_,$)}invalidate(_){this.lru.delete(_)}invalidateAll(){this.lru.clear()}size(){return this.lru.size}}function F0(_){let{symbolRepo:$,project:J,query:Q}=_,z=Q.project??J,W={kind:Q.kind,filePath:Q.filePath,isExported:Q.isExported,project:z,limit:Q.limit,resolvedType:Q.resolvedType};if(Q.text)if(Q.exact)W.exactName=Q.text;else{let Y=k_(Q.text);if(Y)W.ftsQuery=Y}if(Q.decorator)W.decorator=Q.decorator;if(Q.regex)W.regex=Q.regex;return $.searchByQuery(W).map((Y)=>{let X=Y.name.indexOf(".");return{id:Y.id,filePath:Y.filePath,kind:Y.kind,name:Y.name,memberName:X>=0?Y.name.slice(X+1):null,span:{start:{line:Y.startLine,column:Y.startColumn},end:{line:Y.endLine,column:Y.endColumn}},isExported:Y.isExported===1,signature:Y.signature,fingerprint:Y.fingerprint,detail:Y.detailJson?(()=>{try{return JSON.parse(Y.detailJson)}catch{return{}}})():{}}})}function G0(_){let{relationRepo:$,project:J,query:Q}=_;if(Q.srcFilePath&&Q.srcFilePathPattern)throw new V("validation","srcFilePath and srcFilePathPattern are mutually exclusive");if(Q.dstFilePath&&Q.dstFilePathPattern)throw new V("validation","dstFilePath and dstFilePathPattern are mutually exclusive");let z=Q.project??J,W=Q.limit,Z=!!(Q.srcFilePathPattern||Q.dstFilePathPattern),Y=Z?void 0:W,M=$.searchRelations({srcFilePath:Q.srcFilePath,srcSymbolName:Q.srcSymbolName,dstFilePath:Q.dstFilePath,dstSymbolName:Q.dstSymbolName,dstProject:Q.dstProject,type:Q.type,project:z,specifier:Q.specifier,isExternal:Q.isExternal,limit:Y}).map((O)=>{let L;if(O.metaJson)try{L=JSON.parse(O.metaJson)}catch{}return{type:O.type,srcFilePath:O.srcFilePath,srcSymbolName:O.srcSymbolName,dstFilePath:O.dstFilePath,dstSymbolName:O.dstSymbolName,dstProject:O.dstProject,isExternal:O.isExternal===1,specifier:O.specifier,metaJson:O.metaJson??void 0,meta:L}});if(Q.srcFilePathPattern||Q.dstFilePathPattern){let O=Q.srcFilePathPattern?new Bun.Glob(Q.srcFilePathPattern):null,L=Q.dstFilePathPattern?new Bun.Glob(Q.dstFilePathPattern):null;M=M.filter((D)=>(!O||O.match(D.srcFilePath))&&(!L||D.dstFilePath===null||L.match(D.dstFilePath)))}if(Z&&W!==void 0&&M.length>W)M=M.slice(0,W);return M}import{findInFiles as tJ,Lang as eJ}from"@ast-grep/napi";function _Q(_){let $=new Set,J=/\${1,3}([A-Z_][A-Z_0-9]*)/g,Q;while((Q=J.exec(_))!==null)$.add(Q[0]);return[...$]}function $Q(_){return _.replace(/^\$+/,"")}function JQ(_,$){if($.length===0)return;let J={},Q=!1;for(let z of $){let W=$Q(z),Z=_.getMatch(W);if(Z){let X=Z.range();J[z]={text:Z.text(),startLine:X.start.line+1,endLine:X.end.line+1,startColumn:X.start.column,endColumn:X.end.column,startOffset:X.start.index,endOffset:X.end.index},Q=!0;continue}let Y=_.getMultipleMatches(W);if(Y.length>0){let X=Y[0].range(),M=Y[Y.length-1].range();J[z]={text:Y.map((O)=>O.text()).join(", "),startLine:X.start.line+1,endLine:M.end.line+1,startColumn:X.start.column,endColumn:M.end.column,startOffset:X.start.index,endOffset:M.end.index},Q=!0}}return Q?J:void 0}async function j0(_){if(_.filePaths.length===0)return[];let $=_Q(_.pattern),J=[];return await tJ(eJ.TypeScript,{paths:_.filePaths,matcher:{rule:{pattern:_.pattern}}},(Q,z)=>{if(Q){console.warn("[patternSearch] findInFiles callback error:",Q);return}for(let W of z){let Z=W.range(),Y={filePath:W.getRoot().filename(),startLine:Z.start.line+1,endLine:Z.end.line+1,startColumn:Z.start.column,endColumn:Z.end.column,startOffset:Z.start.index,endOffset:Z.end.index,matchedText:W.text()},X=JQ(W,$);if(X)Y.captures=X;J.push(Y)}}),J}import __ from"typescript";import{isErr as DQ}from"@zipbul/result";import w_ from"typescript";import QQ from"path";import{err as k0}from"@zipbul/result";function zQ(_){try{return d0("fs").readFileSync(_,"utf-8")}catch{return}}function WQ(_){try{return d0("fs").readFileSync(_,"utf-8")}catch{return}}class J0{#_;#$;#J=!1;__testing__;constructor(_,$){this.#_=_,this.#$=$,this.__testing__={host:$}}static create(_,$={}){let J=$.readConfigFile??zQ,Q=$.resolveNonTrackedFile??WQ,z=QQ.dirname(_),W=J(_);if(W===void 0)return k0(new V("semantic",`tsconfig not found: ${_}`));let Z=w_.parseJsonText(_,W),Y=Z.parseDiagnostics;if(Y&&Y.length>0){let L=Y.map((D)=>w_.flattenDiagnosticMessageText(D.messageText,`
8
+ `)).join("; ");return k0(new V("semantic",`tsconfig parse error: ${L}`))}let X=w_.parseJsonSourceFileConfigFileContent(Z,{useCaseSensitiveFileNames:!0,readDirectory:()=>[],fileExists:(L)=>J(L)!==void 0||Q(L)!==void 0,readFile:(L)=>J(L)??Q(L)},z);if(X.errors.length>0){let L=X.errors.filter((D)=>D.category===w_.DiagnosticCategory.Error&&D.code!==18003);if(L.length>0){let D=L.map((N)=>w_.flattenDiagnosticMessageText(N.messageText,`
9
+ `)).join("; ");return k0(new V("semantic",`tsconfig compile error: ${D}`))}}let M=new B1(X.fileNames,X.options,z,Q),O=w_.createLanguageService(M);return new J0(O,M)}get isDisposed(){return this.#J}getProgram(){this.#z();let _=this.#_.getProgram();if(!_)throw Error("TscProgram: LanguageService returned null Program");return _}getChecker(){return this.#z(),this.getProgram().getTypeChecker()}getLanguageService(){return this.#z(),this.#_}notifyFileChanged(_,$){if(this.#J)return;this.#$.updateFile(_,$)}removeFile(_){if(this.#J)return;this.#$.removeFile(_)}dispose(){if(this.#J)return;this.#J=!0,this.#_.dispose()}#z(){if(this.#J)throw Error("TscProgram is disposed")}}class B1{#_;#$;#J;#z;#W=new Map;#Y=new Map;#Q=new Map;constructor(_,$,J,Q){this.#_=new Set(_),this.#$=$,this.#J=J,this.#z=Q}updateFile(_,$){let J=this.#W.get(_);if(J){if(J.content===$)return;this.#Y.delete(`${_}:${J.version}`),J.version+=1,J.content=$}else this.#W.set(_,{version:1,content:$})}removeFile(_){let $=this.#W.get(_);if($)this.#Y.delete(`${_}:${$.version}`);this.#W.delete(_),this.#_.delete(_)}getScriptFileNames(){let _=[...this.#W.keys()];return[...[...this.#_].filter((J)=>!this.#W.has(J)),..._]}getScriptVersion(_){let $=this.#W.get(_);return $?String($.version):"0"}getScriptSnapshot(_){let $=this.#W.get(_);if($){let z=`${_}:${$.version}`,W=this.#Y.get(z);if(!W)W=w_.ScriptSnapshot.fromString($.content),this.#Y.set(z,W);return W}let J=this.#Q.get(_);if(J)return J;let Q=this.#z(_);if(Q!==void 0)return J=w_.ScriptSnapshot.fromString(Q),this.#Q.set(_,J),J;return}getCurrentDirectory(){return this.#J}getCompilationSettings(){return this.#$}getDefaultLibFileName(_){return w_.getDefaultLibFilePath(_)}fileExists(_){if(this.#W.has(_))return!0;return this.#z(_)!==void 0}readFile(_){let $=this.#W.get(_);if($)return $.content;return this.#z(_)}}import n from"typescript";import w1 from"typescript";function e(_,$){if($<0||$>=_.getEnd())return;let J,Q=(z)=>{if($<z.getStart(_,!1)||$>=z.getEnd())return;J=z,w1.forEachChild(z,Q)};return w1.forEachChild(_,Q),J}var Q0=8;function YQ(_){return!!(_.flags&n.TypeFlags.Object)&&!!(_.objectFlags&n.ObjectFlags.Reference)}function L_(_,$,J=0,Q){if(Q){let w=Q.get($);if(w)return w}let z=_.typeToString($),W=$.flags,Z=!!(W&n.TypeFlags.Union),Y=!!(W&n.TypeFlags.Intersection),X;if(J<Q0&&YQ($)){let w=_.getTypeArguments($);if(w.length>0)X=w}let M=!!(W&n.TypeFlags.TypeParameter)||X!==void 0&&X.length>0,O;if(Z&&J<Q0)O=$.types.map((w)=>L_(_,w,J+1,Q));else if(Y&&J<Q0)O=$.types.map((w)=>L_(_,w,J+1,Q));let L;if(X&&X.length>0)L=X.map((w)=>L_(_,w,J+1,Q));let D;if(J<Q0&&!!(W&n.TypeFlags.Object)&&!Z&&!Y){let w=_.getPropertiesOfType($);if(w.length>0&&w.length<=50){let R=$.symbol?.declarations?.[0];D=[];for(let G of w){let F=G.declarations?.[0]??R;if(!F)continue;try{let u=_.getTypeOfSymbolAtLocation(G,F);D.push({name:G.getName(),type:L_(_,u,J+1,Q)})}catch{}}if(D.length===0)D=void 0}}let N={text:z,flags:W,isUnion:Z,isIntersection:Y,isGeneric:M,members:O,typeArguments:L,properties:D};if(Q)Q.set($,N);return N}function ZQ(_){return n.isFunctionDeclaration(_)||n.isVariableDeclaration(_)||n.isClassDeclaration(_)||n.isInterfaceDeclaration(_)||n.isTypeAliasDeclaration(_)||n.isEnumDeclaration(_)||n.isMethodDeclaration(_)||n.isPropertyDeclaration(_)||n.isPropertySignature(_)||n.isMethodSignature(_)}var g0="/__gildash_type_probe__.ts";class E0{program;#_=null;constructor(_){this.program=_}#$(_){if(this.#_===_)return;this.program.notifyFileChanged(g0,`declare const __gildash_probe__: ${_};`),this.#_=_}#J(_,$){let J=_.getSourceFile(g0);if(!J)return null;let Q=J.statements[0];if(!Q||!n.isVariableStatement(Q))return null;let z=Q.declarationList.declarations[0];if(!z)return null;return $.getTypeAtLocation(z.name)}clearProbe(){if(this.#_!==null)this.program.removeFile(g0),this.#_=null}collectAt(_,$){let J=this.program.getProgram(),Q=J.getTypeChecker();if($<0)return null;let z=J.getSourceFile(_);if(!z)return null;if($>=z.getEnd())return null;let W=e(z,$);if(!W)return null;if(!n.isIdentifier(W)&&!n.isTypeNode(W))return null;try{let Z=Q.getTypeAtLocation(W);return L_(Q,Z,0,new Map)}catch{return null}}isAssignableTo(_,$,J,Q){let z=this.program.getProgram(),W=z.getTypeChecker(),Z=z.getSourceFile(_);if(!Z)return null;let Y=e(Z,$);if(!Y||!n.isIdentifier(Y))return null;let X=z.getSourceFile(J);if(!X)return null;let M=e(X,Q);if(!M||!n.isIdentifier(M))return null;try{let O=W.getTypeAtLocation(Y),L=W.getTypeAtLocation(M);return W.isTypeAssignableTo(O,L)}catch{return null}}isAssignableToType(_,$,J,Q){this.#$(J);let z=this.program.getProgram(),W=z.getTypeChecker(),Z=z.getSourceFile(_);if(!Z)return null;let Y=e(Z,$);if(!Y||!n.isIdentifier(Y)&&!n.isTypeNode(Y))return null;try{let X=this.#J(z,W);if(!X)return null;let M=W.getTypeAtLocation(Y);if(Q?.anyConstituent&&M.isUnion())return M.types.some((O)=>W.isTypeAssignableTo(O,X));return W.isTypeAssignableTo(M,X)}catch{return null}}isAssignableToTypeAtPositions(_,$,J,Q){let z=new Map;if($.length===0)return z;this.#$(J);let W=this.program.getProgram(),Z=W.getTypeChecker(),Y=W.getSourceFile(_);if(!Y)return z;try{let X=this.#J(W,Z);if(!X)return z;let M=Y.getEnd();for(let O of $){if(O<0||O>=M)continue;let L=e(Y,O);if(!L||!n.isIdentifier(L)&&!n.isTypeNode(L))continue;try{let D=Z.getTypeAtLocation(L);if(Q?.anyConstituent&&D.isUnion())z.set(O,D.types.some((N)=>Z.isTypeAssignableTo(N,X)));else z.set(O,Z.isTypeAssignableTo(D,X))}catch{}}}catch{}return z}collectAtPositions(_,$){let J=new Map;if($.length===0)return J;let Q=this.program.getProgram(),z=Q.getTypeChecker(),W=Q.getSourceFile(_);if(!W)return J;let Z=W.getEnd(),Y=new Map;for(let X of $){if(X<0||X>=Z)continue;let M=e(W,X);if(!M)continue;if(!n.isIdentifier(M)&&!n.isTypeNode(M))continue;try{let O=z.getTypeAtLocation(M);J.set(X,L_(z,O,0,Y))}catch{}}return J}collectFile(_){let $=new Map,J=this.program.getProgram(),Q=J.getTypeChecker(),z=J.getSourceFile(_);if(!z)return $;let W=new Map;function Z(Y){if(ZQ(Y)&&Y.name&&n.isIdentifier(Y.name)){let X=Y.name;try{let M=Q.getTypeAtLocation(X),O=X.getStart(z);$.set(O,L_(Q,M,0,W))}catch{}}n.forEachChild(Y,Z)}return Z(z),$}}import I_ from"typescript";var XQ=1000,UQ=1;function VQ(_){let $=_.declarations?.[0],J=$?.getSourceFile(),Q=$?I_.getNameOfDeclaration($):void 0;return{name:_.getName(),filePath:J?.fileName??"",position:Q?.getStart(J,!1)??$?.getStart(J,!1)??0}}function z0(_,$=0,J){let Q=_.declarations?.[0],z=Q?.getSourceFile(),W=Q?I_.getNameOfDeclaration(Q):void 0,Z=z?.fileName??"",Y=W?.getStart(z,!1)??Q?.getStart(z,!1)??0,X={name:_.getName(),filePath:Z,position:Y},M=_;if(M.parent)X.parent=VQ(M.parent);let O=J&&!!(_.flags&I_.SymbolFlags.Alias)?J.getAliasedSymbol(_):_;if($<UQ){let L=O.flags,D=!!(L&I_.SymbolFlags.Enum),N=!!(L&(I_.SymbolFlags.NamespaceModule|I_.SymbolFlags.ValueModule)),w=!!(L&(I_.SymbolFlags.Class|I_.SymbolFlags.Interface));if(D&&O.exports&&O.exports.size>0){let R=[];O.exports.forEach((G)=>{R.push(z0(G,$+1,J))}),X.members=R}else if(w&&O.members&&O.members.size>0){let R=[];O.members.forEach((G)=>{R.push(z0(G,$+1,J))}),X.members=R}if(N&&O.exports&&O.exports.size>0){let R=[];O.exports.forEach((G)=>{R.push(z0(G,$+1,J))}),X.exports=R}}return X}class v0{#_;#$;constructor(_,$=XQ){this.#_=_,this.#$=new l_($)}get(_,$){if(this.#_.isDisposed)return null;let J=`${_}:${$}`,Q=this.#$.get(J);if(Q!==void 0)return Q;let z=this.#_.getProgram(),W=z.getSourceFile(_);if(!W)return null;let Z=e(W,$);if(!Z||!I_.isIdentifier(Z))return null;let Y=z.getTypeChecker(),X=Y.getSymbolAtLocation(Z);if(!X)return null;let M=z0(X,0,Y);return this.#$.set(J,M),M}clear(){this.#$.clear()}}import p from"typescript";import k from"typescript";function u0(_){if(_.getSourceFile().isDeclarationFile)return!0;for(let $=_;$;$=$.parent)if(OQ($))return!0;return!1}function OQ(_){if(!k.canHaveModifiers(_))return!1;return k.getModifiers(_)?.some((J)=>J.kind===k.SyntaxKind.DeclareKeyword)??!1}function b0(_){let $=(Q,z)=>({kind:Q,pos:z.getStart(),end:z.getEnd()}),J=_.parent;while(J){if(k.isSourceFile(J)||k.isModuleDeclaration(J))return $("module",J);if(k.isFunctionLike(J))return $("function",J);if(k.isClassStaticBlockDeclaration(J))return $("function",J);if(k.isPropertyDeclaration(J))return $("function",J);if(k.isBlock(J)){let Q=J.parent;if(Q&&(k.isFunctionLike(Q)||k.isClassStaticBlockDeclaration(Q)))return $("function",Q);return $("block",J)}if(k.isForStatement(J)||k.isForInStatement(J)||k.isForOfStatement(J)||k.isCatchClause(J)||k.isCaseBlock(J)||k.isWithStatement(J))return $("block",J);J=J.parent}return $("module",_.getSourceFile())}function P0(_){let $=_.parent;if(!$)return;if(k.isVariableDeclaration($)&&$.name===_)return"declaration";if(k.isParameter($)&&$.name===_)return"declaration";if(k.isBindingElement($)&&$.name===_)return"declaration";if((k.isForOfStatement($)||k.isForInStatement($))&&$.initializer===_)return"assignment";if((k.isPrefixUnaryExpression($)||k.isPostfixUnaryExpression($))&&$.operand===_&&($.operator===k.SyntaxKind.PlusPlusToken||$.operator===k.SyntaxKind.MinusMinusToken))return"update";let J=_;while(J.parent&&k.isParenthesizedExpression(J.parent))J=J.parent;let Q=J.parent;if(Q&&k.isBinaryExpression(Q)&&Q.left===J)return HQ(Q.operatorToken.kind);if(KQ(_))return"assignment";return}function HQ(_){switch(_){case k.SyntaxKind.EqualsToken:return"assignment";case k.SyntaxKind.PlusEqualsToken:case k.SyntaxKind.MinusEqualsToken:case k.SyntaxKind.AsteriskEqualsToken:case k.SyntaxKind.AsteriskAsteriskEqualsToken:case k.SyntaxKind.SlashEqualsToken:case k.SyntaxKind.PercentEqualsToken:case k.SyntaxKind.LessThanLessThanEqualsToken:case k.SyntaxKind.GreaterThanGreaterThanEqualsToken:case k.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:case k.SyntaxKind.AmpersandEqualsToken:case k.SyntaxKind.BarEqualsToken:case k.SyntaxKind.CaretEqualsToken:return"compound-assignment";case k.SyntaxKind.AmpersandAmpersandEqualsToken:case k.SyntaxKind.BarBarEqualsToken:case k.SyntaxKind.QuestionQuestionEqualsToken:return"logical-assignment";default:return}}function KQ(_){let $=_.parent;if(!$)return!1;if(!(k.isShorthandPropertyAssignment($)&&$.name===_||k.isPropertyAssignment($)&&$.initializer===_||k.isArrayLiteralExpression($)||k.isSpreadAssignment($)&&$.expression===_||k.isSpreadElement($)&&$.expression===_))return!1;let Q=$;while(Q.parent){let z=Q.parent;if(k.isBinaryExpression(z)&&z.left===Q&&z.operatorToken.kind===k.SyntaxKind.EqualsToken)return!0;if(k.isObjectLiteralExpression(z)||k.isArrayLiteralExpression(z)||k.isPropertyAssignment(z)||k.isShorthandPropertyAssignment(z)||k.isSpreadAssignment(z)||k.isSpreadElement(z)){Q=z;continue}return!1}return!1}class f0{#_;constructor(_){this.#_=_}findAt(_,$){let J=this.#$(_,$);if(!J)return[];let Q=this.#_.getProgram(),z=[];for(let W of J)for(let Z of W.references){let Y=Q.getSourceFile(Z.fileName);if(!Y)continue;z.push(I1(Z,Y))}return z}findEnrichedAt(_,$){let J=this.#$(_,$);if(!J)return[];let Q=this.#_.getProgram(),z=Q.getTypeChecker(),W=[];for(let Z of J){let Y=this.#J(Z,Q,z);for(let X of Z.references){let M=Q.getSourceFile(X.fileName);if(!M)continue;let O=e(M,X.textSpan.start),L=O&&p.isIdentifier(O)?O:void 0;W.push({...I1(X,M),writeKind:L?P0(L):void 0,isAmbient:Y,enclosingScope:b0(L??M)})}}return W}findFileBindings(_){if(this.#_.isDisposed)return[];let $=this.#_.getProgram(),J=$.getSourceFile(_);if(!J)return[];let Q=$.getTypeChecker(),z=new Map,W=(Y)=>{if(p.isIdentifier(Y)&&!MQ(Y)){let X=BQ(Y,Q);if(X){let M=z.get(X);if(M)M.push(Y);else z.set(X,[Y])}}p.forEachChild(Y,W)};p.forEachChild(J,W);let Z=[];for(let[Y,X]of z){let M=Y.declarations;if(!M||M.length===0)continue;if(M.every(LQ))continue;let O=M.every(u0),L=new Set(M.map((G)=>p.getNameOfDeclaration(G)).filter((G)=>G!==void 0)),D=M[0],N=p.getNameOfDeclaration(D)??D,w=D.getSourceFile(),R=X.map((G)=>{let F=G.getStart(J),{line:u,character:E}=J.getLineAndCharacterOfPosition(F),y=P0(G);return{filePath:J.fileName,position:F,line:u+1,column:E,isDefinition:L.has(G),isWrite:y!==void 0,writeKind:y,isAmbient:O,enclosingScope:b0(G)}});Z.push({declaration:{filePath:w.fileName,position:N.getStart(w),name:Y.getName(),isAmbient:O},references:R})}return Z}#$(_,$){if(this.#_.isDisposed)return null;let Q=this.#_.getProgram().getSourceFile(_);if(!Q)return null;let z=e(Q,$);if(!z||!p.isIdentifier(z))return null;let W=this.#_.getLanguageService().findReferences(_,$);if(!W||W.length===0)return null;return W}#J(_,$,J){let Q=_.definition,z=$.getSourceFile(Q.fileName);if(!z)return!1;let W=e(z,Q.textSpan.start);if(!W)return!1;let Y=J.getSymbolAtLocation(W)?.declarations;if(!Y||Y.length===0)return!1;return Y.every(u0)}}function MQ(_){let $=_.parent;return p.isPropertyAccessExpression($)&&$.name===_||p.isQualifiedName($)&&$.right===_||p.isPropertyAssignment($)&&$.name===_||p.isBindingElement($)&&$.propertyName===_||p.isJsxAttribute($)&&$.name===_||p.isImportSpecifier($)&&$.propertyName===_||p.isModuleDeclaration($)&&$.name===_&&($.flags&p.NodeFlags.GlobalAugmentation)!==0}function LQ(_){return p.isPropertyDeclaration(_)||p.isPropertySignature(_)||p.isMethodDeclaration(_)||p.isMethodSignature(_)||p.isGetAccessorDeclaration(_)||p.isSetAccessorDeclaration(_)||p.isEnumMember(_)||p.isParameter(_)&&p.isIndexSignatureDeclaration(_.parent)}function BQ(_,$){let J=_.parent;if(p.isShorthandPropertyAssignment(J))return $.getShorthandAssignmentValueSymbol(J);if(p.isExportSpecifier(J)){let Q=J.parent.parent;if(p.isExportDeclaration(Q)&&Q.moduleSpecifier)return;return(J.propertyName??J.name)===_?$.getExportSpecifierLocalTargetSymbol(J):void 0}return $.getSymbolAtLocation(_)}function I1(_,$){let{line:J,character:Q}=$.getLineAndCharacterOfPosition(_.textSpan.start);return{filePath:_.fileName,position:_.textSpan.start,line:J+1,column:Q,isDefinition:_.isDefinition??!1,isWrite:_.isWriteAccess??!1}}import h from"typescript";function wQ(_,$){let J=e(_,$);if(!J)return;if(C1(J))return J;let Q=J.parent;for(let z=0;z<5&&Q;z++){if(C1(Q))return Q;Q=Q.parent}return J}function C1(_){return h.isClassDeclaration(_)||h.isClassExpression(_)||h.isFunctionDeclaration(_)||h.isFunctionExpression(_)||h.isArrowFunction(_)||h.isVariableDeclaration(_)||h.isObjectLiteralExpression(_)}function D1(_){if(h.isClassDeclaration(_)||h.isClassExpression(_))return"class";if(h.isFunctionDeclaration(_)||h.isFunctionExpression(_)||h.isArrowFunction(_))return"function";if(h.isObjectLiteralExpression(_))return"object";if(h.isVariableDeclaration(_)&&_.initializer)return D1(_.initializer);return"class"}function IQ(_,$){if(h.isClassDeclaration(_)||h.isFunctionDeclaration(_))return _.name?.getText($)??"";if(h.isClassExpression(_))return _.name?.getText($)??"";if(h.isVariableDeclaration(_)&&h.isIdentifier(_.name))return _.name.getText($);if(h.isFunctionExpression(_))return _.name?.getText($)??"";if(h.isArrowFunction(_)&&_.parent&&h.isVariableDeclaration(_.parent)){if(h.isIdentifier(_.parent.name))return _.parent.name.getText($)}if(h.isObjectLiteralExpression(_)&&_.parent&&h.isVariableDeclaration(_.parent)){if(h.isIdentifier(_.parent.name))return _.parent.name.getText($)}return""}function CQ(_){if(!h.isClassDeclaration(_)&&!h.isClassExpression(_))return!1;let $=_.heritageClauses;if(!$)return!1;return $.some((J)=>J.token===h.SyntaxKind.ImplementsKeyword)}class y0{#_;constructor(_){this.#_=_}findAt(_,$){if(this.#_.isDisposed)return[];let J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return[];let z=e(Q,$);if(!z||!h.isIdentifier(z))return[];let Z=this.#_.getLanguageService().getImplementationAtPosition(_,$);if(!Z||Z.length===0)return[];let Y=[];for(let X of Z){if(X.kind===h.ScriptElementKind.interfaceElement||X.kind===h.ScriptElementKind.typeElement)continue;let M=J.getSourceFile(X.fileName);if(!M)continue;let O=wQ(M,X.textSpan.start);if(!O)continue;let L=D1(O),D=IQ(O,M),N=CQ(O);Y.push({filePath:X.fileName,symbolName:D,position:X.textSpan.start,kind:L,isExplicit:N})}return Y}}function AQ(_){if(__.isFunctionDeclaration(_))return"function";if(__.isClassDeclaration(_))return"class";if(__.isInterfaceDeclaration(_))return"interface";if(__.isTypeAliasDeclaration(_))return"type";if(__.isEnumDeclaration(_))return"enum";if(__.isVariableDeclaration(_))return"const";if(__.isVariableStatement(_))return"const";return"unknown"}function A1(_){if(_>=97&&_<=122)return!0;if(_>=65&&_<=90)return!0;if(_>=48&&_<=57)return!0;if(_===95||_===36)return!0;return!1}class W0{#_;#$;#J;#z;#W;#Y=!1;constructor(_,$,J,Q,z){this.#_=_,this.#$=$,this.#J=J,this.#z=Q,this.#W=z}static create(_,$={}){let J=J0.create(_,{readConfigFile:$.readConfigFile,resolveNonTrackedFile:$.resolveNonTrackedFile});if(DQ(J))return J;let Q=J,z=$.typeCollector??new E0(Q),W=$.symbolGraph??new v0(Q),Z=$.referenceResolver??new f0(Q),Y=$.implementationFinder??new y0(Q);return new W0(Q,z,W,Z,Y)}get isDisposed(){return this.#Y}collectTypeAt(_,$){return this.#Q(),this.#$.collectAt(_,$)}collectFileTypes(_){return this.#Q(),this.#$.collectFile(_)}collectTypesAtPositions(_,$){return this.#Q(),this.#$.collectAtPositions(_,$)}findReferences(_,$){return this.#Q(),this.#z.findAt(_,$)}findEnrichedReferences(_,$){return this.#Q(),this.#z.findEnrichedAt(_,$)}getFileBindings(_){return this.#Q(),this.#z.findFileBindings(_)}getFileBindingsBatch(_){this.#Q();for(let J of _)this.notifyFileChanged(J.filePath,J.content);let $=new Map;for(let J of _)$.set(J.filePath,this.#z.findFileBindings(J.filePath));return $}findImplementations(_,$){return this.#Q(),this.#W.findAt(_,$)}isTypeAssignableTo(_,$,J,Q){return this.#Q(),this.#$.isAssignableTo(_,$,J,Q)}isTypeAssignableToType(_,$,J,Q){return this.#Q(),this.#$.isAssignableToType(_,$,J,Q)}isTypeAssignableToTypeAtPositions(_,$,J,Q){return this.#Q(),this.#$.isAssignableToTypeAtPositions(_,$,J,Q)}getSymbolNode(_,$){return this.#Q(),this.#J.get(_,$)}getBaseTypes(_,$){this.#Q();let J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return null;let z=e(Q,$);if(!z)return null;let W=J.getTypeChecker(),Z=W.getTypeAtLocation(z);if(!(Z.flags&__.TypeFlags.Object)||!(Z.objectFlags&__.ObjectFlags.ClassOrInterface))return null;let Y=W.getBaseTypes(Z);if(!Y||Y.length===0)return[];let X=new Map;return Y.map((M)=>L_(W,M,0,X))}getModuleInterface(_){this.#Q();let $=[],J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return{filePath:_,exports:$};let z=J.getTypeChecker(),W=z.getSymbolAtLocation(Q);if(W){let Z=z.getExportsOfModule(W),Y=new Map;for(let X of Z){let M=X.getName(),O=X.declarations?.[0],L="unknown";if(O){if(L=AQ(O),L==="unknown"&&__.isExportAssignment(O))L="const"}let D=null;try{let N=z.getTypeOfSymbolAtLocation(X,O??Q);D=L_(z,N,0,Y)}catch{}$.push({name:M,kind:L,resolvedType:D})}}return{filePath:_,exports:$}}notifyFileChanged(_,$){if(this.#Y)return;this.#_.notifyFileChanged(_,$),this.#J.clear()}notifyFileDeleted(_){if(this.#Y)return;this.#_.removeFile(_),this.#J.clear()}lineColumnToPosition(_,$,J){this.#Q();let Q=this.#_.getProgram().getSourceFile(_);if(!Q)return null;try{return __.getPositionOfLineAndCharacter(Q,$-1,J)}catch{return null}}findNamePosition(_,$,J){this.#Q();let Q=this.#_.getProgram().getSourceFile(_);if(!Q)return null;let z=Q.getFullText(),W=$;while(W<z.length){let Z=z.indexOf(J,W);if(Z<0)return null;let Y=Z>0?z.charCodeAt(Z-1):32,X=Z+J.length<z.length?z.charCodeAt(Z+J.length):32;if(!A1(Y)&&!A1(X))return Z;W=Z+1}return null}getDiagnostics(_,$){this.#Q();let J=this.#_.getProgram(),Q=J.getSourceFile(_);if(!Q)return[];let z={[__.DiagnosticCategory.Error]:"error",[__.DiagnosticCategory.Warning]:"warning",[__.DiagnosticCategory.Suggestion]:"suggestion",[__.DiagnosticCategory.Message]:"suggestion"};return(($?.preEmit)?__.getPreEmitDiagnostics(J,Q):J.getSemanticDiagnostics(Q)).map((Z)=>{let Y=1,X=0;if(Z.file&&Z.start!==void 0){let M=__.getLineAndCharacterOfPosition(Z.file,Z.start);Y=M.line+1,X=M.character}return{filePath:Z.file?.fileName??_,line:Y,column:X,message:__.flattenDiagnosticMessageText(Z.messageText,`
10
+ `),code:Z.code,category:z[Z.category]??"error"}})}dispose(){if(this.#Y)return;this.#Y=!0,this.#$.clearProbe(),this.#_.dispose(),this.#J.clear()}#Q(){if(this.#Y)throw Error("SemanticLayer is disposed")}}import{eq as F_,and as q1,sql as qQ}from"drizzle-orm";var N1=80;class x0{db;constructor(_){this.db=_}insertBatch(_,$,J){if(!J.length)return;let Q=J.map((z)=>({project:_,filePath:$,tag:z.tag,value:z.value,source:z.source,symbolName:z.symbolName,startLine:z.startLine,startColumn:z.startColumn,endLine:z.endLine,endColumn:z.endColumn,indexedAt:z.indexedAt}));for(let z=0;z<Q.length;z+=N1)this.db.drizzleDb.insert(Z_).values(Q.slice(z,z+N1)).run()}deleteFileAnnotations(_,$){this.db.drizzleDb.delete(Z_).where(q1(F_(Z_.project,_),F_(Z_.filePath,$))).run()}search(_){let $=this.db.drizzleDb.select().from(Z_).where(q1(_.project?F_(Z_.project,_.project):void 0,_.tag?F_(Z_.tag,_.tag):void 0,_.filePath?F_(Z_.filePath,_.filePath):void 0,_.symbolName?F_(Z_.symbolName,_.symbolName):void 0,_.source?F_(Z_.source,_.source):void 0,_.ftsQuery?qQ`${Z_.id} IN (SELECT rowid FROM annotations_fts WHERE annotations_fts MATCH ${_.ftsQuery})`:void 0));return(_.limit!==void 0?$.limit(_.limit):$).all()}}import{eq as b_,and as R1,sql as i_,gt as NQ,gte as RQ}from"drizzle-orm";var T1=80;class h0{db;constructor(_){this.db=_}insertBatch(_){if(!_.length)return;let $=_.map((J)=>({project:J.project,changeType:J.changeType,symbolName:J.symbolName,symbolKind:J.symbolKind,filePath:J.filePath,oldName:J.oldName,oldFilePath:J.oldFilePath,fingerprint:J.fingerprint,changedAt:J.changedAt,isFullIndex:J.isFullIndex,indexRunId:J.indexRunId}));for(let J=0;J<$.length;J+=T1)this.db.drizzleDb.insert($_).values($.slice(J,J+T1)).run()}getSince(_){return this.db.drizzleDb.select().from($_).where(R1(b_($_.project,_.project),RQ($_.changedAt,_.since),_.symbolName?b_($_.symbolName,_.symbolName):void 0,_.changeTypes?.length?i_`${$_.changeType} IN (${i_.join(_.changeTypes.map(($)=>i_`${$}`),i_`, `)})`:void 0,_.filePath?b_($_.filePath,_.filePath):void 0,_.includeFullIndex?void 0:b_($_.isFullIndex,0),_.indexRunId?b_($_.indexRunId,_.indexRunId):void 0,_.afterId?NQ($_.id,_.afterId):void 0)).orderBy($_.id).limit(_.limit).all()}pruneOlderThan(_,$){return this.db.drizzleDb.delete($_).where(R1(b_($_.project,_),i_`${$_.changedAt} < ${$}`)).run().changes}}function S1(_){let{annotationRepo:$,project:J,query:Q}=_,z=Q.project??J,W;if(Q.text){let Y=k_(Q.text);if(Y)W=Y}return $.search({project:z,tag:Q.tag,filePath:Q.filePath,symbolName:Q.symbolName,source:Q.source,ftsQuery:W,limit:Q.limit}).map((Y)=>({tag:Y.tag,value:Y.value,source:Y.source,filePath:Y.filePath,symbolName:Y.symbolName,span:{start:{line:Y.startLine,column:Y.startColumn},end:{line:Y.endLine,column:Y.endColumn}}}))}class Y0{options;adjacencyList=new Map;reverseAdjacencyList=new Map;constructor(_){this.options=_}build(){this.adjacencyList=new Map,this.reverseAdjacencyList=new Map;let $=[this.options.project,...this.options.additionalProjects??[]].flatMap((J)=>[...this.options.relationRepo.getByType(J,"imports"),...this.options.relationRepo.getByType(J,"type-references"),...this.options.relationRepo.getByType(J,"re-exports")]);for(let J of $){let{srcFilePath:Q,dstFilePath:z}=J;if(z===null)continue;if(!this.adjacencyList.has(Q))this.adjacencyList.set(Q,new Set);if(this.adjacencyList.get(Q).add(z),!this.adjacencyList.has(z))this.adjacencyList.set(z,new Set);if(!this.reverseAdjacencyList.has(z))this.reverseAdjacencyList.set(z,new Set);this.reverseAdjacencyList.get(z).add(Q)}}patchFiles(_,$,J){let Q=new Set([..._,...$]);for(let z of Q){let W=this.adjacencyList.get(z);if(W){for(let Y of W)this.reverseAdjacencyList.get(Y)?.delete(z);W.clear()}let Z=this.reverseAdjacencyList.get(z);if(Z){for(let Y of Z)this.adjacencyList.get(Y)?.delete(z);Z.clear()}}for(let z of $)this.adjacencyList.delete(z),this.reverseAdjacencyList.delete(z);for(let z of _){let W=J(z);for(let Z of W){if(!this.adjacencyList.has(Z.srcFilePath))this.adjacencyList.set(Z.srcFilePath,new Set);if(this.adjacencyList.get(Z.srcFilePath).add(Z.dstFilePath),!this.adjacencyList.has(Z.dstFilePath))this.adjacencyList.set(Z.dstFilePath,new Set);if(!this.reverseAdjacencyList.has(Z.dstFilePath))this.reverseAdjacencyList.set(Z.dstFilePath,new Set);this.reverseAdjacencyList.get(Z.dstFilePath).add(Z.srcFilePath)}}}getDependencies(_){return Array.from(this.adjacencyList.get(_)??[])}getDependents(_){return Array.from(this.reverseAdjacencyList.get(_)??[])}getTransitiveDependents(_){let $=new Set,J=[_];while(J.length>0){let Q=J.shift();for(let z of this.reverseAdjacencyList.get(Q)??[])if(!$.has(z))$.add(z),J.push(z)}return Array.from($)}hasCycle(){let _=new Set,$=new Set;for(let J of this.adjacencyList.keys()){if(_.has(J))continue;let Q=[{node:J,entered:!1}];while(Q.length>0){let z=Q.pop();if(z.entered){$.delete(z.node);continue}if($.has(z.node))return!0;if(_.has(z.node))continue;_.add(z.node),$.add(z.node),Q.push({node:z.node,entered:!0});for(let W of this.adjacencyList.get(z.node)??[]){if($.has(W))return!0;if(!_.has(W))Q.push({node:W,entered:!1})}}}return!1}getAffectedByChange(_){let $=new Set;for(let J of _)for(let Q of this.getTransitiveDependents(J))$.add(Q);return Array.from($)}getAdjacencyList(){let _=new Map;for(let[$,J]of this.adjacencyList)_.set($,Array.from(J));return _}getTransitiveDependencies(_){let $=new Set,J=[_];while(J.length>0){let Q=J.shift();for(let z of this.adjacencyList.get(Q)??[])if(!$.has(z))$.add(z),J.push(z)}return Array.from($)}getCyclePaths(_){let $=_?.maxCycles??1/0;if($<=0)return[];let J=new Map;for(let[Q,z]of this.adjacencyList)J.set(Q,Array.from(z));return jQ(J,$)}}var TQ=(_,$)=>_.localeCompare($);function SQ(_){let $=_.length>1&&_[0]===_[_.length-1]?_.slice(0,-1):[..._];if($.length===0)return[];let J=$;for(let Q=1;Q<$.length;Q++){let z=$.slice(Q).concat($.slice(0,Q));if(z.join("::")<J.join("::"))J=z}return[...J]}function m0(_,$,J){let Q=SQ(J);if(Q.length===0)return!1;let z=Q.join("->");if(_.has(z))return!1;return _.add(z),$.push(Q),!0}function FQ(_){let $=0,J=[],Q=new Set,z=new Map,W=new Map,Z=[],Y=(X)=>{z.set(X,$),W.set(X,$),$+=1,J.push(X),Q.add(X);for(let M of _.get(X)??[])if(!z.has(M))Y(M),W.set(X,Math.min(W.get(X)??0,W.get(M)??0));else if(Q.has(M))W.set(X,Math.min(W.get(X)??0,z.get(M)??0));if(W.get(X)===z.get(X)){let M=[],O="";do O=J.pop()??"",Q.delete(O),M.push(O);while(O!==X&&J.length>0);Z.push(M)}};for(let X of _.keys())if(!z.has(X))Y(X);return{components:Z}}function GQ(_,$,J){let Q=[],z=new Set,W=[..._].sort(TQ),Z=(Y,X,M)=>{X.delete(Y);let O=M.get(Y);if(!O)return;for(let L of O)if(X.has(L))Z(L,X,M);O.clear()};for(let Y=0;Y<W.length&&Q.length<J;Y++){let X=W[Y]??"",M=new Set(W.slice(Y)),O=new Set,L=new Map,D=[],N=(R)=>($.get(R)??[]).filter((G)=>M.has(G)),w=(R)=>{if(Q.length>=J)return!0;let G=!1;D.push(R),O.add(R);for(let F of N(R)){if(Q.length>=J)break;if(F===X)m0(z,Q,D.concat(X)),G=!0;else if(!O.has(F)){if(w(F))G=!0}}if(G)Z(R,O,L);else for(let F of N(R)){let u=L.get(F)??new Set;u.add(R),L.set(F,u)}return D.pop(),G};w(X)}return Q}function jQ(_,$){let{components:J}=FQ(_),Q=[],z=new Set;for(let W of J){if(Q.length>=$)break;if(W.length===0)continue;if(W.length===1){let X=W[0]??"";if((_.get(X)??[]).includes(X))m0(z,Q,[X,X]);continue}let Z=$-Q.length,Y=GQ(W,_,Z);for(let X of Y){if(Q.length>=$)break;m0(z,Q,X)}}return Q}var kQ=15000;function Z0(_){_.graphCache=null,_.graphCacheKey=null,_.graphCacheBuiltAt=null}function G_(_,$){let J=$??"__cross__";if(_.graphCache&&_.graphCacheBuiltAt!==null){if(Date.now()-_.graphCacheBuiltAt>kQ)_.graphCache=null,_.graphCacheKey=null,_.graphCacheBuiltAt=null}if(_.graphCache&&_.graphCacheKey===J)return _.graphCache;let Q=new Y0({relationRepo:_.relationRepo,project:$??_.defaultProject,additionalProjects:$?void 0:_.boundaries?.map((z)=>z.project)});return Q.build(),_.graphCache=Q,_.graphCacheKey=J,_.graphCacheBuiltAt=Date.now(),Q}function F1(_,$,J,Q=1e4){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:J??_.defaultProject,query:{srcFilePath:$,type:"imports",project:J??_.defaultProject,limit:Q}}).filter((z)=>z.dstFilePath!==null).map((z)=>z.dstFilePath)}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getDependencies failed",{cause:z})}}function G1(_,$,J,Q=1e4){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:J??_.defaultProject,query:{dstFilePath:$,type:"imports",project:J??_.defaultProject,limit:Q}}).map((z)=>z.srcFilePath)}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getDependents failed",{cause:z})}}async function j1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return G_(_,J).getAffectedByChange($)}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: getAffected failed",{cause:Q})}}async function k1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return G_(_,$).hasCycle()}catch(J){if(J instanceof V)throw J;throw new V("search","Gildash: hasCycle failed",{cause:J})}}async function g1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return G_(_,$).getAdjacencyList()}catch(J){if(J instanceof V)throw J;throw new V("search","Gildash: getImportGraph failed",{cause:J})}}async function E1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return G_(_,J).getTransitiveDependencies($)}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: getTransitiveDependencies failed",{cause:Q})}}async function v1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return G_(_,J).getTransitiveDependents($)}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: getTransitiveDependents failed",{cause:Q})}}async function u1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return G_(_,$).getCyclePaths(J)}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: getCyclePaths failed",{cause:Q})}}async function b1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{let Q=G_(_,J);return{filePath:$,fanIn:Q.getDependents($).length,fanOut:Q.getDependencies($).length}}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: getFanMetrics failed",{cause:Q})}}var vQ=30000,P1=15000,uQ=10;function bQ(_,$){_.boundaries=$,_.defaultProject=$[0]?.project??P_.basename(_.projectRoot)}function PQ(_,$){return(J)=>{for(let Q of _.onFileChangedCallbacks)try{Q(J)}catch(z){_.logger.error("[Gildash] onFileChanged callback threw:",z)}if($.handleWatcherEvent?.(J),_.semanticLayer)if(J.eventType==="delete")try{_.semanticLayer.notifyFileDeleted(J.filePath)}catch(Q){_.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw:",Q);for(let z of _.onErrorCallbacks)try{z(Q instanceof V?Q:new V("semantic","semantic notifyFileDeleted failed",{cause:Q}))}catch{}}else _.readFileFn(J.filePath).then((Q)=>{try{_.semanticLayer?.notifyFileChanged(J.filePath,Q)}catch(z){_.logger.error("[Gildash] semanticLayer.notifyFileChanged threw:",z);for(let W of _.onErrorCallbacks)try{W(z instanceof V?z:new V("semantic","semantic notifyFileChanged failed",{cause:z}))}catch{}}}).catch((Q)=>{_.logger.error("[Gildash] failed to read file for semantic layer",J.filePath,Q);try{_.semanticLayer?.notifyFileDeleted(J.filePath)}catch(z){_.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw during read error recovery:",z)}})}}async function fQ(_){if(!_.semanticLayer)return;let $=_.fileRepo.getAllFiles(_.defaultProject);await Promise.all($.map(async(J)=>{try{let Q=P_.resolve(_.projectRoot,J.filePath),z=await _.readFileFn(Q);_.semanticLayer?.notifyFileChanged(Q,z)}catch{}}))}async function f1(_,$){let J=_.coordinatorFactory?_.coordinatorFactory():new T0({projectRoot:_.projectRoot,boundaries:_.boundaries,extensions:_.extensions,ignorePatterns:_.ignorePatterns,dbConnection:_.db,parseCache:_.parseCache,fileRepo:_.fileRepo,symbolRepo:_.symbolRepo,relationRepo:_.relationRepo,annotationRepo:_.annotationRepo??void 0,changelogRepo:_.changelogRepo??void 0,onBoundariesChanged:(Q)=>bQ(_,Q),logger:_.logger});_.coordinator=J;for(let Q of _.onIndexedCallbacks)J.onIndexed(Q);if(J.onIndexed((Q)=>{let z=Q.changedFiles.length+Q.deletedFiles.length;if(_.graphCache&&z>0&&z<100){let W=_.relationRepo;_.graphCache.patchFiles(Q.changedFiles,Q.deletedFiles,(Z)=>{return[_.defaultProject,..._.boundaries.map((X)=>X.project)].flatMap((X)=>W.getByType(X,"imports").concat(W.getByType(X,"type-references")).concat(W.getByType(X,"re-exports"))).filter((X)=>X.dstFilePath!==null&&(X.srcFilePath===Z||X.dstFilePath===Z)).map((X)=>({srcFilePath:X.srcFilePath,dstFilePath:X.dstFilePath}))}),_.graphCacheBuiltAt=Date.now()}else Z0(_)}),$.isWatchMode){let Q=_.watcherFactory?_.watcherFactory():new w0({projectRoot:_.projectRoot,ignorePatterns:_.ignorePatterns,extensions:_.extensions},void 0,_.logger);await Q.start(PQ(_,J)).then((z)=>{if(c_(z))throw z.data}),_.watcher=Q,_.timer=setInterval(()=>{if(_.closed)return;_.updateHeartbeatFn(_.db,process.pid)},vQ)}await J.fullIndex(),await fQ(_)}function yQ(_,$){let J=["SIGTERM","SIGINT","beforeExit"];for(let Q of J){let z=()=>{$().catch((W)=>_.logger.error("[Gildash] close error during signal",Q,W))};if(Q==="beforeExit")process.on("beforeExit",z);else process.on(Q,z);_.signalHandlers.push([Q,z])}}async function y1(_){let{projectRoot:$,extensions:J=[".ts",".mts",".cts"],ignorePatterns:Q=["**/node_modules/**"],parseCacheCapacity:z=500,logger:W=console,existsSyncFn:Z=EQ,dbConnectionFactory:Y,watcherFactory:X,coordinatorFactory:M,repositoryFactory:O,acquireWatcherRoleFn:L=K1,releaseWatcherRoleFn:D=M1,updateHeartbeatFn:N=L1,discoverProjectsFn:w=r_,parseSourceFn:R=E_,extractSymbolsFn:G=R_,extractRelationsFn:F=d_,symbolSearchFn:u=F0,relationSearchFn:E=G0,patternSearchFn:y=j0,loadTsconfigPathsFn:l=n_,readFileFn:i=async(s)=>Bun.file(s).text(),unlinkFn:W_=async(s)=>{await Bun.file(s).unlink()},watchMode:X_,semantic:K_,semanticLayerFactory:U_}=_;if(!P_.isAbsolute($))throw new V("validation",`Gildash: projectRoot must be an absolute path, got: "${$}"`);if(!Z($))throw new V("validation",`Gildash: projectRoot does not exist: "${$}"`);let Y_=Y?Y():new H0({projectRoot:$}),c=Y_.open();if(c_(c))throw c.data;try{let s=await w($),C_=s[0]?.project??P_.basename($),C=O?O():(()=>{let S=Y_;return{fileRepo:new K0(S),symbolRepo:new M0(S),relationRepo:new L0(S),parseCache:new S0(z)}})(),q=O?null:Y_,U=q?new x0(q):null,H=q?new h0(q):null,K=X_??!0,B=crypto.randomUUID(),A;if(K)A=await Promise.resolve(L(Y_,process.pid,{instanceId:B}));else A="owner";let I={projectRoot:$,extensions:J,ignorePatterns:Q,logger:W,defaultProject:C_,role:A,db:Y_,symbolRepo:C.symbolRepo,relationRepo:C.relationRepo,fileRepo:C.fileRepo,parseCache:C.parseCache,annotationRepo:U,changelogRepo:H,annotationSearchFn:S1,releaseWatcherRoleFn:D,parseSourceFn:R,extractSymbolsFn:G,extractRelationsFn:F,symbolSearchFn:u,relationSearchFn:E,patternSearchFn:y,readFileFn:i,unlinkFn:W_,existsSyncFn:Z,acquireWatcherRoleFn:L,updateHeartbeatFn:N,watcherFactory:X,coordinatorFactory:M,instanceId:B,closed:!1,coordinator:null,watcher:null,timer:null,signalHandlers:[],tsconfigPaths:null,boundaries:s,onIndexedCallbacks:new Set,onFileChangedCallbacks:new Set,onErrorCallbacks:new Set,onRoleChangedCallbacks:new Set,graphCache:null,graphCacheKey:null,graphCacheBuiltAt:null,semanticLayer:null};if(o_($),I.tsconfigPaths=await l($),K_){let S=P_.join($,"tsconfig.json");try{if(U_)I.semanticLayer=U_(S);else{let T=W0.create(S);if(c_(T))throw T.data;I.semanticLayer=T}}catch(T){if(T instanceof V)throw T;throw new V("semantic","Gildash: semantic layer creation failed",{cause:T})}}if(A==="owner")await f1(I,{isWatchMode:K});else{let S=0,T=async()=>{try{let j=await Promise.resolve(I.acquireWatcherRoleFn(I.db,process.pid,{instanceId:I.instanceId}));if(S=0,j==="owner"){I.role="owner";for(let g of I.onRoleChangedCallbacks)try{g("owner")}catch(b){I.logger.error("[Gildash] onRoleChanged callback threw:",b)}clearInterval(I.timer),I.timer=null;try{await f1(I,{isWatchMode:!0})}catch(g){if(I.logger.error("[Gildash] owner promotion failed, reverting to reader",g),I.role="reader",I.timer!==null)clearInterval(I.timer),I.timer=null;if(I.watcher){let b=await I.watcher.close();if(c_(b))I.logger.error("[Gildash] watcher close error during promotion rollback",b.data);I.watcher=null}if(I.coordinator)await I.coordinator.shutdown().catch((b)=>I.logger.error("[Gildash] coordinator shutdown error during promotion rollback",b)),I.coordinator=null;try{I.releaseWatcherRoleFn(I.db,process.pid)}catch(b){I.logger.error("[Gildash] failed to release watcher role during promotion rollback",b)}I.timer=setInterval(T,P1)}}}catch(j){S++;let g=j instanceof V?j:new V("watcher","Gildash: healthcheck error",{cause:j});for(let b of I.onErrorCallbacks)try{b(g)}catch(d){I.logger.error("[Gildash] onError callback threw:",d)}if(I.logger.error("[Gildash] healthcheck error",j),S>=uQ)I.logger.error("[Gildash] healthcheck failed too many times, shutting down"),clearInterval(I.timer),I.timer=null,X0(I).catch((b)=>I.logger.error("[Gildash] close error during healthcheck shutdown",b))}};I.timer=setInterval(T,P1)}if(K)yQ(I,()=>X0(I));return I}catch(s){if(Y_.close(),s instanceof V)throw s;throw new V("store","Gildash: initialization failed",{cause:s})}}async function X0(_,$){if(_.closed)return;_.closed=!0;let J=[];for(let[Q,z]of _.signalHandlers)if(Q==="beforeExit")process.off("beforeExit",z);else process.off(Q,z);if(_.signalHandlers=[],_.semanticLayer){try{_.semanticLayer.dispose()}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}_.semanticLayer=null}if(_.coordinator)try{await _.coordinator.shutdown()}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}if(_.watcher){let Q=await _.watcher.close();if(c_(Q))J.push(Q.data)}if(_.timer!==null)clearInterval(_.timer),_.timer=null;try{_.releaseWatcherRoleFn(_.db,process.pid)}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}try{_.db.close()}catch(Q){J.push(Q instanceof Error?Q:Error(String(Q)))}if($?.cleanup)for(let Q of["","-wal","-shm"])try{await _.unlinkFn(P_.join(_.projectRoot,A_,a_+Q))}catch{}if(J.length>0)throw new V("close","Gildash: one or more errors occurred during close()",{cause:J})}import{isErr as x1}from"@zipbul/result";function h1(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");let z=_.parseSourceFn($,J,Q);if(x1(z))throw z.data;return _.parseCache.set($,z),z}async function m1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");let Q=new Map,z=[];return await Promise.all($.map(async(W)=>{try{let Z=await _.readFileFn(W),Y=_.parseSourceFn(W,Z,J);if(!x1(Y))Q.set(W,Y);else z.push({filePath:W,error:Y.data})}catch(Z){z.push({filePath:W,error:Z instanceof Error?Z:Error(String(Z))})}})),{parsed:Q,failures:z}}function n1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");return _.parseCache.get($)}function p1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");return _.extractSymbolsFn($)}function d1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");return _.extractRelationsFn($.program,$.filePath,_.tsconfigPaths??void 0)}import l1 from"path";function i1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.symbolRepo.getStats($??_.defaultProject)}catch(J){if(J instanceof V)throw J;throw new V("store","Gildash: getStats failed",{cause:J})}}function n0(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.symbolSearchFn({symbolRepo:_.symbolRepo,project:_.defaultProject,query:$})}catch(J){if(J instanceof V)throw J;throw new V("search","Gildash: searchSymbols failed",{cause:J})}}function c1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:_.defaultProject,query:$})}catch(J){if(J instanceof V)throw J;throw new V("search","Gildash: searchRelations failed",{cause:J})}}function a1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.symbolSearchFn({symbolRepo:_.symbolRepo,project:void 0,query:$})}catch(J){if(J instanceof V)throw J;throw new V("search","Gildash: searchAllSymbols failed",{cause:J})}}function s1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:void 0,query:$})}catch(J){if(J instanceof V)throw J;throw new V("search","Gildash: searchAllRelations failed",{cause:J})}}function r1(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.fileRepo.getAllFiles($??_.defaultProject)}catch(J){if(J instanceof V)throw J;throw new V("store","Gildash: listIndexedFiles failed",{cause:J})}}function o1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.relationSearchFn({relationRepo:_.relationRepo,project:J??_.defaultProject,query:{srcFilePath:$,dstFilePath:$,limit:1e4}})}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: getInternalRelations failed",{cause:Q})}}function t1(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");try{let z=Q??_.defaultProject,W=_.symbolSearchFn({symbolRepo:_.symbolRepo,project:z,query:{text:$,exact:!0,filePath:J,limit:1}});if(W.length===0)return null;let Z=W[0],Y=Z.detail,X={...Z,members:Y.members,jsDoc:Y.jsDoc,parameters:Y.parameters,returnType:Y.returnType,heritage:Y.heritage,decorators:Y.decorators,typeParameters:Y.typeParameters,initializer:Y.initializer};if(_.semanticLayer)try{let M=l1.isAbsolute(J)?J:l1.resolve(_.projectRoot,J),O=_.semanticLayer.lineColumnToPosition(M,Z.span.start.line,Z.span.start.column);if(O!==null){let L=_.semanticLayer.findNamePosition(M,O,Z.name)??O,D=_.semanticLayer.collectTypeAt(M,L);if(D)X.resolvedType=D}}catch{}return X}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getFullSymbol failed",{cause:z})}}function e1(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{let Q=J??_.defaultProject,z=_.fileRepo.getFile(Q,$);if(!z)throw new V("search",`Gildash: file '${$}' is not in the index`);let W=_.symbolRepo.getFileSymbols(Q,$),Z=_.relationRepo.getOutgoing(Q,$);return{filePath:z.filePath,lineCount:z.lineCount??0,size:z.size,symbolCount:W.length,exportedSymbolCount:W.filter((Y)=>Y.isExported).length,relationCount:Z.length}}catch(Q){if(Q instanceof V)throw Q;throw new V("store","Gildash: getFileStats failed",{cause:Q})}}function _$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{return _.fileRepo.getFile(J??_.defaultProject,$)}catch(Q){if(Q instanceof V)throw Q;throw new V("store","Gildash: getFileInfo failed",{cause:Q})}}function $$(_,$,J){return n0(_,{filePath:$,project:J??void 0,limit:1e4})}function J$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{let z=_.symbolSearchFn({symbolRepo:_.symbolRepo,project:J??_.defaultProject,query:{filePath:$,isExported:!0}}).map((W)=>({name:W.name,kind:W.kind,parameters:W.detail.parameters?`(${W.detail.parameters.map((Z)=>`${Z.name}${Z.isOptional?"?":""}: ${Z.type??"unknown"}`).join(", ")})`:void 0,returnType:W.detail.returnType??void 0,jsDoc:W.detail.jsDoc?.description??void 0}));return{filePath:$,exports:z}}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: getModuleInterface failed",{cause:Q})}}import P from"path";function f_(_,$,J,Q){let z=Q??_.defaultProject,W=P.isAbsolute(J)?P.relative(_.projectRoot,J):J,Z=_.symbolSearchFn({symbolRepo:_.symbolRepo,project:z,query:{text:$,exact:!0,filePath:W,limit:1}});if(Z.length===0)return null;let Y=Z[0],X=P.isAbsolute(J)?J:P.resolve(_.projectRoot,J),M=_.semanticLayer.lineColumnToPosition(X,Y.span.start.line,Y.span.start.column);if(M===null)return null;let O=_.semanticLayer.findNamePosition(X,M,Y.name)??M;return{sym:Y,position:O,absPath:X}}function Q$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let z=f_(_,$,J,Q);if(!z)return null;return _.semanticLayer.collectTypeAt(z.absPath,z.position)}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getResolvedType failed",{cause:z})}}function z$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let z=f_(_,$,J,Q);if(!z)throw new V("search",`Gildash: symbol '${$}' not found in '${J}'`);return _.semanticLayer.findReferences(z.absPath,z.position)}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getSemanticReferences failed",{cause:z})}}function W$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let z=f_(_,$,J,Q);if(!z)throw new V("search",`Gildash: symbol '${$}' not found in '${J}'`);return _.semanticLayer.findEnrichedReferences(z.absPath,z.position)}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getEnrichedReferences failed",{cause:z})}}function Y$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let z=f_(_,$,J,Q);if(!z)throw new V("search",`Gildash: symbol '${$}' not found in '${J}'`);return _.semanticLayer.findImplementations(z.absPath,z.position)}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getImplementations failed",{cause:z})}}function Z$(_,$,J,Q,z,W){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Z=f_(_,$,J,W);if(!Z)throw new V("search",`Gildash: source symbol '${$}' not found in '${J}'`);let Y=f_(_,Q,z,W);if(!Y)throw new V("search",`Gildash: target symbol '${Q}' not found in '${z}'`);return _.semanticLayer.isTypeAssignableTo(Z.absPath,Z.position,Y.absPath,Y.position)}catch(Z){if(Z instanceof V)throw Z;throw new V("semantic","Gildash: isTypeAssignableTo failed",{cause:Z})}}function X$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let J=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.collectFileTypes(J)}catch(J){if(J instanceof V)throw J;throw new V("semantic","Gildash: getFileTypes failed",{cause:J})}}function U$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let z=P.isAbsolute($)?$:P.resolve(_.projectRoot,$),W=_.semanticLayer.lineColumnToPosition(z,J,Q);if(W===null)return null;return _.semanticLayer.collectTypeAt(z,W)}catch(z){if(z instanceof V)throw z;throw new V("semantic","Gildash: getResolvedTypeAt failed",{cause:z})}}function V$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let J=P.isAbsolute($.source.filePath)?$.source.filePath:P.resolve(_.projectRoot,$.source.filePath),Q=P.isAbsolute($.target.filePath)?$.target.filePath:P.resolve(_.projectRoot,$.target.filePath),z=_.semanticLayer.lineColumnToPosition(J,$.source.line,$.source.column);if(z===null)return null;let W=_.semanticLayer.lineColumnToPosition(Q,$.target.line,$.target.column);if(W===null)return null;return _.semanticLayer.isTypeAssignableTo(J,z,Q,W)}catch(J){if(J instanceof V)throw J;throw new V("semantic","Gildash: isTypeAssignableToAt failed",{cause:J})}}function O$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{return _.semanticLayer.getModuleInterface($)}catch(J){if(J instanceof V)throw J;throw new V("search","Gildash: getSemanticModuleInterface failed",{cause:J})}}function H$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.getBaseTypes(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getBaseTypes failed",{cause:Q})}}function K$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.collectTypesAtPositions(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getResolvedTypesAtPositions failed",{cause:Q})}}function M$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.collectTypeAt(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getResolvedTypeAtPosition failed",{cause:Q})}}function L$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.findReferences(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getSemanticReferencesAtPosition failed",{cause:Q})}}function B$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.findEnrichedReferences(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getEnrichedReferencesAtPosition failed",{cause:Q})}}function w$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let J=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.getFileBindings(J)}catch(J){if(J instanceof V)throw J;throw new V("semantic","Gildash: getFileBindings failed",{cause:J})}}function I$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let J=$.map((W)=>({orig:W.filePath,abs:P.isAbsolute(W.filePath)?W.filePath:P.resolve(_.projectRoot,W.filePath),content:W.content})),Q=_.semanticLayer.getFileBindingsBatch(J.map((W)=>({filePath:W.abs,content:W.content}))),z=new Map;for(let W of J)z.set(W.orig,Q.get(W.abs)??[]);return z}catch(J){if(J instanceof V)throw J;throw new V("semantic","Gildash: getFileBindingsBatch failed",{cause:J})}}function C$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);_.semanticLayer.notifyFileChanged(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: notifyFileChanged failed",{cause:Q})}}function D$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let J=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);_.semanticLayer.notifyFileDeleted(J)}catch(J){if(J instanceof V)throw J;throw new V("semantic","Gildash: notifyFileDeleted failed",{cause:J})}}function A$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.findImplementations(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getImplementationsAtPosition failed",{cause:Q})}}function q$(_,$,J,Q,z){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let W=P.isAbsolute($)?$:P.resolve(_.projectRoot,$),Z=P.isAbsolute(Q)?Q:P.resolve(_.projectRoot,Q);return _.semanticLayer.isTypeAssignableTo(W,J,Z,z)}catch(W){if(W instanceof V)throw W;throw new V("semantic","Gildash: isTypeAssignableToAtPosition failed",{cause:W})}}function N$(_,$,J,Q,z){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let W=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.isTypeAssignableToType(W,J,Q,z)}catch(W){if(W instanceof V)throw W;throw new V("semantic","Gildash: isTypeAssignableToType failed",{cause:W})}}function R$(_,$,J,Q,z){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let W=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.isTypeAssignableToTypeAtPositions(W,J,Q,z)}catch(W){if(W instanceof V)throw W;throw new V("semantic","Gildash: isTypeAssignableToTypeAtPositions failed",{cause:W})}}function T$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let z=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.lineColumnToPosition(z,J,Q)}catch(z){if(z instanceof V)throw z;throw new V("semantic","Gildash: lineColumnToPosition failed",{cause:z})}}function S$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let z=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.findNamePosition(z,J,Q)}catch(z){if(z instanceof V)throw z;throw new V("semantic","Gildash: findNamePosition failed",{cause:z})}}function F$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.getSymbolNode(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getSymbolNode failed",{cause:Q})}}function G$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.semanticLayer)throw new V("semantic","Gildash: semantic layer is not enabled");try{let Q=P.isAbsolute($)?$:P.resolve(_.projectRoot,$);return _.semanticLayer.getDiagnostics(Q,J)}catch(Q){if(Q instanceof V)throw Q;throw new V("semantic","Gildash: getSemanticDiagnostics failed",{cause:Q})}}function j$(_,$){let J=new Map(_.map((Y)=>[`${Y.name}::${Y.filePath}`,Y])),Q=new Map($.map((Y)=>[`${Y.name}::${Y.filePath}`,Y])),z=[],W=[],Z=[];for(let[Y,X]of Q){let M=J.get(Y);if(!M)z.push(X);else if(M.fingerprint!==X.fingerprint)Z.push({before:M,after:X})}for(let[Y,X]of J)if(!Q.has(Y))W.push(X);return{added:z,removed:W,modified:Z}}function k$(_,$){if(_.onIndexedCallbacks.add($),!_.coordinator)return()=>{_.onIndexedCallbacks.delete($)};let J=_.coordinator.onIndexed($);return()=>{_.onIndexedCallbacks.delete($),J()}}async function g$(_){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.coordinator)throw new V("closed","Gildash: reindex() is not available for readers");try{let $=await _.coordinator.fullIndex();return Z0(_),$}catch($){if($ instanceof V)throw $;throw new V("index","Gildash: reindex failed",{cause:$})}}function E$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");let z=Q??_.defaultProject,W=new Set,Z=[],Y=$,X=J;for(;;){let M=`${X}::${Y}`;if(W.has(M))return{originalName:Y,originalFilePath:X,reExportChain:Z,circular:!0};W.add(M);let O=_.relationSearchFn({relationRepo:_.relationRepo,project:z,query:{type:"re-exports",srcFilePath:X,limit:500}}),L,D;for(let N of O){let w;if(N.metaJson)try{let G=JSON.parse(N.metaJson);if(Array.isArray(G.specifiers))w=G.specifiers}catch{}if(!w)continue;let R=w.find((G)=>G.exported===Y);if(!R)continue;L=N.dstFilePath??void 0,D=R.local;break}if(!L||!D)return{originalName:Y,originalFilePath:X,reExportChain:Z,circular:!1};Z.push({filePath:X,exportedAs:Y}),X=L,Y=D}}function v$(_,$){return _.onFileChangedCallbacks.add($),()=>{_.onFileChangedCallbacks.delete($)}}function u$(_,$){return _.onErrorCallbacks.add($),()=>{_.onErrorCallbacks.delete($)}}function b$(_,$){return _.onRoleChangedCallbacks.add($),()=>{_.onRoleChangedCallbacks.delete($)}}async function P$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");try{let Q=J?.project??_.defaultProject,z=J?.filePaths?J.filePaths:_.fileRepo.getAllFiles(Q).map((W)=>W.filePath);return await _.patternSearchFn({pattern:$,filePaths:z})}catch(Q){if(Q instanceof V)throw Q;throw new V("search","Gildash: findPattern failed",{cause:Q})}}async function f$(_,$,J,Q){if(_.closed)throw new V("closed","Gildash: instance is closed");try{let z=Q??_.defaultProject,W=new Set,Z=(Y,X,M)=>{let O=`${Y}::${X}`;if(W.has(O))return{symbolName:Y,filePath:X,kind:M,children:[]};W.add(O);let N=_.relationSearchFn({relationRepo:_.relationRepo,project:z,query:{srcFilePath:X,srcSymbolName:Y,limit:1000}}).filter((w)=>w.type==="extends"||w.type==="implements").filter((w)=>w.dstSymbolName!=null&&w.dstFilePath!=null).map((w)=>Z(w.dstSymbolName,w.dstFilePath,w.type));return{symbolName:Y,filePath:X,kind:M,children:N}};return Z($,J)}catch(z){if(z instanceof V)throw z;throw new V("search","Gildash: getHeritageChain failed",{cause:z})}}function y$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.annotationRepo||!_.annotationSearchFn)return[];return _.annotationSearchFn({annotationRepo:_.annotationRepo,project:$.project??_.defaultProject,query:$})}function x$(_,$,J){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.changelogRepo)return[];let Q=$ instanceof Date?$.toISOString():$,z=J?.project??_.defaultProject,W=J?.limit??1000;return _.changelogRepo.getSince({project:z,since:Q,symbolName:J?.symbolName,changeTypes:J?.changeTypes,filePath:J?.filePath,includeFullIndex:J?.includeFullIndex,indexRunId:J?.indexRunId,afterId:J?.afterId,limit:W}).map((Y)=>({changeType:Y.changeType,symbolName:Y.symbolName,symbolKind:Y.symbolKind,filePath:Y.filePath,oldName:Y.oldName,oldFilePath:Y.oldFilePath,fingerprint:Y.fingerprint,changedAt:Y.changedAt,isFullIndex:Y.isFullIndex===1,indexRunId:Y.indexRunId}))}function h$(_,$){if(_.closed)throw new V("closed","Gildash: instance is closed");if(!_.changelogRepo)return 0;let J=$ instanceof Date?$.toISOString():$,Q=0,z=[_.defaultProject,..._.boundaries.map((Z)=>Z.project)],W=[...new Set(z)];for(let Z of W)Q+=_.changelogRepo.pruneOlderThan(Z,J);return Q}class p0{_ctx;get projectRoot(){return this._ctx.projectRoot}get role(){return this._ctx.role}get projects(){return[...this._ctx.boundaries]}constructor(_){this._ctx=_}static async open(_){let $=await y1(_);return new p0($)}async close(_){return X0(this._ctx,_)}parseSource(_,$,J){return h1(this._ctx,_,$,J)}async batchParse(_,$){return m1(this._ctx,_,$)}getParsedAst(_){return n1(this._ctx,_)}extractSymbols(_){return p1(this._ctx,_)}extractRelations(_){return d1(this._ctx,_)}getStats(_){return i1(this._ctx,_)}searchSymbols(_){return n0(this._ctx,_)}searchRelations(_){return c1(this._ctx,_)}searchAllSymbols(_){return a1(this._ctx,_)}searchAllRelations(_){return s1(this._ctx,_)}listIndexedFiles(_){return r1(this._ctx,_)}getInternalRelations(_,$){return o1(this._ctx,_,$)}getFullSymbol(_,$,J){return t1(this._ctx,_,$,J)}getFileStats(_,$){return e1(this._ctx,_,$)}getFileInfo(_,$){return _$(this._ctx,_,$)}getSymbolsByFile(_,$){return $$(this._ctx,_,$)}getModuleInterface(_,$){return J$(this._ctx,_,$)}getDependencies(_,$,J=1e4){return F1(this._ctx,_,$,J)}getDependents(_,$,J=1e4){return G1(this._ctx,_,$,J)}async getAffected(_,$){return j1(this._ctx,_,$)}async hasCycle(_){return k1(this._ctx,_)}async getImportGraph(_){return g1(this._ctx,_)}async getTransitiveDependencies(_,$){return E1(this._ctx,_,$)}async getTransitiveDependents(_,$){return v1(this._ctx,_,$)}async getCyclePaths(_,$){return u1(this._ctx,_,$)}async getFanMetrics(_,$){return b1(this._ctx,_,$)}getResolvedType(_,$,J){return Q$(this._ctx,_,$,J)}getSemanticReferences(_,$,J){return z$(this._ctx,_,$,J)}getEnrichedReferences(_,$,J){return W$(this._ctx,_,$,J)}getImplementations(_,$,J){return Y$(this._ctx,_,$,J)}isTypeAssignableTo(_,$,J,Q,z){return Z$(this._ctx,_,$,J,Q,z)}getSemanticModuleInterface(_){return O$(this._ctx,_)}getFileTypes(_){return X$(this._ctx,_)}getResolvedTypeAt(_,$,J){return U$(this._ctx,_,$,J)}isTypeAssignableToAt(_){return V$(this._ctx,_)}getResolvedTypeAtPosition(_,$){return M$(this._ctx,_,$)}getResolvedTypesAtPositions(_,$){return K$(this._ctx,_,$)}getSemanticReferencesAtPosition(_,$){return L$(this._ctx,_,$)}getEnrichedReferencesAtPosition(_,$){return B$(this._ctx,_,$)}getFileBindings(_){return w$(this._ctx,_)}getFileBindingsBatch(_){return I$(this._ctx,_)}notifyFileChanged(_,$){C$(this._ctx,_,$)}notifyFileDeleted(_){D$(this._ctx,_)}getImplementationsAtPosition(_,$){return A$(this._ctx,_,$)}isTypeAssignableToAtPosition(_,$,J,Q){return q$(this._ctx,_,$,J,Q)}isTypeAssignableToType(_,$,J,Q){return N$(this._ctx,_,$,J,Q)}isTypeAssignableToTypeAtPositions(_,$,J,Q){return R$(this._ctx,_,$,J,Q)}lineColumnToPosition(_,$,J){return T$(this._ctx,_,$,J)}findNamePosition(_,$,J){return S$(this._ctx,_,$,J)}getSymbolNode(_,$){return F$(this._ctx,_,$)}getBaseTypes(_,$){return H$(this._ctx,_,$)}getSemanticDiagnostics(_,$){return G$(this._ctx,_,$)}diffSymbols(_,$){return j$(_,$)}onIndexed(_){return k$(this._ctx,_)}async reindex(){return g$(this._ctx)}resolveSymbol(_,$,J){return E$(this._ctx,_,$,J)}async findPattern(_,$){return P$(this._ctx,_,$)}async getHeritageChain(_,$,J){return f$(this._ctx,_,$,J)}onFileChanged(_){return v$(this._ctx,_)}onError(_){return u$(this._ctx,_)}onRoleChanged(_){return b$(this._ctx,_)}searchAnnotations(_){return y$(this._ctx,_)}getSymbolChanges(_,$){return x$(this._ctx,_,$)}pruneChangelog(_){return h$(this._ctx,_)}}import{Visitor as p5,visitorKeys as d5}from"oxc-parser";import{walk as i5,parseAndWalk as c5,ScopeTracker as a5}from"oxc-walker";export{i5 as walk,d5 as visitorKeys,F0 as symbolSearch,G0 as relationSearch,j0 as patternSearch,E_ as parseSource,c5 as parseAndWalk,z_ as normalizePath,pJ as isVariableDeclaration,nJ as isTSQualifiedName,mJ as isMemberExpression,hJ as isIdentifier,uJ as isFunctionNode,xJ as isFunctionExpression,yJ as isFunctionDeclaration,fJ as isCallExpression,PJ as isAssignmentExpression,bJ as isArrowFunctionExpression,dJ as is,O_ as getLineColumn,R_ as extractSymbols,d_ as extractRelations,p_ as buildLineOffsets,p5 as Visitor,a5 as ScopeTracker,V as GildashError,p0 as Gildash,Y0 as DependencyGraph};
@@ -57,7 +57,7 @@ export type CoordinatorLike = Pick<IndexCoordinator, 'fullIndex' | 'shutdown' |
57
57
  handleWatcherEvent?(event: FileChangeEvent): void;
58
58
  };
59
59
  export type WatcherLike = Pick<ProjectWatcher, 'start' | 'close'>;
60
- export type SemanticLayerLike = Pick<SemanticLayer, 'collectTypeAt' | 'collectFileTypes' | 'collectTypesAtPositions' | 'findReferences' | 'findEnrichedReferences' | 'findImplementations' | 'isTypeAssignableTo' | 'isTypeAssignableToType' | 'isTypeAssignableToTypeAtPositions' | 'getModuleInterface' | 'getSymbolNode' | 'getBaseTypes' | 'getDiagnostics' | 'notifyFileChanged' | 'notifyFileDeleted' | 'dispose' | 'isDisposed' | 'lineColumnToPosition' | 'findNamePosition'>;
60
+ export type SemanticLayerLike = Pick<SemanticLayer, 'collectTypeAt' | 'collectFileTypes' | 'collectTypesAtPositions' | 'findReferences' | 'findEnrichedReferences' | 'getFileBindings' | 'getFileBindingsBatch' | 'findImplementations' | 'isTypeAssignableTo' | 'isTypeAssignableToType' | 'isTypeAssignableToTypeAtPositions' | 'getModuleInterface' | 'getSymbolNode' | 'getBaseTypes' | 'getDiagnostics' | 'notifyFileChanged' | 'notifyFileDeleted' | 'dispose' | 'isDisposed' | 'lineColumnToPosition' | 'findNamePosition'>;
61
61
  /** Internal shared state for all Gildash API modules. */
62
62
  export interface GildashContext {
63
63
  readonly projectRoot: string;
@@ -9,7 +9,7 @@ import type { RelationSearchQuery } from '../search/relation-search';
9
9
  import type { SymbolStats } from '../store/repositories/symbol.repository';
10
10
  import type { FileRecord } from '../store/repositories/file.repository';
11
11
  import type { PatternMatch } from '../search/pattern-search';
12
- import type { ResolvedType, SemanticReference, EnrichedReference, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from '../semantic/types';
12
+ import type { ResolvedType, SemanticReference, EnrichedReference, FileBinding, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from '../semantic/types';
13
13
  import type { SymbolNode } from '../semantic/symbol-graph';
14
14
  import type { GildashContext } from './context';
15
15
  import type { FileChangeEvent } from '../watcher/types';
@@ -457,6 +457,44 @@ export declare class Gildash {
457
457
  * @throws {GildashError} With type `'semantic'` if tsc initialisation fails.
458
458
  */
459
459
  getEnrichedReferencesAtPosition(filePath: string, position: number): EnrichedReference[];
460
+ /**
461
+ * Collect every binding in a file in a single pass, each grouped with its
462
+ * in-file references (enriched with `writeKind` / `isAmbient` / `enclosingScope`).
463
+ *
464
+ * One call per file — `O(identifiers)` — replacing per-symbol
465
+ * {@link getEnrichedReferences} loops for dataflow / dead-store analysis.
466
+ *
467
+ * @param filePath - Relative path to the file.
468
+ * @returns One {@link FileBinding} per distinct binding referenced in the file.
469
+ * @throws {GildashError} With type `'semantic'` if tsc initialisation fails.
470
+ */
471
+ getFileBindings(filePath: string): FileBinding[];
472
+ /**
473
+ * Register the given in-memory `files` and collect every file's bindings in one
474
+ * batch, keyed by the caller's `filePath`. The tsc Program rebuilds once for the
475
+ * whole batch — use this instead of interleaving {@link notifyFileChanged} with
476
+ * per-file {@link getFileBindings}, which forces a rebuild per file.
477
+ *
478
+ * @throws {GildashError} With type `'semantic'` if the semantic layer is off.
479
+ */
480
+ getFileBindingsBatch(files: ReadonlyArray<{
481
+ filePath: string;
482
+ content: string;
483
+ }>): Map<string, FileBinding[]>;
484
+ /**
485
+ * Register or replace an in-memory file in the semantic layer (tsc Program).
486
+ * Identical content is a no-op (no recompute). Pair with {@link getFileBindings}
487
+ * for ad-hoc sources not backed by disk.
488
+ *
489
+ * @throws {GildashError} With type `'semantic'` if the semantic layer is off.
490
+ */
491
+ notifyFileChanged(filePath: string, content: string): void;
492
+ /**
493
+ * Remove an in-memory file from the semantic layer (tsc Program).
494
+ *
495
+ * @throws {GildashError} With type `'semantic'` if the semantic layer is off.
496
+ */
497
+ notifyFileDeleted(filePath: string): void;
460
498
  /**
461
499
  * Find all implementations of the symbol at a specific byte position.
462
500
  *
@@ -1,5 +1,5 @@
1
1
  import type { SymbolSearchResult } from '../search/symbol-search';
2
- import type { ResolvedType, SemanticReference, EnrichedReference, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from '../semantic/types';
2
+ import type { ResolvedType, SemanticReference, EnrichedReference, FileBinding, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from '../semantic/types';
3
3
  import type { SymbolNode } from '../semantic/symbol-graph';
4
4
  import type { GildashContext } from './context';
5
5
  /**
@@ -50,6 +50,21 @@ export declare function getResolvedTypeAtPosition(ctx: GildashContext, filePath:
50
50
  export declare function getSemanticReferencesAtPosition(ctx: GildashContext, filePath: string, position: number): SemanticReference[];
51
51
  /** Find all enriched references at a byte offset. */
52
52
  export declare function getEnrichedReferencesAtPosition(ctx: GildashContext, filePath: string, position: number): EnrichedReference[];
53
+ /** Collect all bindings in a file (single-pass), each with its in-file enriched references. */
54
+ export declare function getFileBindings(ctx: GildashContext, filePath: string): FileBinding[];
55
+ /**
56
+ * Register in-memory `files` then collect every file's bindings in one batch,
57
+ * keyed by the caller's filePath. Amortizes the tsc Program rebuild to once for
58
+ * the whole batch (vs once per file when notify/query are interleaved).
59
+ */
60
+ export declare function getFileBindingsBatch(ctx: GildashContext, files: ReadonlyArray<{
61
+ filePath: string;
62
+ content: string;
63
+ }>): Map<string, FileBinding[]>;
64
+ /** Register/replace an in-memory file in the semantic layer (tsc Program). */
65
+ export declare function notifyFileChanged(ctx: GildashContext, filePath: string, content: string): void;
66
+ /** Remove an in-memory file from the semantic layer (tsc Program). */
67
+ export declare function notifyFileDeleted(ctx: GildashContext, filePath: string): void;
53
68
  /** Find implementations at a byte offset. */
54
69
  export declare function getImplementationsAtPosition(ctx: GildashContext, filePath: string, position: number): Implementation[];
55
70
  /** Check type assignability at byte offsets. */
@@ -16,7 +16,7 @@ export type { SymbolStats } from "./store/repositories/symbol.repository";
16
16
  export type { WatcherRole, FileChangeEvent } from "./watcher/types";
17
17
  export type { ParsedFile } from "./parser/types";
18
18
  export type { FileRecord } from "./store/repositories/file.repository";
19
- export type { ResolvedType, SemanticReference, EnrichedReference, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from "./semantic/types";
19
+ export type { ResolvedType, SemanticReference, EnrichedReference, FileBinding, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from "./semantic/types";
20
20
  export type { WriteKind, ScopeKind, EnclosingScope } from "./semantic/reference-classifier";
21
21
  export type { SymbolNode } from "./semantic/symbol-graph";
22
22
  export type { AnnotationSource, ExtractedAnnotation } from "./extractor/types";
@@ -11,7 +11,7 @@ import { TypeCollector } from "./type-collector";
11
11
  import { SymbolGraph, type SymbolNode } from "./symbol-graph";
12
12
  import { ReferenceResolver } from "./reference-resolver";
13
13
  import { ImplementationFinder } from "./implementation-finder";
14
- import type { ResolvedType, SemanticReference, EnrichedReference, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from "./types";
14
+ import type { ResolvedType, SemanticReference, EnrichedReference, FileBinding, Implementation, SemanticModuleInterface, SemanticDiagnostic, GetDiagnosticsOptions } from "./types";
15
15
  export interface SemanticLayerOptions extends TscProgramOptions {
16
16
  /** Override TypeCollector (for testing). */
17
17
  typeCollector?: TypeCollector;
@@ -38,6 +38,16 @@ export declare class SemanticLayer {
38
38
  collectTypesAtPositions(filePath: string, positions: number[]): Map<number, ResolvedType>;
39
39
  findReferences(filePath: string, position: number): SemanticReference[];
40
40
  findEnrichedReferences(filePath: string, position: number): EnrichedReference[];
41
+ getFileBindings(filePath: string): FileBinding[];
42
+ /**
43
+ * Register all `files` then collect their bindings, keyed by file path. Notifies
44
+ * every file *before* any query so the Program rebuilds once (O(1)) instead of
45
+ * once per file — interleaved notify/query otherwise forces a rebuild per query.
46
+ */
47
+ getFileBindingsBatch(files: ReadonlyArray<{
48
+ filePath: string;
49
+ content: string;
50
+ }>): Map<string, FileBinding[]>;
41
51
  findImplementations(filePath: string, position: number): Implementation[];
42
52
  isTypeAssignableTo(sourceFilePath: string, sourcePosition: number, targetFilePath: string, targetPosition: number): boolean | null;
43
53
  /**
@@ -4,7 +4,7 @@
4
4
  * 텍스트 검색과 달리 심볼 identity 기반으로 참조를 찾으므로
5
5
  * rename, re-export, shadowing을 정확히 처리한다.
6
6
  */
7
- import type { EnrichedReference, SemanticReference } from "./types";
7
+ import type { EnrichedReference, FileBinding, SemanticReference } from "./types";
8
8
  import type { TscProgram } from "./tsc-program";
9
9
  export declare class ReferenceResolver {
10
10
  #private;
@@ -22,4 +22,11 @@ export declare class ReferenceResolver {
22
22
  * `findReferences` does not provide. Returns `[]` if disposed or unresolved.
23
23
  */
24
24
  findEnrichedAt(filePath: string, position: number): EnrichedReference[];
25
+ /**
26
+ * Collect every binding referenced in `filePath`, grouped by symbol, in a
27
+ * single AST pass (no per-symbol `findReferences`). Each group lists the
28
+ * references that occur in this file enriched with `writeKind` / `isAmbient` /
29
+ * `enclosingScope`. Returns `[]` if disposed or the file is unknown.
30
+ */
31
+ findFileBindings(filePath: string): FileBinding[];
25
32
  }
@@ -27,10 +27,11 @@ export declare class SymbolGraph {
27
27
  */
28
28
  get(filePath: string, position: number): SymbolNode | null;
29
29
  /**
30
- * `filePath`에 해당하는 캐시 항목을 모두 제거한다.
31
- * 파일 변경 시 호출하여 stale 결과를 무효화한다.
30
+ * 캐시 전체를 초기화한다.
31
+ *
32
+ * 캐시된 `members`/`exports`는 cross-file로 파생될 수 있으므로(`getAliasedSymbol`),
33
+ * 어떤 파일이든 변경되면 의존 노드가 stale해진다. 따라서 파일 단위가 아니라
34
+ * 전체를 비운다. (편의 캐시이며 tsc Program 재계산을 좌우하지 않는다.)
32
35
  */
33
- invalidate(filePath: string): void;
34
- /** 캐시 전체를 초기화한다. */
35
36
  clear(): void;
36
37
  }
@@ -95,6 +95,28 @@ export interface EnrichedReference extends SemanticReference {
95
95
  /** The lexical scope in which this reference occurs. */
96
96
  enclosingScope: EnclosingScope;
97
97
  }
98
+ /**
99
+ * All references to a single binding within one file, grouped by symbol identity.
100
+ *
101
+ * Produced by a single-pass walk + `getSymbolAtLocation` (no per-symbol
102
+ * `findReferences`), so collecting every binding in a file is `O(identifiers)`
103
+ * rather than `O(symbols × program)`. References are limited to the queried file
104
+ * (dataflow is intra-file); the declaration may live elsewhere.
105
+ */
106
+ export interface FileBinding {
107
+ /** The binding's declaration site (may be in another file, e.g. an import). */
108
+ declaration: {
109
+ filePath: string;
110
+ /** Zero-based offset of the declaration name. */
111
+ position: number;
112
+ /** Symbol name. */
113
+ name: string;
114
+ /** Whether the binding is ambient (no runtime definition). */
115
+ isAmbient: boolean;
116
+ };
117
+ /** Every reference to this binding that occurs in the queried file. */
118
+ references: EnrichedReference[];
119
+ }
98
120
  /**
99
121
  * A concrete implementation of an interface or abstract class,
100
122
  * found via `LanguageService.getImplementationAtPosition` and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zipbul/gildash",
3
- "version": "0.29.0",
3
+ "version": "0.31.0",
4
4
  "description": "TypeScript code indexing and dependency graph engine for Bun",
5
5
  "license": "MIT",
6
6
  "repository": {