docuvia 1.14.4 → 1.15.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/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -149,7 +149,7 @@ ${n}
|
|
|
149
149
|
`,JSON_RPC_VERSION:"2.0"},zd={CONTENT_MODIFIED:-32801,SERVER_CANCELLED:-32802},Jd={MAX_ATTEMPTS:3,BACKOFF_MS:25},Yt={INITIALIZE:"initialize",INITIALIZED:"initialized",SHUTDOWN:"shutdown",EXIT:"exit",DID_OPEN:"textDocument/didOpen",DID_CLOSE:"textDocument/didClose",DOCUMENT_SYMBOL:"textDocument/documentSymbol",REFERENCES:"textDocument/references",DEFINITION:"textDocument/definition"},yr={NAMESPACE:3,CLASS:5,METHOD:6,CONSTRUCTOR:9,FUNCTION:12,OBJECT:19},$e={clientNotRunning:t=>`LSP request "${t}" attempted after the client stopped running`,clientStoppedBeforeResponse:"LSP client stopped before the server responded to the request",requestTimedOut:(t,e)=>`LSP request "${t}" timed out after ${e}ms`,serverExited:(t,e)=>`LSP server process exited (code=${String(t)}) before responding`+(e?` -- stderr: ${e}`:""),spawnFailed:(t,e)=>`Failed to spawn LSP server "${t}": ${e}`,initializeFailed:t=>`LSP server exited before completing its initialize handshake: ${t}`,batchTimedOut:t=>`Tier B LSP batch exceeded its ${t}ms timeout and was aborted`,resolutionFailedForFile:t=>`Tier B LSP resolution failed for ${t}`,skippedMultiLocationDefinition:t=>`Tier B forward resolution: first definition result for ${t} resolved outside the workspace; falling through to the next in-workspace result`,concurrencyClamped:(t,e)=>`Tier B LSP batch: maxConcurrentFiles=${t} clamped to ${e} (bounded by file count and maxOpenFiles)`,processShardsClamped:(t,e)=>`Tier B LSP batch: maxProcesses=${t} clamped to ${e} (bounded by file count)`,processShardsMemoryClamped:(t,e,r,n)=>`Tier B LSP batch: maxProcesses=${t} clamped to ${e} by memory (${r}MiB budget / ${n}MiB per shard)`};function j_(){return["pipe","pipe","pipe"]}var Ma=class extends Error{constructor(r,n){super(n);this.code=r;this.name="LspJsonRpcError"}code},sv=new Set([zd.CONTENT_MODIFIED,zd.SERVER_CANCELLED]);function ov(t){return t instanceof Ma&&t.code!==void 0&&sv.has(t.code)}var av=4e3,ka=class{child;buffer=Buffer.alloc(0);nextId=1;pending=new Map;stopped=!1;stderrTail="";async start(e){let r=Xr(e.command),n=e.env??Da(),i=r&&Vd(e.command)?await jd(e.command,e.env):e.command,s=r?W_([i,...e.args].map(Wd).join(" "),{cwd:e.cwd,stdio:j_(),shell:!0,env:n}):W_(e.command,e.args,{cwd:e.cwd,stdio:j_(),env:n});this.child=s,s.stdout.on("data",o=>this.onData(o)),s.stderr.on("data",o=>this.onStderr(o)),s.on("exit",o=>this.onExit(o)),s.on("error",o=>this.onError(o));try{await new Promise((o,a)=>{let l=()=>{s.removeListener("error",c),o()},c=u=>{s.removeListener("spawn",l),a(u)};s.once("spawn",l),s.once("error",c)})}catch(o){throw await this.stop(),o}}request(e,r,n){return!this.child||this.stopped?Promise.reject(new Error($e.clientNotRunning(e))):new Promise((i,s)=>{let o=n>0?Date.now()+n:void 0,a=0,l,c,u,p=!1,d=()=>{c&&clearTimeout(c),u&&clearTimeout(u),c=void 0,u=void 0},f=O=>{p||(p=!0,d(),l!==void 0&&this.pending.delete(l),l=void 0,O())},m=()=>{f(()=>s(new Error($e.requestTimedOut(e,n))))},_=()=>{if(p)return;if(!this.child||this.stopped){f(()=>s(new Error($e.clientNotRunning(e))));return}if(o!==void 0&&Date.now()>=o){m();return}a+=1;let O=this.nextId++;l=O,this.pending.set(O,{resolve:C=>f(()=>i(C)),reject:C=>{if(!ov(C)||a>=Jd.MAX_ATTEMPTS){f(()=>s(C));return}let w=o===void 0?1/0:o-Date.now();if(w<=0){m();return}u=setTimeout(()=>{if(u=void 0,!p){if(o!==void 0&&Date.now()>=o){m();return}this.pending.delete(O),l=void 0,_()}},Math.min(Jd.BACKOFF_MS,w))}}),this.write({jsonrpc:Pn.JSON_RPC_VERSION,id:O,method:e,params:r})};c=n>0?setTimeout(m,n):void 0,_()})}notify(e,r){!this.child||this.stopped||this.write({jsonrpc:Pn.JSON_RPC_VERSION,method:e,params:r})}async stop(){if(!this.child)return;this.stopped=!0;let e=this.child;this.child=void 0,this.rejectAllPending(new Error($e.clientStoppedBeforeResponse)),this.buffer=Buffer.alloc(0),this.stderrTail="",e.stdout.removeAllListeners("data"),e.stderr.removeAllListeners("data"),e.removeAllListeners("exit"),e.removeAllListeners("error"),e.removeAllListeners("spawn"),e.on("error",()=>{});try{e.stdin.end()}catch{}try{e.stdin.destroy(),e.stdout.destroy(),e.stderr.destroy()}catch{}try{e.kill()}catch{}try{e.unref()}catch{}}write(e){let r=JSON.stringify(e),n=`${Pn.CONTENT_LENGTH_HEADER_PREFIX}${Buffer.byteLength(r,H)}`+Pn.HEADER_BODY_SEPARATOR;this.child.stdin.write(n+r,H)}onData(e){for(this.buffer=Buffer.concat([this.buffer,e]);;)if(!this.tryConsumeOneMessage())return}tryConsumeOneMessage(){let e=this.buffer.indexOf(Pn.HEADER_BODY_SEPARATOR);if(e===-1)return!1;let r=this.buffer.subarray(0,e).toString(H),n=/Content-Length:\s*(\d+)/i.exec(r),i=e+Pn.HEADER_BODY_SEPARATOR.length;if(!n)return this.buffer=this.buffer.subarray(i),this.buffer.length>0;let s=Number(n[1]);if(this.buffer.length<i+s)return!1;let o=this.buffer.subarray(i,i+s).toString(H);return this.buffer=this.buffer.subarray(i+s),this.handleMessage(o),!0}handleMessage(e){let r;try{r=JSON.parse(e)}catch{return}if(r.id===void 0)return;let n=this.pending.get(r.id);n&&(r.error?n.reject(new Ma(typeof r.error.code=="number"?r.error.code:void 0,r.error.message??"")):n.resolve(r.result))}onStderr(e){this.stderrTail=(this.stderrTail+e.toString(H)).slice(-av)}onExit(e){this.stopped=!0,this.rejectAllPending(new Error($e.serverExited(e,this.stderrTail||void 0)))}onError(e){this.stopped=!0,this.rejectAllPending(e)}rejectAllPending(e){for(let r of this.pending.values())r.reject(e);this.pending.clear()}};import vn from"fs";import Ve from"path";var lv=[{languageId:B.RUST,basenames:[oe.CARGO_TOML],suffixes:[]},{languageId:B.GO,basenames:[oe.GO_MOD],suffixes:[]},{languageId:B.TYPESCRIPT,basenames:[oe.PACKAGE_JSON,oe.TSCONFIG_JSON,oe.JSCONFIG_JSON],suffixes:[]},{languageId:B.PYTHON,basenames:[oe.PYPROJECT_TOML,"setup.py","setup.cfg"],suffixes:[]},{languageId:B.CSHARP,basenames:[],suffixes:[".csproj",".sln",".slnx"]},{languageId:B.JAVA,basenames:["pom.xml","build.gradle","build.gradle.kts"],suffixes:[]},{languageId:B.CPP,basenames:["CMakeLists.txt","meson.build","BUILD","Makefile"],suffixes:[]},{languageId:B.PHP,basenames:["composer.json"],suffixes:[]},{languageId:B.RUBY,basenames:["Gemfile"],suffixes:[".gemspec"]}];function cv(t,e,r){let n=r.get(t);if(n!==void 0)return n;let i=!1;if(e.basenames.length>0&&(i=e.basenames.some(s=>vn.existsSync(Ve.join(t,s)))),!i&&e.suffixes.length>0)try{i=vn.readdirSync(t).some(s=>e.suffixes.some(o=>s.endsWith(o)))}catch{i=!1}return r.set(t,i),i}function uv(t,e,r,n){let i=Ve.dirname(Ve.join(t,e));for(;;){if(cv(i,r,n))return i;if(i===t)return t;let s=Ve.dirname(i);if(s===i)return t;i=s}}function V_(t,e){let r=Ve.relative(Ve.resolve(t),e);return r===""||r!==".."&&!r.startsWith(`..${Ve.sep}`)&&!Ve.isAbsolute(r)}function Dn(t,e,r,n){let i=Ve.resolve(t),s=Ve.normalize(Ve.resolve(r,n));if(V_(i,s))try{let o=vn.realpathSync(s);return V_(e,o)?s:void 0}catch{return}}function z_(t,e,r,n){return n.map(i=>Dn(t,e,r,i)).filter(i=>i!==void 0)}function dv(t,e,r){let n=Ga(t,oe.CARGO_TOML);if(n===void 0)return[];let i=[],s="";for(let o of n.split(/\r?\n/)){let a=o.trim(),l=a.match(/^\[(.+)\]$/);if(l){s=l[1].trim().toLowerCase();continue}if(s==="workspace"){for(let c of a.matchAll(/"([^"]+)"/g))i.push(c[1]);continue}if(s.includes("dependencies")||s.startsWith("patch")||s.startsWith("replace"))for(let c of a.matchAll(/path\s*=\s*"([^"]+)"/g))i.push(c[1])}return z_(e,r,t,i)}function pv(t,e,r){let n=Ga(t,oe.GO_MOD);if(n===void 0)return[];let i=[];for(let s of n.split(/\r?\n/)){let o=s.trim().match(/^replace\s+\S+\s+=>\s+(\S+)\s*$/);if(!o)continue;let a=o[1];!a.startsWith(".")&&!Ve.isAbsolute(a)||i.push(a)}return z_(e,r,t,i)}function gv(t,e,r){return[...mv(t,e,r),...hv(t,e,r)]}function fv(t,e,r,n){if(!n.includes("*")){let o=Dn(e,r,t,n);return o?[o]:[]}let i=Dn(e,r,t,Ve.dirname(n));if(!i)return[];let s=Ve.basename(n);try{return vn.readdirSync(i).filter(o=>s==="*"||o.includes(s.slice(0,s.indexOf("*")))).map(o=>Dn(e,r,i,o)).filter(o=>o!==void 0)}catch{return[]}}function mv(t,e,r){let n=J_(t,oe.PACKAGE_JSON);if(n===void 0)return[];let i=n.workspaces,s=Array.isArray(i)?i:typeof i=="object"&&i!==null&&Array.isArray(i.packages)?i.packages:[],o=[];for(let a of s)typeof a=="string"&&o.push(...fv(t,e,r,a));return o}function hv(t,e,r){let n=J_(t,oe.TSCONFIG_JSON);if(n===void 0)return[];let i=[],s=n.references;if(Array.isArray(s))for(let a of s){if(typeof a!="object"||a===null)continue;let l=a.path;if(typeof l!="string")continue;let c=Dn(e,r,t,l);c&&i.push(c)}let o=n.extends;if(typeof o=="string"){let a=Dn(e,r,t,o);a&&i.push(a)}return i}function Ev(t,e,r){let n=[],i=[];try{i=vn.readdirSync(t)}catch{return n}for(let s of i){if(!s.endsWith(".csproj"))continue;let o=Ga(t,s);if(o!==void 0)for(let a of o.matchAll(/<ProjectReference[^>]*Include\s*=\s*"([^"]+)"/g)){let l=a[1].split("\\").join("/"),c=Dn(e,r,t,l);c&&n.push(Ve.dirname(c))}}return n}function Ga(t,e){try{return vn.readFileSync(Ve.join(t,e),"utf8")}catch{return}}function J_(t,e){let r=Ga(t,e);if(r!==void 0)try{let n=JSON.parse(r);return typeof n=="object"&&n!==null&&!Array.isArray(n)?n:void 0}catch{return}}function _v(t,e,r,n){switch(e){case B.RUST:return dv(t,r,n);case B.GO:return pv(t,r,n);case B.TYPESCRIPT:return gv(t,r,n);case B.CSHARP:return Ev(t,r,n);default:return[]}}function Sv(t){let e=new Map(t.map((l,c)=>[l.root,c])),r=new Map,n=new Map;for(let l of t){let c=[...new Set(l.deps.filter(u=>u!==l.root))].filter(u=>e.has(u)).sort();n.set(l.root,c.length);for(let u of c){let p=r.get(u)??[];p.push(l.root),r.set(u,p)}}let i=t.filter(l=>n.get(l.root)===0).map(l=>l.root).sort(),s=[],o=new Set;for(;i.length>0;){let l=i.shift();if(!o.has(l)){o.add(l),s.push(t[e.get(l)]);for(let c of(r.get(l)??[]).sort())o.has(c)||(n.set(c,n.get(c)-1),n.get(c)===0&&i.push(c));i.sort()}}let a=t.filter(l=>!o.has(l.root)).sort((l,c)=>l.root.localeCompare(c.root));return[...s,...a]}function q_(t){let e=Ve.resolve(t.workspaceRoot),r;try{r=vn.realpathSync(e)}catch{r=void 0}let n=lv.find(l=>l.languageId===t.languageId)??null,i=new Map,s=new Map,o=new Map;for(let l of t.files){let c=n?uv(e,l,n,i):e;o.set(l,c);let u=s.get(c);u?u.push(l):s.set(c,[l])}let a=[];for(let[l,c]of s)a.push({root:l,files:c,deps:n&&r?_v(l,t.languageId,e,r):[]});return{groups:Sv(a),fileToProjectRoot:o}}var Tv="LSP file path resolves outside the configured workspace root";function Q_(t,e){let r=On(t,e);if(!r)throw new E(T.FS_PATH_TRAVERSAL,Tv);return r}var Rv=12e4,yv=3e4,Iv=200,Ov=512,Lv=.25,xa=new Set([yr.FUNCTION,yr.METHOD,yr.CONSTRUCTOR,yr.CLASS]),Nv=new Set([yr.CLASS]);function eS(t,e){return e.has(t)}function Ii(t){return t.split("\\").join("/")}var Ba=class extends Error{};function Cv(t){return"location"in t}function Pv(t){return t?t.map(e=>Cv(e)?{name:e.name,kind:e.kind,range:e.location.range,selectionRange:e.location.range}:e):[]}function Qd(t,e){return e.normalizeSymbolName?e.normalizeSymbolName(t):t}function Dv(t,e){let r=e.line>t.start.line||e.line===t.start.line&&e.character>=t.start.character,n=e.line<t.end.line||e.line===t.end.line&&e.character<=t.end.character;return r&&n}function Ua(t,e,r,n){for(let i of t){if(!Dv(i.range,e))continue;let s=eS(i.kind,r)?i.name:n;return(i.children?Ua(i.children,e,r,s):void 0)??{symbol:i,containerName:n}}}function Ha(t,e,r){let n=[];for(let i of t)if(xa.has(i.kind)&&n.push({symbol:i,containerName:r}),i.children){let s=eS(i.kind,e)?i.name:r;n.push(...Ha(i.children,e,s))}return n}var Ge=class{name;config={};logger;createClient;languageConfig;containmentKinds;constructor(e,r,n=()=>new ka){this.languageConfig=e,this.name=e.name,this.logger=r??me(),this.createClient=n,this.containmentKinds=e.containmentSymbolKinds??Nv}configure(e){this.config=e}get requestTimeoutMs(){return this.config.timeoutMs??yv}get maxOpenFiles(){return this.config.maxOpenFiles??Iv}get maxConcurrentFiles(){return this.config.maxConcurrentFiles??1}get maxProcesses(){if(this.config.maxProcesses!==void 0)return this.config.maxProcesses;let e=Math.floor(this.maxProcessMemoryMb()/this.processMemoryEstimateMb());return Math.max(1,Math.min(qd.availableParallelism(),e))}processMemoryEstimateMb(){return this.config.processMemoryEstimateMb??this.languageConfig.processMemoryEstimateMb??Ov}maxProcessMemoryMb(){return this.config.maxProcessMemoryMb!==void 0?this.config.maxProcessMemoryMb:Math.max(Math.round(qd.totalmem()/1024/1024*Lv),this.processMemoryEstimateMb())}effectiveConcurrency(e){let r=this.maxConcurrentFiles,n=Math.max(1,Math.min(r,e,this.maxOpenFiles-1));return n!==r&&this.logger.debug($e.concurrencyClamped(r,n)),n}effectiveProcesses(e){let r=this.maxProcesses,n=Math.floor(this.maxProcessMemoryMb()/this.processMemoryEstimateMb()),i=qd.availableParallelism(),s=Math.max(1,Math.min(r,e,i,n));return s!==r&&(this.logger.debug($e.processShardsClamped(r,s)),s<r&&n<Math.min(r,e,i)&&this.logger.debug($e.processShardsMemoryClamped(r,s,this.maxProcessMemoryMb(),this.processMemoryEstimateMb()))),s}async checkAvailability(e){let r=await this.languageConfig.checkPreflight(e,{binary:this.config.binaryOverride,args:this.config.argsOverride});return r.ready?{available:!0}:{available:!1,reason:r.reason}}async resolveEdges(e){if(e.files.length===0)return{edges:[],filesProcessed:[],filesFailed:[]};let r=this.config.timeoutMs??Rv,n=this.effectiveProcesses(e.files.length);if(n<=1){let o=this.createClient();return this.runBatch(o,e,r)}let i=this.buildProjectShards(e,n),s=await Promise.all(i.map(o=>{let a=this.createClient();return this.runBatch(a,o,r)}));return this.mergeShardOutcomes(s,e.files)}languageIdFor(e){return this.languageConfig.languageIdByExtension[yi.extname(e)]??this.languageConfig.defaultLanguageId}buildProjectShards(e,r){let i=q_({workspaceRoot:e.workspaceRoot,languageId:this.languageConfig.tierBLanguageId,files:e.files}).groups,s=(d,f)=>{let m={};for(let _ of f){let O=e.callsByFile?.[_];O&&(m[_]=O)}return{workspaceRoot:e.workspaceRoot,serverRoot:d,files:f,callsByFile:m}};if(i.length<=r)return i.map(d=>s(d.root,d.files));let o=[...i].sort((d,f)=>d.files.length-f.files.length||d.root.localeCompare(f.root)),a=r-1,l=new Set(o.slice(-a).map(d=>d.root)),c=[],u=[];for(let d of i)l.has(d.root)?c.push(s(d.root,d.files)):u.push(...d.files);let p=[...c];return u.length>0&&p.push(s(e.workspaceRoot,u)),p}mergeShardOutcomes(e,r){let n=[],i=new Set,s=new Map,o=0;for(let u=0;u<e.length;u++){let p=e[u];for(let d of p.edges)n.push(d);for(let d of p.filesProcessed)i.add(d);for(let d of p.filesFailed)s.set(d.file,d);p.unavailableReason&&o++}n.sort((u,p)=>(u.sourceNodeKey+"->"+u.targetNodeKey).localeCompare(p.sourceNodeKey+"->"+p.targetNodeKey));let{filesProcessed:a,filesFailed:l}=this.reorderFiles(r,i,s),c={edges:n,filesProcessed:a,filesFailed:l};return o===e.length&&e.length>0&&(c.unavailableReason=e.find(u=>u.unavailableReason)?.unavailableReason),c}reorderFiles(e,r,n){let i=[],s=[];for(let o of e)r.has(o)?i.push(o):n.has(o)&&s.push(n.get(o));return{filesProcessed:i,filesFailed:s}}async runBatch(e,r,n){let{workspaceRoot:i,files:s,callsByFile:o}=r,a=r.serverRoot??i,l=await this.languageConfig.resolveBinary(i,{binary:this.config.binaryOverride,args:this.config.argsOverride});try{await e.start({command:l.command,args:l.args,cwd:a,env:l.env})}catch(u){return{edges:[],filesProcessed:[],filesFailed:[],unavailableReason:$e.spawnFailed(l.command,u instanceof Error?u.message:String(u))}}try{await this.initializeSession(e,a)}catch(u){let p=u instanceof Error?u.message:String(u);await this.shutdownSession(e);let d=this.languageConfig.unavailableReasonForUnresolvableBinary;return!l.locallyResolved&&d?(this.logger.debug($e.initializeFailed(p)),{edges:[],filesProcessed:[],filesFailed:[],unavailableReason:d}):{edges:[],filesProcessed:[],filesFailed:[],unavailableReason:$e.initializeFailed(p)}}await this.waitForColdStart(e,i,s);let c=n>0?Date.now()+n:void 0;try{return await this.processAllFiles(e,i,s,o,c,n)}finally{await this.shutdownSession(e)}}async settleColdStart(){let e=this.config.coldStartSettleMs??this.languageConfig.coldStartSettleMs??0;e>0&&await new Promise(r=>setTimeout(r,e))}async waitForColdStart(e,r,n){await this.settleColdStart(),(this.config.coldStartSettleMs??this.languageConfig.coldStartSettleMs??0)>0&&await this.waitForServerReady(e,r,n)}async waitForServerReady(e,r,n){let i=this.config.coldStartPollMs??5e3,s=this.config.coldStartMaxWaitMs??12e4,o=Date.now();for(;;){if(await this.probeServerReady(e,r,n)||Date.now()-o>=s)return;await new Promise(c=>setTimeout(c,i))}}async probeServerReady(e,r,n){let s={openFileCache:new Map,inFlightOpens:new Map,pinnedPaths:new Set,usedNodeKeysByFile:new Map};try{let o=!1;for(let a=0;a<Math.min(n.length,12);a++){let l=await this.openAndGetSymbols(e,r,n[a],s),c=Ha(l.symbols,this.containmentKinds);if(c.length===0)continue;if(o=!0,(await Promise.all(c.map(({symbol:p})=>e.request(Yt.REFERENCES,{textDocument:{uri:l.uri},position:p.selectionRange.start,context:{includeDeclaration:!1}},this.requestTimeoutMs)))).some(p=>(p?.length??0)>0))return!0}return o?!1:n.length<=12}finally{for(let o of[...s.openFileCache.values()])this.closeOpenFile(e,o,s.openFileCache)}}async initializeSession(e,r){let n=X_(r).toString();await e.request(Yt.INITIALIZE,{processId:process.pid,rootUri:n,capabilities:{textDocument:{documentSymbol:{hierarchicalDocumentSymbolSupport:!0}}},workspaceFolders:[{uri:n,name:yi.basename(r)}],...this.languageConfig.initializationOptions?{initializationOptions:this.languageConfig.initializationOptions}:{}},this.requestTimeoutMs),e.notify(Yt.INITIALIZED,{})}async shutdownSession(e){try{await e.request(Yt.SHUTDOWN,null,this.requestTimeoutMs),e.notify(Yt.EXIT,{})}catch{}finally{await e.stop()}}async processAllFiles(e,r,n,i,s,o){let a={openFileCache:new Map,inFlightOpens:new Map,pinnedPaths:new Set,usedNodeKeysByFile:new Map},l=new Array(n.length),c=0,u=!1,p=async()=>{for(;;){if(u)return;let C=s!==void 0?s-Date.now():void 0;if(C!==void 0&&C<=0){u=!0;return}let w=c++;if(w>=n.length)return;let L=n[w];a.pinnedPaths.add(L);try{let $=await this.runOneSlot(e,r,L,i,a,C,o);l[w]=$,!$.ok&&$.deadlineExceeded&&(u=!0)}finally{a.pinnedPaths.delete(L)}}},d=this.effectiveConcurrency(n.length);await Promise.allSettled(Array.from({length:d},()=>p()));let f=[],m=new Set,_=[],O=[];for(let C=0;C<n.length;C++){let w=l[C];if(w)if(w.ok){_.push(n[C]);for(let L of w.edges){let $=`${L.sourceNodeKey}->${L.targetNodeKey}`;m.has($)||(m.add($),f.push(L))}}else O.push({file:n[C],reason:w.reason,retryable:w.deadlineExceeded,...w.notApplicable?{notApplicable:!0}:{}})}return u&&this.markUnreachedFilesFailed(n,_,O,o),{edges:f,filesProcessed:_,filesFailed:O,...u?{unavailableReason:$e.batchTimedOut(o)}:{}}}raceAgainstDeadline(e,r){return new Promise((n,i)=>{let s=setTimeout(()=>i(new Ba),r);s.unref?.(),e.then(o=>{clearTimeout(s),n(o)},o=>{clearTimeout(s),i(o)})})}async runOneSlot(e,r,n,i,s,o,a){try{let l=o!==void 0?await this.raceAgainstDeadline(this.processOneFile(e,r,n,i,s),o):await this.processOneFile(e,r,n,i,s);return this.closeAndEvict(e,n,s),{ok:!0,edges:l}}catch(l){if(l instanceof Ba)return{ok:!1,deadlineExceeded:!0,reason:$e.batchTimedOut(a)};let c=l instanceof Error?l.message:String(l),u=this.languageConfig.isNotApplicableFileError?.(c)===!0;return u||this.logger.warn($e.resolutionFailedForFile(n),{error:c}),this.closeAndEvict(e,n,s),{ok:!1,deadlineExceeded:!1,reason:c,...u?{notApplicable:!0}:{}}}}closeOpenFile(e,r,n){n.delete(r.relativePath),e.notify(Yt.DID_CLOSE,{textDocument:{uri:r.uri}})}closeAndEvict(e,r,n){let i=n.openFileCache.get(r);i&&this.closeOpenFile(e,i,n.openFileCache)}markUnreachedFilesFailed(e,r,n,i){let s=new Set([...r,...n.map(o=>o.file)]);for(let o of e)s.has(o)||n.push({file:o,reason:$e.batchTimedOut(i),retryable:!0})}qualifiedContainerName(e){if(!(!this.languageConfig.supportsQualifiedContainment||!e))return Qd(e,this.languageConfig)}resolveNodeKeyForFile(e,r,n,i,s,o){let a=e.usedNodeKeysByFile.get(r);if(!a){a={used:new Set([r]),resolved:new Map},e.usedNodeKeysByFile.set(r,a);let p=[...Ha(n,this.containmentKinds)].sort((d,f)=>d.symbol.selectionRange.start.line-f.symbol.selectionRange.start.line);for(let{symbol:d,containerName:f}of p){let m=`${d.name}@${d.selectionRange.start.line}`;if(a.resolved.has(m))continue;let _=Ln(a.used,Is(r,Qd(d.name,this.languageConfig),this.qualifiedContainerName(f)),d.selectionRange.start.line);a.used.add(_),a.resolved.set(m,_)}}let l=`${i}@${s}`,c=a.resolved.get(l);if(c)return c;let u=Ln(a.used,Is(r,Qd(i,this.languageConfig),this.qualifiedContainerName(o)),s);return a.used.add(u),a.resolved.set(l,u),u}async processOneFile(e,r,n,i,s){let o=i?.[n];return this.languageConfig.definitionResolution==="forward"&&o&&o.length>0?this.processOneFileForward(e,r,n,o,s):this.processOneFileReverse(e,r,n,s)}async processOneFileReverse(e,r,n,i){let s=await this.openAndGetSymbols(e,r,n,i),o=Ha(s.symbols,this.containmentKinds),a=await Promise.all(o.map(({symbol:c})=>e.request(Yt.REFERENCES,{textDocument:{uri:s.uri},position:c.selectionRange.start,context:{includeDeclaration:!1}},this.requestTimeoutMs))),l=[];for(let c=0;c<o.length;c++){let{symbol:u,containerName:p}=o[c],d=a[c]??[],f=Ii(this.resolveNodeKeyForFile(i,n,s.symbols,u.name,u.selectionRange.start.line,p));for(let m of d){let _=await this.resolveReferenceEdge(e,r,m,f,n,i);_&&l.push(_)}}return l}async processOneFileForward(e,r,n,i,s){let o=await this.openAndGetSymbols(e,r,n,s),a=[],l=await Promise.all(i.map(({startLine:c,startColumn:u})=>e.request(Yt.DEFINITION,{textDocument:{uri:o.uri},position:{line:c,character:u}},this.requestTimeoutMs)));for(let c=0;c<i.length;c++){let{startLine:u,startColumn:p}=i[c],d=await this.resolveFirstDefinitionTarget(e,r,n,l[c],s);if(d===void 0)continue;let f=Ua(o.symbols,{line:u,character:p},this.containmentKinds),m=f&&xa.has(f.symbol.kind)?Ii(this.resolveNodeKeyForFile(s,n,o.symbols,f.symbol.name,f.symbol.selectionRange.start.line,f.containerName)):n;m!==d&&a.push({sourceNodeKey:m,targetNodeKey:d,source:dc.LSP})}return a}async resolveFirstDefinitionTarget(e,r,n,i,s){if(!i)return;let o=Array.isArray(i)?i:[i];for(let a=0;a<o.length;a++){let l=await this.resolveTargetNodeKey(e,r,n,o[a],s);if(l!==void 0)return a>0&&this.logger.debug($e.skippedMultiLocationDefinition(n)),l}}async resolveTargetNodeKey(e,r,n,i,s){let o=yi.relative(r,Z_(i.uri));if(yi.isAbsolute(o)||o.startsWith(".."))return;let a=Ii(o);if(a===n)return;let l=await this.openAndGetSymbols(e,r,a,s),c=Ua(l.symbols,i.range.start,this.containmentKinds);return c&&xa.has(c.symbol.kind)?Ii(this.resolveNodeKeyForFile(s,a,l.symbols,c.symbol.name,c.symbol.selectionRange.start.line,c.containerName)):a}async resolveReferenceEdge(e,r,n,i,s,o){let a=yi.relative(r,Z_(n.uri));if(yi.isAbsolute(a)||a.startsWith(".."))return;let l=Ii(a);if(l===s)return;let c=await this.openAndGetSymbols(e,r,l,o),u=Ua(c.symbols,n.range.start,this.containmentKinds);return{sourceNodeKey:u&&xa.has(u.symbol.kind)?Ii(this.resolveNodeKeyForFile(o,l,c.symbols,u.symbol.name,u.symbol.selectionRange.start.line,u.containerName)):l,targetNodeKey:i,source:dc.LSP}}async openAndGetSymbols(e,r,n,i){let s=i.openFileCache,o=s.get(n);if(o)return s.delete(n),s.set(n,o),o;let a=i.inFlightOpens.get(n);if(a)return a;let l=this.doOpenAndGetSymbols(e,r,n,i).finally(()=>i.inFlightOpens.delete(n));return i.inFlightOpens.set(n,l),l}pickEvictionVictim(e){for(let[r,n]of e.openFileCache)if(!e.pinnedPaths.has(r))return n}async doOpenAndGetSymbols(e,r,n,i){for(;i.openFileCache.size+i.inFlightOpens.size>=this.maxOpenFiles;){let p=this.pickEvictionVictim(i);if(!p)break;this.closeOpenFile(e,p,i.openFileCache)}let s=Q_(r,n),o=await Av.readFile(s,H),a=X_(s).toString();e.notify(Yt.DID_OPEN,{textDocument:{uri:a,languageId:this.languageIdFor(n),version:1,text:o}});let l=await e.request(Yt.DOCUMENT_SYMBOL,{textDocument:{uri:a}},this.requestTimeoutMs),c=Pv(l),u={relativePath:n,uri:a,symbols:c};return i.openFileCache.set(n,u),u}};var Ka="typescript",vv={".ts":Ka,".mts":Ka,".cts":Ka,".tsx":"typescriptreact",".js":"javascript",".mjs":"javascript",".cjs":"javascript",".jsx":"javascriptreact"},bv=/(?:^|\r?\n)Could not find source file:\s*['"][^'"\r\n]+['"]\.?\s*(?:\r?\n|$)/i,wv={name:wt.PACKAGE_NAME,tierBLanguageId:B.TYPESCRIPT,languageIdByExtension:vv,defaultLanguageId:Ka,resolveBinary:ba,checkPreflight:Y_,isNotApplicableFileError:t=>bv.test(t),supportsQualifiedContainment:!0,initializationOptions:{maxTsServerMemory:Pa},definitionResolution:"forward",unavailableReasonForUnresolvableBinary:Ai.binaryUnresolvable},$a=class extends Ge{constructor(e,r){super(wv,e,r)}};import Fv from"fs";import Mv from"path";import{execFile as kv}from"child_process";import{promisify as Gv}from"util";var ot={PACKAGE_NAME:"pyright",BINARY_NAME:"pyright-langserver",NPX_COMMAND:"npx",NPX_NO_INSTALL_FLAG:"--no-install",STDIO_ARG:"--stdio",VERSION_FLAG:"--version"},Ds={binaryUnresolvable:"pyright-langserver is not resolvable (no local node_modules/.bin copy and `npx --no-install` cannot find pyright) -- install pyright as a project devDependency (`npm install -D pyright`) to enable LSP-precision cross-file edges for Python",markerFileMissing:"no pyproject.toml/requirements.txt found at the workspace root"};var tS=Gv(kv),rS=5e3,xv=[oe.PYPROJECT_TOML,oe.REQUIREMENTS_TXT];function Uv(t){return xv.some(e=>Fv.existsSync(Mv.join(t,e)))}async function Hv(t){let e=[ot.NPX_NO_INSTALL_FLAG,ot.PACKAGE_NAME,ot.VERSION_FLAG];try{if(Xr(ot.NPX_COMMAND)){let r=await Ri(ot.NPX_COMMAND,e,void 0);await tS(r,[],{cwd:t,timeout:rS,shell:!0})}else await tS(ot.NPX_COMMAND,e,{cwd:t,timeout:rS});return!0}catch{return!1}}async function nS(t,e){let r=Uv(t),i=sr(t,{packageName:ot.PACKAGE_NAME,binaryName:ot.BINARY_NAME,defaultArgs:[ot.STDIO_ARG]},e).locallyResolved?!0:await Hv(t);return r?i?{markerFileResolvable:r,lspBinaryResolvable:i,ready:!0}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:Ds.binaryUnresolvable}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:Ds.markerFileMissing}}var iS="python",Bv={".py":iS},Kv={name:ot.PACKAGE_NAME,tierBLanguageId:B.PYTHON,languageIdByExtension:Bv,defaultLanguageId:iS,resolveBinary:(t,e)=>sr(t,{packageName:ot.PACKAGE_NAME,binaryName:ot.BINARY_NAME,defaultArgs:[ot.STDIO_ARG]},e),checkPreflight:nS,supportsQualifiedContainment:!0,definitionResolution:"reverse",unavailableReasonForUnresolvableBinary:Ds.binaryUnresolvable},Ya=class extends Ge{constructor(e,r){super(Kv,e,r)}};import $v from"fs";import Zd from"path";import Yv from"os";var bn={BINARY_NAME:"gopls",DEFAULT_ARGS:[]};function sS(t){let e=/^\((\*?)([^(]*)\)\.(.+)$/.exec(t);if(!e)return t;let[,,r,n]=e;return`${r}.${n}`}var Xd={binaryUnresolvable:"gopls is not resolvable (not found on PATH, $GOBIN, $GOPATH/bin, or ~/go/bin) -- install gopls to enable LSP-precision cross-file edges for Go",markerFileMissing:"no go.mod found at the workspace root"};function Wv(t){return $v.existsSync(Zd.join(t,oe.GO_MOD))}function jv(t){let e=[];return t.env.GOBIN&&e.push(t.env.GOBIN),t.env.GOPATH&&e.push(Zd.join(t.env.GOPATH,"bin")),e.push(Zd.join(Yv.homedir(),"go","bin")),e}async function oS(t,e,r=or){let n=Wv(t),s=(await Ce({binaryName:bn.BINARY_NAME,defaultArgs:bn.DEFAULT_ARGS,extraCandidateDirs:jv(r)},e)).locallyResolved;return n?s?{markerFileResolvable:n,lspBinaryResolvable:s,ready:!0}:{markerFileResolvable:n,lspBinaryResolvable:s,ready:!1,reason:Xd.binaryUnresolvable}:{markerFileResolvable:n,lspBinaryResolvable:s,ready:!1,reason:Xd.markerFileMissing}}var aS="go",Vv={".go":aS},zv={name:bn.BINARY_NAME,tierBLanguageId:B.GO,languageIdByExtension:Vv,defaultLanguageId:aS,resolveBinary:(t,e)=>Ce({binaryName:bn.BINARY_NAME,defaultArgs:bn.DEFAULT_ARGS},e),checkPreflight:oS,supportsQualifiedContainment:!1,normalizeSymbolName:sS,definitionResolution:"reverse"},Wa=class extends Ge{constructor(e,r){super(zv,e,r)}};import tb from"path";import rb from"os";import Jv from"fs";import ep from"path";import qv from"os";var Zr={BINARY_NAME:"rust-analyzer",DEFAULT_ARGS:[]},ja={binaryUnresolvable:"rust-analyzer is not resolvable (not found on PATH, $CARGO_HOME/bin, or ~/.cargo/bin) -- install rust-analyzer to enable LSP-precision cross-file edges for Rust",binaryNotSpawnable:"rust-analyzer resolves on PATH but cannot be spawned -- usually a rustup proxy for a component that isn't installed; run `rustup component add rust-analyzer` (or install rust-analyzer) to enable LSP-precision cross-file edges for Rust",markerFileMissing:"no Cargo.toml found at the workspace root"};function lS(t){return t.startsWith("impl ")?t.slice(5):t}function Qv(t){return Jv.existsSync(ep.join(t,oe.CARGO_TOML))}function Xv(t){return ep.join(t.env.CARGO_HOME??ep.join(qv.homedir(),".cargo"),"bin")}var Zv=5e3;async function eb(t,e){return H_(t,Zv,e)}async function cS(t,e,r=or){let n=Qv(t),i=await Ce({binaryName:Zr.BINARY_NAME,defaultArgs:Zr.DEFAULT_ARGS,extraCandidateDirs:[Xv(r)]},e),s=i.locallyResolved,o=!s||await eb(i.command,i.fromUserOverride?void 0:[Zr.BINARY_NAME]);return n?s?o?{markerFileResolvable:n,lspBinaryResolvable:s,lspBinarySpawnable:o,ready:!0}:{markerFileResolvable:n,lspBinaryResolvable:s,lspBinarySpawnable:o,ready:!1,reason:ja.binaryNotSpawnable}:{markerFileResolvable:n,lspBinaryResolvable:s,lspBinarySpawnable:o,ready:!1,reason:ja.binaryUnresolvable}:{markerFileResolvable:n,lspBinaryResolvable:s,lspBinarySpawnable:o,ready:!1,reason:ja.markerFileMissing}}var uS="rust",nb={".rs":uS};function ib(){return tb.join(rb.homedir(),".cargo","bin")}var sb={name:Zr.BINARY_NAME,tierBLanguageId:B.RUST,languageIdByExtension:nb,defaultLanguageId:uS,resolveBinary:(t,e)=>Ce({binaryName:Zr.BINARY_NAME,defaultArgs:Zr.DEFAULT_ARGS,extraCandidateDirs:[ib()]},e),checkPreflight:cS,supportsQualifiedContainment:!0,containmentSymbolKinds:new Set([yr.CLASS,yr.OBJECT]),normalizeSymbolName:lS,definitionResolution:"reverse",coldStartSettleMs:8e3,processMemoryEstimateMb:2048},Va=class extends Ge{constructor(e,r){super(sb,e,r)}};import ob from"fs";import dS from"path";var wn={BINARY_NAME:"clangd",DEFAULT_ARGS:[]},tp={binaryUnresolvable:"clangd is not resolvable (not found on PATH or common LLVM install locations) -- install clangd to enable LSP-precision cross-file edges for C/C++",markerFileMissing:"no compile_commands.json/CMakeLists.txt found at the workspace root"};var ab=["compile_commands.json","CMakeLists.txt"];function lb(t){return ab.some(e=>ob.existsSync(dS.join(t,e)))}function cb(t){return t.platform===br?[dS.join(t.env.ProgramFiles??"C:\\Program Files","LLVM","bin")]:t.platform==="darwin"?["/opt/homebrew/opt/llvm/bin","/usr/local/opt/llvm/bin"]:["/usr/lib/llvm/bin","/usr/local/bin"]}async function pS(t,e,r=or){let n=lb(t),s=(await Ce({binaryName:wn.BINARY_NAME,defaultArgs:wn.DEFAULT_ARGS,extraCandidateDirs:cb(r)},e)).locallyResolved;return n?s?{markerFileResolvable:n,lspBinaryResolvable:s,ready:!0}:{markerFileResolvable:n,lspBinaryResolvable:s,ready:!1,reason:tp.binaryUnresolvable}:{markerFileResolvable:n,lspBinaryResolvable:s,ready:!1,reason:tp.markerFileMissing}}var Ir="cpp",ub={".c":"c",".h":"c",".cpp":Ir,".cxx":Ir,".cc":Ir,".hpp":Ir,".hxx":Ir,".hh":Ir,".cu":Ir,".cuh":Ir},db={name:wn.BINARY_NAME,tierBLanguageId:B.CPP,languageIdByExtension:ub,defaultLanguageId:Ir,resolveBinary:(t,e)=>Ce({binaryName:wn.BINARY_NAME,defaultArgs:wn.DEFAULT_ARGS},e),checkPreflight:pS,supportsQualifiedContainment:!1,definitionResolution:"reverse"},za=class extends Ge{constructor(e,r){super(db,e,r)}};import pb from"fs";import Ja from"path";import gS from"os";var Fn={BINARY_NAME:"jdtls",DEFAULT_ARGS:[]},rp={binaryUnresolvable:"jdtls is not resolvable (not found on PATH or common install locations) -- install jdtls to enable LSP-precision cross-file edges for Java",markerFileMissing:"no pom.xml/build.gradle found at the workspace root"};var gb=["pom.xml","build.gradle"];function fb(t){return gb.some(e=>pb.existsSync(Ja.join(t,e)))}function mb(t){return t.platform===br?[Ja.join(gS.homedir(),"scoop","shims"),Ja.join(t.env.ChocolateyInstall??"C:\\ProgramData\\chocolatey","bin")]:t.platform==="darwin"?["/opt/homebrew/bin","/usr/local/bin"]:["/usr/local/bin","/usr/bin",Ja.join(gS.homedir(),".local","share","jdtls","bin")]}async function fS(t,e,r=or){let n=fb(t),s=(await Ce({binaryName:Fn.BINARY_NAME,defaultArgs:Fn.DEFAULT_ARGS,extraCandidateDirs:mb(r)},e)).locallyResolved;return n?s?{markerFileResolvable:n,lspBinaryResolvable:s,ready:!0}:{markerFileResolvable:n,lspBinaryResolvable:s,ready:!1,reason:rp.binaryUnresolvable}:{markerFileResolvable:n,lspBinaryResolvable:s,ready:!1,reason:rp.markerFileMissing}}var mS="java",hb={".java":mS},Eb={name:Fn.BINARY_NAME,tierBLanguageId:B.JAVA,languageIdByExtension:hb,defaultLanguageId:mS,resolveBinary:(t,e)=>Ce({binaryName:Fn.BINARY_NAME,defaultArgs:Fn.DEFAULT_ARGS},e),checkPreflight:fS,supportsQualifiedContainment:!0,definitionResolution:"reverse"},qa=class extends Ge{constructor(e,r){super(Eb,e,r)}};import _b from"fs";import Sb from"path";import Tb from"os";var Mn={BINARY_NAME:"csharp-ls",DEFAULT_ARGS:[]},np={binaryUnresolvable:"csharp-ls is not resolvable (not found on PATH or ~/.dotnet/tools) -- install it with `dotnet tool install --global csharp-ls` to enable LSP-precision cross-file edges for C#",markerFileMissing:"no solution (.sln/.slnx) or project file (*.csproj) found at the workspace root"};function Ab(){return Sb.join(Tb.homedir(),".dotnet","tools")}function Rb(t){try{return _b.readdirSync(t).some(r=>r.endsWith(".sln")||r.endsWith(".slnx")||r.endsWith(".csproj"))}catch{return!1}}async function hS(t,e){let r=Rb(t),i=(await Ce({binaryName:Mn.BINARY_NAME,defaultArgs:Mn.DEFAULT_ARGS,extraCandidateDirs:[Ab()]},e)).locallyResolved;return r?i?{markerFileResolvable:r,lspBinaryResolvable:i,ready:!0}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:np.binaryUnresolvable}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:np.markerFileMissing}}var ES="csharp",yb={".cs":ES},Ib={name:Mn.BINARY_NAME,tierBLanguageId:B.CSHARP,languageIdByExtension:yb,defaultLanguageId:ES,resolveBinary:(t,e)=>Ce({binaryName:Mn.BINARY_NAME,defaultArgs:Mn.DEFAULT_ARGS},e),checkPreflight:hS,supportsQualifiedContainment:!0,definitionResolution:"reverse"},Qa=class extends Ge{constructor(e,r){super(Ib,e,r)}};import Ob from"fs";import Lb from"path";import{execFile as Nb}from"child_process";import{promisify as Cb}from"util";var Ot={PACKAGE_NAME:"intelephense",NPX_COMMAND:"npx",NPX_NO_INSTALL_FLAG:"--no-install",STDIO_ARG:"--stdio",VERSION_FLAG:"--version"},vs={binaryUnresolvable:"intelephense is not resolvable (no local node_modules/.bin copy and `npx --no-install` cannot find intelephense) -- install intelephense as a project devDependency (`npm install -D intelephense`) to enable LSP-precision cross-file edges for PHP",markerFileMissing:"no composer.json found at the workspace root"};var _S=Cb(Nb),SS=5e3;function Pb(t){return Ob.existsSync(Lb.join(t,"composer.json"))}async function Db(t){let e=[Ot.NPX_NO_INSTALL_FLAG,Ot.PACKAGE_NAME,Ot.VERSION_FLAG];try{if(Xr(Ot.NPX_COMMAND)){let r=await Ri(Ot.NPX_COMMAND,e,void 0);await _S(r,[],{cwd:t,timeout:SS,shell:!0})}else await _S(Ot.NPX_COMMAND,e,{cwd:t,timeout:SS});return!0}catch{return!1}}async function TS(t,e){let r=Pb(t),i=sr(t,{packageName:Ot.PACKAGE_NAME,defaultArgs:[Ot.STDIO_ARG]},e).locallyResolved?!0:await Db(t);return r?i?{markerFileResolvable:r,lspBinaryResolvable:i,ready:!0}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:vs.binaryUnresolvable}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:vs.markerFileMissing}}var kn="php",vb={".php":kn,".phtml":kn,".php3":kn,".php4":kn,".php5":kn,".phps":kn},bb={name:Ot.PACKAGE_NAME,tierBLanguageId:B.PHP,languageIdByExtension:vb,defaultLanguageId:kn,resolveBinary:(t,e)=>sr(t,{packageName:Ot.PACKAGE_NAME,defaultArgs:[Ot.STDIO_ARG]},e),checkPreflight:TS,supportsQualifiedContainment:!0,definitionResolution:"reverse",unavailableReasonForUnresolvableBinary:vs.binaryUnresolvable},Xa=class extends Ge{constructor(e,r){super(bb,e,r)}};import wb from"fs";import sp from"path";import Fb from"os";var Gn={BINARY_NAME:"ruby-lsp",DEFAULT_ARGS:[]},ip={binaryUnresolvable:"ruby-lsp is not resolvable (not found on PATH, ~/.rbenv/shims, or ~/.rvm/bin) -- install ruby-lsp to enable LSP-precision cross-file edges for Ruby",markerFileMissing:"no Gemfile or Gemfile.lock found at the workspace root"};var Mb=["Gemfile","Gemfile.lock"];function kb(t){return Mb.some(e=>wb.existsSync(sp.join(t,e)))}function Gb(){if(process.platform==="win32")return[];let t=Fb.homedir();return[sp.join(t,".rbenv","shims"),sp.join(t,".rvm","bin")]}async function AS(t,e){let r=kb(t),i=(await Ce({binaryName:Gn.BINARY_NAME,defaultArgs:Gn.DEFAULT_ARGS,extraCandidateDirs:Gb()},e)).locallyResolved;return r?i?{markerFileResolvable:r,lspBinaryResolvable:i,ready:!0}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:ip.binaryUnresolvable}:{markerFileResolvable:r,lspBinaryResolvable:i,ready:!1,reason:ip.markerFileMissing}}var Za="ruby",xb={".rb":Za,".rake":Za,".gemspec":Za},Ub={name:Gn.BINARY_NAME,tierBLanguageId:B.RUBY,languageIdByExtension:xb,defaultLanguageId:Za,resolveBinary:(t,e)=>Ce({binaryName:Gn.BINARY_NAME,defaultArgs:Gn.DEFAULT_ARGS},e),checkPreflight:AS,supportsQualifiedContainment:!0,definitionResolution:"reverse"},el=class extends Ge{constructor(e,r){super(Ub,e,r)}};function Hb(t){return t===null?!0:typeof t=="number"?Number.isFinite(t):typeof t=="string"||typeof t=="boolean"}function RS(t,e=[]){return!st(t)||!yt(t,["text",...e],["attributes"])||typeof t.text!="string"?!1:Object.hasOwn(t,"attributes")?st(t.attributes)&&Reflect.ownKeys(t.attributes).every(r=>typeof r=="string"&&Hb(t.attributes[r])):!0}function Bb(t){return!RS(t,["id","kind"])||!qe(t.id)?!1:Object.values(dn).some(e=>e===t.kind)}function Kb(t,e){if(!Array.from(t).every(Bb))return!1;let r=t,n=i=>r.filter(s=>s.kind===i).length;return new Set(r.map(i=>i.id)).size!==r.length||n(dn.UNKNOWN)!==1||n(dn.VERIFY)>1?!1:e!==pc.NEEDS_VERIFICATION||n(dn.CANDIDATE)===0&&n(dn.VERIFY)===1}function $b(t){if(t.length>Wn.MAX_OPTIONS)throw new E(T.SEMANTIC_INPUT_LIMIT_EXCEEDED,"Semantic option limit exceeded");if(!Er(t))throw new E(T.SEMANTIC_INVALID_REQUEST,"Semantic options must be a dense data array");if(t.filter(r=>st(r)&&r.kind===dn.CANDIDATE).length>Wn.MAX_CANDIDATES)throw new E(T.SEMANTIC_INPUT_LIMIT_EXCEEDED,"Semantic option limit exceeded")}function Yb(t){return!st(t)||!yt(t,[...cs,"task","language","relation","context","options"])||!bc(t)||!qe(t.language)||!qe(t.relation)||!Object.values(pc).some(e=>e===t.task)?!1:RS(t.context)&&Array.isArray(t.options)&&Kb(t.options,t.task)}function yS(t){if(st(t)&&Array.isArray(t.options)&&$b(t.options),!Yb(t))throw new E(T.SEMANTIC_INVALID_REQUEST,"Invalid semantic decision request");let e=JSON.stringify(t);if(Buffer.byteLength(e,"utf8")>Wn.MAX_INPUT_BYTES)throw new E(T.SEMANTIC_INPUT_LIMIT_EXCEEDED,"Semantic request UTF-8 byte limit exceeded");return JSON.parse(e)}function Wb(t){let e=["provider","modelId","modelVersion","artifactHash"];return st(t)&&yt(t,e)&&e.every(r=>qe(t[r]))}function jb(t){return t.scoreKind===gc.RAW?t.calibrationVersion===null:t.scoreKind===gc.CALIBRATED&&qe(t.calibrationVersion)}function Vb(t,e){return st(t)&&yt(t,["optionId","probability"])&&t.optionId===e&&Lf(t.probability)}function zb(t,e){if(!yt(e,[...cs,"status","scores","model","scoreKind","calibrationVersion"])||!Wb(e.model)||!jb(e))return!1;let r=e.scores;return Array.isArray(r)&&r.length===t.options.length&&Er(r)&&t.options.every((n,i)=>Vb(r[i],n.id))}function Jb(t){return yt(t,[...cs,"status","scores","unavailableCode","unavailableReason"])?Array.isArray(t.scores)&&t.scores.length===0&&Er(t.scores)&&qe(t.unavailableReason)&&Object.values(Js).some(e=>e===t.unavailableCode):!1}function qb(t,e){return!st(e)||!Nf(t,e)?!1:e.status===Wi.SCORED?zb(t,e):e.status===Wi.UNAVAILABLE&&Jb(e)}function IS(t,e){if(!qb(t,e))throw new E(T.SEMANTIC_INVALID_RESPONSE,"Invalid semantic decision response");return JSON.parse(JSON.stringify(e))}var tl=class{validateRequest(e){return yS(e)}validateOutcome(e,r){return IS(this.validateRequest(e),r)}};import Oi from"fs/promises";var Qb={maxWaitMs:1e4,retryIntervalMs:100,heartbeatIntervalMs:1e4,staleAfterMs:3e4};function Xb(t){return new Promise(e=>setTimeout(e,t))}function Zb(t){try{return process.kill(t,0),!0}catch(e){return e.code===fn}}async function ew(t){try{let e=Number.parseInt(await Oi.readFile(t,H),10);return Number.isFinite(e)?e:void 0}catch{return}}async function tw(t,e){let r=await Oi.stat(t).catch(()=>{});if(!r||Date.now()-r.mtimeMs<=e)return!1;let n=await ew(t);return n!==void 0&&Zb(n)?!1:(await Oi.rm(t,{force:!0}).catch(()=>{}),!0)}function rw(t){let e=t.code;return e===zn||e===fn||e===Jn||e===qn}async function nw(t){try{let e=await Oi.open(t,"wx");return await e.writeFile(String(process.pid)),await e.close(),!0}catch(e){if(!rw(e))throw e;return!1}}async function OS(t,e={}){let r={...Qb,...e},n=Date.now()+r.maxWaitMs,i=!1;for(;!await nw(t);)if(i||(i=!0,e.onWaiting?.()),!await tw(t,r.staleAfterMs)){if(Date.now()>n)throw new eo(t);await Xb(r.retryIntervalMs)}let s=setInterval(()=>{let a=new Date;Oi.utimes(t,a,a).catch(()=>{})},r.heartbeatIntervalMs);s.unref?.();let o=!1;return{async release(){o||(o=!0,clearInterval(s),await Oi.rm(t,{force:!0}).catch(()=>{}))}}}function iw(t=y,e={}){let r=e.createAstWorkerPool??(()=>new ua);t.register(A.KnowledgeGitService,(i,s)=>new Ao(i.resolve(A.GitProvider),s?.logger,s?.gitNetworkTimeoutMs)),t.register(A.FileDiscovery,(i,s)=>new ia(i.resolve(A.GitProvider),s?.logger)),t.register(A.ConfigScanner,(i,s)=>new oa(s?.logger)),t.register(A.VcsScanner,(i,s)=>new la(i.resolve(A.GitProvider),s?.logger));let n;t.register(A.AstProcessor,(i,s)=>(n??=r(),new da(n,s?.logger))),t.register(A.GraphPersister,()=>new _a),t.register(A.TempFileManager,()=>(i,s)=>new Ta(i,s)),t.register(A.ProcessLock,()=>OS),t.register(A.SemanticCorpusService,()=>new To),t.register(A.SemanticDecisionValidator,()=>new tl),t.register(A.QueryService,(i,s)=>new Ra(s?.logger)),t.register(A.TierBCoverageHintProvider,()=>({resolve:qi})),t.register(A.ImpactService,(i,s)=>new Ia(s?.logger)),t.register(A.ChangeDetectionService,(i,s)=>new yo(i.resolve(A.ImpactService,s),s?.logger)),t.register(A.TopologyBuilder,()=>new Oa),t.register(A.SnapshotRenderer,()=>new Ro),t.register(A.HydrationService,(i,s)=>new Io(i.resolve(A.GitProvider),s?.logger)),t.register(A.SemanticDiffAnalyzer,(i,s)=>new Na(s?.logger)),t.register(A.EdgeResolutionProviders,(i,s)=>({typescript:()=>new $a(s?.logger),python:()=>new Ya(s?.logger),go:()=>new Wa(s?.logger),rust:()=>new Va(s?.logger),cpp:()=>new za(s?.logger),java:()=>new qa(s?.logger),csharp:()=>new Qa(s?.logger),php:()=>new Xa(s?.logger),ruby:()=>new el(s?.logger)}))}iw();var en={METHOD_POST:"POST",HEADER_AUTHORIZATION:"Authorization",HEADER_CONTENT_TYPE:"Content-Type",CONTENT_TYPE_JSON:"application/json",bearerAuth:t=>`Bearer ${t}`};var ar={CLIENT_USED_BEFORE_INITIALIZE:"FetchRemoteSyncClient used before initialize() was called",FETCH_L2_NODES_FAILED:"Failed to fetch remote L2 nodes",fetchL2NodesFailedWithReason:t=>`Failed to fetch remote L2 nodes: ${t}`,FETCH_L2_NODES_INVALID_JSON:"Failed to fetch remote L2 nodes: response body was not valid JSON",FETCH_L2_NODES_INVALID_RESPONSE:"Failed to fetch remote L2 nodes: response body did not match the remote-node contract",SYNC_PUSH_FAILED:"Sync push failed",syncPushFailedWithReason:t=>`Sync push failed: ${t}`,SYNC_PUSH_INVALID_JSON:"Sync push failed: response body was not valid JSON",SYNC_PUSH_INVALID_RESPONSE:"Sync push failed: response body did not match the sync-push contract"};var op={l2Nodes:t=>`/projects/${t}/l2-nodes`,SYNC_PUSH:"/sync/push"};function LS(t,e){if(typeof t!="object"||t===null||Array.isArray(t))throw new TypeError(`${e} must be an object`);return t}function NS(t,e){if(typeof t!="number"||!Number.isFinite(t))throw new TypeError(`${e} must be a finite number`);return t}function CS(t){if(!Array.isArray(t))throw new TypeError("response must be an array");for(let[e,r]of t.entries()){let n=LS(r,`response[${e}]`);if(NS(n.id,`response[${e}].id`),typeof n.name!="string")throw new TypeError(`response[${e}].name must be a string`)}return t}function PS(t){let e=LS(t,"response");if(typeof e.success!="boolean")throw new TypeError("response.success must be a boolean");return NS(e.processed,"response.processed"),t}var DS=3e4,bs=class{config;initialize(e){this.config=e}getConfig(){if(!this.config)throw new E(T.SYNC_FETCH_FAILED,ar.CLIENT_USED_BEFORE_INITIALIZE);return this.config}async parseErrorBody(e){try{return(await e.json()).error??e.statusText}catch{return e.statusText}}async fetchRemoteL2Nodes(e){let{apiUrl:r,pat:n}=this.getConfig(),i;try{i=await fetch(`${r}${op.l2Nodes(e)}`,{headers:{[en.HEADER_AUTHORIZATION]:en.bearerAuth(n)},signal:AbortSignal.timeout(DS)})}catch(o){throw E.wrap(T.SYNC_FETCH_FAILED,ar.FETCH_L2_NODES_FAILED,o)}if(!i.ok){let o=await this.parseErrorBody(i);throw new E(T.SYNC_FETCH_FAILED,ar.fetchL2NodesFailedWithReason(o))}let s;try{s=await i.json()}catch(o){throw E.wrap(T.SYNC_FETCH_FAILED,ar.FETCH_L2_NODES_INVALID_JSON,o)}try{return CS(s)}catch(o){throw E.wrap(T.SYNC_FETCH_FAILED,ar.FETCH_L2_NODES_INVALID_RESPONSE,o)}}async pushSyncEvents(e,r){let{apiUrl:n,pat:i}=this.getConfig(),s;try{s=await fetch(`${n}${op.SYNC_PUSH}`,{method:en.METHOD_POST,headers:{[en.HEADER_CONTENT_TYPE]:en.CONTENT_TYPE_JSON,[en.HEADER_AUTHORIZATION]:en.bearerAuth(i)},body:JSON.stringify({projectId:Number(e),events:r}),signal:AbortSignal.timeout(DS)})}catch(a){throw E.wrap(T.SYNC_PUSH_FAILED,ar.SYNC_PUSH_FAILED,a)}if(!s.ok){let a=await this.parseErrorBody(s);throw new E(T.SYNC_PUSH_FAILED,ar.syncPushFailedWithReason(a))}let o;try{o=await s.json()}catch(a){throw E.wrap(T.SYNC_PUSH_FAILED,ar.SYNC_PUSH_INVALID_JSON,a)}try{return PS(o)}catch(a){throw E.wrap(T.SYNC_PUSH_FAILED,ar.SYNC_PUSH_INVALID_RESPONSE,a)}}};y.register(A.RemoteSyncClient,()=>()=>new bs);var at={METHOD_POST:"POST",METHOD_GET:"GET",HEADER_CONTENT_TYPE:"Content-Type",HEADER_AUTHORIZATION:"Authorization",CONTENT_TYPE_JSON:"application/json",CONTENT_TYPE_EVENT_STREAM:"text/event-stream",SSE_DATA_PREFIX:"data: ",SSE_DONE_SENTINEL:"[DONE]",SSE_BLOCK_SEPARATOR:`
|
|
150
150
|
|
|
151
151
|
`,bearerAuth:t=>`Bearer ${t}`};var lt={CLIENT_USED_BEFORE_INITIALIZE:"FetchLlmClient used before initialize() was called",CHAT_COMPLETION_FAILED:"Chat completion failed",chatCompletionFailedWithReason:t=>`Chat completion failed: ${t}`,CHAT_COMPLETION_INVALID_JSON:"Chat completion failed: response body was not valid JSON",CHAT_COMPLETION_INVALID_RESPONSE:"Chat completion failed: response body did not match the chat-completion contract",CHAT_COMPLETION_STREAM_FAILED:"Chat completion stream failed",chatCompletionStreamFailedWithReason:t=>`Chat completion stream failed: ${t}`,CHAT_COMPLETION_STREAM_INVALID_JSON:"Chat completion stream failed: chunk was not valid JSON",CHAT_COMPLETION_STREAM_INVALID_RESPONSE:"Chat completion stream failed: chunk did not match the chat-completion contract",AVAILABILITY_CHECK_FAILED:"Reachability check failed",availabilityCheckFailedWithReason:t=>`Reachability check failed: ${t}`,BRIDGE_PROBE_FAILED:"Tier C bridge probe failed",bridgeProbeFailedWithReason:t=>`Tier C bridge probe failed: ${t}`,bridgeProbeRejectedWithReason:(t,e)=>`Tier C bridge rejected the probe (HTTP ${t}): ${e}`};var vS={CHAT_COMPLETIONS:"/v1/chat/completions"};var sw=new Set(Object.values(Xt));function tn(t,e){if(typeof t!="object"||t===null||Array.isArray(t))throw new TypeError(`${e} must be an object`);return t}function ap(t,e){if(!Array.isArray(t))throw new TypeError(`${e} must be an array`);return t}function Ft(t,e){if(typeof t!="string")throw new TypeError(`${e} must be a string`);return t}function bS(t,e){if(typeof t!="number"||!Number.isFinite(t))throw new TypeError(`${e} must be a finite number`);return t}function lp(t,e){return t===null?null:Ft(t,e)}function wS(t,e){let r=Ft(t,e);if(!sw.has(r))throw new TypeError(`${e} must be a supported chat role`);return r}function FS(t,e){for(let[r,n]of ap(t,e).entries()){let i=tn(n,`${e}[${r}]`);if(Ft(i.id,`${e}[${r}].id`),i.type!==fc)throw new TypeError(`${e}[${r}].type must be ${fc}`);let s=tn(i.function,`${e}[${r}].function`);Ft(s.name,`${e}[${r}].function.name`),Ft(s.arguments,`${e}[${r}].function.arguments`)}}function ow(t,e){let r=tn(t,e);wS(r.role,`${e}.role`),lp(r.content,`${e}.content`),r.name!==void 0&&Ft(r.name,`${e}.name`),r.tool_call_id!==void 0&&Ft(r.tool_call_id,`${e}.tool_call_id`),r.tool_calls!==void 0&&FS(r.tool_calls,`${e}.tool_calls`)}function MS(t){let e=tn(t,"response");Ft(e.id,"response.id"),Ft(e.model,"response.model");for(let[r,n]of ap(e.choices,"response.choices").entries()){let i=tn(n,`response.choices[${r}]`);bS(i.index,`response.choices[${r}].index`),ow(i.message,`response.choices[${r}].message`),lp(i.finish_reason,`response.choices[${r}].finish_reason`)}return t}function kS(t){let e=tn(t,"chunk");Ft(e.id,"chunk.id"),Ft(e.model,"chunk.model");for(let[r,n]of ap(e.choices,"chunk.choices").entries()){let i=tn(n,`chunk.choices[${r}]`);bS(i.index,`chunk.choices[${r}].index`);let s=tn(i.delta,`chunk.choices[${r}].delta`);s.role!==void 0&&wS(s.role,`chunk.choices[${r}].delta.role`),s.content!==void 0&&Ft(s.content,`chunk.choices[${r}].delta.content`),s.tool_calls!==void 0&&FS(s.tool_calls,`chunk.choices[${r}].delta.tool_calls`),lp(i.finish_reason,`chunk.choices[${r}].finish_reason`)}return t}var xS=3e4,GS=4e3,ws=class{config;initialize(e){this.config=e}getConfig(){if(!this.config)throw new E(T.LLM_NOT_INITIALIZED,lt.CLIENT_USED_BEFORE_INITIALIZE);return this.config}async parseErrorBody(e){try{return(await e.json()).error??e.statusText}catch{return e.statusText}}buildCompletionsUrl(e){let r=e.endsWith("/")?e.slice(0,-1):e;return`${r.endsWith("/v1")?r.slice(0,-3):r}${vS.CHAT_COMPLETIONS}`}buildHeaders(e,r){let n={[at.HEADER_CONTENT_TYPE]:at.CONTENT_TYPE_JSON};return r&&(n.Accept=r),e.apiKey&&(n[at.HEADER_AUTHORIZATION]=at.bearerAuth(e.apiKey)),n}toWireToolCalls(e){if(e)return e.map(r=>({id:r.id,type:r.type,function:r.function}))}toWireMessage(e){return{role:e.role,content:e.content,...e.name!==void 0?{name:e.name}:{},...e.toolCallId!==void 0?{tool_call_id:e.toolCallId}:{},...e.toolCalls!==void 0?{tool_calls:this.toWireToolCalls(e.toolCalls)}:{}}}buildRequestBody(e,r){return{model:e.model,messages:e.messages.map(n=>this.toWireMessage(n)),...e.tools!==void 0?{tools:e.tools}:{},...e.toolChoice!==void 0?{tool_choice:e.toolChoice}:{},...e.temperature!==void 0?{temperature:e.temperature}:{},...e.maxTokens!==void 0?{max_tokens:e.maxTokens}:{},stream:r}}fromWireToolCalls(e){if(e)return e.map(r=>({id:r.id,type:r.type,function:r.function}))}fromWireMessage(e){return{role:e.role,content:e.content,...e.name!==void 0?{name:e.name}:{},...e.tool_call_id!==void 0?{toolCallId:e.tool_call_id}:{},...e.tool_calls!==void 0?{toolCalls:this.fromWireToolCalls(e.tool_calls)}:{}}}fromWireResult(e){return{id:e.id,model:e.model,choices:e.choices.map(r=>({index:r.index,message:this.fromWireMessage(r.message),finishReason:r.finish_reason}))}}fromWireChunk(e){return{id:e.id,model:e.model,choices:e.choices.map(r=>({index:r.index,delta:{...r.delta.role!==void 0?{role:r.delta.role}:{},...r.delta.content!==void 0?{content:r.delta.content}:{},...r.delta.tool_calls!==void 0?{toolCalls:this.fromWireToolCalls(r.delta.tool_calls)}:{}},finishReason:r.finish_reason}))}}async checkAvailability(){try{let e=this.getConfig();return await fetch(e.baseUrl,{method:at.METHOD_GET,signal:AbortSignal.timeout(GS)}),{available:!0}}catch(e){let r=e instanceof Error?e.message:String(e);return{available:!1,reason:lt.availabilityCheckFailedWithReason(r)}}}async checkBridgeReachability(e){try{let r=this.getConfig(),n=await fetch(this.buildCompletionsUrl(r.baseUrl),{method:at.METHOD_POST,headers:this.buildHeaders(r),body:JSON.stringify({model:e,messages:[{role:Xt.USER,content:"ping"}],max_tokens:1,stream:!1}),signal:AbortSignal.timeout(GS)});if(!n.ok){let i=await this.parseErrorBody(n);return{available:!1,reason:lt.bridgeProbeRejectedWithReason(n.status,i)}}return{available:!0}}catch(r){let n=r instanceof Error?r.message:String(r);return{available:!1,reason:lt.bridgeProbeFailedWithReason(n)}}}async chatCompletion(e){let r=this.getConfig(),n;try{n=await fetch(this.buildCompletionsUrl(r.baseUrl),{method:at.METHOD_POST,headers:this.buildHeaders(r),body:JSON.stringify(this.buildRequestBody(e,!1)),signal:AbortSignal.timeout(xS)})}catch(s){throw E.wrap(T.LLM_CHAT_COMPLETION_FAILED,lt.CHAT_COMPLETION_FAILED,s)}if(!n.ok){let s=await this.parseErrorBody(n);throw n.status===429?new E(T.LLM_RATE_LIMITED,lt.chatCompletionFailedWithReason(s)):n.status===401||n.status===403?new E(T.LLM_AUTH_FAILED,lt.chatCompletionFailedWithReason(s)):new E(T.LLM_HTTP_FAILED,lt.chatCompletionFailedWithReason(s))}let i;try{i=await n.json()}catch(s){throw E.wrap(T.LLM_INVALID_RESPONSE,lt.CHAT_COMPLETION_INVALID_JSON,s)}try{return this.fromWireResult(MS(i))}catch(s){throw E.wrap(T.LLM_INVALID_RESPONSE,lt.CHAT_COMPLETION_INVALID_RESPONSE,s)}}streamChatCompletion(e){let r=this.getConfig(),n=this.buildHeaders(r,at.CONTENT_TYPE_EVENT_STREAM),i=JSON.stringify(this.buildRequestBody(e,!0)),s=this.buildCompletionsUrl(r.baseUrl),o=this.parseErrorBody.bind(this),a=this.fromWireChunk.bind(this);async function*l(){let c=await aw(s,n,i,o);if(!c.body)return;let u=c.body.getReader(),p=new TextDecoder,d="";for(;;){let{done:f,value:m}=await u.read();if(f)break;d+=p.decode(m,{stream:!0});let _;for(;(_=d.indexOf(at.SSE_BLOCK_SEPARATOR))!==-1;){let O=d.slice(0,_);d=d.slice(_+at.SSE_BLOCK_SEPARATOR.length);let C=lw(O,a);if(C.kind==="done")return;C.kind==="chunk"&&(yield C.chunk)}}}return l()}};async function aw(t,e,r,n){let i;try{i=await fetch(t,{method:at.METHOD_POST,headers:e,body:r,signal:AbortSignal.timeout(xS)})}catch(s){throw E.wrap(T.LLM_CHAT_COMPLETION_FAILED,lt.CHAT_COMPLETION_STREAM_FAILED,s)}if(!i.ok){let s=await n(i);throw new E(T.LLM_CHAT_COMPLETION_FAILED,lt.chatCompletionStreamFailedWithReason(s))}return i}function lw(t,e){let r=t.trim();if(!r)return{kind:"skip"};let n=r.startsWith(at.SSE_DATA_PREFIX)?r.slice(at.SSE_DATA_PREFIX.length):r;if(n===at.SSE_DONE_SENTINEL)return{kind:"done"};let i;try{i=JSON.parse(n)}catch(s){throw E.wrap(T.LLM_STREAM_FAILED,lt.CHAT_COMPLETION_STREAM_INVALID_JSON,s)}try{return{kind:"chunk",chunk:e(kS(i))}}catch(s){throw E.wrap(T.LLM_STREAM_FAILED,lt.CHAT_COMPLETION_STREAM_INVALID_RESPONSE,s)}}y.register(A.LlmClient,()=>()=>new ws);function cw(t){return t===void 0||typeof t=="number"&&Number.isSafeInteger(t)&&t>=0}function uw(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return Reflect.ownKeys(e).every(r=>r==="deadlineUnixMs"||r==="signal")?cw(e.deadlineUnixMs)&&(e.signal===void 0||e.signal instanceof AbortSignal):!1}function US(t){if(t!==void 0){if(!uw(t))throw new E(T.SEMANTIC_INVALID_REQUEST,"Invalid semantic decision call controls");if(t.signal?.aborted)throw new E(T.SEMANTIC_CANCELLED,"Semantic decision call cancelled");if(t.deadlineUnixMs!==void 0&&t.deadlineUnixMs<=Date.now())throw new E(T.SEMANTIC_DEADLINE_EXCEEDED,"Semantic decision deadline exceeded")}}var HS="semantic decision model is not installed in this foundation slice",rl=class{name="local-semantic-decision";async checkAvailability(){return{available:!1,reason:HS,capabilities:[]}}async score(e,r){return US(r),{status:Wi.UNAVAILABLE,scores:[],unavailableCode:Js.MODEL_NOT_INSTALLED,unavailableReason:HS,schemaVersion:e.schemaVersion,requestId:e.requestId,featureSchemaVersion:e.featureSchemaVersion,evidence:{...e.evidence}}}};function dw(t=y){t.register(A.SemanticDecisionProvider,()=>new rl)}dw();y.register(A.HostEnvironment,()=>Object.freeze({...pw.env}));import Xl from"process";import tk from"crypto";import{z as wp}from"zod";var BS={MISSING_MEMORY_KEY:(t,e)=>`docuviaApi: no "${t}" set in memory scope "${e}"`};var Pe={INITIALIZING:t=>`Initializing project in ${t}...`,INSTALLING_HOOK:"Installing post-commit hook...",INSTALLING_PRE_PUSH_HOOK:"Installing pre-push hook...",SCANNING_WORKSPACE:"Scanning workspace files...",PARSING_AST:"Parsing source files via AST...",INITIALIZING_TEMP_FILES:"Initializing temp file manager...",PERSISTING_GRAPH:"Persisting knowledge graph...",SNAPSHOTTING_KNOWLEDGE_BRANCH:"Packing initial knowledge graph onto the knowledge branch...",SNAPSHOT_AFTER_INIT_FAILED:"Failed to pack the knowledge graph onto the knowledge branch (non-fatal -- the local graph is intact; run `docuvia snapshot` manually or push to retry)",SUCCESS:"Project initialized successfully",ALREADY_INITIALIZED:"Project already initialized \u2014 skipped re-ingestion; run `docuvia analyze` to pick up new changes, or delete .docuvia/ to force a full re-init",PARTIAL_SUCCESS:(t,e)=>`Project initialized \u2014 ${t} of ${e} files failed to parse (see .docuvia/logs/init.log)`,SUCCESS_WITH_SKIPPED_OVERSIZED:t=>`Project initialized successfully \u2014 ${t} oversized file(s) skipped (see .docuvia/logs/init.log)`,OPEN_DB_FAILED:"Failed to open the local database",TEMP_FILE_MANAGER_INITIALIZED:"Temp file manager initialized",TEMP_FILE_MANAGER_INIT_FAILED:"Failed to initialize temp file manager (non-fatal)",CLEANING_UP_TEMP_FILES:"Cleaning up temp files on shutdown...",TEMP_FILE_CLEANUP_FAILED:"Temp file cleanup on shutdown failed",PARSE_FAILURES_OR_SKIPPED:"init completed with parse failures or skipped files"},rn={START:"init.start",SUMMARY:"init.summary",PARSE_FAILURE:"init.parse_failure",FILE_SKIPPED_OVERSIZED:"init.file_skipped_oversized",SNAPSHOT_AFTER_INIT_FAILED:"init.snapshot_after_init_failed",ALREADY_INITIALIZED:"init.already_initialized"};import KS from"fs/promises";import $S from"path";async function De(t,e,r){let n=$S.join(t,he,vr,e);await KS.mkdir($S.dirname(n),{recursive:!0}),await KS.appendFile(n,JSON.stringify({ts:new Date().toISOString(),...r})+`
|
|
152
|
-
`,H)}async function Li(t,e){await De(t,ng,e)}async function YS(t,e){await Li(t,{event:rn.SUMMARY,...e})}async function WS(t,e,r){let{created:n}=await t.ensureKnowledgeBranch(e);r.info(Pe.INSTALLING_HOOK);let{installed:i}=await t.installPostCommitHook(e);r.info(Pe.INSTALLING_PRE_PUSH_HOOK);let{installed:s}=await t.installPrePushHook(e);return{branchCreated:n,hookInstalled:i,prePushHookInstalled:s}}import jS from"path";import{pathToFileURL as gw}from"url";async function Ni(t,e,r){let n=t.getFirst();if(n)return n;let s=await e.getRemoteUrl(r)??gw(jS.resolve(r)).href;return t.getOrInsert({name:jS.basename(r),repoUrl:s})}async function nl(t){let[e,r,n]=await Promise.all([t.configScanner.scanConfigs(t.workspaceRoot),t.vcsScanner.extractHotspotTags(t.workspaceRoot),t.fileDiscovery.discoverFiles(t.workspaceRoot,t.filesRepo)]),i=new Set([...e.tags,...r]);return{filesToParse:n.filesToParse,skippedOversized:n.skippedOversized,tags:i,projectType:e.projectType}}async function Ci(t){let{astProcessor:e,graphPersister:r,store:n,workspaceRoot:i,projectId:s,filesToParse:o,skippedOversized:a,appendLogLine:l,logEvents:c}=t,{parsed:u,failures:p}=await e.processFiles(i,o),d=new Set(t.tags);for(let m of u)m.language&&d.add(m.language);for(let m of p)await l(i,{event:c.parseFailure,...m});for(let m of a)await l(i,{event:c.fileSkippedOversized,...m});let f=await r.persist({store:n,workspaceRoot:i,projectId:s,parsedResults:u,tags:Array.from(d)});return{parsedResults:u,failures:p,tags:d,callResolutionByFile:f.callResolutionByFile}}function Fs(t){let e=t.meta.get(S.META_KEY_TIER_B_QUEUE);if(!e)return[];try{let r=JSON.parse(e);return Array.isArray(r)?r.filter(n=>n&&typeof n.file=="string"&&typeof n.commitSha=="string"):[]}catch{return[]}}function Pi(t,e){if(e.length===0)return;let r=Fs(t),n=new Map(r.map(i=>[i.file,i]));for(let i of e)n.set(i.file,i);t.meta.set(S.META_KEY_TIER_B_QUEUE,JSON.stringify(Array.from(n.values())))}async function il(t){let{store:e,git:r,workspaceRoot:n,parsedResults:i}=t,s=await r.getHeadSha(n);if(!s)return;let o=i.map(a=>({file:a.file,commitSha:s}));await e.withWriteLock(()=>{e.meta.set(S.META_KEY_LAST_INGESTED_SOURCE_SHA,s),e.meta.set(S.META_KEY_NODE_KEY_FORMAT_VERSION,"2"),o.length>0&&Pi(e,o)})}function fw(t){return JSON.stringify({byFile:t})}function sl(t){let e=t.meta.get(S.META_KEY_CALL_RESOLUTION_STATS);if(!e)return{};try{return JSON.parse(e).byFile??{}}catch{return{}}}function VS(t,e){Object.keys(e).length!==0&&t.meta.set(S.META_KEY_CALL_RESOLUTION_STATS,fw(e))}function ol(t,e){Object.keys(e).length!==0&&VS(t,e)}function zS(t,e,r){let n=sl(t);for(let i of r)delete n[i];for(let[i,s]of Object.entries(e))n[i]=s;VS(t,n)}function JS(t){let e=sl(t);return{byFile:e,total:wr(e)}}async function qS(t,e,r){try{let n=t(e,r);return await n.initialize(),r.info(Pe.TEMP_FILE_MANAGER_INITIALIZED,{tempDir:n.getTempDirPath()}),{tempFileManager:n,stop:()=>n.stopCleanup()}}catch(n){r.warn(Pe.TEMP_FILE_MANAGER_INIT_FAILED,{error:n?.message??String(n)});return}}function QS(t){let{filesRequested:e,filesParsed:r,filesFailed:n,failures:i,filesSkippedOversized:s}=t,o=n>0?Pe.PARTIAL_SUCCESS(n,e):s>0?Pe.SUCCESS_WITH_SKIPPED_OVERSIZED(s):Pe.SUCCESS;return{success:!0,partialFailure:n>0,message:o,filesRequested:e,filesParsed:r,filesFailed:n,failures:i,filesSkippedOversized:s,skippedExistingGraph:!1}}function XS(){return{success:!0,partialFailure:!1,message:Pe.ALREADY_INITIALIZED,filesRequested:0,filesParsed:0,filesFailed:0,failures:[],filesSkippedOversized:0,skippedExistingGraph:!0}}import mw from"path";function ie(t){return mw.join(t,he,Ji)}import eT from"fs/promises";import hw from"os";import Ew from"path";var al={SNAPSHOTTING:"Packing knowledge graph snapshot...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},Di={START:"snapshot.start",ERROR:"snapshot.error",SUMMARY:"snapshot.summary",TIER_B_FINALIZED:"snapshot.tierB.finalized"},ZS="docuvia-snapshot-";async function vi(t,e,r){let n=y.resolve(A.SnapshotRenderer),i=e.graph.getAllNodes(),s=e.graph.getAllLinks(),o=e.projects.getFirst(),a=e.files.getAllSnapshotMetadata(),l=await eT.mkdtemp(Ew.join(hw.tmpdir(),ZS));try{let c=await n.render({outDir:l,l2Rows:i,linkRows:s,l3Rows:e.l3.getAllExportable(),metadata:{project:o?{name:o.name,repoUrl:o.repo_url}:void 0,files:a,lastIngestedSourceSha:e.meta.get(S.META_KEY_LAST_INGESTED_SOURCE_SHA)}});return await e.withWriteLock(()=>{e.meta.set(S.META_KEY_KNOWLEDGE_PACK_PENDING,"true")}),await r.packSnapshotToKnowledgeBranch(t,l),await e.withWriteLock(()=>{e.meta.set(S.META_KEY_KNOWLEDGE_PACK_PENDING,"")}),c}finally{await eT.rm(l,{recursive:!0,force:!0})}}var tT=["SIGTERM","SIGINT"],ll=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(){let{workspaceRoot:e,logger:r}=this;r.info(Pe.INITIALIZING(e)),await Li(e,{event:rn.START,workspaceRoot:e});let n=y.resolve(A.GitProvider),i=y.resolve(A.KnowledgeGitService,{logger:r}),s=y.resolve(A.FileDiscovery,{logger:r}),o=y.resolve(A.ConfigScanner,{logger:r}),a=y.resolve(A.VcsScanner,{logger:r}),l=y.resolve(A.AstProcessor,{logger:r}),c=y.resolve(A.GraphPersister),u=y.resolve(A.TempFileManager),p=y.resolve(A.GraphStoreOpener),d;try{d=await p({dbPath:ie(e)})}catch(f){throw E.wrap(T.INIT_WORKFLOW_FAILED,Pe.OPEN_DB_FAILED,f)}try{let f=d.projects.getFirst(),{l2Nodes:m}=d.graph.count(),_=f!==void 0&&m>0;if(await WS(i,e,r),_)return r.info(Pe.ALREADY_INITIALIZED),await Li(e,{event:rn.ALREADY_INITIALIZED,workspaceRoot:e}),XS();let O=await Ni(d.projects,n,e);r.info(Pe.SCANNING_WORKSPACE);let C=await nl({configScanner:o,vcsScanner:a,fileDiscovery:s,filesRepo:d.files,workspaceRoot:e});r.info(Pe.PARSING_AST);let{parsedResults:w,failures:L,callResolutionByFile:$}=await Ci({astProcessor:l,graphPersister:c,store:d,workspaceRoot:e,projectId:O.id,filesToParse:C.filesToParse,skippedOversized:C.skippedOversized,tags:C.tags,appendLogLine:Li,logEvents:{parseFailure:rn.PARSE_FAILURE,fileSkippedOversized:rn.FILE_SKIPPED_OVERSIZED}});r.info(Pe.PERSISTING_GRAPH),ol(d,$??{}),await il({store:d,git:n,workspaceRoot:e,parsedResults:w}),r.info(Pe.SNAPSHOTTING_KNOWLEDGE_BRANCH);let Q=y.resolve(A.HydrationService,{logger:r});try{await vi(e,d,i),await Q.markSynced(e,d)}catch(M){r.warn(Pe.SNAPSHOT_AFTER_INIT_FAILED,{error:M instanceof Error?M.message:String(M)}),await Li(e,{event:rn.SNAPSHOT_AFTER_INIT_FAILED,message:M instanceof Error?M.message:String(M)})}r.info(Pe.INITIALIZING_TEMP_FILES);let z=await qS(u,e,r),te=Sw(z,r);try{let M=C.filesToParse.length,ne=w.length,pe=L.length,P=C.skippedOversized.length;(pe>0||P>0)&&r.warn(Pe.PARSE_FAILURES_OR_SKIPPED,{filesRequested:M,filesParsed:ne,filesFailed:pe,filesSkippedOversized:P});let Ae=QS({filesRequested:M,filesParsed:ne,filesFailed:pe,failures:L,filesSkippedOversized:P});return await YS(e,{filesRequested:M,filesParsed:ne,filesFailed:pe,failures:L,filesSkippedOversized:P}),Ae}finally{_w(z,te)}}finally{await d.close()}}};function _w(t,e){try{t?.stop()}finally{e()}}function Sw(t,e){if(!t)return()=>{};let r=()=>{e.info(Pe.CLEANING_UP_TEMP_FILES),t.tempFileManager.cleanup().catch(n=>e.error(Pe.TEMP_FILE_CLEANUP_FAILED,{error:String(n)})).finally(()=>t.stop())};for(let n of tT)process.on(n,r);return()=>{for(let n of tT)process.removeListener(n,r)}}import rT from"fs/promises";var xn={CLEANING:t=>`Cleaning ${t}...`,DELETED:"Cleaned .docuvia/local.db database.",NOT_FOUND:"No local database found to clean.",DELETE_FAILED:t=>`Failed to delete database at ${t}`,PATH_ESCAPES_WORKSPACE:(t,e)=>`Refusing to delete database at ${t}: resolved outside workspace ${e}`,DELETED_AT:t=>`Deleted local database at ${t}`},cl={START:"clean.start",SUMMARY:"clean.summary"};async function cp(t,e){await De(t,ig,e)}async function up(t,e){await cp(t,{event:cl.SUMMARY,...e})}import dp from"fs";import Ms from"path";function bi(t,e){let r=Ms.resolve(e),n=Ms.resolve(t);return n===r||n.startsWith(`${r}${Ms.sep}`)}function ul(t,e){let r=Ms.resolve(e),n=Ms.resolve(r,t);if(!bi(n,r))return{status:"outside"};if(!dp.existsSync(n))return{status:"missing"};try{let i=dp.realpathSync(r),s=dp.realpathSync(n);if(!bi(s,i))return{status:"outside"}}catch{return{status:"missing"}}return{status:"ok",resolvedPath:n}}var dl=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(){let{workspaceRoot:e,logger:r}=this,n=ie(e);if(!bi(n,e))throw new E(T.CLEAN_WORKFLOW_FAILED,xn.PATH_ESCAPES_WORKSPACE(n,e));r.info(xn.CLEANING(n)),await cp(e,{event:cl.START});let i=!0;try{await rT.access(n)}catch{i=!1}if(!i){let o={deleted:!1,message:xn.NOT_FOUND};return await up(e,o),o}try{await rT.unlink(n)}catch(o){throw E.wrap(T.CLEAN_WORKFLOW_FAILED,xn.DELETE_FAILED(n),o)}r.info(xn.DELETED_AT(n));let s={deleted:!0,message:xn.DELETED};return await up(e,s),s}};var pl={GETTING_STATUS:"Getting status...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},gl={START:"status.start",ERROR:"status.error",SUMMARY:"status.summary"};async function fl(t,e){await De(t,sg,e)}var Tw="ensureHydrated: automatic hydration refused; local.db left untouched (see reason)";async function nn(t,e){let r=y.resolve(A.GraphStoreOpener),n;try{n=await r({dbPath:ie(t),readonly:!1})}catch{return}try{let i=y.resolve(A.HydrationService,{logger:e});if(await i.isStale(t,n)){let s=await i.hydrate(t,n);s.refused&&e.warn(Tw,{refusalReason:s.refusalReason})}}finally{await n.close()}}var wi={FRESH:"fresh",STALE:"stale",UNKNOWN:"unknown"},ml={state:wi.UNKNOWN};async function hl(t,e){try{if(!y.has(A.GitProvider))return ml;let n=await y.resolve(A.GitProvider).getHeadSha(t);if(!n)return ml;let i=e.meta.get(S.META_KEY_LAST_INGESTED_SOURCE_SHA);return i?{state:i===n?wi.FRESH:wi.STALE,graphSourceSha:i,headSha:n}:ml}catch{return ml}}var Un={COMMIT_MESSAGE:"commitMessage",CONTRACT_SYMBOL:"contractSymbol"};function lr(t){let e=t.meta.get(S.META_KEY_TIER_C_QUEUE);if(!e)return[];try{let r=JSON.parse(e);return Array.isArray(r)?r.filter(Aw):[]}catch{return[]}}function Aw(t){if(!t||typeof t!="object")return!1;let e=t;return(e.kind===Un.COMMIT_MESSAGE||e.kind===Un.CONTRACT_SYMBOL)&&typeof e.target=="string"&&typeof e.commitSha=="string"}function nT(t,e){if(e.length===0)return;let r=lr(t),n=new Map(r.map(i=>[i.target,i]));for(let i of e)n.set(i.target,i);t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(Array.from(n.values())))}function iT(t,e){if(e.length===0)return;let r=new Set(e),n=lr(t).filter(i=>!r.has(i.target));t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(n))}function sT(t,e,r){let n=lr(t),i=n.findIndex(a=>a.target===e);if(i===-1)return{evicted:!1,failCount:0};let s=(n[i].failCount??0)+1;if(s>=r){let a=n.filter((l,c)=>c!==i);return t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(a)),{evicted:!0,failCount:s}}let o=n.slice();return o[i]={...o[i],failCount:s},t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(o)),{evicted:!1,failCount:s}}var El=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(){let{workspaceRoot:e,logger:r}=this;r.info(pl.GETTING_STATUS),await fl(e,{event:gl.START}),await nn(e,r);let n=y.resolve(A.GraphStoreOpener),i;try{i=await n({dbPath:ie(e),readonly:!0})}catch(s){if(s instanceof E&&s.code===T.DB_NOT_FOUND){let o=new E(T.DB_NOT_FOUND,pl.DB_NOT_FOUND,s);throw await fl(e,{event:gl.ERROR,message:pl.DB_NOT_FOUND}),o}throw s}try{let{l2Nodes:s,l3Nodes:o}=i.graph.count(),{totalFiles:a,processedFiles:l}=i.files.getTierBCoverage(),c={projects:i.projects.count(),l2Nodes:s,l3Nodes:o,tierBFilesProcessed:l,tierBFilesTotal:a,tierCQueued:lr(i).length,graphFreshness:(await hl(e,i)).state};return await fl(e,{event:gl.SUMMARY,...c}),c}finally{await i.close()}}};var Hn={STARTING:t=>`Starting sync for project ${t}...`,DB_NOT_FOUND:'Local database not found. Please run "docuvia init".',NOTHING_TO_SYNC:"Nothing to sync: no changed files detected.",NOTHING_NEW:t=>`Nothing new to sync (${t} module(s) skipped, no remote match).`,SYNCED:(t,e)=>`Synced ${t} decision(s), ${e} module(s) skipped.`},Bn={START:"sync.start",ERROR:"sync.error",SUMMARY:"sync.summary"};async function Kn(t,e){await De(t,og,e)}import _l from"fs/promises";import pp from"path";function gp(t){return pp.join(t,he,vr,hg)}var Rw=1e4,yw=100,Iw=6e4,Ow=".lock",Lw={TIMED_OUT_WAITING:t=>`Timed out waiting for the sync-state lock at ${t} \u2014 another docuvia publish may be stuck`};async function Nw(t,e){let r=`${t}${Ow}`;await _l.mkdir(pp.dirname(r),{recursive:!0});try{return await e(r,{maxWaitMs:Rw,retryIntervalMs:yw,staleAfterMs:Iw})}catch(n){throw n instanceof eo?E.wrap(T.DB_LOCKED,Lw.TIMED_OUT_WAITING(r),n):n}}async function oT(t,e,r){let n=await Nw(gp(t),e);try{return await r()}finally{await n.release()}}async function aT(t){try{let e=await _l.readFile(gp(t),H);return JSON.parse(e)}catch{return{}}}async function lT(t,e){let r=gp(t);await _l.mkdir(pp.dirname(r),{recursive:!0}),await _l.writeFile(r,JSON.stringify(e,null,2),H)}var Sl=class{constructor(e,r,n,i){this.workspaceRoot=e;this.logger=r;this.apiUrl=n;this.pat=i}workspaceRoot;logger;apiUrl;pat;async execute(e){let{workspaceRoot:r,logger:n}=this,{projectId:i,commitSha:s}=e;n.info(Hn.STARTING(i)),await Kn(r,{event:Bn.START,projectId:i,commitSha:s??null});let o=y.resolve(A.GitProvider),a=s?await o.getFilesChangedByCommit(r,s):[...await o.listModifiedFiles(r),...await o.listUntrackedFiles(r)],l=new Set(a.filter(Boolean));if(l.size===0){let p={synced:0,skipped:0,message:Hn.NOTHING_TO_SYNC};return await Kn(r,{event:Bn.SUMMARY,projectId:i,...p}),p}let c=y.resolve(A.GraphStoreOpener),u;try{u=await c({dbPath:ie(r),readonly:!0})}catch(p){throw p instanceof E&&p.code===T.DB_NOT_FOUND?(await Kn(r,{event:Bn.ERROR,projectId:i,message:Hn.DB_NOT_FOUND}),new E(T.DB_NOT_FOUND,Hn.DB_NOT_FOUND,p)):p}try{let d=y.resolve(A.RemoteSyncClient)();d.initialize({apiUrl:this.apiUrl,pat:this.pat});let f;try{f=await d.fetchRemoteL2Nodes(i)}catch(w){let L=w instanceof Error?w.message:String(w);throw await Kn(r,{event:Bn.ERROR,projectId:i,message:L}),w}let m=new Map(f.map(w=>[w.name,w.id])),_=u.graph.findNodesForChangedFiles(Array.from(l)),O=y.resolve(A.ProcessLock),C=await oT(r,O,async()=>{let w=await aT(r),L=w[i]??{syncedContentHashes:[]},$=new Set(L.syncedContentHashes),{events:Q,newlySyncedHashes:z,skippedL2Count:te}=this.buildSyncPushEvents(_,m,$);if(Q.length===0)return{synced:0,skipped:te,message:Hn.NOTHING_NEW(te)};let M;try{M=await d.pushSyncEvents(i,Q)}catch(pe){let P=pe instanceof Error?pe.message:String(pe);throw await Kn(r,{event:Bn.ERROR,projectId:i,message:P}),pe}L.syncedContentHashes=Array.from(new Set([...$,...z])),w[i]=L,await lT(r,w);let ne=M.processed??Q.length;return{synced:ne,skipped:te,message:Hn.SYNCED(ne,te)}});return await Kn(r,{event:Bn.SUMMARY,projectId:i,...C}),C}finally{await u.close()}}buildSyncPushEvents(e,r,n){let i=[],s=[],o=0;for(let{l2Node:a,l3Nodes:l}of e){let c=r.get(a.name);if(c===void 0){o++;continue}for(let u of l)u.content_hash&&n.has(u.content_hash)||(i.push(this.buildL3PushEvent(c,u)),u.content_hash&&s.push(u.content_hash))}return{events:i,newlySyncedHashes:s,skippedL2Count:o}}buildL3PushEvent(e,r){return{type:eg.CREATE_L3,payload:{l2NodeId:e,title:r.title,content:r.content,nodeType:r.node_type,confidence:r.confidence,sourceCommits:r.source_commits?JSON.parse(r.source_commits):void 0,contentHash:r.content_hash}}}};import ZF from"fs";import eM from"path";var J={ANALYZING:"Analyzing project...",AUTO_ANALYZING:"Checking knowledge graph freshness...",AUTO_FULL_INGESTION:"No existing knowledge graph found \u2014 running full ingestion...",SNAPSHOT_AFTER_FULL_INGESTION_FAILED:"Failed to pack the knowledge graph onto the knowledge branch (non-fatal -- the local graph is intact; run `docuvia snapshot` manually or push to retry)",AUTO_DELTA_INGESTION:"Re-parsing changed files since the last analysis...",NODE_KEY_FORMAT_STALE:"Knowledge graph predates the current node_key format -- running a full re-ingestion instead of a delta to avoid mixing old and new formats...",HEAD_NOT_DESCENDANT_OF_LAST_INGESTED:"HEAD has moved backward relative to the last-ingested commit (e.g. a soft reset, undone amend, or aborted rebase) -- running a full re-ingestion instead of a delta to avoid misclassifying still-present files as deleted...",AUTO_NOOP:"Knowledge graph already up to date with HEAD.",AUTO_NOOP_DIRTY_WORKTREE:"Knowledge graph already up to date with HEAD -- but the working tree has uncommitted changes that won't be reflected until they're committed (analyze's fast-path only tracks HEAD, not the filesystem).",TIER_B_CAP_NUDGE:"Changed code since the last Tier B batch has exceeded the cap -- push, or run `docuvia analyze --escalate-to-lsp && docuvia snapshot`, to trigger it.",EXTRACTING:t=>`Extracting decisions from ${t}...`,FILES_DROPPED:t=>`Dropped ${t} file(s) from decision extraction (file-count/byte cap)`,NO_GRAPH_TO_ATTACH:"run `docuvia init` first \u2014 decisions need a graph to attach to",AGENT_AUTHORED_ANCHOR_UNRESOLVABLE:t=>`cannot anchor a decision to ${t}: it is not a parseable source file, so it can never have an L2 node. Write the decision against a source file this change touched (e.g. a .ts/.py/.go file) instead`,PATH_NOT_FOUND:t=>`Path does not exist: ${t}`,LLM_NON_JSON_OUTPUT:"LLM returned non-JSON output for decision extraction",FILE_READ_FAILED:"Failed to read file for decision extraction",TIER_B_STARTING:"Running the Tier B LSP escalation batch...",TIER_B_FULL_RESYNC_QUEUED:t=>`Full resync (--full): queued ${t} tracked file(s) for Tier B re-processing`,TIER_B_EMPTY_QUEUE:"Tier B queue is empty -- nothing to escalate.",TIER_B_DEGRADED:t=>`LSP unavailable -- AST-level edges left untouched (${t})`,TIER_B_SUMMARY:(t,e,r,n)=>`Tier B batch complete: ${t} file(s) processed, ${e} corrected edge(s) applied`+(n>0?`, ${n} file(s) not applicable to their LSP project (kept at Tier A)`:"")+(r>0?`, ${r} file(s) permanently failed (dropped from the re-try queue)`:""),TIER_B_FORWARD_SEEDED:(t,e,r,n)=>`Tier B forward resolution seeded ${e}/${r} ${t} file(s) (staleness-skipped: ${n})`,TIER_C_SKIPPED:t=>`Tier C drain skipped this run (${t})`,TIER_C_ITEM_EVICTED:(t,e,r)=>`Tier C candidate permanently failed after ${r} attempt(s), evicted from queue (${t}: ${e})`,TIER_C_SUMMARY:(t,e)=>`Tier C drain complete: ${t} candidate(s) processed, ${e} decision(s) persisted`,FLUSH_STAGED_L3_DISABLED:"commit-l3-write is disabled -- skipping the staged-L3 flush",FLUSH_STAGED_L3_EMPTY:"No staged L3 decisions to flush.",FLUSH_STAGED_L3_SUMMARY:(t,e)=>`Flushed ${t} staged L3 decision(s)`+(e>0?`, ${e} left staged for a future commit.`:"."),FLUSH_STAGED_L3_FILE_DELETED:t=>`Staged L3 decision(s) for ${t} dropped -- the file was deleted by this commit`,FLUSH_STAGED_L3_ERROR:t=>`Flush of staged L3 decisions failed: ${t} -- the staging file was left untouched for the next flush to retry`,L3_ANCHOR_CONTRADICTION:(t,e,r)=>`Staged decision "${t}" conflicts with an existing ${e} decision on the same anchor`+(r?` (written at commit ${r})`:"")+" with divergent content -- verify which rationale is correct before building on either"},Y={AUTO_START:"analyze.auto.start",AUTO_ERROR:"analyze.auto.error",DELTA_NOOP:"analyze.delta.noop",DELTA_NO_HEAD:"analyze.delta.no_head",TIER_B_COMMIT_CAP_NUDGE:"analyze.auto.tier_b_cap_nudge",FULL_START:"analyze.full.start",FULL_SUMMARY:"analyze.full.summary",FULL_PARSE_FAILURE:"analyze.full.parse_failure",FULL_FILE_SKIPPED_OVERSIZED:"analyze.full.file_skipped_oversized",FULL_SNAPSHOT_FAILED:"analyze.full.snapshot_failed",FULL_CALL_RESOLUTION:"analyze.full.call_resolution",DELTA_START:"analyze.delta.start",DELTA_NODE_KEY_FORMAT_STALE:"analyze.delta.node_key_format_stale",DELTA_HEAD_NOT_DESCENDANT:"analyze.delta.head_not_descendant",DELTA_SUMMARY:"analyze.delta.summary",DELTA_FILE_SKIPPED_OVERSIZED:"analyze.delta.file_skipped_oversized",DELTA_PARSE_FAILURE:"analyze.delta.parse_failure",DELTA_CALL_RESOLUTION:"analyze.delta.call_resolution",FOCUSED_START:"analyze.focused.start",FOCUSED_ERROR:"analyze.focused.error",FOCUSED_SUMMARY:"analyze.focused.summary",FOCUSED_PERSISTED:"analyze.focused.persisted",FOCUSED_PERSIST_SKIPPED:"analyze.focused.persist_skipped",TIER_B_START:"analyze.tierB.start",TIER_B_FULL_RESYNC_QUEUED:"analyze.tierB.full_resync_queued",TIER_B_EMPTY_QUEUE:"analyze.tierB.empty_queue",TIER_B_FILE_DROPPED_DELETED:"analyze.tierB.file_dropped_deleted",TIER_B_FILE_SKIPPED_LANGUAGE:"analyze.tierB.file_skipped_language",TIER_B_FILE_SKIPPED_NOT_APPLICABLE:"analyze.tierB.file_skipped_not_applicable",TIER_B_DEGRADED:"analyze.tierB.degraded",TIER_B_FILE_FAILED:"analyze.tierB.file_failed",TIER_B_SUMMARY:"analyze.tierB.summary",TIER_B_ERROR:"analyze.tierB.error",TIER_B_FORWARD_SEEDED:"analyze.tierB.forward_seeded",TIER_C_START:"analyze.tierC.start",TIER_C_EMPTY_QUEUE:"analyze.tierC.empty_queue",TIER_C_SKIPPED:"analyze.tierC.skipped",TIER_C_LOAD_NOTE:"analyze.tierC.load_note",TIER_C_ITEM_SUCCESS:"analyze.tierC.item_success",TIER_C_ITEM_FAILED:"analyze.tierC.item_failed",TIER_C_ITEM_EVICTED:"analyze.tierC.item_evicted",TIER_C_SUMMARY:"analyze.tierC.summary",FLUSH_STAGED_L3_DISABLED:"analyze.flushStagedL3.disabled",FLUSH_STAGED_L3_SUMMARY:"analyze.flushStagedL3.summary"},cT=`You are an expert software architect reviewing source code directly (not commit history).
|
|
152
|
+
`,H)}async function Li(t,e){await De(t,ng,e)}async function YS(t,e){await Li(t,{event:rn.SUMMARY,...e})}async function WS(t,e,r){let{created:n}=await t.ensureKnowledgeBranch(e);r.info(Pe.INSTALLING_HOOK);let{installed:i}=await t.installPostCommitHook(e);r.info(Pe.INSTALLING_PRE_PUSH_HOOK);let{installed:s}=await t.installPrePushHook(e);return{branchCreated:n,hookInstalled:i,prePushHookInstalled:s}}import jS from"path";import{pathToFileURL as gw}from"url";async function Ni(t,e,r){let n=t.getFirst();if(n)return n;let s=await e.getRemoteUrl(r)??gw(jS.resolve(r)).href;return t.getOrInsert({name:jS.basename(r),repoUrl:s})}async function nl(t){let[e,r,n]=await Promise.all([t.configScanner.scanConfigs(t.workspaceRoot),t.vcsScanner.extractHotspotTags(t.workspaceRoot),t.fileDiscovery.discoverFiles(t.workspaceRoot,t.filesRepo)]),i=new Set([...e.tags,...r]);return{filesToParse:n.filesToParse,skippedOversized:n.skippedOversized,tags:i,projectType:e.projectType}}async function Ci(t){let{astProcessor:e,graphPersister:r,store:n,workspaceRoot:i,projectId:s,filesToParse:o,skippedOversized:a,appendLogLine:l,logEvents:c}=t,{parsed:u,failures:p}=await e.processFiles(i,o),d=new Set(t.tags);for(let m of u)m.language&&d.add(m.language);for(let m of p)await l(i,{event:c.parseFailure,...m});for(let m of a)await l(i,{event:c.fileSkippedOversized,...m});let f=await r.persist({store:n,workspaceRoot:i,projectId:s,parsedResults:u,tags:Array.from(d)});return{parsedResults:u,failures:p,tags:d,callResolutionByFile:f.callResolutionByFile}}function Fs(t){let e=t.meta.get(S.META_KEY_TIER_B_QUEUE);if(!e)return[];try{let r=JSON.parse(e);return Array.isArray(r)?r.filter(n=>n&&typeof n.file=="string"&&typeof n.commitSha=="string"):[]}catch{return[]}}function Pi(t,e){if(e.length===0)return;let r=Fs(t),n=new Map(r.map(i=>[i.file,i]));for(let i of e)n.set(i.file,i);t.meta.set(S.META_KEY_TIER_B_QUEUE,JSON.stringify(Array.from(n.values())))}async function il(t){let{store:e,git:r,workspaceRoot:n,parsedResults:i}=t,s=await r.getHeadSha(n);if(!s)return;let o=i.map(a=>({file:a.file,commitSha:s}));await e.withWriteLock(()=>{e.meta.set(S.META_KEY_LAST_INGESTED_SOURCE_SHA,s),e.meta.set(S.META_KEY_NODE_KEY_FORMAT_VERSION,"2"),o.length>0&&Pi(e,o)})}function fw(t){return JSON.stringify({byFile:t})}function sl(t){let e=t.meta.get(S.META_KEY_CALL_RESOLUTION_STATS);if(!e)return{};try{return JSON.parse(e).byFile??{}}catch{return{}}}function VS(t,e){t.meta.set(S.META_KEY_CALL_RESOLUTION_STATS,fw(e))}function ol(t,e){Object.keys(e).length!==0&&VS(t,e)}function zS(t,e,r,n){let i=sl(t);for(let s of r)delete i[s];for(let s of n)delete i[s];for(let[s,o]of Object.entries(e))i[s]=o;VS(t,i)}function JS(t){let e=sl(t);return{byFile:e,total:wr(e)}}async function qS(t,e,r){try{let n=t(e,r);return await n.initialize(),r.info(Pe.TEMP_FILE_MANAGER_INITIALIZED,{tempDir:n.getTempDirPath()}),{tempFileManager:n,stop:()=>n.stopCleanup()}}catch(n){r.warn(Pe.TEMP_FILE_MANAGER_INIT_FAILED,{error:n?.message??String(n)});return}}function QS(t){let{filesRequested:e,filesParsed:r,filesFailed:n,failures:i,filesSkippedOversized:s}=t,o=n>0?Pe.PARTIAL_SUCCESS(n,e):s>0?Pe.SUCCESS_WITH_SKIPPED_OVERSIZED(s):Pe.SUCCESS;return{success:!0,partialFailure:n>0,message:o,filesRequested:e,filesParsed:r,filesFailed:n,failures:i,filesSkippedOversized:s,skippedExistingGraph:!1}}function XS(){return{success:!0,partialFailure:!1,message:Pe.ALREADY_INITIALIZED,filesRequested:0,filesParsed:0,filesFailed:0,failures:[],filesSkippedOversized:0,skippedExistingGraph:!0}}import mw from"path";function ie(t){return mw.join(t,he,Ji)}import eT from"fs/promises";import hw from"os";import Ew from"path";var al={SNAPSHOTTING:"Packing knowledge graph snapshot...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},Di={START:"snapshot.start",ERROR:"snapshot.error",SUMMARY:"snapshot.summary",TIER_B_FINALIZED:"snapshot.tierB.finalized"},ZS="docuvia-snapshot-";async function vi(t,e,r){let n=y.resolve(A.SnapshotRenderer),i=e.graph.getAllNodes(),s=e.graph.getAllLinks(),o=e.projects.getFirst(),a=e.files.getAllSnapshotMetadata(),l=await eT.mkdtemp(Ew.join(hw.tmpdir(),ZS));try{let c=await n.render({outDir:l,l2Rows:i,linkRows:s,l3Rows:e.l3.getAllExportable(),metadata:{project:o?{name:o.name,repoUrl:o.repo_url}:void 0,files:a,lastIngestedSourceSha:e.meta.get(S.META_KEY_LAST_INGESTED_SOURCE_SHA)}});return await e.withWriteLock(()=>{e.meta.set(S.META_KEY_KNOWLEDGE_PACK_PENDING,"true")}),await r.packSnapshotToKnowledgeBranch(t,l),await e.withWriteLock(()=>{e.meta.set(S.META_KEY_KNOWLEDGE_PACK_PENDING,"")}),c}finally{await eT.rm(l,{recursive:!0,force:!0})}}var tT=["SIGTERM","SIGINT"],ll=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(){let{workspaceRoot:e,logger:r}=this;r.info(Pe.INITIALIZING(e)),await Li(e,{event:rn.START,workspaceRoot:e});let n=y.resolve(A.GitProvider),i=y.resolve(A.KnowledgeGitService,{logger:r}),s=y.resolve(A.FileDiscovery,{logger:r}),o=y.resolve(A.ConfigScanner,{logger:r}),a=y.resolve(A.VcsScanner,{logger:r}),l=y.resolve(A.AstProcessor,{logger:r}),c=y.resolve(A.GraphPersister),u=y.resolve(A.TempFileManager),p=y.resolve(A.GraphStoreOpener),d;try{d=await p({dbPath:ie(e)})}catch(f){throw E.wrap(T.INIT_WORKFLOW_FAILED,Pe.OPEN_DB_FAILED,f)}try{let f=d.projects.getFirst(),{l2Nodes:m}=d.graph.count(),_=f!==void 0&&m>0;if(await WS(i,e,r),_)return r.info(Pe.ALREADY_INITIALIZED),await Li(e,{event:rn.ALREADY_INITIALIZED,workspaceRoot:e}),XS();let O=await Ni(d.projects,n,e);r.info(Pe.SCANNING_WORKSPACE);let C=await nl({configScanner:o,vcsScanner:a,fileDiscovery:s,filesRepo:d.files,workspaceRoot:e});r.info(Pe.PARSING_AST);let{parsedResults:w,failures:L,callResolutionByFile:$}=await Ci({astProcessor:l,graphPersister:c,store:d,workspaceRoot:e,projectId:O.id,filesToParse:C.filesToParse,skippedOversized:C.skippedOversized,tags:C.tags,appendLogLine:Li,logEvents:{parseFailure:rn.PARSE_FAILURE,fileSkippedOversized:rn.FILE_SKIPPED_OVERSIZED}});r.info(Pe.PERSISTING_GRAPH),ol(d,$??{}),await il({store:d,git:n,workspaceRoot:e,parsedResults:w}),r.info(Pe.SNAPSHOTTING_KNOWLEDGE_BRANCH);let Q=y.resolve(A.HydrationService,{logger:r});try{await vi(e,d,i),await Q.markSynced(e,d)}catch(M){r.warn(Pe.SNAPSHOT_AFTER_INIT_FAILED,{error:M instanceof Error?M.message:String(M)}),await Li(e,{event:rn.SNAPSHOT_AFTER_INIT_FAILED,message:M instanceof Error?M.message:String(M)})}r.info(Pe.INITIALIZING_TEMP_FILES);let z=await qS(u,e,r),te=Sw(z,r);try{let M=C.filesToParse.length,ne=w.length,pe=L.length,P=C.skippedOversized.length;(pe>0||P>0)&&r.warn(Pe.PARSE_FAILURES_OR_SKIPPED,{filesRequested:M,filesParsed:ne,filesFailed:pe,filesSkippedOversized:P});let Ae=QS({filesRequested:M,filesParsed:ne,filesFailed:pe,failures:L,filesSkippedOversized:P});return await YS(e,{filesRequested:M,filesParsed:ne,filesFailed:pe,failures:L,filesSkippedOversized:P}),Ae}finally{_w(z,te)}}finally{await d.close()}}};function _w(t,e){try{t?.stop()}finally{e()}}function Sw(t,e){if(!t)return()=>{};let r=()=>{e.info(Pe.CLEANING_UP_TEMP_FILES),t.tempFileManager.cleanup().catch(n=>e.error(Pe.TEMP_FILE_CLEANUP_FAILED,{error:String(n)})).finally(()=>t.stop())};for(let n of tT)process.on(n,r);return()=>{for(let n of tT)process.removeListener(n,r)}}import rT from"fs/promises";var xn={CLEANING:t=>`Cleaning ${t}...`,DELETED:"Cleaned .docuvia/local.db database.",NOT_FOUND:"No local database found to clean.",DELETE_FAILED:t=>`Failed to delete database at ${t}`,PATH_ESCAPES_WORKSPACE:(t,e)=>`Refusing to delete database at ${t}: resolved outside workspace ${e}`,DELETED_AT:t=>`Deleted local database at ${t}`},cl={START:"clean.start",SUMMARY:"clean.summary"};async function cp(t,e){await De(t,ig,e)}async function up(t,e){await cp(t,{event:cl.SUMMARY,...e})}import dp from"fs";import Ms from"path";function bi(t,e){let r=Ms.resolve(e),n=Ms.resolve(t);return n===r||n.startsWith(`${r}${Ms.sep}`)}function ul(t,e){let r=Ms.resolve(e),n=Ms.resolve(r,t);if(!bi(n,r))return{status:"outside"};if(!dp.existsSync(n))return{status:"missing"};try{let i=dp.realpathSync(r),s=dp.realpathSync(n);if(!bi(s,i))return{status:"outside"}}catch{return{status:"missing"}}return{status:"ok",resolvedPath:n}}var dl=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(){let{workspaceRoot:e,logger:r}=this,n=ie(e);if(!bi(n,e))throw new E(T.CLEAN_WORKFLOW_FAILED,xn.PATH_ESCAPES_WORKSPACE(n,e));r.info(xn.CLEANING(n)),await cp(e,{event:cl.START});let i=!0;try{await rT.access(n)}catch{i=!1}if(!i){let o={deleted:!1,message:xn.NOT_FOUND};return await up(e,o),o}try{await rT.unlink(n)}catch(o){throw E.wrap(T.CLEAN_WORKFLOW_FAILED,xn.DELETE_FAILED(n),o)}r.info(xn.DELETED_AT(n));let s={deleted:!0,message:xn.DELETED};return await up(e,s),s}};var pl={GETTING_STATUS:"Getting status...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},gl={START:"status.start",ERROR:"status.error",SUMMARY:"status.summary"};async function fl(t,e){await De(t,sg,e)}var Tw="ensureHydrated: automatic hydration refused; local.db left untouched (see reason)";async function nn(t,e){let r=y.resolve(A.GraphStoreOpener),n;try{n=await r({dbPath:ie(t),readonly:!1})}catch{return}try{let i=y.resolve(A.HydrationService,{logger:e});if(await i.isStale(t,n)){let s=await i.hydrate(t,n);s.refused&&e.warn(Tw,{refusalReason:s.refusalReason})}}finally{await n.close()}}var wi={FRESH:"fresh",STALE:"stale",UNKNOWN:"unknown"},ml={state:wi.UNKNOWN};async function hl(t,e){try{if(!y.has(A.GitProvider))return ml;let n=await y.resolve(A.GitProvider).getHeadSha(t);if(!n)return ml;let i=e.meta.get(S.META_KEY_LAST_INGESTED_SOURCE_SHA);return i?{state:i===n?wi.FRESH:wi.STALE,graphSourceSha:i,headSha:n}:ml}catch{return ml}}var Un={COMMIT_MESSAGE:"commitMessage",CONTRACT_SYMBOL:"contractSymbol"};function lr(t){let e=t.meta.get(S.META_KEY_TIER_C_QUEUE);if(!e)return[];try{let r=JSON.parse(e);return Array.isArray(r)?r.filter(Aw):[]}catch{return[]}}function Aw(t){if(!t||typeof t!="object")return!1;let e=t;return(e.kind===Un.COMMIT_MESSAGE||e.kind===Un.CONTRACT_SYMBOL)&&typeof e.target=="string"&&typeof e.commitSha=="string"}function nT(t,e){if(e.length===0)return;let r=lr(t),n=new Map(r.map(i=>[i.target,i]));for(let i of e)n.set(i.target,i);t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(Array.from(n.values())))}function iT(t,e){if(e.length===0)return;let r=new Set(e),n=lr(t).filter(i=>!r.has(i.target));t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(n))}function sT(t,e,r){let n=lr(t),i=n.findIndex(a=>a.target===e);if(i===-1)return{evicted:!1,failCount:0};let s=(n[i].failCount??0)+1;if(s>=r){let a=n.filter((l,c)=>c!==i);return t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(a)),{evicted:!0,failCount:s}}let o=n.slice();return o[i]={...o[i],failCount:s},t.meta.set(S.META_KEY_TIER_C_QUEUE,JSON.stringify(o)),{evicted:!1,failCount:s}}var El=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(){let{workspaceRoot:e,logger:r}=this;r.info(pl.GETTING_STATUS),await fl(e,{event:gl.START}),await nn(e,r);let n=y.resolve(A.GraphStoreOpener),i;try{i=await n({dbPath:ie(e),readonly:!0})}catch(s){if(s instanceof E&&s.code===T.DB_NOT_FOUND){let o=new E(T.DB_NOT_FOUND,pl.DB_NOT_FOUND,s);throw await fl(e,{event:gl.ERROR,message:pl.DB_NOT_FOUND}),o}throw s}try{let{l2Nodes:s,l3Nodes:o}=i.graph.count(),{totalFiles:a,processedFiles:l}=i.files.getTierBCoverage(),c={projects:i.projects.count(),l2Nodes:s,l3Nodes:o,tierBFilesProcessed:l,tierBFilesTotal:a,tierCQueued:lr(i).length,graphFreshness:(await hl(e,i)).state};return await fl(e,{event:gl.SUMMARY,...c}),c}finally{await i.close()}}};var Hn={STARTING:t=>`Starting sync for project ${t}...`,DB_NOT_FOUND:'Local database not found. Please run "docuvia init".',NOTHING_TO_SYNC:"Nothing to sync: no changed files detected.",NOTHING_NEW:t=>`Nothing new to sync (${t} module(s) skipped, no remote match).`,SYNCED:(t,e)=>`Synced ${t} decision(s), ${e} module(s) skipped.`},Bn={START:"sync.start",ERROR:"sync.error",SUMMARY:"sync.summary"};async function Kn(t,e){await De(t,og,e)}import _l from"fs/promises";import pp from"path";function gp(t){return pp.join(t,he,vr,hg)}var Rw=1e4,yw=100,Iw=6e4,Ow=".lock",Lw={TIMED_OUT_WAITING:t=>`Timed out waiting for the sync-state lock at ${t} \u2014 another docuvia publish may be stuck`};async function Nw(t,e){let r=`${t}${Ow}`;await _l.mkdir(pp.dirname(r),{recursive:!0});try{return await e(r,{maxWaitMs:Rw,retryIntervalMs:yw,staleAfterMs:Iw})}catch(n){throw n instanceof eo?E.wrap(T.DB_LOCKED,Lw.TIMED_OUT_WAITING(r),n):n}}async function oT(t,e,r){let n=await Nw(gp(t),e);try{return await r()}finally{await n.release()}}async function aT(t){try{let e=await _l.readFile(gp(t),H);return JSON.parse(e)}catch{return{}}}async function lT(t,e){let r=gp(t);await _l.mkdir(pp.dirname(r),{recursive:!0}),await _l.writeFile(r,JSON.stringify(e,null,2),H)}var Sl=class{constructor(e,r,n,i){this.workspaceRoot=e;this.logger=r;this.apiUrl=n;this.pat=i}workspaceRoot;logger;apiUrl;pat;async execute(e){let{workspaceRoot:r,logger:n}=this,{projectId:i,commitSha:s}=e;n.info(Hn.STARTING(i)),await Kn(r,{event:Bn.START,projectId:i,commitSha:s??null});let o=y.resolve(A.GitProvider),a=s?await o.getFilesChangedByCommit(r,s):[...await o.listModifiedFiles(r),...await o.listUntrackedFiles(r)],l=new Set(a.filter(Boolean));if(l.size===0){let p={synced:0,skipped:0,message:Hn.NOTHING_TO_SYNC};return await Kn(r,{event:Bn.SUMMARY,projectId:i,...p}),p}let c=y.resolve(A.GraphStoreOpener),u;try{u=await c({dbPath:ie(r),readonly:!0})}catch(p){throw p instanceof E&&p.code===T.DB_NOT_FOUND?(await Kn(r,{event:Bn.ERROR,projectId:i,message:Hn.DB_NOT_FOUND}),new E(T.DB_NOT_FOUND,Hn.DB_NOT_FOUND,p)):p}try{let d=y.resolve(A.RemoteSyncClient)();d.initialize({apiUrl:this.apiUrl,pat:this.pat});let f;try{f=await d.fetchRemoteL2Nodes(i)}catch(w){let L=w instanceof Error?w.message:String(w);throw await Kn(r,{event:Bn.ERROR,projectId:i,message:L}),w}let m=new Map(f.map(w=>[w.name,w.id])),_=u.graph.findNodesForChangedFiles(Array.from(l)),O=y.resolve(A.ProcessLock),C=await oT(r,O,async()=>{let w=await aT(r),L=w[i]??{syncedContentHashes:[]},$=new Set(L.syncedContentHashes),{events:Q,newlySyncedHashes:z,skippedL2Count:te}=this.buildSyncPushEvents(_,m,$);if(Q.length===0)return{synced:0,skipped:te,message:Hn.NOTHING_NEW(te)};let M;try{M=await d.pushSyncEvents(i,Q)}catch(pe){let P=pe instanceof Error?pe.message:String(pe);throw await Kn(r,{event:Bn.ERROR,projectId:i,message:P}),pe}L.syncedContentHashes=Array.from(new Set([...$,...z])),w[i]=L,await lT(r,w);let ne=M.processed??Q.length;return{synced:ne,skipped:te,message:Hn.SYNCED(ne,te)}});return await Kn(r,{event:Bn.SUMMARY,projectId:i,...C}),C}finally{await u.close()}}buildSyncPushEvents(e,r,n){let i=[],s=[],o=0;for(let{l2Node:a,l3Nodes:l}of e){let c=r.get(a.name);if(c===void 0){o++;continue}for(let u of l)u.content_hash&&n.has(u.content_hash)||(i.push(this.buildL3PushEvent(c,u)),u.content_hash&&s.push(u.content_hash))}return{events:i,newlySyncedHashes:s,skippedL2Count:o}}buildL3PushEvent(e,r){return{type:eg.CREATE_L3,payload:{l2NodeId:e,title:r.title,content:r.content,nodeType:r.node_type,confidence:r.confidence,sourceCommits:r.source_commits?JSON.parse(r.source_commits):void 0,contentHash:r.content_hash}}}};import ZF from"fs";import eM from"path";var J={ANALYZING:"Analyzing project...",AUTO_ANALYZING:"Checking knowledge graph freshness...",AUTO_FULL_INGESTION:"No existing knowledge graph found \u2014 running full ingestion...",SNAPSHOT_AFTER_FULL_INGESTION_FAILED:"Failed to pack the knowledge graph onto the knowledge branch (non-fatal -- the local graph is intact; run `docuvia snapshot` manually or push to retry)",AUTO_DELTA_INGESTION:"Re-parsing changed files since the last analysis...",NODE_KEY_FORMAT_STALE:"Knowledge graph predates the current node_key format -- running a full re-ingestion instead of a delta to avoid mixing old and new formats...",HEAD_NOT_DESCENDANT_OF_LAST_INGESTED:"HEAD has moved backward relative to the last-ingested commit (e.g. a soft reset, undone amend, or aborted rebase) -- running a full re-ingestion instead of a delta to avoid misclassifying still-present files as deleted...",AUTO_NOOP:"Knowledge graph already up to date with HEAD.",AUTO_NOOP_DIRTY_WORKTREE:"Knowledge graph already up to date with HEAD -- but the working tree has uncommitted changes that won't be reflected until they're committed (analyze's fast-path only tracks HEAD, not the filesystem).",TIER_B_CAP_NUDGE:"Changed code since the last Tier B batch has exceeded the cap -- push, or run `docuvia analyze --escalate-to-lsp && docuvia snapshot`, to trigger it.",EXTRACTING:t=>`Extracting decisions from ${t}...`,FILES_DROPPED:t=>`Dropped ${t} file(s) from decision extraction (file-count/byte cap)`,NO_GRAPH_TO_ATTACH:"run `docuvia init` first \u2014 decisions need a graph to attach to",AGENT_AUTHORED_ANCHOR_UNRESOLVABLE:t=>`cannot anchor a decision to ${t}: it is not a parseable source file, so it can never have an L2 node. Write the decision against a source file this change touched (e.g. a .ts/.py/.go file) instead`,PATH_NOT_FOUND:t=>`Path does not exist: ${t}`,LLM_NON_JSON_OUTPUT:"LLM returned non-JSON output for decision extraction",FILE_READ_FAILED:"Failed to read file for decision extraction",TIER_B_STARTING:"Running the Tier B LSP escalation batch...",TIER_B_FULL_RESYNC_QUEUED:t=>`Full resync (--full): queued ${t} tracked file(s) for Tier B re-processing`,TIER_B_EMPTY_QUEUE:"Tier B queue is empty -- nothing to escalate.",TIER_B_DEGRADED:t=>`LSP unavailable -- AST-level edges left untouched (${t})`,TIER_B_SUMMARY:(t,e,r,n)=>`Tier B batch complete: ${t} file(s) processed, ${e} corrected edge(s) applied`+(n>0?`, ${n} file(s) not applicable to their LSP project (kept at Tier A)`:"")+(r>0?`, ${r} file(s) permanently failed (dropped from the re-try queue)`:""),TIER_B_FORWARD_SEEDED:(t,e,r,n)=>`Tier B forward resolution seeded ${e}/${r} ${t} file(s) (staleness-skipped: ${n})`,TIER_C_SKIPPED:t=>`Tier C drain skipped this run (${t})`,TIER_C_ITEM_EVICTED:(t,e,r)=>`Tier C candidate permanently failed after ${r} attempt(s), evicted from queue (${t}: ${e})`,TIER_C_SUMMARY:(t,e)=>`Tier C drain complete: ${t} candidate(s) processed, ${e} decision(s) persisted`,FLUSH_STAGED_L3_DISABLED:"commit-l3-write is disabled -- skipping the staged-L3 flush",FLUSH_STAGED_L3_EMPTY:"No staged L3 decisions to flush.",FLUSH_STAGED_L3_SUMMARY:(t,e)=>`Flushed ${t} staged L3 decision(s)`+(e>0?`, ${e} left staged for a future commit.`:"."),FLUSH_STAGED_L3_FILE_DELETED:t=>`Staged L3 decision(s) for ${t} dropped -- the file was deleted by this commit`,FLUSH_STAGED_L3_ERROR:t=>`Flush of staged L3 decisions failed: ${t} -- the staging file was left untouched for the next flush to retry`,L3_ANCHOR_CONTRADICTION:(t,e,r)=>`Staged decision "${t}" conflicts with an existing ${e} decision on the same anchor`+(r?` (written at commit ${r})`:"")+" with divergent content -- verify which rationale is correct before building on either"},Y={AUTO_START:"analyze.auto.start",AUTO_ERROR:"analyze.auto.error",DELTA_NOOP:"analyze.delta.noop",DELTA_NO_HEAD:"analyze.delta.no_head",TIER_B_COMMIT_CAP_NUDGE:"analyze.auto.tier_b_cap_nudge",FULL_START:"analyze.full.start",FULL_SUMMARY:"analyze.full.summary",FULL_PARSE_FAILURE:"analyze.full.parse_failure",FULL_FILE_SKIPPED_OVERSIZED:"analyze.full.file_skipped_oversized",FULL_SNAPSHOT_FAILED:"analyze.full.snapshot_failed",FULL_CALL_RESOLUTION:"analyze.full.call_resolution",DELTA_START:"analyze.delta.start",DELTA_NODE_KEY_FORMAT_STALE:"analyze.delta.node_key_format_stale",DELTA_HEAD_NOT_DESCENDANT:"analyze.delta.head_not_descendant",DELTA_SUMMARY:"analyze.delta.summary",DELTA_FILE_SKIPPED_OVERSIZED:"analyze.delta.file_skipped_oversized",DELTA_PARSE_FAILURE:"analyze.delta.parse_failure",DELTA_CALL_RESOLUTION:"analyze.delta.call_resolution",FOCUSED_START:"analyze.focused.start",FOCUSED_ERROR:"analyze.focused.error",FOCUSED_SUMMARY:"analyze.focused.summary",FOCUSED_PERSISTED:"analyze.focused.persisted",FOCUSED_PERSIST_SKIPPED:"analyze.focused.persist_skipped",TIER_B_START:"analyze.tierB.start",TIER_B_FULL_RESYNC_QUEUED:"analyze.tierB.full_resync_queued",TIER_B_EMPTY_QUEUE:"analyze.tierB.empty_queue",TIER_B_FILE_DROPPED_DELETED:"analyze.tierB.file_dropped_deleted",TIER_B_FILE_SKIPPED_LANGUAGE:"analyze.tierB.file_skipped_language",TIER_B_FILE_SKIPPED_NOT_APPLICABLE:"analyze.tierB.file_skipped_not_applicable",TIER_B_DEGRADED:"analyze.tierB.degraded",TIER_B_FILE_FAILED:"analyze.tierB.file_failed",TIER_B_SUMMARY:"analyze.tierB.summary",TIER_B_ERROR:"analyze.tierB.error",TIER_B_FORWARD_SEEDED:"analyze.tierB.forward_seeded",TIER_C_START:"analyze.tierC.start",TIER_C_EMPTY_QUEUE:"analyze.tierC.empty_queue",TIER_C_SKIPPED:"analyze.tierC.skipped",TIER_C_LOAD_NOTE:"analyze.tierC.load_note",TIER_C_ITEM_SUCCESS:"analyze.tierC.item_success",TIER_C_ITEM_FAILED:"analyze.tierC.item_failed",TIER_C_ITEM_EVICTED:"analyze.tierC.item_evicted",TIER_C_SUMMARY:"analyze.tierC.summary",FLUSH_STAGED_L3_DISABLED:"analyze.flushStagedL3.disabled",FLUSH_STAGED_L3_SUMMARY:"analyze.flushStagedL3.summary"},cT=`You are an expert software architect reviewing source code directly (not commit history).
|
|
153
153
|
Extract concrete implementation decisions, architectural rules, notable constraints, and rationale that are evident from the code itself \u2014 not speculative commentary.
|
|
154
154
|
Return ONLY a valid JSON array. Each item:
|
|
155
155
|
{ "title": "concise title", "nodeType": "change" | "rule" | "decision" | "context", "content": "detailed explanation grounded in what the code actually does", "confidence": 0.0 to 1.0 }
|
|
@@ -170,7 +170,7 @@ If the code contains no decision-worthy content, return an empty array \u2014 do
|
|
|
170
170
|
OUTPUT MUST BE VALID JSON ONLY. NO MARKDOWN WRAPPERS. DO NOT OUTPUT \`\`\`json.`,fT=(t,e,r)=>`Focus on the symbol \`${t}\` in the following file (\`${e}\`):
|
|
171
171
|
|
|
172
172
|
${r}`;async function V(t,e){await De(t,zi,e)}import Fi from"fs";import fp from"path";var Cw=40,Pw=2e5,Dw=".git",vw=new Set([dt,Dw,he]);function hT(t){let e=[],r=Fi.readdirSync(t,{withFileTypes:!0});for(let n of r){if(n.isDirectory()&&vw.has(n.name))continue;let i=fp.join(t,n.name);n.isDirectory()?e.push(...hT(i)):n.isFile()&&e.push(i)}return e}function mT(t,e){return t.startsWith(e+fp.sep)||t===e}function bw(t,e){try{return Fi.realpathSync(t)}catch{return e.warn(J.FILE_READ_FAILED,{filePath:t,error:"Failed to resolve symlinks for file path"}),null}}function ww(t,e){try{return Fi.readFileSync(t,H)}catch(r){return e.warn(J.FILE_READ_FAILED,{filePath:t,error:r instanceof Error?r.message:String(r)}),null}}function sn(t,e,r){let n=Fi.realpathSync(e),i=Fi.realpathSync(t);if(!mT(i,n))return r.warn(J.FILE_READ_FAILED,{filePath:t,error:`Resolved path ${i} is outside workspace root ${n}`}),{files:[],droppedFiles:[]};let o=Fi.statSync(t).isDirectory()?hT(t):[t],a=[],l=[],c=0;for(let u of o){if(!Xs(u))continue;let p=bw(u,r);if(p===null||!mT(p,n))continue;let d=fp.relative(e,u);if(a.length>=Cw){l.push(d);continue}let f=ww(u,r);if(f!==null){if(c+f.length>Pw){l.push(d);continue}c+=f.length,a.push({relativePath:d,content:f})}}return{files:a,droppedFiles:l}}async function Mi(t){let{workspaceRoot:e,logger:r,store:n,git:i}=t;r.info(J.AUTO_FULL_INGESTION),await V(e,{event:Y.FULL_START});let s=y.resolve(A.FileDiscovery,{logger:r}),o=y.resolve(A.ConfigScanner,{logger:r}),a=y.resolve(A.VcsScanner,{logger:r}),l=y.resolve(A.AstProcessor,{logger:r}),c=y.resolve(A.GraphPersister),u=y.resolve(A.HydrationService,{logger:r}),p=y.resolve(A.KnowledgeGitService,{logger:r}),d=await Ni(n.projects,i,e),f=await nl({configScanner:o,vcsScanner:a,fileDiscovery:s,filesRepo:n.files,workspaceRoot:e}),{parsedResults:m,failures:_,callResolutionByFile:O}=await Ci({astProcessor:l,graphPersister:c,store:n,workspaceRoot:e,projectId:d.id,filesToParse:f.filesToParse,skippedOversized:f.skippedOversized,tags:f.tags,appendLogLine:V,logEvents:{parseFailure:Y.FULL_PARSE_FAILURE,fileSkippedOversized:Y.FULL_FILE_SKIPPED_OVERSIZED}});if(Object.keys(O??{}).length>0){ol(n,O??{});let Q=wr(O??{});await V(e,{event:Y.FULL_CALL_RESOLUTION,...Q,files:Object.keys(O??{}).length})}await il({store:n,git:i,workspaceRoot:e,parsedResults:m});try{await vi(e,n,p),await u.markSynced(e,n)}catch(Q){let z=Q instanceof Error?Q.message:String(Q);r.warn(J.SNAPSHOT_AFTER_FULL_INGESTION_FAILED,{error:z}),await V(e,{event:Y.FULL_SNAPSHOT_FAILED,message:z})}let C=f.filesToParse.length,w=m.length,L=_.length,$=f.skippedOversized.length;return await V(e,{event:Y.FULL_SUMMARY,projectType:f.projectType,filesRequested:C,filesParsed:w,filesFailed:L,filesSkippedOversized:$}),{kind:Se.AUTO_FULL_INGESTION,projectType:f.projectType,suggestedTags:Array.from(f.tags),filesRequested:C,filesParsed:w,filesFailed:L,filesSkippedOversized:$}}import Yw from"crypto";function ET(t){return t.meta.get(S.META_KEY_NODE_KEY_FORMAT_VERSION)!=="2"}import Fw from"path";function Mt(t){return t.replace(/\\/g,"/")}function _T(t,e,r,n){let i=Mt(Fw.relative(e,r)),s=t.graph.findNodeIdByNodeKey(i);if(s!==void 0)return s;for(let o of n){let a=t.graph.findNodeIdByNodeKey(Mt(o.relativePath));if(a!==void 0)return a}}var Mw=new Set(["chore","style","ci","build","docs","test"]),kw=10,Gw=/^(wip|fixup!|squash!|typo|lint|format|merge branch)/i,xw=/^([A-Za-z]+)(\([^)]*\))?!?:\s*(.*)$/;function Uw(t){return t.split(`
|
|
173
|
-
`)[0]?.trim()??""}function Hw(t,e){let r=t?.[1]?.toLowerCase();return!!(r&&e.has(r))}function Bw(t,e){return(e?e[3]:t).trim()}function ST(t,e={}){let r=e.denylistTypes??Mw,n=e.minSubjectLength??kw,i=Uw(t);if(Gw.test(i))return!1;let s=i.match(xw);return Hw(s,r)?!1:Bw(i,s).length>=n}var Kw=1,$w=500;async function TT(t,e,r,n,i){let s=await t.getCommitLog(e,n,$w),o=[];for(let{sha:a,message:l}of s){if(a===r)break;ST(l,i)&&o.push({kind:Un.COMMIT_MESSAGE,target:a,commitSha:a,message:l})}return o}function AT(t,e,r){return r.filter(n=>n.pruningLevel===Kw).map(n=>({kind:Un.CONTRACT_SYMBOL,target:`${Mt(t)}#${n.nodeId}`,commitSha:e,file:t}))}async function mp(t){let{workspaceRoot:e,logger:r,store:n,git:i,knowledgeGit:s,projectId:o,fromSha:a,headSha:l}=t;if(ET(n))return r.info(J.NODE_KEY_FORMAT_STALE),await V(e,{event:Y.DELTA_NODE_KEY_FORMAT_STALE}),Mi({workspaceRoot:e,logger:r,store:n,git:i});if(!await i.isAncestor(e,a,l))return r.info(J.HEAD_NOT_DESCENDANT_OF_LAST_INGESTED),await V(e,{event:Y.DELTA_HEAD_NOT_DESCENDANT,fromSha:a,headSha:l}),Mi({workspaceRoot:e,logger:r,store:n,git:i});r.info(J.AUTO_DELTA_INGESTION),await V(e,{event:Y.DELTA_START,fromSha:a,headSha:l});let c=await i.getChangedFilesSince(e,a,l),{toDelete:u,toReparse:p}=Ww(c),{filesToParse:d,skippedOversized:f,tierBEntries:m,tierCSymbolEntries:_,changedBytes:O}=await jw(t,p),w=[...await TT(i,e,a,l),..._],L=[];await s.runUnderKnowledgeLock(e,async()=>{L=await Jw(t,{toDelete:u,filesToParse:d,tierBEntries:m,tierCEntries:w,changedBytes:O})});let $=d.length-L.length;return await V(e,{event:Y.DELTA_SUMMARY,fromSha:a,headSha:l,filesReparsed:$,filesDeleted:u.size,filesFailed:L.length,filesSkippedOversized:f.length,tierBQueued:m.length,tierCQueued:w.length}),{kind:Se.AUTO_DELTA,fromSha:a,headSha:l,filesReparsed:$,filesDeleted:u.size,filesFailed:L.length,filesSkippedOversized:f.length,tierBQueued:m.length,tierCQueued:w.length}}function Ww(t){let e=new Set,r=[];for(let n of t){if(n.status===Nt.DELETED){e.add(n.file);continue}n.status===Nt.RENAMED&&n.oldFile&&e.add(n.oldFile),Vn(n.file)&&r.push(n)}return{toDelete:e,toReparse:r}}async function jw(t,e){let{workspaceRoot:r,logger:n,git:i,headSha:s}=t,o=await i.listTrackedFilesWithBlobHash(r),a=y.resolve(A.SemanticDiffAnalyzer,{logger:n}),l=[],c=[],u=[],p=[],d=0;for(let f of e){let m=await i.readFileAtRef(r,s,f.file);if(m===void 0)continue;let _=Buffer.byteLength(m,H);if(_>512e3){c.push({file:f.file,sizeBytes:_}),await V(r,{event:Y.DELTA_FILE_SKIPPED_OVERSIZED,file:f.file,sizeBytes:_});continue}let O=o.get(f.file)??Yw.createHash(Zt).update(m).digest("hex");l.push({file:f.file,hash:O,code:m}),d+=_;let{contractChanged:C,findings:w}=await Vw(t,a,f,m);C&&(u.push({file:f.file,commitSha:s}),p.push(...AT(f.file,s,w)))}return{filesToParse:l,skippedOversized:c,tierBEntries:u,tierCSymbolEntries:p,changedBytes:d}}async function Vw(t,e,r,n){let{workspaceRoot:i,git:s,fromSha:o,headSha:a}=t;if(r.status!==Nt.MODIFIED&&r.status!==Nt.ADDED)return{contractChanged:!1,findings:[]};let l=r.status===Nt.ADDED?"":await s.readFileAtRef(i,o,r.file);if(l===void 0)return{contractChanged:!1,findings:[]};let c=await s.getChangedLineRanges(i,o,a,r.file);if(c.length===0)return{contractChanged:!1,findings:[]};let u=await e.analyzeFile({filePath:r.file,oldContent:l,newContent:n,changedLineRanges:c});return{contractChanged:u.some(p=>p.pruningLevel===1),findings:u}}function zw(t,e,r){t.graph.deleteNodesForPath(r),t.callSites.deleteForFile(e,r),t.files.deleteFile(e,r)}async function Jw(t,e){let{workspaceRoot:r,logger:n,store:i,projectId:s,headSha:o}=t,{toDelete:a,filesToParse:l,tierBEntries:c,tierCEntries:u,changedBytes:p}=e;a.size>0&&await i.withWriteLock(()=>{for(let m of a)zw(i,s,m)});let d=[],f;if(l.length===0&&a.size>0&&await y.resolve(A.GraphPersister).persist({store:i,workspaceRoot:r,projectId:s,parsedResults:[],tags:[]}),l.length>0){let m=y.resolve(A.AstProcessor,{logger:n}),_=y.resolve(A.GraphPersister),O=await Ci({astProcessor:m,graphPersister:_,store:i,workspaceRoot:r,projectId:s,filesToParse:l,skippedOversized:[],tags:new Set,appendLogLine:V,logEvents:{parseFailure:Y.DELTA_PARSE_FAILURE,fileSkippedOversized:Y.DELTA_FILE_SKIPPED_OVERSIZED}});d=O.failures,f=O.callResolutionByFile}if(
|
|
173
|
+
`)[0]?.trim()??""}function Hw(t,e){let r=t?.[1]?.toLowerCase();return!!(r&&e.has(r))}function Bw(t,e){return(e?e[3]:t).trim()}function ST(t,e={}){let r=e.denylistTypes??Mw,n=e.minSubjectLength??kw,i=Uw(t);if(Gw.test(i))return!1;let s=i.match(xw);return Hw(s,r)?!1:Bw(i,s).length>=n}var Kw=1,$w=500;async function TT(t,e,r,n,i){let s=await t.getCommitLog(e,n,$w),o=[];for(let{sha:a,message:l}of s){if(a===r)break;ST(l,i)&&o.push({kind:Un.COMMIT_MESSAGE,target:a,commitSha:a,message:l})}return o}function AT(t,e,r){return r.filter(n=>n.pruningLevel===Kw).map(n=>({kind:Un.CONTRACT_SYMBOL,target:`${Mt(t)}#${n.nodeId}`,commitSha:e,file:t}))}async function mp(t){let{workspaceRoot:e,logger:r,store:n,git:i,knowledgeGit:s,projectId:o,fromSha:a,headSha:l}=t;if(ET(n))return r.info(J.NODE_KEY_FORMAT_STALE),await V(e,{event:Y.DELTA_NODE_KEY_FORMAT_STALE}),Mi({workspaceRoot:e,logger:r,store:n,git:i});if(!await i.isAncestor(e,a,l))return r.info(J.HEAD_NOT_DESCENDANT_OF_LAST_INGESTED),await V(e,{event:Y.DELTA_HEAD_NOT_DESCENDANT,fromSha:a,headSha:l}),Mi({workspaceRoot:e,logger:r,store:n,git:i});r.info(J.AUTO_DELTA_INGESTION),await V(e,{event:Y.DELTA_START,fromSha:a,headSha:l});let c=await i.getChangedFilesSince(e,a,l),{toDelete:u,toReparse:p}=Ww(c),{filesToParse:d,skippedOversized:f,tierBEntries:m,tierCSymbolEntries:_,changedBytes:O}=await jw(t,p),w=[...await TT(i,e,a,l),..._],L=[];await s.runUnderKnowledgeLock(e,async()=>{L=await Jw(t,{toDelete:u,filesToParse:d,tierBEntries:m,tierCEntries:w,changedBytes:O})});let $=d.length-L.length;return await V(e,{event:Y.DELTA_SUMMARY,fromSha:a,headSha:l,filesReparsed:$,filesDeleted:u.size,filesFailed:L.length,filesSkippedOversized:f.length,tierBQueued:m.length,tierCQueued:w.length}),{kind:Se.AUTO_DELTA,fromSha:a,headSha:l,filesReparsed:$,filesDeleted:u.size,filesFailed:L.length,filesSkippedOversized:f.length,tierBQueued:m.length,tierCQueued:w.length}}function Ww(t){let e=new Set,r=[];for(let n of t){if(n.status===Nt.DELETED){e.add(n.file);continue}n.status===Nt.RENAMED&&n.oldFile&&e.add(n.oldFile),Vn(n.file)&&r.push(n)}return{toDelete:e,toReparse:r}}async function jw(t,e){let{workspaceRoot:r,logger:n,git:i,headSha:s}=t,o=await i.listTrackedFilesWithBlobHash(r),a=y.resolve(A.SemanticDiffAnalyzer,{logger:n}),l=[],c=[],u=[],p=[],d=0;for(let f of e){let m=await i.readFileAtRef(r,s,f.file);if(m===void 0)continue;let _=Buffer.byteLength(m,H);if(_>512e3){c.push({file:f.file,sizeBytes:_}),await V(r,{event:Y.DELTA_FILE_SKIPPED_OVERSIZED,file:f.file,sizeBytes:_});continue}let O=o.get(f.file)??Yw.createHash(Zt).update(m).digest("hex");l.push({file:f.file,hash:O,code:m}),d+=_;let{contractChanged:C,findings:w}=await Vw(t,a,f,m);C&&(u.push({file:f.file,commitSha:s}),p.push(...AT(f.file,s,w)))}return{filesToParse:l,skippedOversized:c,tierBEntries:u,tierCSymbolEntries:p,changedBytes:d}}async function Vw(t,e,r,n){let{workspaceRoot:i,git:s,fromSha:o,headSha:a}=t;if(r.status!==Nt.MODIFIED&&r.status!==Nt.ADDED)return{contractChanged:!1,findings:[]};let l=r.status===Nt.ADDED?"":await s.readFileAtRef(i,o,r.file);if(l===void 0)return{contractChanged:!1,findings:[]};let c=await s.getChangedLineRanges(i,o,a,r.file);if(c.length===0)return{contractChanged:!1,findings:[]};let u=await e.analyzeFile({filePath:r.file,oldContent:l,newContent:n,changedLineRanges:c});return{contractChanged:u.some(p=>p.pruningLevel===1),findings:u}}function zw(t,e,r){t.graph.deleteNodesForPath(r),t.callSites.deleteForFile(e,r),t.files.deleteFile(e,r)}async function Jw(t,e){let{workspaceRoot:r,logger:n,store:i,projectId:s,headSha:o}=t,{toDelete:a,filesToParse:l,tierBEntries:c,tierCEntries:u,changedBytes:p}=e;a.size>0&&await i.withWriteLock(()=>{for(let m of a)zw(i,s,m)});let d=[],f;if(l.length===0&&a.size>0&&await y.resolve(A.GraphPersister).persist({store:i,workspaceRoot:r,projectId:s,parsedResults:[],tags:[]}),l.length>0){let m=y.resolve(A.AstProcessor,{logger:n}),_=y.resolve(A.GraphPersister),O=await Ci({astProcessor:m,graphPersister:_,store:i,workspaceRoot:r,projectId:s,filesToParse:l,skippedOversized:[],tags:new Set,appendLogLine:V,logEvents:{parseFailure:Y.DELTA_PARSE_FAILURE,fileSkippedOversized:Y.DELTA_FILE_SKIPPED_OVERSIZED}});d=O.failures,f=O.callResolutionByFile}if(l.length>0||a.size>0){let m=f??{};zS(i,m,l.map(({file:O})=>O),a);let _=wr(m);await V(r,{event:Y.DELTA_CALL_RESOLUTION,..._,files:Object.keys(m).length})}return await i.withWriteLock(()=>{if(c.length>0&&Pi(i,c),u.length>0&&nT(i,u),p>0){let m=Number(i.meta.get(S.META_KEY_TIER_B_CHANGED_BYTES)??0);i.meta.set(S.META_KEY_TIER_B_CHANGED_BYTES,String(m+p))}i.meta.set(S.META_KEY_LAST_INGESTED_SOURCE_SHA,o)}),d}import CF from"fs";import PF from"path";async function RT(t){let{workspaceRoot:e,store:r,git:n}=t,i=await n.getHeadSha(e);if(!i)return{filesQueued:0};let o=r.files.getAllHashes().map(a=>({file:a.filePath,commitSha:i}));return await r.withWriteLock(()=>{Pi(r,o)}),{filesQueued:o.length}}import qw from"path";var Qw={".ts":B.TYPESCRIPT,".tsx":B.TYPESCRIPT,".mts":B.TYPESCRIPT,".cts":B.TYPESCRIPT,".js":B.TYPESCRIPT,".jsx":B.TYPESCRIPT,".mjs":B.TYPESCRIPT,".cjs":B.TYPESCRIPT,".py":B.PYTHON,".go":B.GO,".rs":B.RUST,".c":B.CPP,".h":B.CPP,".cpp":B.CPP,".cxx":B.CPP,".cc":B.CPP,".hpp":B.CPP,".hxx":B.CPP,".hh":B.CPP,".cu":B.CPP,".cuh":B.CPP,".java":B.JAVA,".cs":B.CSHARP,".php":B.PHP,".phtml":B.PHP,".php3":B.PHP,".php4":B.PHP,".php5":B.PHP,".phps":B.PHP,".rb":B.RUBY,".rake":B.RUBY,".gemspec":B.RUBY};function hp(t){return Qw[qw.extname(t)]}function yT(t){let e={},r=[];for(let n of t){let i=hp(n.file);if(!i){r.push(n);continue}(e[i]??=[]).push(n)}return{buckets:e,unsupported:r}}function ki(t,e=S.DEFAULT_TIER_B_COMMIT_CAP_BYTES){return Number(t.meta.get(S.META_KEY_TIER_B_CHANGED_BYTES)??0)>=e}var Xw=Object.values(pn),IT="```";function OT(t){let e=t.trim();if(!e.startsWith(IT)||!e.endsWith(IT))return t;let r=e.indexOf(`
|
|
174
174
|
`);if(r===-1)return t;let n=e.slice(0,r);if(!/^```[A-Za-z0-9_-]*$/.test(n))return t;let i=e.slice(r+1);return i.slice(0,i.length-3).trim()}function Tl(t){if(t==null)return;let e;try{e=JSON.parse(OT(t))}catch{return}if(Array.isArray(e))return e.map(r=>({title:String(r?.title??""),nodeType:Xw.includes(r?.nodeType)?r.nodeType:pn.CONTEXT,content:String(r?.content??""),confidence:typeof r?.confidence=="number"?r.confidence:0}))}function Zw(){return new Date().toISOString().slice(0,10)}function Al(t){return{date:t,calls:0,tokens:0}}function LT(t){let e=Zw(),r=t.meta.get(S.META_KEY_TIER_C_BUDGET);if(!r)return Al(e);try{let n=JSON.parse(r);return!n||typeof n.date!="string"||typeof n.calls!="number"||typeof n.tokens!="number"||n.date!==e?Al(e):n}catch{return Al(e)}}function NT(t,e){t.meta.set(S.META_KEY_TIER_C_BUDGET,JSON.stringify(e))}function Ep(t,e,r){return t.calls>=e||t.tokens>=r}function CT(t){return Math.ceil(t.length/4)}import PT from"os";import eF from"fs/promises";import DT from"path";var tF=200,rF=5e3,nF=3e4;async function vT(t){let e=DT.join(t,he,mg);try{return await eF.mkdir(DT.dirname(e),{recursive:!0}),await y.resolve(A.ProcessLock)(e,{maxWaitMs:tF,retryIntervalMs:50,heartbeatIntervalMs:rF,staleAfterMs:nF})}catch{return}}function bT(t=S.DEFAULT_TIER_C_LOAD_THRESHOLD){if(process.platform==="win32")return{ok:!0,note:"os.loadavg() returns zeros on Windows -- system-load check is a documented no-op here"};let e=PT.cpus().length||1,r=PT.loadavg()[0]/e;return r>t?{ok:!1,note:`load ratio ${r.toFixed(2)} exceeds threshold ${t}`}:{ok:!0}}var Gs={LLM_NOT_CONFIGURED:"llm-not-configured",LOCK_CONTENDED:"lock-contended",BUDGET_EXHAUSTED:"budget-exhausted",LOAD_HIGH:"load-high"},Or={NO_ANCHOR:"no-anchor",BRIDGE_UNREACHABLE:"bridge-unreachable",RATE_LIMITED:"rate-limited",AUTH_FAILED:"auth-failed",LLM_NON_JSON_OUTPUT:"llm-non-json-output",MISSING_FILE:"missing-file",FILE_UNREADABLE:"file-unreadable"};function _p(t){return{tierCQueued:t.queued,tierCProcessed:t.processed,tierCPersisted:t.persisted,tierCDeduped:t.deduped,tierCFailed:t.failed,tierCSkipped:t.skipped,tierCSkippedReason:t.reason}}async function ks(t,e,r){return t.logger.info(J.TIER_C_SKIPPED(r)),await V(t.workspaceRoot,{event:Y.TIER_C_SKIPPED,reason:r,queued:e}),_p({queued:e,processed:0,persisted:0,deduped:0,failed:0,skipped:!0,reason:r})}async function iF(t,e,r){let n=!1,i=null;try{let s=y.resolve(A.KnowledgeGitService,{logger:t.logger});i=await t.git.getHeadSha(r)??null,n=!!(i&&typeof s.hasSourceCommitInHistory=="function"&&await s.hasSourceCommitInHistory(r,i))}catch{}return!!(n&&e.l3.getAllExportable().some(o=>o.commit_hash===i)&&!t.force)}async function wT(t){let{workspaceRoot:e,store:r}=t,n=lr(r);if(await V(e,{event:Y.TIER_C_START,queued:n.length}),n.length===0)return await V(e,{event:Y.TIER_C_EMPTY_QUEUE}),_p({queued:0,processed:0,persisted:0,deduped:0,failed:0,skipped:!1});if(await iF(t,r,e))return await ks(t,n.length,"already-snapshotted-with-tier-c");if(!t.llmBaseUrl||!t.llmModel)return await ks(t,n.length,Gs.LLM_NOT_CONFIGURED);let s=await vT(e);if(!s)return await ks(t,n.length,Gs.LOCK_CONTENDED);try{return await sF(t,n)}finally{await s.release()}}async function sF(t,e){let{workspaceRoot:r,store:n}=t,i=t.dailyCallCap??S.DEFAULT_TIER_C_DAILY_CALL_CAP,s=t.dailyTokenCap??S.DEFAULT_TIER_C_DAILY_TOKEN_CAP,o=LT(n);if(Ep(o,i,s))return await ks(t,e.length,Gs.BUDGET_EXHAUSTED);let a=bT(t.loadThreshold);return a.note&&await V(r,{event:Y.TIER_C_LOAD_NOTE,note:a.note}),a.ok?await aF(t,e,o,i,s):await ks(t,e.length,Gs.LOAD_HIGH)}function on(t){return{success:!1,reason:t,persistedCount:0,dedupedCount:0,tokensUsed:0,callsUsed:0}}function oF(t){return t.drainAll?{wallClockMs:Number.POSITIVE_INFINITY,itemCap:Number.POSITIVE_INFINITY}:{wallClockMs:t.wallClockMs??S.DEFAULT_TIER_C_WALL_CLOCK_MS,itemCap:t.itemCap??S.DEFAULT_TIER_C_ITEM_CAP}}async function aF(t,e,r,n,i){let{store:s,workspaceRoot:o,logger:a}=t,{wallClockMs:l,itemCap:c}=oF(t),u=Date.now()+l,d=y.resolve(A.LlmClient)();d.initialize({baseUrl:t.llmBaseUrl,apiKey:t.llmApiKey});let f=r,m={processed:0,persisted:0,deduped:0,failed:0};for(let _ of e){if(m.processed+m.failed>=c||Date.now()>=u)break;if(Ep(f,n,i)){await V(o,{event:Y.TIER_C_SKIPPED,reason:Gs.BUDGET_EXHAUSTED,queued:e.length,midRun:!0});break}let O=await hF(t,d,_);if(f=await lF(s,f,O),await cF(t,_,O,m))break}return await V(o,{event:Y.TIER_C_SUMMARY,queued:e.length,...m}),a.info(J.TIER_C_SUMMARY(m.processed,m.persisted)),m.processed>0&&await s.withWriteLock(()=>{s.meta.set("tierCProcessedThisRun","true")}),_p({queued:e.length,...m,skipped:!1})}async function lF(t,e,r){if(r.callsUsed===0&&r.tokensUsed===0)return e;let n={date:e.date,calls:e.calls+r.callsUsed,tokens:e.tokens+r.tokensUsed};return await t.withWriteLock(()=>NT(t,n)),n}async function cF(t,e,r,n){let{store:i,workspaceRoot:s}=t;if(r.success)return n.processed++,n.persisted+=r.persistedCount,n.deduped+=r.dedupedCount,await i.withWriteLock(()=>iT(i,[e.target])),await V(s,{event:Y.TIER_C_ITEM_SUCCESS,kind:e.kind,target:e.target,persisted:r.persistedCount,deduped:r.dedupedCount}),!1;n.failed++,await V(s,{event:Y.TIER_C_ITEM_FAILED,kind:e.kind,target:e.target,reason:r.reason});let o=t.itemFailureCap??S.DEFAULT_TIER_C_MAX_ITEM_FAILURES,{evicted:a,failCount:l}=await i.withWriteLock(()=>sT(i,e.target,o));return a&&(t.logger.warn(J.TIER_C_ITEM_EVICTED(e.kind,e.target,l)),await V(s,{event:Y.TIER_C_ITEM_EVICTED,kind:e.kind,target:e.target,failCount:l,reason:r.reason})),!1}function uF(t){return t instanceof E&&t.code===T.LLM_CHAT_COMPLETION_FAILED}function dF(t){return t instanceof E&&t.code===T.LLM_RATE_LIMITED}function pF(t){return t instanceof E&&t.code===T.LLM_AUTH_FAILED}function FT(t){return dF(t)?Or.RATE_LIMITED:pF(t)?Or.AUTH_FAILED:uF(t)?Or.BRIDGE_UNREACHABLE:gF(t)}function gF(t){return t instanceof Error?t.message:String(t)}function fF(t){return t.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g,"").slice(0,dT)}async function MT(t,e,r,n){let s=(await t.chatCompletion({model:e,temperature:.2,messages:[{role:Xt.SYSTEM,content:r},{role:Xt.USER,content:n}]})).choices[0]?.message.content,o=Tl(s),a=CT(r+n+(s??""));return{decisions:o,tokensUsed:a}}function mF(t,e){for(let r of e){let n=t.graph.findNodeIdByNodeKey(Mt(r));if(n!==void 0)return n}}function kT(t,e,r,n,i){let{store:s,llmModel:o}=t,a=s.projects.getFirst();if(!a)return{persisted:0,deduped:0};let l=r.map(Mt),c=0,u=0;for(let p of i)s.l3.upsertDecision({projectId:a.id,l2NodeId:e,title:p.title,content:p.content,nodeType:p.nodeType,confidence:p.confidence,commitSha:n,extractionModel:o??null,sourceFiles:l}).deduped?u++:c++;return{persisted:c,deduped:u}}async function hF(t,e,r){return r.kind===Un.COMMIT_MESSAGE?EF(t,e,r):_F(t,e,r)}async function EF(t,e,r){let{git:n,workspaceRoot:i,store:s,llmModel:o}=t,a=await n.getFilesChangedByCommit(i,r.commitSha),l=mF(s,a);if(l===void 0)return on(Or.NO_ANCHOR);let c;try{c=await MT(e,o,uT,pT(fF(r.message??"")))}catch(d){return{...on(FT(d)),callsUsed:1}}if(c.decisions===void 0)return{...on(Or.LLM_NON_JSON_OUTPUT),tokensUsed:c.tokensUsed,callsUsed:1};let{persisted:u,deduped:p}=kT(t,l,a,r.commitSha,c.decisions);return{success:!0,persistedCount:u,dedupedCount:p,tokensUsed:c.tokensUsed,callsUsed:1}}async function _F(t,e,r){let{git:n,workspaceRoot:i,store:s,llmModel:o}=t,a=r.file;if(!a)return on(Or.MISSING_FILE);let l=s.graph.findNodeIdByNodeKey(r.target)??s.graph.findNodeIdByNodeKey(Mt(a));if(l===void 0)return on(Or.NO_ANCHOR);let c=await n.readFileAtRef(i,S.HEAD_REF,a);if(c===void 0)return on(Or.FILE_UNREADABLE);let u=r.target.slice(r.target.indexOf("#")+1),p=fT(u,a,c),d;try{d=await MT(e,o,gT,p)}catch(_){return{...on(FT(_)),callsUsed:1}}if(d.decisions===void 0)return{...on(Or.LLM_NON_JSON_OUTPUT),tokensUsed:d.tokensUsed,callsUsed:1};let{persisted:f,deduped:m}=kT(t,l,[a],r.commitSha,d.decisions);return{success:!0,persistedCount:f,dedupedCount:m,tokensUsed:d.tokensUsed,callsUsed:1}}import SF from"path";import TF from"crypto";import AF from"fs/promises";function RF(t,e,r,n){for(let i of t.edges)e.push(i);for(let i of t.filesProcessed)r.push(i);for(let i of t.filesFailed)n.push(i)}function yF(t,e){let r=new Set(e.map(a=>a.languageId)),n=Object.keys(t).filter(a=>(t[a]?.length??0)>0),i=n.length>0&&n.every(a=>r.has(a)),s=e.length>0&&!i;return s||e.length===0?{unavailableReason:void 0,fullyDegraded:i,strayLanguageDegraded:s}:{unavailableReason:e.length===1?e[0].reason:e.map(a=>`${a.languageId}: ${a.reason}`).join("; "),fullyDegraded:i,strayLanguageDegraded:s}}async function GT(t,e){let{workspaceRoot:r,logger:n,providerConfig:i,store:s,git:o}=e,a=y.resolve(A.EdgeResolutionProviders,{logger:n}),l=[],c=[],u=[],p=[];for(let _ of Object.keys(t)){let O=t[_];if(!O||O.length===0)continue;let C=a[_];if(!C){p.push({languageId:_,reason:`no LSP provider registered for language "${_}"`});continue}let w=C();i&&w.configure(i);let L=_===B.TYPESCRIPT?await NF(s,o,r,O,n):void 0,$=await w.resolveEdges({workspaceRoot:r,files:O.map(Q=>Q.file),callsByFile:L});RF($,l,c,u),$.unavailableReason&&p.push({languageId:_,reason:$.unavailableReason})}let{unavailableReason:d,fullyDegraded:f,strayLanguageDegraded:m}=yF(t,p);return{edges:l,filesProcessed:c,filesFailed:u,unavailableReason:d,degradedLanguages:p,fullyDegraded:f,strayLanguageDegraded:m}}function IF(t){return t.split("\\").join("/")}async function OF(t,e,r,n){let i=IF(e);if(!r.has(i)&&n.has(i))return n.get(i);try{let s=await AF.readFile(SF.join(t,e),H);return TF.createHash(Zt).update(s).digest("hex")}catch{return}}async function LF(t,e){try{let[r,n,i]=await Promise.all([t.listTrackedFilesWithBlobHash(e),t.listUntrackedFiles(e),t.listModifiedFiles(e)]);return{dirtyFiles:new Set([...n,...i]),blobHashes:r}}catch{return{dirtyFiles:new Set,blobHashes:new Map}}}async function NF(t,e,r,n,i){let s=t.projects.getFirst();if(!s)return;let o=n.map(_=>_.file),a=t.callSites.getForFiles(s.id,o),l=o.length;if(a.size===0){i.info(J.TIER_B_FORWARD_SEEDED(B.TYPESCRIPT,0,l,0)),await V(r,{event:Y.TIER_B_FORWARD_SEEDED,languageId:B.TYPESCRIPT,seeded:0,total:l,staleSkipped:0});return}let c=new Map(t.files.getAllHashes().map(_=>[_.filePath,_.contentHash])),{dirtyFiles:u,blobHashes:p}=await LF(e,r),d={},f=0,m=0;for(let _ of o){let O=a.get(_);if(!O||O.length===0)continue;let C=c.get(_),w=await OF(r,_,u,p);if(!C||!w||C!==w){m++;continue}d[_]=O,f++}return i.info(J.TIER_B_FORWARD_SEEDED(B.TYPESCRIPT,f,l,m)),await V(r,{event:Y.TIER_B_FORWARD_SEEDED,languageId:B.TYPESCRIPT,seeded:f,total:l,staleSkipped:m}),f>0?d:void 0}var Sp=50;async function UT(t){let e=await DF(t),r=await wT({workspaceRoot:t.workspaceRoot,logger:t.logger,store:t.store,git:t.git,llmBaseUrl:t.llmBaseUrl,llmApiKey:t.llmApiKey,llmModel:t.llmModel,dailyCallCap:t.tierCDailyCallCap,dailyTokenCap:t.tierCDailyTokenCap,wallClockMs:t.tierCWallClockMs,itemCap:t.tierCItemCap,loadThreshold:t.tierCLoadThreshold,force:t.force,drainAll:t.tierCDrainAll});return{...e,...r}}async function DF(t){let{workspaceRoot:e,logger:r,store:n,git:i,knowledgeGit:s}=t;r.info(J.TIER_B_STARTING),await V(e,{event:Y.TIER_B_START});let o=await i.getHeadSha(e)??null,a=ki(n,t.commitCap);if(t.full){let{filesQueued:z}=await RT({workspaceRoot:e,store:n,git:i});r.info(J.TIER_B_FULL_RESYNC_QUEUED(z)),await V(e,{event:Y.TIER_B_FULL_RESYNC_QUEUED,filesQueued:z})}let l=Fs(n);if(l.length===0)return r.info(J.TIER_B_EMPTY_QUEUE),await V(e,{event:Y.TIER_B_EMPTY_QUEUE}),wF(o,a);let{buckets:c,toProcess:u,droppedDeleted:p,skippedLanguage:d}=await FF(t,l);if(await GF(e,p,d),u.length===0)return await xT(t,{headSha:o,commitCapExceeded:a,queued:l.length,droppedDeleted:p.length,skippedLanguage:d.length,outcome:{edges:[],filesProcessed:[],filesFailed:[],degradedLanguages:[],fullyDegraded:!1,strayLanguageDegraded:!1},failedEntries:[],permanentFailed:[],skippedNotApplicable:[],edgesApplied:0,edgesPruned:0});let f=await xF(t,c);await MF(e,f.filesFailed),f.unavailableReason&&(await V(e,{event:Y.TIER_B_DEGRADED,level:Sp,reason:f.unavailableReason,degradedLanguages:f.degradedLanguages}),r.info(J.TIER_B_DEGRADED(f.unavailableReason)));let{edgesApplied:m,edgesPruned:_}=await UF(t,f,o),O=new Set(f.filesProcessed),{failedEntries:C,permanentFailed:w,skippedNotApplicable:L}=kF(u,O,f.filesFailed),$=O.size>0||m>0||L.length>0,Q=vF(n,u,f,$,C,w,bF(c,f));return await xT(t,{headSha:o,commitCapExceeded:a,queued:l.length,droppedDeleted:p.length,skippedLanguage:d.length,outcome:f,failedEntries:C,permanentFailed:w,skippedNotApplicable:L,edgesApplied:m,edgesPruned:_,zeroProgressWatchdogTripped:Q,degradedReason:f.unavailableReason})}function vF(t,e,r,n,i,s,o){let a=S.META_KEY_TIER_B_ZERO_PROGRESS_BATCHES,l=t.meta.get(a),c=l&&parseInt(l,10)||0;if(e.length===0)return!1;if(n)return t.meta.set(a,"0"),!1;if(r.fullyDegraded)return!1;let u=i.filter(d=>!o.has(d.file));if(u.length===0)return!1;let p=c+1;if(p<S.DEFAULT_TIER_B_ZERO_PROGRESS_MAX_BATCHES)return t.meta.set(a,String(p)),!1;for(let d of u){s.push(d);let f=i.indexOf(d);f>=0&&i.splice(f,1)}return t.meta.set(a,"0"),!0}function bF(t,e){let r=new Set;if(e.degradedLanguages.length===0)return r;let n=new Set(e.degradedLanguages.map(i=>i.languageId));for(let[i,s]of Object.entries(t))if(!(!s||s.length===0||!n.has(i)))for(let o of s)r.add(o.file);return r}function wF(t,e){return{kind:Se.TIER_B_BATCH,headSha:t,filesQueued:0,filesDroppedDeleted:0,filesSkippedLanguage:0,filesSkippedNotApplicable:0,filesProcessed:0,filesFailed:0,filesFailedPermanent:0,edgesApplied:0,edgesPruned:0,degraded:!1,commitCapExceeded:e}}async function FF(t,e){let{workspaceRoot:r}=t,n=[],i=[];for(let a of e)CF.existsSync(PF.join(r,a.file))?n.push(a):i.push(a);let{buckets:s,unsupported:o}=yT(n);return{buckets:s,toProcess:Object.values(s).flatMap(a=>a??[]),droppedDeleted:i,skippedLanguage:o}}async function MF(t,e){for(let r of e)await V(t,{event:r.notApplicable?Y.TIER_B_FILE_SKIPPED_NOT_APPLICABLE:Y.TIER_B_FILE_FAILED,...r.notApplicable?{}:{level:Sp},file:r.file,reason:r.reason,retryable:r.retryable})}function kF(t,e,r){let n=new Map(r.map(a=>[a.file,a])),i=[],s=[];return{failedEntries:t.filter(a=>{if(e.has(a.file))return!1;let l=n.get(a.file);return l?.notApplicable?(s.push(a),!1):l?.retryable===!1?(i.push(a),!1):!0}),permanentFailed:i,skippedNotApplicable:s}}async function GF(t,e,r){for(let n of e)await V(t,{event:Y.TIER_B_FILE_DROPPED_DELETED,file:n.file});for(let n of r)await V(t,{event:Y.TIER_B_FILE_SKIPPED_LANGUAGE,file:n.file})}async function xF(t,e){let{workspaceRoot:r,logger:n,providerConfig:i,store:s,git:o}=t;return GT(e,{workspaceRoot:r,logger:n,providerConfig:i,store:s,git:o})}async function UF(t,e,r){let{store:n,knowledgeGit:i,workspaceRoot:s}=t,o=0,a=0;return await i.runUnderKnowledgeLock(s,async()=>{await n.withWriteLock(()=>{let l=new Set(n.graph.getAllLinks().map(u=>`${u.source_node_id}->${u.target_node_id}->${u.link_type}`));for(let u of e.edges){let p=n.graph.findNodeIdByNodeKey(u.sourceNodeKey),d=n.graph.findNodeIdByNodeKey(u.targetNodeKey);if(p===void 0||d===void 0)continue;let f=`${p}->${d}->${ce.CALLS}`;l.has(f)||(l.add(f),n.graph.insertLink({sourceNodeId:p,targetNodeId:d,linkType:ce.CALLS}),o++)}a=n.graph.pruneOrphanedLinks();let c=n.projects.getFirst();if(c)for(let u of e.filesProcessed)n.files.markTierBProcessed({projectId:c.id,filePath:u,commitSha:r})})}),{edgesApplied:o,edgesPruned:a}}async function xT(t,e){let{workspaceRoot:r,logger:n,store:i,knowledgeGit:s}=t,{headSha:o,outcome:a,failedEntries:l,permanentFailed:c,skippedNotApplicable:u}=e,p=[...c,...u];if(o&&p.length>0){let f=i.projects.getFirst();if(f)for(let m of p)i.files.markTierBProcessed({projectId:f.id,filePath:m.file,commitSha:o})}if(o){let f={headSha:o,remainingQueue:l};await s.runUnderKnowledgeLock(r,async()=>{await i.withWriteLock(()=>{i.meta.set(S.META_KEY_TIER_B_BATCH_PENDING,JSON.stringify(f))})})}let d=a.filesProcessed.length;return await V(r,{event:Y.TIER_B_SUMMARY,...a.unavailableReason?{level:Sp}:{},headSha:o,filesQueued:e.queued,filesDroppedDeleted:e.droppedDeleted,filesSkippedLanguage:e.skippedLanguage,filesSkippedNotApplicable:u.length,filesProcessed:d,filesFailed:l.length,filesFailedPermanent:c.length,edgesApplied:e.edgesApplied,edgesPruned:e.edgesPruned,degraded:!!a.unavailableReason,degradedLanguages:a.degradedLanguages,strayLanguageDegraded:a.strayLanguageDegraded,fullyDegraded:a.fullyDegraded,zeroProgressWatchdogTripped:e.zeroProgressWatchdogTripped,commitCapExceeded:e.commitCapExceeded}),n.info(J.TIER_B_SUMMARY(d,e.edgesApplied,c.length,u.length)),{kind:Se.TIER_B_BATCH,headSha:o,filesQueued:e.queued,filesDroppedDeleted:e.droppedDeleted,filesSkippedLanguage:e.skippedLanguage,filesSkippedNotApplicable:u.length,filesProcessed:d,filesFailed:l.length,filesFailedPermanent:c.length,edgesApplied:e.edgesApplied,edgesPruned:e.edgesPruned,degraded:!!a.unavailableReason,degradedReason:e.degradedReason,degradedLanguages:a.degradedLanguages.length>0?a.degradedLanguages:void 0,strayLanguageDegraded:a.strayLanguageDegraded,fullyDegraded:a.fullyDegraded,zeroProgressWatchdogTripped:e.zeroProgressWatchdogTripped,commitCapExceeded:e.commitCapExceeded}}function HT(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function BT(t){return(t??"").trim().replace(/\s+/g," ")}function KT(t,e){let r=t.filter(i=>i.validity_status!==ur.GARBAGE),n=[];for(let i of e){let s=HT(i.title),o=BT(i.content);for(let a of r)HT(a.title)===s&&BT(a.content)!==o&&n.push({stagedTitle:i.title,existingId:a.id,existingTitle:a.title,existingSource:a.source,existingCommitHash:a.commit_hash})}return n}async function $T(t){let{git:e,workspaceRoot:r,commitSha:n,sourceFiles:i}=t;if(!n||i.length===0)return null;let s=`${n}^`,o=[];for(let a of i){let l=await e.getChangedLineRanges(r,s,n,a);for(let c of l)o.push({path:a,startRow:c.startRow,endRow:c.endRow})}return o}async function Gi(t){let{workspaceRoot:e,logger:r,resolvedTargetPath:n,files:i,decisions:s,source:o,extractionModel:a,commitSha:l}=t;if(s.length===0)return{persisted:0,deduped:0,noGraphToAttach:!1};let c=await BF(e,r);if(c===null)return{persisted:0,deduped:0,noGraphToAttach:!0};try{let u=c.projects.getFirst();if(!u)return await Tp(e,r),{persisted:0,deduped:0,noGraphToAttach:!0};let p=_T(c,e,n,i);if(p===void 0)return await Tp(e,r),{persisted:0,deduped:0,noGraphToAttach:!0};t.writerEnhancements?.warnOnAnchorContradictions&&HF(c.l3.getByL2NodeId(p),s,r);let d=await KF({workspaceRoot:e,store:c,projectId:u.id,anchorL2NodeId:p,files:i,decisions:s,source:o,extractionModel:a,commitSha:l,captureAnchorRanges:t.writerEnhancements?.captureAnchorRanges===!0});return await V(e,{event:Y.FOCUSED_PERSISTED,persisted:d.persisted,deduped:d.deduped}),{...d,noGraphToAttach:!1}}finally{await c.close()}}function HF(t,e,r){for(let n of KT(t,e))r.warn(J.L3_ANCHOR_CONTRADICTION(n.stagedTitle,n.existingSource,n.existingCommitHash),{stagedTitle:n.stagedTitle,existingId:n.existingId,existingTitle:n.existingTitle,existingSource:n.existingSource,existingCommitHash:n.existingCommitHash})}async function BF(t,e){let r=y.resolve(A.GraphStoreOpener);try{return await r({dbPath:ie(t),readonly:!1})}catch(n){if(n instanceof E&&n.code===T.DB_OPEN_FAILED)return await Tp(t,e),null;throw n}}async function KF(t){let{workspaceRoot:e,store:r,projectId:n,anchorL2NodeId:i,files:s,decisions:o,source:a,extractionModel:l}=t,c=t.commitSha??await y.resolve(A.GitProvider).getHeadSha(e)??null,u=s.map(m=>Mt(m.relativePath)),p=t.captureAnchorRanges?await $T({git:y.resolve(A.GitProvider),workspaceRoot:e,commitSha:c,sourceFiles:u}):null,d=0,f=0;for(let m of o)r.l3.upsertDecision({projectId:n,l2NodeId:i,title:m.title,content:m.content,nodeType:m.nodeType,confidence:m.confidence,commitSha:c,extractionModel:l,sourceFiles:u,source:a,...t.captureAnchorRanges?{anchorRanges:p}:{}}).deduped?f++:d++;return{persisted:d,deduped:f}}async function Tp(t,e){e.warn(J.NO_GRAPH_TO_ATTACH),await V(t,{event:Y.FOCUSED_PERSIST_SKIPPED,message:J.NO_GRAPH_TO_ATTACH})}import YT from"fs";import xs from"path";function $F(t,e){let r=xs.relative(e,t);return r===""||r!==".."&&!r.startsWith(`..${xs.sep}`)&&!xs.isAbsolute(r)}async function WT(t){let{workspaceRoot:e,logger:r,targetPath:n,decisions:i}=t;r.info(J.EXTRACTING(n)),await V(e,{event:Y.FOCUSED_START,targetPath:n,source:xt.AGENT_AUTHORED});let s=xs.resolve(e),o=xs.resolve(s,n);if(!$F(o,s)){let p=J.PATH_NOT_FOUND(n);throw await V(e,{event:Y.FOCUSED_ERROR,targetPath:n,message:p}),new E(T.INVALID_INPUT,p)}if(!YT.existsSync(o)){let p=J.PATH_NOT_FOUND(n);throw await V(e,{event:Y.FOCUSED_ERROR,targetPath:n,message:p}),new E(T.FS_READ_FAILED,p)}if(i.length===0)return await V(e,{event:Y.FOCUSED_SUMMARY,targetPath:n,decisionsCount:0}),{kind:Se.DECISION_EXTRACTION,targetPath:n,decisions:[],persisted:0,deduped:0};let{files:a,droppedFiles:l}=sn(o,e,r);if(l.length>0&&r.warn(J.FILES_DROPPED(l.length),{droppedFiles:l,targetPath:n}),a.length===0&&!YT.statSync(o).isDirectory())throw new E(T.INVALID_INPUT,J.AGENT_AUTHORED_ANCHOR_UNRESOLVABLE(n));let{persisted:c,deduped:u}=await Gi({workspaceRoot:e,logger:r,resolvedTargetPath:o,files:a,decisions:i,source:xt.AGENT_AUTHORED,extractionModel:null});return await V(e,{event:Y.FOCUSED_SUMMARY,targetPath:n,decisionsCount:i.length}),{kind:Se.DECISION_EXTRACTION,targetPath:n,decisions:i,persisted:c,deduped:u}}import VF from"fs";import zF from"path";import Ap from"fs/promises";import{statSync as YF}from"fs";import Rp from"path";var jT={CORRUPT_FILE:t=>`Could not parse ${t} -- treating staged L3 decisions as empty`};function VT(t){return Rp.join(t,he,_g)}function WF(t){return typeof t=="object"&&t!==null&&Array.isArray(t.decisions)}async function xi(t,e){let r=VT(t),n;try{n=await Ap.readFile(r,H)}catch{return[]}let i;try{i=JSON.parse(n)}catch{return e.warn(jT.CORRUPT_FILE(r)),[]}return WF(i)?i.decisions:(e.warn(jT.CORRUPT_FILE(r)),[])}async function zT(t,e,r,n){let i=ul(e,t);if(i.status==="outside")throw new E(T.INVALID_INPUT,J.PATH_NOT_FOUND(e));if(i.status==="missing")throw new E(T.FS_READ_FAILED,J.PATH_NOT_FOUND(e));let s=i.resolvedPath,o;try{o=YF(s).isDirectory()}catch{throw new E(T.FS_READ_FAILED,J.PATH_NOT_FOUND(e))}let{files:a}=sn(s,t,n);if(!o&&a.length===0)throw new E(T.INVALID_INPUT,J.AGENT_AUTHORED_ANCHOR_UNRESOLVABLE(e));let l=Mt(Rp.relative(t,s)),c=await xi(t,n),u=new Date().toISOString(),p=r.map(d=>({filePath:l,title:d.title,content:d.content,nodeType:d.nodeType,confidence:d.confidence,stagedAt:u}));return await yp(t,[...c,...p]),{staged:p.length}}async function yp(t,e){await Ap.mkdir(Rp.join(t,he),{recursive:!0}),await Ap.writeFile(VT(t),`${JSON.stringify({decisions:e},null,2)}
|
|
175
175
|
`,H)}import Ip from"fs/promises";import qT from"path";var JT={CORRUPT_FILE:t=>`Could not parse ${t} -- falling back to the default hooks config`};function QT(t){return qT.join(t,he,Eg)}function jF(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}async function Ui(t,e){let r=QT(t),n;try{n=await Ip.readFile(r,H)}catch{return{...Vi}}let i;try{i=JSON.parse(n)}catch{return e.warn(JT.CORRUPT_FILE(r)),{...Vi}}if(!jF(i))return e.warn(JT.CORRUPT_FILE(r)),{...Vi};let s={...Vi};for(let o of Object.values(pr)){let a=i[o];typeof a=="boolean"&&(s[o]=a)}return s}async function XT(t,e,r,n){let s={...await Ui(t,n),[e]:r};await Ip.mkdir(qT.join(t,he),{recursive:!0}),await Ip.writeFile(QT(t),`${JSON.stringify(s,null,2)}
|
|
176
176
|
`,H)}function Us(t,e,r){return{kind:Se.FLUSH_STAGED_L3,skippedDisabled:t,flushed:0,deduped:0,stillPending:e,commitSha:r,noGraphToAttach:!1}}function JF(t){let e=new Map;for(let r of t){let n=e.get(r.filePath);n?n.push(r):e.set(r.filePath,[r])}return e}function qF(t,e){let r=[],n=[];for(let i of t)e.has(i.filePath)?r.push(i):n.push(i);return{toFlush:r,stillPending:n}}function QF(t){return t.map(e=>({title:e.title,content:e.content,nodeType:e.nodeType,confidence:e.confidence}))}async function XF(t,e,r,n,i){let s=zF.resolve(t,r);if(!VF.existsSync(s))return e.warn(J.FLUSH_STAGED_L3_FILE_DELETED(r),{droppedCount:n.length}),{persisted:0,deduped:0,dropped:n,retry:[],noGraphToAttach:!1};let{files:o,droppedFiles:a}=sn(s,t,e);a.length>0&&e.warn(J.FILES_DROPPED(a.length),{droppedFiles:a,filePath:r});let l=await Gi({workspaceRoot:t,logger:e,resolvedTargetPath:s,files:o,decisions:QF(n),source:xt.AGENT_AUTHORED,extractionModel:null,commitSha:i,writerEnhancements:{warnOnAnchorContradictions:!0,captureAnchorRanges:!0}});return l.persisted+l.deduped===0?{persisted:0,deduped:0,dropped:[],retry:n,noGraphToAttach:l.noGraphToAttach}:{persisted:l.persisted,deduped:l.deduped,dropped:[],retry:[],noGraphToAttach:!1}}async function ZT(t){let{workspaceRoot:e,logger:r}=t;if(!(await Ui(e,r))[pr.COMMIT_L3_WRITE])return r.info(J.FLUSH_STAGED_L3_DISABLED),await V(e,{event:Y.FLUSH_STAGED_L3_DISABLED}),Us(!0,0,null);let i=await xi(e,r);if(i.length===0)return r.info(J.FLUSH_STAGED_L3_EMPTY),Us(!1,0,null);let s=y.resolve(A.GitProvider),o=await s.getHeadSha(e);if(!o)return Us(!1,i.length,null);let a=new Set(await s.getFilesChangedByCommit(e,o)),{toFlush:l,stillPending:c}=qF(i,a);if(l.length===0)return await V(e,{event:Y.FLUSH_STAGED_L3_SUMMARY,flushed:0,stillPending:c.length,commitSha:o}),Us(!1,c.length,o);let u=JF(l),p=0,d=0,f=0,m=0,_=[];try{for(let[C,w]of u){let L=await XF(e,r,C,w,o);p+=L.persisted,d+=L.deduped,f+=L.dropped.length,m+=Number(L.noGraphToAttach),_.push(...L.retry)}}catch(C){let w=C instanceof Error?C.message:String(C);return r.warn(J.FLUSH_STAGED_L3_ERROR(w)),await V(e,{event:Y.FLUSH_STAGED_L3_SUMMARY,error:w,commitSha:o}),Us(!1,i.length,o)}let O=[...c,..._];return await yp(e,O),r.info(J.FLUSH_STAGED_L3_SUMMARY(p,O.length)),await V(e,{event:Y.FLUSH_STAGED_L3_SUMMARY,flushed:p,deduped:d,stillPending:O.length,droppedDeleted:f,commitSha:o}),{kind:Se.FLUSH_STAGED_L3,skippedDisabled:!1,flushed:p,deduped:d,stillPending:O.length,commitSha:o,noGraphToAttach:m>0}}var an=class{constructor(e,r,n){this.workspaceRoot=e;this.logger=r;this.options=n}workspaceRoot;logger;options;async execute(){return this.options?.flushStagedL3?ZT({workspaceRoot:this.workspaceRoot,logger:this.logger}):this.options?.agentAuthoredDecisions?WT({workspaceRoot:this.workspaceRoot,logger:this.logger,targetPath:this.options.targetPath,decisions:this.options.agentAuthoredDecisions}):this.options?.targetPath?this.executeDecisionExtraction(this.options.targetPath):this.options?.escalateToLsp?this.executeTierBBatch():this.executeAutoMode()}async executeTierBBatch(){let{workspaceRoot:e,logger:r,options:n}=this,i;try{let s=y.resolve(A.GitProvider),o=y.resolve(A.KnowledgeGitService,{logger:r});return i=await y.resolve(A.GraphStoreOpener)({dbPath:ie(e),readonly:!1}),await UT(iM(e,r,i,s,o,n))}catch(s){let o=s instanceof Error?s.message:String(s);throw await V(e,{event:Y.TIER_B_ERROR,message:o}),s}finally{await i?.close()}}async executeAutoMode(){let{workspaceRoot:e,logger:r}=this;r.info(J.AUTO_ANALYZING),await V(e,{event:Y.AUTO_START});let n;try{let i=y.resolve(A.GitProvider),s=y.resolve(A.KnowledgeGitService,{logger:r});return n=await y.resolve(A.GraphStoreOpener)({dbPath:ie(e),readonly:!1}),await this.dispatchAutoMode(n,i,s)}catch(i){let s=i instanceof Error?i.message:String(i);throw await V(e,{event:Y.AUTO_ERROR,message:s}),i}finally{await n?.close()}}async dispatchAutoMode(e,r,n){let{workspaceRoot:i,logger:s}=this,o=await r.getHeadSha(i),a=e.meta.get(S.META_KEY_LAST_INGESTED_SOURCE_SHA);if(await this.maybeLogTierBCommitCapNudge(e),o&&a&&o===a){let p=await r.hasUncommittedChanges(i);return s.info(p?J.AUTO_NOOP_DIRTY_WORKTREE:J.AUTO_NOOP),await V(i,{event:Y.DELTA_NOOP,headSha:o,dirtyWorktree:p}),{kind:Se.AUTO_DELTA_NOOP,headSha:o,dirtyWorktree:p}}let l=e.projects.getFirst(),{l2Nodes:c}=e.graph.count();if(!l||c===0)return await this.dispatchEmptyGraph(e,r,n,o);if(!o)return await V(i,{event:Y.DELTA_NO_HEAD}),{kind:Se.AUTO_DELTA_NOOP,headSha:null,dirtyWorktree:!1};let u=a;return u||(u=await n.resolveNewestSourceTrailerSha(i)),u?await mp({workspaceRoot:i,logger:s,store:e,git:r,knowledgeGit:n,projectId:l.id,fromSha:u,headSha:o}):await Mi({workspaceRoot:i,logger:s,store:e,git:r})}async dispatchEmptyGraph(e,r,n,i){let{workspaceRoot:s,logger:o}=this,a=i?await this.tryHydrateThenDelta(e,r,n,i):void 0;return a||await Mi({workspaceRoot:s,logger:o,store:e,git:r})}async tryHydrateThenDelta(e,r,n,i){let{workspaceRoot:s,logger:o}=this,a=y.resolve(A.HydrationService,{logger:o}),l=await a.resolveHydrationCommit(s);if(!l)return;let c=await tM(r,s,l);if(!c||!(await a.hydrate(s,e)).hydrated)return;let p=await Ni(e.projects,r,s);return await mp({workspaceRoot:s,logger:o,store:e,git:r,knowledgeGit:n,projectId:p.id,fromSha:c,headSha:i})}async maybeLogTierBCommitCapNudge(e){let{workspaceRoot:r,logger:n}=this;try{if(!ki(e))return;n.info(J.TIER_B_CAP_NUDGE),await V(r,{event:Y.TIER_B_COMMIT_CAP_NUDGE})}catch{}}async executeDecisionExtraction(e){let{workspaceRoot:r,logger:n,options:i}=this;n.info(J.EXTRACTING(e)),await V(r,{event:Y.FOCUSED_START,targetPath:e});let s=eM.resolve(r,e);if(!ZF.existsSync(s)){let O=J.PATH_NOT_FOUND(e);throw await V(r,{event:Y.FOCUSED_ERROR,targetPath:e,message:O}),new E(T.FS_READ_FAILED,O)}let{files:o,droppedFiles:a}=sn(s,r,n);if(a.length>0&&n.warn(J.FILES_DROPPED(a.length),{droppedFiles:a,targetPath:e}),o.length===0)return await V(r,{event:Y.FOCUSED_SUMMARY,targetPath:e,decisionsCount:0}),{kind:Se.DECISION_EXTRACTION,targetPath:e,decisions:[],persisted:0,deduped:0};let l=o.map(O=>`--- ${O.relativePath} ---
|