pando-ai 0.0.19 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +138 -138
- package/dist/watcher-process.js +136 -136
- package/dist/workers/{chunk-UIWCIYYF.mjs → chunk-HDFL4PL5.mjs} +15 -15
- package/dist/workers/indexer-worker.mjs +1 -1
- package/dist/workers/snapshot-worker.mjs +4 -4
- package/package.json +1 -1
- package/resources/tools/pando-tools.json +59 -555
- package/tools/clojure-editor/lib/pando-clojure-editor-standalone.jar +0 -0
- package/tools/clojure-indexer/lib/pando-clojure-indexer-standalone.jar +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{a as N,b as
|
|
2
|
-
`),
|
|
3
|
-
`,"utf8");try{await f.add({fs:o,dir:this.repoDir,filepath:".gitignore"})}catch{}u(`[GitHistoryStore] restored missing .gitignore at ${t}`)}catch(e){at(`[GitHistoryStore] failed to recreate .gitignore: ${e?.message||e}`)}}normalizeLogicalPath(t){return String(t||"").replace(/\\/g,"/").replace(/^(?:\.\/)+/,"").replace(/^\/+/,"")}gitExists(){try{return v("git",["--version"],{cwd:this.repoDir,stdio:"ignore"}),!0}catch{return!1}}createSnapshotNative(t,e,n,r){let c=(typeof n=="string"?n.match(/^AST-Restore-Trace-Id:\s*(.+)$/m):null)?.[1]?.trim()||null,h=e;if(!h)try{h=v("git",["rev-parse","HEAD"],{cwd:this.repoDir,encoding:"utf8"}).trim()}catch{h=void 0}let g=new Map,y=Date.now();try{u("[GitHistoryStore] native snapshot start",{traceId:c,repoDir:this.repoDir,memberCount:t.length,parentOid:h||null})}catch{}for(let a=0;a<t.length;a++){let l=t[a];if(l.content==null)throw new Error(`Direct snapshot requires content for ${l.logicalPath}`);let S=Buffer.isBuffer(l.content)?l.content:Buffer.from(l.content),b=this.normalizeLogicalPath(l.logicalPath);if(!b)throw new Error("Direct snapshot requires non-empty logicalPath");let d=Date.now();try{u("[GitHistoryStore] native hash-object start",{traceId:c,repoDir:this.repoDir,index:a+1,total:t.length,logicalPath:b,bytes:S.length})}catch{}let T;try{T=v("git",["hash-object","-w","--stdin"],{cwd:this.repoDir,input:S}).toString("utf8").trim()}catch(D){try{at("[GitHistoryStore] native hash-object failed",{traceId:c,repoDir:this.repoDir,index:a+1,total:t.length,logicalPath:b,bytes:S.length,durationMs:Date.now()-d,message:D?.message||String(D),status:D?.status??null,signal:D?.signal??null,stdout:D?.stdout?String(D.stdout).slice(0,500):null,stderr:D?.stderr?String(D.stderr).slice(0,500):null})}catch{}throw D}let E=Date.now()-d;try{(E>1e3||a<3||a===t.length-1)&&u("[GitHistoryStore] native hash-object done",{traceId:c,repoDir:this.repoDir,index:a+1,total:t.length,logicalPath:b,bytes:S.length,durationMs:E,oid:T})}catch{}g.set(b,T)}try{u("[GitHistoryStore] native hash-object phase complete",{traceId:c,repoDir:this.repoDir,memberCount:t.length,durationMs:Date.now()-y})}catch{}let p=x.join(this.repoDir,`.pando-index-${process.pid}-${Date.now()}`),w={...process.env,GIT_INDEX_FILE:p};try{let a=Date.now();try{u("[GitHistoryStore] native read-tree begin",{traceId:c,repoDir:this.repoDir,tmpIndex:p})}catch{}v("git",["read-tree","--empty"],{cwd:this.repoDir,env:w});try{u("[GitHistoryStore] native read-tree complete",{traceId:c,repoDir:this.repoDir,durationMs:Date.now()-a})}catch{}let l=Array.from(g.keys()).sort((A,M)=>A.localeCompare(M)),S=Date.now();for(let A of l){let M=g.get(A);v("git",["update-index","--add","--cacheinfo","100644",M,A],{cwd:this.repoDir,env:w})}try{u("[GitHistoryStore] native update-index complete",{traceId:c,repoDir:this.repoDir,entryCount:l.length,durationMs:Date.now()-S})}catch{}let b=Date.now();try{u("[GitHistoryStore] native write-tree begin",{traceId:c,repoDir:this.repoDir,entryCount:l.length})}catch{}let d=v("git",["write-tree"],{cwd:this.repoDir,env:w}).toString("utf8").trim();try{u("[GitHistoryStore] native write-tree complete",{traceId:c,repoDir:this.repoDir,treeOid:d,durationMs:Date.now()-b})}catch{}let T=["commit-tree",d];h&&T.push("-p",h),n&&T.push("-m",n);let E=Date.now();try{u("[GitHistoryStore] native commit-tree begin",{traceId:c,repoDir:this.repoDir,treeOid:d,parentOid:h||null})}catch{}let D=v("git",T,{cwd:this.repoDir}).toString("utf8").trim();try{u("[GitHistoryStore] native commit-tree complete",{traceId:c,repoDir:this.repoDir,commitOid:D,durationMs:Date.now()-E})}catch{}let _=Date.now();try{u("[GitHistoryStore] native update-ref begin",{traceId:c,repoDir:this.repoDir,commitOid:D})}catch{}v("git",["update-ref","refs/heads/master",D],{cwd:this.repoDir});try{u("[GitHistoryStore] native update-ref complete",{traceId:c,repoDir:this.repoDir,commitOid:D,durationMs:Date.now()-_})}catch{}return{snapshotId:D,parent:h}}finally{try{o.unlinkSync(p)}catch{}try{o.unlinkSync(`${p}.lock`)}catch{}}}async readObject(t){let{object:e}=await f.readObject({fs:o,dir:this.repoDir,oid:t});return Buffer.from(e)}async hasObject(t){try{return await f.readObject({fs:o,dir:this.repoDir,oid:t}),!0}catch{return!1}}async createSnapshot(t,e){R(e,"Snapshot cancelled"),await this.ensureInitialized(),u(`[${new Date().toISOString()}] [GitHistoryStore] Creating snapshot (streaming) with ${t.members.length} members`);let n=[...t.members].map(m=>({...m,logicalPath:this.normalizeLogicalPath(m.logicalPath)})).filter(m=>!!m.logicalPath).sort((m,I)=>m.logicalPath.localeCompare(I.logicalPath)),r=this.gitExists()&&!e;try{r?N.info("[GitHistoryStore] Using native git snapshot path",{members:n.length}):N.info("[GitHistoryStore] Using JS snapshot path",{members:n.length,git:!1,cancellable:!!e})}catch{}if(r)try{return this.createSnapshotNative(n,t.parent,t.message,t.when).snapshotId}catch(m){try{N.warn(`[GitHistoryStore] Native git path failed; falling back to JS path: ${m?.message||m}`)}catch{}}let i=Date.now(),c=m=>m.toString("hex"),h=m=>Dt("crypto").createHash("sha1").update(m).digest(),g=m=>{let I=Buffer.from(`blob ${m.length}\0`,"utf8"),C=Buffer.concat([I,m]);return c(h(C))},y=Math.max(1,Math.min(64,Number(process.env.SNAPSHOT_BLOB_CONCURRENCY||16))),p=String(process.env.SNAPSHOT_PRECOMPUTE_OIDS||"1")!=="0";try{N.info("[GitHistoryStore] JS snapshot settings",{SNAPSHOT_BLOB_CONCURRENCY:y,SNAPSHOT_PRECOMPUTE_OIDS:p})}catch{}let w=new Map,a=0,l=0,S=0,b=n.map(m=>({path:m.logicalPath,buf:Buffer.isBuffer(m.content)?m.content:Buffer.from(m.content)})),d=async()=>{for(;;){R(e,"Snapshot cancelled");let m;if(a<b.length)m=b[a++];else break;let I;if(p)try{let C=g(m.buf);await this.hasObject(C)&&(I=C,S++)}catch{}if(I||(I=await f.writeBlob({fs:o,dir:this.repoDir,blob:m.buf}),l++),R(e,"Snapshot cancelled"),!I)throw new Error("Failed to compute blob object id");w.set(m.path,I)}},T=Array.from({length:Math.min(y,b.length)},()=>d());await Promise.all(T),R(e,"Snapshot cancelled"),u(`[GitHistoryStore] Blobs ready wrote=${l} skipped=${S} in ${Date.now()-i}ms`);let E=new B(this.repoDir),D=Array.from(w.keys()).sort((m,I)=>m.localeCompare(I));for(let m of D)R(e,"Snapshot cancelled"),await E.addFile(m,w.get(m));R(e,"Snapshot cancelled");let _=Date.now(),A=await E.finish();u(`[GitHistoryStore] Wrote tree(s). root=${A} in ${Date.now()-_}ms`);let M=t.parent;if(!M)try{M=await f.resolveRef({fs:o,dir:this.repoDir,ref:"HEAD"})}catch{}R(e,"Snapshot cancelled");let H=t.when?Math.floor(t.when/1e3):Math.floor(Date.now()/1e3),L=new Date(H*1e3).getTimezoneOffset(),$=await f.commit({fs:o,dir:this.repoDir,message:t.message,parent:M?[M]:[],tree:A,author:{name:"ast-db",email:"ast-db@example.com",timestamp:H,timezoneOffset:L},committer:{name:"ast-db",email:"ast-db@example.com",timestamp:H,timezoneOffset:L}});return await f.writeRef({fs:o,dir:this.repoDir,ref:"refs/heads/master",value:$,force:!0}),u(`[GitHistoryStore] Snapshot commit oid ${$}`),$}async listSnapshotMembers(t){await this.ensureInitialized();let e=i=>Math.round((i||0)/(1024*1024)),n=()=>{let i=process.memoryUsage();return`rss=${e(i.rss)}MB heapUsed=${e(i.heapUsed)}MB heapTotal=${e(i.heapTotal)}MB`},r=[];return u(`[${new Date().toISOString()}] [GitHistoryStore] listSnapshotMembers(${t}) start (${n()})`),await f.walk({fs:o,dir:this.repoDir,trees:[f.TREE({ref:t})],map:async(i,[c])=>{if(!c)return;if(await c.type()==="blob"){let g=await c.oid();r.push({logicalPath:i,objectId:g})}}}),u(`[${new Date().toISOString()}] [GitHistoryStore] listSnapshotMembers(${t}) -> ${r.length} blobs`),r.filter(i=>i.logicalPath&&i.logicalPath!==".").map(i=>({logicalPath:i.logicalPath.replace(/^\.\//,""),objectId:i.objectId}))}async readCommit(t){let{commit:e}=await f.readCommit({fs:o,dir:this.repoDir,oid:t});return{message:e.message,committer:e.committer}}async readCommitParent(t){let{commit:e}=await f.readCommit({fs:o,dir:this.repoDir,oid:t});return Array.isArray(e.parent)&&e.parent.length>0?String(e.parent[0]):void 0}async createSnapshotFromDisk(t){await this.ensureInitialized(),u(`[${new Date().toISOString()}] [GitHistoryStore] Creating snapshot from disk (streaming) with ${t.relPaths.length} members`);let e=[...t.relPaths].map(a=>this.normalizeLogicalPath(a)).filter(Boolean).sort((a,l)=>a.localeCompare(l)),n=Date.now(),r=new B(this.repoDir),i=0;for(let a of e){let l=x.join(this.baseDir,a);try{let S=o.readFileSync(l),b=await f.writeBlob({fs:o,dir:this.repoDir,blob:S});await r.addFile(a,b),i++}catch{}}u(`[GitHistoryStore] Wrote ${i} blobs (disk) in ${Date.now()-n}ms`);let c=Date.now(),h=await r.finish();u(`[GitHistoryStore] Wrote tree(s) (disk). root=${h} in ${Date.now()-c}ms`);let g;try{g=await f.resolveRef({fs:o,dir:this.repoDir,ref:"HEAD"})}catch{}let y=t.when?Math.floor(t.when/1e3):Math.floor(Date.now()/1e3),p=new Date(y*1e3).getTimezoneOffset(),w=await f.commit({fs:o,dir:this.repoDir,message:t.message,parent:g?[g]:[],tree:h,author:{name:"ast-db",email:"ast-db@example.com",timestamp:y,timezoneOffset:p},committer:{name:"ast-db",email:"ast-db@example.com",timestamp:y,timezoneOffset:p}});return u(`[GitHistoryStore] Snapshot commit oid ${w}`),w}async createSnapshotFromDiskIfChanged(t){await this.ensureInitialized(),u(`[${new Date().toISOString()}] [GitHistoryStore] Creating snapshot from disk (diff) with ${t.relPaths.length} members`);let e=[...t.relPaths].map(a=>this.normalizeLogicalPath(a)).filter(Boolean).sort((a,l)=>a.localeCompare(l)),n=Date.now(),r=new B(this.repoDir),i=0;for(let a of e){let l=x.join(this.baseDir,a);try{let S=o.readFileSync(l),b=await f.writeBlob({fs:o,dir:this.repoDir,blob:S});await r.addFile(a,b),i++}catch{}}u(`[GitHistoryStore] Wrote ${i} blobs (disk) in ${Date.now()-n}ms`);let c=Date.now(),h=await r.finish();u(`[GitHistoryStore] Wrote tree(s) (disk). root=${h} in ${Date.now()-c}ms`);let g=t.parent;if(!g)try{g=await f.resolveRef({fs:o,dir:this.repoDir,ref:"HEAD"})}catch{}if(g)try{let{commit:a}=await f.readCommit({fs:o,dir:this.repoDir,oid:g});if(a?.tree===h){u("[GitHistoryStore] Snapshot identical to parent; skipping commit",{parentOid:g,tree:h});let l=await this.readCommitParent(g);return{snapshotId:g,identical:!0,parent:l}}}catch(a){u("[GitHistoryStore] Parent read failed; proceeding with commit",{error:a?.message||String(a)})}let y=t.when?Math.floor(t.when/1e3):Math.floor(Date.now()/1e3),p=new Date(y*1e3).getTimezoneOffset(),w=await f.commit({fs:o,dir:this.repoDir,message:t.message,parent:g?[g]:[],tree:h,author:{name:"ast-db",email:"ast-db@example.com",timestamp:y,timezoneOffset:p},committer:{name:"ast-db",email:"ast-db@example.com",timestamp:y,timezoneOffset:p}});return await f.writeRef({fs:o,dir:this.repoDir,ref:"refs/heads/master",value:w,force:!0}),u(`[GitHistoryStore] Snapshot commit oid ${w}`),{snapshotId:w,identical:!1,parent:g}}};function Z(s){let t={},e=s.split(/\r?\n/);for(let n of e){let r=n.match(/^([A-Za-z0-9-]+):\s*(.*)$/);r&&(t[r[1]]=r[2])}return t}Tt();import Pt from"fs";import G from"path";import ct from"ignore";import{Project as Wt}from"ts-morph";var xt=new Set(["node_modules",".git",".pando-data",".clj-kondo"]);function ht(s,t){if(!t?.length)return null;let e=t.map(r=>r.replace(/^\/+/,"").replace(/\/+$/,"")).filter(Boolean).map(r=>`${r}/`);if(!e.length)return null;let n=r=>r.replace(/\\/g,"/");return r=>{let i=n(G.relative(s,r));if(!i||i.startsWith(".."))return!1;let c=i.endsWith("/")?i:`${i}/`;return e.some(h=>c.startsWith(h))}}function pt(s,t,e){let n=e?.shouldExclude||null,r=[],i=new Set(Array.from(t,p=>p.toLowerCase())),c=G.resolve(e?.gitignoreRoot??s),h=K(c,""),g=ct().add(h),y=[{dir:s,relDir:"",rules:h,ig:g}];for(;y.length;){let p=y.pop(),w=[];try{w=Pt.readdirSync(p.dir,{withFileTypes:!0})}catch{continue}for(let a of w){let l=G.join(p.dir,a.name);if(!(typeof a.isSymbolicLink=="function"&&a.isSymbolicLink())){if(a.isDirectory()){if(xt.has(a.name)||n?.(l))continue;let b=p.relDir?`${p.relDir}/${a.name}`:a.name,d=lt(b);if(p.ig.ignores(d))continue;let T=p.rules.slice(),E=K(l,d);E.length&&T.push(...E);let D=E.length?ct().add(T):p.ig;y.push({dir:l,relDir:d,rules:T,ig:D})}else if(a.isFile()){if(n?.(l))continue;let b=lt(G.relative(s,l));if(p.ig.ignores(b))continue;let d=G.extname(a.name).toLowerCase();i.has(d)&&r.push(l)}}}}return r}function lt(s){return s.replace(/\\/g,"/")}Y();It();Y();import q from"fs";import Mt from"path";function dt(s){s.pragma("journal_mode = WAL"),s.pragma("synchronous = NORMAL"),s.pragma("busy_timeout = 10000");try{s.pragma("temp_store = MEMORY")}catch{}s.exec(`
|
|
1
|
+
import{a as N,b as Tt,i as R,j as V}from"./chunk-HDFL4PL5.mjs";import{a as W,b as it,c as Y,e as A,f as Dt}from"./chunk-HQDE7M4W.mjs";import{a as K,b as Et}from"./chunk-Z5RGEDVQ.mjs";import{a as wt,c as st}from"./chunk-AYCBSZ56.mjs";import{parentPort as j}from"worker_threads";import et from"path";Tt();import*as o from"fs";import*as P from"path";import*as g from"isomorphic-git";import{execFileSync as v}from"child_process";Y();import*as J from"path";function nt(r){let t=W(r);return{root:t,historyGit:J.join(t,"history.git"),workdir:J.join(t,"workdir")}}function f(r,t){try{N.info(r,t)}catch{}}function ot(r,t){try{N.warn(r,t)}catch{}}var B=class{constructor(t){this.repoDir=t;this.stack=[{name:"",entries:[],dirNames:new Set,fileNames:new Set}]}currentDirs(){return this.stack.slice(1).map(t=>t.name)}lcpLen(t,e){let n=0;for(;n<t.length&&n<e.length&&t[n]===e[n];)n++;return n}async flushTop(){if(this.stack.length<=1)return;let t=this.stack.pop();t.entries.sort((i,s)=>i.path.localeCompare(s.path));let e=await g.writeTree({fs:o,dir:this.repoDir,tree:t.entries}),n=this.stack[this.stack.length-1];n.entries.push({mode:"040000",path:t.name,oid:e,type:"tree"}),n.dirNames.add(t.name)}async addFile(t,e){let n=t.replace(/^\.\//,"").replace(/\\/g,"/"),i=n.split("/").filter(Boolean);if(!i.length)return;let s=i.slice(0,-1),a=i[i.length-1],l=this.currentDirs(),p=this.lcpLen(l,s);for(let S=l.length;S>p;S--)await this.flushTop();for(let S=p;S<s.length;S++){let y=s[S];if(this.stack[this.stack.length-1].fileNames.has(y))throw new Error(`Path conflict: file exists where directory expected: ${s.slice(0,S+1).join("/")}`);this.stack.push({name:y,entries:[],dirNames:new Set,fileNames:new Set})}let m=this.stack[this.stack.length-1];if(m.dirNames.has(a))throw new Error(`Path conflict: directory exists where file expected: ${n}`);m.entries.push({mode:"100644",path:a,oid:e,type:"blob"}),m.fileNames.add(a)}async finish(){for(;this.stack.length>1;)await this.flushTop();let t=this.stack[0];return t.entries.sort((e,n)=>e.path.localeCompare(n.path)),g.writeTree({fs:o,dir:this.repoDir,tree:t.entries})}},H=class{constructor(t){this.baseDir=t.baseDir;let e=nt(t.shadowDir??t.baseDir);this.repoDir=P.join(e.root,"history")}async ensureInitialized(){o.mkdirSync(this.repoDir,{recursive:!0});let t=P.join(this.repoDir,".git");if(o.existsSync(t)){await this.ensureDefaultGitignore();return}let e=P.join(this.repoDir,".init.lock"),n=s=>new Promise(a=>setTimeout(a,s)),i=null;try{try{i=o.openSync(e,"wx"),o.writeFileSync(i,String(Date.now()))}catch{let s=Date.now(),a=3e4;for(;!o.existsSync(t);){try{let l=o.statSync(e);if(Date.now()-l.mtimeMs>a){try{o.unlinkSync(e)}catch{}break}}catch{}if(Date.now()-s>a)break;await n(200)}if(o.existsSync(t))return;i=o.openSync(e,"wx"),o.writeFileSync(i,String(Date.now()))}if(o.existsSync(t))return;f(`[${new Date().toISOString()}] [GitHistoryStore] Initializing history repo at ${this.repoDir}`),await g.init({fs:o,dir:this.repoDir}),f(`[${new Date().toISOString()}] [GitHistoryStore] git.init OK`),await g.setConfig({fs:o,dir:this.repoDir,path:"user.name",value:"ast-db"}),await g.setConfig({fs:o,dir:this.repoDir,path:"user.email",value:"ast-db@example.com"}),f(`[${new Date().toISOString()}] [GitHistoryStore] git config set (user.name/user.email)`),o.writeFileSync(P.join(this.repoDir,".gitignore"),`# ast history repo
|
|
2
|
+
`),f(`[${new Date().toISOString()}] [GitHistoryStore] wrote .gitignore`)}finally{try{i!=null&&o.closeSync(i)}catch{}try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}await this.ensureDefaultGitignore()}async ensureDefaultGitignore(){let t=P.join(this.repoDir,".gitignore");if(!o.existsSync(t))try{o.mkdirSync(P.dirname(t),{recursive:!0}),o.writeFileSync(t,`# ast history repo
|
|
3
|
+
`,"utf8");try{await g.add({fs:o,dir:this.repoDir,filepath:".gitignore"})}catch{}f(`[GitHistoryStore] restored missing .gitignore at ${t}`)}catch(e){ot(`[GitHistoryStore] failed to recreate .gitignore: ${e?.message||e}`)}}normalizeLogicalPath(t){return String(t||"").replace(/\\/g,"/").replace(/^(?:\.\/)+/,"").replace(/^\/+/,"")}gitExists(){try{return v("git",["--version"],{cwd:this.repoDir,stdio:"ignore"}),!0}catch{return!1}}createSnapshotNative(t,e,n,i){let a=(typeof n=="string"?n.match(/^AST-Restore-Trace-Id:\s*(.+)$/m):null)?.[1]?.trim()||null,l=e;if(!l)try{l=v("git",["rev-parse","HEAD"],{cwd:this.repoDir,encoding:"utf8"}).trim()}catch{l=void 0}let p=new Map,m=Date.now();try{f("[GitHistoryStore] native snapshot start",{traceId:a,repoDir:this.repoDir,memberCount:t.length,parentOid:l||null})}catch{}for(let c=0;c<t.length;c++){let h=t[c];if(h.content==null)throw new Error(`Direct snapshot requires content for ${h.logicalPath}`);let b=Buffer.isBuffer(h.content)?h.content:Buffer.from(h.content),w=this.normalizeLogicalPath(h.logicalPath);if(!w)throw new Error("Direct snapshot requires non-empty logicalPath");let u=Date.now();try{f("[GitHistoryStore] native hash-object start",{traceId:a,repoDir:this.repoDir,index:c+1,total:t.length,logicalPath:w,bytes:b.length})}catch{}let T;try{T=v("git",["hash-object","-w","--stdin"],{cwd:this.repoDir,input:b}).toString("utf8").trim()}catch(D){try{ot("[GitHistoryStore] native hash-object failed",{traceId:a,repoDir:this.repoDir,index:c+1,total:t.length,logicalPath:w,bytes:b.length,durationMs:Date.now()-u,message:D?.message||String(D),status:D?.status??null,signal:D?.signal??null,stdout:D?.stdout?String(D.stdout).slice(0,500):null,stderr:D?.stderr?String(D.stderr).slice(0,500):null})}catch{}throw D}let E=Date.now()-u;try{(E>1e3||c<3||c===t.length-1)&&f("[GitHistoryStore] native hash-object done",{traceId:a,repoDir:this.repoDir,index:c+1,total:t.length,logicalPath:w,bytes:b.length,durationMs:E,oid:T})}catch{}p.set(w,T)}try{f("[GitHistoryStore] native hash-object phase complete",{traceId:a,repoDir:this.repoDir,memberCount:t.length,durationMs:Date.now()-m})}catch{}let S=P.join(this.repoDir,`.pando-index-${process.pid}-${Date.now()}`),y={...process.env,GIT_INDEX_FILE:S};try{let c=Date.now();try{f("[GitHistoryStore] native read-tree begin",{traceId:a,repoDir:this.repoDir,tmpIndex:S})}catch{}v("git",["read-tree","--empty"],{cwd:this.repoDir,env:y});try{f("[GitHistoryStore] native read-tree complete",{traceId:a,repoDir:this.repoDir,durationMs:Date.now()-c})}catch{}let h=Array.from(p.keys()).sort((k,M)=>k.localeCompare(M)),b=Date.now();for(let k of h){let M=p.get(k);v("git",["update-index","--add","--cacheinfo","100644",M,k],{cwd:this.repoDir,env:y})}try{f("[GitHistoryStore] native update-index complete",{traceId:a,repoDir:this.repoDir,entryCount:h.length,durationMs:Date.now()-b})}catch{}let w=Date.now();try{f("[GitHistoryStore] native write-tree begin",{traceId:a,repoDir:this.repoDir,entryCount:h.length})}catch{}let u=v("git",["write-tree"],{cwd:this.repoDir,env:y}).toString("utf8").trim();try{f("[GitHistoryStore] native write-tree complete",{traceId:a,repoDir:this.repoDir,treeOid:u,durationMs:Date.now()-w})}catch{}let T=["commit-tree",u];l&&T.push("-p",l),n&&T.push("-m",n);let E=Date.now();try{f("[GitHistoryStore] native commit-tree begin",{traceId:a,repoDir:this.repoDir,treeOid:u,parentOid:l||null})}catch{}let D=v("git",T,{cwd:this.repoDir}).toString("utf8").trim();try{f("[GitHistoryStore] native commit-tree complete",{traceId:a,repoDir:this.repoDir,commitOid:D,durationMs:Date.now()-E})}catch{}let _=Date.now();try{f("[GitHistoryStore] native update-ref begin",{traceId:a,repoDir:this.repoDir,commitOid:D})}catch{}v("git",["update-ref","refs/heads/master",D],{cwd:this.repoDir});try{f("[GitHistoryStore] native update-ref complete",{traceId:a,repoDir:this.repoDir,commitOid:D,durationMs:Date.now()-_})}catch{}return{snapshotId:D,parent:l}}finally{try{o.unlinkSync(S)}catch{}try{o.unlinkSync(`${S}.lock`)}catch{}}}async readObject(t){let{object:e}=await g.readObject({fs:o,dir:this.repoDir,oid:t});return Buffer.from(e)}async hasObject(t){try{return await g.readObject({fs:o,dir:this.repoDir,oid:t}),!0}catch{return!1}}async createSnapshot(t,e){R(e,"Snapshot cancelled"),await this.ensureInitialized(),f(`[${new Date().toISOString()}] [GitHistoryStore] Creating snapshot (streaming) with ${t.members.length} members`);let n=[...t.members].map(d=>({...d,logicalPath:this.normalizeLogicalPath(d.logicalPath)})).filter(d=>!!d.logicalPath).sort((d,x)=>d.logicalPath.localeCompare(x.logicalPath)),i=this.gitExists()&&!e;try{i?N.info("[GitHistoryStore] Using native git snapshot path",{members:n.length}):N.info("[GitHistoryStore] Using JS snapshot path",{members:n.length,git:!1,cancellable:!!e})}catch{}if(i)try{return this.createSnapshotNative(n,t.parent,t.message,t.when).snapshotId}catch(d){try{N.warn(`[GitHistoryStore] Native git path failed; falling back to JS path: ${d?.message||d}`)}catch{}}let s=Date.now(),a=d=>d.toString("hex"),l=d=>wt("crypto").createHash("sha1").update(d).digest(),p=d=>{let x=Buffer.from(`blob ${d.length}\0`,"utf8"),C=Buffer.concat([x,d]);return a(l(C))},m=Math.max(1,Math.min(64,Number(process.env.SNAPSHOT_BLOB_CONCURRENCY||16))),S=String(process.env.SNAPSHOT_PRECOMPUTE_OIDS||"1")!=="0";try{N.info("[GitHistoryStore] JS snapshot settings",{SNAPSHOT_BLOB_CONCURRENCY:m,SNAPSHOT_PRECOMPUTE_OIDS:S})}catch{}let y=new Map,c=0,h=0,b=0,w=n.map(d=>({path:d.logicalPath,buf:Buffer.isBuffer(d.content)?d.content:Buffer.from(d.content)})),u=async()=>{for(;;){R(e,"Snapshot cancelled");let d;if(c<w.length)d=w[c++];else break;let x;if(S)try{let C=p(d.buf);await this.hasObject(C)&&(x=C,b++)}catch{}if(x||(x=await g.writeBlob({fs:o,dir:this.repoDir,blob:d.buf}),h++),R(e,"Snapshot cancelled"),!x)throw new Error("Failed to compute blob object id");y.set(d.path,x)}},T=Array.from({length:Math.min(m,w.length)},()=>u());await Promise.all(T),R(e,"Snapshot cancelled"),f(`[GitHistoryStore] Blobs ready wrote=${h} skipped=${b} in ${Date.now()-s}ms`);let E=new B(this.repoDir),D=Array.from(y.keys()).sort((d,x)=>d.localeCompare(x));for(let d of D)R(e,"Snapshot cancelled"),await E.addFile(d,y.get(d));R(e,"Snapshot cancelled");let _=Date.now(),k=await E.finish();f(`[GitHistoryStore] Wrote tree(s). root=${k} in ${Date.now()-_}ms`);let M=t.parent;if(!M)try{M=await g.resolveRef({fs:o,dir:this.repoDir,ref:"HEAD"})}catch{}R(e,"Snapshot cancelled");let $=t.when?Math.floor(t.when/1e3):Math.floor(Date.now()/1e3),L=new Date($*1e3).getTimezoneOffset(),F=await g.commit({fs:o,dir:this.repoDir,message:t.message,parent:M?[M]:[],tree:k,author:{name:"ast-db",email:"ast-db@example.com",timestamp:$,timezoneOffset:L},committer:{name:"ast-db",email:"ast-db@example.com",timestamp:$,timezoneOffset:L}});return await g.writeRef({fs:o,dir:this.repoDir,ref:"refs/heads/master",value:F,force:!0}),f(`[GitHistoryStore] Snapshot commit oid ${F}`),F}async listSnapshotMembers(t){await this.ensureInitialized();let e=s=>Math.round((s||0)/(1024*1024)),n=()=>{let s=process.memoryUsage();return`rss=${e(s.rss)}MB heapUsed=${e(s.heapUsed)}MB heapTotal=${e(s.heapTotal)}MB`},i=[];return f(`[${new Date().toISOString()}] [GitHistoryStore] listSnapshotMembers(${t}) start (${n()})`),await g.walk({fs:o,dir:this.repoDir,trees:[g.TREE({ref:t})],map:async(s,[a])=>{if(!a)return;if(await a.type()==="blob"){let p=await a.oid();i.push({logicalPath:s,objectId:p})}}}),f(`[${new Date().toISOString()}] [GitHistoryStore] listSnapshotMembers(${t}) -> ${i.length} blobs`),i.filter(s=>s.logicalPath&&s.logicalPath!==".").map(s=>({logicalPath:s.logicalPath.replace(/^\.\//,""),objectId:s.objectId}))}async readCommit(t){let{commit:e}=await g.readCommit({fs:o,dir:this.repoDir,oid:t});return{message:e.message,committer:e.committer}}async readCommitParent(t){let{commit:e}=await g.readCommit({fs:o,dir:this.repoDir,oid:t});return Array.isArray(e.parent)&&e.parent.length>0?String(e.parent[0]):void 0}async createSnapshotFromDisk(t){await this.ensureInitialized(),f(`[${new Date().toISOString()}] [GitHistoryStore] Creating snapshot from disk (streaming) with ${t.relPaths.length} members`);let e=[...t.relPaths].map(c=>this.normalizeLogicalPath(c)).filter(Boolean).sort((c,h)=>c.localeCompare(h)),n=Date.now(),i=new B(this.repoDir),s=0;for(let c of e){let h=P.join(this.baseDir,c);try{let b=o.readFileSync(h),w=await g.writeBlob({fs:o,dir:this.repoDir,blob:b});await i.addFile(c,w),s++}catch{}}f(`[GitHistoryStore] Wrote ${s} blobs (disk) in ${Date.now()-n}ms`);let a=Date.now(),l=await i.finish();f(`[GitHistoryStore] Wrote tree(s) (disk). root=${l} in ${Date.now()-a}ms`);let p;try{p=await g.resolveRef({fs:o,dir:this.repoDir,ref:"HEAD"})}catch{}let m=t.when?Math.floor(t.when/1e3):Math.floor(Date.now()/1e3),S=new Date(m*1e3).getTimezoneOffset(),y=await g.commit({fs:o,dir:this.repoDir,message:t.message,parent:p?[p]:[],tree:l,author:{name:"ast-db",email:"ast-db@example.com",timestamp:m,timezoneOffset:S},committer:{name:"ast-db",email:"ast-db@example.com",timestamp:m,timezoneOffset:S}});return f(`[GitHistoryStore] Snapshot commit oid ${y}`),y}async createSnapshotFromDiskIfChanged(t){await this.ensureInitialized(),f(`[${new Date().toISOString()}] [GitHistoryStore] Creating snapshot from disk (diff) with ${t.relPaths.length} members`);let e=[...t.relPaths].map(c=>this.normalizeLogicalPath(c)).filter(Boolean).sort((c,h)=>c.localeCompare(h)),n=Date.now(),i=new B(this.repoDir),s=0;for(let c of e){let h=P.join(this.baseDir,c);try{let b=o.readFileSync(h),w=await g.writeBlob({fs:o,dir:this.repoDir,blob:b});await i.addFile(c,w),s++}catch{}}f(`[GitHistoryStore] Wrote ${s} blobs (disk) in ${Date.now()-n}ms`);let a=Date.now(),l=await i.finish();f(`[GitHistoryStore] Wrote tree(s) (disk). root=${l} in ${Date.now()-a}ms`);let p=t.parent;if(!p)try{p=await g.resolveRef({fs:o,dir:this.repoDir,ref:"HEAD"})}catch{}if(p)try{let{commit:c}=await g.readCommit({fs:o,dir:this.repoDir,oid:p});if(c?.tree===l){f("[GitHistoryStore] Snapshot identical to parent; skipping commit",{parentOid:p,tree:l});let h=await this.readCommitParent(p);return{snapshotId:p,identical:!0,parent:h}}}catch(c){f("[GitHistoryStore] Parent read failed; proceeding with commit",{error:c?.message||String(c)})}let m=t.when?Math.floor(t.when/1e3):Math.floor(Date.now()/1e3),S=new Date(m*1e3).getTimezoneOffset(),y=await g.commit({fs:o,dir:this.repoDir,message:t.message,parent:p?[p]:[],tree:l,author:{name:"ast-db",email:"ast-db@example.com",timestamp:m,timezoneOffset:S},committer:{name:"ast-db",email:"ast-db@example.com",timestamp:m,timezoneOffset:S}});return await g.writeRef({fs:o,dir:this.repoDir,ref:"refs/heads/master",value:y,force:!0}),f(`[GitHistoryStore] Snapshot commit oid ${y}`),{snapshotId:y,identical:!1,parent:p}}};function Q(r){let t={},e=r.split(/\r?\n/);for(let n of e){let i=n.match(/^([A-Za-z0-9-]+):\s*(.*)$/);i&&(t[i[1]]=i[2])}return t}Dt();import xt from"fs";import G from"path";import at from"ignore";import{Project as Yt}from"ts-morph";var It=new Set(["node_modules",".git",".pando-data",".clj-kondo"]);function lt(r,t){if(!t?.length)return null;let e=t.map(i=>i.replace(/^\/+/,"").replace(/\/+$/,"")).filter(Boolean).map(i=>`${i}/`);if(!e.length)return null;let n=i=>i.replace(/\\/g,"/");return i=>{let s=n(G.relative(r,i));if(!s||s.startsWith(".."))return!1;let a=s.endsWith("/")?s:`${s}/`;return e.some(l=>a.startsWith(l))}}function ht(r,t){return Pt(r,t,null)}function Pt(r,t,e){let n=t?.shouldExclude||null,i=[],s=G.resolve(t?.gitignoreRoot??r),a=V(s,""),l=at().add(a),p=[{dir:r,relDir:"",rules:a,ig:l}];for(;p.length;){let m=p.pop(),S=[];try{S=xt.readdirSync(m.dir,{withFileTypes:!0})}catch{continue}for(let y of S){let c=G.join(m.dir,y.name);if(!(typeof y.isSymbolicLink=="function"&&y.isSymbolicLink())){if(y.isDirectory()){if(It.has(y.name)||n?.(c))continue;let b=m.relDir?`${m.relDir}/${y.name}`:y.name,w=ct(b);if(m.ig.ignores(w))continue;let u=m.rules.slice(),T=V(c,w);T.length&&u.push(...T);let E=T.length?at().add(u):m.ig;p.push({dir:c,relDir:w,rules:u,ig:E})}else if(y.isFile()){if(n?.(c))continue;let b=ct(G.relative(r,c));if(m.ig.ignores(b))continue;if(e===null)i.push(c);else{let w=G.extname(y.name).toLowerCase();e.has(w)&&i.push(c)}}}}}return i}function ct(r){return r.replace(/\\/g,"/")}Y();Et();Y();import Z from"fs";import Mt from"path";function pt(r){r.pragma("journal_mode = WAL"),r.pragma("synchronous = NORMAL"),r.pragma("busy_timeout = 10000");try{r.pragma("temp_store = MEMORY")}catch{}r.exec(`
|
|
4
4
|
CREATE TABLE IF NOT EXISTS objects (
|
|
5
5
|
object_id TEXT PRIMARY KEY,
|
|
6
6
|
kind TEXT DEFAULT 'blob',
|
|
@@ -38,4 +38,4 @@ import{a as N,b as Et,i as V,j as R,k as K}from"./chunk-UIWCIYYF.mjs";import{a a
|
|
|
38
38
|
|
|
39
39
|
CREATE INDEX IF NOT EXISTS idx_snapshots_timestamp ON snapshots(timestamp);
|
|
40
40
|
CREATE INDEX IF NOT EXISTS idx_snapshot_meta_kv ON snapshot_meta(key, value);
|
|
41
|
-
`)}function
|
|
41
|
+
`)}function q(r,t){let e=it(r),n=Mt.dirname(e);Z.existsSync(n)||Z.mkdirSync(n,{recursive:!0});let i=!!t?.readonly;if(i&&!Z.existsSync(e)){let a=new K(e,{});try{pt(a)}finally{try{a.close()}catch{}}}let s=new K(e,i?{readonly:!0}:{});if(!i)pt(s);else try{s.pragma("busy_timeout = 10000")}catch{}return s}var O="",tt=[],yt=null;st();function dt(r,t){if(Array.isArray(t)){tt=t.slice(),yt=lt(r,tt);try{A("SnapshotWorker","exclude state updated",{excludeDirs:tt})}catch{}}}function Ot(r){let t=ht(r,{shouldExclude:yt??void 0,gitignoreRoot:r});try{A("SnapshotWorker","gatherSnapshotFiles",{count:t.length,sample:t.slice(0,20).map(e=>et.relative(r,e).replace(/\\/g,"/"))})}catch{}return t}function gt(r){try{return r.prepare("SELECT snapshot_id FROM snapshots ORDER BY timestamp DESC, rowid DESC LIMIT 1").get()?.snapshot_id}catch{return}}function mt(r,t,e,n,i){let s=i||null;r.prepare("INSERT OR REPLACE INTO snapshots (snapshot_id, parents, timestamp, message) VALUES (?, ?, ?, ?)").run(t,s,Math.floor(e/1e3),n)}async function ut(r,t,e){try{return await r.readCommitParent(t)||e}catch{return e}}function z(r,t){let e=new Map;try{let n=r.prepare("SELECT logical_path, object_id FROM snapshot_members WHERE snapshot_id = ?").all(t);for(let i of n)e.set(i.logical_path,i.object_id)}catch{}return e}function ft(r,t,e){r.transaction(i=>{let s=r.prepare("INSERT OR REPLACE INTO snapshot_members (snapshot_id, logical_path, object_id, lang, encoding) VALUES (?, ?, ?, ?, ?)");for(let a of i)s.run(t,a.logical_path,a.object_id,a.lang??null,a.encoding??null)})(e)}j.on("message",async r=>{if(r.cmd==="init"){O=r.projectRoot,dt(O,r.excludeDirs),j.postMessage({type:"ready"});return}if(r.excludeDirs&&dt(O,r.excludeDirs),r.cmd==="snapshot"){let t=q(O);try{let e=Date.now(),n=r.payload?.when||Date.now(),i=r.payload?.message||"ast: snapshot",s=r.payload?.parent||gt(t),a=Date.now(),l=r.payload?.files&&r.payload.files.length?r.payload.files:Ot(O);try{A("SnapshotWorker","snapshot start",{when:n,message:i,parent:s,fileCount:l.length,filesPreview:l.slice(0,50).map(u=>et.relative(O,u).replace(/\\/g,"/"))})}catch{}let p=Date.now()-a,m=l.map(u=>et.relative(O,u).replace(/\\/g,"/")),S=new H({baseDir:O});await S.ensureInitialized();let y=Date.now(),c=await S.createSnapshotFromDiskIfChanged({message:i,when:n,relPaths:m,parent:s}),h=c.snapshotId,b=await ut(S,h,c.parent||s),w=Date.now()-y;if(c.identical){let u=Date.now()-e;try{A("SnapshotWorker","snapshot skipped (identical)",{snapshotId:h,parent:b,files:m.length,timingsMs:{list:p,snapshot:w,total:u}})}catch{}j.postMessage({type:"result",snapshotId:h,parent:b,files:m.length,diff:{added:0,changed:0,deleted:0}})}else{let u=Date.now();mt(t,h,n,i,b);try{let I=Q(i||""),X=t.prepare("INSERT OR REPLACE INTO snapshot_meta (snapshot_id, key, value) VALUES (?, ?, ?)");t.transaction(()=>{for(let[St,bt]of Object.entries(I))X.run(h,St,bt)})()}catch{}let T=Date.now()-u,E=Date.now(),D=await S.listSnapshotMembers(h),_=Date.now()-E,k=D.map(I=>({logical_path:I.logicalPath,object_id:I.objectId})),M=Date.now();ft(t,h,k);let $=Date.now()-M,L=b?z(t,b):new Map,F=z(t,h),d=[],x=[],C=[];for(let[I,X]of F){let U=L.get(I);U?U!==X&&x.push(I):d.push(I)}for(let[I]of L)F.has(I)||C.push(I);let rt=Date.now()-e;try{A("SnapshotWorker","snapshot complete",{snapshotId:h,parent:b,files:m.length,timingsMs:{list:p,snapshot:w,metadata:T,listMembers:_,membersWrite:$,total:rt},diff:{added:d.length,changed:x.length,deleted:C.length}})}catch{}j.postMessage({type:"result",snapshotId:h,parent:b,files:m.length,diff:{added:d.length,changed:x.length,deleted:C.length}})}}catch(e){j.postMessage({type:"error",message:e?.message||String(e)})}finally{t.close()}return}if(r.cmd==="snapshot-captured"){let t=q(O);try{let e=r.payload?.when||Date.now(),n=r.payload?.message||"ast: snapshot",i=r.payload?.parent||gt(t);try{A("SnapshotWorker","snapshot-captured start",{when:e,message:n,parent:i,members:r.payload.members.length})}catch{}let s=new H({baseDir:O});await s.ensureInitialized();let a=(r.payload.members||[]).map(u=>({logicalPath:u.logicalPath,objectId:"unknown",content:Buffer.from(u.contentB64,"base64")})),l=await s.createSnapshot({message:n,when:e,members:a}),p=await ut(s,l,i);mt(t,l,e,n,p);try{let u=Q(n||""),T=t.prepare("INSERT OR REPLACE INTO snapshot_meta (snapshot_id, key, value) VALUES (?, ?, ?)");t.transaction(()=>{for(let[D,_]of Object.entries(u))T.run(l,D,_)})()}catch{}let m=await s.listSnapshotMembers(l),S=m.map(u=>({logical_path:u.logicalPath,object_id:u.objectId}));ft(t,l,S);let y=p?z(t,p):new Map,c=z(t,l),h=[],b=[],w=[];for(let[u,T]of c){let E=y.get(u);E?E!==T&&b.push(u):h.push(u)}for(let[u]of y)c.has(u)||w.push(u);try{A("SnapshotWorker","snapshot-captured complete",{snapshotId:l,parent:p,members:m.length,diff:{added:h.length,changed:b.length,deleted:w.length}})}catch{}j.postMessage({type:"result",snapshotId:l,parent:p,files:m.length,diff:{added:h.length,changed:b.length,deleted:w.length}})}catch(e){j.postMessage({type:"error",message:e?.message||String(e)})}finally{t.close()}}r.cmd==="close"&&j.postMessage({type:"closed"})});
|