@augmentcode/auggie 1.2.0-prerelease.202611021510 → 1.2.0-prerelease.202611031212
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/indexing-worker.mjs
CHANGED
|
@@ -138,8 +138,8 @@ gpgsig`+GA(s)+`
|
|
|
138
138
|
`,"utf8");let c=a[a.length-1].split(" ")[1];await o.writeStashRef(c)}else await e.rm(l)})}async function pO({fs:e,dir:t,gitdir:n}){return new co({fs:e,dir:t,gitdir:n}).readStashReflogs({parsed:!0})}async function EO({fs:e,dir:t,gitdir:n}){let r=new co({fs:e,dir:t,gitdir:n}),o=[r.refStashPath,r.refLogsStashPath];await Te(o,async()=>{await Promise.all(o.map(async i=>{if(await e.exists(i))return e.rm(i)}))})}async function RO({fs:e,dir:t,gitdir:n,refIdx:r=0}){await zC({fs:e,dir:t,gitdir:n,refIdx:r}),await DC({fs:e,dir:t,gitdir:n,refIdx:r})}async function LC({fs:e,dir:t,gitdir:n=y(t,".git"),op:r="push",message:o="",refIdx:i=0}){W("fs",e),W("dir",t),W("gitdir",n),W("op",r);let s={push:gO,apply:zC,drop:DC,list:pO,clear:EO,pop:RO,create:VO},a=["apply","drop","pop"];try{let l=new Q(e),c=await T({fsp:l,dotgit:n});["refs","logs","logs/refs"].map(h=>y(c,h)).forEach(async h=>{await l.exists(h)||await l.mkdir(h)});let u=s[r];if(u){if(a.includes(r)&&i<0)throw new Bt(`stash@${i}`,"number that is in range of [0, num of stash pushed]");return await u({fs:l,dir:t,gitdir:c,message:o,refIdx:i})}throw new Error(`To be implemented: ${r}`)}catch(l){throw l.caller="git.stash",l}}async function HC({fs:e,dir:t,gitdir:n=y(t,".git"),filepath:r,cache:o={},refresh:i=!0}){try{W("fs",e),W("gitdir",n),W("filepath",r);let s=new Q(e),a=await T({fsp:s,dotgit:n}),l=await ZO({fs:s,cache:o,gitdir:a}),c=await MC({fs:s,cache:o,gitdir:a,tree:l,path:r}),d=await We.acquire({fs:s,gitdir:a,cache:o},async function(m){for(let g of m)if(g.path===r)return g;return null});if(c===null&&d===null&&await ar.isIgnored({fs:s,gitdir:a,dir:t,filepath:r}))return"ignored";let u=await s.lstat(y(t,r)),h=c!==null,b=d!==null,f=u!==null,A=async()=>{if(b&&!qd(d,u))return d.oid;{let g=await(await Re.get({fs:s,gitdir:a})).get("core.autocrlf"),E=await s.read(y(t,r),{autocrlf:g}),R=await JC({gitdir:a,type:"blob",object:E});return i&&b&&d.oid===R&&u.size!==-1&&We.acquire({fs:s,gitdir:a,cache:o},async function(G){G.insert({filepath:r,stats:u,oid:R})}),R}};if(!h&&!f&&!b)return"absent";if(!h&&!f&&b)return"*absent";if(!h&&f&&!b)return"*added";if(!h&&f&&b)return await A()===d.oid?"added":"*added";if(h&&!f&&!b)return"deleted";if(h&&!f&&b)return c===d.oid,"*deleted";if(h&&f&&!b)return await A()===c?"*undeleted":"*undeletemodified";if(h&&f&&b){let m=await A();return m===c?m===d.oid?"unmodified":"*unmodified":m===d.oid?"modified":"*modified"}}catch(s){throw s.caller="git.status",s}}async function MC({fs:e,cache:t,gitdir:n,tree:r,path:o}){typeof o=="string"&&(o=o.split("/"));let i=o.shift();for(let s of r)if(s.path===i){if(o.length===0)return s.oid;let{type:a,object:l}=await me({fs:e,cache:t,gitdir:n,oid:s.oid});if(a==="tree"){let c=at.from(l);return MC({fs:e,cache:t,gitdir:n,tree:c,path:o})}if(a==="blob")throw new tt(s.oid,a,"blob",o.join("/"))}return null}async function ZO({fs:e,cache:t,gitdir:n}){let r;try{r=await x.resolve({fs:e,gitdir:n,ref:"HEAD"})}catch(i){if(i instanceof be)return[]}let{tree:o}=await Ri({fs:e,cache:t,gitdir:n,oid:r});return o}async function OC({fs:e,dir:t,gitdir:n=y(t,".git"),ref:r="HEAD",filepaths:o=["."],filter:i,cache:s={},ignored:a=!1,refresh:l=!0}){try{W("fs",e),W("gitdir",n),W("ref",r);let c=new Q(e),d=await T({fsp:c,dotgit:n});return await Nn({fs:c,cache:s,dir:t,gitdir:d,trees:[et({ref:r}),Ei({refresh:l}),uo()],map:async function(u,[h,b,f]){if(!h&&!f&&b&&!a&&await ar.isIgnored({fs:c,dir:t,filepath:u})||!o.some(Z=>CY(u,Z)))return null;if(i&&!i(u))return;let[A,m,g]=await Promise.all([h&&h.type(),b&&b.type(),f&&f.type()]),E=[A,m,g].includes("blob");if((A==="tree"||A==="special")&&!E)return;if(A==="commit")return null;if((m==="tree"||m==="special")&&!E)return;if(g==="commit")return null;if((g==="tree"||g==="special")&&!E)return;let R=A==="blob"?await h.oid():void 0,G=g==="blob"?await f.oid():void 0,S;A!=="blob"&&m==="blob"&&g!=="blob"?S="42":m==="blob"&&(S=await b.oid());let N=[void 0,R,S,G],V=N.map(Z=>N.indexOf(Z));return V.shift(),[u,...V]}})}catch(c){throw c.caller="git.statusMatrix",c}}async function jC({fs:e,dir:t,gitdir:n=y(t,".git"),ref:r,object:o,force:i=!1}){try{W("fs",e),W("gitdir",n),W("ref",r);let s=new Q(e);if(r===void 0)throw new st("ref");r=r.startsWith("refs/tags/")?r:`refs/tags/${r}`;let a=await T({fsp:s,dotgit:n}),l=await x.resolve({fs:s,gitdir:a,ref:o||"HEAD"});if(!i&&await x.exists({fs:s,gitdir:a,ref:r}))throw new Tt("tag",r);await x.writeRef({fs:s,gitdir:a,ref:r,value:l})}catch(s){throw s.caller="git.tag",s}}async function PC({fs:e,dir:t,gitdir:n=y(t,".git"),cache:r={},filepath:o,oid:i,mode:s,add:a,remove:l,force:c}){try{W("fs",e),W("gitdir",n),W("filepath",o);let d=new Q(e),u=await T({fsp:d,dotgit:n});if(l)return await We.acquire({fs:d,gitdir:u,cache:r},async function(b){if(!c){let f=await d.lstat(y(t,o));if(f){if(f.isDirectory())throw new sr("directory");return}}b.has({filepath:o})&&b.delete({filepath:o})});let h;if(!i){if(h=await d.lstat(y(t,o)),!h)throw new be(`file at "${o}" on disk and "remove" not set`);if(h.isDirectory())throw new sr("directory")}return await We.acquire({fs:d,gitdir:u,cache:r},async function(b){if(!a&&!b.has({filepath:o}))throw new be(`file at "${o}" in index and "add" not set`);let f;if(i)f={ctime:new Date(0),mtime:new Date(0),dev:0,ino:0,mode:s,uid:0,gid:0,size:0};else{f=h;let A=f.isSymbolicLink()?await d.readlink(y(t,o)):await d.read(y(t,o));i=await ct({fs:d,gitdir:u,type:"blob",format:"content",object:A})}return b.insert({filepath:o,oid:i,stats:f}),i})}catch(d){throw d.caller="git.updateIndex",d}}function qC(){try{return uu.version}catch(e){throw e.caller="git.version",e}}async function $C({fs:e,dir:t,gitdir:n=y(t,".git"),trees:r,map:o,reduce:i,iterate:s,cache:a={}}){try{W("fs",e),W("gitdir",n),W("trees",r);let l=new Q(e),c=await T({fsp:l,dotgit:n});return await Nn({fs:l,cache:a,dir:t,gitdir:c,trees:r,map:o,reduce:i,iterate:s})}catch(l){throw l.caller="git.walk",l}}async function ey({fs:e,dir:t,gitdir:n=y(t,".git"),blob:r}){try{W("fs",e),W("gitdir",n),W("blob",r);let o=new Q(e),i=await T({fsp:o,dotgit:n});return await ct({fs:o,gitdir:i,type:"blob",object:r,format:"content"})}catch(o){throw o.caller="git.writeBlob",o}}async function ty({fs:e,dir:t,gitdir:n=y(t,".git"),commit:r}){try{W("fs",e),W("gitdir",n),W("commit",r);let o=new Q(e),i=await T({fsp:o,dotgit:n});return await TC({fs:o,gitdir:i,commit:r})}catch(o){throw o.caller="git.writeCommit",o}}async function ny({fs:e,dir:t,gitdir:n=y(t,".git"),type:r,object:o,format:i="parsed",oid:s,encoding:a=void 0}){try{let l=new Q(e),c=await T({fsp:l,dotgit:n});if(i==="parsed"){switch(r){case"commit":o=lt.from(o).toObject();break;case"tree":o=at.from(o).toObject();break;case"blob":o=Buffer.from(o,a);break;case"tag":o=At.from(o).toObject();break;default:throw new tt(s||"",r,"blob|commit|tag|tree")}i="content"}return s=await ct({fs:l,gitdir:c,type:r,object:o,oid:s,format:i}),s}catch(l){throw l.caller="git.writeObject",l}}async function ry({fs:e,dir:t,gitdir:n=y(t,".git"),ref:r,value:o,force:i=!1,symbolic:s=!1}){try{W("fs",e),W("gitdir",n),W("ref",r),W("value",o);let a=new Q(e);if(!Xa(r,!0))throw new Bt(r,oa.clean(r));let l=await T({fsp:a,dotgit:n});if(!i&&await x.exists({fs:a,gitdir:l,ref:r}))throw new Tt("ref",r);s?await x.writeSymbolicRef({fs:a,gitdir:l,ref:r,value:o}):(o=await x.resolve({fs:a,gitdir:l,ref:o}),await x.writeRef({fs:a,gitdir:l,ref:r,value:o}))}catch(a){throw a.caller="git.writeRef",a}}async function SO({fs:e,gitdir:t,tag:n}){let r=At.from(n).toObject();return await ct({fs:e,gitdir:t,type:"tag",object:r,format:"content"})}async function oy({fs:e,dir:t,gitdir:n=y(t,".git"),tag:r}){try{W("fs",e),W("gitdir",n),W("tag",r);let o=new Q(e),i=await T({fsp:o,dotgit:n});return await SO({fs:o,gitdir:i,tag:r})}catch(o){throw o.caller="git.writeTag",o}}async function iy({fs:e,dir:t,gitdir:n=y(t,".git"),tree:r}){try{W("fs",e),W("gitdir",n),W("tree",r);let o=new Q(e),i=await T({fsp:o,dotgit:n});return await Na({fs:o,gitdir:i,tree:r})}catch(o){throw o.caller="git.writeTree",o}}var XO={Errors:AY,STAGE:uo,TREE:et,WORKDIR:Ei,add:ZY,abortMerge:pY,addNote:IY,addRemote:FY,annotatedTag:BY,branch:YY,cherryPick:xY,checkout:MA,clone:_Y,commit:QY,getConfig:nC,getConfigAll:rC,setConfig:QC,currentBranch:TY,deleteBranch:KY,deleteRef:zY,deleteRemote:DY,deleteTag:LY,expandOid:HY,expandRef:MY,fastForward:PY,fetch:qY,findMergeBase:$Y,findRoot:tC,getRemoteInfo:oC,getRemoteInfo2:sC,hashBlob:aC,indexPack:lC,init:cC,isDescendent:uC,isIgnored:hC,listBranches:bC,listFiles:mC,listNotes:AC,listRefs:gC,listRemotes:VC,listServerRefs:pC,listTags:EC,log:ZC,merge:SC,packObjects:WC,pull:GC,push:IC,readBlob:BC,readCommit:PA,readNote:YC,readObject:CC,readTag:yC,readTree:UC,remove:xC,removeNote:vC,renameBranch:wC,resetIndex:kC,updateIndex:PC,resolveRef:_C,status:HC,statusMatrix:OC,tag:jC,version:qC,walk:$C,writeBlob:ey,writeCommit:ty,writeObject:ny,writeRef:ry,writeTag:oy,writeTree:iy,stash:LC};J.Errors=AY;J.STAGE=uo;J.TREE=et;J.WORKDIR=Ei;J.abortMerge=pY;J.add=ZY;J.addNote=IY;J.addRemote=FY;J.annotatedTag=BY;J.branch=YY;J.checkout=MA;J.cherryPick=xY;J.clone=_Y;J.commit=QY;J.currentBranch=TY;J.default=XO;J.deleteBranch=KY;J.deleteRef=zY;J.deleteRemote=DY;J.deleteTag=LY;J.expandOid=HY;J.expandRef=MY;J.fastForward=PY;J.fetch=qY;J.findMergeBase=$Y;J.findRoot=tC;J.getConfig=nC;J.getConfigAll=rC;J.getRemoteInfo=oC;J.getRemoteInfo2=sC;J.hashBlob=aC;J.indexPack=lC;J.init=cC;J.isDescendent=uC;J.isIgnored=hC;J.listBranches=bC;J.listFiles=mC;J.listNotes=AC;J.listRefs=gC;J.listRemotes=VC;J.listServerRefs=pC;J.listTags=EC;J.log=ZC;J.merge=SC;J.packObjects=WC;J.pull=GC;J.push=IC;J.readBlob=BC;J.readCommit=PA;J.readNote=YC;J.readObject=CC;J.readTag=yC;J.readTree=UC;J.remove=xC;J.removeNote=vC;J.renameBranch=wC;J.resetIndex=kC;J.resolveRef=_C;J.setConfig=QC;J.stash=LC;J.status=HC;J.statusMatrix=OC;J.tag=jC;J.updateIndex=PC;J.version=qC;J.walk=$C;J.writeBlob=ey;J.writeCommit=ty;J.writeObject=ny;J.writeRef=ry;J.writeTag=oy;J.writeTree=iy});import{execFile as sy,spawn as WO}from"node:child_process";import GO from"node:fs";import{promisify as IO}from"node:util";function dy(e){return e.baseSha&&e.baseFileInfoMap?new og(e):new rg(e)}function uy(e){let t=jn(e);if(!t.isGitRepo||!t.dir||!t.gitdir)throw new Error(`Not a git repository: ${e}`);return{fs:GO,dir:t.dir,gitdir:t.gitdir,cache:{}}}function hy(e){let t=jn(e);if(!t.isGitRepo||!t.dir||!t.gitdir)throw new Error(`Not a git repository: ${e}`);return{dir:t.dir,gitdir:t.gitdir}}function by(e,t,n){return new Promise((r,o)=>{sy("git",["--git-dir",e,"cat-file","blob",n],{cwd:t,encoding:"buffer",maxBuffer:50*1024*1024},(i,s)=>{i?o(i instanceof Error?i:new Error(JSON.stringify(i))):r(new Uint8Array(s))})})}var dn,ay,ly,cy,Ba,ur,hu,$A,eg,tg,ng,fy,rg,og,ig=F(()=>{"use strict";xe();dn=Bi(qA(),1);Ad();ay=IO(sy),ly=20,cy=200,Ba=1024*1024,ur=class extends Error{blobSize;constructor(t,n,r){super(`Blob too large: ${t} (${(n/1024/1024).toFixed(1)} MB, max ${(r/1024/1024).toFixed(1)} MB)`),this.name="BlobTooLargeError",this.blobSize=n}};hu=class{process;maxBlobSize;alive=!0;buffer=Buffer.alloc(0);resolveWait=null;rejectWait=null;constructor(t,n,r){this.maxBlobSize=r??Ba,this.process=WO("git",["--git-dir",t,"cat-file","--batch"],{cwd:n,stdio:["pipe","pipe","pipe"]}),this.process.stdout?.on("data",o=>{if(this.buffer=Buffer.concat([this.buffer,o]),this.resolveWait){let i=this.resolveWait;this.resolveWait=null,i()}}),this.process.on("error",o=>{if(this.alive=!1,this.rejectWait){let i=this.rejectWait;this.rejectWait=null,i(o)}}),this.process.on("close",o=>{if(this.alive=!1,this.rejectWait){let i=this.rejectWait;this.rejectWait=null,i(new Error(`git cat-file process exited unexpectedly with code ${o}`))}})}get isAlive(){return this.alive}waitForBytes(t){return this.buffer.length>=t?Promise.resolve():new Promise((n,r)=>{let o=()=>{this.buffer.length>=t?(this.resolveWait=null,this.rejectWait=null,n()):this.resolveWait=o};this.resolveWait=o,this.rejectWait=r,o()})}async readBlob(t){for(this.process.stdin?.write(`${t}
|
|
139
139
|
`);;){await this.waitForBytes(1);let n=this.buffer.indexOf(10);if(n!==-1){let r=this.buffer.subarray(0,n).toString("utf8");this.buffer=this.buffer.subarray(n+1);let o=r.split(" ");if(o.length<3)throw new Error(`Unexpected cat-file header: ${r}`);let i=Number.parseInt(o[2],10);if(Number.isNaN(i))throw new Error(`Invalid size in cat-file header: ${r}`);if(i>this.maxBlobSize)throw await this.drainBytes(i+1),new ur(t,i,this.maxBlobSize);await this.waitForBytes(i+1);let s=this.buffer.subarray(0,i),a=new Uint8Array(s);return this.buffer=this.buffer.subarray(i+1),a}await this.waitForBytes(this.buffer.length+1)}}async drainBytes(t){let n=t,r=64*1024;for(;n>0;){let o=Math.min(n,r);await this.waitForBytes(o),this.buffer=this.buffer.subarray(o),n-=o}}dispose(){if(this.alive=!1,this.rejectWait){let t=this.rejectWait;this.resolveWait=null,this.rejectWait=null,t(new Error("BlobBatchReader disposed"))}this.process.stdout?.removeAllListeners(),this.process.stderr?.removeAllListeners(),this.process.removeAllListeners(),this.process.stdin?.end(),this.process.kill(),this.process.unref()}},$A=class{config;constructor(t){this.config=t}async walk(t){let n=uy(this.config.repoRoot),r=this.config.maxBlobSize??Ba,o=this.config.yieldMs??ly,i=Date.now();await(0,dn.walk)({...n,trees:[(0,dn.TREE)({ref:this.config.targetSha})],iterate:async(s,a)=>{let l=[];for(let c of a)l.push(await s(c)),Date.now()-i>=o&&(await new Promise(u=>setTimeout(u,cy)),i=Date.now());return l},map:async(s,[a])=>{if(!a||await a.type()!=="blob")return;let l=await a.oid(),c=async()=>{let{blob:d}=await(0,dn.readBlob)({...n,oid:l});if(d.byteLength>r)throw new ur(s,d.byteLength,r);return d};await t.onFileAdded(s,c)}})}},eg=class{config;constructor(t){this.config=t}async walk(t){let n=uy(this.config.repoRoot),r=this.config.maxBlobSize??Ba,o=this.config.yieldMs??ly,i=Date.now(),s=this.config.baseFileInfoMap??new Map,a=(c,d)=>async()=>{let{blob:u}=await(0,dn.readBlob)({...n,oid:c});if(u.byteLength>r)throw new ur(d,u.byteLength,r);return u},l=this.config.baseSha??this.config.targetSha;await(0,dn.walk)({...n,trees:[(0,dn.TREE)({ref:this.config.targetSha}),(0,dn.TREE)({ref:l})],iterate:async(c,d)=>{let u=[];for(let h of d)u.push(await c(h)),Date.now()-i>=o&&(await new Promise(f=>setTimeout(f,cy)),i=Date.now());return u},map:async(c,[d,u])=>{let h=d&&await d.type()==="blob"?await d.oid():null,b=u&&await u.type()==="blob"?await u.oid():null;if(h!==b){if(h&&!b){await t.onFileAdded(c,a(h,c));return}if(!h&&b){let f=s.get(c);f&&await t.onFileDeleted(c,f);return}if(h&&b){let f=s.get(c);f?await t.onFileChanged(c,f,a(h,c)):await t.onFileAdded(c,a(h,c))}}}})}},tg=class{config;constructor(t){this.config=t}async walk(t){let{dir:n,gitdir:r}=hy(this.config.repoRoot),o=this.config.maxBlobSize??Ba,{stdout:i}=await ay("git",["--git-dir",r,"ls-tree","-r","-l","-z",this.config.targetSha],{cwd:n,maxBuffer:100*1024*1024}),s=i.split("\0").filter(Boolean),a=new hu(r,n,o);try{for(let l of s){let c=l.indexOf(" ");if(c===-1)continue;let d=l.slice(0,c),u=l.slice(c+1),h=d.split(/\s+/);if(h[1]!=="blob")continue;let b=h[2],f=Number.parseInt(h[3],10);if(!Number.isNaN(f)&&f>o)continue;let A=b,m=()=>a.isAlive?a.readBlob(A):by(r,n,A);await t.onFileAdded(u,m)}}finally{a.dispose()}}},ng=class{config;constructor(t){this.config=t}async walk(t){let{dir:n,gitdir:r}=hy(this.config.repoRoot),o=this.config.baseFileInfoMap??new Map,i=this.config.baseSha??this.config.targetSha,{stdout:s}=await ay("git",["--git-dir",r,"diff-tree","-r","-z",i,this.config.targetSha],{cwd:n,maxBuffer:100*1024*1024}),a=s.split("\0"),l=this.config.maxBlobSize??Ba,c=new hu(r,n,l),d=u=>()=>c.isAlive?c.readBlob(u):by(r,n,u);try{let u=0;for(;u<a.length;){let h=a[u];if(!h?.startsWith(":")){u++;continue}let b=h.slice(1).split(" "),f=b[3],A=b[4]?.[0],m=a[u+1];if(!m||!A){u+=2;continue}switch(A){case"A":{await t.onFileAdded(m,d(f)),u+=2;break}case"D":{let g=o.get(m);g&&await t.onFileDeleted(m,g),u+=2;break}case"M":case"T":{let g=o.get(m);g?await t.onFileChanged(m,g,d(f)):await t.onFileAdded(m,d(f)),u+=2;break}case"R":{let g=a[u+2],E=o.get(m);E&&await t.onFileDeleted(m,E),g&&await t.onFileAdded(g,d(f)),u+=3;break}case"C":{let g=a[u+2];g&&await t.onFileAdded(g,d(f)),u+=3;break}default:u+=2}}}finally{c.dispose()}}},fy=H.child({prefix:"git-tree-walker"}),rg=class{config;constructor(t){this.config=t}async walk(t){try{await new tg(this.config).walk(t)}catch(n){fy.info(`native git full walk failed, falling back to isomorphic-git: ${n}`),await new $A(this.config).walk(t)}}},og=class{config;constructor(t){this.config=t}async walk(t){try{await new ng(this.config).walk(t)}catch(n){fy.info(`native git incremental walk failed, falling back to isomorphic-git: ${n}`),await new eg(this.config).walk(t)}}}});import{createHash as NO}from"node:crypto";var FO,Zi,sg=F(()=>{"use strict";FO=new TextDecoder("utf-8",{fatal:!0}),Zi=class{textEncoder=new TextEncoder;maxBlobSize;constructor(t){this.maxBlobSize=t}hash(t,n){let r=NO("sha256");return r.update(t),r.update(n),r.digest("hex")}calculate(t,n){let r=typeof n=="string"?this.textEncoder.encode(n):n;if(!(r.length>this.maxBlobSize)){if(typeof n!="string")try{FO.decode(n)}catch{return}return this.hash(t,r)}}}});var Si,my=F(()=>{"use strict";Si=class{retryQueue=[];retryInterval;queue;config;constructor(t,n){this.queue=t,this.config=n,this.retryInterval=setInterval(()=>this.flush(),this.config.retryMs)}dispose(){this.retryInterval&&(clearInterval(this.retryInterval),this.retryInterval=void 0)}retry(t){this.retryQueue.push(t)}retryAll(t){this.retryQueue.push(...t)}flush(){for(let t of this.retryQueue)this.queue.enqueue(t);this.retryQueue=[],this.queue.startProcess()}}});var ag,bu,Ay=F(()=>{"use strict";ag={REMOVE_OLDEST:"REMOVE_OLDEST",REJECT_NEW_ITEMS:"REJECT_NEW_ITEMS"},bu=class{queue=[];config;constructor(t={}){this.config={sizeLimit:t.sizeLimit??1e6,queueSizeManagement:t.queueSizeManagement??ag.REMOVE_OLDEST}}enqueue(t){if(this.queue.length>=this.config.sizeLimit){if(this.config.queueSizeManagement===ag.REJECT_NEW_ITEMS)return!1;this.config.queueSizeManagement===ag.REMOVE_OLDEST&&this.queue.shift()}return this.queue.push(t),!0}dequeue(){return this.queue.shift()}isEmpty(){return this.queue.length===0}clear(){this.queue.length=0}peek(){return this.queue[0]}getItems(){return Object.freeze([...this.queue])}size(){return this.queue.length}}});var Ya,gy=F(()=>{"use strict";xe();Ay();Ya=class{queue;_inProgress=!1;_disposed=!1;logger=H.child({prefix:"SimpleQueueProcessor"});constructor(t=new bu){this.queue=t}enqueue(t){return this.queue.enqueue(t)}dequeue(){return this.queue.dequeue()}isEmpty(){return this.queue.isEmpty()}clear(){this.queue.clear()}peek(){return this.queue.peek()}getItems(){return this.queue.getItems()}size(){return this.queue.size()}dispose(){this._disposed=!0}startProcess(){this._inProgress||(this._inProgress=!0,Promise.resolve().then(async()=>{for(;!this.isEmpty()&&!this.isDisposed();){let t=this.peek();if(await this.internalProcess(),t===this.peek())break}}).catch(t=>{this.logger.error("Unhandled error while processing task",{error:t})}).finally(()=>{this._inProgress=!1}))}isDisposed(){return this._disposed}}});async function lg(e,t,n=BO){let r=n.initialMs;for(let o=1;o<=n.maxTries;o++)try{return await e()}catch(i){if(o===n.maxTries)throw i;t.warn(`Attempt ${o}/${n.maxTries} failed, retrying in ${r}ms: ${i}`),await new Promise(s=>setTimeout(s,r)),r=Math.min(r*n.mult,n.maxMs)}throw new Error("retryWithBackoff: unreachable")}function Vy(e){return typeof e=="string"?e:new TextDecoder("utf-8",{fatal:!0}).decode(e)}function py(e){return typeof e=="string"?new TextEncoder().encode(e).length:e.length}var BO,Ey=F(()=>{"use strict";BO={initialMs:500,mult:2,maxMs:1e4,maxTries:3}});function YO(e,t){let n=new Set(t.unknownBlobNames.concat(t.nonindexedBlobNames)),r=[];for(let o of e)n.has(o)||r.push(o);return r}var Ca,cg,dg,Xi,ug=F(()=>{"use strict";xe();En();my();gy();Ey();Ca={uploadConfig:{maxUploadSize:1e6,maxBatchCount:128,retryMs:6e4},blobStatusConfig:{maxBatchCount:1e3,oldBlobNameThresholdMs:6e4,giveUpBlobNameThresholdMs:3e5,oldBlobNameRetryMs:6e4,newBlobNameRetryMs:3e3,postUploadDelayMs:1e4}};cg=class extends Ya{indexedEmitter=new ce;unknownEmitter=new ce;gaveUpEmitter=new ce;startTimes=new Map;retryOld;retryNew;log=H.child({prefix:"BlobStatusExecutor"});api;cfg;constructor(t,n){super(),this.api=t,this.cfg=n,this.retryOld=new Si(this,{retryMs:n.oldBlobNameRetryMs}),this.retryNew=new Si(this,{retryMs:n.newBlobNameRetryMs})}dispose(){super.dispose(),this.startTimes.clear(),this.indexedEmitter.dispose(),this.unknownEmitter.dispose(),this.gaveUpEmitter.dispose(),this.retryOld.dispose(),this.retryNew.dispose()}get onFoundIndexed(){return this.indexedEmitter.event.bind(this.indexedEmitter)}get onFoundUnknown(){return this.unknownEmitter.event.bind(this.unknownEmitter)}get onGaveUp(){return this.gaveUpEmitter.event.bind(this.gaveUpEmitter)}retryBlobNames(t){let n=[],r=[],o=[];for(let i of t){let s=this.startTimes.get(i);if(s===void 0){this.startTimes.set(i,Date.now()),n.push(i);continue}let a=Date.now()-s;a>this.cfg.giveUpBlobNameThresholdMs?(this.startTimes.delete(i),o.push(i)):a>this.cfg.oldBlobNameThresholdMs?r.push(i):n.push(i)}o.length>0&&(this.log.warn(`Giving up on ${o.length} blob(s) after ${this.cfg.giveUpBlobNameThresholdMs}ms`),this.gaveUpEmitter.fire(o)),this.retryNew.retryAll(n),this.retryOld.retryAll(r)}async internalProcess(){let t=new Set,n=0;for(;n<this.cfg.maxBatchCount;){let i=this.dequeue();if(i===void 0)break;t.add(i),this.startTimes.has(i)||this.startTimes.set(i,Date.now()),n++}let r;try{r=await lg(()=>this.api.findMissing([...t]),this.log)}catch{this.retryBlobNames([...t]);return}if(r.unknownBlobNames.length>0){for(let i of r.unknownBlobNames)this.startTimes.delete(i);this.log.debug(`${r.unknownBlobNames.length} blob(s) unknown, triggering re-upload`),this.unknownEmitter.fire(r.unknownBlobNames)}r.nonindexedBlobNames.length>0&&this.retryBlobNames(r.nonindexedBlobNames);let o=YO(t,r);for(let i of o)this.startTimes.delete(i);o.length>0&&this.indexedEmitter.fire(o)}},dg=class extends Ya{uploadedEmitter=new ce;failedEmitter=new ce;rejectedEmitter=new ce;log=H.child({prefix:"UploadExecutor"});retrySched;api;cfg;constructor(t,n){super(),this.api=t,this.cfg=n,this.retrySched=new Si(this,{retryMs:n.retryMs})}dispose(){super.dispose(),this.uploadedEmitter.dispose(),this.failedEmitter.dispose(),this.rejectedEmitter.dispose(),this.retrySched.dispose()}get onDidUpload(){return this.uploadedEmitter.event.bind(this.uploadedEmitter)}get onFailed(){return this.failedEmitter.event.bind(this.failedEmitter)}get onRejected(){return this.rejectedEmitter.event.bind(this.rejectedEmitter)}async internalProcess(){let t=0,n=[],r=[],o=0;for(;!this.isDisposed()&&o<this.cfg.maxBatchCount;){let i=this.peek();if(i===void 0)break;let s=await i.readContent(),a=py(s);if(a>this.cfg.maxUploadSize){this.dequeue(),this.rejectedEmitter.fire({item:i,reason:`File too large: ${a} > ${this.cfg.maxUploadSize} bytes`});continue}if(t+a>this.cfg.maxUploadSize)break;let l;try{l=Vy(s)}catch{this.dequeue(),this.rejectedEmitter.fire({item:i,reason:"File contains invalid UTF-8 encoding"});continue}t+=a,n.push({pathName:i.path,text:l,blobName:i.blobName,metadata:[]}),r.push(i),this.dequeue(),o++}if(n.length!==0)try{let i=await lg(()=>this.api.batchUpload(n),this.log),s=new Map;for(let l=0;l<i.blobNames.length;l++)s.set(n[l].blobName,i.blobNames[l]);let a=n.length-i.blobNames.length;a>0&&this.retrySched.retryAll(r.slice(r.length-a)),s.size>0&&this.uploadedEmitter.fire(s)}catch{this.retrySched.retryAll(r)}}},Xi=class{uploadExec;statusExec;handled=new Map;disposables=[];log=H.child({prefix:"BlobUploader"});blobsUploadedEmitter=new ce;blobsIndexedEmitter=new ce;blobUploadFailedEmitter=new ce;blobRejectedEmitter=new ce;blobNameCalculator;constructor(t,n,r=Ca){this.blobNameCalculator=t,this.uploadExec=new dg(n,r.uploadConfig),this.statusExec=new cg(n,r.blobStatusConfig);let o=r.blobStatusConfig.postUploadDelayMs;this.disposables.push(this.uploadExec.onDidUpload(i=>{this.log.debug(`uploaded ${i.size} blob(s), waiting ${o}ms before status polling`),this.blobsUploadedEmitter.fire({expectedToActualBlobNameMap:i});for(let[a,l]of i)if(this.handled.has(a)&&a!==l){this.log.debug(`blob name changed by server: ${a} \u2192 ${l}`);let c=this.handled.get(a);c&&this.handled.set(l,c),this.handled.delete(a)}let s=[...i.values()];setTimeout(()=>{for(let a of s)this.statusExec.enqueue(a);this.statusExec.startProcess()},o)})),this.disposables.push(this.uploadExec.onFailed(i=>{this.log.debug(`upload failed: ${i.blobName}`),this.handled.delete(i.blobName),this.blobUploadFailedEmitter.fire({blobName:i.blobName})})),this.disposables.push(this.uploadExec.onRejected(({item:i,reason:s})=>{this.log.debug(`blob rejected: ${i.blobName} (${s})`),this.handled.delete(i.blobName),this.blobRejectedEmitter.fire({blobName:i.blobName,reason:s})})),this.disposables.push(this.statusExec.onFoundIndexed(i=>{this.log.debug(`${i.length} blob(s) confirmed indexed`);for(let s of i)this.handled.delete(s);this.blobsIndexedEmitter.fire({blobNames:i})})),this.disposables.push(this.statusExec.onFoundUnknown(i=>{this.log.debug(`${i.length} blob(s) unknown, re-enqueuing for upload`);for(let s of i){let a=this.handled.get(s);a&&this.uploadExec.enqueue(a)}this.uploadExec.startProcess()})),this.disposables.push(this.statusExec.onGaveUp(i=>{this.log.warn(`${i.length} blob(s) gave up after timeout, marking as failed`);for(let s of i)this.handled.delete(s),this.blobUploadFailedEmitter.fire({blobName:s})}))}get onBlobsUploaded(){return this.blobsUploadedEmitter.event.bind(this.blobsUploadedEmitter)}get onBlobsIndexed(){return this.blobsIndexedEmitter.event.bind(this.blobsIndexedEmitter)}get onBlobUploadFailed(){return this.blobUploadFailedEmitter.event.bind(this.blobUploadFailedEmitter)}get onBlobRejected(){return this.blobRejectedEmitter.event.bind(this.blobRejectedEmitter)}enqueueUpload(t,n){let r=this.blobNameCalculator.calculate(t.path,n);if(r===void 0)return;let o={...t,blobName:r};return this.handled.set(r,o),this.statusExec.enqueue(r),r}startUpload(){this.log.debug(`startUpload: ${this.handled.size} blob(s) in-flight`),this.statusExec.startProcess()}dispose(){for(let t of this.disposables)t.dispose();this.disposables.length=0,this.handled.clear(),this.uploadExec.dispose(),this.statusExec.dispose(),this.blobsUploadedEmitter.dispose(),this.blobsIndexedEmitter.dispose(),this.blobUploadFailedEmitter.dispose(),this.blobRejectedEmitter.dispose()}}});import{execFile as CO}from"node:child_process";import yO from"node:fs";import{promisify as UO}from"node:util";async function Zy(e,t,n,r,o){o.info(`getAncestorCommitShas: targetOid=${n}, depth=${r}`);try{let{stdout:l}=await xO("git",["--git-dir",t,"log","--format=%H","--first-parent","-n",`${r}`,n],{cwd:e,timeout:1e4}),c=l.trim().split(`
|
|
140
140
|
`).filter(Boolean);if(c.length>0)return o.info(`getAncestorCommitShas via native git: ${c.length} commits`),c}catch(l){o.info(`Native git unavailable, falling back to isomorphic-git: ${l}`)}let i={fs:yO,dir:e,gitdir:t,cache:{}},s=[],a=n;for(let l=0;l<r;l++){let{commit:c}=await(0,Ry.readCommit)({...i,oid:a});if(s.push(a),await new Promise(d=>setTimeout(d,vO)),!c.parent||c.parent.length===0)break;a=c.parent[0]}return o.info(`getAncestorCommitShas via isomorphic-git: ${s.length} commits`),s}var Ry,xO,vO,Sy=F(()=>{"use strict";Ry=Bi(qA(),1),xO=UO(CO),vO=1});var wO,Wi,hg=F(()=>{"use strict";xe();En();wO=500,Wi=class{checkpointDelta={checkpointId:void 0,addedBlobs:[],deletedBlobs:[]};batchSize=5e3;flushPromise;log=H.child({prefix:"CheckpointBuilder"});debounceTimer=null;debounceMs;pathToBlobName=new Map;apiServer;onCheckpoint=new ce;constructor(t,n,r=wO){this.apiServer=t,this.debounceMs=r,n&&(this.checkpointDelta.checkpointId=n)}seed(t){for(let[n,r]of t)this.pathToBlobName.set(n,r)}add(t,n){let r=this.pathToBlobName.get(t);if(r===n)return;let o=r?[r]:[];this.pathToBlobName.set(t,n),this.update([n],o)}getPathToBlobName(){return new Map(this.pathToBlobName)}removeByPath(t){let n=this.pathToBlobName.get(t);n&&(this.pathToBlobName.delete(t),this.update([],[n]))}update(t,n){t.length>0&&(this.checkpointDelta.addedBlobs=this.checkpointDelta.addedBlobs.concat(t)),n.length>0&&(this.checkpointDelta.deletedBlobs=this.checkpointDelta.deletedBlobs.concat(n)),this.scheduleCheckpointEvent(),this.isOverLimit()&&this.flushBatch().catch(r=>{this.log.error("Failed to flush checkpoint",{error:r})})}isOverLimit(){return this.checkpointDelta.addedBlobs.length>=this.batchSize||this.checkpointDelta.deletedBlobs.length>=this.batchSize}async flushToLimit(){for(;this.isOverLimit();)await this.flushBatch()}get blobs(){return{checkpointId:this.checkpointDelta.checkpointId,addedBlobs:[...this.checkpointDelta.addedBlobs],deletedBlobs:[...this.checkpointDelta.deletedBlobs]}}async flush(){for(;this.checkpointDelta.addedBlobs.length>0||this.checkpointDelta.deletedBlobs.length>0;)await this.flushBatch();return this.checkpointDelta.checkpointId}scheduleCheckpointEvent(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.onCheckpoint.fire(this.blobs)},this.debounceMs)}flushCheckpointEvent(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null,this.onCheckpoint.fire(this.blobs))}flushBatch(){return this.flushPromise?this.flushPromise:(this.flushPromise=(async()=>{let t=this.checkpointDelta.addedBlobs.slice(0,this.batchSize),n=this.checkpointDelta.deletedBlobs.slice(0,this.batchSize);try{let r=await this.apiServer.checkpointBlobs({checkpointId:this.checkpointDelta.checkpointId,addedBlobs:t,deletedBlobs:n});this.checkpointDelta.checkpointId=r.newCheckpointId,this.checkpointDelta.addedBlobs=this.checkpointDelta.addedBlobs.slice(t.length),this.checkpointDelta.deletedBlobs=this.checkpointDelta.deletedBlobs.slice(n.length),this.scheduleCheckpointEvent()}catch(r){throw this.log.error("Failed to create checkpoint",{error:r}),r}finally{this.flushPromise=void 0}})(),this.flushPromise)}}});var pg=X((Sse,Au)=>{function Gy(e){return Array.isArray(e)?e:[e]}var JO=void 0,fg="",Xy=" ",bg="\\",kO=/^\s+$/,_O=/(?:[^\\]|^)\\$/,QO=/^\\!/,TO=/^\\#/,KO=/\r?\n/g,zO=/^\.{0,2}\/|^\.{1,2}$/,DO=/\/$/,Gi="/",Iy="node-ignore";typeof Symbol<"u"&&(Iy=Symbol.for("node-ignore"));var Ny=Iy,Ii=(e,t,n)=>(Object.defineProperty(e,t,{value:n}),n),LO=/([0-z])-([0-z])/g,Fy=()=>!1,HO=e=>e.replace(LO,(t,n,r)=>n.charCodeAt(0)<=r.charCodeAt(0)?t:fg),MO=e=>e.startsWith("!")||e.startsWith("\\^")?`^${e.slice(e[0]==="!"?1:2)}`:e,OO=e=>{let{length:t}=e;return e.slice(0,t-t%2)},jO=[[/^\uFEFF/,()=>fg],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,n)=>t+(n.indexOf("\\")===0?Xy:fg)],[/(\\+?)\s/g,(e,t)=>{let{length:n}=t;return t.slice(0,n-n%2)+Xy}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*(?:\\\*\\\*\\\/)+/,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,n)=>t+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,n)=>{let r=n.replace(/\\\*/g,"[^\\/]*");return t+r}],[/\\\\\\(?=[$.|*+(){^])/g,()=>bg],[/\\\\/g,()=>bg],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,n,r,o)=>t===bg?`\\[${n}${OO(r)}${o}`:o==="]"&&r.length%2===0?`[${MO(HO(n))}${r}]`:"[]"],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`]],PO=/(^|\\\/)?\\\*$/,ya="regex",fu="checkRegex",Wy="_",qO={[ya](e,t){return`${t?`${t}[^/]+`:"[^/]*"}(?=$|\\/$)`},[fu](e,t){return`${t?`${t}[^/]*`:"[^/]*"}(?=$|\\/$)`}},$O=e=>jO.reduce((t,[n,r])=>t.replace(n,r.bind(e)),e),mu=e=>typeof e=="string",ej=e=>e&&mu(e)&&!kO.test(e)&&!_O.test(e)&&e.indexOf("#")!==0,tj=e=>e.split(KO).filter(Boolean),mg=class{constructor(t,n,r,o,i,s){this.pattern=t,this.mark=n,this.negative=i,Ii(this,"body",r),Ii(this,"ignoreCase",o),Ii(this,"regexPrefix",s)}get regex(){let t=Wy+ya;return this[t]?this[t]:this._make(ya,t)}get checkRegex(){let t=Wy+fu;return this[t]?this[t]:this._make(fu,t)}_make(t,n){let r=this.regexPrefix.replace(PO,qO[t]),o=this.ignoreCase?new RegExp(r,"i"):new RegExp(r);return Ii(this,n,o)}},nj=({pattern:e,mark:t},n)=>{let r=!1,o=e;o.indexOf("!")===0&&(r=!0,o=o.substr(1)),o=o.replace(QO,"!").replace(TO,"#");let i=$O(o);return new mg(e,t,o,n,r,i)},Ag=class{constructor(t){this._ignoreCase=t,this._rules=[]}_add(t){if(t&&t[Ny]){this._rules=this._rules.concat(t._rules._rules),this._added=!0;return}if(mu(t)&&(t={pattern:t}),ej(t.pattern)){let n=nj(t,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(t){return this._added=!1,Gy(mu(t)?tj(t):t).forEach(this._add,this),this._added}test(t,n,r){let o=!1,i=!1,s;this._rules.forEach(l=>{let{negative:c}=l;i===c&&o!==i||c&&!o&&!i&&!n||!l[r].test(t)||(o=!c,i=c,s=c?JO:l)});let a={ignored:o,unignored:i};return s&&(a.rule=s),a}},rj=(e,t)=>{throw new t(e)},Fn=(e,t,n)=>mu(e)?e?Fn.isNotRelative(e)?n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${t}\``,TypeError),By=e=>zO.test(e);Fn.isNotRelative=By;Fn.convert=e=>e;var gg=class{constructor({ignorecase:t=!0,ignoreCase:n=t,allowRelativePaths:r=!1}={}){Ii(this,Ny,!0),this._rules=new Ag(n),this._strictPathCheck=!r,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(t){return this._rules.add(t)&&this._initCache(),this}addPattern(t){return this.add(t)}_test(t,n,r,o){let i=t&&Fn.convert(t);return Fn(i,t,this._strictPathCheck?rj:Fy),this._t(i,n,r,o)}checkIgnore(t){if(!DO.test(t))return this.test(t);let n=t.split(Gi).filter(Boolean);if(n.pop(),n.length){let r=this._t(n.join(Gi)+Gi,this._testCache,!0,n);if(r.ignored)return r}return this._rules.test(t,!1,fu)}_t(t,n,r,o){if(t in n)return n[t];if(o||(o=t.split(Gi).filter(Boolean)),o.pop(),!o.length)return n[t]=this._rules.test(t,r,ya);let i=this._t(o.join(Gi)+Gi,n,r,o);return n[t]=i.ignored?i:this._rules.test(t,r,ya)}ignores(t){return this._test(t,this._ignoreCache,!1).ignored}createFilter(){return t=>!this.ignores(t)}filter(t){return Gy(t).filter(this.createFilter())}test(t){return this._test(t,this._testCache,!0)}},Vg=e=>new gg(e),oj=e=>Fn(e&&Fn.convert(e),e,Fy),Yy=()=>{let e=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");Fn.convert=e;let t=/^[a-z]:\//i;Fn.isNotRelative=n=>t.test(n)||By(n)};typeof process<"u"&&process.platform==="win32"&&Yy();Au.exports=Vg;Vg.default=Vg;Au.exports.isPathValid=oj;Ii(Au.exports,Symbol.for("setupWindows"),Yy)});import{extname as ij}from"node:path";function Eg(e,t=""){let n=e.split(`
|
|
141
|
-
`).map(o=>o.endsWith("\r")?o.slice(0,-1):o).filter(o=>o.trim()!==""&&!o.trim().startsWith("#"));if(t==="")return n;let r=t.endsWith("/")?t.slice(0,-1):t;return n.map(o=>cj(o,r))}function cj(e,t){if(e.startsWith("!")){let n=e.slice(1);return n.startsWith("/")?`!${t}${n}`:`!${t}/**/${n}`}return e.startsWith("/")?t+e:`${t}/**/${e}`}var Cy,sj,aj,lj,gu,yy=F(()=>{"use strict";xe();Cy=Bi(pg(),1),sj=new Set([".png",".jpg",".jpeg",".gif",".ico",".webp",".svg",".bmp",".tiff",".psd",".ai",".mp3",".mp4",".wav",".mov",".avi",".flv",".mkv",".m4a",".aac",".ogg",".webm",".zip",".tar",".gz",".rar",".7z",".bz2",".xz",".iso",".exe",".dll",".so",".dylib",".o",".a",".lib",".bin",".app",".db",".sqlite",".sqlite3",".mdb",".dat",".class",".pyc",".pyo",".obj",".out",".woff",".woff2",".ttf",".otf",".eot",".fon",".jar",".war",".ear",".apk",".dmg",".deb",".rpm",".crt",".cer",".pem",".key",".lock"]),aj=[".git","*.pem","*.key","*.pfx","*.p12","*.jks","*.keystore","*.pkcs12","*.crt","*.cer","id_rsa","id_ed25519","id_ecdsa","id_dsa",".augment-guidelines"],lj=1024*1024,gu=class{log=H.child({prefix:"IgnoreRulesBlobFilter"});maxFileSize;excludedExtensions;ignoreObj;constructor(t={}){if(this.maxFileSize=t.maxFileSize??lj,this.excludedExtensions=new Set(sj),t.additionalExcludedExtensions)for(let n of t.additionalExcludedExtensions)this.excludedExtensions.add(n.startsWith(".")?n:`.${n}`);if(this.ignoreObj=(0,Cy.default)(),this.ignoreObj.add(aj),t.gitignoreContent){let n=Eg(t.gitignoreContent);this.ignoreObj.add(n)}}setAugmentIgnoreRules(t){let n=Eg(t);n.length>0&&(this.ignoreObj.add(n),this.log.info(`Added ${n.length} .augmentignore rules`))}addGitignoreRules(t,n=""){let r=Eg(t,n);r.length>0&&this.ignoreObj.add(r)}shouldAcceptBlob(t){let n=ij(t.path).toLowerCase();return this.excludedExtensions.has(n)?Promise.resolve({accepted:!1,reason:`Excluded extension: ${n}`}):t.size>this.maxFileSize?Promise.resolve({accepted:!1,reason:`File too large: ${t.size} > ${this.maxFileSize}`}):this.ignoreObj.ignores(t.path)?Promise.resolve({accepted:!1,reason:"Matched ignore rule"}):Promise.resolve({accepted:!0})}}});var Ni,Rg=F(()=>{"use strict";xe();En();Ni=class{blobs={};disposables=[];log=H.child({prefix:"IndexOrchestrator"});traversalDone=!1;hadFailures=!1;finalized=!1;doneCallback;_filesAccepted=0;_filesSettled=0;_filesIndexed=0;_filesFailed=0;_filesRejected=0;uploadBatchSize;settledPending=!1;blobFilter;blobUploader;checkpointBuilder;onBlobSettled=new ce;constructor(t,n,r,{uploadBatchSize:o=1e3}={}){this.blobFilter=t,this.blobUploader=n,this.checkpointBuilder=r,this.uploadBatchSize=o,this.wireEvents()}get filesAccepted(){return this._filesAccepted}get filesSettled(){return this._filesSettled}get filesIndexed(){return this._filesIndexed}get filesFailed(){return this._filesFailed}get filesRejected(){return this._filesRejected}get pathToBlobName(){return this.checkpointBuilder.getPathToBlobName()}async addFile(t,n,r){if(!(await this.blobFilter.shouldAcceptBlob({path:t,size:n,readContent:r})).accepted)return;let i=await r(),s=this.blobUploader.enqueueUpload({path:t,readContent:r},i);if(s){for(let[a,l]of Object.entries(this.blobs))l===t&&a!==s&&delete this.blobs[a];this.blobs[s]=t,this._filesAccepted++,(this._filesAccepted%this.uploadBatchSize===0||this.traversalDone)&&this.blobUploader.startUpload()}}removeFile(t){this.log.debug(`removeFile: ${t}`);for(let[n,r]of Object.entries(this.blobs))r===t&&delete this.blobs[n];this.checkpointBuilder.removeByPath(t)}traversalCompleted(){this.log.debug(`traversalCompleted: ${this._filesAccepted} accepted, ${this._filesSettled} settled, ${Object.keys(this.blobs).length} in-flight`),this.traversalDone=!0,this.blobUploader.startUpload(),this.finalizeIfNeeded()}onDone(t){this.doneCallback=t}dispose(){for(let t of this.disposables)t.dispose();this.disposables.length=0,this.onBlobSettled.dispose()}scheduleSettledFire(){this.settledPending||(this.settledPending=!0,queueMicrotask(()=>{this.settledPending=!1,this.onBlobSettled.fire()}))}wireEvents(){this.disposables.push(this.blobUploader.onBlobsIndexed(t=>{for(let n of t.blobNames){let r=this.blobs[n];r&&this.checkpointBuilder.add(r,n),delete this.blobs[n],this._filesSettled++,this._filesIndexed++}this.scheduleSettledFire(),this.finalizeIfNeeded()})),this.disposables.push(this.blobUploader.onBlobsUploaded(t=>{for(let[n,r]of t.expectedToActualBlobNameMap)n!==r&&this.blobs[n]&&(this.blobs[r]=this.blobs[n],delete this.blobs[n])})),this.disposables.push(this.blobUploader.onBlobUploadFailed(t=>{delete this.blobs[t.blobName],this._filesSettled++,this._filesFailed++,this.hadFailures=!0,this.scheduleSettledFire(),this.finalizeIfNeeded()})),this.disposables.push(this.blobUploader.onBlobRejected(t=>{delete this.blobs[t.blobName],this._filesSettled++,this._filesRejected++,this.scheduleSettledFire(),this.finalizeIfNeeded()}))}finalizeIfNeeded(){this.finalized||!this.traversalDone||Object.keys(this.blobs).length>0||(this.finalized=!0,this.log.info("All blobs settled. Finalizing."),this.checkpointBuilder.flush().then(()=>{this.doneCallback?.({hadFailures:this.hadFailures})}).catch(t=>{this.log.error("Failed to flush checkpoint",{error:t}),this.doneCallback?.({hadFailures:!0})}))}}});import{execFile as dj}from"node:child_process";import{readFile as Uy}from"node:fs/promises";import{join as xy}from"node:path";import{promisify as uj}from"node:util";var vy,Vu,wy=F(()=>{"use strict";ig();xe();sg();ug();En();Sy();Ad();ig();hg();yy();Rg();vy=uj(dj),Vu=class{blobNameCalc;blobUploader;log=H.child({prefix:"IsoGitIndexingService"});onProgress=new ce;orchestrator;filesDiscovered=0;currentWorkspaceRoot;indexingStartTime;apiServer;constructor(t,n=1024*1024,r=Ca){this.apiServer=t,this.blobNameCalc=new Zi(n),this.blobUploader=new Xi(this.blobNameCalc,t,r)}dispose(){this.orchestrator?.dispose(),this.orchestrator=void 0,this.blobUploader.dispose(),this.onProgress.dispose()}async createBlobFilter(t){let n;try{n=await Uy(xy(t,".gitignore"),"utf-8")}catch{}let r=new gu({gitignoreContent:n});try{let o=await Uy(xy(t,".augmentignore"),"utf-8");r.setAugmentIgnoreRules(o)}catch{}return r}getIndexingStatus(){let t=this.orchestrator?.filesAccepted??0,n=this.orchestrator?.filesSettled??0;return{itemsInFlight:Math.max(0,t-n),calculateQueueSize:0,probeQueueSize:0,uploadQueueSize:0,probeRetryQueueSize:0,probeRetryBackoffQueueSize:0,calculateErrors:0,probeErrors:0,mtimeCacheHits:0,mtimeCacheMisses:0,pathsAccepted:t,currentFile:void 0,consecutiveNoneIndexedProbes:0,calculateAvgMs:0,calculateMaxMs:0}}emitProgress(t){let n=this.orchestrator?.filesAccepted??0,r=this.orchestrator?.filesSettled??0,o=n>0?Math.round(r/n*100):0;this.onProgress.fire({phase:t,percentage:o,filesDiscovered:this.filesDiscovered,filesTracked:n,filesProcessed:r,filesIndexed:this.orchestrator?.filesIndexed??0,filesFailed:this.orchestrator?.filesFailed??0,filesRejected:this.orchestrator?.filesRejected??0,filesPreIndexed:0,workspaceRoot:this.currentWorkspaceRoot,durationMs:t==="complete"&&this.indexingStartTime?Date.now()-this.indexingStartTime:void 0})}async findIndexedBaseCommit(t,n,r=20){let o=jn(t);if(!o.isGitRepo||!o.dir||!o.gitdir)return this.log.warn(`Not a git repository: ${t}`),null;try{let i=await Zy(o.dir,o.gitdir,n,r,this.log);if(i.length===0)return null;this.log.info(`Looking for indexed checkpoint among ${i.length} ancestor commits`);let s=this.apiServer.getLatestIndexedCommitBlobset({commit_shas:i}),a=null,l,c=new Map;for await(let d of s){d.commit_sha&&!a&&(a=d.commit_sha,l=d.checkpoint_id,this.log.info(`Found indexed base commit: ${a}`+(l?` (checkpoint: ${l})`:"")));for(let u of d.file_infos)c.set(u.file_path,u.blob_name)}return a?(this.log.info(`Collected ${c.size} file mappings from base commit`),{commitSha:a,checkpointId:l,fileInfoMap:c}):(this.log.info("No indexed checkpoint found \u2014 will do full tree walk"),null)}catch(i){return this.log.info("No indexed base commit found",{error:i}),null}}async createGitShaCommitIndex(t,n){this.log.info(`Starting indexing for commit ${n} in repo ${t}`),this.currentWorkspaceRoot=t,this.indexingStartTime=Date.now(),this.emitProgress("qualifying");let r=jn(t);if(!r.isGitRepo||!r.dir||!r.gitdir)throw new Error(`Not a git repository: ${t}`);let{dir:o,gitdir:i,headRef:s}=r,a=n==="HEAD"&&s?s:n,l;try{let{stdout:N}=await vy("git",["--git-dir",i,"rev-parse",a],{cwd:o});l=N.trim(),this.log.info(`Resolved commit ${n} to OID ${l}`)}catch(N){throw new Error(`Failed to resolve commit ${n}: ${N}`)}let c=await this.createBlobFilter(t),d;try{let{stdout:N}=await vy("git",["--git-dir",i,"log","-1","--format=%ct",l],{cwd:o});d=Number.parseInt(N.trim(),10)*1e3}catch(N){throw new Error(`Failed to read commit ${l}: ${N}`)}let u=await this.findIndexedBaseCommit(t,l);if(u&&u.commitSha===l)return this.log.info("Target commit already indexed, nothing to do"),this.emitProgress("complete"),{commitSha:l,filesIndexed:0,alreadyIndexed:!0,registered:!1,durationMs:Date.now()-(this.indexingStartTime??Date.now())};this.emitProgress("indexing");let h=new Wi(this.apiServer,u?.checkpointId);if(u)if(u.checkpointId)this.log.info(`Resuming from checkpoint ${u.checkpointId} (${u.fileInfoMap.size} base files)`);else{let N=Array.from(u.fileInfoMap.values());this.log.info(`Seeding checkpoint with ${N.length} blobs from base commit`),h.update(N,[]),await h.flushToLimit()}let b=new Ni(c,this.blobUploader,h);this.orchestrator=b;let f=!1,A=new Promise(N=>{b.onDone(async V=>{if(V.hadFailures)this.log.warn("Not registering commit blobset due to failures");else try{await this.apiServer.registerIndexedCommitBlobset({commit:{commit_sha:l,commit_time:new Date(d).toISOString()},blobs:h.blobs}),f=!0,this.log.info(`Checkpoint registered: commit ${l}, ${b.filesSettled} files indexed`)}catch(Z){this.log.error("Failed to register commit blobset",{error:Z})}this.emitProgress("complete"),N()})}),m=b.onBlobSettled.event(()=>{this.emitProgress("indexing")}),g=()=>{this.filesDiscovered++,this.filesDiscovered%1e3===0&&this.emitProgress("indexing")},E={async onFileAdded(N,V){let Z;try{Z=await V()}catch(p){if(p instanceof ur)return;throw p}await b.addFile(N,Z.length,async()=>Z),g()},async onFileChanged(N,V,Z){let p;try{p=await Z()}catch(B){if(B instanceof ur)return;throw B}await b.addFile(N,p.length,async()=>p),g()},onFileDeleted(N){b.removeFile(N)}},R=dy({repoRoot:t,targetSha:l,baseSha:u?.commitSha,baseFileInfoMap:u?.fileInfoMap});this.log.info(u?`Incremental walk from base ${u.commitSha} to ${l}`:`Full tree walk for ${l}`),await R.walk(E),this.emitProgress("indexing"),b.traversalCompleted(),await A,m.dispose();let G=b.filesSettled,S=Date.now()-(this.indexingStartTime??Date.now());return this.log.info(`Git SHA indexing complete: ${G} files, ${(S/1e3).toFixed(1)}s, registered=${f}`),b.dispose(),this.orchestrator===b&&(this.orchestrator=void 0),{commitSha:l,filesIndexed:G,alreadyIndexed:!1,registered:f,durationMs:S}}}});import{watch as Jy}from"node:fs";import{readdir as hj,stat as bj}from"node:fs/promises";import{join as ky,relative as Zg}from"node:path";var fj,mj,pu,Eu,_y=F(()=>{"use strict";xe();En();fj=500,mj=new Set([".git","node_modules",".hg",".svn","__pycache__",".tox",".mypy_cache",".pytest_cache",".next",".nuxt",".output",".turbo",".vercel",".cache",".parcel-cache"]),pu=H.child({prefix:"FileWatcher"}),Eu=class{workspaceRoot;debounceMs;skipDirs;shouldWatch;onChange=new ce;watchers=[];pendingEvents=new Map;debounceTimer=null;running=!1;constructor(t){this.workspaceRoot=t.workspaceRoot,this.debounceMs=t.debounceMs??fj,this.skipDirs=new Set([...mj,...t.skipDirectories??[]]),this.shouldWatch=t.shouldWatchDirectory}async start(){if(this.running)return;this.running=!0;let t=process.platform==="darwin"||process.platform==="win32";t?this.startRecursive():await this.startPerDirectory(this.workspaceRoot),pu.info(`Started watching ${this.workspaceRoot} (${t?"recursive":"per-directory"}, ${this.watchers.length} watcher(s))`)}stop(){if(this.running){this.running=!1;for(let t of this.watchers)t.close();this.watchers=[],this.flush(),pu.info("Stopped watching")}}startRecursive(){let t=Jy(this.workspaceRoot,{recursive:!0},(n,r)=>{if(!r||!this.running)return;let o=r.toString();this.shouldSkip(o)||this.enqueue(o,n==="rename"?"rename":"change")});t.on("error",n=>{pu.warn("Watcher error",{error:n})}),this.watchers.push(t)}async startPerDirectory(t){if(!this.running)return;let n=Zg(this.workspaceRoot,t);if(n&&this.shouldSkipDir(n))return;this.watchSingleDirectory(t);let r;try{r=await hj(t,{withFileTypes:!0})}catch{return}let o=[];for(let i of r)if(i.isDirectory()&&!this.skipDirs.has(i.name)){let s=n?`${n}/${i.name}`:i.name;if(this.shouldWatch&&!this.shouldWatch(s))continue;o.push(this.startPerDirectory(ky(t,i.name)))}await Promise.all(o)}watchSingleDirectory(t){let n=Jy(t,(r,o)=>{if(!o||!this.running)return;let i=ky(t,o.toString()),s=Zg(this.workspaceRoot,i);this.shouldSkip(s)||(this.enqueue(s,r==="rename"?"rename":"change"),r==="rename"&&this.maybeWatchNewDirectory(i))});n.on("error",r=>{pu.warn(`Watcher error on ${t}`,{error:r})}),this.watchers.push(n)}maybeWatchNewDirectory(t){bj(t).then(n=>{if(n.isDirectory()&&this.running){let r=Zg(this.workspaceRoot,t);if(this.shouldSkipDir(r)||this.shouldWatch&&!this.shouldWatch(r))return;this.watchSingleDirectory(t)}}).catch(()=>{})}shouldSkip(t){let n=t.split("/");if(n.some(r=>this.skipDirs.has(r)))return!0;if(this.shouldWatch&&n.length>1){let r=n.slice(0,-1).join("/");if(!this.shouldWatch(r))return!0}return!1}shouldSkipDir(t){return t.split("/").some(r=>this.skipDirs.has(r))}enqueue(t,n){this.pendingEvents.set(t,n),this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>this.flush(),this.debounceMs)}flush(){if(this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.pendingEvents.size===0)return;let t=[];for(let[n,r]of this.pendingEvents)t.push({type:r,relativePath:n});this.pendingEvents.clear(),this.onChange.fire(t)}}});import{readFile as Aj,stat as gj}from"node:fs/promises";import{basename as Vj,join as pj}from"node:path";var Ej,Qy,Ru,Ty=F(()=>{"use strict";xe();En();Ej=new Set([".gitignore",".augmentignore"]),Qy=H.child({prefix:"WatcherProcessor"}),Ru=class{workspaceRoot;blobFilter;orchestrator;subscription=null;onUpdate=new ce;constructor(t){this.workspaceRoot=t.workspaceRoot,this.blobFilter=t.blobFilter,this.orchestrator=t.orchestrator}attach(t){this.detach(),this.subscription=t.onChange.event(n=>{this.processBatch(n).catch(r=>{Qy.error("Failed to process watcher batch",{error:r})})})}detach(){this.subscription?.dispose(),this.subscription=null}dispose(){this.detach(),this.onUpdate.dispose()}async processBatch(t){let n=[],r=[];for(let s of t){let a=Vj(s.relativePath);Ej.has(a)?n.push(s):r.push(s)}for(let s of n)this.blobFilter.updateIgnoreFile(s.relativePath);if(r.length===0)return;let o=0,i=0;for(let s of r){let a=pj(this.workspaceRoot,s.relativePath),l=null;try{l=await gj(a)}catch{}if(!l?.isFile()){this.orchestrator.removeFile(s.relativePath),i++;continue}await this.orchestrator.addFile(s.relativePath,l.size,()=>Aj(a)),o++}(o>0||i>0)&&(Qy.info(`Processed batch: ${o} added, ${i} deleted`),this.onUpdate.fire({filesAdded:o,filesDeleted:i}))}}});import{readdir as Rj,stat as Zj}from"node:fs/promises";import{join as Sj,relative as Ky}from"node:path";async function*zy(e,t,n={}){let r=new Set([...Xj,...n.skipDirectories??[]]),o=n.signal,i=n.shouldEnterDirectory;async function*s(a){if(o?.aborted)return;let l;try{l=await Rj(a,{withFileTypes:!0})}catch(c){Wj.warn(`Cannot read directory ${a}`,{error:c});return}for(let c of l){if(o?.aborted)return;let d=Sj(a,c.name);if(c.isDirectory()){if(r.has(c.name))continue;if(i){let u=Ky(e,d);if(!i(u))continue}yield*s(d)}else if(c.isFile())try{let u=await Zj(d);yield{relativePath:Ky(e,d),absolutePath:d,size:u.size}}catch{}}}yield*s(t)}var Xj,Wj,Dy=F(()=>{"use strict";xe();Xj=new Set([".git","node_modules",".hg",".svn","__pycache__",".tox",".mypy_cache",".pytest_cache",".next",".nuxt",".output",".turbo",".vercel",".cache",".parcel-cache","dist","build","out","coverage",".idea",".vscode"]),Wj=H.child({prefix:"FileWalker"})});import{existsSync as Ly,readFileSync as Hy}from"node:fs";import{dirname as Gg,extname as Gj,join as Sg}from"node:path";function My(e){return e.split(`
|
|
142
|
-
`).map(t=>t.endsWith("\r")?t.slice(0,-1):t).filter(t=>t.trim()!==""&&!t.trim().startsWith("#"))}function Wg(e){let t=[],n=Gg(e);for(;n!==".";)t.push(n),n=Gg(n);return t.push(""),t}function Ua(e,t,n,r,o=!1){for(let i of e){let s=t.get(i);if(!s)continue;let a=s[r];if(!a)continue;let l=o&&i?n.slice(i.length+1):n,c=a.test(l);if(c.unignored||c.ignored)return c}}var Zu,Ij,Nj,Fj,Xg,Su,Oy=F(()=>{"use strict";xe();Zu=Bi(pg(),1),Ij=new Set([".png",".jpg",".jpeg",".gif",".ico",".webp",".svg",".bmp",".tiff",".psd",".ai",".mp3",".mp4",".wav",".mov",".avi",".flv",".mkv",".m4a",".aac",".ogg",".webm",".zip",".tar",".gz",".rar",".7z",".bz2",".xz",".iso",".exe",".dll",".so",".dylib",".o",".a",".lib",".bin",".app",".db",".sqlite",".sqlite3",".mdb",".dat",".class",".pyc",".pyo",".obj",".out",".woff",".woff2",".ttf",".otf",".eot",".fon",".jar",".war",".ear",".apk",".dmg",".deb",".rpm",".crt",".cer",".pem",".key",".lock"]),Nj=[".git","*.pem","*.key","*.pfx","*.p12","*.jks","*.keystore","*.pkcs12","*.crt","*.cer","id_rsa","id_ed25519","id_ecdsa","id_dsa",".augment-guidelines"],Fj=1024*1024,Xg=H.child({prefix:"HierarchicalIgnoreFilter"});Su=class{workspaceRoot;maxFileSize;excludedExtensions;builtinIgnore;rulesMap=new Map;constructor(t){if(this.workspaceRoot=t.workspaceRoot,this.maxFileSize=t.maxFileSize??Fj,this.excludedExtensions=new Set(Ij),t.additionalExcludedExtensions)for(let n of t.additionalExcludedExtensions)this.excludedExtensions.add(n.startsWith(".")?n:`.${n}`);this.builtinIgnore=(0,Zu.default)(),this.builtinIgnore.add(Nj)}loadDirectory(t){let n=t?Sg(this.workspaceRoot,t):this.workspaceRoot,r={},o=!1,i=Sg(n,".augmentignore");if(Ly(i))try{let a=Hy(i,"utf-8"),l=My(a);if(l.length>0){let c=(0,Zu.default)();c.add(l),r.augmentignore=c,o=!0}}catch(a){Xg.warn(`Failed to read ${i}`,{error:a})}let s=Sg(n,".gitignore");if(Ly(s))try{let a=Hy(s,"utf-8"),l=My(a);if(l.length>0){let c=(0,Zu.default)();c.add(l),r.gitignore=c,o=!0}}catch(a){Xg.warn(`Failed to read ${s}`,{error:a})}o?this.rulesMap.set(t,r):this.rulesMap.delete(t)}updateIgnoreFile(t){let n=Gg(t),r=n==="."?"":n;this.loadDirectory(r),Xg.debug(`Updated ignore rules for directory: ${r||"root"}`)}removeDirectory(t){this.rulesMap.delete(t)}isAugmentIgnored(t,n=!1){let r=n?`${t.replace(/\/$/,"")}/`:t;return Ua(Wg(t),this.rulesMap,r,"augmentignore",!0)?.ignored??!1}isDirectoryIgnored(t){let n=t.endsWith("/")?t:`${t}/`,r=Wg(t),o=Ua(r,this.rulesMap,n,"augmentignore");if(o)return o.ignored;let i=Ua(r,this.rulesMap,n,"gitignore");return i?i.ignored:!1}shouldAcceptBlob(t){let{path:n,size:r}=t,o=Wg(n),i=Ua(o,this.rulesMap,n,"augmentignore");if(i)return i.unignored?Promise.resolve({accepted:!0}):Promise.resolve({accepted:!1,reason:"Matched .augmentignore rule"});if(this.builtinIgnore.ignores(n))return Promise.resolve({accepted:!1,reason:"Matched builtin security pattern"});let s=Gj(n).toLowerCase();if(this.excludedExtensions.has(s))return Promise.resolve({accepted:!1,reason:`Excluded extension: ${s}`});if(r>this.maxFileSize)return Promise.resolve({accepted:!1,reason:`File too large: ${r} > ${this.maxFileSize}`});let a=Ua(o,this.rulesMap,n,"gitignore");return a?a.unignored?Promise.resolve({accepted:!0}):Promise.resolve({accepted:!1,reason:"Matched .gitignore rule"}):Promise.resolve({accepted:!0})}}});import{readFile as jy}from"node:fs/promises";import{basename as Bj}from"node:path";var Yj,Xu,Py=F(()=>{"use strict";xe();sg();ug();En();_y();Ty();hg();Dy();Oy();Rg();Yj=2e5,Xu=class{blobNameCalc;blobUploader;log=H.child({prefix:"WorkspaceIndexingService"});onProgress=new ce;onCheckpoint=new ce;orchestrator;blobFilter;checkpointSub;fileWatcher=null;watcherProcessor=null;walkComplete=!1;filesDiscovered=0;filesPreIndexed=0;currentWorkspaceRoot;indexingStartTime;onWatcherUpdate=new ce;apiServer;constructor(t,n=1024*1024,r=Ca){this.apiServer=t,this.blobNameCalc=new Zi(n),this.blobUploader=new Xi(this.blobNameCalc,t,r)}dispose(){this.stopWatcher(),this.checkpointSub?.dispose(),this.checkpointSub=void 0,this.orchestrator?.dispose(),this.orchestrator=void 0,this.blobUploader.dispose(),this.onProgress.dispose(),this.onCheckpoint.dispose(),this.onWatcherUpdate.dispose()}createBlobFilter(t){let n=new Su({workspaceRoot:t});return n.loadDirectory(""),n}async startWatcher(t){if(this.stopWatcher(),!this.orchestrator||!this.blobFilter)throw new Error("Cannot start watcher before workspace has been indexed with indexWorkspace()");let n=this.blobFilter;this.fileWatcher=new Eu({workspaceRoot:t,shouldWatchDirectory:r=>(n.loadDirectory(r),!n.isDirectoryIgnored(r))}),this.watcherProcessor=new Ru({workspaceRoot:t,blobFilter:n,orchestrator:this.orchestrator}),this.watcherProcessor.onUpdate.event(r=>{this.onWatcherUpdate.fire(r)}),this.watcherProcessor.attach(this.fileWatcher),await this.fileWatcher.start(),this.log.info(`File watcher started for ${t}`)}stopWatcher(){this.fileWatcher?.stop(),this.watcherProcessor?.dispose(),this.fileWatcher=null,this.watcherProcessor=null}getIndexingStatus(){let t=this.orchestrator?.filesAccepted??0,n=this.orchestrator?.filesSettled??0;return{itemsInFlight:Math.max(0,t-n),calculateQueueSize:0,probeQueueSize:0,uploadQueueSize:0,probeRetryQueueSize:0,probeRetryBackoffQueueSize:0,calculateErrors:0,probeErrors:0,mtimeCacheHits:0,mtimeCacheMisses:0,pathsAccepted:t,currentFile:void 0,consecutiveNoneIndexedProbes:0,calculateAvgMs:0,calculateMaxMs:0}}emitProgress(t){let n=this.orchestrator?.filesAccepted??0,r=this.orchestrator?.filesSettled??0,o=n+this.filesPreIndexed,i=r+this.filesPreIndexed,s=o>0?Math.round(i/o*100):0;this.onProgress.fire({phase:t,percentage:s,filesDiscovered:this.filesDiscovered,filesTracked:n,filesProcessed:r,filesIndexed:this.orchestrator?.filesIndexed??0,filesFailed:this.orchestrator?.filesFailed??0,filesRejected:this.orchestrator?.filesRejected??0,filesPreIndexed:this.filesPreIndexed,walkComplete:this.walkComplete,workspaceRoot:this.currentWorkspaceRoot,durationMs:t==="complete"&&this.indexingStartTime?Date.now()-this.indexingStartTime:void 0})}async indexWorkspace(t,n,r={}){if(this.fileWatcher)return this.log.error(`Cannot index workspace for ${n}: file watcher is already active`),{checkpointId:void 0,filesTracked:0,filesProcessed:0,filesSkipped:0,durationMs:0,pathToBlobName:new Map};this.log.info(`Starting workspace indexing for ${n}`+(n===t?"":` (workspace root: ${t})`)),this.walkComplete=!1,this.filesDiscovered=0,this.filesPreIndexed=0,this.currentWorkspaceRoot=t,this.indexingStartTime=Date.now(),this.emitProgress("qualifying");let o=this.createBlobFilter(t);this.blobFilter=o;let i=r.baselineCheckpointId,s=new Wi(this.apiServer,i),a=!1;this.checkpointSub?.dispose(),this.checkpointSub=s.onCheckpoint.event(S=>{a=!0,this.onCheckpoint.fire(S)}),this.orchestrator?.dispose();let l=new Ni(o,this.blobUploader,s);this.orchestrator=l;let c=r.preIndexedFiles;if(c&&c.size>0)if(s.seed(c),this.filesPreIndexed=c.size,i)this.log.info(`Resuming from checkpoint ${i} (${c.size} pre-indexed files)`),a=!0,this.onCheckpoint.fire({checkpointId:i,addedBlobs:[],deletedBlobs:[]});else{let S=Array.from(c.values());this.log.info(`Seeding checkpoint with ${S.length} pre-indexed blobs`),s.update(S,[]),await s.flushToLimit()}i&&r.retiredFiles?.size&&s.update([],Array.from(r.retiredFiles.values()));let d=r.revalidateFiles,u=new Set(d?.keys());i&&d?.size&&s.seed(d);let h=new Promise((S,N)=>{l.onDone(V=>{V.hadFailures&&this.log.warn("Workspace indexing completed with failures"),this.emitProgress("complete"),S()})}),b=l.onBlobSettled.event(()=>{this.emitProgress("indexing")});this.emitProgress("indexing");let f={skipDirectories:r.skipDirectories,signal:r.signal,shouldEnterDirectory:S=>(o.loadDirectory(S),!o.isDirectoryIgnored(S))},A=r.maxTrackableFiles??Yj,m=0;for await(let S of zy(t,n,f)){if(r.signal?.aborted)break;if(l.filesAccepted>=A){this.log.warn(`Workspace exceeds ${A} trackable files, stopping walk`),this.emitProgress("workspace-too-large");break}this.filesDiscovered++;let N=Bj(S.relativePath);if(N===".gitignore"||N===".augmentignore"){o.updateIgnoreFile(S.relativePath);continue}if(d?.has(S.relativePath)){u.delete(S.relativePath),(await o.shouldAcceptBlob({path:S.relativePath,size:S.size,readContent:()=>jy(S.absolutePath)})).accepted?(m++,this.filesPreIndexed++):s.removeByPath(S.relativePath);continue}if(c?.has(S.relativePath)){m++;continue}await l.addFile(S.relativePath,S.size,()=>jy(S.absolutePath)),this.filesDiscovered%1e3===0&&this.emitProgress("indexing")}for(let S of u)s.removeByPath(S);m>0&&this.log.info(`Skipped ${m} pre-indexed files (incremental)`),this.walkComplete=!0,this.emitProgress("indexing"),l.traversalCompleted(),await h,b.dispose(),s.flushCheckpointEvent();let g=s.blobs.checkpointId;!a&&g&&this.onCheckpoint.fire({checkpointId:g,addedBlobs:[],deletedBlobs:[]});let E=Date.now()-(this.indexingStartTime??Date.now()),R=l.filesAccepted,G=l.filesSettled;return this.log.info(`Workspace indexing complete: ${R} tracked, ${G} processed, ${m} skipped (pre-indexed), ${(E/1e3).toFixed(1)}s, checkpoint: ${g??"none"}`),{checkpointId:g,filesTracked:R,filesProcessed:G,filesSkipped:m,durationMs:E,pathToBlobName:l.pathToBlobName}}}});var eU={};wa(eU,{ContextIndexer:()=>Ng});import{relative as qy,resolve as $y}from"node:path";function Ig(e,t){let n=new Map;for(let[r,o]of e)r.startsWith(t)&&n.set(r,o);return n}var Ng,tU=F(()=>{"use strict";xe();dN();En();Ad();wy();Py();Ng=class{gitService;workspaceService;deltaResolver;log=H.child({prefix:"ContextIndexer"});onIndexing=new ce;onCheckpoint=new ce;onWatcherUpdate=new ce;constructor(t,n={}){this.gitService=new Vu(t,n.maxBlobSize,n.uploaderConfig),this.workspaceService=new Xu(t,n.maxBlobSize,n.uploaderConfig),this.deltaResolver=new fd(t,n.deltaResolverOptions),this.workspaceService.onProgress.event(r=>{this.onIndexing.fire(r)}),this.workspaceService.onCheckpoint.event(r=>{this.onCheckpoint.fire(r)}),this.workspaceService.onWatcherUpdate.event(r=>{this.onWatcherUpdate.fire(r)})}getGitRepoDetails(t){return jn(t)}async indexWorkspace(t,n,r){let o=$y(t),i=$y(n),s=uN(o),a,l,c,d,u=null;this.log.info("Looking for previously indexed git SHA...");try{let b=s?await this.deltaResolver.resolveIndexedCommitDelta(s):null;if(b&&s){this.log.info(`Found indexed commit ${b.indexedCommitSha}: ${b.fileInfoMap.size} unchanged, ${b.modifiedFiles.size} modified, ${b.addedFiles.size} added, ${b.deletedFiles.size} deleted, ${b.untrackedFiles.size} untracked`);let f=s===o?"":`${qy(s,o)}/`,A=i===o?f:`${qy(s,i)}/`,m=Ig(b.fileInfoMap,A),g=Ig(b.retiredFileInfoMap,A),E=Ig(b.revalidateFileInfoMap,A);u={commitSha:b.indexedCommitSha,fileCount:m.size},m.size!==b.fileInfoMap.size&&this.log.info(`Filtered delta to ${m.size} files under ${A} (was ${b.fileInfoMap.size})`),a=m,s===o&&i===o&&(l=b.checkpointId,c=g,d=E)}else this.log.info(s?"No previously indexed commit found \u2014 doing full walk":"Not inside a git repository \u2014 doing full walk")}catch(b){this.log.warn("Delta resolution failed, falling back to full walk",b)}return{...await this.workspaceService.indexWorkspace(t,n,{...r,preIndexedFiles:a??r?.preIndexedFiles,baselineCheckpointId:l??r?.baselineCheckpointId,retiredFiles:c??r?.retiredFiles,revalidateFiles:d??r?.revalidateFiles}),baseline:u}}createGitShaCommitIndex(t,n){return this.gitService.createGitShaCommitIndex(t,n)}getIndexingStatus(){return this.gitService.getIndexingStatus()}startWatcher(t){return this.workspaceService.startWatcher(t)}stopWatcher(){this.workspaceService.stopWatcher()}dispose(){this.gitService.dispose(),this.workspaceService.dispose(),this.onIndexing.dispose(),this.onCheckpoint.dispose(),this.onWatcherUpdate.dispose()}}});import{AsyncLocalStorage as Cj}from"node:async_hooks";import{parentPort as rU}from"node:worker_threads";import*as uU from"node:tls";var ut;function hU(e){let t=[],n="",r=!1;for(let o=0;o<e.length;o++){let i=e[o];if(i==='"')r=!r;else if(i==="\\"&&r){if(o++,o===e.length)return;n+=e[o]}else i===" "&&!r?n&&(t.push(n),n=""):n+=i}if(!r)return n&&t.push(n),t}function bU(){let e=hU(process.env.NODE_OPTIONS??"");return e===void 0||[...e,...process.execArgv].some(t=>t.split("=",1)[0]?.replaceAll("_","-")==="--use-openssl-ca")}function Yg(){if(ut!==void 0)return ut;if(process.env.AUGGIE_USE_SYSTEM_CA==="0")return ut="opted-out",ut;if(bU())return ut="explicit-policy",ut;let{getCACertificates:e,setDefaultCACertificates:t}=uU;if(typeof e!="function"||typeof t!="function")return ut="unsupported",ut;try{let n=e("default"),r=e("system");if(r.length===0)return ut="empty-store",ut;t([...n,...r]),ut="enabled"}catch{ut="failed"}return ut}Yg();var{createAugmentClient:yj}=await Promise.resolve().then(()=>(oN(),rN)),{logger:Uj,silenceLogger:xj}=await Promise.resolve().then(()=>(xe(),wS)),{AugmentApiAdapter:vj}=await Promise.resolve().then(()=>(sN(),iN)),{ContextIndexer:wj}=await Promise.resolve().then(()=>(tU(),eU));if(!rU)throw new Error("indexing-worker.ts must be run as a worker thread");var Iu=rU,Fg=new Cj;process.on("uncaughtException",e=>{Iu.postMessage({type:"fatalError",message:e.message,stack:e.stack,errorType:"uncaughtException"})});process.on("unhandledRejection",e=>{let t=e instanceof Error?e:new Error(String(e));Iu.postMessage({type:"fatalError",message:t.message,stack:t.stack,errorType:"unhandledRejection"})});var Gu=null,ho=new Map,Wu=new Map,xa=new Map,Fi=null,Jj=2e3;function gt(e){Iu.postMessage(e)}function bo(e,t,n,r){gt({type:"log",workspaceId:r??Fg.getStore(),level:e,prefix:t,message:n,timestamp:Date.now()})}function nU(e){let t=ho.get(e);if(t)return t;if(!Gu)throw new Error("Worker not initialized \u2014 send 'configure' first");let n=Gu();return n.onIndexing.event(r=>{Wu.set(e,r),gt({type:"progress",workspaceId:e,progress:r})}),n.onCheckpoint.event(r=>{gt({type:"checkpointUpdate",workspaceId:e,checkpoint:r})}),n.onWatcherUpdate.event(r=>{gt({type:"watcherUpdate",workspaceId:e,filesAdded:r.filesAdded,filesDeleted:r.filesDeleted})}),ho.set(e,n),n}xj();Uj.on("data",e=>{let t=e.level??"info";bo(t,e.prefix??"worker",String(e.message??""),Fg.getStore())});function kj(){Fi||(Fi=setInterval(()=>{let e=process.memoryUsage();gt({type:"metrics",heapUsedMb:Math.round(e.heapUsed/1024/1024),rssMb:Math.round(e.rss/1024/1024),activeHandles:process._getActiveHandles?.().length??0,timestamp:Date.now()})},Jj),Fi.unref())}function _j(){Fi&&(clearInterval(Fi),Fi=null)}async function Qj(e){switch(e.type){case"configure":{let{apiToken:t,apiUrl:n,indexerOptions:r}=e.config;bo("info","IndexingWorker",`Creating API client for ${n}`);let o=yj({apiToken:t,apiUrl:n}),i=new vj(o,n,t);Gu=()=>new wj(i,r),kj(),bo("info","IndexingWorker","Configured successfully"),gt({type:"result",requestId:e.requestId});break}case"indexWorkspace":{let t=nU(e.workspaceId),n=e.skipDirectories?new Set(e.skipDirectories):void 0,r=e.folderToIndex??e.workspaceRoot,o=await t.indexWorkspace(e.workspaceRoot,r,{skipDirectories:n}),{pathToBlobName:i,...s}=o;try{let a=await t.createGitShaCommitIndex(e.workspaceRoot,"HEAD");bo("info","IndexingWorker",`Git SHA commit index created: ${a.commitSha}`)}catch(a){bo("warn","IndexingWorker",`Git SHA commit index failed (non-fatal): ${a}`)}bo("info","IndexingWorker","Starting file watcher"),await t.startWatcher(e.workspaceRoot),gt({type:"result",requestId:e.requestId,data:s});break}case"createGitShaCommitIndex":{let n=await nU(e.workspaceId).createGitShaCommitIndex(e.repoRoot,e.revision);gt({type:"result",requestId:e.requestId,data:n});break}case"statusRequest":{let t=ho.get(e.workspaceId)?.getIndexingStatus()??{itemsInFlight:0,calculateQueueSize:0,probeQueueSize:0,uploadQueueSize:0,probeRetryQueueSize:0,probeRetryBackoffQueueSize:0,calculateErrors:0,probeErrors:0,mtimeCacheHits:0,mtimeCacheMisses:0,pathsAccepted:0,currentFile:void 0,consecutiveNoneIndexedProbes:0,calculateAvgMs:0,calculateMaxMs:0};gt({type:"statusResponse",requestId:e.requestId,workspaceId:e.workspaceId,status:t,progress:Wu.get(e.workspaceId)??null});break}case"dispose":{ho.get(e.workspaceId)?.dispose(),ho.delete(e.workspaceId),Wu.delete(e.workspaceId),gt({type:"result",requestId:e.requestId});break}case"shutdown":{for(let t of ho.values())t.dispose();ho.clear(),Wu.clear(),xa.clear(),Gu=null,_j(),gt({type:"result",requestId:e.requestId}),setTimeout(()=>process.exit(0),100);break}}}Iu.on("message",e=>{let t="workspaceId"in e?e.workspaceId:void 0,n=async()=>{try{await Qj(e)}catch(i){let s=i instanceof Error?i:new Error(String(i));gt({type:"error",requestId:e.requestId,message:s.message,stack:s.stack})}};if(!t){n();return}let o=(xa.get(t)??Promise.resolve()).then(()=>Fg.run(t,n));xa.set(t,o),o.finally(()=>{xa.get(t)===o&&xa.delete(t)})});gt({type:"ready"});bo("info","IndexingWorker","single worker indexing enabled");
|
|
141
|
+
`).map(o=>o.endsWith("\r")?o.slice(0,-1):o).filter(o=>o.trim()!==""&&!o.trim().startsWith("#"));if(t==="")return n;let r=t.endsWith("/")?t.slice(0,-1):t;return n.map(o=>cj(o,r))}function cj(e,t){if(e.startsWith("!")){let n=e.slice(1);return n.startsWith("/")?`!${t}${n}`:`!${t}/**/${n}`}return e.startsWith("/")?t+e:`${t}/**/${e}`}var Cy,sj,aj,lj,gu,yy=F(()=>{"use strict";xe();Cy=Bi(pg(),1),sj=new Set([".png",".jpg",".jpeg",".gif",".ico",".webp",".svg",".bmp",".tiff",".psd",".ai",".mp3",".mp4",".wav",".mov",".avi",".flv",".mkv",".m4a",".aac",".ogg",".webm",".zip",".tar",".gz",".rar",".7z",".bz2",".xz",".iso",".exe",".dll",".so",".dylib",".o",".a",".lib",".bin",".app",".db",".sqlite",".sqlite3",".mdb",".dat",".class",".pyc",".pyo",".obj",".out",".woff",".woff2",".ttf",".otf",".eot",".fon",".jar",".war",".ear",".apk",".dmg",".deb",".rpm",".crt",".cer",".pem",".key",".lock"]),aj=[".git","*.pem","*.key","*.pfx","*.p12","*.jks","*.keystore","*.pkcs12","*.crt","*.cer","id_rsa","id_ed25519","id_ecdsa","id_dsa",".augment-guidelines"],lj=1024*1024,gu=class{log=H.child({prefix:"IgnoreRulesBlobFilter"});maxFileSize;excludedExtensions;ignoreObj;constructor(t={}){if(this.maxFileSize=t.maxFileSize??lj,this.excludedExtensions=new Set(sj),t.additionalExcludedExtensions)for(let n of t.additionalExcludedExtensions)this.excludedExtensions.add(n.startsWith(".")?n:`.${n}`);if(this.ignoreObj=(0,Cy.default)(),this.ignoreObj.add(aj),t.gitignoreContent){let n=Eg(t.gitignoreContent);this.ignoreObj.add(n)}}setAugmentIgnoreRules(t){let n=Eg(t);n.length>0&&(this.ignoreObj.add(n),this.log.info(`Added ${n.length} .augmentignore rules`))}addGitignoreRules(t,n=""){let r=Eg(t,n);r.length>0&&this.ignoreObj.add(r)}shouldAcceptBlob(t){let n=ij(t.path).toLowerCase();return this.excludedExtensions.has(n)?Promise.resolve({accepted:!1,reason:`Excluded extension: ${n}`}):t.size>this.maxFileSize?Promise.resolve({accepted:!1,reason:`File too large: ${t.size} > ${this.maxFileSize}`}):this.ignoreObj.ignores(t.path)?Promise.resolve({accepted:!1,reason:"Matched ignore rule"}):Promise.resolve({accepted:!0})}}});var Ni,Rg=F(()=>{"use strict";xe();En();Ni=class{blobs={};disposables=[];log=H.child({prefix:"IndexOrchestrator"});traversalDone=!1;hadFailures=!1;finalized=!1;doneCallback;_filesAccepted=0;_filesSettled=0;_filesIndexed=0;_filesFailed=0;_filesRejected=0;uploadBatchSize;settledPending=!1;blobFilter;blobUploader;checkpointBuilder;onBlobSettled=new ce;constructor(t,n,r,{uploadBatchSize:o=1e3}={}){this.blobFilter=t,this.blobUploader=n,this.checkpointBuilder=r,this.uploadBatchSize=o,this.wireEvents()}get filesAccepted(){return this._filesAccepted}get filesSettled(){return this._filesSettled}get filesIndexed(){return this._filesIndexed}get filesFailed(){return this._filesFailed}get filesRejected(){return this._filesRejected}get pathToBlobName(){return this.checkpointBuilder.getPathToBlobName()}async addFile(t,n,r){if(!(await this.blobFilter.shouldAcceptBlob({path:t,size:n,readContent:r})).accepted)return;let i=await r(),s=this.blobUploader.enqueueUpload({path:t,readContent:r},i);if(s){for(let[a,l]of Object.entries(this.blobs))l===t&&a!==s&&delete this.blobs[a];this.blobs[s]=t,this._filesAccepted++,(this._filesAccepted%this.uploadBatchSize===0||this.traversalDone)&&this.blobUploader.startUpload()}}removeFile(t){this.log.debug(`removeFile: ${t}`);for(let[n,r]of Object.entries(this.blobs))r===t&&delete this.blobs[n];this.checkpointBuilder.removeByPath(t)}traversalCompleted(){this.log.debug(`traversalCompleted: ${this._filesAccepted} accepted, ${this._filesSettled} settled, ${Object.keys(this.blobs).length} in-flight`),this.traversalDone=!0,this.blobUploader.startUpload(),this.finalizeIfNeeded()}onDone(t){this.doneCallback=t}dispose(){for(let t of this.disposables)t.dispose();this.disposables.length=0,this.onBlobSettled.dispose()}scheduleSettledFire(){this.settledPending||(this.settledPending=!0,queueMicrotask(()=>{this.settledPending=!1,this.onBlobSettled.fire()}))}wireEvents(){this.disposables.push(this.blobUploader.onBlobsIndexed(t=>{for(let n of t.blobNames){let r=this.blobs[n];r&&this.checkpointBuilder.add(r,n),delete this.blobs[n],this._filesSettled++,this._filesIndexed++}this.scheduleSettledFire(),this.finalizeIfNeeded()})),this.disposables.push(this.blobUploader.onBlobsUploaded(t=>{for(let[n,r]of t.expectedToActualBlobNameMap)n!==r&&this.blobs[n]&&(this.blobs[r]=this.blobs[n],delete this.blobs[n])})),this.disposables.push(this.blobUploader.onBlobUploadFailed(t=>{delete this.blobs[t.blobName],this._filesSettled++,this._filesFailed++,this.hadFailures=!0,this.scheduleSettledFire(),this.finalizeIfNeeded()})),this.disposables.push(this.blobUploader.onBlobRejected(t=>{delete this.blobs[t.blobName],this._filesSettled++,this._filesRejected++,this.scheduleSettledFire(),this.finalizeIfNeeded()}))}finalizeIfNeeded(){this.finalized||!this.traversalDone||Object.keys(this.blobs).length>0||(this.finalized=!0,this.log.info("All blobs settled. Finalizing."),this.checkpointBuilder.flush().then(()=>{this.doneCallback?.({hadFailures:this.hadFailures})}).catch(t=>{this.log.error("Failed to flush checkpoint",{error:t}),this.doneCallback?.({hadFailures:!0})}))}}});import{execFile as dj}from"node:child_process";import{readFile as Uy}from"node:fs/promises";import{join as xy}from"node:path";import{promisify as uj}from"node:util";var vy,Vu,wy=F(()=>{"use strict";ig();xe();sg();ug();En();Sy();Ad();ig();hg();yy();Rg();vy=uj(dj),Vu=class{blobNameCalc;blobUploader;log=H.child({prefix:"IsoGitIndexingService"});onProgress=new ce;orchestrator;filesDiscovered=0;currentWorkspaceRoot;indexingStartTime;apiServer;constructor(t,n=1024*1024,r=Ca){this.apiServer=t,this.blobNameCalc=new Zi(n),this.blobUploader=new Xi(this.blobNameCalc,t,r)}dispose(){this.orchestrator?.dispose(),this.orchestrator=void 0,this.blobUploader.dispose(),this.onProgress.dispose()}async createBlobFilter(t){let n;try{n=await Uy(xy(t,".gitignore"),"utf-8")}catch{}let r=new gu({gitignoreContent:n});try{let o=await Uy(xy(t,".augmentignore"),"utf-8");r.setAugmentIgnoreRules(o)}catch{}return r}getIndexingStatus(){let t=this.orchestrator?.filesAccepted??0,n=this.orchestrator?.filesSettled??0;return{itemsInFlight:Math.max(0,t-n),calculateQueueSize:0,probeQueueSize:0,uploadQueueSize:0,probeRetryQueueSize:0,probeRetryBackoffQueueSize:0,calculateErrors:0,probeErrors:0,mtimeCacheHits:0,mtimeCacheMisses:0,pathsAccepted:t,currentFile:void 0,consecutiveNoneIndexedProbes:0,calculateAvgMs:0,calculateMaxMs:0}}emitProgress(t){let n=this.orchestrator?.filesAccepted??0,r=this.orchestrator?.filesSettled??0,o=n>0?Math.floor(r/n*100):0;this.onProgress.fire({phase:t,percentage:o,filesDiscovered:this.filesDiscovered,filesTracked:n,filesProcessed:r,filesIndexed:this.orchestrator?.filesIndexed??0,filesFailed:this.orchestrator?.filesFailed??0,filesRejected:this.orchestrator?.filesRejected??0,filesPreIndexed:0,workspaceRoot:this.currentWorkspaceRoot,durationMs:t==="complete"&&this.indexingStartTime?Date.now()-this.indexingStartTime:void 0})}async findIndexedBaseCommit(t,n,r=20){let o=jn(t);if(!o.isGitRepo||!o.dir||!o.gitdir)return this.log.warn(`Not a git repository: ${t}`),null;try{let i=await Zy(o.dir,o.gitdir,n,r,this.log);if(i.length===0)return null;this.log.info(`Looking for indexed checkpoint among ${i.length} ancestor commits`);let s=this.apiServer.getLatestIndexedCommitBlobset({commit_shas:i}),a=null,l,c=new Map;for await(let d of s){d.commit_sha&&!a&&(a=d.commit_sha,l=d.checkpoint_id,this.log.info(`Found indexed base commit: ${a}`+(l?` (checkpoint: ${l})`:"")));for(let u of d.file_infos)c.set(u.file_path,u.blob_name)}return a?(this.log.info(`Collected ${c.size} file mappings from base commit`),{commitSha:a,checkpointId:l,fileInfoMap:c}):(this.log.info("No indexed checkpoint found \u2014 will do full tree walk"),null)}catch(i){return this.log.info("No indexed base commit found",{error:i}),null}}async createGitShaCommitIndex(t,n){this.log.info(`Starting indexing for commit ${n} in repo ${t}`),this.currentWorkspaceRoot=t,this.indexingStartTime=Date.now(),this.emitProgress("qualifying");let r=jn(t);if(!r.isGitRepo||!r.dir||!r.gitdir)throw new Error(`Not a git repository: ${t}`);let{dir:o,gitdir:i,headRef:s}=r,a=n==="HEAD"&&s?s:n,l;try{let{stdout:N}=await vy("git",["--git-dir",i,"rev-parse",a],{cwd:o});l=N.trim(),this.log.info(`Resolved commit ${n} to OID ${l}`)}catch(N){throw new Error(`Failed to resolve commit ${n}: ${N}`)}let c=await this.createBlobFilter(t),d;try{let{stdout:N}=await vy("git",["--git-dir",i,"log","-1","--format=%ct",l],{cwd:o});d=Number.parseInt(N.trim(),10)*1e3}catch(N){throw new Error(`Failed to read commit ${l}: ${N}`)}let u=await this.findIndexedBaseCommit(t,l);if(u&&u.commitSha===l)return this.log.info("Target commit already indexed, nothing to do"),this.emitProgress("complete"),{commitSha:l,filesIndexed:0,alreadyIndexed:!0,registered:!1,durationMs:Date.now()-(this.indexingStartTime??Date.now())};this.emitProgress("indexing");let h=new Wi(this.apiServer,u?.checkpointId);if(u)if(u.checkpointId)this.log.info(`Resuming from checkpoint ${u.checkpointId} (${u.fileInfoMap.size} base files)`);else{let N=Array.from(u.fileInfoMap.values());this.log.info(`Seeding checkpoint with ${N.length} blobs from base commit`),h.update(N,[]),await h.flushToLimit()}let b=new Ni(c,this.blobUploader,h);this.orchestrator=b;let f=!1,A=new Promise(N=>{b.onDone(async V=>{if(V.hadFailures)this.log.warn("Not registering commit blobset due to failures");else try{await this.apiServer.registerIndexedCommitBlobset({commit:{commit_sha:l,commit_time:new Date(d).toISOString()},blobs:h.blobs}),f=!0,this.log.info(`Checkpoint registered: commit ${l}, ${b.filesSettled} files indexed`)}catch(Z){this.log.error("Failed to register commit blobset",{error:Z})}this.emitProgress("complete"),N()})}),m=b.onBlobSettled.event(()=>{this.emitProgress("indexing")}),g=()=>{this.filesDiscovered++,this.filesDiscovered%1e3===0&&this.emitProgress("indexing")},E={async onFileAdded(N,V){let Z;try{Z=await V()}catch(p){if(p instanceof ur)return;throw p}await b.addFile(N,Z.length,async()=>Z),g()},async onFileChanged(N,V,Z){let p;try{p=await Z()}catch(B){if(B instanceof ur)return;throw B}await b.addFile(N,p.length,async()=>p),g()},onFileDeleted(N){b.removeFile(N)}},R=dy({repoRoot:t,targetSha:l,baseSha:u?.commitSha,baseFileInfoMap:u?.fileInfoMap});this.log.info(u?`Incremental walk from base ${u.commitSha} to ${l}`:`Full tree walk for ${l}`),await R.walk(E),this.emitProgress("indexing"),b.traversalCompleted(),await A,m.dispose();let G=b.filesSettled,S=Date.now()-(this.indexingStartTime??Date.now());return this.log.info(`Git SHA indexing complete: ${G} files, ${(S/1e3).toFixed(1)}s, registered=${f}`),b.dispose(),this.orchestrator===b&&(this.orchestrator=void 0),{commitSha:l,filesIndexed:G,alreadyIndexed:!1,registered:f,durationMs:S}}}});import{watch as Jy}from"node:fs";import{readdir as hj,stat as bj}from"node:fs/promises";import{join as ky,relative as Zg}from"node:path";var fj,mj,pu,Eu,_y=F(()=>{"use strict";xe();En();fj=500,mj=new Set([".git","node_modules",".hg",".svn","__pycache__",".tox",".mypy_cache",".pytest_cache",".next",".nuxt",".output",".turbo",".vercel",".cache",".parcel-cache"]),pu=H.child({prefix:"FileWatcher"}),Eu=class{workspaceRoot;debounceMs;skipDirs;shouldWatch;onChange=new ce;watchers=[];pendingEvents=new Map;debounceTimer=null;running=!1;constructor(t){this.workspaceRoot=t.workspaceRoot,this.debounceMs=t.debounceMs??fj,this.skipDirs=new Set([...mj,...t.skipDirectories??[]]),this.shouldWatch=t.shouldWatchDirectory}async start(){if(this.running)return;this.running=!0;let t=process.platform==="darwin"||process.platform==="win32";t?this.startRecursive():await this.startPerDirectory(this.workspaceRoot),pu.info(`Started watching ${this.workspaceRoot} (${t?"recursive":"per-directory"}, ${this.watchers.length} watcher(s))`)}stop(){if(this.running){this.running=!1;for(let t of this.watchers)t.close();this.watchers=[],this.flush(),pu.info("Stopped watching")}}startRecursive(){let t=Jy(this.workspaceRoot,{recursive:!0},(n,r)=>{if(!r||!this.running)return;let o=r.toString();this.shouldSkip(o)||this.enqueue(o,n==="rename"?"rename":"change")});t.on("error",n=>{pu.warn("Watcher error",{error:n})}),this.watchers.push(t)}async startPerDirectory(t){if(!this.running)return;let n=Zg(this.workspaceRoot,t);if(n&&this.shouldSkipDir(n))return;this.watchSingleDirectory(t);let r;try{r=await hj(t,{withFileTypes:!0})}catch{return}let o=[];for(let i of r)if(i.isDirectory()&&!this.skipDirs.has(i.name)){let s=n?`${n}/${i.name}`:i.name;if(this.shouldWatch&&!this.shouldWatch(s))continue;o.push(this.startPerDirectory(ky(t,i.name)))}await Promise.all(o)}watchSingleDirectory(t){let n=Jy(t,(r,o)=>{if(!o||!this.running)return;let i=ky(t,o.toString()),s=Zg(this.workspaceRoot,i);this.shouldSkip(s)||(this.enqueue(s,r==="rename"?"rename":"change"),r==="rename"&&this.maybeWatchNewDirectory(i))});n.on("error",r=>{pu.warn(`Watcher error on ${t}`,{error:r})}),this.watchers.push(n)}maybeWatchNewDirectory(t){bj(t).then(n=>{if(n.isDirectory()&&this.running){let r=Zg(this.workspaceRoot,t);if(this.shouldSkipDir(r)||this.shouldWatch&&!this.shouldWatch(r))return;this.watchSingleDirectory(t)}}).catch(()=>{})}shouldSkip(t){let n=t.split("/");if(n.some(r=>this.skipDirs.has(r)))return!0;if(this.shouldWatch&&n.length>1){let r=n.slice(0,-1).join("/");if(!this.shouldWatch(r))return!0}return!1}shouldSkipDir(t){return t.split("/").some(r=>this.skipDirs.has(r))}enqueue(t,n){this.pendingEvents.set(t,n),this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>this.flush(),this.debounceMs)}flush(){if(this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.pendingEvents.size===0)return;let t=[];for(let[n,r]of this.pendingEvents)t.push({type:r,relativePath:n});this.pendingEvents.clear(),this.onChange.fire(t)}}});import{readFile as Aj,stat as gj}from"node:fs/promises";import{basename as Vj,join as pj}from"node:path";var Ej,Qy,Ru,Ty=F(()=>{"use strict";xe();En();Ej=new Set([".gitignore",".augmentignore"]),Qy=H.child({prefix:"WatcherProcessor"}),Ru=class{workspaceRoot;blobFilter;orchestrator;subscription=null;onUpdate=new ce;constructor(t){this.workspaceRoot=t.workspaceRoot,this.blobFilter=t.blobFilter,this.orchestrator=t.orchestrator}attach(t){this.detach(),this.subscription=t.onChange.event(n=>{this.processBatch(n).catch(r=>{Qy.error("Failed to process watcher batch",{error:r})})})}detach(){this.subscription?.dispose(),this.subscription=null}dispose(){this.detach(),this.onUpdate.dispose()}async processBatch(t){let n=[],r=[];for(let s of t){let a=Vj(s.relativePath);Ej.has(a)?n.push(s):r.push(s)}for(let s of n)this.blobFilter.updateIgnoreFile(s.relativePath);if(r.length===0)return;let o=0,i=0;for(let s of r){let a=pj(this.workspaceRoot,s.relativePath),l=null;try{l=await gj(a)}catch{}if(!l?.isFile()){this.orchestrator.removeFile(s.relativePath),i++;continue}await this.orchestrator.addFile(s.relativePath,l.size,()=>Aj(a)),o++}(o>0||i>0)&&(Qy.info(`Processed batch: ${o} added, ${i} deleted`),this.onUpdate.fire({filesAdded:o,filesDeleted:i}))}}});import{readdir as Rj,stat as Zj}from"node:fs/promises";import{join as Sj,relative as Ky}from"node:path";async function*zy(e,t,n={}){let r=new Set([...Xj,...n.skipDirectories??[]]),o=n.signal,i=n.shouldEnterDirectory;async function*s(a){if(o?.aborted)return;let l;try{l=await Rj(a,{withFileTypes:!0})}catch(c){Wj.warn(`Cannot read directory ${a}`,{error:c});return}for(let c of l){if(o?.aborted)return;let d=Sj(a,c.name);if(c.isDirectory()){if(r.has(c.name))continue;if(i){let u=Ky(e,d);if(!i(u))continue}yield*s(d)}else if(c.isFile())try{let u=await Zj(d);yield{relativePath:Ky(e,d),absolutePath:d,size:u.size}}catch{}}}yield*s(t)}var Xj,Wj,Dy=F(()=>{"use strict";xe();Xj=new Set([".git","node_modules",".hg",".svn","__pycache__",".tox",".mypy_cache",".pytest_cache",".next",".nuxt",".output",".turbo",".vercel",".cache",".parcel-cache","dist","build","out","coverage",".idea",".vscode"]),Wj=H.child({prefix:"FileWalker"})});import{existsSync as Ly,readFileSync as Hy}from"node:fs";import{dirname as Gg,extname as Gj,join as Sg}from"node:path";function My(e){return e.split(`
|
|
142
|
+
`).map(t=>t.endsWith("\r")?t.slice(0,-1):t).filter(t=>t.trim()!==""&&!t.trim().startsWith("#"))}function Wg(e){let t=[],n=Gg(e);for(;n!==".";)t.push(n),n=Gg(n);return t.push(""),t}function Ua(e,t,n,r,o=!1){for(let i of e){let s=t.get(i);if(!s)continue;let a=s[r];if(!a)continue;let l=o&&i?n.slice(i.length+1):n,c=a.test(l);if(c.unignored||c.ignored)return c}}var Zu,Ij,Nj,Fj,Xg,Su,Oy=F(()=>{"use strict";xe();Zu=Bi(pg(),1),Ij=new Set([".png",".jpg",".jpeg",".gif",".ico",".webp",".svg",".bmp",".tiff",".psd",".ai",".mp3",".mp4",".wav",".mov",".avi",".flv",".mkv",".m4a",".aac",".ogg",".webm",".zip",".tar",".gz",".rar",".7z",".bz2",".xz",".iso",".exe",".dll",".so",".dylib",".o",".a",".lib",".bin",".app",".db",".sqlite",".sqlite3",".mdb",".dat",".class",".pyc",".pyo",".obj",".out",".woff",".woff2",".ttf",".otf",".eot",".fon",".jar",".war",".ear",".apk",".dmg",".deb",".rpm",".crt",".cer",".pem",".key",".lock"]),Nj=[".git","*.pem","*.key","*.pfx","*.p12","*.jks","*.keystore","*.pkcs12","*.crt","*.cer","id_rsa","id_ed25519","id_ecdsa","id_dsa",".augment-guidelines"],Fj=1024*1024,Xg=H.child({prefix:"HierarchicalIgnoreFilter"});Su=class{workspaceRoot;maxFileSize;excludedExtensions;builtinIgnore;rulesMap=new Map;constructor(t){if(this.workspaceRoot=t.workspaceRoot,this.maxFileSize=t.maxFileSize??Fj,this.excludedExtensions=new Set(Ij),t.additionalExcludedExtensions)for(let n of t.additionalExcludedExtensions)this.excludedExtensions.add(n.startsWith(".")?n:`.${n}`);this.builtinIgnore=(0,Zu.default)(),this.builtinIgnore.add(Nj)}loadDirectory(t){let n=t?Sg(this.workspaceRoot,t):this.workspaceRoot,r={},o=!1,i=Sg(n,".augmentignore");if(Ly(i))try{let a=Hy(i,"utf-8"),l=My(a);if(l.length>0){let c=(0,Zu.default)();c.add(l),r.augmentignore=c,o=!0}}catch(a){Xg.warn(`Failed to read ${i}`,{error:a})}let s=Sg(n,".gitignore");if(Ly(s))try{let a=Hy(s,"utf-8"),l=My(a);if(l.length>0){let c=(0,Zu.default)();c.add(l),r.gitignore=c,o=!0}}catch(a){Xg.warn(`Failed to read ${s}`,{error:a})}o?this.rulesMap.set(t,r):this.rulesMap.delete(t)}updateIgnoreFile(t){let n=Gg(t),r=n==="."?"":n;this.loadDirectory(r),Xg.debug(`Updated ignore rules for directory: ${r||"root"}`)}removeDirectory(t){this.rulesMap.delete(t)}isAugmentIgnored(t,n=!1){let r=n?`${t.replace(/\/$/,"")}/`:t;return Ua(Wg(t),this.rulesMap,r,"augmentignore",!0)?.ignored??!1}isDirectoryIgnored(t){let n=t.endsWith("/")?t:`${t}/`,r=Wg(t),o=Ua(r,this.rulesMap,n,"augmentignore");if(o)return o.ignored;let i=Ua(r,this.rulesMap,n,"gitignore");return i?i.ignored:!1}shouldAcceptBlob(t){let{path:n,size:r}=t,o=Wg(n),i=Ua(o,this.rulesMap,n,"augmentignore");if(i)return i.unignored?Promise.resolve({accepted:!0}):Promise.resolve({accepted:!1,reason:"Matched .augmentignore rule"});if(this.builtinIgnore.ignores(n))return Promise.resolve({accepted:!1,reason:"Matched builtin security pattern"});let s=Gj(n).toLowerCase();if(this.excludedExtensions.has(s))return Promise.resolve({accepted:!1,reason:`Excluded extension: ${s}`});if(r>this.maxFileSize)return Promise.resolve({accepted:!1,reason:`File too large: ${r} > ${this.maxFileSize}`});let a=Ua(o,this.rulesMap,n,"gitignore");return a?a.unignored?Promise.resolve({accepted:!0}):Promise.resolve({accepted:!1,reason:"Matched .gitignore rule"}):Promise.resolve({accepted:!0})}}});import{readFile as jy}from"node:fs/promises";import{basename as Bj}from"node:path";var Yj,Xu,Py=F(()=>{"use strict";xe();sg();ug();En();_y();Ty();hg();Dy();Oy();Rg();Yj=2e5,Xu=class{blobNameCalc;blobUploader;log=H.child({prefix:"WorkspaceIndexingService"});onProgress=new ce;onCheckpoint=new ce;orchestrator;blobFilter;checkpointSub;fileWatcher=null;watcherProcessor=null;walkComplete=!1;filesDiscovered=0;filesPreIndexed=0;currentWorkspaceRoot;indexingStartTime;onWatcherUpdate=new ce;apiServer;constructor(t,n=1024*1024,r=Ca){this.apiServer=t,this.blobNameCalc=new Zi(n),this.blobUploader=new Xi(this.blobNameCalc,t,r)}dispose(){this.stopWatcher(),this.checkpointSub?.dispose(),this.checkpointSub=void 0,this.orchestrator?.dispose(),this.orchestrator=void 0,this.blobUploader.dispose(),this.onProgress.dispose(),this.onCheckpoint.dispose(),this.onWatcherUpdate.dispose()}createBlobFilter(t){let n=new Su({workspaceRoot:t});return n.loadDirectory(""),n}async startWatcher(t){if(this.stopWatcher(),!this.orchestrator||!this.blobFilter)throw new Error("Cannot start watcher before workspace has been indexed with indexWorkspace()");let n=this.blobFilter;this.fileWatcher=new Eu({workspaceRoot:t,shouldWatchDirectory:r=>(n.loadDirectory(r),!n.isDirectoryIgnored(r))}),this.watcherProcessor=new Ru({workspaceRoot:t,blobFilter:n,orchestrator:this.orchestrator}),this.watcherProcessor.onUpdate.event(r=>{this.onWatcherUpdate.fire(r)}),this.watcherProcessor.attach(this.fileWatcher),await this.fileWatcher.start(),this.log.info(`File watcher started for ${t}`)}stopWatcher(){this.fileWatcher?.stop(),this.watcherProcessor?.dispose(),this.fileWatcher=null,this.watcherProcessor=null}getIndexingStatus(){let t=this.orchestrator?.filesAccepted??0,n=this.orchestrator?.filesSettled??0;return{itemsInFlight:Math.max(0,t-n),calculateQueueSize:0,probeQueueSize:0,uploadQueueSize:0,probeRetryQueueSize:0,probeRetryBackoffQueueSize:0,calculateErrors:0,probeErrors:0,mtimeCacheHits:0,mtimeCacheMisses:0,pathsAccepted:t,currentFile:void 0,consecutiveNoneIndexedProbes:0,calculateAvgMs:0,calculateMaxMs:0}}emitProgress(t){let n=this.orchestrator?.filesAccepted??0,r=this.orchestrator?.filesSettled??0,o=n+this.filesPreIndexed,i=r+this.filesPreIndexed,s=o>0?Math.floor(i/o*100):0;this.onProgress.fire({phase:t,percentage:s,filesDiscovered:this.filesDiscovered,filesTracked:n,filesProcessed:r,filesIndexed:this.orchestrator?.filesIndexed??0,filesFailed:this.orchestrator?.filesFailed??0,filesRejected:this.orchestrator?.filesRejected??0,filesPreIndexed:this.filesPreIndexed,walkComplete:this.walkComplete,workspaceRoot:this.currentWorkspaceRoot,durationMs:t==="complete"&&this.indexingStartTime?Date.now()-this.indexingStartTime:void 0})}async indexWorkspace(t,n,r={}){if(this.fileWatcher)return this.log.error(`Cannot index workspace for ${n}: file watcher is already active`),{checkpointId:void 0,filesTracked:0,filesProcessed:0,filesSkipped:0,durationMs:0,pathToBlobName:new Map};this.log.info(`Starting workspace indexing for ${n}`+(n===t?"":` (workspace root: ${t})`)),this.walkComplete=!1,this.filesDiscovered=0,this.filesPreIndexed=0,this.currentWorkspaceRoot=t,this.indexingStartTime=Date.now(),this.emitProgress("qualifying");let o=this.createBlobFilter(t);this.blobFilter=o;let i=r.baselineCheckpointId,s=new Wi(this.apiServer,i),a=!1;this.checkpointSub?.dispose(),this.checkpointSub=s.onCheckpoint.event(S=>{a=!0,this.onCheckpoint.fire(S)}),this.orchestrator?.dispose();let l=new Ni(o,this.blobUploader,s);this.orchestrator=l;let c=r.preIndexedFiles;if(c&&c.size>0)if(s.seed(c),this.filesPreIndexed=c.size,i)this.log.info(`Resuming from checkpoint ${i} (${c.size} pre-indexed files)`),a=!0,this.onCheckpoint.fire({checkpointId:i,addedBlobs:[],deletedBlobs:[]});else{let S=Array.from(c.values());this.log.info(`Seeding checkpoint with ${S.length} pre-indexed blobs`),s.update(S,[]),await s.flushToLimit()}i&&r.retiredFiles?.size&&s.update([],Array.from(r.retiredFiles.values()));let d=r.revalidateFiles,u=new Set(d?.keys());i&&d?.size&&s.seed(d);let h=new Promise((S,N)=>{l.onDone(V=>{V.hadFailures&&this.log.warn("Workspace indexing completed with failures"),this.emitProgress("complete"),S()})}),b=l.onBlobSettled.event(()=>{this.emitProgress("indexing")});this.emitProgress("indexing");let f={skipDirectories:r.skipDirectories,signal:r.signal,shouldEnterDirectory:S=>(o.loadDirectory(S),!o.isDirectoryIgnored(S))},A=r.maxTrackableFiles??Yj,m=0;for await(let S of zy(t,n,f)){if(r.signal?.aborted)break;if(l.filesAccepted>=A){this.log.warn(`Workspace exceeds ${A} trackable files, stopping walk`),this.emitProgress("workspace-too-large");break}this.filesDiscovered++;let N=Bj(S.relativePath);if(N===".gitignore"||N===".augmentignore"){o.updateIgnoreFile(S.relativePath);continue}if(d?.has(S.relativePath)){u.delete(S.relativePath),(await o.shouldAcceptBlob({path:S.relativePath,size:S.size,readContent:()=>jy(S.absolutePath)})).accepted?(m++,this.filesPreIndexed++):s.removeByPath(S.relativePath);continue}if(c?.has(S.relativePath)){m++;continue}await l.addFile(S.relativePath,S.size,()=>jy(S.absolutePath)),this.filesDiscovered%1e3===0&&this.emitProgress("indexing")}for(let S of u)s.removeByPath(S);m>0&&this.log.info(`Skipped ${m} pre-indexed files (incremental)`),this.walkComplete=!0,this.emitProgress("indexing"),l.traversalCompleted(),await h,b.dispose(),s.flushCheckpointEvent();let g=s.blobs.checkpointId;!a&&g&&this.onCheckpoint.fire({checkpointId:g,addedBlobs:[],deletedBlobs:[]});let E=Date.now()-(this.indexingStartTime??Date.now()),R=l.filesAccepted,G=l.filesSettled;return this.log.info(`Workspace indexing complete: ${R} tracked, ${G} processed, ${m} skipped (pre-indexed), ${(E/1e3).toFixed(1)}s, checkpoint: ${g??"none"}`),{checkpointId:g,filesTracked:R,filesProcessed:G,filesSkipped:m,durationMs:E,pathToBlobName:l.pathToBlobName}}}});var eU={};wa(eU,{ContextIndexer:()=>Ng});import{relative as qy,resolve as $y}from"node:path";function Ig(e,t){let n=new Map;for(let[r,o]of e)r.startsWith(t)&&n.set(r,o);return n}var Ng,tU=F(()=>{"use strict";xe();dN();En();Ad();wy();Py();Ng=class{gitService;workspaceService;deltaResolver;log=H.child({prefix:"ContextIndexer"});onIndexing=new ce;onCheckpoint=new ce;onWatcherUpdate=new ce;constructor(t,n={}){this.gitService=new Vu(t,n.maxBlobSize,n.uploaderConfig),this.workspaceService=new Xu(t,n.maxBlobSize,n.uploaderConfig),this.deltaResolver=new fd(t,n.deltaResolverOptions),this.workspaceService.onProgress.event(r=>{this.onIndexing.fire(r)}),this.workspaceService.onCheckpoint.event(r=>{this.onCheckpoint.fire(r)}),this.workspaceService.onWatcherUpdate.event(r=>{this.onWatcherUpdate.fire(r)})}getGitRepoDetails(t){return jn(t)}async indexWorkspace(t,n,r){let o=$y(t),i=$y(n),s=uN(o),a,l,c,d,u=null;this.log.info("Looking for previously indexed git SHA...");try{let b=s?await this.deltaResolver.resolveIndexedCommitDelta(s):null;if(b&&s){this.log.info(`Found indexed commit ${b.indexedCommitSha}: ${b.fileInfoMap.size} unchanged, ${b.modifiedFiles.size} modified, ${b.addedFiles.size} added, ${b.deletedFiles.size} deleted, ${b.untrackedFiles.size} untracked`);let f=s===o?"":`${qy(s,o)}/`,A=i===o?f:`${qy(s,i)}/`,m=Ig(b.fileInfoMap,A),g=Ig(b.retiredFileInfoMap,A),E=Ig(b.revalidateFileInfoMap,A);u={commitSha:b.indexedCommitSha,fileCount:m.size},m.size!==b.fileInfoMap.size&&this.log.info(`Filtered delta to ${m.size} files under ${A} (was ${b.fileInfoMap.size})`),a=m,s===o&&i===o&&(l=b.checkpointId,c=g,d=E)}else this.log.info(s?"No previously indexed commit found \u2014 doing full walk":"Not inside a git repository \u2014 doing full walk")}catch(b){this.log.warn("Delta resolution failed, falling back to full walk",b)}return{...await this.workspaceService.indexWorkspace(t,n,{...r,preIndexedFiles:a??r?.preIndexedFiles,baselineCheckpointId:l??r?.baselineCheckpointId,retiredFiles:c??r?.retiredFiles,revalidateFiles:d??r?.revalidateFiles}),baseline:u}}createGitShaCommitIndex(t,n){return this.gitService.createGitShaCommitIndex(t,n)}getIndexingStatus(){return this.gitService.getIndexingStatus()}startWatcher(t){return this.workspaceService.startWatcher(t)}stopWatcher(){this.workspaceService.stopWatcher()}dispose(){this.gitService.dispose(),this.workspaceService.dispose(),this.onIndexing.dispose(),this.onCheckpoint.dispose(),this.onWatcherUpdate.dispose()}}});import{AsyncLocalStorage as Cj}from"node:async_hooks";import{parentPort as rU}from"node:worker_threads";import*as uU from"node:tls";var ut;function hU(e){let t=[],n="",r=!1;for(let o=0;o<e.length;o++){let i=e[o];if(i==='"')r=!r;else if(i==="\\"&&r){if(o++,o===e.length)return;n+=e[o]}else i===" "&&!r?n&&(t.push(n),n=""):n+=i}if(!r)return n&&t.push(n),t}function bU(){let e=hU(process.env.NODE_OPTIONS??"");return e===void 0||[...e,...process.execArgv].some(t=>t.split("=",1)[0]?.replaceAll("_","-")==="--use-openssl-ca")}function Yg(){if(ut!==void 0)return ut;if(process.env.AUGGIE_USE_SYSTEM_CA==="0")return ut="opted-out",ut;if(bU())return ut="explicit-policy",ut;let{getCACertificates:e,setDefaultCACertificates:t}=uU;if(typeof e!="function"||typeof t!="function")return ut="unsupported",ut;try{let n=e("default"),r=e("system");if(r.length===0)return ut="empty-store",ut;t([...n,...r]),ut="enabled"}catch{ut="failed"}return ut}Yg();var{createAugmentClient:yj}=await Promise.resolve().then(()=>(oN(),rN)),{logger:Uj,silenceLogger:xj}=await Promise.resolve().then(()=>(xe(),wS)),{AugmentApiAdapter:vj}=await Promise.resolve().then(()=>(sN(),iN)),{ContextIndexer:wj}=await Promise.resolve().then(()=>(tU(),eU));if(!rU)throw new Error("indexing-worker.ts must be run as a worker thread");var Iu=rU,Fg=new Cj;process.on("uncaughtException",e=>{Iu.postMessage({type:"fatalError",message:e.message,stack:e.stack,errorType:"uncaughtException"})});process.on("unhandledRejection",e=>{let t=e instanceof Error?e:new Error(String(e));Iu.postMessage({type:"fatalError",message:t.message,stack:t.stack,errorType:"unhandledRejection"})});var Gu=null,ho=new Map,Wu=new Map,xa=new Map,Fi=null,Jj=2e3;function gt(e){Iu.postMessage(e)}function bo(e,t,n,r){gt({type:"log",workspaceId:r??Fg.getStore(),level:e,prefix:t,message:n,timestamp:Date.now()})}function nU(e){let t=ho.get(e);if(t)return t;if(!Gu)throw new Error("Worker not initialized \u2014 send 'configure' first");let n=Gu();return n.onIndexing.event(r=>{Wu.set(e,r),gt({type:"progress",workspaceId:e,progress:r})}),n.onCheckpoint.event(r=>{gt({type:"checkpointUpdate",workspaceId:e,checkpoint:r})}),n.onWatcherUpdate.event(r=>{gt({type:"watcherUpdate",workspaceId:e,filesAdded:r.filesAdded,filesDeleted:r.filesDeleted})}),ho.set(e,n),n}xj();Uj.on("data",e=>{let t=e.level??"info";bo(t,e.prefix??"worker",String(e.message??""),Fg.getStore())});function kj(){Fi||(Fi=setInterval(()=>{let e=process.memoryUsage();gt({type:"metrics",heapUsedMb:Math.round(e.heapUsed/1024/1024),rssMb:Math.round(e.rss/1024/1024),activeHandles:process._getActiveHandles?.().length??0,timestamp:Date.now()})},Jj),Fi.unref())}function _j(){Fi&&(clearInterval(Fi),Fi=null)}async function Qj(e){switch(e.type){case"configure":{let{apiToken:t,apiUrl:n,indexerOptions:r}=e.config;bo("info","IndexingWorker",`Creating API client for ${n}`);let o=yj({apiToken:t,apiUrl:n}),i=new vj(o,n,t);Gu=()=>new wj(i,r),kj(),bo("info","IndexingWorker","Configured successfully"),gt({type:"result",requestId:e.requestId});break}case"indexWorkspace":{let t=nU(e.workspaceId),n=e.skipDirectories?new Set(e.skipDirectories):void 0,r=e.folderToIndex??e.workspaceRoot,o=await t.indexWorkspace(e.workspaceRoot,r,{skipDirectories:n}),{pathToBlobName:i,...s}=o;try{let a=await t.createGitShaCommitIndex(e.workspaceRoot,"HEAD");bo("info","IndexingWorker",`Git SHA commit index created: ${a.commitSha}`)}catch(a){bo("warn","IndexingWorker",`Git SHA commit index failed (non-fatal): ${a}`)}bo("info","IndexingWorker","Starting file watcher"),await t.startWatcher(e.workspaceRoot),gt({type:"result",requestId:e.requestId,data:s});break}case"createGitShaCommitIndex":{let n=await nU(e.workspaceId).createGitShaCommitIndex(e.repoRoot,e.revision);gt({type:"result",requestId:e.requestId,data:n});break}case"statusRequest":{let t=ho.get(e.workspaceId)?.getIndexingStatus()??{itemsInFlight:0,calculateQueueSize:0,probeQueueSize:0,uploadQueueSize:0,probeRetryQueueSize:0,probeRetryBackoffQueueSize:0,calculateErrors:0,probeErrors:0,mtimeCacheHits:0,mtimeCacheMisses:0,pathsAccepted:0,currentFile:void 0,consecutiveNoneIndexedProbes:0,calculateAvgMs:0,calculateMaxMs:0};gt({type:"statusResponse",requestId:e.requestId,workspaceId:e.workspaceId,status:t,progress:Wu.get(e.workspaceId)??null});break}case"dispose":{ho.get(e.workspaceId)?.dispose(),ho.delete(e.workspaceId),Wu.delete(e.workspaceId),gt({type:"result",requestId:e.requestId});break}case"shutdown":{for(let t of ho.values())t.dispose();ho.clear(),Wu.clear(),xa.clear(),Gu=null,_j(),gt({type:"result",requestId:e.requestId}),setTimeout(()=>process.exit(0),100);break}}}Iu.on("message",e=>{let t="workspaceId"in e?e.workspaceId:void 0,n=async()=>{try{await Qj(e)}catch(i){let s=i instanceof Error?i:new Error(String(i));gt({type:"error",requestId:e.requestId,message:s.message,stack:s.stack})}};if(!t){n();return}let o=(xa.get(t)??Promise.resolve()).then(()=>Fg.run(t,n));xa.set(t,o),o.finally(()=>{xa.get(t)===o&&xa.delete(t)})});gt({type:"ready"});bo("info","IndexingWorker","single worker indexing enabled");
|
|
143
143
|
/*! Bundled license information:
|
|
144
144
|
|
|
145
145
|
safe-buffer/index.js:
|
package/package.json
CHANGED