@zipbul/gildash 0.10.0 → 0.12.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/dist/index.js +9 -8
- package/dist/src/gildash/context.d.ts +3 -2
- package/dist/src/gildash/graph-api.d.ts +2 -0
- package/dist/src/gildash/index.d.ts +16 -4
- package/dist/src/gildash/query-api.d.ts +4 -5
- package/dist/src/gildash/semantic-api.d.ts +20 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/semantic/index.d.ts +13 -1
- package/dist/src/semantic/type-collector.d.ts +13 -3
- package/dist/src/semantic/types.d.ts +20 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var W$=Object.defineProperty;var V$=(u)=>u;function U$(u,g){this[u]=V$.bind(null,g)}var Y$=(u,g)=>{for(var _ in g)W$(u,_,{get:g[_],enumerable:!0,configurable:!0,set:U$.bind(g,_)})};var Gg=import.meta.require;import{isErr as Eu}from"@zipbul/result";import vu from"path";import{existsSync as R0}from"fs";import{err as jg,isErr as H$}from"@zipbul/result";import{Database as L$}from"bun:sqlite";import{mkdirSync as I$,unlinkSync as Eg,existsSync as vg}from"fs";import{dirname as D$,join as bg}from"path";import{drizzle as A$}from"drizzle-orm/bun-sqlite";import{migrate as C$}from"drizzle-orm/bun-sqlite/migrator";class Y extends Error{type;constructor(u,g,_){super(g,_);this.type=u;this.name="GildashError"}}function _u(u,g,_){return new Y(u,g,_!==void 0?{cause:_}:void 0)}var Yu=".gildash",fu="gildash.db";var ug={};Y$(ug,{watcherOwner:()=>B$,symbols:()=>b,symbolChangelog:()=>$u,relations:()=>L,files:()=>a,annotations:()=>Nu});import{sql as Z$}from"drizzle-orm";import{sqliteTable as Iu,text as G,integer as uu,real as X$,index as Ju,primaryKey as K$,foreignKey as Pu,check as M$}from"drizzle-orm/sqlite-core";var a=Iu("files",{project:G("project").notNull(),filePath:G("file_path").notNull(),mtimeMs:X$("mtime_ms").notNull(),size:uu("size").notNull(),contentHash:G("content_hash").notNull(),updatedAt:G("updated_at").notNull(),lineCount:uu("line_count")},(u)=>[K$({columns:[u.project,u.filePath]})]),b=Iu("symbols",{id:uu("id").primaryKey({autoIncrement:!0}),project:G("project").notNull(),filePath:G("file_path").notNull(),kind:G("kind").notNull(),name:G("name").notNull(),startLine:uu("start_line").notNull(),startColumn:uu("start_column").notNull(),endLine:uu("end_line").notNull(),endColumn:uu("end_column").notNull(),isExported:uu("is_exported").notNull().default(0),signature:G("signature"),fingerprint:G("fingerprint"),detailJson:G("detail_json"),contentHash:G("content_hash").notNull(),indexedAt:G("indexed_at").notNull(),resolvedType:G("resolved_type"),structuralFingerprint:G("structural_fingerprint")},(u)=>[Ju("idx_symbols_project_file").on(u.project,u.filePath),Ju("idx_symbols_project_kind").on(u.project,u.kind),Ju("idx_symbols_project_name").on(u.project,u.name),Ju("idx_symbols_fingerprint").on(u.project,u.fingerprint),Pu({columns:[u.project,u.filePath],foreignColumns:[a.project,a.filePath]}).onDelete("cascade")]),L=Iu("relations",{id:uu("id").primaryKey({autoIncrement:!0}),project:G("project").notNull(),type:G("type").notNull(),srcFilePath:G("src_file_path").notNull(),srcSymbolName:G("src_symbol_name"),dstProject:G("dst_project").notNull(),dstFilePath:G("dst_file_path").notNull(),dstSymbolName:G("dst_symbol_name"),metaJson:G("meta_json")},(u)=>[Ju("idx_relations_src").on(u.project,u.srcFilePath),Ju("idx_relations_dst").on(u.dstProject,u.dstFilePath),Ju("idx_relations_type").on(u.project,u.type),Ju("idx_relations_project_type_src").on(u.project,u.type,u.srcFilePath),Pu({columns:[u.project,u.srcFilePath],foreignColumns:[a.project,a.filePath]}).onDelete("cascade"),Pu({columns:[u.dstProject,u.dstFilePath],foreignColumns:[a.project,a.filePath]}).onDelete("cascade")]),Nu=Iu("annotations",{id:uu("id").primaryKey({autoIncrement:!0}),project:G("project").notNull(),filePath:G("file_path").notNull(),tag:G("tag").notNull(),value:G("value").notNull().default(""),source:G("source").notNull(),symbolName:G("symbol_name"),startLine:uu("start_line").notNull(),startColumn:uu("start_column").notNull(),endLine:uu("end_line").notNull(),endColumn:uu("end_column").notNull(),indexedAt:G("indexed_at").notNull()},(u)=>[Ju("idx_annotations_project_file").on(u.project,u.filePath),Ju("idx_annotations_project_tag").on(u.project,u.tag),Ju("idx_annotations_project_symbol").on(u.project,u.symbolName),Pu({columns:[u.project,u.filePath],foreignColumns:[a.project,a.filePath]}).onDelete("cascade")]),$u=Iu("symbol_changelog",{id:uu("id").primaryKey({autoIncrement:!0}),project:G("project").notNull(),changeType:G("change_type").notNull(),symbolName:G("symbol_name").notNull(),symbolKind:G("symbol_kind").notNull(),filePath:G("file_path").notNull(),oldName:G("old_name"),oldFilePath:G("old_file_path"),fingerprint:G("fingerprint"),changedAt:G("changed_at").notNull(),isFullIndex:uu("is_full_index").notNull().default(0),indexRunId:G("index_run_id").notNull()},(u)=>[Ju("idx_changelog_project_changed_at").on(u.project,u.changedAt),Ju("idx_changelog_project_name").on(u.project,u.symbolName),Ju("idx_changelog_project_run").on(u.project,u.indexRunId)]),B$=Iu("watcher_owner",{id:uu("id").primaryKey(),pid:uu("pid").notNull(),startedAt:G("started_at").notNull(),heartbeatAt:G("heartbeat_at").notNull(),instanceId:G("instance_id")},(u)=>[M$("watcher_owner_singleton",Z$`${u.id} = 1`)]);class gg{client=null;drizzle=null;dbPath;txDepth=0;constructor(u){this.dbPath=bg(u.projectRoot,Yu,fu)}get drizzleDb(){if(!this.drizzle)throw Error("Database is not open. Call open() first.");return this.drizzle}open(){try{I$(D$(this.dbPath),{recursive:!0}),this.client=new L$(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=A$(this.client,{schema:ug}),C$(this.drizzle,{migrationsFolder:bg(import.meta.dirname,"migrations")});let u=this.client.prepare("PRAGMA foreign_key_check").all();if(u.length>0)throw Error(`FK integrity violation after migration: ${JSON.stringify(u.slice(0,5))}`);this.client.run("PRAGMA foreign_keys = ON"),this.registerRegexpUdf(this.client)}catch(u){if(this.isCorruptionError(u)&&vg(this.dbPath)){this.closeClient(),Eg(this.dbPath);for(let _ of["-wal","-shm"]){let $=this.dbPath+_;if(vg($))Eg($)}let g=this.open();if(H$(g))return jg(_u("store",`Failed to recover database at ${this.dbPath}`,g.data));return g}return jg(_u("store",`Failed to open database at ${this.dbPath}`,u))}}close(){this.closeClient(),this.drizzle=null}transaction(u){let g=this.requireClient();if(this.txDepth===0){this.txDepth++;try{return g.transaction(()=>u(this))()}finally{this.txDepth--}}let _=`sp_${this.txDepth++}`;g.run(`SAVEPOINT "${_}"`);try{let $=u(this);return g.run(`RELEASE SAVEPOINT "${_}"`),$}catch($){throw g.run(`ROLLBACK TO SAVEPOINT "${_}"`),g.run(`RELEASE SAVEPOINT "${_}"`),$}finally{this.txDepth--}}immediateTransaction(u){let g=this.requireClient();this.txDepth++,g.run("BEGIN IMMEDIATE");try{let _=u();return g.run("COMMIT"),_}catch(_){throw g.run("ROLLBACK"),_}finally{this.txDepth--}}getTableNames(){return this.requireClient().query("SELECT name FROM sqlite_master WHERE type = 'table'").all().map((g)=>g.name)}selectOwner(){return this.requireClient().prepare("SELECT pid, heartbeat_at, instance_id FROM watcher_owner WHERE id = 1").get()??void 0}insertOwner(u,g){let _=new Date().toISOString();this.requireClient().prepare("INSERT INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(u,_,_,g??null)}replaceOwner(u,g){let _=new Date().toISOString();this.requireClient().prepare("INSERT OR REPLACE INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(u,_,_,g??null)}touchOwner(u){let g=new Date().toISOString();this.requireClient().prepare("UPDATE watcher_owner SET heartbeat_at = ? WHERE id = 1 AND pid = ?").run(g,u)}deleteOwner(u){this.requireClient().prepare("DELETE FROM watcher_owner WHERE id = 1 AND pid = ?").run(u)}registerRegexpUdf(u){let g=u;if(typeof g.function!=="function")return;g.function.call(u,"regexp",(_,$)=>{try{return new RegExp(_).test($)?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(u){if(!(u instanceof Error))return!1;let g=u.message.toLowerCase();return g.includes("malformed")||g.includes("corrupt")||g.includes("not a database")||g.includes("disk i/o error")||g.includes("sqlite_corrupt")}}import{eq as ku,and as fg}from"drizzle-orm";class _g{db;constructor(u){this.db=u}getFile(u,g){return this.db.drizzleDb.select().from(a).where(fg(ku(a.project,u),ku(a.filePath,g))).get()??null}upsertFile(u){this.db.drizzleDb.insert(a).values({project:u.project,filePath:u.filePath,mtimeMs:u.mtimeMs,size:u.size,contentHash:u.contentHash,updatedAt:u.updatedAt,lineCount:u.lineCount??null}).onConflictDoUpdate({target:[a.project,a.filePath],set:{mtimeMs:u.mtimeMs,size:u.size,contentHash:u.contentHash,updatedAt:u.updatedAt,lineCount:u.lineCount??null}}).run()}getAllFiles(u){return this.db.drizzleDb.select().from(a).where(ku(a.project,u)).all()}getFilesMap(u){let g=this.getAllFiles(u),_=new Map;for(let $ of g)_.set($.filePath,$);return _}deleteFile(u,g){this.db.drizzleDb.delete(a).where(fg(ku(a.project,u),ku(a.filePath,g))).run()}}import{eq as t,and as Ku,sql as yu,count as S$}from"drizzle-orm";function Du(u){return u.replaceAll("\x00","").trim().split(/\s+/).map((g)=>g.trim()).filter((g)=>g.length>0).map((g)=>`"${g.replaceAll('"','""')}"*`).join(" ")}var Pg=50;class $g{db;constructor(u){this.db=u}replaceFileSymbols(u,g,_,$){if(this.db.drizzleDb.delete(b).where(Ku(t(b.project,u),t(b.filePath,g))).run(),!$.length)return;let J=new Date().toISOString(),O=$.map((Q)=>({project:u,filePath:g,kind:Q.kind??"unknown",name:Q.name??"",startLine:Q.startLine??0,startColumn:Q.startColumn??0,endLine:Q.endLine??0,endColumn:Q.endColumn??0,isExported:Q.isExported??0,signature:Q.signature??null,fingerprint:Q.fingerprint??null,detailJson:Q.detailJson??null,contentHash:_,indexedAt:Q.indexedAt??J,resolvedType:Q.resolvedType??null,structuralFingerprint:Q.structuralFingerprint??null}));for(let Q=0;Q<O.length;Q+=Pg)this.db.drizzleDb.insert(b).values(O.slice(Q,Q+Pg)).run()}getFileSymbols(u,g){return this.db.drizzleDb.select().from(b).where(Ku(t(b.project,u),t(b.filePath,g))).all()}searchByName(u,g,_={}){let $=_.limit??50,J=Du(g);if(!J)return[];return this.db.drizzleDb.select().from(b).where(Ku(yu`${b.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${J})`,t(b.project,u),_.kind?t(b.kind,_.kind):void 0)).orderBy(b.name).limit($).all()}searchByKind(u,g){return this.db.drizzleDb.select().from(b).where(Ku(t(b.project,u),t(b.kind,g))).orderBy(b.name).all()}getStats(u){let g=this.db.drizzleDb.select({symbolCount:S$(),fileCount:yu`COUNT(DISTINCT ${b.filePath})`}).from(b).where(t(b.project,u)).get();return{symbolCount:g?.symbolCount??0,fileCount:g?.fileCount??0}}getByFingerprint(u,g){return this.db.drizzleDb.select().from(b).where(Ku(t(b.project,u),t(b.fingerprint,g))).all()}deleteFileSymbols(u,g){this.db.drizzleDb.delete(b).where(Ku(t(b.project,u),t(b.filePath,g))).run()}searchByQuery(u){let g=this.db.drizzleDb.select().from(b).where(Ku(u.ftsQuery?yu`${b.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${u.ftsQuery})`:void 0,u.exactName?t(b.name,u.exactName):void 0,u.project!==void 0?t(b.project,u.project):void 0,u.kind?t(b.kind,u.kind):void 0,u.filePath!==void 0?t(b.filePath,u.filePath):void 0,u.isExported!==void 0?t(b.isExported,u.isExported?1:0):void 0,u.decorator?yu`${b.id} IN (SELECT s.id FROM symbols s, json_each(s.detail_json, '$.decorators') je WHERE json_extract(je.value, '$.name') = ${u.decorator})`:void 0,u.resolvedType!==void 0?t(b.resolvedType,u.resolvedType):void 0)).orderBy(b.name);if(!u.regex)return g.limit(u.limit).all();let _;try{_=new RegExp(u.regex)}catch{throw new Y("validation",`Invalid regex pattern: ${u.regex}`)}let $=[];for(let J of[5,20,100]){let O=u.limit*J,Q=g.limit(O).all();if($=Q.filter((z)=>_.test(z.name)),$.length>=u.limit||Q.length<O)return $.slice(0,u.limit)}return $.slice(0,u.limit)}}import{eq as l,and as Wu,isNull as yg,or as R$}from"drizzle-orm";class Jg{db;constructor(u){this.db=u}replaceFileRelations(u,g,_){this.db.transaction(($)=>{if($.drizzleDb.delete(L).where(Wu(l(L.project,u),l(L.srcFilePath,g))).run(),!_.length)return;for(let J of _)$.drizzleDb.insert(L).values({project:u,type:J.type??"unknown",srcFilePath:J.srcFilePath??g,srcSymbolName:J.srcSymbolName??null,dstProject:J.dstProject??u,dstFilePath:J.dstFilePath??"",dstSymbolName:J.dstSymbolName??null,metaJson:J.metaJson??null}).run()})}getOutgoing(u,g,_){if(_!==void 0)return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(l(L.project,u),l(L.srcFilePath,g),R$(l(L.srcSymbolName,_),yg(L.srcSymbolName)))).all();return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(l(L.project,u),l(L.srcFilePath,g))).all()}getIncoming(u){let{dstProject:g,dstFilePath:_}=u;return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(l(L.dstProject,g),l(L.dstFilePath,_))).all()}getByType(u,g){return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(l(L.project,u),l(L.type,g))).all()}deleteFileRelations(u,g){this.db.drizzleDb.delete(L).where(Wu(l(L.project,u),l(L.srcFilePath,g))).run()}searchRelations(u){return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(u.project!==void 0?l(L.project,u.project):void 0,u.srcFilePath!==void 0?l(L.srcFilePath,u.srcFilePath):void 0,u.srcSymbolName!==void 0?l(L.srcSymbolName,u.srcSymbolName):void 0,u.dstProject!==void 0?l(L.dstProject,u.dstProject):void 0,u.dstFilePath!==void 0?l(L.dstFilePath,u.dstFilePath):void 0,u.dstSymbolName!==void 0?l(L.dstSymbolName,u.dstSymbolName):void 0,u.type!==void 0?l(L.type,u.type):void 0)).limit(u.limit).all()}retargetRelations(u){let{dstProject:g,oldFile:_,oldSymbol:$,newFile:J,newSymbol:O,newDstProject:Q}=u,z=$===null?Wu(l(L.dstProject,g),l(L.dstFilePath,_),yg(L.dstSymbolName)):Wu(l(L.dstProject,g),l(L.dstFilePath,_),l(L.dstSymbolName,$)),N={dstFilePath:J,dstSymbolName:O};if(Q!==void 0)N.dstProject=Q;this.db.drizzleDb.update(L).set(N).where(z).run()}}import{err as mg}from"@zipbul/result";import{subscribe as n$}from"@parcel/watcher";import Ng from"path";var k$=["**/.git/**",`**/${Yu}/**`,"**/dist/**","**/node_modules/**"],T$=new Set(["package.json","tsconfig.json"]);function q$(u){return u.replaceAll("\\","/")}function F$(u){if(u==="update")return"change";if(u==="create")return"create";return"delete"}class Qg{#u;#g;#_;#J;#$;#N;constructor(u,g=n$,_=console){this.#g=u.projectRoot,this.#_=[...k$,...u.ignorePatterns??[]],this.#J=new Set((u.extensions??[".ts",".mts",".cts"]).map(($)=>$.toLowerCase())),this.#$=g,this.#N=_}async start(u){try{this.#u=await this.#$(this.#g,(g,_)=>{if(g){this.#N.error(_u("watcher","Callback error",g));return}try{for(let $ of _){let J=q$(Ng.relative(this.#g,$.path));if(J.startsWith(".."))continue;let O=Ng.basename(J),Q=Ng.extname(J).toLowerCase();if(!T$.has(O)&&!this.#J.has(Q))continue;if(J.endsWith(".d.ts"))continue;u({eventType:F$($.type),filePath:J})}}catch($){this.#N.error(_u("watcher","Callback error",$))}},{ignore:this.#_})}catch(g){return mg(_u("watcher","Failed to subscribe watcher",g))}}async close(){if(!this.#u)return;try{await this.#u.unsubscribe(),this.#u=void 0}catch(u){return mg(_u("watcher","Failed to close watcher",u))}}}import zg from"path";import{promises as G$}from"fs";var j$=["**/node_modules/**","**/.git/**",`**/${Yu}/**`,"**/dist/**"];async function mu(u){let g=[];for await(let _ of G$.glob("**/package.json",{cwd:u,exclude:j$})){let $=zg.dirname(_).replaceAll("\\","/"),J=zg.join(u,_),O=await Bun.file(J).json(),Q=typeof O?.name==="string"&&O.name.length>0?O.name:zg.basename($==="."?u:$);g.push({dir:$,project:Q})}return g.sort((_,$)=>$.dir.length-_.dir.length),g}function r(u,g,_="default"){let $=u.replaceAll("\\","/");for(let J of g){if(J.dir===".")return J.project;if($===J.dir||$.startsWith(`${J.dir}/`))return J.project}return _}import hg from"path";var Zu=new Map;async function E$(u){let g=Bun.file(u);if(!await g.exists())return null;try{let _=await g.text(),$=Bun.JSONC.parse(_);return typeof $==="object"&&$!==null?$:null}catch{return null}}async function Tu(u){if(Zu.has(u))return Zu.get(u)??null;let g=hg.join(u,"tsconfig.json"),_=await E$(g);if(!_)return Zu.set(u,null),null;let $=typeof _.compilerOptions==="object"&&_.compilerOptions!==null?_.compilerOptions:null;if(!$)return Zu.set(u,null),null;let J=typeof $.baseUrl==="string"?$.baseUrl:null,O=typeof $.paths==="object"&&$.paths!==null?$.paths:null;if(!J&&!O)return Zu.set(u,null),null;let Q=J?hg.resolve(u,J):u,z=new Map;if(O)for(let[W,w]of Object.entries(O)){if(!Array.isArray(w))continue;let V=w.filter((X)=>typeof X==="string");z.set(W,V)}let N={baseUrl:Q,paths:z};return Zu.set(u,N),N}function hu(u){if(u){Zu.delete(u);return}Zu.clear()}import ig from"path";function iu(u,g){return ig.relative(u,g).replaceAll("\\","/")}function Au(u,g){return ig.resolve(u,g)}function Qu(u){let g=Bun.hash.xxHash64(u);return BigInt.asUintN(64,BigInt(g)).toString(16).padStart(16,"0")}import{isErr as eg}from"@zipbul/result";import{err as v$}from"@zipbul/result";import{parseSync as b$}from"oxc-parser";function qu(u,g,_,$=b$){try{let{program:J,errors:O,comments:Q}=$(u,g,_);return{filePath:u,program:J,errors:O,comments:Q,sourceText:g}}catch(J){return v$(_u("parse",`Failed to parse file: ${u}`,J))}}import{promises as f$}from"fs";import{join as P$}from"path";async function xg(u){let{projectRoot:g,extensions:_,ignorePatterns:$,fileRepo:J}=u,O=J.getFilesMap(),Q=new Set,z=[],N=[],W=$.map((V)=>new Bun.Glob(V));for await(let V of f$.glob("**/*",{cwd:g})){if(!_.some((Z)=>V.endsWith(Z)))continue;if(V.startsWith("node_modules/")||V.includes("/node_modules/"))continue;if(W.some((Z)=>Z.match(V)))continue;Q.add(V);let X=P$(g,V),M=Bun.file(X),{size:I,lastModified:A}=M,T=O.get(V);if(!T){let Z=await M.text(),K=Qu(Z);z.push({filePath:V,contentHash:K,mtimeMs:A,size:I});continue}if(T.mtimeMs===A&&T.size===I){N.push({filePath:V,contentHash:T.contentHash,mtimeMs:A,size:I});continue}let q=await M.text(),h=Qu(q);if(h===T.contentHash)N.push({filePath:V,contentHash:h,mtimeMs:A,size:I});else z.push({filePath:V,contentHash:h,mtimeMs:A,size:I})}let w=[];for(let V of O.keys())if(!Q.has(V))w.push(V);return{changed:z,unchanged:N,deleted:w}}function xu(u){let g=[0];for(let _=0;_<u.length;_++)if(u[_]===`
|
|
3
|
-
`)g.push(_+1);return g}function zu(u,g){let _=0,$=u.length-1;while(_<$){let J=_+$+1>>1;if(u[J]<=g)_=J;else $=J-1}return{line:_+1,column:g-u[_]}}import{err as y$}from"@zipbul/result";import{parse as m$}from"comment-parser";function pu(u){try{let g=u.trim();if(g.startsWith("/**"))g=g.slice(3);if(g.endsWith("*/"))g=g.slice(0,-2);let $=m$(`/** ${g} */`)[0]??{description:"",tags:[]};return{description:($.description??"").trim(),tags:($.tags??[]).map((J)=>({tag:J.tag??"",name:J.name??"",type:J.type??"",description:J.description??"",optional:J.optional??!1,...J.default!==void 0?{default:J.default}:{}}))}}catch(g){return y$(_u("parse","Failed to parse JSDoc comment",g))}}import{isErr as h$}from"@zipbul/result";function Cu(u){let{program:g,sourceText:_,comments:$}=u,J=xu(_),O=$.filter((Z)=>Z.type==="Block"&&Z.value.startsWith("*")).sort((Z,K)=>Z.end-K.end),Q=g.body.map((Z)=>Z.start??0).sort((Z,K)=>Z-K);function z(Z,K){return{start:zu(J,Z),end:zu(J,K)}}function N(Z){let K=0,B=O.length-1,R=-1;while(K<=B){let S=K+B>>>1;if(O[S].end<=Z)R=S,K=S+1;else B=S-1}if(R<0)return;let k=O[R];K=0,B=Q.length-1;while(K<=B){let S=K+B>>>1,j=Q[S];if(j<=k.end)K=S+1;else if(j>=Z)B=S-1;else return}return`/*${k.value}*/`}function W(Z){if(!Z)return;let K=Z.typeAnnotation??Z;return _.slice(K.start,K.end)}function w(Z){if(!Z||Z.length===0)return[];return Z.map((K)=>{let B=K.expression;if(!B)return{name:"unknown"};if(B.type==="CallExpression"){let R=B.callee?.name??B.callee?.property?.name??"unknown",k=(B.arguments??[]).map((S)=>_.slice(S.start,S.end));return{name:R,arguments:k.length>0?k:void 0}}if(B.type==="Identifier")return{name:B.name??"unknown"};return{name:_.slice(B.start,B.end)}})}function V(Z){let K=Z.type==="TSParameterProperty"?Z.parameter:Z;if(K?.type==="RestElement"){let v=`...${K.argument?.name??"unknown"}`,x=K.typeAnnotation,gu=x?W(x):void 0,d={name:v,isOptional:!1};if(gu)d.type=gu;return d}if(K?.type==="AssignmentPattern"){let{left:f,right:v}=K,x=f?.name??"unknown",gu=f?.typeAnnotation,d=gu?W(gu):void 0,e=_.slice(v.start,v.end),U=w(f?.decorators??[]),D={name:x,isOptional:!0,defaultValue:e};if(d)D.type=d;if(U.length>0)D.decorators=U;return D}let B=K?.name??K?.pattern?.name??"unknown",R=!!K?.optional,k=K?.typeAnnotation,S=k?W(k):void 0,j=w(K?.decorators??[]),P={name:B,isOptional:R};if(S)P.type=S;if(j.length>0)P.decorators=j;return P}function X(Z,K){let B=[];if(K?.async)B.push("async");if(Z.static)B.push("static");if(Z.abstract)B.push("abstract");if(Z.readonly)B.push("readonly");if(Z.override)B.push("override");if(Z.declare)B.push("declare");if(Z.const)B.push("const");let R=Z.accessibility;if(R==="private")B.push("private");else if(R==="protected")B.push("protected");else if(R==="public")B.push("public");return B}function M(Z){let K=[];if(Z.superClass){let R=_.slice(Z.superClass.start,Z.superClass.end);K.push({kind:"extends",name:R})}let B=Z.implements??[];for(let R of B){let k=R.expression??R,S=_.slice(k.start,k.end);K.push({kind:"implements",name:S})}return K}function I(Z){let K=[];for(let B of Z.extends??[]){let R=B.expression??B,k=_.slice(R.start,R.end);K.push({kind:"extends",name:k})}return K}function A(Z){let K=[];for(let B of Z)if(B.type==="MethodDefinition"){let R=B.key?.name??"unknown",k=B.value,S=B.kind??"method",j=S==="constructor"?"constructor":S==="get"?"getter":S==="set"?"setter":"method",P=X(B,k),f=(k?.params??[]).map(V),v=W(k?.returnType),x={kind:"method",name:R,span:z(B.start,B.end),isExported:!1,methodKind:j,modifiers:P,parameters:f.length>0?f:void 0,returnType:v};K.push(x)}else if(B.type==="PropertyDefinition"){let R=B.key?.name??"unknown",k=X(B),S={kind:"property",name:R,span:z(B.start,B.end),isExported:!1,modifiers:k};K.push(S)}return K}function T(Z){let K=[];for(let B of Z)if(B.type==="TSMethodSignature"){let R=B.key?.name??"unknown",k=(B.params??[]).map(V),S=W(B.returnType);K.push({kind:"method",name:R,span:z(B.start,B.end),isExported:!1,modifiers:[],methodKind:"method",parameters:k.length>0?k:void 0,returnType:S})}else if(B.type==="TSPropertySignature"){let R=B.key?.name??"unknown",k=W(B.typeAnnotation),S={kind:"property",name:R,span:z(B.start,B.end),isExported:!1,modifiers:B.readonly?["readonly"]:[],returnType:k};K.push(S)}return K}function q(Z,K){let B=Z.type??"";if(B==="FunctionDeclaration"){let R=Z.id?.name??"default",k=(Z.params??[]).map(V),S=W(Z.returnType),j=X(Z,Z),P=w(Z.decorators??[]),f=Z.typeParameters?.params?.flatMap((x)=>{let gu=x.name?.name;return gu?[gu]:[]})||void 0,v={kind:"function",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:j,parameters:k.length>0?k:void 0,returnType:S,decorators:P.length>0?P:void 0};if(f&&f.length>0)v.typeParameters=f;return v}if(B==="ClassDeclaration"||B==="ClassExpression"){let R=Z.id?.name??"default",k=M(Z),S=A(Z.body?.body??[]),j=w(Z.decorators??[]),P=X(Z,Z),f=Z.typeParameters?.params?.flatMap((x)=>{let gu=x.name?.name;return gu?[gu]:[]})||void 0,v={kind:"class",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:P,heritage:k.length>0?k:void 0,members:S.length>0?S:void 0,decorators:j.length>0?j:void 0};if(f&&f.length>0)v.typeParameters=f;return v}if(B==="VariableDeclaration"){let R=[];for(let k of Z.declarations??[]){let{id:S,init:j}=k;if(S?.type==="ObjectPattern"){for(let d of S.properties??[]){let e=d.value?.name??d.key?.name??"unknown";R.push({kind:"variable",name:e,span:z(d.start??k.start,d.end??k.end),isExported:K,modifiers:[]})}continue}if(S?.type==="ArrayPattern"){for(let d of S.elements??[]){if(!d||d.type!=="Identifier")continue;let e=d.name??"unknown";R.push({kind:"variable",name:e,span:z(d.start??k.start,d.end??k.end),isExported:K,modifiers:[]})}continue}let P=S?.name??"unknown",f="variable",v,x;if(j?.type==="FunctionExpression"||j?.type==="ArrowFunctionExpression")f="function",v=(j.params??[]).map(V),x=W(j.returnType);let gu=[];R.push({kind:f,name:P,span:z(k.start,k.end),isExported:K,modifiers:gu,parameters:v,returnType:x})}if(R.length===0)return null;if(R.length===1)return R[0];return R}if(B==="TSTypeAliasDeclaration")return{kind:"type",name:Z.id?.name??"unknown",span:z(Z.start,Z.end),isExported:K,modifiers:[]};if(B==="TSInterfaceDeclaration"){let R=Z.id?.name??"unknown",k=I(Z),S=T(Z.body?.body??[]),j=Z.typeParameters?.params?.flatMap((f)=>{let v=f.name?.name;return v?[v]:[]})||void 0,P={kind:"interface",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:[],heritage:k.length>0?k:void 0,members:S.length>0?S:void 0};if(j&&j.length>0)P.typeParameters=j;return P}if(B==="TSEnumDeclaration"){let R=Z.id?.name??"unknown",k=X(Z),j=(Z.body?.members??[]).map((P)=>({kind:"property",name:P.id?.name??P.id?.value??"unknown",span:z(P.start,P.end),isExported:!1,modifiers:[]}));return{kind:"enum",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:k,members:j.length>0?j:void 0}}return null}let h=[];for(let Z of g.body){let K=null,B=Z,R=typeof B.type==="string"?B.type:"";if(R==="ExportNamedDeclaration"){let S=Z;if(S.declaration){if(K=q(S.declaration,!0),K&&!Array.isArray(K))K.span=z(S.start,S.end);else if(Array.isArray(K))for(let j of K)j.span=z(S.start,S.end)}}else if(R==="ExportDefaultDeclaration"){let S=Z,j=S.declaration;if(j){if(K=q(j,!0),K&&!Array.isArray(K))K.name=j.id?.name??"default",K.isExported=!0,K.span=z(S.start,S.end)}}else K=q(Z,!1);let k=Array.isArray(K)?K:K?[K]:[];for(let S of k){let j=Z.start??0,P=N(j);if(P){let f=pu(P);if(!h$(f))S.jsDoc=f}h.push(S)}}return h}function i$(u){if(u.kind==="function"||u.kind==="method"){let g=u.parameters?.length??0,_=u.modifiers.includes("async")?1:0;return`params:${g}|async:${_}`}return null}function x$(u){let g={};if(u.jsDoc)g.jsDoc=u.jsDoc;if(u.kind==="function"||u.kind==="method"){if(u.parameters!==void 0)g.parameters=u.parameters;if(u.returnType!==void 0)g.returnType=u.returnType}if(u.heritage?.length)g.heritage=u.heritage;if(u.decorators?.length)g.decorators=u.decorators;if(u.typeParameters?.length)g.typeParameters=u.typeParameters;if(u.modifiers?.length)g.modifiers=u.modifiers;if(u.members?.length)g.members=u.members.map((_)=>{let $=_.modifiers.find((J)=>J==="private"||J==="protected"||J==="public");return{name:_.name,kind:_.methodKind??_.kind,type:_.returnType,visibility:$,isStatic:_.modifiers.includes("static")||void 0,isReadonly:_.modifiers.includes("readonly")||void 0}});return Object.keys(g).length>0?JSON.stringify(g):null}function p$(u){let g=[u.kind];if(u.modifiers.length)g.push(`mod:${[...u.modifiers].sort().join(",")}`);if(u.typeParameters?.length)g.push(`tp:${u.typeParameters.length}`);if(u.heritage?.length){let _=[...u.heritage].sort(($,J)=>$.name.localeCompare(J.name)).map(($)=>`${$.kind}:${$.name}`).join(",");g.push(`her:${_}`)}if(u.decorators?.length)g.push(`dec:${[...u.decorators].map((_)=>_.name).sort().join(",")}`);if(u.methodKind)g.push(`mk:${u.methodKind}`);if(u.parameters)g.push(`p:${u.parameters.length}`);if(u.returnType)g.push(`rt:${u.returnType}`);if(u.members?.length){let _=u.members.map(($)=>`${$.kind}:${$.modifiers.join(",")}:${$.parameters?.length??""}:${$.returnType??""}`).sort().join(";");g.push(`mem:${u.members.length}:${Qu(_)}`)}return Qu(g.join("|"))}function pg(u,g,_,$,J){let O=i$(u),Q=Qu(`${g}|${u.kind}|${O??""}`),z=p$(u);return{project:_,filePath:$,kind:u.kind,name:g,startLine:u.span.start.line,startColumn:u.span.start.column,endLine:u.span.end.line,endColumn:u.span.end.column,isExported:u.isExported?1:0,signature:O,fingerprint:Q,detailJson:x$(u),contentHash:J,indexedAt:new Date().toISOString(),structuralFingerprint:z}}function Og(u){let{parsed:g,project:_,filePath:$,contentHash:J,symbolRepo:O}=u,Q=Cu(g),z=[];for(let N of Q){z.push(pg(N,N.name,_,$,J));for(let W of N.members??[])z.push(pg(W,`${N.name}.${W.name}`,_,$,J))}O.replaceFileSymbols(_,$,J,z)}import{resolve as wg,dirname as l$,extname as d$}from"path";function Mu(u,g,_){let $=(J)=>{let O=d$(J);if(O==="")return[J+".ts",J+".d.ts",J+"/index.ts",J+"/index.d.ts",J+".mts",J+"/index.mts",J+".cts",J+"/index.cts"];if(O===".js")return[J.slice(0,-3)+".ts"];if(O===".mjs")return[J.slice(0,-4)+".mts"];if(O===".cjs")return[J.slice(0,-4)+".cts"];return[J]};if(g.startsWith(".")){let J=wg(l$(u),g);return $(J)}if(_)for(let[J,O]of _.paths){if(O.length===0)continue;let Q=J.indexOf("*");if(Q===-1){if(g===J){let z=[];for(let N of O)z.push(...$(wg(_.baseUrl,N)));return z}}else{let z=J.slice(0,Q),N=J.slice(Q+1);if(g.startsWith(z)&&(N===""||g.endsWith(N))){let W=g.slice(z.length,N===""?void 0:g.length-N.length),w=[];for(let V of O)w.push(...$(wg(_.baseUrl,V.replace("*",W))));return w}}}return[]}function lg(u,g,_,$=Mu){let J=new Map,O=u.body??[];for(let Q of O){if(Q.type!=="ImportDeclaration")continue;let z=Q.source?.value??"",N=$(g,z,_);if(N.length===0)continue;let W=N[0],w=Q.specifiers??[];for(let V of w)switch(V.type){case"ImportSpecifier":J.set(V.local.name,{path:W,importedName:V.imported.name});break;case"ImportDefaultSpecifier":J.set(V.local.name,{path:W,importedName:"default"});break;case"ImportNamespaceSpecifier":J.set(V.local.name,{path:W,importedName:"*"});break}}return J}var r$=new Set(["loc","start","end","scope"]);function Su(u,g){if(!u||typeof u!=="object")return;if(Array.isArray(u)){for(let $ of u)Su($,g);return}let _=u;g(_);for(let $ of Object.keys(_)){if(r$.has($))continue;let J=_[$];if(J&&typeof J==="object")Su(J,g)}}function dg(u){if(!u||typeof u!=="object"||Array.isArray(u))return null;let g=u;if((g.type==="StringLiteral"||g.type==="Literal")&&typeof g.value==="string")return g.value;return null}function Bu(u){if(!u||typeof u!=="object"||Array.isArray(u))return null;let g=u;if(g.type==="Identifier"){let _=g.name;return{root:_,parts:[],full:_}}if(g.type==="ThisExpression")return{root:"this",parts:[],full:"this"};if(g.type==="Super")return{root:"super",parts:[],full:"super"};if(g.type==="MemberExpression"){let _=[],$=g;while($.type==="MemberExpression"){let Q=$.property;if(!Q||typeof Q.name!=="string")return null;_.push(Q.name),$=$.object}let J;if($.type==="Identifier")J=$.name;else if($.type==="ThisExpression")J="this";else if($.type==="Super")J="super";else return null;_.reverse();let O=[J,..._].join(".");return{root:J,parts:_,full:O}}return null}function rg(u,g,_,$=Mu){let J=[],O=u.body??[];for(let Q of O){if(Q.type==="ImportDeclaration"){let z=Q.source?.value??"",N=$(g,z,_);if(N.length===0)continue;let W=N[0],w=Q.importKind==="type",V=Q.specifiers??[];if(V.length===0){let X={};if(w)X.isType=!0;J.push({type:w?"type-references":"imports",srcFilePath:g,srcSymbolName:null,dstFilePath:W,dstSymbolName:null,...Object.keys(X).length>0?{metaJson:JSON.stringify(X)}:{}})}else for(let X of V){let M=X.type,I=w||X.importKind==="type",A={};if(I)A.isType=!0;let T,q;if(M==="ImportDefaultSpecifier")T="default",q=X.local.name;else if(M==="ImportNamespaceSpecifier")T="*",q=X.local.name,A.importKind="namespace";else T=X.imported.name,q=X.local.name;J.push({type:I?"type-references":"imports",srcFilePath:g,srcSymbolName:q,dstFilePath:W,dstSymbolName:T,...Object.keys(A).length>0?{metaJson:JSON.stringify(A)}:{}})}continue}if(Q.type==="ExportAllDeclaration"&&Q.source){let z=Q.source?.value??"",N=$(g,z,_);if(N.length===0)continue;let W=N[0],w=Q.exportKind==="type",V={isReExport:!0};if(w)V.isType=!0;J.push({type:w?"type-references":"re-exports",srcFilePath:g,srcSymbolName:null,dstFilePath:W,dstSymbolName:null,metaJson:JSON.stringify(V)});continue}if(Q.type==="ExportNamedDeclaration"&&Q.source){let z=Q.source?.value??"",N=$(g,z,_);if(N.length===0)continue;let W=N[0],w=Q.exportKind==="type",M={isReExport:!0,specifiers:(Q.specifiers??[]).map((I)=>({local:I.local.name,exported:I.exported.name}))};if(w)M.isType=!0;J.push({type:w?"type-references":"re-exports",srcFilePath:g,srcSymbolName:null,dstFilePath:W,dstSymbolName:null,metaJson:JSON.stringify(M)})}}return Su(u,(Q)=>{if(Q.type!=="ImportExpression")return;let z=dg(Q.source);if(!z)return;let N=$(g,z,_);if(N.length===0)return;let W=N[0];J.push({type:"imports",srcFilePath:g,srcSymbolName:null,dstFilePath:W,dstSymbolName:null,metaJson:JSON.stringify({isDynamic:!0})})}),J}function cg(u,g,_){let $=[],J=[],O=[];function Q(){if(J.length>0)return J[J.length-1]??null;return null}function z(W){if(!W)return null;let w=_.get(W.root);if(W.parts.length===0){if(w)return{dstFilePath:w.path,dstSymbolName:w.importedName,resolution:"import"};return{dstFilePath:g,dstSymbolName:W.root,resolution:"local"}}else{if(w&&w.importedName==="*"){let V=W.parts[W.parts.length-1];return{dstFilePath:w.path,dstSymbolName:V,resolution:"namespace"}}return{dstFilePath:g,dstSymbolName:W.full,resolution:"local-member"}}}function N(W){if(!W||typeof W!=="object")return;if(Array.isArray(W)){for(let X of W)N(X);return}let w=W,V=typeof w.type==="string"?w.type:"";if(V==="ClassDeclaration"||V==="ClassExpression"){let X=w,M=X.id?.name??"AnonymousClass";O.push(M),N(X.body),O.pop();return}if(V==="FunctionDeclaration"){let X=w,M=X.id?.name??"anonymous";J.push(M),N(X.body),J.pop();return}if(V==="VariableDeclarator"&&w.init&&(w.init?.type==="FunctionExpression"||w.init?.type==="ArrowFunctionExpression")){let X=w,M=X.id?.name??"anonymous";J.push(M),N(X.init?.body??X.init),J.pop();return}if(V==="MethodDefinition"&&w.value){let X=w,M=O[O.length-1]??"",I=X.key?.name??"anonymous",A=M?`${M}.${I}`:I;J.push(A),N(X.value?.body),J.pop();return}if(V==="FunctionExpression"||V==="ArrowFunctionExpression"){let X=Q(),M=X?`${X}.<anonymous>`:"<anonymous>";J.push(M),N(w.body),J.pop();return}if(V==="CallExpression"){let X=w,M=Bu(X.callee),I=z(M);if(I){let A=Q(),T={};if(A===null)T.scope="module";$.push({type:"calls",srcFilePath:g,srcSymbolName:A,dstFilePath:I.dstFilePath,dstSymbolName:I.dstSymbolName,...Object.keys(T).length>0?{metaJson:JSON.stringify(T)}:{}})}N(X.callee);for(let A of X.arguments??[])N(A);return}if(V==="NewExpression"){let X=w,M=Bu(X.callee),I=z(M);if(I){let A=Q(),T={isNew:!0};if(A===null)T.scope="module";$.push({type:"calls",srcFilePath:g,srcSymbolName:A,dstFilePath:I.dstFilePath,dstSymbolName:I.dstSymbolName,metaJson:JSON.stringify(T)})}for(let A of X.arguments??[])N(A);return}for(let X of Object.keys(w)){if(X==="loc"||X==="start"||X==="end"||X==="scope")continue;let M=w[X];if(M&&typeof M==="object")N(M)}}return N(u),$}function ag(u,g,_){let $=[];return Su(u,(J)=>{if(J.type==="TSInterfaceDeclaration"){let z=J.id?.name??"AnonymousInterface",N=J.extends??[];for(let W of N){let w=W.expression??W,V=Bu(w);if(!V)continue;let X=Wg(V,g,_);$.push({type:"extends",srcFilePath:g,srcSymbolName:z,...X})}return}if(J.type!=="ClassDeclaration"&&J.type!=="ClassExpression")return;let O=J.id?.name??"AnonymousClass";if(J.superClass){let z=Bu(J.superClass);if(z){let N=Wg(z,g,_);$.push({type:"extends",srcFilePath:g,srcSymbolName:O,...N})}}let Q=J.implements??[];for(let z of Q){let N=z.expression??z,W=Bu(N);if(!W)continue;let w=Wg(W,g,_);$.push({type:"implements",srcFilePath:g,srcSymbolName:O,...w})}}),$}function Wg(u,g,_){let $=_.get(u.root);if($){if($.importedName==="*"){let J=u.parts[u.parts.length-1]??u.root;return{dstFilePath:$.path,dstSymbolName:J,metaJson:JSON.stringify({isNamespaceImport:!0})}}return{dstFilePath:$.path,dstSymbolName:u.parts.length>0?u.full:$.importedName}}return{dstFilePath:g,dstSymbolName:u.full,metaJson:JSON.stringify({isLocal:!0})}}function lu(u,g,_,$=Mu){let J=lg(u,g,_,$),O=rg(u,g,_,$),Q=cg(u,g,J),z=ag(u,g,J);return[...O,...Q,...z]}function Vg(u){let{ast:g,project:_,filePath:$,relationRepo:J,projectRoot:O,tsconfigPaths:Q,knownFiles:z,boundaries:N}=u,W=Au(O,$),V=lu(g,W,Q,z?(M,I,A)=>{let T=Mu(M,I,A);for(let q of T){let h=iu(O,q);if(N){let Z=r(h,N);if(z.has(`${Z}::${h}`))return[q]}else if(z.has(`${_}::${h}`))return[q]}return[]}:void 0),X=[];for(let M of V){let I=iu(O,M.dstFilePath);if(I.startsWith(".."))continue;let A=iu(O,M.srcFilePath),T=N?r(I,N):_;X.push({project:_,type:M.type,srcFilePath:A,srcSymbolName:M.srcSymbolName??null,dstProject:T,dstFilePath:I,dstSymbolName:M.dstSymbolName??null,metaJson:M.metaJson??null})}return J.replaceFileRelations(_,$,X),X.length}import{isErr as c$}from"@zipbul/result";var sg=/(?:^|\s)@([a-zA-Z][\w-]*\w|[a-zA-Z])\s*(.*)$/m;function a$(u){let g=Cu(u),_=[];for(let $ of g){_.push({name:$.name,startLine:$.span.start.line});for(let J of $.members??[])_.push({name:`${$.name}.${J.name}`,startLine:J.span.start.line})}return _.sort(($,J)=>$.startLine-J.startLine),_}function Ug(u,g,_){let $=0,J=u.length-1;while($<=J){let O=$+J>>1;if(u[O].startLine<=g)$=O+1;else J=O-1}if($<u.length){let O=u[$];if(O.startLine-g<=_)return O.name}return null}function du(u,g,_){let $=zu(u,g),J=zu(u,_);return{start:$,end:J}}function tg(u){let{comments:g,sourceText:_}=u;if(!g.length)return[];let $=xu(_),J=a$(u),O=[],Q=[...g].sort((N,W)=>N.start-W.start),z=null;for(let N of Q)if(N.type==="Block"&&N.value.startsWith("*")){z=null;let W=`/*${N.value}*/`,w=pu(W);if(c$(w))continue;let V=w;if(!V.tags?.length)continue;let X=zu($,N.end),M=Ug(J,X.line,3),I=_.slice(N.start,N.end);for(let A of V.tags){let T=[A.name,A.description].filter(Boolean).join(" "),q=`@${A.tag}`,h=I.indexOf(q),Z;if(h>=0){let K=N.start+h,B=_.indexOf(`
|
|
4
|
-
`,K),R=B>=0?Math.min(B,N.end):N.end;Z=du($,K,R)}else Z=du($,N.start,N.end);O.push({tag:
|
|
5
|
-
`),
|
|
6
|
-
`).length});let eu=(this.opts.parseSourceFn??
|
|
7
|
-
`).length})}let H=new Set;for(let F of D)for(let[m]of $.getFilesMap(F.project))H.add(`${F.project}::${m}`);let c=this.opts.parseSourceFn??qu;for(let F of n){let m=r(F.filePath,D),E=c(Au(U,F.filePath),F.text);if(eg(E))throw E.data;let p=E;if(y.push({filePath:F.filePath,parsed:p}),Og({parsed:p,project:m,filePath:F.filePath,contentHash:F.contentHash,symbolRepo:J}),q)K+=Yg({parsed:p,project:m,filePath:F.filePath,annotationRepo:q});k+=Vg({ast:p.program,project:m,filePath:F.filePath,relationRepo:O,projectRoot:U,tsconfigPaths:W,knownFiles:H,boundaries:D}),R+=J.getFileSymbols(m,F.filePath).length}});for(let H of y)C.set(H.filePath,H.parsed)}else{Z();let U=await B();R=U.symbols,k=U.relations,K=U.annotations,S=U.failedFiles}for(let U of z){let D=r(U.filePath,this.opts.boundaries);for(let C of J.getFileSymbols(D,U.filePath))M.set(`${C.filePath}::${C.name}`,I(C))}let j=new Map;for(let U of z){let D=r(U.filePath,this.opts.boundaries);for(let C of O.getOutgoing(D,U.filePath))j.set(A(C),C)}let P=(U)=>({type:U.type,srcFilePath:U.srcFilePath,dstFilePath:U.dstFilePath,srcSymbolName:U.srcSymbolName,dstSymbolName:U.dstSymbolName,dstProject:U.dstProject,metaJson:U.metaJson}),f={added:[...j.entries()].filter(([U])=>!T.has(U)).map(([,U])=>P(U)),removed:[...T.entries()].filter(([U])=>!j.has(U)).map(([,U])=>P(U))},v={added:[],modified:[],removed:[]};for(let[U,D]of M){let C=X.get(U);if(!C)v.added.push({name:D.name,filePath:D.filePath,kind:D.kind,isExported:Boolean(D.isExported)});else{let n=C.fingerprint!==D.fingerprint,y=C.isExported!==D.isExported,H=C.structuralFingerprint!==null&&D.structuralFingerprint!==null&&C.structuralFingerprint!==D.structuralFingerprint;if(n||y||H)v.modified.push({name:D.name,filePath:D.filePath,kind:D.kind,isExported:Boolean(D.isExported)})}}for(let[U,D]of X)if(!M.has(U))v.removed.push({name:D.name,filePath:D.filePath,kind:D.kind,isExported:Boolean(D.isExported)});let x=og(X,M),gu=new Set(x.renamed.map((U)=>`${U.filePath}::${U.oldName}`)),d=new Set(x.renamed.map((U)=>`${U.filePath}::${U.newName}`));v.added=v.added.filter((U)=>!d.has(`${U.filePath}::${U.name}`)),v.removed=v.removed.filter((U)=>!gu.has(`${U.filePath}::${U.name}`));let e=[];if(!g){for(let[U,D]of w)for(let C of D){if(!C.fingerprint)continue;let n=r(U,this.opts.boundaries),y=J.getByFingerprint(n,C.fingerprint);if(y.length===1){let H=y[0];O.retargetRelations({dstProject:n,oldFile:U,oldSymbol:C.name,newFile:H.filePath,newSymbol:H.name}),e.push({name:H.name,filePath:H.filePath,kind:H.kind,oldFilePath:U,isExported:H.isExported??0})}}for(let U of x.removed){let C=X.get(`${U.filePath}::${U.name}`)?.fingerprint;if(!C)continue;let n=r(U.filePath,this.opts.boundaries),y=J.getByFingerprint(n,C);if(y.length===1){let H=y[0];if(H.filePath!==U.filePath||H.name!==U.name)O.retargetRelations({dstProject:n,oldFile:U.filePath,oldSymbol:U.name,newFile:H.filePath,newSymbol:H.name}),e.push({name:H.name,filePath:H.filePath,kind:H.kind,oldFilePath:U.filePath,isExported:H.isExported??0})}}}if(e.length){let U=new Set(e.map((C)=>`${C.filePath}::${C.name}`)),D=new Set(e.map((C)=>`${C.oldFilePath}::${C.name}`));v.added=v.added.filter((C)=>!U.has(`${C.filePath}::${C.name}`)),v.removed=v.removed.filter((C)=>!D.has(`${C.filePath}::${C.name}`))}if(h){let U=new Date().toISOString(),D=g?1:0,C=[];for(let n of v.added){let y=`${n.filePath}::${n.name}`,H=M.get(y),c=r(n.filePath,this.opts.boundaries);C.push({project:c,changeType:"added",symbolName:n.name,symbolKind:n.kind,filePath:n.filePath,oldName:null,oldFilePath:null,fingerprint:H?.fingerprint??null,changedAt:U,isFullIndex:D,indexRunId:V})}for(let n of v.modified){let y=M.get(`${n.filePath}::${n.name}`),H=r(n.filePath,this.opts.boundaries);C.push({project:H,changeType:"modified",symbolName:n.name,symbolKind:n.kind,filePath:n.filePath,oldName:null,oldFilePath:null,fingerprint:y?.fingerprint??null,changedAt:U,isFullIndex:D,indexRunId:V})}for(let n of v.removed){let y=`${n.filePath}::${n.name}`,H=X.get(y),c=r(n.filePath,this.opts.boundaries);C.push({project:c,changeType:"removed",symbolName:n.name,symbolKind:n.kind,filePath:n.filePath,oldName:null,oldFilePath:null,fingerprint:H?.fingerprint??null,changedAt:U,isFullIndex:D,indexRunId:V})}for(let n of x.renamed){let y=M.get(`${n.filePath}::${n.newName}`),H=r(n.filePath,this.opts.boundaries);C.push({project:H,changeType:"renamed",symbolName:n.newName,symbolKind:n.kind,filePath:n.filePath,oldName:n.oldName,oldFilePath:null,fingerprint:y?.fingerprint??null,changedAt:U,isFullIndex:D,indexRunId:V})}for(let n of e){let y=M.get(`${n.filePath}::${n.name}`),H=r(n.filePath,this.opts.boundaries);C.push({project:H,changeType:"moved",symbolName:n.name,symbolKind:n.kind,filePath:n.filePath,oldName:null,oldFilePath:n.oldFilePath,fingerprint:y?.fingerprint??null,changedAt:U,isFullIndex:D,indexRunId:V})}if(C.length)try{Q.transaction(()=>{h.insertBatch(C)})}catch(n){this.logger.error("[IndexCoordinator] changelog insert failed:",n)}if(Date.now()-this.lastPruneAt>3600000){this.lastPruneAt=Date.now();let n=new Date(Date.now()-2592000000).toISOString();try{for(let y of this.opts.boundaries)h.pruneOlderThan(y.project,n)}catch(y){this.logger.error("[IndexCoordinator] changelog pruning failed:",y)}}}return{indexedFiles:z.length,removedFiles:N.length,totalSymbols:R,totalRelations:k,totalAnnotations:K,durationMs:Date.now()-_,changedFiles:z.map((U)=>U.filePath),deletedFiles:[...N],failedFiles:S,changedSymbols:v,renamedSymbols:x.renamed.map((U)=>({oldName:U.oldName,newName:U.newName,filePath:U.filePath,kind:U.kind,isExported:Boolean(M.get(`${U.filePath}::${U.newName}`)?.isExported)})),movedSymbols:e.map((U)=>({name:U.name,oldFilePath:U.oldFilePath,newFilePath:U.filePath,kind:U.kind,isExported:Boolean(U.isExported)})),changedRelations:f}}fireCallbacks(u){for(let g of this.callbacks)try{g(u)}catch(_){this.logger.error("[IndexCoordinator] onIndexed callback threw:",_)}}flushPending(){if(this.indexingLock)return;if(this.pendingEvents.length>0){let u=this.pendingEvents.splice(0);this.startIndex(u,!1).catch((g)=>this.logger.error("[IndexCoordinator] flushPending startIndex error:",g))}}}function t$(u){try{return process.kill(u,0),!0}catch(g){if(typeof g==="object"&&g&&"code"in g)return g.code!=="ESRCH";return!0}}function o$(u){let g=new Date(u).getTime();return Number.isNaN(g)?0:g}function g_(u,g,_={}){let $=_.now??Date.now,J=_.isAlive??t$,O=_.staleAfterSeconds??60,Q=_.instanceId;return u.immediateTransaction(()=>{let z=u.selectOwner();if(!z)return u.insertOwner(g,Q),"owner";let N=Math.floor(($()-o$(z.heartbeat_at))/1000),W=J(z.pid);if(W&&Q&&z.instance_id&&z.instance_id!==Q&&z.pid!==g)return u.replaceOwner(g,Q),"owner";if(W&&N<O)return"reader";return u.replaceOwner(g,Q),"owner"})}function __(u,g){u.deleteOwner(g)}function $_(u,g){u.touchOwner(g)}class Fu{#u;#g=new Map;constructor(u){this.#u=Math.max(1,u)}get size(){return this.#g.size}has(u){return this.#g.has(u)}get(u){if(!this.#g.has(u))return;let g=this.#g.get(u);return this.#g.delete(u),this.#g.set(u,g),g}set(u,g){if(this.#g.has(u))this.#g.delete(u);if(this.#g.set(u,g),this.#g.size>this.#u){let _=this.#g.keys().next().value;if(_!==void 0)this.#g.delete(_)}}delete(u){return this.#g.delete(u)}clear(){this.#g.clear()}}class Xg{lru;constructor(u=500){this.lru=new Fu(u)}get(u){return this.lru.get(u)}set(u,g){this.lru.set(u,g)}invalidate(u){this.lru.delete(u)}invalidateAll(){this.lru.clear()}size(){return this.lru.size}}function Kg(u){let{symbolRepo:g,project:_,query:$}=u,J=$.project??_,O=$.limit??100,Q={kind:$.kind,filePath:$.filePath,isExported:$.isExported,project:J,limit:O,resolvedType:$.resolvedType};if($.text)if($.exact)Q.exactName=$.text;else{let N=Du($.text);if(N)Q.ftsQuery=N}if($.decorator)Q.decorator=$.decorator;if($.regex)Q.regex=$.regex;return g.searchByQuery(Q).map((N)=>({id:N.id,filePath:N.filePath,kind:N.kind,name:N.name,span:{start:{line:N.startLine,column:N.startColumn},end:{line:N.endLine,column:N.endColumn}},isExported:N.isExported===1,signature:N.signature,fingerprint:N.fingerprint,detail:N.detailJson?(()=>{try{return JSON.parse(N.detailJson)}catch{return{}}})():{}}))}function Mg(u){let{relationRepo:g,project:_,query:$}=u;if($.srcFilePath&&$.srcFilePathPattern)throw new Y("validation","srcFilePath and srcFilePathPattern are mutually exclusive");if($.dstFilePath&&$.dstFilePathPattern)throw new Y("validation","dstFilePath and dstFilePathPattern are mutually exclusive");let J=$.project??_,O=$.limit??500,Q=!!($.srcFilePathPattern||$.dstFilePathPattern),z=Q?Number.MAX_SAFE_INTEGER:O,W=g.searchRelations({srcFilePath:$.srcFilePath,srcSymbolName:$.srcSymbolName,dstFilePath:$.dstFilePath,dstSymbolName:$.dstSymbolName,dstProject:$.dstProject,type:$.type,project:J,limit:z}).map((w)=>{let V;if(w.metaJson)try{V=JSON.parse(w.metaJson)}catch{}return{type:w.type,srcFilePath:w.srcFilePath,srcSymbolName:w.srcSymbolName,dstFilePath:w.dstFilePath,dstSymbolName:w.dstSymbolName,dstProject:w.dstProject,metaJson:w.metaJson??void 0,meta:V}});if($.srcFilePathPattern||$.dstFilePathPattern){let w=$.srcFilePathPattern?new Bun.Glob($.srcFilePathPattern):null,V=$.dstFilePathPattern?new Bun.Glob($.dstFilePathPattern):null;W=W.filter((X)=>(!w||w.match(X.srcFilePath))&&(!V||V.match(X.dstFilePath)))}if(Q&&W.length>O)W=W.slice(0,O);return W}import{findInFiles as e$,Lang as u0}from"@ast-grep/napi";async function Bg(u){if(u.filePaths.length===0)return[];let g=[];return await e$(u0.TypeScript,{paths:u.filePaths,matcher:{rule:{pattern:u.pattern}}},(_,$)=>{if(_){console.warn("[patternSearch] findInFiles callback error:",_);return}for(let J of $){let O=J.range();g.push({filePath:J.getRoot().filename(),startLine:O.start.line+1,endLine:O.end.line+1,matchedText:J.text()})}}),g}import o from"typescript";import{isErr as Z0}from"@zipbul/result";import Vu from"typescript";import g0 from"path";import{err as Hg}from"@zipbul/result";function _0(u){try{return Gg("fs").readFileSync(u,"utf-8")}catch{return}}function $0(u){try{return Gg("fs").readFileSync(u,"utf-8")}catch{return}}class ru{#u;#g;#_=!1;__testing__;constructor(u,g){this.#u=u,this.#g=g,this.__testing__={host:g}}static create(u,g={}){let _=g.readConfigFile??_0,$=g.resolveNonTrackedFile??$0,J=g0.dirname(u),O=_(u);if(O===void 0)return Hg(_u("semantic",`tsconfig not found: ${u}`));let Q=Vu.parseJsonText(u,O),z=Q.parseDiagnostics;if(z&&z.length>0){let V=z.map((X)=>Vu.flattenDiagnosticMessageText(X.messageText,`
|
|
8
|
-
`)).join("; ");return
|
|
9
|
-
`)).join("; ");return Hg(_u("semantic",`tsconfig compile error: ${X}`))}}let W=new J_(N.fileNames,N.options,J,$),w=Vu.createLanguageService(W);return new ru(w,W)}get isDisposed(){return this.#_}getProgram(){this.#J();let u=this.#u.getProgram();if(!u)throw Error("TscProgram: LanguageService returned null Program");return u}getChecker(){return this.#J(),this.getProgram().getTypeChecker()}getLanguageService(){return this.#J(),this.#u}notifyFileChanged(u,g){if(this.#_)return;this.#g.updateFile(u,g)}removeFile(u){if(this.#_)return;this.#g.removeFile(u)}dispose(){if(this.#_)return;this.#_=!0,this.#u.dispose()}#J(){if(this.#_)throw Error("TscProgram is disposed")}}class J_{#u;#g;#_;#J;#$=new Map;constructor(u,g,_,$){this.#u=new Set(u),this.#g=g,this.#_=_,this.#J=$}updateFile(u,g){let _=this.#$.get(u);if(_)_.version+=1,_.content=g;else this.#$.set(u,{version:1,content:g})}removeFile(u){this.#$.delete(u),this.#u.delete(u)}getScriptFileNames(){let u=[...this.#$.keys()];return[...[...this.#u].filter((_)=>!this.#$.has(_)),...u]}getScriptVersion(u){let g=this.#$.get(u);return g?String(g.version):"0"}getScriptSnapshot(u){let g=this.#$.get(u);if(g)return Vu.ScriptSnapshot.fromString(g.content);let _=this.#J(u);if(_!==void 0)return Vu.ScriptSnapshot.fromString(_);return}getCurrentDirectory(){return this.#_}getCompilationSettings(){return this.#g}getDefaultLibFileName(u){return Vu.getDefaultLibFilePath(u)}fileExists(u){if(this.#$.has(u))return!0;return this.#J(u)!==void 0}readFile(u){let g=this.#$.get(u);if(g)return g.content;return this.#J(u)}}import s from"typescript";import J0 from"typescript";function Ou(u,g){if(g<0||g>=u.getEnd())return;function _($){let J=$.getStart(u,!1),O=$.getEnd();if(g<J||g>=O)return;let Q;return J0.forEachChild($,(z)=>{if(!Q)Q=_(z)}),Q??$}return _(u)}var Lg=8;function N0(u){return!!(u.flags&s.TypeFlags.Object)&&!!(u.objectFlags&s.ObjectFlags.Reference)}function Gu(u,g,_=0){let $=u.typeToString(g),J=g.flags,O=!!(J&s.TypeFlags.Union),Q=!!(J&s.TypeFlags.Intersection),z;if(_<Lg&&N0(g)){let V=u.getTypeArguments(g);if(V.length>0)z=V}let N=!!(J&s.TypeFlags.TypeParameter)||z!==void 0&&z.length>0,W;if(O&&_<Lg)W=g.types.map((V)=>Gu(u,V,_+1));else if(Q&&_<Lg)W=g.types.map((V)=>Gu(u,V,_+1));let w;if(z&&z.length>0)w=z.map((V)=>Gu(u,V,_+1));return{text:$,flags:J,isUnion:O,isIntersection:Q,isGeneric:N,members:W,typeArguments:w}}function Q0(u){return s.isFunctionDeclaration(u)||s.isVariableDeclaration(u)||s.isClassDeclaration(u)||s.isInterfaceDeclaration(u)||s.isTypeAliasDeclaration(u)||s.isEnumDeclaration(u)||s.isMethodDeclaration(u)||s.isPropertyDeclaration(u)||s.isPropertySignature(u)||s.isMethodSignature(u)}class Ig{program;constructor(u){this.program=u}collectAt(u,g){let _=this.program.getProgram(),$=this.program.getChecker();if(g<0)return null;let J=_.getSourceFile(u);if(!J)return null;if(g>=J.getEnd())return null;let O=Ou(J,g);if(!O)return null;if(!s.isIdentifier(O))return null;try{let Q=$.getTypeAtLocation(O);return Gu($,Q)}catch{return null}}isAssignableTo(u,g,_,$){let J=this.program.getChecker(),O=this.program.getProgram(),Q=O.getSourceFile(u);if(!Q)return null;let z=Ou(Q,g);if(!z||!s.isIdentifier(z))return null;let N=O.getSourceFile(_);if(!N)return null;let W=Ou(N,$);if(!W||!s.isIdentifier(W))return null;try{let w=J.getTypeAtLocation(z),V=J.getTypeAtLocation(W);return J.isTypeAssignableTo(w,V)}catch{return null}}collectFile(u){let g=new Map,_=this.program.getProgram(),$=this.program.getChecker(),J=_.getSourceFile(u);if(!J)return g;function O(Q){if(Q0(Q)&&Q.name&&s.isIdentifier(Q.name)){let z=Q.name;try{let N=$.getTypeAtLocation(z),W=z.getStart(J);g.set(W,Gu($,N))}catch{}}s.forEachChild(Q,O)}return O(J),g}}import Xu from"typescript";var z0=1000,O0=1;function w0(u){let g=u.declarations?.[0],_=g?.getSourceFile(),$=g?Xu.getNameOfDeclaration(g):void 0;return{name:u.getName(),filePath:_?.fileName??"",position:$?.getStart(_,!1)??g?.getStart(_,!1)??0}}function cu(u,g=0){let _=u.declarations?.[0],$=_?.getSourceFile(),J=_?Xu.getNameOfDeclaration(_):void 0,O=$?.fileName??"",Q=J?.getStart($,!1)??_?.getStart($,!1)??0,z={name:u.getName(),filePath:O,position:Q},N=u;if(N.parent)z.parent=w0(N.parent);if(g<O0){let W=u.flags,w=!!(W&Xu.SymbolFlags.Enum),V=!!(W&(Xu.SymbolFlags.NamespaceModule|Xu.SymbolFlags.ValueModule)),X=!!(W&(Xu.SymbolFlags.Class|Xu.SymbolFlags.Interface));if(w&&u.exports&&u.exports.size>0){let M=[];u.exports.forEach((I)=>{M.push(cu(I,g+1))}),z.members=M}else if(X&&u.members&&u.members.size>0){let M=[];u.members.forEach((I)=>{M.push(cu(I,g+1))}),z.members=M}if(V&&u.exports&&u.exports.size>0){let M=[];u.exports.forEach((I)=>{M.push(cu(I,g+1))}),z.exports=M}}return z}class Dg{#u;#g;#_=new Map;constructor(u,g=z0){this.#u=u,this.#g=new Fu(g)}get(u,g){if(this.#u.isDisposed)return null;let _=`${u}:${g}`,$=this.#g.get(_);if($!==void 0)return $;let O=this.#u.getProgram().getSourceFile(u);if(!O)return null;let Q=Ou(O,g);if(!Q||!Xu.isIdentifier(Q))return null;let N=this.#u.getChecker().getSymbolAtLocation(Q);if(!N)return null;let W=cu(N);this.#g.set(_,W);let w=this.#_.get(u);if(!w)w=new Set,this.#_.set(u,w);return w.add(_),W}invalidate(u){let g=this.#_.get(u);if(g){for(let _ of g)this.#g.delete(_);this.#_.delete(u)}}clear(){this.#g.clear(),this.#_.clear()}}import W0 from"typescript";class Ag{#u;constructor(u){this.#u=u}findAt(u,g){if(this.#u.isDisposed)return[];let _=this.#u.getProgram(),$=_.getSourceFile(u);if(!$)return[];let J=Ou($,g);if(!J||!W0.isIdentifier(J))return[];let Q=this.#u.getLanguageService().findReferences(u,g);if(!Q||Q.length===0)return[];let z=[];for(let N of Q)for(let W of N.references){let w=_.getSourceFile(W.fileName);if(!w)continue;let{line:V,character:X}=w.getLineAndCharacterOfPosition(W.textSpan.start);z.push({filePath:W.fileName,position:W.textSpan.start,line:V+1,column:X,isDefinition:W.isDefinition??!1,isWrite:W.isWriteAccess??!1})}return z}}import i from"typescript";function V0(u,g){let _=Ou(u,g);if(!_)return;if(N_(_))return _;let $=_.parent;for(let J=0;J<5&&$;J++){if(N_($))return $;$=$.parent}return _}function N_(u){return i.isClassDeclaration(u)||i.isClassExpression(u)||i.isFunctionDeclaration(u)||i.isFunctionExpression(u)||i.isArrowFunction(u)||i.isVariableDeclaration(u)||i.isObjectLiteralExpression(u)}function Q_(u){if(i.isClassDeclaration(u)||i.isClassExpression(u))return"class";if(i.isFunctionDeclaration(u)||i.isFunctionExpression(u)||i.isArrowFunction(u))return"function";if(i.isObjectLiteralExpression(u))return"object";if(i.isVariableDeclaration(u)&&u.initializer)return Q_(u.initializer);return"class"}function U0(u,g){if(i.isClassDeclaration(u)||i.isFunctionDeclaration(u))return u.name?.getText(g)??"";if(i.isClassExpression(u))return u.name?.getText(g)??"";if(i.isVariableDeclaration(u)&&i.isIdentifier(u.name))return u.name.getText(g);if(i.isFunctionExpression(u))return u.name?.getText(g)??"";if(i.isArrowFunction(u)&&u.parent&&i.isVariableDeclaration(u.parent)){if(i.isIdentifier(u.parent.name))return u.parent.name.getText(g)}if(i.isObjectLiteralExpression(u)&&u.parent&&i.isVariableDeclaration(u.parent)){if(i.isIdentifier(u.parent.name))return u.parent.name.getText(g)}return""}function Y0(u){if(!i.isClassDeclaration(u)&&!i.isClassExpression(u))return!1;let g=u.heritageClauses;if(!g)return!1;return g.some((_)=>_.token===i.SyntaxKind.ImplementsKeyword)}class Cg{#u;constructor(u){this.#u=u}findAt(u,g){if(this.#u.isDisposed)return[];let _=this.#u.getProgram(),$=_.getSourceFile(u);if(!$)return[];let J=Ou($,g);if(!J||!i.isIdentifier(J))return[];let Q=this.#u.getLanguageService().getImplementationAtPosition(u,g);if(!Q||Q.length===0)return[];let z=[];for(let N of Q){if(N.kind===i.ScriptElementKind.interfaceElement||N.kind===i.ScriptElementKind.typeElement)continue;let W=_.getSourceFile(N.fileName);if(!W)continue;let w=V0(W,N.textSpan.start);if(!w)continue;let V=Q_(w),X=U0(w,W),M=Y0(w);z.push({filePath:N.fileName,symbolName:X,position:N.textSpan.start,kind:V,isExplicit:M})}return z}}function z_(u){return o.canHaveModifiers(u)&&o.getModifiers(u)?.some((g)=>g.kind===o.SyntaxKind.ExportKeyword)===!0}function X0(u){if(o.isFunctionDeclaration(u))return"function";if(o.isClassDeclaration(u))return"class";if(o.isInterfaceDeclaration(u))return"interface";if(o.isTypeAliasDeclaration(u))return"type";if(o.isEnumDeclaration(u))return"enum";if(o.isVariableDeclaration(u))return"const";if(o.isVariableStatement(u))return"const";return"unknown"}function O_(u){if(u>=97&&u<=122)return!0;if(u>=65&&u<=90)return!0;if(u>=48&&u<=57)return!0;if(u===95||u===36)return!0;return!1}class au{#u;#g;#_;#J;#$;#N=!1;constructor(u,g,_,$,J){this.#u=u,this.#g=g,this.#_=_,this.#J=$,this.#$=J}static create(u,g={}){let _=ru.create(u,{readConfigFile:g.readConfigFile,resolveNonTrackedFile:g.resolveNonTrackedFile});if(Z0(_))return _;let $=_,J=g.typeCollector??new Ig($),O=g.symbolGraph??new Dg($),Q=g.referenceResolver??new Ag($),z=g.implementationFinder??new Cg($);return new au($,J,O,Q,z)}get isDisposed(){return this.#N}collectTypeAt(u,g){return this.#Q(),this.#g.collectAt(u,g)}collectFileTypes(u){return this.#Q(),this.#g.collectFile(u)}findReferences(u,g){return this.#Q(),this.#J.findAt(u,g)}findImplementations(u,g){return this.#Q(),this.#$.findAt(u,g)}isTypeAssignableTo(u,g,_,$){return this.#Q(),this.#g.isAssignableTo(u,g,_,$)}getSymbolNode(u,g){return this.#Q(),this.#_.get(u,g)}getModuleInterface(u){this.#Q();let g=this.#g.collectFile(u),_=[],J=this.#u.getProgram().getSourceFile(u);if(!J)return{filePath:u,exports:_};function O(Q){if(o.isVariableStatement(Q)&&z_(Q)){for(let z of Q.declarationList.declarations)if(o.isIdentifier(z.name)){let N=z.name.getStart(J),W=g.get(N)??null;_.push({name:z.name.text,kind:"const",resolvedType:W})}return}if((o.isFunctionDeclaration(Q)||o.isClassDeclaration(Q)||o.isInterfaceDeclaration(Q)||o.isTypeAliasDeclaration(Q)||o.isEnumDeclaration(Q))&&z_(Q)&&Q.name){let z=Q.name,N=z.getStart(J),W=g.get(N)??null;_.push({name:z.text,kind:X0(Q),resolvedType:W});return}o.forEachChild(Q,O)}return O(J),{filePath:u,exports:_}}notifyFileChanged(u,g){if(this.#N)return;this.#u.notifyFileChanged(u,g),this.#_.invalidate(u)}notifyFileDeleted(u){if(this.#N)return;this.#u.removeFile(u),this.#_.invalidate(u)}lineColumnToPosition(u,g,_){this.#Q();let $=this.#u.getProgram().getSourceFile(u);if(!$)return null;try{return o.getPositionOfLineAndCharacter($,g-1,_)}catch{return null}}findNamePosition(u,g,_){this.#Q();let $=this.#u.getProgram().getSourceFile(u);if(!$)return null;let J=$.getFullText(),O=g;while(O<J.length){let Q=J.indexOf(_,O);if(Q<0)return null;let z=Q>0?J.charCodeAt(Q-1):32,N=Q+_.length<J.length?J.charCodeAt(Q+_.length):32;if(!O_(z)&&!O_(N))return Q;O=Q+1}return null}dispose(){if(this.#N)return;this.#N=!0,this.#u.dispose(),this.#_.clear()}#Q(){if(this.#N)throw Error("SemanticLayer is disposed")}}import{eq as Hu,and as w_,sql as K0}from"drizzle-orm";var W_=80;class Sg{db;constructor(u){this.db=u}insertBatch(u,g,_){if(!_.length)return;let $=_.map((J)=>({project:u,filePath:g,tag:J.tag,value:J.value,source:J.source,symbolName:J.symbolName,startLine:J.startLine,startColumn:J.startColumn,endLine:J.endLine,endColumn:J.endColumn,indexedAt:J.indexedAt}));for(let J=0;J<$.length;J+=W_)this.db.drizzleDb.insert(Nu).values($.slice(J,J+W_)).run()}deleteFileAnnotations(u,g){this.db.drizzleDb.delete(Nu).where(w_(Hu(Nu.project,u),Hu(Nu.filePath,g))).run()}search(u){return this.db.drizzleDb.select().from(Nu).where(w_(u.project?Hu(Nu.project,u.project):void 0,u.tag?Hu(Nu.tag,u.tag):void 0,u.filePath?Hu(Nu.filePath,u.filePath):void 0,u.symbolName?Hu(Nu.symbolName,u.symbolName):void 0,u.source?Hu(Nu.source,u.source):void 0,u.ftsQuery?K0`${Nu.id} IN (SELECT rowid FROM annotations_fts WHERE annotations_fts MATCH ${u.ftsQuery})`:void 0)).limit(u.limit).all()}}import{eq as Ru,and as V_,sql as ju,gt as M0,gte as B0}from"drizzle-orm";var U_=80;class Rg{db;constructor(u){this.db=u}insertBatch(u){if(!u.length)return;let g=u.map((_)=>({project:_.project,changeType:_.changeType,symbolName:_.symbolName,symbolKind:_.symbolKind,filePath:_.filePath,oldName:_.oldName,oldFilePath:_.oldFilePath,fingerprint:_.fingerprint,changedAt:_.changedAt,isFullIndex:_.isFullIndex,indexRunId:_.indexRunId}));for(let _=0;_<g.length;_+=U_)this.db.drizzleDb.insert($u).values(g.slice(_,_+U_)).run()}getSince(u){return this.db.drizzleDb.select().from($u).where(V_(Ru($u.project,u.project),B0($u.changedAt,u.since),u.symbolName?Ru($u.symbolName,u.symbolName):void 0,u.changeTypes?.length?ju`${$u.changeType} IN (${ju.join(u.changeTypes.map((g)=>ju`${g}`),ju`, `)})`:void 0,u.filePath?Ru($u.filePath,u.filePath):void 0,u.includeFullIndex?void 0:Ru($u.isFullIndex,0),u.indexRunId?Ru($u.indexRunId,u.indexRunId):void 0,u.afterId?M0($u.id,u.afterId):void 0)).orderBy($u.id).limit(u.limit).all()}pruneOlderThan(u,g){return this.db.drizzleDb.delete($u).where(V_(Ru($u.project,u),ju`${$u.changedAt} < ${g}`)).run().changes}}function Y_(u){let{annotationRepo:g,project:_,query:$}=u,J=$.project??_,O=$.limit??100,Q;if($.text){let N=Du($.text);if(N)Q=N}return g.search({project:J,tag:$.tag,filePath:$.filePath,symbolName:$.symbolName,source:$.source,ftsQuery:Q,limit:O}).map((N)=>({tag:N.tag,value:N.value,source:N.source,filePath:N.filePath,symbolName:N.symbolName,span:{start:{line:N.startLine,column:N.startColumn},end:{line:N.endLine,column:N.endColumn}}}))}class su{options;adjacencyList=new Map;reverseAdjacencyList=new Map;constructor(u){this.options=u}build(){this.adjacencyList=new Map,this.reverseAdjacencyList=new Map;let g=[this.options.project,...this.options.additionalProjects??[]].flatMap((_)=>[...this.options.relationRepo.getByType(_,"imports"),...this.options.relationRepo.getByType(_,"type-references"),...this.options.relationRepo.getByType(_,"re-exports")]);for(let _ of g){let{srcFilePath:$,dstFilePath:J}=_;if(!this.adjacencyList.has($))this.adjacencyList.set($,new Set);if(this.adjacencyList.get($).add(J),!this.adjacencyList.has(J))this.adjacencyList.set(J,new Set);if(!this.reverseAdjacencyList.has(J))this.reverseAdjacencyList.set(J,new Set);this.reverseAdjacencyList.get(J).add($)}}patchFiles(u,g,_){let $=new Set([...u,...g]);for(let J of $){let O=this.adjacencyList.get(J);if(O){for(let z of O)this.reverseAdjacencyList.get(z)?.delete(J);O.clear()}let Q=this.reverseAdjacencyList.get(J);if(Q){for(let z of Q)this.adjacencyList.get(z)?.delete(J);Q.clear()}}for(let J of g)this.adjacencyList.delete(J),this.reverseAdjacencyList.delete(J);for(let J of u){let O=_(J);for(let Q of O){if(!this.adjacencyList.has(Q.srcFilePath))this.adjacencyList.set(Q.srcFilePath,new Set);if(this.adjacencyList.get(Q.srcFilePath).add(Q.dstFilePath),!this.adjacencyList.has(Q.dstFilePath))this.adjacencyList.set(Q.dstFilePath,new Set);if(!this.reverseAdjacencyList.has(Q.dstFilePath))this.reverseAdjacencyList.set(Q.dstFilePath,new Set);this.reverseAdjacencyList.get(Q.dstFilePath).add(Q.srcFilePath)}}}getDependencies(u){return Array.from(this.adjacencyList.get(u)??[])}getDependents(u){return Array.from(this.reverseAdjacencyList.get(u)??[])}getTransitiveDependents(u){let g=new Set,_=[u];while(_.length>0){let $=_.shift();for(let J of this.reverseAdjacencyList.get($)??[])if(!g.has(J))g.add(J),_.push(J)}return Array.from(g)}hasCycle(){let u=new Set,g=new Set;for(let _ of this.adjacencyList.keys()){if(u.has(_))continue;let $=[{node:_,entered:!1}];while($.length>0){let J=$.pop();if(J.entered){g.delete(J.node);continue}if(g.has(J.node))return!0;if(u.has(J.node))continue;u.add(J.node),g.add(J.node),$.push({node:J.node,entered:!0});for(let O of this.adjacencyList.get(J.node)??[]){if(g.has(O))return!0;if(!u.has(O))$.push({node:O,entered:!1})}}}return!1}getAffectedByChange(u){let g=new Set;for(let _ of u)for(let $ of this.getTransitiveDependents(_))g.add($);return Array.from(g)}getAdjacencyList(){let u=new Map;for(let[g,_]of this.adjacencyList)u.set(g,Array.from(_));return u}getTransitiveDependencies(u){let g=new Set,_=[u];while(_.length>0){let $=_.shift();for(let J of this.adjacencyList.get($)??[])if(!g.has(J))g.add(J),_.push(J)}return Array.from(g)}getCyclePaths(u){let g=u?.maxCycles??1/0;if(g<=0)return[];let _=new Map;for(let[$,J]of this.adjacencyList)_.set($,Array.from(J));return A0(_,g)}}var H0=(u,g)=>u.localeCompare(g);function L0(u){let g=u.length>1&&u[0]===u[u.length-1]?u.slice(0,-1):[...u];if(g.length===0)return[];let _=g;for(let $=1;$<g.length;$++){let J=g.slice($).concat(g.slice(0,$));if(J.join("::")<_.join("::"))_=J}return[..._]}function ng(u,g,_){let $=L0(_);if($.length===0)return!1;let J=$.join("->");if(u.has(J))return!1;return u.add(J),g.push($),!0}function I0(u){let g=0,_=[],$=new Set,J=new Map,O=new Map,Q=[],z=(N)=>{J.set(N,g),O.set(N,g),g+=1,_.push(N),$.add(N);for(let W of u.get(N)??[])if(!J.has(W))z(W),O.set(N,Math.min(O.get(N)??0,O.get(W)??0));else if($.has(W))O.set(N,Math.min(O.get(N)??0,J.get(W)??0));if(O.get(N)===J.get(N)){let W=[],w="";do w=_.pop()??"",$.delete(w),W.push(w);while(w!==N&&_.length>0);Q.push(W)}};for(let N of u.keys())if(!J.has(N))z(N);return{components:Q}}function D0(u,g,_){let $=[],J=new Set,O=[...u].sort(H0),Q=(z,N,W)=>{N.delete(z);let w=W.get(z);if(!w)return;for(let V of w)if(N.has(V))Q(V,N,W);w.clear()};for(let z=0;z<O.length&&$.length<_;z++){let N=O[z]??"",W=new Set(O.slice(z)),w=new Set,V=new Map,X=[],M=(A)=>(g.get(A)??[]).filter((T)=>W.has(T)),I=(A)=>{if($.length>=_)return!0;let T=!1;X.push(A),w.add(A);for(let q of M(A)){if($.length>=_)break;if(q===N)ng(J,$,X.concat(N)),T=!0;else if(!w.has(q)){if(I(q))T=!0}}if(T)Q(A,w,V);else for(let q of M(A)){let h=V.get(q)??new Set;h.add(A),V.set(q,h)}return X.pop(),T};I(N)}return $}function A0(u,g){let{components:_}=I0(u),$=[],J=new Set;for(let O of _){if($.length>=g)break;if(O.length===0)continue;if(O.length===1){let N=O[0]??"";if((u.get(N)??[]).includes(N))ng(J,$,[N,N]);continue}let Q=g-$.length,z=D0(O,u,Q);for(let N of z){if($.length>=g)break;ng(J,$,N)}}return $}var C0=15000;function tu(u){u.graphCache=null,u.graphCacheKey=null,u.graphCacheBuiltAt=null}function nu(u,g){let _=g??"__cross__";if(u.graphCache&&u.graphCacheBuiltAt!==null){if(Date.now()-u.graphCacheBuiltAt>C0)u.graphCache=null,u.graphCacheKey=null,u.graphCacheBuiltAt=null}if(u.graphCache&&u.graphCacheKey===_)return u.graphCache;let $=new su({relationRepo:u.relationRepo,project:g??u.defaultProject,additionalProjects:g?void 0:u.boundaries?.map((J)=>J.project)});return $.build(),u.graphCache=$,u.graphCacheKey=_,u.graphCacheBuiltAt=Date.now(),$}function Z_(u,g,_,$=1e4){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:_??u.defaultProject,query:{srcFilePath:g,type:"imports",project:_??u.defaultProject,limit:$}}).map((J)=>J.dstFilePath)}catch(J){if(J instanceof Y)throw J;throw new Y("search","Gildash: getDependencies failed",{cause:J})}}function X_(u,g,_,$=1e4){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:_??u.defaultProject,query:{dstFilePath:g,type:"imports",project:_??u.defaultProject,limit:$}}).map((J)=>J.srcFilePath)}catch(J){if(J instanceof Y)throw J;throw new Y("search","Gildash: getDependents failed",{cause:J})}}async function K_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return nu(u,_).getAffectedByChange(g)}catch($){if($ instanceof Y)throw $;throw new Y("search","Gildash: getAffected failed",{cause:$})}}async function M_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return nu(u,g).hasCycle()}catch(_){if(_ instanceof Y)throw _;throw new Y("search","Gildash: hasCycle failed",{cause:_})}}async function B_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return nu(u,g).getAdjacencyList()}catch(_){if(_ instanceof Y)throw _;throw new Y("search","Gildash: getImportGraph failed",{cause:_})}}async function H_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return nu(u,_).getTransitiveDependencies(g)}catch($){if($ instanceof Y)throw $;throw new Y("search","Gildash: getTransitiveDependencies failed",{cause:$})}}async function L_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return nu(u,g).getCyclePaths(_)}catch($){if($ instanceof Y)throw $;throw new Y("search","Gildash: getCyclePaths failed",{cause:$})}}async function I_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{let $=nu(u,_);return{filePath:g,fanIn:$.getDependents(g).length,fanOut:$.getDependencies(g).length}}catch($){if($ instanceof Y)throw $;throw new Y("search","Gildash: getFanMetrics failed",{cause:$})}}var n0=30000,D_=15000,k0=10;function T0(u,g){return(_)=>{for(let $ of u.onFileChangedCallbacks)try{$(_)}catch(J){u.logger.error("[Gildash] onFileChanged callback threw:",J)}if(g.handleWatcherEvent?.(_),u.semanticLayer)if(_.eventType==="delete")try{u.semanticLayer.notifyFileDeleted(_.filePath)}catch($){u.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw:",$);for(let J of u.onErrorCallbacks)try{J($ instanceof Y?$:new Y("semantic","semantic notifyFileDeleted failed",{cause:$}))}catch{}}else u.readFileFn(_.filePath).then(($)=>{try{u.semanticLayer?.notifyFileChanged(_.filePath,$)}catch(J){u.logger.error("[Gildash] semanticLayer.notifyFileChanged threw:",J);for(let O of u.onErrorCallbacks)try{O(J instanceof Y?J:new Y("semantic","semantic notifyFileChanged failed",{cause:J}))}catch{}}}).catch(($)=>{u.logger.error("[Gildash] failed to read file for semantic layer",_.filePath,$);try{u.semanticLayer?.notifyFileDeleted(_.filePath)}catch(J){u.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw during read error recovery:",J)}})}}async function q0(u){if(!u.semanticLayer)return;let g=u.fileRepo.getAllFiles(u.defaultProject);await Promise.all(g.map(async(_)=>{try{let $=vu.resolve(u.projectRoot,_.filePath),J=await u.readFileFn($);u.semanticLayer?.notifyFileChanged($,J)}catch{}}))}async function A_(u,g){let _=u.coordinatorFactory?u.coordinatorFactory():new Zg({projectRoot:u.projectRoot,boundaries:u.boundaries,extensions:u.extensions,ignorePatterns:u.ignorePatterns,dbConnection:u.db,parseCache:u.parseCache,fileRepo:u.fileRepo,symbolRepo:u.symbolRepo,relationRepo:u.relationRepo,annotationRepo:u.annotationRepo??void 0,changelogRepo:u.changelogRepo??void 0,logger:u.logger});u.coordinator=_;for(let $ of u.onIndexedCallbacks)_.onIndexed($);if(_.onIndexed(($)=>{let J=$.changedFiles.length+$.deletedFiles.length;if(u.graphCache&&J>0&&J<100){let O=u.relationRepo;u.graphCache.patchFiles($.changedFiles,$.deletedFiles,(Q)=>{return[u.defaultProject,...u.boundaries.map((N)=>N.project)].flatMap((N)=>O.getByType(N,"imports").concat(O.getByType(N,"type-references")).concat(O.getByType(N,"re-exports"))).filter((N)=>N.srcFilePath===Q||N.dstFilePath===Q).map((N)=>({srcFilePath:N.srcFilePath,dstFilePath:N.dstFilePath}))}),u.graphCacheBuiltAt=Date.now()}else tu(u)}),g.isWatchMode){let $=u.watcherFactory?u.watcherFactory():new Qg({projectRoot:u.projectRoot,ignorePatterns:u.ignorePatterns,extensions:u.extensions},void 0,u.logger);await $.start(T0(u,_)).then((J)=>{if(Eu(J))throw J.data}),u.watcher=$,u.timer=setInterval(()=>{u.updateHeartbeatFn(u.db,process.pid)},n0)}await _.fullIndex(),await q0(u)}function F0(u,g){let _=["SIGTERM","SIGINT","beforeExit"];for(let $ of _){let J=()=>{g().catch((O)=>u.logger.error("[Gildash] close error during signal",$,O))};if($==="beforeExit")process.on("beforeExit",J);else process.on($,J);u.signalHandlers.push([$,J])}}async function C_(u){let{projectRoot:g,extensions:_=[".ts",".mts",".cts"],ignorePatterns:$=["**/node_modules/**"],parseCacheCapacity:J=500,logger:O=console,existsSyncFn:Q=R0,dbConnectionFactory:z,watcherFactory:N,coordinatorFactory:W,repositoryFactory:w,acquireWatcherRoleFn:V=g_,releaseWatcherRoleFn:X=__,updateHeartbeatFn:M=$_,discoverProjectsFn:I=mu,parseSourceFn:A=qu,extractSymbolsFn:T=Cu,extractRelationsFn:q=lu,symbolSearchFn:h=Kg,relationSearchFn:Z=Mg,patternSearchFn:K=Bg,loadTsconfigPathsFn:B=Tu,readFileFn:R=async(x)=>Bun.file(x).text(),unlinkFn:k=async(x)=>{await Bun.file(x).unlink()},watchMode:S,semantic:j,semanticLayerFactory:P}=u;if(!vu.isAbsolute(g))throw new Y("validation",`Gildash: projectRoot must be an absolute path, got: "${g}"`);if(!Q(g))throw new Y("validation",`Gildash: projectRoot does not exist: "${g}"`);let f=z?z():new gg({projectRoot:g}),v=f.open();if(Eu(v))throw v.data;try{let x=await I(g),gu=x[0]?.project??vu.basename(g),d=w?w():(()=>{let c=f;return{fileRepo:new _g(c),symbolRepo:new $g(c),relationRepo:new Jg(c),parseCache:new Xg(J)}})(),e=w?null:f,U=e?new Sg(e):null,D=e?new Rg(e):null,C=S??!0,n=crypto.randomUUID(),y;if(C)y=await Promise.resolve(V(f,process.pid,{instanceId:n}));else y="owner";let H={projectRoot:g,extensions:_,ignorePatterns:$,logger:O,defaultProject:gu,role:y,db:f,symbolRepo:d.symbolRepo,relationRepo:d.relationRepo,fileRepo:d.fileRepo,parseCache:d.parseCache,annotationRepo:U,changelogRepo:D,annotationSearchFn:Y_,releaseWatcherRoleFn:X,parseSourceFn:A,extractSymbolsFn:T,extractRelationsFn:q,symbolSearchFn:h,relationSearchFn:Z,patternSearchFn:K,readFileFn:R,unlinkFn:k,existsSyncFn:Q,acquireWatcherRoleFn:V,updateHeartbeatFn:M,watcherFactory:N,coordinatorFactory:W,instanceId:n,closed:!1,coordinator:null,watcher:null,timer:null,signalHandlers:[],tsconfigPaths:null,boundaries:x,onIndexedCallbacks:new Set,onFileChangedCallbacks:new Set,onErrorCallbacks:new Set,onRoleChangedCallbacks:new Set,graphCache:null,graphCacheKey:null,graphCacheBuiltAt:null,semanticLayer:null};if(hu(g),H.tsconfigPaths=await B(g),j){let c=vu.join(g,"tsconfig.json");try{if(P)H.semanticLayer=P(c);else{let F=au.create(c);if(Eu(F))throw F.data;H.semanticLayer=F}}catch(F){if(F instanceof Y)throw F;throw new Y("semantic","Gildash: semantic layer creation failed",{cause:F})}}if(y==="owner")await A_(H,{isWatchMode:C});else{let c=0,F=async()=>{try{let m=await Promise.resolve(H.acquireWatcherRoleFn(H.db,process.pid,{instanceId:H.instanceId}));if(c=0,m==="owner"){H.role="owner";for(let E of H.onRoleChangedCallbacks)try{E("owner")}catch(p){H.logger.error("[Gildash] onRoleChanged callback threw:",p)}clearInterval(H.timer),H.timer=null;try{await A_(H,{isWatchMode:!0})}catch(E){if(H.logger.error("[Gildash] owner promotion failed, reverting to reader",E),H.role="reader",H.timer!==null)clearInterval(H.timer),H.timer=null;if(H.watcher){let p=await H.watcher.close();if(Eu(p))H.logger.error("[Gildash] watcher close error during promotion rollback",p.data);H.watcher=null}if(H.coordinator)await H.coordinator.shutdown().catch((p)=>H.logger.error("[Gildash] coordinator shutdown error during promotion rollback",p)),H.coordinator=null;try{H.releaseWatcherRoleFn(H.db,process.pid)}catch(p){H.logger.error("[Gildash] failed to release watcher role during promotion rollback",p)}H.timer=setInterval(F,D_)}}}catch(m){c++;let E=m instanceof Y?m:new Y("watcher","Gildash: healthcheck error",{cause:m});for(let p of H.onErrorCallbacks)try{p(E)}catch(Uu){H.logger.error("[Gildash] onError callback threw:",Uu)}if(H.logger.error("[Gildash] healthcheck error",m),c>=k0)H.logger.error("[Gildash] healthcheck failed too many times, shutting down"),clearInterval(H.timer),H.timer=null,ou(H).catch((p)=>H.logger.error("[Gildash] close error during healthcheck shutdown",p))}};H.timer=setInterval(F,D_)}if(C)F0(H,()=>ou(H));return H}catch(x){if(f.close(),x instanceof Y)throw x;throw new Y("store","Gildash: initialization failed",{cause:x})}}async function ou(u,g){if(u.closed)return;u.closed=!0;let _=[];for(let[$,J]of u.signalHandlers)if($==="beforeExit")process.off("beforeExit",J);else process.off($,J);if(u.signalHandlers=[],u.semanticLayer){try{u.semanticLayer.dispose()}catch($){_.push($ instanceof Error?$:Error(String($)))}u.semanticLayer=null}if(u.coordinator)try{await u.coordinator.shutdown()}catch($){_.push($ instanceof Error?$:Error(String($)))}if(u.watcher){let $=await u.watcher.close();if(Eu($))_.push($.data)}if(u.timer!==null)clearInterval(u.timer),u.timer=null;try{u.releaseWatcherRoleFn(u.db,process.pid)}catch($){_.push($ instanceof Error?$:Error(String($)))}try{u.db.close()}catch($){_.push($ instanceof Error?$:Error(String($)))}if(g?.cleanup)for(let $ of["","-wal","-shm"])try{await u.unlinkFn(vu.join(u.projectRoot,Yu,fu+$))}catch{}if(_.length>0)throw new Y("close","Gildash: one or more errors occurred during close()",{cause:_})}import{isErr as S_}from"@zipbul/result";function R_(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");let J=u.parseSourceFn(g,_,$);if(S_(J))throw J.data;return u.parseCache.set(g,J),J}async function n_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");let $=new Map,J=[];return await Promise.all(g.map(async(O)=>{try{let Q=await u.readFileFn(O),z=u.parseSourceFn(O,Q,_);if(!S_(z))$.set(O,z);else J.push({filePath:O,error:z.data})}catch(Q){J.push({filePath:O,error:Q instanceof Error?Q:Error(String(Q))})}})),{parsed:$,failures:J}}function k_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");return u.parseCache.get(g)}function T_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");return u.extractSymbolsFn(g)}function q_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");return u.extractRelationsFn(g.program,g.filePath,u.tsconfigPaths??void 0)}import F_ from"path";function G_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.symbolRepo.getStats(g??u.defaultProject)}catch(_){if(_ instanceof Y)throw _;throw new Y("store","Gildash: getStats failed",{cause:_})}}function kg(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.symbolSearchFn({symbolRepo:u.symbolRepo,project:u.defaultProject,query:g})}catch(_){if(_ instanceof Y)throw _;throw new Y("search","Gildash: searchSymbols failed",{cause:_})}}function j_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:u.defaultProject,query:g})}catch(_){if(_ instanceof Y)throw _;throw new Y("search","Gildash: searchRelations failed",{cause:_})}}function E_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.symbolSearchFn({symbolRepo:u.symbolRepo,project:void 0,query:g})}catch(_){if(_ instanceof Y)throw _;throw new Y("search","Gildash: searchAllSymbols failed",{cause:_})}}function v_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:void 0,query:g})}catch(_){if(_ instanceof Y)throw _;throw new Y("search","Gildash: searchAllRelations failed",{cause:_})}}function b_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.fileRepo.getAllFiles(g??u.defaultProject)}catch(_){if(_ instanceof Y)throw _;throw new Y("store","Gildash: listIndexedFiles failed",{cause:_})}}function f_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:_??u.defaultProject,query:{srcFilePath:g,dstFilePath:g,limit:1e4}})}catch($){if($ instanceof Y)throw $;throw new Y("search","Gildash: getInternalRelations failed",{cause:$})}}function P_(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{let J=$??u.defaultProject,O=u.symbolSearchFn({symbolRepo:u.symbolRepo,project:J,query:{text:g,exact:!0,filePath:_,limit:1}});if(O.length===0)return null;let Q=O[0],z=Q.detail,N={...Q,members:Array.isArray(z.members)?z.members:void 0,jsDoc:typeof z.jsDoc==="string"?z.jsDoc:void 0,parameters:typeof z.parameters==="string"?z.parameters:void 0,returnType:typeof z.returnType==="string"?z.returnType:void 0,heritage:Array.isArray(z.heritage)?z.heritage:void 0,decorators:Array.isArray(z.decorators)?z.decorators:void 0,typeParameters:typeof z.typeParameters==="string"?z.typeParameters:void 0};if(u.semanticLayer)try{let W=F_.isAbsolute(_)?_:F_.resolve(u.projectRoot,_),w=u.semanticLayer.lineColumnToPosition(W,Q.span.start.line,Q.span.start.column);if(w!==null){let V=u.semanticLayer.findNamePosition(W,w,Q.name)??w,X=u.semanticLayer.collectTypeAt(W,V);if(X)N.resolvedType=X}}catch{}return N}catch(J){if(J instanceof Y)throw J;throw new Y("search","Gildash: getFullSymbol failed",{cause:J})}}function y_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{let $=_??u.defaultProject,J=u.fileRepo.getFile($,g);if(!J)throw new Y("search",`Gildash: file '${g}' is not in the index`);let O=u.symbolRepo.getFileSymbols($,g),Q=u.relationRepo.getOutgoing($,g);return{filePath:J.filePath,lineCount:J.lineCount??0,size:J.size,symbolCount:O.length,exportedSymbolCount:O.filter((z)=>z.isExported).length,relationCount:Q.length}}catch($){if($ instanceof Y)throw $;throw new Y("store","Gildash: getFileStats failed",{cause:$})}}function m_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{return u.fileRepo.getFile(_??u.defaultProject,g)}catch($){if($ instanceof Y)throw $;throw new Y("store","Gildash: getFileInfo failed",{cause:$})}}function h_(u,g,_){return kg(u,{filePath:g,project:_??void 0,limit:1e4})}function i_(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{let J=u.symbolSearchFn({symbolRepo:u.symbolRepo,project:_??u.defaultProject,query:{filePath:g,isExported:!0}}).map((O)=>({name:O.name,kind:O.kind,parameters:O.detail.parameters??void 0,returnType:O.detail.returnType??void 0,jsDoc:O.detail.jsDoc??void 0}));return{filePath:g,exports:J}}catch($){if($ instanceof Y)throw $;throw new Y("search","Gildash: getModuleInterface failed",{cause:$})}}import wu from"path";function bu(u,g,_,$){let J=$??u.defaultProject,O=u.symbolSearchFn({symbolRepo:u.symbolRepo,project:J,query:{text:g,exact:!0,filePath:_,limit:1}});if(O.length===0)return null;let Q=O[0],z=wu.isAbsolute(_)?_:wu.resolve(u.projectRoot,_),N=u.semanticLayer.lineColumnToPosition(z,Q.span.start.line,Q.span.start.column);if(N===null)return null;let W=u.semanticLayer.findNamePosition(z,N,Q.name)??N;return{sym:Q,position:W,absPath:z}}function x_(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{let J=bu(u,g,_,$);if(!J)return null;return u.semanticLayer.collectTypeAt(J.absPath,J.position)}catch(J){if(J instanceof Y)throw J;throw new Y("search","Gildash: getResolvedType failed",{cause:J})}}function p_(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{let J=bu(u,g,_,$);if(!J)throw new Y("search",`Gildash: symbol '${g}' not found in '${_}'`);return u.semanticLayer.findReferences(J.absPath,J.position)}catch(J){if(J instanceof Y)throw J;throw new Y("search","Gildash: getSemanticReferences failed",{cause:J})}}function l_(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{let J=bu(u,g,_,$);if(!J)throw new Y("search",`Gildash: symbol '${g}' not found in '${_}'`);return u.semanticLayer.findImplementations(J.absPath,J.position)}catch(J){if(J instanceof Y)throw J;throw new Y("search","Gildash: getImplementations failed",{cause:J})}}function d_(u,g,_,$,J,O){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{let Q=bu(u,g,_,O);if(!Q)throw new Y("search",`Gildash: source symbol '${g}' not found in '${_}'`);let z=bu(u,$,J,O);if(!z)throw new Y("search",`Gildash: target symbol '${$}' not found in '${J}'`);return u.semanticLayer.isTypeAssignableTo(Q.absPath,Q.position,z.absPath,z.position)}catch(Q){if(Q instanceof Y)throw Q;throw new Y("semantic","Gildash: isTypeAssignableTo failed",{cause:Q})}}function r_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{let _=wu.isAbsolute(g)?g:wu.resolve(u.projectRoot,g);return u.semanticLayer.collectFileTypes(_)}catch(_){if(_ instanceof Y)throw _;throw new Y("semantic","Gildash: getFileTypes failed",{cause:_})}}function c_(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{let J=wu.isAbsolute(g)?g:wu.resolve(u.projectRoot,g),O=u.semanticLayer.lineColumnToPosition(J,_,$);if(O===null)return null;return u.semanticLayer.collectTypeAt(J,O)}catch(J){if(J instanceof Y)throw J;throw new Y("semantic","Gildash: getResolvedTypeAt failed",{cause:J})}}function a_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{let _=wu.isAbsolute(g.source.filePath)?g.source.filePath:wu.resolve(u.projectRoot,g.source.filePath),$=wu.isAbsolute(g.target.filePath)?g.target.filePath:wu.resolve(u.projectRoot,g.target.filePath),J=u.semanticLayer.lineColumnToPosition(_,g.source.line,g.source.column);if(J===null)return null;let O=u.semanticLayer.lineColumnToPosition($,g.target.line,g.target.column);if(O===null)return null;return u.semanticLayer.isTypeAssignableTo(_,J,$,O)}catch(_){if(_ instanceof Y)throw _;throw new Y("semantic","Gildash: isTypeAssignableToAt failed",{cause:_})}}function s_(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new Y("semantic","Gildash: semantic layer is not enabled");try{return u.semanticLayer.getModuleInterface(g)}catch(_){if(_ instanceof Y)throw _;throw new Y("search","Gildash: getSemanticModuleInterface failed",{cause:_})}}function t_(u,g){let _=new Map(u.map((z)=>[`${z.name}::${z.filePath}`,z])),$=new Map(g.map((z)=>[`${z.name}::${z.filePath}`,z])),J=[],O=[],Q=[];for(let[z,N]of $){let W=_.get(z);if(!W)J.push(N);else if(W.fingerprint!==N.fingerprint)Q.push({before:W,after:N})}for(let[z,N]of _)if(!$.has(z))O.push(N);return{added:J,removed:O,modified:Q}}function o_(u,g){if(u.onIndexedCallbacks.add(g),!u.coordinator)return()=>{u.onIndexedCallbacks.delete(g)};let _=u.coordinator.onIndexed(g);return()=>{u.onIndexedCallbacks.delete(g),_()}}async function e_(u){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.coordinator)throw new Y("closed","Gildash: reindex() is not available for readers");try{let g=await u.coordinator.fullIndex();return tu(u),g}catch(g){if(g instanceof Y)throw g;throw new Y("index","Gildash: reindex failed",{cause:g})}}function u$(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");let J=$??u.defaultProject,O=new Set,Q=[],z=g,N=_;for(;;){let W=`${N}::${z}`;if(O.has(W))return{originalName:z,originalFilePath:N,reExportChain:Q,circular:!0};O.add(W);let w=u.relationSearchFn({relationRepo:u.relationRepo,project:J,query:{type:"re-exports",srcFilePath:N,limit:500}}),V,X;for(let M of w){let I;if(M.metaJson)try{let T=JSON.parse(M.metaJson);if(Array.isArray(T.specifiers))I=T.specifiers}catch{}if(!I)continue;let A=I.find((T)=>T.exported===z);if(!A)continue;V=M.dstFilePath,X=A.local;break}if(!V||!X)return{originalName:z,originalFilePath:N,reExportChain:Q,circular:!1};Q.push({filePath:N,exportedAs:z}),N=V,z=X}}function g$(u,g){return u.onFileChangedCallbacks.add(g),()=>{u.onFileChangedCallbacks.delete(g)}}function _$(u,g){return u.onErrorCallbacks.add(g),()=>{u.onErrorCallbacks.delete(g)}}function $$(u,g){return u.onRoleChangedCallbacks.add(g),()=>{u.onRoleChangedCallbacks.delete(g)}}async function J$(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{let $=_?.project??u.defaultProject,J=_?.filePaths?_.filePaths:u.fileRepo.getAllFiles($).map((O)=>O.filePath);return await u.patternSearchFn({pattern:g,filePaths:J})}catch($){if($ instanceof Y)throw $;throw new Y("search","Gildash: findPattern failed",{cause:$})}}async function N$(u,g,_,$){if(u.closed)throw new Y("closed","Gildash: instance is closed");try{let J=$??u.defaultProject,O=new Set,Q=(z,N,W)=>{let w=`${z}::${N}`;if(O.has(w))return{symbolName:z,filePath:N,kind:W,children:[]};O.add(w);let M=u.relationSearchFn({relationRepo:u.relationRepo,project:J,query:{srcFilePath:N,srcSymbolName:z,limit:1000}}).filter((I)=>I.type==="extends"||I.type==="implements").filter((I)=>I.dstSymbolName!=null).map((I)=>Q(I.dstSymbolName,I.dstFilePath,I.type));return{symbolName:z,filePath:N,kind:W,children:M}};return Q(g,_)}catch(J){if(J instanceof Y)throw J;throw new Y("search","Gildash: getHeritageChain failed",{cause:J})}}function Q$(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.annotationRepo||!u.annotationSearchFn)return[];return u.annotationSearchFn({annotationRepo:u.annotationRepo,project:g.project??u.defaultProject,query:g})}function z$(u,g,_){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.changelogRepo)return[];let $=g instanceof Date?g.toISOString():g,J=_?.project??u.defaultProject,O=_?.limit??1000;return u.changelogRepo.getSince({project:J,since:$,symbolName:_?.symbolName,changeTypes:_?.changeTypes,filePath:_?.filePath,includeFullIndex:_?.includeFullIndex,indexRunId:_?.indexRunId,afterId:_?.afterId,limit:O}).map((z)=>({changeType:z.changeType,symbolName:z.symbolName,symbolKind:z.symbolKind,filePath:z.filePath,oldName:z.oldName,oldFilePath:z.oldFilePath,fingerprint:z.fingerprint,changedAt:z.changedAt,isFullIndex:z.isFullIndex===1,indexRunId:z.indexRunId}))}function O$(u,g){if(u.closed)throw new Y("closed","Gildash: instance is closed");if(!u.changelogRepo)return 0;let _=g instanceof Date?g.toISOString():g,$=0,J=[u.defaultProject,...u.boundaries.map((Q)=>Q.project)],O=[...new Set(J)];for(let Q of O)$+=u.changelogRepo.pruneOlderThan(Q,_);return $}class Tg{_ctx;get projectRoot(){return this._ctx.projectRoot}get role(){return this._ctx.role}get projects(){return[...this._ctx.boundaries]}constructor(u){this._ctx=u}static async open(u){let g=await C_(u);return new Tg(g)}async close(u){return ou(this._ctx,u)}parseSource(u,g,_){return R_(this._ctx,u,g,_)}async batchParse(u,g){return n_(this._ctx,u,g)}getParsedAst(u){return k_(this._ctx,u)}extractSymbols(u){return T_(this._ctx,u)}extractRelations(u){return q_(this._ctx,u)}getStats(u){return G_(this._ctx,u)}searchSymbols(u){return kg(this._ctx,u)}searchRelations(u){return j_(this._ctx,u)}searchAllSymbols(u){return E_(this._ctx,u)}searchAllRelations(u){return v_(this._ctx,u)}listIndexedFiles(u){return b_(this._ctx,u)}getInternalRelations(u,g){return f_(this._ctx,u,g)}getFullSymbol(u,g,_){return P_(this._ctx,u,g,_)}getFileStats(u,g){return y_(this._ctx,u,g)}getFileInfo(u,g){return m_(this._ctx,u,g)}getSymbolsByFile(u,g){return h_(this._ctx,u,g)}getModuleInterface(u,g){return i_(this._ctx,u,g)}getDependencies(u,g,_=1e4){return Z_(this._ctx,u,g,_)}getDependents(u,g,_=1e4){return X_(this._ctx,u,g,_)}async getAffected(u,g){return K_(this._ctx,u,g)}async hasCycle(u){return M_(this._ctx,u)}async getImportGraph(u){return B_(this._ctx,u)}async getTransitiveDependencies(u,g){return H_(this._ctx,u,g)}async getCyclePaths(u,g){return L_(this._ctx,u,g)}async getFanMetrics(u,g){return I_(this._ctx,u,g)}getResolvedType(u,g,_){return x_(this._ctx,u,g,_)}getSemanticReferences(u,g,_){return p_(this._ctx,u,g,_)}getImplementations(u,g,_){return l_(this._ctx,u,g,_)}isTypeAssignableTo(u,g,_,$,J){return d_(this._ctx,u,g,_,$,J)}getSemanticModuleInterface(u){return s_(this._ctx,u)}getFileTypes(u){return r_(this._ctx,u)}getResolvedTypeAt(u,g,_){return c_(this._ctx,u,g,_)}isTypeAssignableToAt(u){return a_(this._ctx,u)}diffSymbols(u,g){return t_(u,g)}onIndexed(u){return o_(this._ctx,u)}async reindex(){return e_(this._ctx)}resolveSymbol(u,g,_){return u$(this._ctx,u,g,_)}async findPattern(u,g){return J$(this._ctx,u,g)}async getHeritageChain(u,g,_){return N$(this._ctx,u,g,_)}onFileChanged(u){return g$(this._ctx,u)}onError(u){return _$(this._ctx,u)}onRoleChanged(u){return $$(this._ctx,u)}searchAnnotations(u){return Q$(this._ctx,u)}getSymbolChanges(u,g){return z$(this._ctx,u,g)}pruneChangelog(u){return O$(this._ctx,u)}}export{Kg as symbolSearch,Mg as relationSearch,Bg as patternSearch,_u as gildashError,Y as GildashError,Tg as Gildash,su as DependencyGraph};
|
|
2
|
+
var L$=Object.defineProperty;var I$=(u)=>u;function D$(u,_){this[u]=I$.bind(null,_)}var A$=(u,_)=>{for(var g in _)L$(u,g,{get:_[g],enumerable:!0,configurable:!0,set:D$.bind(_,g)})};var n_=import.meta.require;import{isErr as vu}from"@zipbul/result";import Eu from"path";import{existsSync as b0}from"fs";import{err as G_,isErr as q$}from"@zipbul/result";import{Database as j$}from"bun:sqlite";import{mkdirSync as F$,unlinkSync as v_,existsSync as E_}from"fs";import{dirname as n$,join as b_}from"path";import{drizzle as G$}from"drizzle-orm/bun-sqlite";import{migrate as v$}from"drizzle-orm/bun-sqlite/migrator";class w extends Error{type;constructor(u,_,g){super(_,g);this.type=u;this.name="GildashError"}}function $u(u,_,g){return new w(u,_,g!==void 0?{cause:g}:void 0)}var Yu=".gildash",yu="gildash.db";var u_={};A$(u_,{watcherOwner:()=>T$,symbols:()=>b,symbolChangelog:()=>Ju,relations:()=>L,files:()=>o,annotations:()=>Nu});import{sql as C$}from"drizzle-orm";import{sqliteTable as Du,text as n,integer as _u,real as S$,index as Qu,primaryKey as R$,foreignKey as fu,check as k$}from"drizzle-orm/sqlite-core";var o=Du("files",{project:n("project").notNull(),filePath:n("file_path").notNull(),mtimeMs:S$("mtime_ms").notNull(),size:_u("size").notNull(),contentHash:n("content_hash").notNull(),updatedAt:n("updated_at").notNull(),lineCount:_u("line_count")},(u)=>[R$({columns:[u.project,u.filePath]})]),b=Du("symbols",{id:_u("id").primaryKey({autoIncrement:!0}),project:n("project").notNull(),filePath:n("file_path").notNull(),kind:n("kind").notNull(),name:n("name").notNull(),startLine:_u("start_line").notNull(),startColumn:_u("start_column").notNull(),endLine:_u("end_line").notNull(),endColumn:_u("end_column").notNull(),isExported:_u("is_exported").notNull().default(0),signature:n("signature"),fingerprint:n("fingerprint"),detailJson:n("detail_json"),contentHash:n("content_hash").notNull(),indexedAt:n("indexed_at").notNull(),resolvedType:n("resolved_type"),structuralFingerprint:n("structural_fingerprint")},(u)=>[Qu("idx_symbols_project_file").on(u.project,u.filePath),Qu("idx_symbols_project_kind").on(u.project,u.kind),Qu("idx_symbols_project_name").on(u.project,u.name),Qu("idx_symbols_fingerprint").on(u.project,u.fingerprint),fu({columns:[u.project,u.filePath],foreignColumns:[o.project,o.filePath]}).onDelete("cascade")]),L=Du("relations",{id:_u("id").primaryKey({autoIncrement:!0}),project:n("project").notNull(),type:n("type").notNull(),srcFilePath:n("src_file_path").notNull(),srcSymbolName:n("src_symbol_name"),dstProject:n("dst_project").notNull(),dstFilePath:n("dst_file_path").notNull(),dstSymbolName:n("dst_symbol_name"),metaJson:n("meta_json")},(u)=>[Qu("idx_relations_src").on(u.project,u.srcFilePath),Qu("idx_relations_dst").on(u.dstProject,u.dstFilePath),Qu("idx_relations_type").on(u.project,u.type),Qu("idx_relations_project_type_src").on(u.project,u.type,u.srcFilePath),fu({columns:[u.project,u.srcFilePath],foreignColumns:[o.project,o.filePath]}).onDelete("cascade"),fu({columns:[u.dstProject,u.dstFilePath],foreignColumns:[o.project,o.filePath]}).onDelete("cascade")]),Nu=Du("annotations",{id:_u("id").primaryKey({autoIncrement:!0}),project:n("project").notNull(),filePath:n("file_path").notNull(),tag:n("tag").notNull(),value:n("value").notNull().default(""),source:n("source").notNull(),symbolName:n("symbol_name"),startLine:_u("start_line").notNull(),startColumn:_u("start_column").notNull(),endLine:_u("end_line").notNull(),endColumn:_u("end_column").notNull(),indexedAt:n("indexed_at").notNull()},(u)=>[Qu("idx_annotations_project_file").on(u.project,u.filePath),Qu("idx_annotations_project_tag").on(u.project,u.tag),Qu("idx_annotations_project_symbol").on(u.project,u.symbolName),fu({columns:[u.project,u.filePath],foreignColumns:[o.project,o.filePath]}).onDelete("cascade")]),Ju=Du("symbol_changelog",{id:_u("id").primaryKey({autoIncrement:!0}),project:n("project").notNull(),changeType:n("change_type").notNull(),symbolName:n("symbol_name").notNull(),symbolKind:n("symbol_kind").notNull(),filePath:n("file_path").notNull(),oldName:n("old_name"),oldFilePath:n("old_file_path"),fingerprint:n("fingerprint"),changedAt:n("changed_at").notNull(),isFullIndex:_u("is_full_index").notNull().default(0),indexRunId:n("index_run_id").notNull()},(u)=>[Qu("idx_changelog_project_changed_at").on(u.project,u.changedAt),Qu("idx_changelog_project_name").on(u.project,u.symbolName),Qu("idx_changelog_project_run").on(u.project,u.indexRunId)]),T$=Du("watcher_owner",{id:_u("id").primaryKey(),pid:_u("pid").notNull(),startedAt:n("started_at").notNull(),heartbeatAt:n("heartbeat_at").notNull(),instanceId:n("instance_id")},(u)=>[k$("watcher_owner_singleton",C$`${u.id} = 1`)]);class __{client=null;drizzle=null;dbPath;txDepth=0;constructor(u){this.dbPath=b_(u.projectRoot,Yu,yu)}get drizzleDb(){if(!this.drizzle)throw Error("Database is not open. Call open() first.");return this.drizzle}open(){try{F$(n$(this.dbPath),{recursive:!0}),this.client=new j$(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=G$(this.client,{schema:u_}),v$(this.drizzle,{migrationsFolder:b_(import.meta.dirname,"migrations")});let u=this.client.prepare("PRAGMA foreign_key_check").all();if(u.length>0)throw Error(`FK integrity violation after migration: ${JSON.stringify(u.slice(0,5))}`);this.client.run("PRAGMA foreign_keys = ON"),this.registerRegexpUdf(this.client)}catch(u){if(this.isCorruptionError(u)&&E_(this.dbPath)){this.closeClient(),v_(this.dbPath);for(let g of["-wal","-shm"]){let $=this.dbPath+g;if(E_($))v_($)}let _=this.open();if(q$(_))return G_($u("store",`Failed to recover database at ${this.dbPath}`,_.data));return _}return G_($u("store",`Failed to open database at ${this.dbPath}`,u))}}close(){this.closeClient(),this.drizzle=null}transaction(u){let _=this.requireClient();if(this.txDepth===0){this.txDepth++;try{return _.transaction(()=>u(this))()}finally{this.txDepth--}}let g=`sp_${this.txDepth++}`;_.run(`SAVEPOINT "${g}"`);try{let $=u(this);return _.run(`RELEASE SAVEPOINT "${g}"`),$}catch($){throw _.run(`ROLLBACK TO SAVEPOINT "${g}"`),_.run(`RELEASE SAVEPOINT "${g}"`),$}finally{this.txDepth--}}immediateTransaction(u){let _=this.requireClient();this.txDepth++,_.run("BEGIN IMMEDIATE");try{let g=u();return _.run("COMMIT"),g}catch(g){throw _.run("ROLLBACK"),g}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(u,_){let g=new Date().toISOString();this.requireClient().prepare("INSERT INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(u,g,g,_??null)}replaceOwner(u,_){let g=new Date().toISOString();this.requireClient().prepare("INSERT OR REPLACE INTO watcher_owner (id, pid, started_at, heartbeat_at, instance_id) VALUES (1, ?, ?, ?, ?)").run(u,g,g,_??null)}touchOwner(u){let _=new Date().toISOString();this.requireClient().prepare("UPDATE watcher_owner SET heartbeat_at = ? WHERE id = 1 AND pid = ?").run(_,u)}deleteOwner(u){this.requireClient().prepare("DELETE FROM watcher_owner WHERE id = 1 AND pid = ?").run(u)}registerRegexpUdf(u){let _=u;if(typeof _.function!=="function")return;_.function.call(u,"regexp",(g,$)=>{try{return new RegExp(g).test($)?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(u){if(!(u instanceof Error))return!1;let _=u.message.toLowerCase();return _.includes("malformed")||_.includes("corrupt")||_.includes("not a database")||_.includes("disk i/o error")||_.includes("sqlite_corrupt")}}import{eq as Tu,and as y_}from"drizzle-orm";class g_{db;constructor(u){this.db=u}getFile(u,_){return this.db.drizzleDb.select().from(o).where(y_(Tu(o.project,u),Tu(o.filePath,_))).get()??null}upsertFile(u){this.db.drizzleDb.insert(o).values({project:u.project,filePath:u.filePath,mtimeMs:u.mtimeMs,size:u.size,contentHash:u.contentHash,updatedAt:u.updatedAt,lineCount:u.lineCount??null}).onConflictDoUpdate({target:[o.project,o.filePath],set:{mtimeMs:u.mtimeMs,size:u.size,contentHash:u.contentHash,updatedAt:u.updatedAt,lineCount:u.lineCount??null}}).run()}getAllFiles(u){return this.db.drizzleDb.select().from(o).where(Tu(o.project,u)).all()}getFilesMap(u){let _=this.getAllFiles(u),g=new Map;for(let $ of _)g.set($.filePath,$);return g}deleteFile(u,_){this.db.drizzleDb.delete(o).where(y_(Tu(o.project,u),Tu(o.filePath,_))).run()}}import{eq as e,and as Ku,sql as Pu,count as E$}from"drizzle-orm";function Au(u){return u.replaceAll("\x00","").trim().split(/\s+/).map((_)=>_.trim()).filter((_)=>_.length>0).map((_)=>`"${_.replaceAll('"','""')}"*`).join(" ")}var f_=50;class $_{db;constructor(u){this.db=u}replaceFileSymbols(u,_,g,$){if(this.db.drizzleDb.delete(b).where(Ku(e(b.project,u),e(b.filePath,_))).run(),!$.length)return;let J=new Date().toISOString(),O=$.map((Q)=>({project:u,filePath:_,kind:Q.kind??"unknown",name:Q.name??"",startLine:Q.startLine??0,startColumn:Q.startColumn??0,endLine:Q.endLine??0,endColumn:Q.endColumn??0,isExported:Q.isExported??0,signature:Q.signature??null,fingerprint:Q.fingerprint??null,detailJson:Q.detailJson??null,contentHash:g,indexedAt:Q.indexedAt??J,resolvedType:Q.resolvedType??null,structuralFingerprint:Q.structuralFingerprint??null}));for(let Q=0;Q<O.length;Q+=f_)this.db.drizzleDb.insert(b).values(O.slice(Q,Q+f_)).run()}getFileSymbols(u,_){return this.db.drizzleDb.select().from(b).where(Ku(e(b.project,u),e(b.filePath,_))).all()}searchByName(u,_,g={}){let $=g.limit??50,J=Au(_);if(!J)return[];return this.db.drizzleDb.select().from(b).where(Ku(Pu`${b.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${J})`,e(b.project,u),g.kind?e(b.kind,g.kind):void 0)).orderBy(b.name).limit($).all()}searchByKind(u,_){return this.db.drizzleDb.select().from(b).where(Ku(e(b.project,u),e(b.kind,_))).orderBy(b.name).all()}getStats(u){let _=this.db.drizzleDb.select({symbolCount:E$(),fileCount:Pu`COUNT(DISTINCT ${b.filePath})`}).from(b).where(e(b.project,u)).get();return{symbolCount:_?.symbolCount??0,fileCount:_?.fileCount??0}}getByFingerprint(u,_){return this.db.drizzleDb.select().from(b).where(Ku(e(b.project,u),e(b.fingerprint,_))).all()}deleteFileSymbols(u,_){this.db.drizzleDb.delete(b).where(Ku(e(b.project,u),e(b.filePath,_))).run()}searchByQuery(u){let _=this.db.drizzleDb.select().from(b).where(Ku(u.ftsQuery?Pu`${b.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${u.ftsQuery})`:void 0,u.exactName?e(b.name,u.exactName):void 0,u.project!==void 0?e(b.project,u.project):void 0,u.kind?e(b.kind,u.kind):void 0,u.filePath!==void 0?e(b.filePath,u.filePath):void 0,u.isExported!==void 0?e(b.isExported,u.isExported?1:0):void 0,u.decorator?Pu`${b.id} IN (SELECT s.id FROM symbols s, json_each(s.detail_json, '$.decorators') je WHERE json_extract(je.value, '$.name') = ${u.decorator})`:void 0,u.resolvedType!==void 0?e(b.resolvedType,u.resolvedType):void 0)).orderBy(b.name);if(!u.regex)return _.limit(u.limit).all();let g;try{g=new RegExp(u.regex)}catch{throw new w("validation",`Invalid regex pattern: ${u.regex}`)}let $=[];for(let J of[5,20,100]){let O=u.limit*J,Q=_.limit(O).all();if($=Q.filter((z)=>g.test(z.name)),$.length>=u.limit||Q.length<O)return $.slice(0,u.limit)}return $.slice(0,u.limit)}}import{eq as d,and as Wu,isNull as P_,or as b$}from"drizzle-orm";class J_{db;constructor(u){this.db=u}replaceFileRelations(u,_,g){this.db.transaction(($)=>{if($.drizzleDb.delete(L).where(Wu(d(L.project,u),d(L.srcFilePath,_))).run(),!g.length)return;for(let J of g)$.drizzleDb.insert(L).values({project:u,type:J.type??"unknown",srcFilePath:J.srcFilePath??_,srcSymbolName:J.srcSymbolName??null,dstProject:J.dstProject??u,dstFilePath:J.dstFilePath??"",dstSymbolName:J.dstSymbolName??null,metaJson:J.metaJson??null}).run()})}getOutgoing(u,_,g){if(g!==void 0)return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(d(L.project,u),d(L.srcFilePath,_),b$(d(L.srcSymbolName,g),P_(L.srcSymbolName)))).all();return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(d(L.project,u),d(L.srcFilePath,_))).all()}getIncoming(u){let{dstProject:_,dstFilePath:g}=u;return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(d(L.dstProject,_),d(L.dstFilePath,g))).all()}getByType(u,_){return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(d(L.project,u),d(L.type,_))).all()}deleteFileRelations(u,_){this.db.drizzleDb.delete(L).where(Wu(d(L.project,u),d(L.srcFilePath,_))).run()}searchRelations(u){return this.db.drizzleDb.select({project:L.project,type:L.type,srcFilePath:L.srcFilePath,srcSymbolName:L.srcSymbolName,dstProject:L.dstProject,dstFilePath:L.dstFilePath,dstSymbolName:L.dstSymbolName,metaJson:L.metaJson}).from(L).where(Wu(u.project!==void 0?d(L.project,u.project):void 0,u.srcFilePath!==void 0?d(L.srcFilePath,u.srcFilePath):void 0,u.srcSymbolName!==void 0?d(L.srcSymbolName,u.srcSymbolName):void 0,u.dstProject!==void 0?d(L.dstProject,u.dstProject):void 0,u.dstFilePath!==void 0?d(L.dstFilePath,u.dstFilePath):void 0,u.dstSymbolName!==void 0?d(L.dstSymbolName,u.dstSymbolName):void 0,u.type!==void 0?d(L.type,u.type):void 0)).limit(u.limit).all()}retargetRelations(u){let{dstProject:_,oldFile:g,oldSymbol:$,newFile:J,newSymbol:O,newDstProject:Q}=u,z=$===null?Wu(d(L.dstProject,_),d(L.dstFilePath,g),P_(L.dstSymbolName)):Wu(d(L.dstProject,_),d(L.dstFilePath,g),d(L.dstSymbolName,$)),N={dstFilePath:J,dstSymbolName:O};if(Q!==void 0)N.dstProject=Q;this.db.drizzleDb.update(L).set(N).where(z).run()}}import{err as m_}from"@zipbul/result";import{subscribe as y$}from"@parcel/watcher";import Q_ from"path";var f$=["**/.git/**",`**/${Yu}/**`,"**/dist/**","**/node_modules/**"],P$=new Set(["package.json","tsconfig.json"]);function m$(u){return u.replaceAll("\\","/")}function h$(u){if(u==="update")return"change";if(u==="create")return"create";return"delete"}class N_{#u;#_;#g;#J;#$;#N;constructor(u,_=y$,g=console){this.#_=u.projectRoot,this.#g=[...f$,...u.ignorePatterns??[]],this.#J=new Set((u.extensions??[".ts",".mts",".cts"]).map(($)=>$.toLowerCase())),this.#$=_,this.#N=g}async start(u){try{this.#u=await this.#$(this.#_,(_,g)=>{if(_){this.#N.error($u("watcher","Callback error",_));return}try{for(let $ of g){let J=m$(Q_.relative(this.#_,$.path));if(J.startsWith(".."))continue;let O=Q_.basename(J),Q=Q_.extname(J).toLowerCase();if(!P$.has(O)&&!this.#J.has(Q))continue;if(J.endsWith(".d.ts"))continue;u({eventType:h$($.type),filePath:J})}}catch($){this.#N.error($u("watcher","Callback error",$))}},{ignore:this.#g})}catch(_){return m_($u("watcher","Failed to subscribe watcher",_))}}async close(){if(!this.#u)return;try{await this.#u.unsubscribe(),this.#u=void 0}catch(u){return m_($u("watcher","Failed to close watcher",u))}}}import z_ from"path";import{promises as x$}from"fs";var i$=["**/node_modules/**","**/.git/**",`**/${Yu}/**`,"**/dist/**"];async function mu(u){let _=[];for await(let g of x$.glob("**/package.json",{cwd:u,exclude:i$})){let $=z_.dirname(g).replaceAll("\\","/"),J=z_.join(u,g),O=await Bun.file(J).json(),Q=typeof O?.name==="string"&&O.name.length>0?O.name:z_.basename($==="."?u:$);_.push({dir:$,project:Q})}return _.sort((g,$)=>$.dir.length-g.dir.length),_}function a(u,_,g="default"){let $=u.replaceAll("\\","/");for(let J of _){if(J.dir===".")return J.project;if($===J.dir||$.startsWith(`${J.dir}/`))return J.project}return g}import h_ from"path";var Zu=new Map;async function p$(u){let _=Bun.file(u);if(!await _.exists())return null;try{let g=await _.text(),$=Bun.JSONC.parse(g);return typeof $==="object"&&$!==null?$:null}catch{return null}}async function qu(u){if(Zu.has(u))return Zu.get(u)??null;let _=h_.join(u,"tsconfig.json"),g=await p$(_);if(!g)return Zu.set(u,null),null;let $=typeof g.compilerOptions==="object"&&g.compilerOptions!==null?g.compilerOptions:null;if(!$)return Zu.set(u,null),null;let J=typeof $.baseUrl==="string"?$.baseUrl:null,O=typeof $.paths==="object"&&$.paths!==null?$.paths:null;if(!J&&!O)return Zu.set(u,null),null;let Q=J?h_.resolve(u,J):u,z=new Map;if(O)for(let[V,W]of Object.entries(O)){if(!Array.isArray(W))continue;let U=W.filter((X)=>typeof X==="string");z.set(V,U)}let N={baseUrl:Q,paths:z};return Zu.set(u,N),N}function hu(u){if(u){Zu.delete(u);return}Zu.clear()}import x_ from"path";function xu(u,_){return x_.relative(u,_).replaceAll("\\","/")}function Cu(u,_){return x_.resolve(u,_)}function Ou(u){let _=Bun.hash.xxHash64(u);return BigInt.asUintN(64,BigInt(_)).toString(16).padStart(16,"0")}import{isErr as e_}from"@zipbul/result";import{err as l$}from"@zipbul/result";import{parseSync as d$}from"oxc-parser";function ju(u,_,g,$=d$){try{let{program:J,errors:O,comments:Q}=$(u,_,g);return{filePath:u,program:J,errors:O,comments:Q,sourceText:_}}catch(J){return l$($u("parse",`Failed to parse file: ${u}`,J))}}import{promises as c$}from"fs";import{join as r$}from"path";async function i_(u){let{projectRoot:_,extensions:g,ignorePatterns:$,fileRepo:J}=u,O=J.getFilesMap(),Q=new Set,z=[],N=[],V=$.map((U)=>new Bun.Glob(U));for await(let U of c$.glob("**/*",{cwd:_})){if(!g.some((Z)=>U.endsWith(Z)))continue;if(U.startsWith("node_modules/")||U.includes("/node_modules/"))continue;if(V.some((Z)=>Z.match(U)))continue;Q.add(U);let X=r$(_,U),M=Bun.file(X),{size:I,lastModified:D}=M,q=O.get(U);if(!q){let Z=await M.text(),K=Ou(Z);z.push({filePath:U,contentHash:K,mtimeMs:D,size:I});continue}if(q.mtimeMs===D&&q.size===I){N.push({filePath:U,contentHash:q.contentHash,mtimeMs:D,size:I});continue}let j=await M.text(),h=Ou(j);if(h===q.contentHash)N.push({filePath:U,contentHash:h,mtimeMs:D,size:I});else z.push({filePath:U,contentHash:h,mtimeMs:D,size:I})}let W=[];for(let U of O.keys())if(!Q.has(U))W.push(U);return{changed:z,unchanged:N,deleted:W}}function iu(u){let _=[0];for(let g=0;g<u.length;g++)if(u[g]===`
|
|
3
|
+
`)_.push(g+1);return _}function wu(u,_){let g=0,$=u.length-1;while(g<$){let J=g+$+1>>1;if(u[J]<=_)g=J;else $=J-1}return{line:g+1,column:_-u[g]}}import{err as s$}from"@zipbul/result";import{parse as a$}from"comment-parser";function pu(u){try{let _=u.trim();if(_.startsWith("/**"))_=_.slice(3);if(_.endsWith("*/"))_=_.slice(0,-2);let $=a$(`/** ${_} */`)[0]??{description:"",tags:[]};return{description:($.description??"").trim(),tags:($.tags??[]).map((J)=>({tag:J.tag??"",name:J.name??"",type:J.type??"",description:J.description??"",optional:J.optional??!1,...J.default!==void 0?{default:J.default}:{}}))}}catch(_){return s$($u("parse","Failed to parse JSDoc comment",_))}}import{isErr as t$}from"@zipbul/result";function Su(u){let{program:_,sourceText:g,comments:$}=u,J=iu(g),O=$.filter((Z)=>Z.type==="Block"&&Z.value.startsWith("*")).sort((Z,K)=>Z.end-K.end),Q=_.body.map((Z)=>Z.start??0).sort((Z,K)=>Z-K);function z(Z,K){return{start:wu(J,Z),end:wu(J,K)}}function N(Z){let K=0,B=O.length-1,R=-1;while(K<=B){let S=K+B>>>1;if(O[S].end<=Z)R=S,K=S+1;else B=S-1}if(R<0)return;let T=O[R];K=0,B=Q.length-1;while(K<=B){let S=K+B>>>1,G=Q[S];if(G<=T.end)K=S+1;else if(G>=Z)B=S-1;else return}return`/*${T.value}*/`}function V(Z){if(!Z)return;let K=Z.typeAnnotation??Z;return g.slice(K.start,K.end)}function W(Z){if(!Z||Z.length===0)return[];return Z.map((K)=>{let B=K.expression;if(!B)return{name:"unknown"};if(B.type==="CallExpression"){let R=B.callee?.name??B.callee?.property?.name??"unknown",T=(B.arguments??[]).map((S)=>g.slice(S.start,S.end));return{name:R,arguments:T.length>0?T:void 0}}if(B.type==="Identifier")return{name:B.name??"unknown"};return{name:g.slice(B.start,B.end)}})}function U(Z){let K=Z.type==="TSParameterProperty"?Z.parameter:Z;if(K?.type==="RestElement"){let E=`...${K.argument?.name??"unknown"}`,p=K.typeAnnotation,gu=p?V(p):void 0,r={name:E,isOptional:!1};if(gu)r.type=gu;return r}if(K?.type==="AssignmentPattern"){let{left:y,right:E}=K,p=y?.name??"unknown",gu=y?.typeAnnotation,r=gu?V(gu):void 0,uu=g.slice(E.start,E.end),Y=W(y?.decorators??[]),A={name:p,isOptional:!0,defaultValue:uu};if(r)A.type=r;if(Y.length>0)A.decorators=Y;return A}let B=K?.name??K?.pattern?.name??"unknown",R=!!K?.optional,T=K?.typeAnnotation,S=T?V(T):void 0,G=W(K?.decorators??[]),f={name:B,isOptional:R};if(S)f.type=S;if(G.length>0)f.decorators=G;return f}function X(Z,K){let B=[];if(K?.async)B.push("async");if(Z.static)B.push("static");if(Z.abstract)B.push("abstract");if(Z.readonly)B.push("readonly");if(Z.override)B.push("override");if(Z.declare)B.push("declare");if(Z.const)B.push("const");let R=Z.accessibility;if(R==="private")B.push("private");else if(R==="protected")B.push("protected");else if(R==="public")B.push("public");return B}function M(Z){let K=[];if(Z.superClass){let R=g.slice(Z.superClass.start,Z.superClass.end);K.push({kind:"extends",name:R})}let B=Z.implements??[];for(let R of B){let T=R.expression??R,S=g.slice(T.start,T.end);K.push({kind:"implements",name:S})}return K}function I(Z){let K=[];for(let B of Z.extends??[]){let R=B.expression??B,T=g.slice(R.start,R.end);K.push({kind:"extends",name:T})}return K}function D(Z){let K=[];for(let B of Z)if(B.type==="MethodDefinition"){let R=B.key?.name??"unknown",T=B.value,S=B.kind??"method",G=S==="constructor"?"constructor":S==="get"?"getter":S==="set"?"setter":"method",f=X(B,T),y=(T?.params??[]).map(U),E=V(T?.returnType),p={kind:"method",name:R,span:z(B.start,B.end),isExported:!1,methodKind:G,modifiers:f,parameters:y.length>0?y:void 0,returnType:E};K.push(p)}else if(B.type==="PropertyDefinition"){let R=B.key?.name??"unknown",T=X(B),S={kind:"property",name:R,span:z(B.start,B.end),isExported:!1,modifiers:T};K.push(S)}return K}function q(Z){let K=[];for(let B of Z)if(B.type==="TSMethodSignature"){let R=B.key?.name??"unknown",T=(B.params??[]).map(U),S=V(B.returnType);K.push({kind:"method",name:R,span:z(B.start,B.end),isExported:!1,modifiers:[],methodKind:"method",parameters:T.length>0?T:void 0,returnType:S})}else if(B.type==="TSPropertySignature"){let R=B.key?.name??"unknown",T=V(B.typeAnnotation),S={kind:"property",name:R,span:z(B.start,B.end),isExported:!1,modifiers:B.readonly?["readonly"]:[],returnType:T};K.push(S)}return K}function j(Z,K){let B=Z.type??"";if(B==="FunctionDeclaration"){let R=Z.id?.name??"default",T=(Z.params??[]).map(U),S=V(Z.returnType),G=X(Z,Z),f=W(Z.decorators??[]),y=Z.typeParameters?.params?.flatMap((p)=>{let gu=p.name?.name;return gu?[gu]:[]})||void 0,E={kind:"function",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:G,parameters:T.length>0?T:void 0,returnType:S,decorators:f.length>0?f:void 0};if(y&&y.length>0)E.typeParameters=y;return E}if(B==="ClassDeclaration"||B==="ClassExpression"){let R=Z.id?.name??"default",T=M(Z),S=D(Z.body?.body??[]),G=W(Z.decorators??[]),f=X(Z,Z),y=Z.typeParameters?.params?.flatMap((p)=>{let gu=p.name?.name;return gu?[gu]:[]})||void 0,E={kind:"class",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:f,heritage:T.length>0?T:void 0,members:S.length>0?S:void 0,decorators:G.length>0?G:void 0};if(y&&y.length>0)E.typeParameters=y;return E}if(B==="VariableDeclaration"){let R=[];for(let T of Z.declarations??[]){let{id:S,init:G}=T;if(S?.type==="ObjectPattern"){for(let r of S.properties??[]){let uu=r.value?.name??r.key?.name??"unknown";R.push({kind:"variable",name:uu,span:z(r.start??T.start,r.end??T.end),isExported:K,modifiers:[]})}continue}if(S?.type==="ArrayPattern"){for(let r of S.elements??[]){if(!r||r.type!=="Identifier")continue;let uu=r.name??"unknown";R.push({kind:"variable",name:uu,span:z(r.start??T.start,r.end??T.end),isExported:K,modifiers:[]})}continue}let f=S?.name??"unknown",y="variable",E,p;if(G?.type==="FunctionExpression"||G?.type==="ArrowFunctionExpression")y="function",E=(G.params??[]).map(U),p=V(G.returnType);let gu=[];R.push({kind:y,name:f,span:z(T.start,T.end),isExported:K,modifiers:gu,parameters:E,returnType:p})}if(R.length===0)return null;if(R.length===1)return R[0];return R}if(B==="TSTypeAliasDeclaration")return{kind:"type",name:Z.id?.name??"unknown",span:z(Z.start,Z.end),isExported:K,modifiers:[]};if(B==="TSInterfaceDeclaration"){let R=Z.id?.name??"unknown",T=I(Z),S=q(Z.body?.body??[]),G=Z.typeParameters?.params?.flatMap((y)=>{let E=y.name?.name;return E?[E]:[]})||void 0,f={kind:"interface",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:[],heritage:T.length>0?T:void 0,members:S.length>0?S:void 0};if(G&&G.length>0)f.typeParameters=G;return f}if(B==="TSEnumDeclaration"){let R=Z.id?.name??"unknown",T=X(Z),G=(Z.body?.members??[]).map((f)=>({kind:"property",name:f.id?.name??f.id?.value??"unknown",span:z(f.start,f.end),isExported:!1,modifiers:[]}));return{kind:"enum",name:R,span:z(Z.start,Z.end),isExported:K,modifiers:T,members:G.length>0?G:void 0}}return null}let h=[];for(let Z of _.body){let K=null,B=Z,R=typeof B.type==="string"?B.type:"";if(R==="ExportNamedDeclaration"){let S=Z;if(S.declaration){if(K=j(S.declaration,!0),K&&!Array.isArray(K))K.span=z(S.start,S.end);else if(Array.isArray(K))for(let G of K)G.span=z(S.start,S.end)}}else if(R==="ExportDefaultDeclaration"){let S=Z,G=S.declaration;if(G){if(K=j(G,!0),K&&!Array.isArray(K))K.name=G.id?.name??"default",K.isExported=!0,K.span=z(S.start,S.end)}}else K=j(Z,!1);let T=Array.isArray(K)?K:K?[K]:[];for(let S of T){let G=Z.start??0,f=N(G);if(f){let y=pu(f);if(!t$(y))S.jsDoc=y}h.push(S)}}return h}function o$(u){if(u.kind==="function"||u.kind==="method"){let _=u.parameters?.length??0,g=u.modifiers.includes("async")?1:0;return`params:${_}|async:${g}`}return null}function e$(u){let _={};if(u.jsDoc)_.jsDoc=u.jsDoc;if(u.kind==="function"||u.kind==="method"){if(u.parameters!==void 0)_.parameters=u.parameters;if(u.returnType!==void 0)_.returnType=u.returnType}if(u.heritage?.length)_.heritage=u.heritage;if(u.decorators?.length)_.decorators=u.decorators;if(u.typeParameters?.length)_.typeParameters=u.typeParameters;if(u.modifiers?.length)_.modifiers=u.modifiers;if(u.members?.length)_.members=u.members.map((g)=>{let $=g.modifiers.find((J)=>J==="private"||J==="protected"||J==="public");return{name:g.name,kind:g.methodKind??g.kind,type:g.returnType,visibility:$,isStatic:g.modifiers.includes("static")||void 0,isReadonly:g.modifiers.includes("readonly")||void 0}});return Object.keys(_).length>0?JSON.stringify(_):null}function u0(u){let _=[u.kind];if(u.modifiers.length)_.push(`mod:${[...u.modifiers].sort().join(",")}`);if(u.typeParameters?.length)_.push(`tp:${u.typeParameters.length}`);if(u.heritage?.length){let g=[...u.heritage].sort(($,J)=>$.name.localeCompare(J.name)).map(($)=>`${$.kind}:${$.name}`).join(",");_.push(`her:${g}`)}if(u.decorators?.length)_.push(`dec:${[...u.decorators].map((g)=>g.name).sort().join(",")}`);if(u.methodKind)_.push(`mk:${u.methodKind}`);if(u.parameters)_.push(`p:${u.parameters.length}`);if(u.returnType)_.push(`rt:${u.returnType}`);if(u.members?.length){let g=u.members.map(($)=>`${$.kind}:${$.modifiers.join(",")}:${$.parameters?.length??""}:${$.returnType??""}`).sort().join(";");_.push(`mem:${u.members.length}:${Ou(g)}`)}return Ou(_.join("|"))}function p_(u,_,g,$,J){let O=o$(u),Q=Ou(`${_}|${u.kind}|${O??""}`),z=u0(u);return{project:g,filePath:$,kind:u.kind,name:_,startLine:u.span.start.line,startColumn:u.span.start.column,endLine:u.span.end.line,endColumn:u.span.end.column,isExported:u.isExported?1:0,signature:O,fingerprint:Q,detailJson:e$(u),contentHash:J,indexedAt:new Date().toISOString(),structuralFingerprint:z}}function O_(u){let{parsed:_,project:g,filePath:$,contentHash:J,symbolRepo:O}=u,Q=Su(_),z=[];for(let N of Q){z.push(p_(N,N.name,g,$,J));for(let V of N.members??[])z.push(p_(V,`${N.name}.${V.name}`,g,$,J))}O.replaceFileSymbols(g,$,J,z)}import{resolve as w_,dirname as _0,extname as g0}from"path";function Mu(u,_,g){let $=(J)=>{let O=g0(J);if(O==="")return[J+".ts",J+".d.ts",J+"/index.ts",J+"/index.d.ts",J+".mts",J+"/index.mts",J+".cts",J+"/index.cts"];if(O===".js")return[J.slice(0,-3)+".ts"];if(O===".mjs")return[J.slice(0,-4)+".mts"];if(O===".cjs")return[J.slice(0,-4)+".cts"];return[J]};if(_.startsWith(".")){let J=w_(_0(u),_);return $(J)}if(g)for(let[J,O]of g.paths){if(O.length===0)continue;let Q=J.indexOf("*");if(Q===-1){if(_===J){let z=[];for(let N of O)z.push(...$(w_(g.baseUrl,N)));return z}}else{let z=J.slice(0,Q),N=J.slice(Q+1);if(_.startsWith(z)&&(N===""||_.endsWith(N))){let V=_.slice(z.length,N===""?void 0:_.length-N.length),W=[];for(let U of O)W.push(...$(w_(g.baseUrl,U.replace("*",V))));return W}}}return[]}function l_(u,_,g,$=Mu){let J=new Map,O=u.body??[];for(let Q of O){if(Q.type!=="ImportDeclaration")continue;let z=Q.source?.value??"",N=$(_,z,g);if(N.length===0)continue;let V=N[0],W=Q.specifiers??[];for(let U of W)switch(U.type){case"ImportSpecifier":J.set(U.local.name,{path:V,importedName:U.imported.name});break;case"ImportDefaultSpecifier":J.set(U.local.name,{path:V,importedName:"default"});break;case"ImportNamespaceSpecifier":J.set(U.local.name,{path:V,importedName:"*"});break}}return J}var $0=new Set(["loc","start","end","scope"]);function Ru(u,_){if(!u||typeof u!=="object")return;if(Array.isArray(u)){for(let $ of u)Ru($,_);return}let g=u;_(g);for(let $ of Object.keys(g)){if($0.has($))continue;let J=g[$];if(J&&typeof J==="object")Ru(J,_)}}function d_(u){if(!u||typeof u!=="object"||Array.isArray(u))return null;let _=u;if((_.type==="StringLiteral"||_.type==="Literal")&&typeof _.value==="string")return _.value;return null}function Bu(u){if(!u||typeof u!=="object"||Array.isArray(u))return null;let _=u;if(_.type==="Identifier"){let g=_.name;return{root:g,parts:[],full:g}}if(_.type==="ThisExpression")return{root:"this",parts:[],full:"this"};if(_.type==="Super")return{root:"super",parts:[],full:"super"};if(_.type==="MemberExpression"){let g=[],$=_;while($.type==="MemberExpression"){let Q=$.property;if(!Q||typeof Q.name!=="string")return null;g.push(Q.name),$=$.object}let J;if($.type==="Identifier")J=$.name;else if($.type==="ThisExpression")J="this";else if($.type==="Super")J="super";else return null;g.reverse();let O=[J,...g].join(".");return{root:J,parts:g,full:O}}return null}function c_(u,_,g,$=Mu){let J=[],O=u.body??[];for(let Q of O){if(Q.type==="ImportDeclaration"){let z=Q.source?.value??"",N=$(_,z,g);if(N.length===0)continue;let V=N[0],W=Q.importKind==="type",U=Q.specifiers??[];if(U.length===0){let X={};if(W)X.isType=!0;J.push({type:W?"type-references":"imports",srcFilePath:_,srcSymbolName:null,dstFilePath:V,dstSymbolName:null,...Object.keys(X).length>0?{metaJson:JSON.stringify(X)}:{}})}else for(let X of U){let M=X.type,I=W||X.importKind==="type",D={};if(I)D.isType=!0;let q,j;if(M==="ImportDefaultSpecifier")q="default",j=X.local.name;else if(M==="ImportNamespaceSpecifier")q="*",j=X.local.name,D.importKind="namespace";else q=X.imported.name,j=X.local.name;J.push({type:I?"type-references":"imports",srcFilePath:_,srcSymbolName:j,dstFilePath:V,dstSymbolName:q,...Object.keys(D).length>0?{metaJson:JSON.stringify(D)}:{}})}continue}if(Q.type==="ExportAllDeclaration"&&Q.source){let z=Q.source?.value??"",N=$(_,z,g);if(N.length===0)continue;let V=N[0],W=Q.exportKind==="type",U={isReExport:!0};if(W)U.isType=!0;J.push({type:W?"type-references":"re-exports",srcFilePath:_,srcSymbolName:null,dstFilePath:V,dstSymbolName:null,metaJson:JSON.stringify(U)});continue}if(Q.type==="ExportNamedDeclaration"&&Q.source){let z=Q.source?.value??"",N=$(_,z,g);if(N.length===0)continue;let V=N[0],W=Q.exportKind==="type",M={isReExport:!0,specifiers:(Q.specifiers??[]).map((I)=>({local:I.local.name,exported:I.exported.name}))};if(W)M.isType=!0;J.push({type:W?"type-references":"re-exports",srcFilePath:_,srcSymbolName:null,dstFilePath:V,dstSymbolName:null,metaJson:JSON.stringify(M)})}}return Ru(u,(Q)=>{if(Q.type!=="ImportExpression")return;let z=d_(Q.source);if(!z)return;let N=$(_,z,g);if(N.length===0)return;let V=N[0];J.push({type:"imports",srcFilePath:_,srcSymbolName:null,dstFilePath:V,dstSymbolName:null,metaJson:JSON.stringify({isDynamic:!0})})}),J}function r_(u,_,g){let $=[],J=[],O=[];function Q(){if(J.length>0)return J[J.length-1]??null;return null}function z(V){if(!V)return null;let W=g.get(V.root);if(V.parts.length===0){if(W)return{dstFilePath:W.path,dstSymbolName:W.importedName,resolution:"import"};return{dstFilePath:_,dstSymbolName:V.root,resolution:"local"}}else{if(W&&W.importedName==="*"){let U=V.parts[V.parts.length-1];return{dstFilePath:W.path,dstSymbolName:U,resolution:"namespace"}}return{dstFilePath:_,dstSymbolName:V.full,resolution:"local-member"}}}function N(V){if(!V||typeof V!=="object")return;if(Array.isArray(V)){for(let X of V)N(X);return}let W=V,U=typeof W.type==="string"?W.type:"";if(U==="ClassDeclaration"||U==="ClassExpression"){let X=W,M=X.id?.name??"AnonymousClass";O.push(M),N(X.body),O.pop();return}if(U==="FunctionDeclaration"){let X=W,M=X.id?.name??"anonymous";J.push(M),N(X.body),J.pop();return}if(U==="VariableDeclarator"&&W.init&&(W.init?.type==="FunctionExpression"||W.init?.type==="ArrowFunctionExpression")){let X=W,M=X.id?.name??"anonymous";J.push(M),N(X.init?.body??X.init),J.pop();return}if(U==="MethodDefinition"&&W.value){let X=W,M=O[O.length-1]??"",I=X.key?.name??"anonymous",D=M?`${M}.${I}`:I;J.push(D),N(X.value?.body),J.pop();return}if(U==="FunctionExpression"||U==="ArrowFunctionExpression"){let X=Q(),M=X?`${X}.<anonymous>`:"<anonymous>";J.push(M),N(W.body),J.pop();return}if(U==="CallExpression"){let X=W,M=Bu(X.callee),I=z(M);if(I){let D=Q(),q={};if(D===null)q.scope="module";$.push({type:"calls",srcFilePath:_,srcSymbolName:D,dstFilePath:I.dstFilePath,dstSymbolName:I.dstSymbolName,...Object.keys(q).length>0?{metaJson:JSON.stringify(q)}:{}})}N(X.callee);for(let D of X.arguments??[])N(D);return}if(U==="NewExpression"){let X=W,M=Bu(X.callee),I=z(M);if(I){let D=Q(),q={isNew:!0};if(D===null)q.scope="module";$.push({type:"calls",srcFilePath:_,srcSymbolName:D,dstFilePath:I.dstFilePath,dstSymbolName:I.dstSymbolName,metaJson:JSON.stringify(q)})}for(let D of X.arguments??[])N(D);return}for(let X of Object.keys(W)){if(X==="loc"||X==="start"||X==="end"||X==="scope")continue;let M=W[X];if(M&&typeof M==="object")N(M)}}return N(u),$}function s_(u,_,g){let $=[];return Ru(u,(J)=>{if(J.type==="TSInterfaceDeclaration"){let z=J.id?.name??"AnonymousInterface",N=J.extends??[];for(let V of N){let W=V.expression??V,U=Bu(W);if(!U)continue;let X=W_(U,_,g);$.push({type:"extends",srcFilePath:_,srcSymbolName:z,...X})}return}if(J.type!=="ClassDeclaration"&&J.type!=="ClassExpression")return;let O=J.id?.name??"AnonymousClass";if(J.superClass){let z=Bu(J.superClass);if(z){let N=W_(z,_,g);$.push({type:"extends",srcFilePath:_,srcSymbolName:O,...N})}}let Q=J.implements??[];for(let z of Q){let N=z.expression??z,V=Bu(N);if(!V)continue;let W=W_(V,_,g);$.push({type:"implements",srcFilePath:_,srcSymbolName:O,...W})}}),$}function W_(u,_,g){let $=g.get(u.root);if($){if($.importedName==="*"){let J=u.parts[u.parts.length-1]??u.root;return{dstFilePath:$.path,dstSymbolName:J,metaJson:JSON.stringify({isNamespaceImport:!0})}}return{dstFilePath:$.path,dstSymbolName:u.parts.length>0?u.full:$.importedName}}return{dstFilePath:_,dstSymbolName:u.full,metaJson:JSON.stringify({isLocal:!0})}}function lu(u,_,g,$=Mu){let J=l_(u,_,g,$),O=c_(u,_,g,$),Q=r_(u,_,J),z=s_(u,_,J);return[...O,...Q,...z]}function V_(u){let{ast:_,project:g,filePath:$,relationRepo:J,projectRoot:O,tsconfigPaths:Q,knownFiles:z,boundaries:N}=u,V=Cu(O,$),U=lu(_,V,Q,z?(M,I,D)=>{let q=Mu(M,I,D);for(let j of q){let h=xu(O,j);if(N){let Z=a(h,N);if(z.has(`${Z}::${h}`))return[j]}else if(z.has(`${g}::${h}`))return[j]}return[]}:void 0),X=[];for(let M of U){let I=xu(O,M.dstFilePath);if(I.startsWith(".."))continue;let D=xu(O,M.srcFilePath),q=N?a(I,N):g;X.push({project:g,type:M.type,srcFilePath:D,srcSymbolName:M.srcSymbolName??null,dstProject:q,dstFilePath:I,dstSymbolName:M.dstSymbolName??null,metaJson:M.metaJson??null})}return J.replaceFileRelations(g,$,X),X.length}import{isErr as J0}from"@zipbul/result";var a_=/(?:^|\s)@([a-zA-Z][\w-]*\w|[a-zA-Z])\s*(.*)$/m;function Q0(u){let _=Su(u),g=[];for(let $ of _){g.push({name:$.name,startLine:$.span.start.line});for(let J of $.members??[])g.push({name:`${$.name}.${J.name}`,startLine:J.span.start.line})}return g.sort(($,J)=>$.startLine-J.startLine),g}function U_(u,_,g){let $=0,J=u.length-1;while($<=J){let O=$+J>>1;if(u[O].startLine<=_)$=O+1;else J=O-1}if($<u.length){let O=u[$];if(O.startLine-_<=g)return O.name}return null}function du(u,_,g){let $=wu(u,_),J=wu(u,g);return{start:$,end:J}}function t_(u){let{comments:_,sourceText:g}=u;if(!_.length)return[];let $=iu(g),J=Q0(u),O=[],Q=[..._].sort((N,V)=>N.start-V.start),z=null;for(let N of Q)if(N.type==="Block"&&N.value.startsWith("*")){z=null;let V=`/*${N.value}*/`,W=pu(V);if(J0(W))continue;let U=W;if(!U.tags?.length)continue;let X=wu($,N.end),M=U_(J,X.line,3),I=g.slice(N.start,N.end);for(let D of U.tags){let q=[D.name,D.description].filter(Boolean).join(" "),j=`@${D.tag}`,h=I.indexOf(j),Z;if(h>=0){let K=N.start+h,B=g.indexOf(`
|
|
4
|
+
`,K),R=B>=0?Math.min(B,N.end):N.end;Z=du($,K,R)}else Z=du($,N.start,N.end);O.push({tag:D.tag,value:q,source:"jsdoc",span:Z,symbolName:M})}}else if(N.type==="Block"){z=null;let V=N.value.split(`
|
|
5
|
+
`),W=0;for(let U of V){let X=U.replace(/^\s*\*?\s?/,""),M=a_.exec(X);if(M){let I=M[1],D=M[2]?.trim()??"",q=`@${I}`,j=U.indexOf(q),h=N.start+2+W+(j>=0?j:0),Z=N.start+2+W+U.length,K=du($,h,Z),B=wu($,N.end),R=U_(J,B.line,3);O.push({tag:I,value:D,source:"block",span:K,symbolName:R})}W+=U.length+1}}else{let V=N.value,W=a_.exec(V),U=wu($,N.start),X=wu($,N.end);if(W){let M=W[1],I=W[2]?.trim()??"",D=`@${M}`,q=V.indexOf(D),j=N.start+2+(q>=0?q:0),h=du($,j,N.end),Z=U_(J,X.line,3),K={tag:M,value:I,source:"line",span:h,symbolName:Z};O.push(K),z={annotation:K,endLine:X.line}}else if(z&&U.line===z.endLine+1){let M=V.trim();if(M)z.annotation.value+=" "+M,z.annotation.span.end=wu($,N.end),z.endLine=X.line}else z=null}return O}function Y_(u){let{parsed:_,project:g,filePath:$,annotationRepo:J}=u,O=t_(_);if(J.deleteFileAnnotations(g,$),!O.length)return 0;let Q=new Date().toISOString(),z=O.map((N)=>({project:g,filePath:$,tag:N.tag,value:N.value,source:N.source,symbolName:N.symbolName,startLine:N.span.start.line,startColumn:N.span.start.column,endLine:N.span.end.line,endColumn:N.span.end.column,indexedAt:Q}));return J.insertBatch(g,$,z),O.length}function o_(u,_){let g=[],$=[],J=[];for(let[W,U]of _)if(!u.has(W))g.push({name:U.name,filePath:U.filePath,kind:U.kind,fingerprint:U.fingerprint});for(let[W,U]of u)if(!_.has(W))$.push({name:U.name,filePath:U.filePath,kind:U.kind,fingerprint:U.fingerprint});if(!g.length||!$.length)return{renamed:J,added:g,removed:$};let O=new Map,Q=new Map;for(let W of g){let U=O.get(W.filePath)??[];U.push(W),O.set(W.filePath,U)}for(let W of $){let U=Q.get(W.filePath)??[];U.push(W),Q.set(W.filePath,U)}let z=new Set,N=new Set;for(let[W,U]of O){let X=Q.get(W);if(!X)continue;for(let M of new Set(U.map((I)=>I.kind))){let I=U.filter((Z)=>Z.kind===M&&!z.has(Z)),D=X.filter((Z)=>Z.kind===M&&!N.has(Z));if(!I.length||!D.length)continue;let q=(Z,K)=>{return K.get(`${Z.filePath}::${Z.name}`)?.structuralFingerprint??null},j=(Z,K)=>{return K.get(`${Z.filePath}::${Z.name}`)?.startLine??0},h=new Map;for(let Z of D){let K=q(Z,u);if(!K)continue;let B=h.get(K)??[];B.push(Z),h.set(K,B)}for(let Z of I){if(z.has(Z))continue;let K=q(Z,_);if(!K)continue;let B=h.get(K);if(!B)continue;let R=B.filter((S)=>!N.has(S));if(!R.length)continue;let T=R[0];if(R.length>1){let S=j(Z,_),G=Math.abs(j(T,u)-S);for(let f=1;f<R.length;f++){let y=Math.abs(j(R[f],u)-S);if(y<G)G=y,T=R[f]}}J.push({oldName:T.name,newName:Z.name,filePath:W,kind:M}),z.add(Z),N.add(T)}}}let V=J.filter((W)=>!W.oldName.includes("."));for(let W of V){let U=`${W.oldName}.`,X=`${W.newName}.`,M=$.filter((D)=>D.filePath===W.filePath&&D.name.startsWith(U)&&!N.has(D)),I=g.filter((D)=>D.filePath===W.filePath&&D.name.startsWith(X)&&!z.has(D));for(let D of M){let q=D.name.slice(U.length),j=I.find((h)=>h.name.slice(X.length)===q);if(j)J.push({oldName:D.name,newName:j.name,filePath:W.filePath,kind:D.kind}),z.add(j),N.add(D)}}return{renamed:J,added:g.filter((W)=>!z.has(W)),removed:$.filter((W)=>!N.has(W))}}var N0=100,ug=50;class Z_{opts;logger;callbacks=new Set;indexingLock=!1;pendingEvents=[];debounceTimer=null;currentIndexing=null;pendingFullIndex=!1;pendingFullIndexWaiters=[];tsconfigPathsRaw;boundariesRefresh=null;lastPruneAt=0;constructor(u){this.opts=u,this.logger=u.logger??console,this.tsconfigPathsRaw=qu(u.projectRoot)}get tsconfigPaths(){return this.tsconfigPathsRaw}fullIndex(){return this.startIndex(void 0,!0)}incrementalIndex(u){return this.startIndex(u,!1)}onIndexed(u){return this.callbacks.add(u),()=>this.callbacks.delete(u)}handleWatcherEvent(u){if(u.filePath.endsWith("tsconfig.json")){hu(this.opts.projectRoot),this.tsconfigPathsRaw=qu(this.opts.projectRoot),this.fullIndex().catch((_)=>{this.logger.error("[IndexCoordinator] fullIndex failed after tsconfig change:",_)});return}if(u.filePath.endsWith("package.json")){let _=this.opts.discoverProjectsFn??mu;this.boundariesRefresh=_(this.opts.projectRoot).then((g)=>{this.opts.boundaries=g})}if(this.pendingEvents.push(u),this.debounceTimer===null)this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.flushPending()},N0)}async shutdown(){if(this.debounceTimer!==null)clearTimeout(this.debounceTimer),this.debounceTimer=null;if(this.currentIndexing)await this.currentIndexing}startIndex(u,_){if(this.indexingLock){if(_)return this.pendingFullIndex=!0,new Promise(($,J)=>{this.pendingFullIndexWaiters.push({resolve:$,reject:J})});return this.currentIndexing}this.indexingLock=!0;let g=this.doIndex(u,_).then(($)=>{return this.fireCallbacks($),$}).finally(()=>{if(this.indexingLock=!1,this.currentIndexing=null,this.pendingFullIndex){this.pendingFullIndex=!1;let $=this.pendingFullIndexWaiters.splice(0);this.startIndex(void 0,!0).then((J)=>{for(let O of $)O.resolve(J)}).catch((J)=>{for(let O of $)O.reject(J)})}else if(this.pendingEvents.length>0){let $=this.pendingEvents.splice(0);this.startIndex($,!1).catch((J)=>this.logger.error("[IndexCoordinator] incremental drain error",J))}});return this.currentIndexing=g,g}async doIndex(u,_){let g=Date.now(),{fileRepo:$,symbolRepo:J,relationRepo:O,dbConnection:Q}=this.opts;if(this.boundariesRefresh)await this.boundariesRefresh,this.boundariesRefresh=null;let z,N;if(u!==void 0)z=u.filter((Y)=>Y.eventType==="create"||Y.eventType==="change").map((Y)=>({filePath:Y.filePath,contentHash:"",mtimeMs:0,size:0})),N=u.filter((Y)=>Y.eventType==="delete").map((Y)=>Y.filePath);else{let Y=new Map;for(let C of this.opts.boundaries)for(let[k,P]of $.getFilesMap(C.project))Y.set(k,P);let A=await i_({projectRoot:this.opts.projectRoot,extensions:this.opts.extensions,ignorePatterns:this.opts.ignorePatterns,fileRepo:{getFilesMap:()=>Y}});z=A.changed,N=A.deleted}let V=await this.tsconfigPathsRaw??void 0,W=new Map;for(let Y of N){let A=a(Y,this.opts.boundaries),C=J.getFileSymbols(A,Y);W.set(Y,C)}let U=crypto.randomUUID(),X=new Map,M=new Map,I=(Y)=>({name:Y.name,filePath:Y.filePath,kind:Y.kind,fingerprint:Y.fingerprint,structuralFingerprint:Y.structuralFingerprint??null,startLine:Y.startLine,isExported:Y.isExported??0});if(_)for(let Y of this.opts.boundaries)for(let A of $.getAllFiles(Y.project))for(let C of J.getFileSymbols(Y.project,A.filePath))X.set(`${C.filePath}::${C.name}`,I(C));else{for(let Y of z){let A=a(Y.filePath,this.opts.boundaries);for(let C of J.getFileSymbols(A,Y.filePath))X.set(`${C.filePath}::${C.name}`,I(C))}for(let[,Y]of W)for(let A of Y)X.set(`${A.filePath}::${A.name}`,I(A))}let D=(Y)=>`${Y.type}|${Y.srcFilePath}|${Y.dstFilePath}|${Y.srcSymbolName??""}|${Y.dstSymbolName??""}|${Ou(Y.metaJson??"")}`,q=new Map;if(_)for(let Y of this.opts.boundaries)for(let A of $.getAllFiles(Y.project))for(let C of O.getOutgoing(Y.project,A.filePath))q.set(D(C),C);else{for(let Y of z){let A=a(Y.filePath,this.opts.boundaries);for(let C of O.getOutgoing(A,Y.filePath))q.set(D(C),C)}for(let Y of N){let A=a(Y,this.opts.boundaries);for(let C of O.getOutgoing(A,Y))q.set(D(C),C)}}let{annotationRepo:j,changelogRepo:h}=this.opts,Z=()=>{for(let Y of N){let A=a(Y,this.opts.boundaries);if(J.deleteFileSymbols(A,Y),O.deleteFileRelations(A,Y),j)j.deleteFileAnnotations(A,Y);$.deleteFile(A,Y)}},K=0,B=async()=>{let{projectRoot:Y,boundaries:A}=this.opts,{parseCache:C}=this.opts,k=0,P=0,H=0,t=[],F=[];for(let v of z)try{let l=Cu(Y,v.filePath),Uu=Bun.file(l),Iu=await Uu.text(),j_=v.contentHash||Ou(Iu),F_=a(v.filePath,A);$.upsertFile({project:F_,filePath:v.filePath,mtimeMs:Uu.lastModified,size:Uu.size,contentHash:j_,updatedAt:new Date().toISOString(),lineCount:Iu.split(`
|
|
6
|
+
`).length});let eu=(this.opts.parseSourceFn??ju)(l,Iu);if(e_(eu))throw eu.data;let H$=eu;F.push({filePath:v.filePath,text:Iu,contentHash:j_,parsed:H$,project:F_})}catch(l){this.logger.error(`[IndexCoordinator] Failed to prepare ${v.filePath}:`,l),t.push(v.filePath)}let m=new Set;for(let v of A)for(let[l]of $.getFilesMap(v.project))m.add(`${v.project}::${l}`);return Q.transaction(()=>{for(let v of F){if(O_({parsed:v.parsed,project:v.project,filePath:v.filePath,contentHash:v.contentHash,symbolRepo:J}),P+=V_({ast:v.parsed.program,project:v.project,filePath:v.filePath,relationRepo:O,projectRoot:Y,tsconfigPaths:V,knownFiles:m,boundaries:A}),j)H+=Y_({parsed:v.parsed,project:v.project,filePath:v.filePath,annotationRepo:j});C.set(v.filePath,v.parsed),k+=J.getFileSymbols(v.project,v.filePath).length}}),{symbols:k,relations:P,annotations:H,failedFiles:t}},R=0,T=0,S=[];if(_){let{projectRoot:Y,boundaries:A}=this.opts,{parseCache:C}=this.opts,k=[];for(let H=0;H<z.length;H+=ug){let t=z.slice(H,H+ug),F=await Promise.allSettled(t.map(async(m)=>{let v=Cu(Y,m.filePath),l=Bun.file(v),Uu=await l.text(),Iu=m.contentHash||Ou(Uu);return{filePath:m.filePath,text:Uu,contentHash:Iu,mtimeMs:l.lastModified,size:l.size}}));for(let m=0;m<F.length;m++){let v=F[m];if(v.status==="fulfilled")k.push(v.value);else this.logger.error("[IndexCoordinator] Failed to pre-read file:",v.reason),S.push(t[m].filePath)}}let P=[];Q.transaction(()=>{for(let F of k){let m=a(F.filePath,A);$.deleteFile(m,F.filePath)}for(let F of N){let m=a(F,A);if(J.deleteFileSymbols(m,F),O.deleteFileRelations(m,F),j)j.deleteFileAnnotations(m,F);$.deleteFile(m,F)}for(let F of k){let m=a(F.filePath,A);$.upsertFile({project:m,filePath:F.filePath,mtimeMs:F.mtimeMs,size:F.size,contentHash:F.contentHash,updatedAt:new Date().toISOString(),lineCount:F.text.split(`
|
|
7
|
+
`).length})}let H=new Set;for(let F of A)for(let[m]of $.getFilesMap(F.project))H.add(`${F.project}::${m}`);let t=this.opts.parseSourceFn??ju;for(let F of k){let m=a(F.filePath,A),v=t(Cu(Y,F.filePath),F.text);if(e_(v))throw v.data;let l=v;if(P.push({filePath:F.filePath,parsed:l}),O_({parsed:l,project:m,filePath:F.filePath,contentHash:F.contentHash,symbolRepo:J}),j)K+=Y_({parsed:l,project:m,filePath:F.filePath,annotationRepo:j});T+=V_({ast:l.program,project:m,filePath:F.filePath,relationRepo:O,projectRoot:Y,tsconfigPaths:V,knownFiles:H,boundaries:A}),R+=J.getFileSymbols(m,F.filePath).length}});for(let H of P)C.set(H.filePath,H.parsed)}else{Z();let Y=await B();R=Y.symbols,T=Y.relations,K=Y.annotations,S=Y.failedFiles}for(let Y of z){let A=a(Y.filePath,this.opts.boundaries);for(let C of J.getFileSymbols(A,Y.filePath))M.set(`${C.filePath}::${C.name}`,I(C))}let G=new Map;for(let Y of z){let A=a(Y.filePath,this.opts.boundaries);for(let C of O.getOutgoing(A,Y.filePath))G.set(D(C),C)}let f=(Y)=>({type:Y.type,srcFilePath:Y.srcFilePath,dstFilePath:Y.dstFilePath,srcSymbolName:Y.srcSymbolName,dstSymbolName:Y.dstSymbolName,dstProject:Y.dstProject,metaJson:Y.metaJson}),y={added:[...G.entries()].filter(([Y])=>!q.has(Y)).map(([,Y])=>f(Y)),removed:[...q.entries()].filter(([Y])=>!G.has(Y)).map(([,Y])=>f(Y))},E={added:[],modified:[],removed:[]};for(let[Y,A]of M){let C=X.get(Y);if(!C)E.added.push({name:A.name,filePath:A.filePath,kind:A.kind,isExported:Boolean(A.isExported)});else{let k=C.fingerprint!==A.fingerprint,P=C.isExported!==A.isExported,H=C.structuralFingerprint!==null&&A.structuralFingerprint!==null&&C.structuralFingerprint!==A.structuralFingerprint;if(k||P||H)E.modified.push({name:A.name,filePath:A.filePath,kind:A.kind,isExported:Boolean(A.isExported)})}}for(let[Y,A]of X)if(!M.has(Y))E.removed.push({name:A.name,filePath:A.filePath,kind:A.kind,isExported:Boolean(A.isExported)});let p=o_(X,M),gu=new Set(p.renamed.map((Y)=>`${Y.filePath}::${Y.oldName}`)),r=new Set(p.renamed.map((Y)=>`${Y.filePath}::${Y.newName}`));E.added=E.added.filter((Y)=>!r.has(`${Y.filePath}::${Y.name}`)),E.removed=E.removed.filter((Y)=>!gu.has(`${Y.filePath}::${Y.name}`));let uu=[];if(!_){for(let[Y,A]of W)for(let C of A){if(!C.fingerprint)continue;let k=a(Y,this.opts.boundaries),P=J.getByFingerprint(k,C.fingerprint);if(P.length===1){let H=P[0];O.retargetRelations({dstProject:k,oldFile:Y,oldSymbol:C.name,newFile:H.filePath,newSymbol:H.name}),uu.push({name:H.name,filePath:H.filePath,kind:H.kind,oldFilePath:Y,isExported:H.isExported??0})}}for(let Y of p.removed){let C=X.get(`${Y.filePath}::${Y.name}`)?.fingerprint;if(!C)continue;let k=a(Y.filePath,this.opts.boundaries),P=J.getByFingerprint(k,C);if(P.length===1){let H=P[0];if(H.filePath!==Y.filePath||H.name!==Y.name)O.retargetRelations({dstProject:k,oldFile:Y.filePath,oldSymbol:Y.name,newFile:H.filePath,newSymbol:H.name}),uu.push({name:H.name,filePath:H.filePath,kind:H.kind,oldFilePath:Y.filePath,isExported:H.isExported??0})}}}if(uu.length){let Y=new Set(uu.map((C)=>`${C.filePath}::${C.name}`)),A=new Set(uu.map((C)=>`${C.oldFilePath}::${C.name}`));E.added=E.added.filter((C)=>!Y.has(`${C.filePath}::${C.name}`)),E.removed=E.removed.filter((C)=>!A.has(`${C.filePath}::${C.name}`))}if(h){let Y=new Date().toISOString(),A=_?1:0,C=[];for(let k of E.added){let P=`${k.filePath}::${k.name}`,H=M.get(P),t=a(k.filePath,this.opts.boundaries);C.push({project:t,changeType:"added",symbolName:k.name,symbolKind:k.kind,filePath:k.filePath,oldName:null,oldFilePath:null,fingerprint:H?.fingerprint??null,changedAt:Y,isFullIndex:A,indexRunId:U})}for(let k of E.modified){let P=M.get(`${k.filePath}::${k.name}`),H=a(k.filePath,this.opts.boundaries);C.push({project:H,changeType:"modified",symbolName:k.name,symbolKind:k.kind,filePath:k.filePath,oldName:null,oldFilePath:null,fingerprint:P?.fingerprint??null,changedAt:Y,isFullIndex:A,indexRunId:U})}for(let k of E.removed){let P=`${k.filePath}::${k.name}`,H=X.get(P),t=a(k.filePath,this.opts.boundaries);C.push({project:t,changeType:"removed",symbolName:k.name,symbolKind:k.kind,filePath:k.filePath,oldName:null,oldFilePath:null,fingerprint:H?.fingerprint??null,changedAt:Y,isFullIndex:A,indexRunId:U})}for(let k of p.renamed){let P=M.get(`${k.filePath}::${k.newName}`),H=a(k.filePath,this.opts.boundaries);C.push({project:H,changeType:"renamed",symbolName:k.newName,symbolKind:k.kind,filePath:k.filePath,oldName:k.oldName,oldFilePath:null,fingerprint:P?.fingerprint??null,changedAt:Y,isFullIndex:A,indexRunId:U})}for(let k of uu){let P=M.get(`${k.filePath}::${k.name}`),H=a(k.filePath,this.opts.boundaries);C.push({project:H,changeType:"moved",symbolName:k.name,symbolKind:k.kind,filePath:k.filePath,oldName:null,oldFilePath:k.oldFilePath,fingerprint:P?.fingerprint??null,changedAt:Y,isFullIndex:A,indexRunId:U})}if(C.length)try{Q.transaction(()=>{h.insertBatch(C)})}catch(k){this.logger.error("[IndexCoordinator] changelog insert failed:",k)}if(Date.now()-this.lastPruneAt>3600000){this.lastPruneAt=Date.now();let k=new Date(Date.now()-2592000000).toISOString();try{for(let P of this.opts.boundaries)h.pruneOlderThan(P.project,k)}catch(P){this.logger.error("[IndexCoordinator] changelog pruning failed:",P)}}}return{indexedFiles:z.length,removedFiles:N.length,totalSymbols:R,totalRelations:T,totalAnnotations:K,durationMs:Date.now()-g,changedFiles:z.map((Y)=>Y.filePath),deletedFiles:[...N],failedFiles:S,changedSymbols:E,renamedSymbols:p.renamed.map((Y)=>({oldName:Y.oldName,newName:Y.newName,filePath:Y.filePath,kind:Y.kind,isExported:Boolean(M.get(`${Y.filePath}::${Y.newName}`)?.isExported)})),movedSymbols:uu.map((Y)=>({name:Y.name,oldFilePath:Y.oldFilePath,newFilePath:Y.filePath,kind:Y.kind,isExported:Boolean(Y.isExported)})),changedRelations:y}}fireCallbacks(u){for(let _ of this.callbacks)try{_(u)}catch(g){this.logger.error("[IndexCoordinator] onIndexed callback threw:",g)}}flushPending(){if(this.indexingLock)return;if(this.pendingEvents.length>0){let u=this.pendingEvents.splice(0);this.startIndex(u,!1).catch((_)=>this.logger.error("[IndexCoordinator] flushPending startIndex error:",_))}}}function z0(u){try{return process.kill(u,0),!0}catch(_){if(typeof _==="object"&&_&&"code"in _)return _.code!=="ESRCH";return!0}}function O0(u){let _=new Date(u).getTime();return Number.isNaN(_)?0:_}function _g(u,_,g={}){let $=g.now??Date.now,J=g.isAlive??z0,O=g.staleAfterSeconds??60,Q=g.instanceId;return u.immediateTransaction(()=>{let z=u.selectOwner();if(!z)return u.insertOwner(_,Q),"owner";let N=Math.floor(($()-O0(z.heartbeat_at))/1000),V=J(z.pid);if(V&&Q&&z.instance_id&&z.instance_id!==Q&&z.pid!==_)return u.replaceOwner(_,Q),"owner";if(V&&N<O)return"reader";return u.replaceOwner(_,Q),"owner"})}function gg(u,_){u.deleteOwner(_)}function $g(u,_){u.touchOwner(_)}class Fu{#u;#_=new Map;constructor(u){this.#u=Math.max(1,u)}get size(){return this.#_.size}has(u){return this.#_.has(u)}get(u){if(!this.#_.has(u))return;let _=this.#_.get(u);return this.#_.delete(u),this.#_.set(u,_),_}set(u,_){if(this.#_.has(u))this.#_.delete(u);if(this.#_.set(u,_),this.#_.size>this.#u){let g=this.#_.keys().next().value;if(g!==void 0)this.#_.delete(g)}}delete(u){return this.#_.delete(u)}clear(){this.#_.clear()}}class X_{lru;constructor(u=500){this.lru=new Fu(u)}get(u){return this.lru.get(u)}set(u,_){this.lru.set(u,_)}invalidate(u){this.lru.delete(u)}invalidateAll(){this.lru.clear()}size(){return this.lru.size}}function K_(u){let{symbolRepo:_,project:g,query:$}=u,J=$.project??g,O=$.limit??100,Q={kind:$.kind,filePath:$.filePath,isExported:$.isExported,project:J,limit:O,resolvedType:$.resolvedType};if($.text)if($.exact)Q.exactName=$.text;else{let N=Au($.text);if(N)Q.ftsQuery=N}if($.decorator)Q.decorator=$.decorator;if($.regex)Q.regex=$.regex;return _.searchByQuery(Q).map((N)=>({id:N.id,filePath:N.filePath,kind:N.kind,name:N.name,span:{start:{line:N.startLine,column:N.startColumn},end:{line:N.endLine,column:N.endColumn}},isExported:N.isExported===1,signature:N.signature,fingerprint:N.fingerprint,detail:N.detailJson?(()=>{try{return JSON.parse(N.detailJson)}catch{return{}}})():{}}))}function M_(u){let{relationRepo:_,project:g,query:$}=u;if($.srcFilePath&&$.srcFilePathPattern)throw new w("validation","srcFilePath and srcFilePathPattern are mutually exclusive");if($.dstFilePath&&$.dstFilePathPattern)throw new w("validation","dstFilePath and dstFilePathPattern are mutually exclusive");let J=$.project??g,O=$.limit??500,Q=!!($.srcFilePathPattern||$.dstFilePathPattern),z=Q?Number.MAX_SAFE_INTEGER:O,V=_.searchRelations({srcFilePath:$.srcFilePath,srcSymbolName:$.srcSymbolName,dstFilePath:$.dstFilePath,dstSymbolName:$.dstSymbolName,dstProject:$.dstProject,type:$.type,project:J,limit:z}).map((W)=>{let U;if(W.metaJson)try{U=JSON.parse(W.metaJson)}catch{}return{type:W.type,srcFilePath:W.srcFilePath,srcSymbolName:W.srcSymbolName,dstFilePath:W.dstFilePath,dstSymbolName:W.dstSymbolName,dstProject:W.dstProject,metaJson:W.metaJson??void 0,meta:U}});if($.srcFilePathPattern||$.dstFilePathPattern){let W=$.srcFilePathPattern?new Bun.Glob($.srcFilePathPattern):null,U=$.dstFilePathPattern?new Bun.Glob($.dstFilePathPattern):null;V=V.filter((X)=>(!W||W.match(X.srcFilePath))&&(!U||U.match(X.dstFilePath)))}if(Q&&V.length>O)V=V.slice(0,O);return V}import{findInFiles as w0,Lang as W0}from"@ast-grep/napi";async function B_(u){if(u.filePaths.length===0)return[];let _=[];return await w0(W0.TypeScript,{paths:u.filePaths,matcher:{rule:{pattern:u.pattern}}},(g,$)=>{if(g){console.warn("[patternSearch] findInFiles callback error:",g);return}for(let J of $){let O=J.range();_.push({filePath:J.getRoot().filename(),startLine:O.start.line+1,endLine:O.end.line+1,matchedText:J.text()})}}),_}import c from"typescript";import{isErr as C0}from"@zipbul/result";import Vu from"typescript";import V0 from"path";import{err as H_}from"@zipbul/result";function U0(u){try{return n_("fs").readFileSync(u,"utf-8")}catch{return}}function Y0(u){try{return n_("fs").readFileSync(u,"utf-8")}catch{return}}class cu{#u;#_;#g=!1;__testing__;constructor(u,_){this.#u=u,this.#_=_,this.__testing__={host:_}}static create(u,_={}){let g=_.readConfigFile??U0,$=_.resolveNonTrackedFile??Y0,J=V0.dirname(u),O=g(u);if(O===void 0)return H_($u("semantic",`tsconfig not found: ${u}`));let Q=Vu.parseJsonText(u,O),z=Q.parseDiagnostics;if(z&&z.length>0){let U=z.map((X)=>Vu.flattenDiagnosticMessageText(X.messageText,`
|
|
8
|
+
`)).join("; ");return H_($u("semantic",`tsconfig parse error: ${U}`))}let N=Vu.parseJsonSourceFileConfigFileContent(Q,{useCaseSensitiveFileNames:!0,readDirectory:()=>[],fileExists:(U)=>g(U)!==void 0||$(U)!==void 0,readFile:(U)=>g(U)??$(U)},J);if(N.errors.length>0){let U=N.errors.filter((X)=>X.category===Vu.DiagnosticCategory.Error&&X.code!==18003);if(U.length>0){let X=U.map((M)=>Vu.flattenDiagnosticMessageText(M.messageText,`
|
|
9
|
+
`)).join("; ");return H_($u("semantic",`tsconfig compile error: ${X}`))}}let V=new Jg(N.fileNames,N.options,J,$),W=Vu.createLanguageService(V);return new cu(W,V)}get isDisposed(){return this.#g}getProgram(){this.#J();let u=this.#u.getProgram();if(!u)throw Error("TscProgram: LanguageService returned null Program");return u}getChecker(){return this.#J(),this.getProgram().getTypeChecker()}getLanguageService(){return this.#J(),this.#u}notifyFileChanged(u,_){if(this.#g)return;this.#_.updateFile(u,_)}removeFile(u){if(this.#g)return;this.#_.removeFile(u)}dispose(){if(this.#g)return;this.#g=!0,this.#u.dispose()}#J(){if(this.#g)throw Error("TscProgram is disposed")}}class Jg{#u;#_;#g;#J;#$=new Map;constructor(u,_,g,$){this.#u=new Set(u),this.#_=_,this.#g=g,this.#J=$}updateFile(u,_){let g=this.#$.get(u);if(g)g.version+=1,g.content=_;else this.#$.set(u,{version:1,content:_})}removeFile(u){this.#$.delete(u),this.#u.delete(u)}getScriptFileNames(){let u=[...this.#$.keys()];return[...[...this.#u].filter((g)=>!this.#$.has(g)),...u]}getScriptVersion(u){let _=this.#$.get(u);return _?String(_.version):"0"}getScriptSnapshot(u){let _=this.#$.get(u);if(_)return Vu.ScriptSnapshot.fromString(_.content);let g=this.#J(u);if(g!==void 0)return Vu.ScriptSnapshot.fromString(g);return}getCurrentDirectory(){return this.#g}getCompilationSettings(){return this.#_}getDefaultLibFileName(u){return Vu.getDefaultLibFilePath(u)}fileExists(u){if(this.#$.has(u))return!0;return this.#J(u)!==void 0}readFile(u){let _=this.#$.get(u);if(_)return _.content;return this.#J(u)}}import s from"typescript";import Z0 from"typescript";function zu(u,_){if(_<0||_>=u.getEnd())return;function g($){let J=$.getStart(u,!1),O=$.getEnd();if(_<J||_>=O)return;let Q;return Z0.forEachChild($,(z)=>{if(!Q)Q=g(z)}),Q??$}return g(u)}var L_=8;function X0(u){return!!(u.flags&s.TypeFlags.Object)&&!!(u.objectFlags&s.ObjectFlags.Reference)}function nu(u,_,g=0){let $=u.typeToString(_),J=_.flags,O=!!(J&s.TypeFlags.Union),Q=!!(J&s.TypeFlags.Intersection),z;if(g<L_&&X0(_)){let U=u.getTypeArguments(_);if(U.length>0)z=U}let N=!!(J&s.TypeFlags.TypeParameter)||z!==void 0&&z.length>0,V;if(O&&g<L_)V=_.types.map((U)=>nu(u,U,g+1));else if(Q&&g<L_)V=_.types.map((U)=>nu(u,U,g+1));let W;if(z&&z.length>0)W=z.map((U)=>nu(u,U,g+1));return{text:$,flags:J,isUnion:O,isIntersection:Q,isGeneric:N,members:V,typeArguments:W}}function K0(u){return s.isFunctionDeclaration(u)||s.isVariableDeclaration(u)||s.isClassDeclaration(u)||s.isInterfaceDeclaration(u)||s.isTypeAliasDeclaration(u)||s.isEnumDeclaration(u)||s.isMethodDeclaration(u)||s.isPropertyDeclaration(u)||s.isPropertySignature(u)||s.isMethodSignature(u)}class I_{program;constructor(u){this.program=u}collectAt(u,_){let g=this.program.getProgram(),$=this.program.getChecker();if(_<0)return null;let J=g.getSourceFile(u);if(!J)return null;if(_>=J.getEnd())return null;let O=zu(J,_);if(!O)return null;if(!s.isIdentifier(O)&&!s.isTypeNode(O))return null;try{let Q=$.getTypeAtLocation(O);return nu($,Q)}catch{return null}}isAssignableTo(u,_,g,$){let J=this.program.getChecker(),O=this.program.getProgram(),Q=O.getSourceFile(u);if(!Q)return null;let z=zu(Q,_);if(!z||!s.isIdentifier(z))return null;let N=O.getSourceFile(g);if(!N)return null;let V=zu(N,$);if(!V||!s.isIdentifier(V))return null;try{let W=J.getTypeAtLocation(z),U=J.getTypeAtLocation(V);return J.isTypeAssignableTo(W,U)}catch{return null}}isAssignableToType(u,_,g){let $=this.program.getChecker(),O=this.program.getProgram().getSourceFile(u);if(!O)return null;let Q=zu(O,_);if(!Q||!s.isIdentifier(Q)&&!s.isTypeNode(Q))return null;let z=`${u}.__gildash_probe__.ts`,N=`declare const __gildash_probe__: ${g};`;this.program.notifyFileChanged(z,N);try{let V=$.getTypeAtLocation(Q),U=this.program.getProgram().getSourceFile(z);if(!U)return null;let X=this.program.getChecker(),M=U.statements[0];if(!M||!s.isVariableStatement(M))return null;let I=M.declarationList.declarations[0];if(!I)return null;let D=X.getTypeAtLocation(I.name);return X.isTypeAssignableTo(V,D)}catch{return null}finally{this.program.removeFile(z)}}collectFile(u){let _=new Map,g=this.program.getProgram(),$=this.program.getChecker(),J=g.getSourceFile(u);if(!J)return _;function O(Q){if(K0(Q)&&Q.name&&s.isIdentifier(Q.name)){let z=Q.name;try{let N=$.getTypeAtLocation(z),V=z.getStart(J);_.set(V,nu($,N))}catch{}}s.forEachChild(Q,O)}return O(J),_}}import Xu from"typescript";var M0=1000,B0=1;function H0(u){let _=u.declarations?.[0],g=_?.getSourceFile(),$=_?Xu.getNameOfDeclaration(_):void 0;return{name:u.getName(),filePath:g?.fileName??"",position:$?.getStart(g,!1)??_?.getStart(g,!1)??0}}function ru(u,_=0){let g=u.declarations?.[0],$=g?.getSourceFile(),J=g?Xu.getNameOfDeclaration(g):void 0,O=$?.fileName??"",Q=J?.getStart($,!1)??g?.getStart($,!1)??0,z={name:u.getName(),filePath:O,position:Q},N=u;if(N.parent)z.parent=H0(N.parent);if(_<B0){let V=u.flags,W=!!(V&Xu.SymbolFlags.Enum),U=!!(V&(Xu.SymbolFlags.NamespaceModule|Xu.SymbolFlags.ValueModule)),X=!!(V&(Xu.SymbolFlags.Class|Xu.SymbolFlags.Interface));if(W&&u.exports&&u.exports.size>0){let M=[];u.exports.forEach((I)=>{M.push(ru(I,_+1))}),z.members=M}else if(X&&u.members&&u.members.size>0){let M=[];u.members.forEach((I)=>{M.push(ru(I,_+1))}),z.members=M}if(U&&u.exports&&u.exports.size>0){let M=[];u.exports.forEach((I)=>{M.push(ru(I,_+1))}),z.exports=M}}return z}class D_{#u;#_;#g=new Map;constructor(u,_=M0){this.#u=u,this.#_=new Fu(_)}get(u,_){if(this.#u.isDisposed)return null;let g=`${u}:${_}`,$=this.#_.get(g);if($!==void 0)return $;let O=this.#u.getProgram().getSourceFile(u);if(!O)return null;let Q=zu(O,_);if(!Q||!Xu.isIdentifier(Q))return null;let N=this.#u.getChecker().getSymbolAtLocation(Q);if(!N)return null;let V=ru(N);this.#_.set(g,V);let W=this.#g.get(u);if(!W)W=new Set,this.#g.set(u,W);return W.add(g),V}invalidate(u){let _=this.#g.get(u);if(_){for(let g of _)this.#_.delete(g);this.#g.delete(u)}}clear(){this.#_.clear(),this.#g.clear()}}import L0 from"typescript";class A_{#u;constructor(u){this.#u=u}findAt(u,_){if(this.#u.isDisposed)return[];let g=this.#u.getProgram(),$=g.getSourceFile(u);if(!$)return[];let J=zu($,_);if(!J||!L0.isIdentifier(J))return[];let Q=this.#u.getLanguageService().findReferences(u,_);if(!Q||Q.length===0)return[];let z=[];for(let N of Q)for(let V of N.references){let W=g.getSourceFile(V.fileName);if(!W)continue;let{line:U,character:X}=W.getLineAndCharacterOfPosition(V.textSpan.start);z.push({filePath:V.fileName,position:V.textSpan.start,line:U+1,column:X,isDefinition:V.isDefinition??!1,isWrite:V.isWriteAccess??!1})}return z}}import x from"typescript";function I0(u,_){let g=zu(u,_);if(!g)return;if(Qg(g))return g;let $=g.parent;for(let J=0;J<5&&$;J++){if(Qg($))return $;$=$.parent}return g}function Qg(u){return x.isClassDeclaration(u)||x.isClassExpression(u)||x.isFunctionDeclaration(u)||x.isFunctionExpression(u)||x.isArrowFunction(u)||x.isVariableDeclaration(u)||x.isObjectLiteralExpression(u)}function Ng(u){if(x.isClassDeclaration(u)||x.isClassExpression(u))return"class";if(x.isFunctionDeclaration(u)||x.isFunctionExpression(u)||x.isArrowFunction(u))return"function";if(x.isObjectLiteralExpression(u))return"object";if(x.isVariableDeclaration(u)&&u.initializer)return Ng(u.initializer);return"class"}function D0(u,_){if(x.isClassDeclaration(u)||x.isFunctionDeclaration(u))return u.name?.getText(_)??"";if(x.isClassExpression(u))return u.name?.getText(_)??"";if(x.isVariableDeclaration(u)&&x.isIdentifier(u.name))return u.name.getText(_);if(x.isFunctionExpression(u))return u.name?.getText(_)??"";if(x.isArrowFunction(u)&&u.parent&&x.isVariableDeclaration(u.parent)){if(x.isIdentifier(u.parent.name))return u.parent.name.getText(_)}if(x.isObjectLiteralExpression(u)&&u.parent&&x.isVariableDeclaration(u.parent)){if(x.isIdentifier(u.parent.name))return u.parent.name.getText(_)}return""}function A0(u){if(!x.isClassDeclaration(u)&&!x.isClassExpression(u))return!1;let _=u.heritageClauses;if(!_)return!1;return _.some((g)=>g.token===x.SyntaxKind.ImplementsKeyword)}class C_{#u;constructor(u){this.#u=u}findAt(u,_){if(this.#u.isDisposed)return[];let g=this.#u.getProgram(),$=g.getSourceFile(u);if(!$)return[];let J=zu($,_);if(!J||!x.isIdentifier(J))return[];let Q=this.#u.getLanguageService().getImplementationAtPosition(u,_);if(!Q||Q.length===0)return[];let z=[];for(let N of Q){if(N.kind===x.ScriptElementKind.interfaceElement||N.kind===x.ScriptElementKind.typeElement)continue;let V=g.getSourceFile(N.fileName);if(!V)continue;let W=I0(V,N.textSpan.start);if(!W)continue;let U=Ng(W),X=D0(W,V),M=A0(W);z.push({filePath:N.fileName,symbolName:X,position:N.textSpan.start,kind:U,isExplicit:M})}return z}}function zg(u){return c.canHaveModifiers(u)&&c.getModifiers(u)?.some((_)=>_.kind===c.SyntaxKind.ExportKeyword)===!0}function S0(u){if(c.isFunctionDeclaration(u))return"function";if(c.isClassDeclaration(u))return"class";if(c.isInterfaceDeclaration(u))return"interface";if(c.isTypeAliasDeclaration(u))return"type";if(c.isEnumDeclaration(u))return"enum";if(c.isVariableDeclaration(u))return"const";if(c.isVariableStatement(u))return"const";return"unknown"}function Og(u){if(u>=97&&u<=122)return!0;if(u>=65&&u<=90)return!0;if(u>=48&&u<=57)return!0;if(u===95||u===36)return!0;return!1}class su{#u;#_;#g;#J;#$;#N=!1;constructor(u,_,g,$,J){this.#u=u,this.#_=_,this.#g=g,this.#J=$,this.#$=J}static create(u,_={}){let g=cu.create(u,{readConfigFile:_.readConfigFile,resolveNonTrackedFile:_.resolveNonTrackedFile});if(C0(g))return g;let $=g,J=_.typeCollector??new I_($),O=_.symbolGraph??new D_($),Q=_.referenceResolver??new A_($),z=_.implementationFinder??new C_($);return new su($,J,O,Q,z)}get isDisposed(){return this.#N}collectTypeAt(u,_){return this.#Q(),this.#_.collectAt(u,_)}collectFileTypes(u){return this.#Q(),this.#_.collectFile(u)}findReferences(u,_){return this.#Q(),this.#J.findAt(u,_)}findImplementations(u,_){return this.#Q(),this.#$.findAt(u,_)}isTypeAssignableTo(u,_,g,$){return this.#Q(),this.#_.isAssignableTo(u,_,g,$)}isTypeAssignableToType(u,_,g){return this.#Q(),this.#_.isAssignableToType(u,_,g)}getSymbolNode(u,_){return this.#Q(),this.#g.get(u,_)}getModuleInterface(u){this.#Q();let _=this.#_.collectFile(u),g=[],J=this.#u.getProgram().getSourceFile(u);if(!J)return{filePath:u,exports:g};function O(Q){if(c.isVariableStatement(Q)&&zg(Q)){for(let z of Q.declarationList.declarations)if(c.isIdentifier(z.name)){let N=z.name.getStart(J),V=_.get(N)??null;g.push({name:z.name.text,kind:"const",resolvedType:V})}return}if((c.isFunctionDeclaration(Q)||c.isClassDeclaration(Q)||c.isInterfaceDeclaration(Q)||c.isTypeAliasDeclaration(Q)||c.isEnumDeclaration(Q))&&zg(Q)&&Q.name){let z=Q.name,N=z.getStart(J),V=_.get(N)??null;g.push({name:z.text,kind:S0(Q),resolvedType:V});return}c.forEachChild(Q,O)}return O(J),{filePath:u,exports:g}}notifyFileChanged(u,_){if(this.#N)return;this.#u.notifyFileChanged(u,_),this.#g.invalidate(u)}notifyFileDeleted(u){if(this.#N)return;this.#u.removeFile(u),this.#g.invalidate(u)}lineColumnToPosition(u,_,g){this.#Q();let $=this.#u.getProgram().getSourceFile(u);if(!$)return null;try{return c.getPositionOfLineAndCharacter($,_-1,g)}catch{return null}}findNamePosition(u,_,g){this.#Q();let $=this.#u.getProgram().getSourceFile(u);if(!$)return null;let J=$.getFullText(),O=_;while(O<J.length){let Q=J.indexOf(g,O);if(Q<0)return null;let z=Q>0?J.charCodeAt(Q-1):32,N=Q+g.length<J.length?J.charCodeAt(Q+g.length):32;if(!Og(z)&&!Og(N))return Q;O=Q+1}return null}getDiagnostics(u){this.#Q();let _=this.#u.getProgram(),g=_.getSourceFile(u);if(!g)return[];let $={[c.DiagnosticCategory.Error]:"error",[c.DiagnosticCategory.Warning]:"warning",[c.DiagnosticCategory.Suggestion]:"suggestion",[c.DiagnosticCategory.Message]:"suggestion"};return _.getSemanticDiagnostics(g).map((J)=>{let O=1,Q=0;if(J.file&&J.start!==void 0){let z=c.getLineAndCharacterOfPosition(J.file,J.start);O=z.line+1,Q=z.character}return{filePath:J.file?.fileName??u,line:O,column:Q,message:c.flattenDiagnosticMessageText(J.messageText,`
|
|
10
|
+
`),code:J.code,category:$[J.category]??"error"}})}dispose(){if(this.#N)return;this.#N=!0,this.#u.dispose(),this.#g.clear()}#Q(){if(this.#N)throw Error("SemanticLayer is disposed")}}import{eq as Hu,and as wg,sql as R0}from"drizzle-orm";var Wg=80;class S_{db;constructor(u){this.db=u}insertBatch(u,_,g){if(!g.length)return;let $=g.map((J)=>({project:u,filePath:_,tag:J.tag,value:J.value,source:J.source,symbolName:J.symbolName,startLine:J.startLine,startColumn:J.startColumn,endLine:J.endLine,endColumn:J.endColumn,indexedAt:J.indexedAt}));for(let J=0;J<$.length;J+=Wg)this.db.drizzleDb.insert(Nu).values($.slice(J,J+Wg)).run()}deleteFileAnnotations(u,_){this.db.drizzleDb.delete(Nu).where(wg(Hu(Nu.project,u),Hu(Nu.filePath,_))).run()}search(u){return this.db.drizzleDb.select().from(Nu).where(wg(u.project?Hu(Nu.project,u.project):void 0,u.tag?Hu(Nu.tag,u.tag):void 0,u.filePath?Hu(Nu.filePath,u.filePath):void 0,u.symbolName?Hu(Nu.symbolName,u.symbolName):void 0,u.source?Hu(Nu.source,u.source):void 0,u.ftsQuery?R0`${Nu.id} IN (SELECT rowid FROM annotations_fts WHERE annotations_fts MATCH ${u.ftsQuery})`:void 0)).limit(u.limit).all()}}import{eq as ku,and as Vg,sql as Gu,gt as k0,gte as T0}from"drizzle-orm";var Ug=80;class R_{db;constructor(u){this.db=u}insertBatch(u){if(!u.length)return;let _=u.map((g)=>({project:g.project,changeType:g.changeType,symbolName:g.symbolName,symbolKind:g.symbolKind,filePath:g.filePath,oldName:g.oldName,oldFilePath:g.oldFilePath,fingerprint:g.fingerprint,changedAt:g.changedAt,isFullIndex:g.isFullIndex,indexRunId:g.indexRunId}));for(let g=0;g<_.length;g+=Ug)this.db.drizzleDb.insert(Ju).values(_.slice(g,g+Ug)).run()}getSince(u){return this.db.drizzleDb.select().from(Ju).where(Vg(ku(Ju.project,u.project),T0(Ju.changedAt,u.since),u.symbolName?ku(Ju.symbolName,u.symbolName):void 0,u.changeTypes?.length?Gu`${Ju.changeType} IN (${Gu.join(u.changeTypes.map((_)=>Gu`${_}`),Gu`, `)})`:void 0,u.filePath?ku(Ju.filePath,u.filePath):void 0,u.includeFullIndex?void 0:ku(Ju.isFullIndex,0),u.indexRunId?ku(Ju.indexRunId,u.indexRunId):void 0,u.afterId?k0(Ju.id,u.afterId):void 0)).orderBy(Ju.id).limit(u.limit).all()}pruneOlderThan(u,_){return this.db.drizzleDb.delete(Ju).where(Vg(ku(Ju.project,u),Gu`${Ju.changedAt} < ${_}`)).run().changes}}function Yg(u){let{annotationRepo:_,project:g,query:$}=u,J=$.project??g,O=$.limit??100,Q;if($.text){let N=Au($.text);if(N)Q=N}return _.search({project:J,tag:$.tag,filePath:$.filePath,symbolName:$.symbolName,source:$.source,ftsQuery:Q,limit:O}).map((N)=>({tag:N.tag,value:N.value,source:N.source,filePath:N.filePath,symbolName:N.symbolName,span:{start:{line:N.startLine,column:N.startColumn},end:{line:N.endLine,column:N.endColumn}}}))}class au{options;adjacencyList=new Map;reverseAdjacencyList=new Map;constructor(u){this.options=u}build(){this.adjacencyList=new Map,this.reverseAdjacencyList=new Map;let _=[this.options.project,...this.options.additionalProjects??[]].flatMap((g)=>[...this.options.relationRepo.getByType(g,"imports"),...this.options.relationRepo.getByType(g,"type-references"),...this.options.relationRepo.getByType(g,"re-exports")]);for(let g of _){let{srcFilePath:$,dstFilePath:J}=g;if(!this.adjacencyList.has($))this.adjacencyList.set($,new Set);if(this.adjacencyList.get($).add(J),!this.adjacencyList.has(J))this.adjacencyList.set(J,new Set);if(!this.reverseAdjacencyList.has(J))this.reverseAdjacencyList.set(J,new Set);this.reverseAdjacencyList.get(J).add($)}}patchFiles(u,_,g){let $=new Set([...u,..._]);for(let J of $){let O=this.adjacencyList.get(J);if(O){for(let z of O)this.reverseAdjacencyList.get(z)?.delete(J);O.clear()}let Q=this.reverseAdjacencyList.get(J);if(Q){for(let z of Q)this.adjacencyList.get(z)?.delete(J);Q.clear()}}for(let J of _)this.adjacencyList.delete(J),this.reverseAdjacencyList.delete(J);for(let J of u){let O=g(J);for(let Q of O){if(!this.adjacencyList.has(Q.srcFilePath))this.adjacencyList.set(Q.srcFilePath,new Set);if(this.adjacencyList.get(Q.srcFilePath).add(Q.dstFilePath),!this.adjacencyList.has(Q.dstFilePath))this.adjacencyList.set(Q.dstFilePath,new Set);if(!this.reverseAdjacencyList.has(Q.dstFilePath))this.reverseAdjacencyList.set(Q.dstFilePath,new Set);this.reverseAdjacencyList.get(Q.dstFilePath).add(Q.srcFilePath)}}}getDependencies(u){return Array.from(this.adjacencyList.get(u)??[])}getDependents(u){return Array.from(this.reverseAdjacencyList.get(u)??[])}getTransitiveDependents(u){let _=new Set,g=[u];while(g.length>0){let $=g.shift();for(let J of this.reverseAdjacencyList.get($)??[])if(!_.has(J))_.add(J),g.push(J)}return Array.from(_)}hasCycle(){let u=new Set,_=new Set;for(let g of this.adjacencyList.keys()){if(u.has(g))continue;let $=[{node:g,entered:!1}];while($.length>0){let J=$.pop();if(J.entered){_.delete(J.node);continue}if(_.has(J.node))return!0;if(u.has(J.node))continue;u.add(J.node),_.add(J.node),$.push({node:J.node,entered:!0});for(let O of this.adjacencyList.get(J.node)??[]){if(_.has(O))return!0;if(!u.has(O))$.push({node:O,entered:!1})}}}return!1}getAffectedByChange(u){let _=new Set;for(let g of u)for(let $ of this.getTransitiveDependents(g))_.add($);return Array.from(_)}getAdjacencyList(){let u=new Map;for(let[_,g]of this.adjacencyList)u.set(_,Array.from(g));return u}getTransitiveDependencies(u){let _=new Set,g=[u];while(g.length>0){let $=g.shift();for(let J of this.adjacencyList.get($)??[])if(!_.has(J))_.add(J),g.push(J)}return Array.from(_)}getCyclePaths(u){let _=u?.maxCycles??1/0;if(_<=0)return[];let g=new Map;for(let[$,J]of this.adjacencyList)g.set($,Array.from(J));return G0(g,_)}}var q0=(u,_)=>u.localeCompare(_);function j0(u){let _=u.length>1&&u[0]===u[u.length-1]?u.slice(0,-1):[...u];if(_.length===0)return[];let g=_;for(let $=1;$<_.length;$++){let J=_.slice($).concat(_.slice(0,$));if(J.join("::")<g.join("::"))g=J}return[...g]}function k_(u,_,g){let $=j0(g);if($.length===0)return!1;let J=$.join("->");if(u.has(J))return!1;return u.add(J),_.push($),!0}function F0(u){let _=0,g=[],$=new Set,J=new Map,O=new Map,Q=[],z=(N)=>{J.set(N,_),O.set(N,_),_+=1,g.push(N),$.add(N);for(let V of u.get(N)??[])if(!J.has(V))z(V),O.set(N,Math.min(O.get(N)??0,O.get(V)??0));else if($.has(V))O.set(N,Math.min(O.get(N)??0,J.get(V)??0));if(O.get(N)===J.get(N)){let V=[],W="";do W=g.pop()??"",$.delete(W),V.push(W);while(W!==N&&g.length>0);Q.push(V)}};for(let N of u.keys())if(!J.has(N))z(N);return{components:Q}}function n0(u,_,g){let $=[],J=new Set,O=[...u].sort(q0),Q=(z,N,V)=>{N.delete(z);let W=V.get(z);if(!W)return;for(let U of W)if(N.has(U))Q(U,N,V);W.clear()};for(let z=0;z<O.length&&$.length<g;z++){let N=O[z]??"",V=new Set(O.slice(z)),W=new Set,U=new Map,X=[],M=(D)=>(_.get(D)??[]).filter((q)=>V.has(q)),I=(D)=>{if($.length>=g)return!0;let q=!1;X.push(D),W.add(D);for(let j of M(D)){if($.length>=g)break;if(j===N)k_(J,$,X.concat(N)),q=!0;else if(!W.has(j)){if(I(j))q=!0}}if(q)Q(D,W,U);else for(let j of M(D)){let h=U.get(j)??new Set;h.add(D),U.set(j,h)}return X.pop(),q};I(N)}return $}function G0(u,_){let{components:g}=F0(u),$=[],J=new Set;for(let O of g){if($.length>=_)break;if(O.length===0)continue;if(O.length===1){let N=O[0]??"";if((u.get(N)??[]).includes(N))k_(J,$,[N,N]);continue}let Q=_-$.length,z=n0(O,u,Q);for(let N of z){if($.length>=_)break;k_(J,$,N)}}return $}var v0=15000;function tu(u){u.graphCache=null,u.graphCacheKey=null,u.graphCacheBuiltAt=null}function Lu(u,_){let g=_??"__cross__";if(u.graphCache&&u.graphCacheBuiltAt!==null){if(Date.now()-u.graphCacheBuiltAt>v0)u.graphCache=null,u.graphCacheKey=null,u.graphCacheBuiltAt=null}if(u.graphCache&&u.graphCacheKey===g)return u.graphCache;let $=new au({relationRepo:u.relationRepo,project:_??u.defaultProject,additionalProjects:_?void 0:u.boundaries?.map((J)=>J.project)});return $.build(),u.graphCache=$,u.graphCacheKey=g,u.graphCacheBuiltAt=Date.now(),$}function Zg(u,_,g,$=1e4){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:g??u.defaultProject,query:{srcFilePath:_,type:"imports",project:g??u.defaultProject,limit:$}}).map((J)=>J.dstFilePath)}catch(J){if(J instanceof w)throw J;throw new w("search","Gildash: getDependencies failed",{cause:J})}}function Xg(u,_,g,$=1e4){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:g??u.defaultProject,query:{dstFilePath:_,type:"imports",project:g??u.defaultProject,limit:$}}).map((J)=>J.srcFilePath)}catch(J){if(J instanceof w)throw J;throw new w("search","Gildash: getDependents failed",{cause:J})}}async function Kg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return Lu(u,g).getAffectedByChange(_)}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: getAffected failed",{cause:$})}}async function Mg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return Lu(u,_).hasCycle()}catch(g){if(g instanceof w)throw g;throw new w("search","Gildash: hasCycle failed",{cause:g})}}async function Bg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return Lu(u,_).getAdjacencyList()}catch(g){if(g instanceof w)throw g;throw new w("search","Gildash: getImportGraph failed",{cause:g})}}async function Hg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return Lu(u,g).getTransitiveDependencies(_)}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: getTransitiveDependencies failed",{cause:$})}}async function Lg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return Lu(u,g).getTransitiveDependents(_)}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: getTransitiveDependents failed",{cause:$})}}async function Ig(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return Lu(u,_).getCyclePaths(g)}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: getCyclePaths failed",{cause:$})}}async function Dg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{let $=Lu(u,g);return{filePath:_,fanIn:$.getDependents(_).length,fanOut:$.getDependencies(_).length}}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: getFanMetrics failed",{cause:$})}}var y0=30000,Ag=15000,f0=10;function P0(u,_){return(g)=>{for(let $ of u.onFileChangedCallbacks)try{$(g)}catch(J){u.logger.error("[Gildash] onFileChanged callback threw:",J)}if(_.handleWatcherEvent?.(g),u.semanticLayer)if(g.eventType==="delete")try{u.semanticLayer.notifyFileDeleted(g.filePath)}catch($){u.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw:",$);for(let J of u.onErrorCallbacks)try{J($ instanceof w?$:new w("semantic","semantic notifyFileDeleted failed",{cause:$}))}catch{}}else u.readFileFn(g.filePath).then(($)=>{try{u.semanticLayer?.notifyFileChanged(g.filePath,$)}catch(J){u.logger.error("[Gildash] semanticLayer.notifyFileChanged threw:",J);for(let O of u.onErrorCallbacks)try{O(J instanceof w?J:new w("semantic","semantic notifyFileChanged failed",{cause:J}))}catch{}}}).catch(($)=>{u.logger.error("[Gildash] failed to read file for semantic layer",g.filePath,$);try{u.semanticLayer?.notifyFileDeleted(g.filePath)}catch(J){u.logger.error("[Gildash] semanticLayer.notifyFileDeleted threw during read error recovery:",J)}})}}async function m0(u){if(!u.semanticLayer)return;let _=u.fileRepo.getAllFiles(u.defaultProject);await Promise.all(_.map(async(g)=>{try{let $=Eu.resolve(u.projectRoot,g.filePath),J=await u.readFileFn($);u.semanticLayer?.notifyFileChanged($,J)}catch{}}))}async function Cg(u,_){let g=u.coordinatorFactory?u.coordinatorFactory():new Z_({projectRoot:u.projectRoot,boundaries:u.boundaries,extensions:u.extensions,ignorePatterns:u.ignorePatterns,dbConnection:u.db,parseCache:u.parseCache,fileRepo:u.fileRepo,symbolRepo:u.symbolRepo,relationRepo:u.relationRepo,annotationRepo:u.annotationRepo??void 0,changelogRepo:u.changelogRepo??void 0,logger:u.logger});u.coordinator=g;for(let $ of u.onIndexedCallbacks)g.onIndexed($);if(g.onIndexed(($)=>{let J=$.changedFiles.length+$.deletedFiles.length;if(u.graphCache&&J>0&&J<100){let O=u.relationRepo;u.graphCache.patchFiles($.changedFiles,$.deletedFiles,(Q)=>{return[u.defaultProject,...u.boundaries.map((N)=>N.project)].flatMap((N)=>O.getByType(N,"imports").concat(O.getByType(N,"type-references")).concat(O.getByType(N,"re-exports"))).filter((N)=>N.srcFilePath===Q||N.dstFilePath===Q).map((N)=>({srcFilePath:N.srcFilePath,dstFilePath:N.dstFilePath}))}),u.graphCacheBuiltAt=Date.now()}else tu(u)}),_.isWatchMode){let $=u.watcherFactory?u.watcherFactory():new N_({projectRoot:u.projectRoot,ignorePatterns:u.ignorePatterns,extensions:u.extensions},void 0,u.logger);await $.start(P0(u,g)).then((J)=>{if(vu(J))throw J.data}),u.watcher=$,u.timer=setInterval(()=>{u.updateHeartbeatFn(u.db,process.pid)},y0)}await g.fullIndex(),await m0(u)}function h0(u,_){let g=["SIGTERM","SIGINT","beforeExit"];for(let $ of g){let J=()=>{_().catch((O)=>u.logger.error("[Gildash] close error during signal",$,O))};if($==="beforeExit")process.on("beforeExit",J);else process.on($,J);u.signalHandlers.push([$,J])}}async function Sg(u){let{projectRoot:_,extensions:g=[".ts",".mts",".cts"],ignorePatterns:$=["**/node_modules/**"],parseCacheCapacity:J=500,logger:O=console,existsSyncFn:Q=b0,dbConnectionFactory:z,watcherFactory:N,coordinatorFactory:V,repositoryFactory:W,acquireWatcherRoleFn:U=_g,releaseWatcherRoleFn:X=gg,updateHeartbeatFn:M=$g,discoverProjectsFn:I=mu,parseSourceFn:D=ju,extractSymbolsFn:q=Su,extractRelationsFn:j=lu,symbolSearchFn:h=K_,relationSearchFn:Z=M_,patternSearchFn:K=B_,loadTsconfigPathsFn:B=qu,readFileFn:R=async(p)=>Bun.file(p).text(),unlinkFn:T=async(p)=>{await Bun.file(p).unlink()},watchMode:S,semantic:G,semanticLayerFactory:f}=u;if(!Eu.isAbsolute(_))throw new w("validation",`Gildash: projectRoot must be an absolute path, got: "${_}"`);if(!Q(_))throw new w("validation",`Gildash: projectRoot does not exist: "${_}"`);let y=z?z():new __({projectRoot:_}),E=y.open();if(vu(E))throw E.data;try{let p=await I(_),gu=p[0]?.project??Eu.basename(_),r=W?W():(()=>{let t=y;return{fileRepo:new g_(t),symbolRepo:new $_(t),relationRepo:new J_(t),parseCache:new X_(J)}})(),uu=W?null:y,Y=uu?new S_(uu):null,A=uu?new R_(uu):null,C=S??!0,k=crypto.randomUUID(),P;if(C)P=await Promise.resolve(U(y,process.pid,{instanceId:k}));else P="owner";let H={projectRoot:_,extensions:g,ignorePatterns:$,logger:O,defaultProject:gu,role:P,db:y,symbolRepo:r.symbolRepo,relationRepo:r.relationRepo,fileRepo:r.fileRepo,parseCache:r.parseCache,annotationRepo:Y,changelogRepo:A,annotationSearchFn:Yg,releaseWatcherRoleFn:X,parseSourceFn:D,extractSymbolsFn:q,extractRelationsFn:j,symbolSearchFn:h,relationSearchFn:Z,patternSearchFn:K,readFileFn:R,unlinkFn:T,existsSyncFn:Q,acquireWatcherRoleFn:U,updateHeartbeatFn:M,watcherFactory:N,coordinatorFactory:V,instanceId:k,closed:!1,coordinator:null,watcher:null,timer:null,signalHandlers:[],tsconfigPaths:null,boundaries:p,onIndexedCallbacks:new Set,onFileChangedCallbacks:new Set,onErrorCallbacks:new Set,onRoleChangedCallbacks:new Set,graphCache:null,graphCacheKey:null,graphCacheBuiltAt:null,semanticLayer:null};if(hu(_),H.tsconfigPaths=await B(_),G){let t=Eu.join(_,"tsconfig.json");try{if(f)H.semanticLayer=f(t);else{let F=su.create(t);if(vu(F))throw F.data;H.semanticLayer=F}}catch(F){if(F instanceof w)throw F;throw new w("semantic","Gildash: semantic layer creation failed",{cause:F})}}if(P==="owner")await Cg(H,{isWatchMode:C});else{let t=0,F=async()=>{try{let m=await Promise.resolve(H.acquireWatcherRoleFn(H.db,process.pid,{instanceId:H.instanceId}));if(t=0,m==="owner"){H.role="owner";for(let v of H.onRoleChangedCallbacks)try{v("owner")}catch(l){H.logger.error("[Gildash] onRoleChanged callback threw:",l)}clearInterval(H.timer),H.timer=null;try{await Cg(H,{isWatchMode:!0})}catch(v){if(H.logger.error("[Gildash] owner promotion failed, reverting to reader",v),H.role="reader",H.timer!==null)clearInterval(H.timer),H.timer=null;if(H.watcher){let l=await H.watcher.close();if(vu(l))H.logger.error("[Gildash] watcher close error during promotion rollback",l.data);H.watcher=null}if(H.coordinator)await H.coordinator.shutdown().catch((l)=>H.logger.error("[Gildash] coordinator shutdown error during promotion rollback",l)),H.coordinator=null;try{H.releaseWatcherRoleFn(H.db,process.pid)}catch(l){H.logger.error("[Gildash] failed to release watcher role during promotion rollback",l)}H.timer=setInterval(F,Ag)}}}catch(m){t++;let v=m instanceof w?m:new w("watcher","Gildash: healthcheck error",{cause:m});for(let l of H.onErrorCallbacks)try{l(v)}catch(Uu){H.logger.error("[Gildash] onError callback threw:",Uu)}if(H.logger.error("[Gildash] healthcheck error",m),t>=f0)H.logger.error("[Gildash] healthcheck failed too many times, shutting down"),clearInterval(H.timer),H.timer=null,ou(H).catch((l)=>H.logger.error("[Gildash] close error during healthcheck shutdown",l))}};H.timer=setInterval(F,Ag)}if(C)h0(H,()=>ou(H));return H}catch(p){if(y.close(),p instanceof w)throw p;throw new w("store","Gildash: initialization failed",{cause:p})}}async function ou(u,_){if(u.closed)return;u.closed=!0;let g=[];for(let[$,J]of u.signalHandlers)if($==="beforeExit")process.off("beforeExit",J);else process.off($,J);if(u.signalHandlers=[],u.semanticLayer){try{u.semanticLayer.dispose()}catch($){g.push($ instanceof Error?$:Error(String($)))}u.semanticLayer=null}if(u.coordinator)try{await u.coordinator.shutdown()}catch($){g.push($ instanceof Error?$:Error(String($)))}if(u.watcher){let $=await u.watcher.close();if(vu($))g.push($.data)}if(u.timer!==null)clearInterval(u.timer),u.timer=null;try{u.releaseWatcherRoleFn(u.db,process.pid)}catch($){g.push($ instanceof Error?$:Error(String($)))}try{u.db.close()}catch($){g.push($ instanceof Error?$:Error(String($)))}if(_?.cleanup)for(let $ of["","-wal","-shm"])try{await u.unlinkFn(Eu.join(u.projectRoot,Yu,yu+$))}catch{}if(g.length>0)throw new w("close","Gildash: one or more errors occurred during close()",{cause:g})}import{isErr as Rg}from"@zipbul/result";function kg(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");let J=u.parseSourceFn(_,g,$);if(Rg(J))throw J.data;return u.parseCache.set(_,J),J}async function Tg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");let $=new Map,J=[];return await Promise.all(_.map(async(O)=>{try{let Q=await u.readFileFn(O),z=u.parseSourceFn(O,Q,g);if(!Rg(z))$.set(O,z);else J.push({filePath:O,error:z.data})}catch(Q){J.push({filePath:O,error:Q instanceof Error?Q:Error(String(Q))})}})),{parsed:$,failures:J}}function qg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");return u.parseCache.get(_)}function jg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");return u.extractSymbolsFn(_)}function Fg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");return u.extractRelationsFn(_.program,_.filePath,u.tsconfigPaths??void 0)}import ng from"path";function Gg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.symbolRepo.getStats(_??u.defaultProject)}catch(g){if(g instanceof w)throw g;throw new w("store","Gildash: getStats failed",{cause:g})}}function T_(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.symbolSearchFn({symbolRepo:u.symbolRepo,project:u.defaultProject,query:_})}catch(g){if(g instanceof w)throw g;throw new w("search","Gildash: searchSymbols failed",{cause:g})}}function vg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:u.defaultProject,query:_})}catch(g){if(g instanceof w)throw g;throw new w("search","Gildash: searchRelations failed",{cause:g})}}function Eg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.symbolSearchFn({symbolRepo:u.symbolRepo,project:void 0,query:_})}catch(g){if(g instanceof w)throw g;throw new w("search","Gildash: searchAllSymbols failed",{cause:g})}}function bg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:void 0,query:_})}catch(g){if(g instanceof w)throw g;throw new w("search","Gildash: searchAllRelations failed",{cause:g})}}function yg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.fileRepo.getAllFiles(_??u.defaultProject)}catch(g){if(g instanceof w)throw g;throw new w("store","Gildash: listIndexedFiles failed",{cause:g})}}function fg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.relationSearchFn({relationRepo:u.relationRepo,project:g??u.defaultProject,query:{srcFilePath:_,dstFilePath:_,limit:1e4}})}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: getInternalRelations failed",{cause:$})}}function Pg(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");try{let J=$??u.defaultProject,O=u.symbolSearchFn({symbolRepo:u.symbolRepo,project:J,query:{text:_,exact:!0,filePath:g,limit:1}});if(O.length===0)return null;let Q=O[0],z=Q.detail,N={...Q,members:Array.isArray(z.members)?z.members:void 0,jsDoc:typeof z.jsDoc==="string"?z.jsDoc:void 0,parameters:typeof z.parameters==="string"?z.parameters:void 0,returnType:typeof z.returnType==="string"?z.returnType:void 0,heritage:Array.isArray(z.heritage)?z.heritage:void 0,decorators:Array.isArray(z.decorators)?z.decorators:void 0,typeParameters:typeof z.typeParameters==="string"?z.typeParameters:void 0};if(u.semanticLayer)try{let V=ng.isAbsolute(g)?g:ng.resolve(u.projectRoot,g),W=u.semanticLayer.lineColumnToPosition(V,Q.span.start.line,Q.span.start.column);if(W!==null){let U=u.semanticLayer.findNamePosition(V,W,Q.name)??W,X=u.semanticLayer.collectTypeAt(V,U);if(X)N.resolvedType=X}}catch{}return N}catch(J){if(J instanceof w)throw J;throw new w("search","Gildash: getFullSymbol failed",{cause:J})}}function mg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{let $=g??u.defaultProject,J=u.fileRepo.getFile($,_);if(!J)throw new w("search",`Gildash: file '${_}' is not in the index`);let O=u.symbolRepo.getFileSymbols($,_),Q=u.relationRepo.getOutgoing($,_);return{filePath:J.filePath,lineCount:J.lineCount??0,size:J.size,symbolCount:O.length,exportedSymbolCount:O.filter((z)=>z.isExported).length,relationCount:Q.length}}catch($){if($ instanceof w)throw $;throw new w("store","Gildash: getFileStats failed",{cause:$})}}function hg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{return u.fileRepo.getFile(g??u.defaultProject,_)}catch($){if($ instanceof w)throw $;throw new w("store","Gildash: getFileInfo failed",{cause:$})}}function xg(u,_,g){return T_(u,{filePath:_,project:g??void 0,limit:1e4})}function ig(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{let J=u.symbolSearchFn({symbolRepo:u.symbolRepo,project:g??u.defaultProject,query:{filePath:_,isExported:!0}}).map((O)=>({name:O.name,kind:O.kind,parameters:O.detail.parameters??void 0,returnType:O.detail.returnType??void 0,jsDoc:O.detail.jsDoc??void 0}));return{filePath:_,exports:J}}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: getModuleInterface failed",{cause:$})}}import i from"path";function bu(u,_,g,$){let J=$??u.defaultProject,O=i.isAbsolute(g)?i.relative(u.projectRoot,g):g,Q=u.symbolSearchFn({symbolRepo:u.symbolRepo,project:J,query:{text:_,exact:!0,filePath:O,limit:1}});if(Q.length===0)return null;let z=Q[0],N=i.isAbsolute(g)?g:i.resolve(u.projectRoot,g),V=u.semanticLayer.lineColumnToPosition(N,z.span.start.line,z.span.start.column);if(V===null)return null;let W=u.semanticLayer.findNamePosition(N,V,z.name)??V;return{sym:z,position:W,absPath:N}}function pg(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let J=bu(u,_,g,$);if(!J)return null;return u.semanticLayer.collectTypeAt(J.absPath,J.position)}catch(J){if(J instanceof w)throw J;throw new w("search","Gildash: getResolvedType failed",{cause:J})}}function lg(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let J=bu(u,_,g,$);if(!J)throw new w("search",`Gildash: symbol '${_}' not found in '${g}'`);return u.semanticLayer.findReferences(J.absPath,J.position)}catch(J){if(J instanceof w)throw J;throw new w("search","Gildash: getSemanticReferences failed",{cause:J})}}function dg(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let J=bu(u,_,g,$);if(!J)throw new w("search",`Gildash: symbol '${_}' not found in '${g}'`);return u.semanticLayer.findImplementations(J.absPath,J.position)}catch(J){if(J instanceof w)throw J;throw new w("search","Gildash: getImplementations failed",{cause:J})}}function cg(u,_,g,$,J,O){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let Q=bu(u,_,g,O);if(!Q)throw new w("search",`Gildash: source symbol '${_}' not found in '${g}'`);let z=bu(u,$,J,O);if(!z)throw new w("search",`Gildash: target symbol '${$}' not found in '${J}'`);return u.semanticLayer.isTypeAssignableTo(Q.absPath,Q.position,z.absPath,z.position)}catch(Q){if(Q instanceof w)throw Q;throw new w("semantic","Gildash: isTypeAssignableTo failed",{cause:Q})}}function rg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let g=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.collectFileTypes(g)}catch(g){if(g instanceof w)throw g;throw new w("semantic","Gildash: getFileTypes failed",{cause:g})}}function sg(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let J=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_),O=u.semanticLayer.lineColumnToPosition(J,g,$);if(O===null)return null;return u.semanticLayer.collectTypeAt(J,O)}catch(J){if(J instanceof w)throw J;throw new w("semantic","Gildash: getResolvedTypeAt failed",{cause:J})}}function ag(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let g=i.isAbsolute(_.source.filePath)?_.source.filePath:i.resolve(u.projectRoot,_.source.filePath),$=i.isAbsolute(_.target.filePath)?_.target.filePath:i.resolve(u.projectRoot,_.target.filePath),J=u.semanticLayer.lineColumnToPosition(g,_.source.line,_.source.column);if(J===null)return null;let O=u.semanticLayer.lineColumnToPosition($,_.target.line,_.target.column);if(O===null)return null;return u.semanticLayer.isTypeAssignableTo(g,J,$,O)}catch(g){if(g instanceof w)throw g;throw new w("semantic","Gildash: isTypeAssignableToAt failed",{cause:g})}}function tg(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{return u.semanticLayer.getModuleInterface(_)}catch(g){if(g instanceof w)throw g;throw new w("search","Gildash: getSemanticModuleInterface failed",{cause:g})}}function og(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let $=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.collectTypeAt($,g)}catch($){if($ instanceof w)throw $;throw new w("semantic","Gildash: getResolvedTypeAtPosition failed",{cause:$})}}function eg(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let $=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.findReferences($,g)}catch($){if($ instanceof w)throw $;throw new w("semantic","Gildash: getSemanticReferencesAtPosition failed",{cause:$})}}function u$(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let $=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.findImplementations($,g)}catch($){if($ instanceof w)throw $;throw new w("semantic","Gildash: getImplementationsAtPosition failed",{cause:$})}}function _$(u,_,g,$,J){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let O=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_),Q=i.isAbsolute($)?$:i.resolve(u.projectRoot,$);return u.semanticLayer.isTypeAssignableTo(O,g,Q,J)}catch(O){if(O instanceof w)throw O;throw new w("semantic","Gildash: isTypeAssignableToAtPosition failed",{cause:O})}}function g$(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let J=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.isTypeAssignableToType(J,g,$)}catch(J){if(J instanceof w)throw J;throw new w("semantic","Gildash: isTypeAssignableToType failed",{cause:J})}}function $$(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let J=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.lineColumnToPosition(J,g,$)}catch(J){if(J instanceof w)throw J;throw new w("semantic","Gildash: lineColumnToPosition failed",{cause:J})}}function J$(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let J=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.findNamePosition(J,g,$)}catch(J){if(J instanceof w)throw J;throw new w("semantic","Gildash: findNamePosition failed",{cause:J})}}function Q$(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let $=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.getSymbolNode($,g)}catch($){if($ instanceof w)throw $;throw new w("semantic","Gildash: getSymbolNode failed",{cause:$})}}function N$(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.semanticLayer)throw new w("semantic","Gildash: semantic layer is not enabled");try{let g=i.isAbsolute(_)?_:i.resolve(u.projectRoot,_);return u.semanticLayer.getDiagnostics(g)}catch(g){if(g instanceof w)throw g;throw new w("semantic","Gildash: getSemanticDiagnostics failed",{cause:g})}}function z$(u,_){let g=new Map(u.map((z)=>[`${z.name}::${z.filePath}`,z])),$=new Map(_.map((z)=>[`${z.name}::${z.filePath}`,z])),J=[],O=[],Q=[];for(let[z,N]of $){let V=g.get(z);if(!V)J.push(N);else if(V.fingerprint!==N.fingerprint)Q.push({before:V,after:N})}for(let[z,N]of g)if(!$.has(z))O.push(N);return{added:J,removed:O,modified:Q}}function O$(u,_){if(u.onIndexedCallbacks.add(_),!u.coordinator)return()=>{u.onIndexedCallbacks.delete(_)};let g=u.coordinator.onIndexed(_);return()=>{u.onIndexedCallbacks.delete(_),g()}}async function w$(u){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.coordinator)throw new w("closed","Gildash: reindex() is not available for readers");try{let _=await u.coordinator.fullIndex();return tu(u),_}catch(_){if(_ instanceof w)throw _;throw new w("index","Gildash: reindex failed",{cause:_})}}function W$(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");let J=$??u.defaultProject,O=new Set,Q=[],z=_,N=g;for(;;){let V=`${N}::${z}`;if(O.has(V))return{originalName:z,originalFilePath:N,reExportChain:Q,circular:!0};O.add(V);let W=u.relationSearchFn({relationRepo:u.relationRepo,project:J,query:{type:"re-exports",srcFilePath:N,limit:500}}),U,X;for(let M of W){let I;if(M.metaJson)try{let q=JSON.parse(M.metaJson);if(Array.isArray(q.specifiers))I=q.specifiers}catch{}if(!I)continue;let D=I.find((q)=>q.exported===z);if(!D)continue;U=M.dstFilePath,X=D.local;break}if(!U||!X)return{originalName:z,originalFilePath:N,reExportChain:Q,circular:!1};Q.push({filePath:N,exportedAs:z}),N=U,z=X}}function V$(u,_){return u.onFileChangedCallbacks.add(_),()=>{u.onFileChangedCallbacks.delete(_)}}function U$(u,_){return u.onErrorCallbacks.add(_),()=>{u.onErrorCallbacks.delete(_)}}function Y$(u,_){return u.onRoleChangedCallbacks.add(_),()=>{u.onRoleChangedCallbacks.delete(_)}}async function Z$(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");try{let $=g?.project??u.defaultProject,J=g?.filePaths?g.filePaths:u.fileRepo.getAllFiles($).map((O)=>O.filePath);return await u.patternSearchFn({pattern:_,filePaths:J})}catch($){if($ instanceof w)throw $;throw new w("search","Gildash: findPattern failed",{cause:$})}}async function X$(u,_,g,$){if(u.closed)throw new w("closed","Gildash: instance is closed");try{let J=$??u.defaultProject,O=new Set,Q=(z,N,V)=>{let W=`${z}::${N}`;if(O.has(W))return{symbolName:z,filePath:N,kind:V,children:[]};O.add(W);let M=u.relationSearchFn({relationRepo:u.relationRepo,project:J,query:{srcFilePath:N,srcSymbolName:z,limit:1000}}).filter((I)=>I.type==="extends"||I.type==="implements").filter((I)=>I.dstSymbolName!=null).map((I)=>Q(I.dstSymbolName,I.dstFilePath,I.type));return{symbolName:z,filePath:N,kind:V,children:M}};return Q(_,g)}catch(J){if(J instanceof w)throw J;throw new w("search","Gildash: getHeritageChain failed",{cause:J})}}function K$(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.annotationRepo||!u.annotationSearchFn)return[];return u.annotationSearchFn({annotationRepo:u.annotationRepo,project:_.project??u.defaultProject,query:_})}function M$(u,_,g){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.changelogRepo)return[];let $=_ instanceof Date?_.toISOString():_,J=g?.project??u.defaultProject,O=g?.limit??1000;return u.changelogRepo.getSince({project:J,since:$,symbolName:g?.symbolName,changeTypes:g?.changeTypes,filePath:g?.filePath,includeFullIndex:g?.includeFullIndex,indexRunId:g?.indexRunId,afterId:g?.afterId,limit:O}).map((z)=>({changeType:z.changeType,symbolName:z.symbolName,symbolKind:z.symbolKind,filePath:z.filePath,oldName:z.oldName,oldFilePath:z.oldFilePath,fingerprint:z.fingerprint,changedAt:z.changedAt,isFullIndex:z.isFullIndex===1,indexRunId:z.indexRunId}))}function B$(u,_){if(u.closed)throw new w("closed","Gildash: instance is closed");if(!u.changelogRepo)return 0;let g=_ instanceof Date?_.toISOString():_,$=0,J=[u.defaultProject,...u.boundaries.map((Q)=>Q.project)],O=[...new Set(J)];for(let Q of O)$+=u.changelogRepo.pruneOlderThan(Q,g);return $}class q_{_ctx;get projectRoot(){return this._ctx.projectRoot}get role(){return this._ctx.role}get projects(){return[...this._ctx.boundaries]}constructor(u){this._ctx=u}static async open(u){let _=await Sg(u);return new q_(_)}async close(u){return ou(this._ctx,u)}parseSource(u,_,g){return kg(this._ctx,u,_,g)}async batchParse(u,_){return Tg(this._ctx,u,_)}getParsedAst(u){return qg(this._ctx,u)}extractSymbols(u){return jg(this._ctx,u)}extractRelations(u){return Fg(this._ctx,u)}getStats(u){return Gg(this._ctx,u)}searchSymbols(u){return T_(this._ctx,u)}searchRelations(u){return vg(this._ctx,u)}searchAllSymbols(u){return Eg(this._ctx,u)}searchAllRelations(u){return bg(this._ctx,u)}listIndexedFiles(u){return yg(this._ctx,u)}getInternalRelations(u,_){return fg(this._ctx,u,_)}getFullSymbol(u,_,g){return Pg(this._ctx,u,_,g)}getFileStats(u,_){return mg(this._ctx,u,_)}getFileInfo(u,_){return hg(this._ctx,u,_)}getSymbolsByFile(u,_){return xg(this._ctx,u,_)}getModuleInterface(u,_){return ig(this._ctx,u,_)}getDependencies(u,_,g=1e4){return Zg(this._ctx,u,_,g)}getDependents(u,_,g=1e4){return Xg(this._ctx,u,_,g)}async getAffected(u,_){return Kg(this._ctx,u,_)}async hasCycle(u){return Mg(this._ctx,u)}async getImportGraph(u){return Bg(this._ctx,u)}async getTransitiveDependencies(u,_){return Hg(this._ctx,u,_)}async getTransitiveDependents(u,_){return Lg(this._ctx,u,_)}async getCyclePaths(u,_){return Ig(this._ctx,u,_)}async getFanMetrics(u,_){return Dg(this._ctx,u,_)}getResolvedType(u,_,g){return pg(this._ctx,u,_,g)}getSemanticReferences(u,_,g){return lg(this._ctx,u,_,g)}getImplementations(u,_,g){return dg(this._ctx,u,_,g)}isTypeAssignableTo(u,_,g,$,J){return cg(this._ctx,u,_,g,$,J)}getSemanticModuleInterface(u){return tg(this._ctx,u)}getFileTypes(u){return rg(this._ctx,u)}getResolvedTypeAt(u,_,g){return sg(this._ctx,u,_,g)}isTypeAssignableToAt(u){return ag(this._ctx,u)}getResolvedTypeAtPosition(u,_){return og(this._ctx,u,_)}getSemanticReferencesAtPosition(u,_){return eg(this._ctx,u,_)}getImplementationsAtPosition(u,_){return u$(this._ctx,u,_)}isTypeAssignableToAtPosition(u,_,g,$){return _$(this._ctx,u,_,g,$)}isTypeAssignableToType(u,_,g){return g$(this._ctx,u,_,g)}lineColumnToPosition(u,_,g){return $$(this._ctx,u,_,g)}findNamePosition(u,_,g){return J$(this._ctx,u,_,g)}getSymbolNode(u,_){return Q$(this._ctx,u,_)}getSemanticDiagnostics(u){return N$(this._ctx,u)}diffSymbols(u,_){return z$(u,_)}onIndexed(u){return O$(this._ctx,u)}async reindex(){return w$(this._ctx)}resolveSymbol(u,_,g){return W$(this._ctx,u,_,g)}async findPattern(u,_){return Z$(this._ctx,u,_)}async getHeritageChain(u,_,g){return X$(this._ctx,u,_,g)}onFileChanged(u){return V$(this._ctx,u)}onError(u){return U$(this._ctx,u)}onRoleChanged(u){return Y$(this._ctx,u)}searchAnnotations(u){return K$(this._ctx,u)}getSymbolChanges(u,_){return M$(this._ctx,u,_)}pruneChangelog(u){return B$(this._ctx,u)}}export{K_ as symbolSearch,M_ as relationSearch,B_ as patternSearch,$u as gildashError,w as GildashError,q_ as Gildash,au as DependencyGraph};
|
|
@@ -2,6 +2,7 @@ import type { Result } from '@zipbul/result';
|
|
|
2
2
|
import type { ParsedFile } from '../parser/types';
|
|
3
3
|
import type { ParserOptions, Program } from 'oxc-parser';
|
|
4
4
|
import type { ExtractedSymbol, CodeRelation } from '../extractor/types';
|
|
5
|
+
import type { StoredCodeRelation } from '../search/relation-search';
|
|
5
6
|
import type { DbConnection } from '../store/connection';
|
|
6
7
|
import type { FileRepository } from '../store/repositories/file.repository';
|
|
7
8
|
import type { SymbolRepository } from '../store/repositories/symbol.repository';
|
|
@@ -35,7 +36,7 @@ export type RelationSearchFn = (options: {
|
|
|
35
36
|
relationRepo: IRelationRepo;
|
|
36
37
|
project?: string;
|
|
37
38
|
query: RelationSearchQuery;
|
|
38
|
-
}) =>
|
|
39
|
+
}) => StoredCodeRelation[];
|
|
39
40
|
export type PatternSearchFn = (opts: {
|
|
40
41
|
pattern: string;
|
|
41
42
|
filePaths: string[];
|
|
@@ -56,7 +57,7 @@ export type CoordinatorLike = Pick<IndexCoordinator, 'fullIndex' | 'shutdown' |
|
|
|
56
57
|
handleWatcherEvent?(event: FileChangeEvent): void;
|
|
57
58
|
};
|
|
58
59
|
export type WatcherLike = Pick<ProjectWatcher, 'start' | 'close'>;
|
|
59
|
-
export type SemanticLayerLike = Pick<SemanticLayer, 'collectTypeAt' | 'collectFileTypes' | 'findReferences' | 'findImplementations' | 'isTypeAssignableTo' | 'getModuleInterface' | 'getSymbolNode' | 'notifyFileChanged' | 'notifyFileDeleted' | 'dispose' | 'isDisposed' | 'lineColumnToPosition' | 'findNamePosition'>;
|
|
60
|
+
export type SemanticLayerLike = Pick<SemanticLayer, 'collectTypeAt' | 'collectFileTypes' | 'findReferences' | 'findImplementations' | 'isTypeAssignableTo' | 'isTypeAssignableToType' | 'getModuleInterface' | 'getSymbolNode' | 'getDiagnostics' | 'notifyFileChanged' | 'notifyFileDeleted' | 'dispose' | 'isDisposed' | 'lineColumnToPosition' | 'findNamePosition'>;
|
|
60
61
|
/** Internal shared state for all Gildash API modules. */
|
|
61
62
|
export interface GildashContext {
|
|
62
63
|
readonly projectRoot: string;
|
|
@@ -23,6 +23,8 @@ export declare function hasCycle(ctx: GildashContext, project?: string): Promise
|
|
|
23
23
|
export declare function getImportGraph(ctx: GildashContext, project?: string): Promise<Map<string, string[]>>;
|
|
24
24
|
/** Return all files that `filePath` transitively imports (forward BFS). */
|
|
25
25
|
export declare function getTransitiveDependencies(ctx: GildashContext, filePath: string, project?: string): Promise<string[]>;
|
|
26
|
+
/** Return all files that transitively depend on `filePath` (reverse BFS). */
|
|
27
|
+
export declare function getTransitiveDependents(ctx: GildashContext, filePath: string, project?: string): Promise<string[]>;
|
|
26
28
|
/** Return all cycle paths in the import graph. */
|
|
27
29
|
export declare function getCyclePaths(ctx: GildashContext, project?: string, options?: {
|
|
28
30
|
maxCycles?: number;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ParsedFile } from '../parser/types';
|
|
2
2
|
import type { ParserOptions } from 'oxc-parser';
|
|
3
3
|
import type { ExtractedSymbol, CodeRelation } from '../extractor/types';
|
|
4
|
+
import type { StoredCodeRelation } from '../search/relation-search';
|
|
4
5
|
import type { IndexResult } from '../indexer/index-coordinator';
|
|
5
6
|
import type { ProjectBoundary } from '../common/project-discovery';
|
|
6
7
|
import type { SymbolSearchQuery, SymbolSearchResult } from '../search/symbol-search';
|
|
@@ -8,7 +9,8 @@ import type { RelationSearchQuery } from '../search/relation-search';
|
|
|
8
9
|
import type { SymbolStats } from '../store/repositories/symbol.repository';
|
|
9
10
|
import type { FileRecord } from '../store/repositories/file.repository';
|
|
10
11
|
import type { PatternMatch } from '../search/pattern-search';
|
|
11
|
-
import type { ResolvedType, SemanticReference, Implementation, SemanticModuleInterface } from '../semantic/types';
|
|
12
|
+
import type { ResolvedType, SemanticReference, Implementation, SemanticModuleInterface, SemanticDiagnostic } from '../semantic/types';
|
|
13
|
+
import type { SymbolNode } from '../semantic/symbol-graph';
|
|
12
14
|
import type { GildashContext } from './context';
|
|
13
15
|
import type { FileChangeEvent } from '../watcher/types';
|
|
14
16
|
import { GildashError } from '../errors';
|
|
@@ -57,13 +59,13 @@ export declare class Gildash {
|
|
|
57
59
|
extractRelations(parsed: ParsedFile): CodeRelation[];
|
|
58
60
|
getStats(project?: string): SymbolStats;
|
|
59
61
|
searchSymbols(query: SymbolSearchQuery): SymbolSearchResult[];
|
|
60
|
-
searchRelations(query: RelationSearchQuery):
|
|
62
|
+
searchRelations(query: RelationSearchQuery): StoredCodeRelation[];
|
|
61
63
|
searchAllSymbols(query: Omit<SymbolSearchQuery, 'project'> & {
|
|
62
64
|
project?: string;
|
|
63
65
|
}): SymbolSearchResult[];
|
|
64
|
-
searchAllRelations(query: RelationSearchQuery):
|
|
66
|
+
searchAllRelations(query: RelationSearchQuery): StoredCodeRelation[];
|
|
65
67
|
listIndexedFiles(project?: string): FileRecord[];
|
|
66
|
-
getInternalRelations(filePath: string, project?: string):
|
|
68
|
+
getInternalRelations(filePath: string, project?: string): StoredCodeRelation[];
|
|
67
69
|
getFullSymbol(symbolName: string, filePath: string, project?: string): FullSymbol | null;
|
|
68
70
|
getFileStats(filePath: string, project?: string): FileStats;
|
|
69
71
|
getFileInfo(filePath: string, project?: string): FileRecord | null;
|
|
@@ -75,6 +77,7 @@ export declare class Gildash {
|
|
|
75
77
|
hasCycle(project?: string): Promise<boolean>;
|
|
76
78
|
getImportGraph(project?: string): Promise<Map<string, string[]>>;
|
|
77
79
|
getTransitiveDependencies(filePath: string, project?: string): Promise<string[]>;
|
|
80
|
+
getTransitiveDependents(filePath: string, project?: string): Promise<string[]>;
|
|
78
81
|
getCyclePaths(project?: string, options?: {
|
|
79
82
|
maxCycles?: number;
|
|
80
83
|
}): Promise<string[][]>;
|
|
@@ -105,6 +108,15 @@ export declare class Gildash {
|
|
|
105
108
|
column: number;
|
|
106
109
|
};
|
|
107
110
|
}): boolean | null;
|
|
111
|
+
getResolvedTypeAtPosition(filePath: string, position: number): ResolvedType | null;
|
|
112
|
+
getSemanticReferencesAtPosition(filePath: string, position: number): SemanticReference[];
|
|
113
|
+
getImplementationsAtPosition(filePath: string, position: number): Implementation[];
|
|
114
|
+
isTypeAssignableToAtPosition(srcFilePath: string, srcPosition: number, dstFilePath: string, dstPosition: number): boolean | null;
|
|
115
|
+
isTypeAssignableToType(filePath: string, position: number, targetTypeExpression: string): boolean | null;
|
|
116
|
+
lineColumnToPosition(filePath: string, line: number, column: number): number | null;
|
|
117
|
+
findNamePosition(filePath: string, declarationPos: number, name: string): number | null;
|
|
118
|
+
getSymbolNode(filePath: string, position: number): SymbolNode | null;
|
|
119
|
+
getSemanticDiagnostics(filePath: string): SemanticDiagnostic[];
|
|
108
120
|
diffSymbols(before: SymbolSearchResult[], after: SymbolSearchResult[]): SymbolDiff;
|
|
109
121
|
onIndexed(callback: (result: IndexResult) => void): () => void;
|
|
110
122
|
reindex(): Promise<IndexResult>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { SymbolSearchQuery, SymbolSearchResult } from '../search/symbol-search';
|
|
2
|
-
import type { RelationSearchQuery } from '../search/relation-search';
|
|
3
|
-
import type { CodeRelation } from '../extractor/types';
|
|
2
|
+
import type { RelationSearchQuery, StoredCodeRelation } from '../search/relation-search';
|
|
4
3
|
import type { FileRecord } from '../store/repositories/file.repository';
|
|
5
4
|
import type { SymbolStats } from '../store/repositories/symbol.repository';
|
|
6
5
|
import type { GildashContext } from './context';
|
|
@@ -10,17 +9,17 @@ export declare function getStats(ctx: GildashContext, project?: string): SymbolS
|
|
|
10
9
|
/** Search indexed symbols by name, kind, file path, or export status. */
|
|
11
10
|
export declare function searchSymbols(ctx: GildashContext, query: SymbolSearchQuery): SymbolSearchResult[];
|
|
12
11
|
/** Search indexed code relationships (imports, calls, extends, implements). */
|
|
13
|
-
export declare function searchRelations(ctx: GildashContext, query: RelationSearchQuery):
|
|
12
|
+
export declare function searchRelations(ctx: GildashContext, query: RelationSearchQuery): StoredCodeRelation[];
|
|
14
13
|
/** Search symbols across all projects (no project filter). */
|
|
15
14
|
export declare function searchAllSymbols(ctx: GildashContext, query: Omit<SymbolSearchQuery, 'project'> & {
|
|
16
15
|
project?: string;
|
|
17
16
|
}): SymbolSearchResult[];
|
|
18
17
|
/** Search relations across all projects (no project filter). */
|
|
19
|
-
export declare function searchAllRelations(ctx: GildashContext, query: RelationSearchQuery):
|
|
18
|
+
export declare function searchAllRelations(ctx: GildashContext, query: RelationSearchQuery): StoredCodeRelation[];
|
|
20
19
|
/** List all files indexed for a given project. */
|
|
21
20
|
export declare function listIndexedFiles(ctx: GildashContext, project?: string): FileRecord[];
|
|
22
21
|
/** Get all intra-file relations for a given file. */
|
|
23
|
-
export declare function getInternalRelations(ctx: GildashContext, filePath: string, project?: string):
|
|
22
|
+
export declare function getInternalRelations(ctx: GildashContext, filePath: string, project?: string): StoredCodeRelation[];
|
|
24
23
|
/** Retrieve full details for a named symbol in a specific file. */
|
|
25
24
|
export declare function getFullSymbol(ctx: GildashContext, symbolName: string, filePath: string, project?: string): FullSymbol | null;
|
|
26
25
|
/** Retrieve statistics for an indexed file. */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SymbolSearchResult } from '../search/symbol-search';
|
|
2
|
-
import type { ResolvedType, SemanticReference, Implementation, SemanticModuleInterface } from '../semantic/types';
|
|
2
|
+
import type { ResolvedType, SemanticReference, Implementation, SemanticModuleInterface, SemanticDiagnostic } from '../semantic/types';
|
|
3
|
+
import type { SymbolNode } from '../semantic/symbol-graph';
|
|
3
4
|
import type { GildashContext } from './context';
|
|
4
5
|
/**
|
|
5
6
|
* Look up a symbol's position for semantic queries.
|
|
@@ -37,3 +38,21 @@ export declare function isTypeAssignableToAt(ctx: GildashContext, opts: {
|
|
|
37
38
|
}): boolean | null;
|
|
38
39
|
/** Retrieve the semantic module interface — exported symbols with resolved types. */
|
|
39
40
|
export declare function getSemanticModuleInterface(ctx: GildashContext, filePath: string): SemanticModuleInterface;
|
|
41
|
+
/** Retrieve the resolved type at a byte offset without line/column conversion. */
|
|
42
|
+
export declare function getResolvedTypeAtPosition(ctx: GildashContext, filePath: string, position: number): ResolvedType | null;
|
|
43
|
+
/** Find all semantic references at a byte offset. */
|
|
44
|
+
export declare function getSemanticReferencesAtPosition(ctx: GildashContext, filePath: string, position: number): SemanticReference[];
|
|
45
|
+
/** Find implementations at a byte offset. */
|
|
46
|
+
export declare function getImplementationsAtPosition(ctx: GildashContext, filePath: string, position: number): Implementation[];
|
|
47
|
+
/** Check type assignability at byte offsets. */
|
|
48
|
+
export declare function isTypeAssignableToAtPosition(ctx: GildashContext, srcFilePath: string, srcPosition: number, dstFilePath: string, dstPosition: number): boolean | null;
|
|
49
|
+
/** Check whether the type at a position is assignable to a type expression string. */
|
|
50
|
+
export declare function isTypeAssignableToType(ctx: GildashContext, filePath: string, position: number, targetTypeExpression: string): boolean | null;
|
|
51
|
+
/** Convert 1-based line + 0-based column to a byte offset using tsc SourceFile. */
|
|
52
|
+
export declare function lineColumnToPosition(ctx: GildashContext, filePath: string, line: number, column: number): number | null;
|
|
53
|
+
/** Find the byte offset of a symbol name starting from its declaration position. */
|
|
54
|
+
export declare function findNamePosition(ctx: GildashContext, filePath: string, declarationPos: number, name: string): number | null;
|
|
55
|
+
/** Retrieve the tsc symbol graph node at a byte offset. */
|
|
56
|
+
export declare function getSymbolNode(ctx: GildashContext, filePath: string, position: number): SymbolNode | null;
|
|
57
|
+
/** Return tsc semantic diagnostics for an indexed file. */
|
|
58
|
+
export declare function getSemanticDiagnostics(ctx: GildashContext, filePath: string): SemanticDiagnostic[];
|
package/dist/src/index.d.ts
CHANGED
|
@@ -16,7 +16,8 @@ export type { SymbolStats } from "./store/repositories/symbol.repository";
|
|
|
16
16
|
export type { WatcherRole } 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, Implementation, SemanticModuleInterface } from "./semantic/types";
|
|
19
|
+
export type { ResolvedType, SemanticReference, Implementation, SemanticModuleInterface, SemanticDiagnostic } from "./semantic/types";
|
|
20
|
+
export type { SymbolNode } from "./semantic/symbol-graph";
|
|
20
21
|
export type { AnnotationSource, ExtractedAnnotation } from "./extractor/types";
|
|
21
22
|
export type { AnnotationSearchQuery, AnnotationSearchResult } from "./search/annotation-search";
|
|
22
23
|
export type { SymbolChange, SymbolChangeType, SymbolChangeQueryOptions } from "./gildash/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, Implementation, SemanticModuleInterface } from "./types";
|
|
14
|
+
import type { ResolvedType, SemanticReference, Implementation, SemanticModuleInterface, SemanticDiagnostic } from "./types";
|
|
15
15
|
export interface SemanticLayerOptions extends TscProgramOptions {
|
|
16
16
|
/** Override TypeCollector (for testing). */
|
|
17
17
|
typeCollector?: TypeCollector;
|
|
@@ -38,6 +38,11 @@ export declare class SemanticLayer {
|
|
|
38
38
|
findReferences(filePath: string, position: number): SemanticReference[];
|
|
39
39
|
findImplementations(filePath: string, position: number): Implementation[];
|
|
40
40
|
isTypeAssignableTo(sourceFilePath: string, sourcePosition: number, targetFilePath: string, targetPosition: number): boolean | null;
|
|
41
|
+
/**
|
|
42
|
+
* Check whether the type at `position` is assignable to a type described
|
|
43
|
+
* by `targetTypeExpression` (e.g. `'PromiseLike<any>'`, `'Error'`).
|
|
44
|
+
*/
|
|
45
|
+
isTypeAssignableToType(filePath: string, position: number, targetTypeExpression: string): boolean | null;
|
|
41
46
|
getSymbolNode(filePath: string, position: number): SymbolNode | null;
|
|
42
47
|
getModuleInterface(filePath: string): SemanticModuleInterface;
|
|
43
48
|
notifyFileChanged(filePath: string, content: string): void;
|
|
@@ -65,5 +70,12 @@ export declare class SemanticLayer {
|
|
|
65
70
|
* Returns `null` when the file is not in the program or the name is not found.
|
|
66
71
|
*/
|
|
67
72
|
findNamePosition(filePath: string, declarationPos: number, name: string): number | null;
|
|
73
|
+
/**
|
|
74
|
+
* Return tsc semantic diagnostics for an indexed file.
|
|
75
|
+
*
|
|
76
|
+
* Only files previously registered via `notifyFileChanged` produce
|
|
77
|
+
* meaningful results. Non-indexed files return an empty array.
|
|
78
|
+
*/
|
|
79
|
+
getDiagnostics(filePath: string): SemanticDiagnostic[];
|
|
68
80
|
dispose(): void;
|
|
69
81
|
}
|
|
@@ -10,10 +10,12 @@ export declare class TypeCollector {
|
|
|
10
10
|
private readonly program;
|
|
11
11
|
constructor(program: TscProgram);
|
|
12
12
|
/**
|
|
13
|
-
* `filePath`의 `position` 위치(0-based 문자 오프셋)에 있는
|
|
13
|
+
* `filePath`의 `position` 위치(0-based 문자 오프셋)에 있는 노드의 타입을 수집한다.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Identifier와 type keyword (`string`, `number`, `boolean` 등) 위치에서 동작한다.
|
|
16
|
+
*
|
|
17
|
+
* - 파일이 없거나 위치에 resolvable 노드가 없으면 `null` 반환
|
|
18
|
+
* - `TscProgram`이 disposed 상태이면 throw (getProgram이 throw)
|
|
17
19
|
*/
|
|
18
20
|
collectAt(filePath: string, position: number): ResolvedType | null;
|
|
19
21
|
/**
|
|
@@ -26,6 +28,14 @@ export declare class TypeCollector {
|
|
|
26
28
|
* - `TscProgram`이 disposed 상태이면 throw (getProgram이 throw)
|
|
27
29
|
*/
|
|
28
30
|
isAssignableTo(sourceFilePath: string, sourcePosition: number, targetFilePath: string, targetPosition: number): boolean | null;
|
|
31
|
+
/**
|
|
32
|
+
* `position` 위치의 타입이 `targetTypeExpression` 문자열로 표현된 타입에
|
|
33
|
+
* assignable한지 검사한다.
|
|
34
|
+
*
|
|
35
|
+
* target 타입은 `declare const __probe: {expr};` 형태의 가상 선언을 프로그램에
|
|
36
|
+
* 주입하여 resolve한다. 호출 후 가상 파일은 제거된다.
|
|
37
|
+
*/
|
|
38
|
+
isAssignableToType(filePath: string, position: number, targetTypeExpression: string): boolean | null;
|
|
29
39
|
/**
|
|
30
40
|
* `filePath`에서 모든 선언 이름 심볼의 타입을 수집한다.
|
|
31
41
|
*
|
|
@@ -106,3 +106,23 @@ export interface SemanticExport {
|
|
|
106
106
|
*/
|
|
107
107
|
resolvedType: ResolvedType | null;
|
|
108
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* A single tsc semantic diagnostic for an indexed file.
|
|
111
|
+
*
|
|
112
|
+
* Only covers files known to the Semantic Layer (i.e. files that have been
|
|
113
|
+
* indexed via `notifyFileChanged`). This is **not** equivalent to `tsc --noEmit`.
|
|
114
|
+
*/
|
|
115
|
+
export interface SemanticDiagnostic {
|
|
116
|
+
/** Absolute path of the file containing the diagnostic. */
|
|
117
|
+
filePath: string;
|
|
118
|
+
/** One-based line number. */
|
|
119
|
+
line: number;
|
|
120
|
+
/** Zero-based column offset. */
|
|
121
|
+
column: number;
|
|
122
|
+
/** Human-readable diagnostic message. */
|
|
123
|
+
message: string;
|
|
124
|
+
/** TypeScript diagnostic code (e.g. `2322` for type mismatch). */
|
|
125
|
+
code: number;
|
|
126
|
+
/** Severity category. */
|
|
127
|
+
category: 'error' | 'warning' | 'suggestion';
|
|
128
|
+
}
|