just-git 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -776,7 +776,7 @@ ${u}`,exitCode:0}}oe();ae();Cr();ge();ss();function Cd(e,t){e.command("tag",{des
776
776
  `)}if(n.list)return xd(s,n.name||void 0);if(n.name){if(!Ic(n.name))return I(`'${n.name}' is not a valid tag name`);let i=n.commit,a;if(i){let d=await wt(s,i,`Failed to resolve '${i}' as a valid ref.`);if(M(d))return d;a=d}else if(a=await Y(s),!a)return I("Failed to resolve 'HEAD' as a valid ref.");let c=`refs/tags/${n.name}`;if(await B(s,c)&&!n.force)return I(`tag '${n.name}' already exists`);if(n.annotate||n.message){if(!n.message)return I("no tag message specified (use -m)");let d=await nt(s,r.env);if(M(d))return d;let u=Mt(n.message),m=Cc({type:"tag",object:a,objectType:"commit",name:n.name,tagger:d,message:u}),h=await He(s,"tag",m);await Z(s,c,h)}else await Z(s,c,a);return{stdout:"",stderr:"",exitCode:0}}return xd(s)}})}async function xd(e,t){let n=await pe(e,"refs/tags");if(n.length===0)return{stdout:"",stderr:"",exitCode:0};let r=n.map(o=>o.name.replace("refs/tags/",""));return t&&(r=r.filter(o=>on(t,o,0)===0)),r.length===0?{stdout:"",stderr:"",exitCode:0}:{stdout:`${r.join(`
777
777
  `)}
778
778
  `,stderr:"",exitCode:0}}var Pd=new Set(["am","annotate","apply","archive","bugreport","bundle","cat-file","check-ignore","check-mailmap","check-ref-format","checkout-index","cherry","commit-tree","count-objects","credential","daemon","diff-files","diff-index","diff-tree","difftool","fast-export","fast-import","filter-branch","for-each-ref","format-patch","fsck","hash-object","instaweb","interpret-trailers","log--hierarchical","ls-remote","ls-tree","maintenance","merge-base","merge-tree","mergetool","multi-pack-index","name-rev","notes","pack-objects","pack-refs","patch-id","prune","range-diff","read-tree","receive-pack","replace","request-pull","rerere","rev-list","send-email","send-pack","shortlog","show-branch","show-ref","sparse-checkout","stash--helper","stripspace","submodule","symbolic-ref","unpack-objects","update-index","update-ref","upload-pack","var","verify-commit","verify-pack","verify-tag","whatchanged","worktree","write-tree"]),Ow={init:(e,t)=>Ml(e,t),clone:(e,t)=>cl(e,t),describe:(e,t)=>ll(e,t),fetch:(e,t)=>$l(e,t),pull:(e,t)=>ed(e,t),push:(e,t)=>td(e,t),add:(e,t)=>Vc(e,t),blame:(e,t)=>Sf(e,t),commit:(e,t)=>dl(e,t),status:(e,t)=>yd(e,t),log:(e,t)=>ql(e,t),branch:(e,t)=>vf(e,t),tag:(e,t)=>Cd(e,t),checkout:(e,t)=>Hf(e,t),diff:(e,t)=>kl(e,t),reset:(e,t)=>od(e,t),merge:(e,t)=>Vl(e,t),"cherry-pick":(e,t)=>Kf(e,t),revert:(e,t)=>fd(e,t),rebase:(e,t)=>Ql(e,t),mv:(e,t)=>Yl(e,t),rm:(e,t)=>ld(e,t),remote:(e,t)=>rd(e,t),config:(e,t)=>pl(e,t),show:(e,t)=>dd(e,t),stash:(e,t)=>bd(e,t),"rev-parse":(e,t)=>cd(e,t),"ls-files":(e,t)=>Kl(e,t),clean:(e,t)=>Vf(e,t),switch:(e,t)=>kd(e,t),restore:(e,t)=>ad(e,t),reflog:(e,t)=>nd(e,t),repack:(e,t)=>Sl(e,t),gc:(e,t)=>Tl(e,t),bisect:(e,t)=>pf(e,t),grep:(e,t)=>Dl(e,t)};function $d(e){let t=Vo("git",{description:"Git command"});for(let n of Object.values(Ow))n(t,e);return t.command("help",{description:"Display help information",args:[q.string().name("command").describe("Command to get help for").optional()],handler:async n=>{let r=n.command;if(!r)return{stdout:br(t),stderr:"",exitCode:0};let o=t.children.get(r);return o?{stdout:br(o),stderr:"",exitCode:0}:{stdout:"",stderr:`git: no help available for '${r}'
779
- `,exitCode:1}}}),t}var Iw="1.5.0";function Sw(e,t){if(!e)return t;let n=e.locked?"locked":"defaults",r={"user.name":e.name,"user.email":e.email};return t?{...t,[n]:{...r,...t[n]}}:{[n]:r}}var Bo=class{name="git";defaultFs;defaultCwd;blocked;hooks;inner;locks=new WeakMap;async withLock(t,n){let r=this.locks.get(t)??Promise.resolve(),o,s=new Promise(i=>{o=i});this.locks.set(t,s),await r;try{return await n()}finally{o()}}constructor(t){this.defaultFs=t?.fs,this.defaultCwd=t?.cwd??"/",this.hooks=t?.hooks,this.blocked=t?.disabled?.length?new Set(t.disabled):null;let n=t?.network,r=Sw(t?.identity,t?.config),o={hooks:t?.hooks,credentialProvider:t?.credentials,identityOverride:t?.identity,fetchFn:typeof n=="object"?n.fetch:void 0,networkPolicy:n,resolveRemote:t?.resolveRemote,...t?.objectStore?{objectStore:t.objectStore}:{},...t?.refStore?{refStore:t.refStore}:{},...t?.gitDir?{gitDir:t.gitDir,workTree:this.defaultCwd}:{},...r?{configOverrides:r}:{}};this.inner=$d(o).toCommand()}exec=async(t,n)=>{let r=n?.fs??this.defaultFs;if(!r)throw new Error("No filesystem: pass `fs` in exec() options or in createGit()");let o=n?.cwd??this.defaultCwd,s=Tw(t),i=new Map;if(n?.env)for(let[a,c]of Object.entries(n.env))i.set(a,c);return this.execute(s,{fs:r,cwd:o,env:i,stdin:n?.stdin??""})};execute=(t,n)=>this.withLock(n.fs,async()=>{let r=t[0]??"";if(r==="--version"||r==="version")return{stdout:`just-git version ${Iw} (virtual git implementation)
779
+ `,exitCode:1}}}),t}var Iw="1.5.1";function Sw(e,t){if(!e)return t;let n=e.locked?"locked":"defaults",r={"user.name":e.name,"user.email":e.email};return t?{...t,[n]:{...r,...t[n]}}:{[n]:r}}var Bo=class{name="git";defaultFs;defaultCwd;blocked;hooks;inner;locks=new WeakMap;async withLock(t,n){let r=this.locks.get(t)??Promise.resolve(),o,s=new Promise(i=>{o=i});this.locks.set(t,s),await r;try{return await n()}finally{o()}}constructor(t){this.defaultFs=t?.fs,this.defaultCwd=t?.cwd??"/",this.hooks=t?.hooks,this.blocked=t?.disabled?.length?new Set(t.disabled):null;let n=t?.network,r=Sw(t?.identity,t?.config),o={hooks:t?.hooks,credentialProvider:t?.credentials,identityOverride:t?.identity,fetchFn:typeof n=="object"?n.fetch:void 0,networkPolicy:n,resolveRemote:t?.resolveRemote,...t?.objectStore?{objectStore:t.objectStore}:{},...t?.refStore?{refStore:t.refStore}:{},...t?.gitDir?{gitDir:t.gitDir,workTree:this.defaultCwd}:{},...r?{configOverrides:r}:{}};this.inner=$d(o).toCommand()}exec=async(t,n)=>{let r=n?.fs??this.defaultFs;if(!r)throw new Error("No filesystem: pass `fs` in exec() options or in createGit()");let o=n?.cwd??this.defaultCwd,s=Tw(t),i=new Map;if(n?.env)for(let[a,c]of Object.entries(n.env))i.set(a,c);return this.execute(s,{fs:r,cwd:o,env:i,stdin:n?.stdin??""})};execute=(t,n)=>this.withLock(n.fs,async()=>{let r=t[0]??"";if(r==="--version"||r==="version")return{stdout:`just-git version ${Iw} (virtual git implementation)
780
780
  `,stderr:"",exitCode:0};if(this.blocked?.has(r))return{stdout:"",stderr:`git: '${r}' is not available in this environment
781
781
  `,exitCode:1};if(r&&Pd.has(r))return{stdout:"",stderr:`git: '${r}' is not implemented. Run 'git help' for available commands.
782
782
  `,exitCode:1};if(this.hooks?.beforeCommand){let s=await this.hooks.beforeCommand({command:r,args:t.slice(1),fs:n.fs,cwd:n.cwd,env:n.env});if(le(s))return{stdout:"",stderr:s.message??"",exitCode:1}}let o=await this.inner.execute(t,n);return this.hooks?.afterCommand&&await this.hooks.afterCommand({command:r,args:t.slice(1),result:o}),o})};function Tw(e){let t=[],n="",r=0;for(;r<e.length;){let o=e[r];if(o==='"'){for(r++;r<e.length&&e[r]!=='"';){if(e[r]==="\\"&&r+1<e.length){let s=e[r+1];if(s==='"'||s==="\\"){n+=s,r+=2;continue}}n+=e[r],r++}r++}else if(o==="'"){for(r++;r<e.length&&e[r]!=="'";)n+=e[r],r++;r++}else o===" "||o===" "?(n.length>0&&(t.push(n),n=""),r++):(n+=o,r++)}return n.length>0&&t.push(n),t.length>0&&t[0]==="git"&&t.shift(),t}function vw(e){return new Bo(e)}var Od=new TextEncoder,Aw=new TextDecoder;function hn(e){let t=[];for(let n of e.split("/"))n==="."||n===""||(n===".."?t.pop():t.push(n));return"/"+t.join("/")}function Wo(e){let t=e.lastIndexOf("/");return t<=0?"/":e.slice(0,t)}var Ra=class{data=new Map;constructor(t){if(this.data.set("/",{type:"directory",mode:16877,mtime:new Date}),t)for(let[n,r]of Object.entries(t)){let o=hn(n);this.ensureParents(o),this.data.set(o,{type:"file",content:typeof r=="string"?Od.encode(r):r,mode:33188,mtime:new Date})}}ensureParents(t){let n=Wo(t);n!=="/"&&(this.data.has(n)||(this.ensureParents(n),this.data.set(n,{type:"directory",mode:16877,mtime:new Date})))}resolve(t){let n="",r=new Set;for(let o of hn(t).slice(1).split("/")){n=`${n}/${o}`;let s=0,i=this.data.get(n);for(;i?.type==="symlink"&&s<40;){if(r.has(n))throw new Error(`ELOOP: too many levels of symbolic links, '${t}'`);r.add(n);let a=i.target;n=a.startsWith("/")?hn(a):hn(Wo(n)+"/"+a),i=this.data.get(n),s++}if(s>=40)throw new Error(`ELOOP: too many levels of symbolic links, '${t}'`)}return n}resolveParent(t){let n=hn(t);if(n==="/")return"/";let r=n.slice(1).split("/");if(r.length<=1)return n;let o="",s=new Set;for(let i=0;i<r.length-1;i++){o=`${o}/${r[i]}`;let a=this.data.get(o),c=0;for(;a?.type==="symlink"&&c<40;){if(s.has(o))throw new Error(`ELOOP: too many levels of symbolic links, '${t}'`);s.add(o);let f=a.target;o=f.startsWith("/")?hn(f):hn(Wo(o)+"/"+f),a=this.data.get(o),c++}}return`${o}/${r[r.length-1]}`}async readFile(t){return Aw.decode(await this.readFileBuffer(t))}async readFileBuffer(t){let n=this.data.get(this.resolve(t));if(!n)throw new Error(`ENOENT: no such file or directory, open '${t}'`);if(n.type!=="file")throw new Error(`EISDIR: illegal operation on a directory, read '${t}'`);return n.content}async writeFile(t,n){let r=this.resolve(t);this.ensureParents(r),this.data.set(r,{type:"file",content:typeof n=="string"?Od.encode(n):n,mode:33188,mtime:new Date})}async exists(t){try{return this.data.has(this.resolve(t))}catch{return!1}}async stat(t){let n=this.data.get(this.resolve(t));if(!n)throw new Error(`ENOENT: no such file or directory, stat '${t}'`);return{isFile:n.type==="file",isDirectory:n.type==="directory",isSymbolicLink:!1,mode:n.mode,size:n.type==="file"?n.content.byteLength:0,mtime:n.mtime}}async lstat(t){let n=this.resolveParent(t),r=this.data.get(n);if(!r)throw new Error(`ENOENT: no such file or directory, lstat '${t}'`);return{isFile:r.type==="file",isDirectory:r.type==="directory",isSymbolicLink:r.type==="symlink",mode:r.mode,size:r.type==="file"?r.content.byteLength:r.type==="symlink"?r.target.length:0,mtime:r.mtime}}async mkdir(t,n){let r=hn(t);if(this.data.has(r)){if(this.data.get(r).type!=="directory")throw new Error(`EEXIST: file already exists, mkdir '${t}'`);if(!n?.recursive)throw new Error(`EEXIST: directory already exists, mkdir '${t}'`);return}let o=Wo(r);if(o!=="/"&&!this.data.has(o))if(n?.recursive)await this.mkdir(o,{recursive:!0});else throw new Error(`ENOENT: no such file or directory, mkdir '${t}'`);this.data.set(r,{type:"directory",mode:16877,mtime:new Date})}async readdir(t){let n=this.resolve(t),r=this.data.get(n);if(!r)throw new Error(`ENOENT: no such file or directory, scandir '${t}'`);if(r.type!=="directory")throw new Error(`ENOTDIR: not a directory, scandir '${t}'`);let o=n==="/"?"/":`${n}/`,s=new Set;for(let i of this.data.keys())if(i!==n&&i.startsWith(o)){let c=i.slice(o.length).split("/")[0];c&&s.add(c)}return[...s].sort()}async rm(t,n){let r=hn(t),o=this.data.get(r);if(!o){if(n?.force)return;throw new Error(`ENOENT: no such file or directory, rm '${t}'`)}if(o.type==="directory"){if(!n?.recursive&&(await this.readdir(r)).length>0)throw new Error(`ENOTEMPTY: directory not empty, rm '${t}'`);let s=r==="/"?"/":`${r}/`;for(let i of[...this.data.keys()])i.startsWith(s)&&this.data.delete(i)}this.data.delete(r)}async readlink(t){let n=this.resolveParent(t),r=this.data.get(n);if(!r)throw new Error(`ENOENT: no such file or directory, readlink '${t}'`);if(r.type!=="symlink")throw new Error(`EINVAL: invalid argument, readlink '${t}'`);return r.target}async symlink(t,n){let r=hn(n);if(this.data.has(r))throw new Error(`EEXIST: file already exists, symlink '${n}'`);this.ensureParents(r),this.data.set(r,{type:"symlink",target:t,mode:40960,mtime:new Date})}};Gn();export{Bo as Git,Ra as MemoryFileSystem,Th as composeGitHooks,vw as createGit,tr as findRepo,le as isRejection};
@@ -350,6 +350,47 @@ interface GitServerConfig<A = Auth> {
350
350
  /** Delta window size (default 10). Smaller = faster, worse compression ratio. */
351
351
  deltaWindow?: number;
352
352
  };
353
+ /**
354
+ * Safety limits for incoming receive-pack requests.
355
+ *
356
+ * These bounds are enforced on buffered HTTP bodies and on pack ingestion
357
+ * for both HTTP and SSH push paths.
358
+ */
359
+ receiveLimits?: {
360
+ /** Maximum compressed/raw HTTP request body size in bytes. */
361
+ maxRequestBytes?: number;
362
+ /**
363
+ * Maximum decompressed HTTP request body size in bytes.
364
+ *
365
+ * Guards against gzip decompression bombs (`Content-Encoding: gzip`).
366
+ * Only applies to HTTP — SSH has no application-layer compression,
367
+ * so `maxRequestBytes` alone is sufficient there.
368
+ */
369
+ maxInflatedBytes?: number;
370
+ /** Maximum pack payload size in bytes. */
371
+ maxPackBytes?: number;
372
+ /** Maximum number of objects declared by a received pack. */
373
+ maxPackObjects?: number;
374
+ };
375
+ /**
376
+ * Safety limits for incoming upload-pack (fetch/clone) requests.
377
+ *
378
+ * Upload-pack request bodies contain only pkt-line want/have lists,
379
+ * so they are much smaller than receive-pack bodies. Defaults are
380
+ * tighter than receiveLimits (10 MB raw, 20 MB inflated).
381
+ */
382
+ fetchLimits?: {
383
+ /** Maximum compressed/raw HTTP request body size in bytes. */
384
+ maxRequestBytes?: number;
385
+ /**
386
+ * Maximum decompressed HTTP request body size in bytes.
387
+ *
388
+ * Guards against gzip decompression bombs (`Content-Encoding: gzip`).
389
+ * Only applies to HTTP — SSH has no application-layer compression,
390
+ * so `maxRequestBytes` alone is sufficient there.
391
+ */
392
+ maxInflatedBytes?: number;
393
+ };
353
394
  /**
354
395
  * Called when the server catches an unhandled error.
355
396
  *
@@ -903,37 +944,52 @@ interface UploadPackOptions {
903
944
  /** Delta window size (default 10). Ignored when noDelta is true. */
904
945
  deltaWindow?: number;
905
946
  }
947
+ interface AuthorizedFetchSet {
948
+ allowedRefHashes: Map<string, string>;
949
+ allowedWantHashes: Set<string>;
950
+ }
951
+ interface ReceivePackLimitOptions {
952
+ maxPackBytes?: number;
953
+ maxPackObjects?: number;
954
+ }
906
955
  /**
907
956
  * Handle a `POST /git-upload-pack` request.
908
957
  *
909
958
  * Returns `Uint8Array` for buffered responses (cache hits, deltified packs)
910
959
  * or `ReadableStream<Uint8Array>` for streaming no-delta responses.
911
960
  */
912
- declare function handleUploadPack(repo: GitRepo, requestBody: Uint8Array, options?: UploadPackOptions): Promise<Uint8Array | ReadableStream<Uint8Array>>;
961
+ declare function handleUploadPack(repo: GitRepo, requestBody: Uint8Array, options?: UploadPackOptions & {
962
+ authorizedFetchSet?: AuthorizedFetchSet;
963
+ }): Promise<Uint8Array | ReadableStream<Uint8Array> | Rejection>;
913
964
  interface ReceivePackResult {
914
965
  updates: RefUpdate[];
915
966
  unpackOk: boolean;
916
967
  capabilities: string[];
917
968
  /** Whether the request body contained a valid pkt-line flush packet. */
918
969
  sawFlush: boolean;
970
+ /** Hashes of objects ingested from the pack (for rollback on hook rejection). Only populated when the object store supports deferred ingestion (server-backed stores). Undefined for VFS-backed stores. */
971
+ ingestedHashes?: string[];
919
972
  }
920
973
  /**
921
974
  * Ingest a receive-pack request: parse commands, ingest the packfile,
922
975
  * and compute enriched RefUpdate objects. Does NOT apply ref updates —
923
976
  * call `applyReceivePack` to run hooks and apply refs.
977
+ *
978
+ * Objects are persisted immediately (needed by `buildRefUpdates` for
979
+ * ancestry checks). If hooks later reject the push, `applyReceivePack`
980
+ * rolls back the ingested objects.
924
981
  */
925
- declare function ingestReceivePack(repo: GitRepo, requestBody: Uint8Array): Promise<ReceivePackResult>;
982
+ declare function ingestReceivePack(repo: GitRepo, requestBody: Uint8Array, limits?: ReceivePackLimitOptions): Promise<ReceivePackResult>;
926
983
  /**
927
984
  * Streaming variant of `ingestReceivePack`. Accepts pre-parsed push
928
- * commands and a raw pack byte stream. Uses `readPackStreaming`
929
- * `ingestPackStream` so pack bytes are consumed incrementally without
930
- * buffering the entire pack in memory.
985
+ * commands and a raw pack byte stream. Uses `readPackStreaming` for
986
+ * incremental consumption.
931
987
  *
932
988
  * The HTTP handler continues using `ingestReceivePack` (runtime buffers
933
989
  * POST bodies anyway). The SSH handler calls this directly after parsing
934
990
  * pkt-line commands.
935
991
  */
936
- declare function ingestReceivePackFromStream(repo: GitRepo, commands: PushCommand[], capabilities: string[], packStream: AsyncIterable<Uint8Array>, sawFlush?: boolean): Promise<ReceivePackResult>;
992
+ declare function ingestReceivePackFromStream(repo: GitRepo, commands: PushCommand[], capabilities: string[], packStream: AsyncIterable<Uint8Array>, sawFlush?: boolean, limits?: ReceivePackLimitOptions): Promise<ReceivePackResult>;
937
993
  /**
938
994
  * Apply ref updates with CAS protection only — no hooks.
939
995
  *
@@ -979,7 +1035,9 @@ declare function handleLsRefs<A>(repo: GitRepo, repoId: string, args: string[],
979
1035
  * enumeration and pack building via the shared pipeline, then
980
1036
  * builds a v2 section-based response.
981
1037
  */
982
- declare function handleV2Fetch(repo: GitRepo, args: string[], options?: UploadPackOptions): Promise<Uint8Array | ReadableStream<Uint8Array>>;
1038
+ declare function handleV2Fetch(repo: GitRepo, args: string[], options?: UploadPackOptions & {
1039
+ authorizedFetchSet?: AuthorizedFetchSet;
1040
+ }): Promise<Uint8Array | ReadableStream<Uint8Array> | Rejection>;
983
1041
 
984
1042
  /**
985
1043
  * In-memory storage backend with multi-repo support.
@@ -1,69 +1,69 @@
1
- var Se=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});function L(r){return r!=null&&typeof r=="object"&&"reject"in r&&r.reject===!0}var ne="0000000000000000000000000000000000000000",Pt=(()=>{let r=new Array(256);for(let e=0;e<256;e++)r[e]=(e>>4).toString(16)+(e&15).toString(16);return r})();function je(r){let e="";for(let t=0;t<20;t++)e+=Pt[r[t]];return e}function se(r,e){let t="";for(let n=0;n<20;n++)t+=Pt[r[e+n]];return t}function ae(r){let e=new Uint8Array(20);for(let t=0;t<20;t++)e[t]=parseInt(r.slice(t*2,t*2+2),16);return e}var Nr=new Set(["tree","commit","tag"]),Ie=class{map=new Map;currentBytes=0;maxBytes;constructor(e=16*1024*1024){this.maxBytes=e}get(e){return this.map.get(e)}set(e,t){if(!Nr.has(t.type))return;let n=t.content.byteLength;if(!(n>this.maxBytes/2)&&!this.map.has(e)){for(;this.currentBytes+n>this.maxBytes&&this.map.size>0;){let s=this.map.keys().next().value;this.currentBytes-=this.map.get(s).content.byteLength,this.map.delete(s)}this.map.set(e,t),this.currentBytes+=n}}get size(){return this.map.size}get bytes(){return this.currentBytes}clear(){this.map.clear(),this.currentBytes=0}};var Mr=new TextEncoder;function We(r){return typeof r=="string"?Mr.encode(r):r}function Br(){if(typeof globalThis.Bun<"u")return()=>{let r=new Bun.CryptoHasher("sha1"),e={update(t){return r.update(We(t)),e},hex:()=>Promise.resolve(r.digest("hex"))};return e};try{let r=Se(["node","crypto"].join(":"));if(typeof r.createHash=="function")return()=>{let e=r.createHash("sha1"),t={update(n){return e.update(We(n)),t},hex:()=>Promise.resolve(e.digest("hex"))};return t}}catch{}if(typeof globalThis.crypto?.subtle?.digest=="function")return()=>{let r=[],e={update(t){return r.push(We(t)),e},async hex(){let t=0;for(let o of r)t+=o.byteLength;let n=new Uint8Array(t),s=0;for(let o of r)n.set(o,s),s+=o.byteLength;let a=await crypto.subtle.digest("SHA-1",n);return je(new Uint8Array(a))}};return e};throw new Error("No SHA-1 implementation available. Requires Bun, Node.js, Deno, or a browser with Web Crypto.")}var vt=Br(),z=vt;async function St(r){return vt().update(r).hex()}var _=Uint8Array,K=Uint16Array,$r=Int32Array,jt=new _([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),It=new _([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Fr=new _([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Tt=(r,e)=>{let t=new K(31);for(let s=0;s<31;++s)t[s]=e+=1<<r[s-1];let n=new $r(t[30]);for(let s=1;s<30;++s)for(let a=t[s];a<t[s+1];++a)n[a]=a-t[s]<<5|s;return{b:t,r:n}},{b:Ut}=Tt(jt,2);Ut[28]=258;var{b:Wr}=Tt(It,0),Ve=new K(32768);for(let r=0;r<32768;++r){let e=(r&43690)>>1|(r&21845)<<1;e=(e&52428)>>2|(e&13107)<<2,e=(e&61680)>>4|(e&3855)<<4,Ve[r]=((e&65280)>>8|(e&255)<<8)>>1}var ie=(r,e,t)=>{let n=r.length,s=0,a=new K(e);for(;s<n;++s)r[s]&&++a[r[s]-1];let o=new K(e);for(s=1;s<e;++s)o[s]=o[s-1]+a[s-1]<<1;let i;if(t){i=new K(1<<e);let f=15-e;for(s=0;s<n;++s)if(r[s]){let c=s<<4|r[s],l=e-r[s],p=o[r[s]-1]++<<l;for(let u=p|(1<<l)-1;p<=u;++p)i[Ve[p]>>f]=c}}else for(i=new K(n),s=0;s<n;++s)r[s]&&(i[s]=Ve[o[r[s]-1]++]>>15-r[s]);return i},oe=new _(288);for(let r=0;r<144;++r)oe[r]=8;for(let r=144;r<256;++r)oe[r]=9;for(let r=256;r<280;++r)oe[r]=7;for(let r=280;r<288;++r)oe[r]=8;var Lt=new _(32);for(let r=0;r<32;++r)Lt[r]=5;var Gr=ie(oe,9,1),qr=ie(Lt,5,1),Ge=r=>{let e=r[0];for(let t=1;t<r.length;++t)r[t]>e&&(e=r[t]);return e},D=(r,e,t)=>{let n=e/8|0;return(r[n]|r[n+1]<<8)>>(e&7)&t},qe=(r,e)=>{let t=e/8|0;return(r[t]|r[t+1]<<8|r[t+2]<<16)>>(e&7)},Ct=r=>(r+7)/8|0,Vr=(r,e,t)=>((e==null||e<0)&&(e=0),(t==null||t>r.length)&&(t=r.length),new _(r.subarray(e,t))),N=(r,e)=>{let t=["unexpected EOF","invalid block type","invalid length/literal","invalid distance"];throw new Error(e||t[r]||"unknown inflate error")},Ht=(r,e,t,n)=>{let s=r.length,a=n?n.length:0;if(!s||e.f&&!e.l)return t||new _(0);let o=!t,i=o||e.i!=2,f=e.i;o&&(t=new _(s*3));let c=y=>{let m=t.length;if(y>m){let k=new _(Math.max(m*2,y));k.set(t),t=k}},l=e.f||0,p=e.p||0,u=e.b||0,h=e.l,d=e.d,b=e.m,R=e.n,A=s*8;do{if(!h){l=D(r,p,1);let w=D(r,p+1,3);if(p+=3,w)if(w==1)h=Gr,d=qr,b=9,R=5;else if(w==2){let g=D(r,p,31)+257,x=D(r,p+10,15)+4,O=g+D(r,p+5,31)+1;p+=14;let P=new _(O),S=new _(19);for(let M=0;M<x;++M)S[Fr[M]]=D(r,p+M*3,7);p+=x*3;let j=Ge(S),T=(1<<j)-1,U=ie(S,j,1);for(let M=0;M<O;){let At=U[D(r,p,T)];p+=At&15;let re=At>>4;if(re<16)P[M++]=re;else{let Ot=0,ve=0;for(re==16?(ve=3+D(r,p,3),p+=2,Ot=P[M-1]):re==17?(ve=3+D(r,p,7),p+=3):re==18&&(ve=11+D(r,p,127),p+=7);ve--;)P[M++]=Ot}}let B=P.subarray(0,g),$=P.subarray(g);b=Ge(B),R=Ge($),h=ie(B,b,1),d=ie($,R,1)}else N(1);else{let g=Ct(p)+4,x=r[g-4]|r[g-3]<<8,O=g+x;if(O>s){f&&N(0);break}i&&c(u+x),t.set(r.subarray(g,O),u),e.b=u+=x,e.p=p=O*8,e.f=l;continue}if(p>A){f&&N(0);break}}i&&c(u+131072);let y=(1<<b)-1,m=(1<<R)-1,k=p;for(;;k=p){let w=h[qe(r,p)&y],g=w>>4;if(p+=w&15,p>A){f&&N(0);break}if(w||N(2),g<256)t[u++]=g;else if(g==256){k=p,h=null;break}else{let x=g-254;if(g>264){let T=g-257,U=jt[T];x=D(r,p,(1<<U)-1)+Ut[T],p+=U}let O=d[qe(r,p)&m],P=O>>4;O||N(3),p+=O&15;let S=Wr[P];if(P>3){let T=It[P];S+=qe(r,p)&(1<<T)-1,p+=T}if(p>A){f&&N(0);break}i&&c(u+131072);let j=u+x;if(u<S){let T=a-S,U=Math.min(S,j);for(T+u<0&&N(3);u<U;++u)t[u]=n[T+u]}for(;u<j;++u)t[u]=t[u-S]}}e.l=h,e.p=k,e.b=u,e.f=l,h&&(l=1,e.m=b,e.d=d,e.n=R)}while(!l);return u!=t.length&&o?Vr(t,0,u):t.subarray(0,u)},Dt=r=>(((r[0]&15)!=8||r[0]>>4>7||(r[0]<<8|r[1])%31)&&N(0,"invalid zlib data"),r[1]&32&&N(0,"zlib dictionaries are not supported"),2);function _t(r){let e=Dt(r);return Ht(r.subarray(e,-4),{i:2})}function ze(r){let e=Dt(r),t={i:2},n=Ht(r.subarray(e),t),s=Ct(t.p);return{result:n,bytesConsumed:e+s+4}}async function zr(){let r;if(!(typeof document<"u"))try{r=Se(["node","zlib"].join(":"))}catch{try{r=await import(["node","zlib"].join(":"))}catch{}}if(r&&typeof r.deflateSync=="function"&&typeof r.inflateSync=="function"){let n=null;try{let s=r.inflateSync(r.deflateSync(Buffer.from("x")),{info:!0});s?.engine&&typeof s.engine.bytesWritten=="number"&&(n=a=>{let o=r.inflateSync(a,{info:!0});return{result:new Uint8Array(o.buffer),bytesConsumed:o.engine.bytesWritten}})}catch{}return{deflateSync:s=>new Uint8Array(r.deflateSync(s)),inflateSync:s=>new Uint8Array(r.inflateSync(s)),inflateWithConsumed:n??ze}}let t;return typeof globalThis.CompressionStream=="function"?t=async n=>{let s=new CompressionStream("deflate"),a=s.writable.getWriter();return a.write(n),a.close(),new Uint8Array(await new Response(s.readable).arrayBuffer())}:t=()=>{throw new Error("No deflate implementation available. Requires node:zlib or CompressionStream.")},{deflateSync:t,inflateSync:_t,inflateWithConsumed:ze}}var Kr=null;function Nt(){return Kr??=zr()}async function Te(r){return await(await Nt()).deflateSync(r)}async function Ke(r,e){let t=await Nt(),{result:n,bytesConsumed:s}=t.inflateWithConsumed(r);if(n.byteLength!==e)throw new Error(`Inflate size mismatch: got ${n.byteLength}, expected ${e}`);return{result:n,bytesConsumed:s}}var Y=1346454347,Le=2,$t=1,Ft=2,Wt=3,Gt=4,F=6,ce=7,qt={[$t]:"commit",[Ft]:"tree",[Wt]:"blob",[Gt]:"tag"},Vt={commit:$t,tree:Ft,blob:Wt,tag:Gt};async function zt(r,e){let t=new DataView(r.buffer,r.byteOffset,r.byteLength),n=t.getUint32(0);if(n!==Y)throw new Error(`Invalid pack signature: 0x${n.toString(16)} (expected 0x${Y.toString(16)})`);let s=t.getUint32(4);if(s!==Le)throw new Error(`Unsupported pack version: ${s}`);if(r.byteLength>=32){let c=se(r,r.byteLength-20),l=z();l.update(r.subarray(0,r.byteLength-20));let p=await l.hex();if(p!==c)throw new Error(`pack checksum mismatch: expected ${c}, computed ${p}`)}let a=t.getUint32(8),o=[],i=12;for(let c=0;c<a;c++){let l=await Xr(r,i);o.push(l),i=l.nextOffset}return(await Yr(o,e)).map((c,l)=>({...c,offset:o[l].headerOffset,nextOffset:o[l].nextOffset}))}async function Xr(r,e){let t=e,n=r[e++],s=n>>4&7,a=n&15,o=4;for(;n&128;)n=r[e++],a|=(n&127)<<o,o+=7;let i,f;if(s===F){let p=r[e++];for(i=p&127;p&128;)i+=1,p=r[e++],i=(i<<7)+(p&127);i=t-i}else s===ce&&(f=se(r,e),e+=20);let{result:c,bytesConsumed:l}=await Ke(r.subarray(e),a);return{headerOffset:t,typeNum:s,inflated:c,baseOffset:i,baseHash:f,nextOffset:e+l}}var Mt=50;async function Yr(r,e){let t=new Map;for(let a=0;a<r.length;a++)t.set(r[a].headerOffset,a);let n=new Array(r.length).fill(null);async function s(a,o=0){if(o>Mt)throw new Error(`delta chain depth ${o} exceeds limit of ${Mt}`);let i=n[a];if(i)return i;let f=r[a];if(f.typeNum!==F&&f.typeNum!==ce){let h=qt[f.typeNum];if(!h)throw new Error(`Unknown object type: ${f.typeNum}`);let d={type:h,content:f.inflated,hash:await X(h,f.inflated)};return n[a]=d,d}if(f.typeNum===F){let h=t.get(f.baseOffset);if(h===void 0)throw new Error(`OFS_DELTA base not found at offset ${f.baseOffset}`);let d=await s(h,o+1),b=Ue(d.content,f.inflated),R={type:d.type,content:b,hash:await X(d.type,b)};return n[a]=R,R}let c=await Zr(r,n,f.baseHash,s),l;if(c!==void 0)l=await s(c,o+1);else if(e){let h=await e(f.baseHash);h&&(l=h)}if(!l)throw new Error(`REF_DELTA base not found for hash ${f.baseHash}`);let p=Ue(l.content,f.inflated),u={type:l.type,content:p,hash:await X(l.type,p)};return n[a]=u,u}for(let a=0;a<r.length;a++)await s(a);return n}async function Zr(r,e,t,n){for(let s=0;s<e.length;s++)if(e[s]?.hash===t)return s;for(let s=0;s<r.length;s++){let a=r[s];if(a.typeNum!==F&&a.typeNum!==ce&&(await n(s)).hash===t)return s}}var Xe=class{buf=new Uint8Array(0);iter;eof=!1;_bytesRead=0;hasher;constructor(e,t=!1){this.iter=e[Symbol.asyncIterator](),this.hasher=t?z():null}get bytesRead(){return this._bytesRead}async pullMore(){if(this.eof)return!1;let{value:e,done:t}=await this.iter.next();if(t||!e)return this.eof=!0,!1;if(this.buf.byteLength===0)this.buf=new Uint8Array(e);else{let n=new Uint8Array(this.buf.byteLength+e.byteLength);n.set(this.buf),n.set(e,this.buf.byteLength),this.buf=n}return!0}async ensure(e){for(;this.buf.byteLength<e;)if(!await this.pullMore())throw new Error(`Unexpected end of pack data: needed ${e} bytes, have ${this.buf.byteLength}`)}consume(e){let t=new Uint8Array(this.buf.subarray(0,e));return this.hasher?.update(t),this.buf=this.buf.subarray(e),this._bytesRead+=e,t}async readByte(){return await this.ensure(1),this.consume(1)[0]}async readExact(e){return await this.ensure(e),this.consume(e)}async readRaw(e){await this.ensure(e);let t=new Uint8Array(this.buf.subarray(0,e));return this.buf=this.buf.subarray(e),this._bytesRead+=e,t}async inflateNext(e){for(this.buf.byteLength===0&&!this.eof&&await this.pullMore();;)try{let{result:t,bytesConsumed:n}=await Ke(this.buf,e);return this.consume(n),t}catch{if(!this.eof&&await this.pullMore())continue;throw new Error(`Failed to inflate pack entry at byte ${this._bytesRead} (expected ${e} bytes)`)}}async hashHex(){if(!this.hasher)throw new Error("Hashing not enabled");return this.hasher.hex()}};async function*Kt(r,e){let t=new Xe(r,!0),n=await t.readExact(12),s=new DataView(n.buffer,n.byteOffset,n.byteLength),a=s.getUint32(0);if(a!==Y)throw new Error(`Invalid pack signature: 0x${a.toString(16)} (expected 0x${Y.toString(16)})`);let o=s.getUint32(4);if(o!==Le)throw new Error(`Unsupported pack version: ${o}`);let i=s.getUint32(8),f=new Map,c=new Map;for(let u=0;u<i;u++){let h=t.bytesRead,d=await t.readByte(),b=d>>4&7,R=d&15,A=4;for(;d&128;)d=await t.readByte(),R|=(d&127)<<A,A+=7;let y,m;if(b===F){let g=await t.readByte();for(y=g&127;g&128;)y+=1,g=await t.readByte(),y=(y<<7)+(g&127);y=h-y}else if(b===ce){let g=await t.readExact(20);m=se(g,0)}let k=await t.inflateNext(R),w;if(b!==F&&b!==ce){let g=qt[b];if(!g)throw new Error(`Unknown object type: ${b}`);w={type:g,content:k,hash:await X(g,k)}}else if(b===F){let g=f.get(y);if(!g)throw new Error(`OFS_DELTA base not found at offset ${y}`);let x=Ue(g.content,k);w={type:g.type,content:x,hash:await X(g.type,x)}}else{let g=c.get(m);if(!g&&e&&(g=await e(m)??void 0),!g)throw new Error(`REF_DELTA base not found for hash ${m}`);let x=Ue(g.content,k);w={type:g.type,content:x,hash:await X(g.type,x)}}f.set(h,w),c.set(w.hash,w),yield w}let l=se(await t.readRaw(20),0),p=await t.hashHex();if(p!==l)throw new Error(`pack checksum mismatch: expected ${l}, computed ${p}`)}function Ue(r,e){let t=0,{value:n,newPos:s}=Bt(e,t);if(t=s,n!==r.byteLength)throw new Error(`Delta base size mismatch: expected ${n}, got ${r.byteLength}`);let{value:a,newPos:o}=Bt(e,t);t=o;let i=new Uint8Array(a),f=0;for(;t<e.byteLength;){let c=e[t++];if(c&128){let l=0,p=0;c&1&&(l=e[t++]),c&2&&(l|=e[t++]<<8),c&4&&(l|=e[t++]<<16),c&8&&(l|=e[t++]<<24),c&16&&(p=e[t++]),c&32&&(p|=e[t++]<<8),c&64&&(p|=e[t++]<<16),p===0&&(p=65536),i.set(r.subarray(l,l+p),f),f+=p}else if(c>0)i.set(e.subarray(t,t+c),f),f+=c,t+=c;else throw new Error("Unexpected delta opcode 0x00 (reserved)")}if(f!==a)throw new Error(`Delta produced ${f} bytes, expected ${a}`);return i}async function Z(r){let e=[],t=new Map,n=new Uint8Array(12),s=new DataView(n.buffer);s.setUint32(0,Y),s.setUint32(4,Le),s.setUint32(8,r.length),e.push(n);let a=12,o=[];for(let i of r){let f=a;t.set(i.hash,a);let c=i.delta&&i.deltaBaseHash?t.get(i.deltaBaseHash):void 0;if(i.delta&&c!==void 0){let l=Ye(F,i.delta.byteLength),p=Qr(a-c),u=await Te(i.delta);e.push(l,p,u),a+=l.byteLength+p.byteLength+u.byteLength}else{let l=Vt[i.type],p=Ye(l,i.content.byteLength),u=await Te(i.content);e.push(p,u),a+=p.byteLength+u.byteLength}o.push({hash:i.hash,offset:f,nextOffset:a})}return{data:await Jr(e),entries:o}}async function*Xt(r,e){let t=z(),n=new Uint8Array(12),s=new DataView(n.buffer);s.setUint32(0,Y),s.setUint32(4,Le),s.setUint32(8,r),t.update(n),yield n;for await(let a of e){let o=Vt[a.type],i=Ye(o,a.content.byteLength),f=await Te(a.content);t.update(i),t.update(f),yield en(i,f)}yield ae(await t.hex())}async function Jr(r){let e=0;for(let o of r)e+=o.byteLength;e+=20;let t=new Uint8Array(e),n=0;for(let o of r)t.set(o,n),n+=o.byteLength;let s=z();s.update(t.subarray(0,n));let a=await s.hex();return t.set(ae(a),n),t}function Qr(r){let e=[];e.push(r&127);let t=r>>>7;for(;t>0;)e.unshift(128|--t&127),t>>>=7;return new Uint8Array(e)}function Ye(r,e){let t=[],n=r<<4|e&15;for(e>>=4;e>0;)t.push(n|128),n=e&127,e>>=7;return t.push(n),new Uint8Array(t)}function Bt(r,e){let t=0,n=0,s;do s=r[e++],t|=(s&127)<<n,n+=7;while(s&128);return{value:t,newPos:e}}function en(r,e){let t=new Uint8Array(r.byteLength+e.byteLength);return t.set(r,0),t.set(e,r.byteLength),t}var tn=new TextEncoder;async function X(r,e){let t=tn.encode(`${r} ${e.byteLength}\0`),n=z();return n.update(t),n.update(e),n.hex()}var rn=new TextEncoder,us=new TextDecoder;function Yt(r,e){let t=rn.encode(`${r} ${e.byteLength}\0`),n=new Uint8Array(t.byteLength+e.byteLength);return n.set(t),n.set(e,t.byteLength),n}function fe(r){let e=r.indexOf("<"),t=r.indexOf(">");if(e===-1||t===-1)throw new Error(`Malformed identity line: "${r}"`);let n=r.slice(0,e).trimEnd(),s=r.slice(e+1,t),a=r.slice(t+2),[o="0",i="+0000"]=a.split(" "),f=parseInt(o,10);return{name:n,email:s,timestamp:f,timezone:i}}function Ce(r){return`${r.name} <${r.email}> ${r.timestamp} ${r.timezone}`}var nn=new TextEncoder,sn=new TextDecoder;function le(r){let e=sn.decode(r),t=e.indexOf(`
1
+ var Le=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});function U(r){return r!=null&&typeof r=="object"&&"reject"in r&&r.reject===!0}var oe="0000000000000000000000000000000000000000",Tt=(()=>{let r=new Array(256);for(let e=0;e<256;e++)r[e]=(e>>4).toString(16)+(e&15).toString(16);return r})();function Ce(r){let e="";for(let t=0;t<20;t++)e+=Tt[r[t]];return e}function ce(r,e){let t="";for(let n=0;n<20;n++)t+=Tt[r[e+n]];return t}function fe(r){let e=new Uint8Array(20);for(let t=0;t<20;t++)e[t]=parseInt(r.slice(t*2,t*2+2),16);return e}var qr=new Set(["tree","commit","tag"]),He=class{map=new Map;currentBytes=0;maxBytes;constructor(e=16*1024*1024){this.maxBytes=e}get(e){return this.map.get(e)}set(e,t){if(!qr.has(t.type))return;let n=t.content.byteLength;if(!(n>this.maxBytes/2)&&!this.map.has(e)){for(;this.currentBytes+n>this.maxBytes&&this.map.size>0;){let s=this.map.keys().next().value;this.currentBytes-=this.map.get(s).content.byteLength,this.map.delete(s)}this.map.set(e,t),this.currentBytes+=n}}get size(){return this.map.size}get bytes(){return this.currentBytes}clear(){this.map.clear(),this.currentBytes=0}};var Vr=new TextEncoder;function Xe(r){return typeof r=="string"?Vr.encode(r):r}function zr(){if(typeof globalThis.Bun<"u")return()=>{let r=new Bun.CryptoHasher("sha1"),e={update(t){return r.update(Xe(t)),e},hex:()=>Promise.resolve(r.digest("hex"))};return e};try{let r=Le(["node","crypto"].join(":"));if(typeof r.createHash=="function")return()=>{let e=r.createHash("sha1"),t={update(n){return e.update(Xe(n)),t},hex:()=>Promise.resolve(e.digest("hex"))};return t}}catch{}if(typeof globalThis.crypto?.subtle?.digest=="function")return()=>{let r=[],e={update(t){return r.push(Xe(t)),e},async hex(){let t=0;for(let i of r)t+=i.byteLength;let n=new Uint8Array(t),s=0;for(let i of r)n.set(i,s),s+=i.byteLength;let a=await crypto.subtle.digest("SHA-1",n);return Ce(new Uint8Array(a))}};return e};throw new Error("No SHA-1 implementation available. Requires Bun, Node.js, Deno, or a browser with Web Crypto.")}var Ut=zr(),X=Ut;async function Lt(r){return Ut().update(r).hex()}var M=Uint8Array,Y=Uint16Array,Kr=Int32Array,Ct=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Ht=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Xr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Dt=(r,e)=>{let t=new Y(31);for(let s=0;s<31;++s)t[s]=e+=1<<r[s-1];let n=new Kr(t[30]);for(let s=1;s<30;++s)for(let a=t[s];a<t[s+1];++a)n[a]=a-t[s]<<5|s;return{b:t,r:n}},{b:Bt}=Dt(Ct,2);Bt[28]=258;var{b:Yr}=Dt(Ht,0),Je=new Y(32768);for(let r=0;r<32768;++r){let e=(r&43690)>>1|(r&21845)<<1;e=(e&52428)>>2|(e&13107)<<2,e=(e&61680)>>4|(e&3855)<<4,Je[r]=((e&65280)>>8|(e&255)<<8)>>1}var le=(r,e,t)=>{let n=r.length,s=0,a=new Y(e);for(;s<n;++s)r[s]&&++a[r[s]-1];let i=new Y(e);for(s=1;s<e;++s)i[s]=i[s-1]+a[s-1]<<1;let o;if(t){o=new Y(1<<e);let f=15-e;for(s=0;s<n;++s)if(r[s]){let c=s<<4|r[s],l=e-r[s],d=i[r[s]-1]++<<l;for(let u=d|(1<<l)-1;d<=u;++d)o[Je[d]>>f]=c}}else for(o=new Y(n),s=0;s<n;++s)r[s]&&(o[s]=Je[i[r[s]-1]++]>>15-r[s]);return o},de=new M(288);for(let r=0;r<144;++r)de[r]=8;for(let r=144;r<256;++r)de[r]=9;for(let r=256;r<280;++r)de[r]=7;for(let r=280;r<288;++r)de[r]=8;var _t=new M(32);for(let r=0;r<32;++r)_t[r]=5;var Zr=le(de,9,1),Jr=le(_t,5,1),Ye=r=>{let e=r[0];for(let t=1;t<r.length;++t)r[t]>e&&(e=r[t]);return e},N=(r,e,t)=>{let n=e/8|0;return(r[n]|r[n+1]<<8)>>(e&7)&t},Ze=(r,e)=>{let t=e/8|0;return(r[t]|r[t+1]<<8|r[t+2]<<16)>>(e&7)},Nt=r=>(r+7)/8|0,Qr=(r,e,t)=>((e==null||e<0)&&(e=0),(t==null||t>r.length)&&(t=r.length),new M(r.subarray(e,t))),$=(r,e)=>{let t=["unexpected EOF","invalid block type","invalid length/literal","invalid distance"];throw new Error(e||t[r]||"unknown inflate error")},Mt=(r,e,t,n)=>{let s=r.length,a=n?n.length:0;if(!s||e.f&&!e.l)return t||new M(0);let i=!t,o=i||e.i!=2,f=e.i;i&&(t=new M(s*3));let c=A=>{let x=t.length;if(A>x){let m=new M(Math.max(x*2,A));m.set(t),t=m}},l=e.f||0,d=e.p||0,u=e.b||0,h=e.l,p=e.d,g=e.m,R=e.n,P=s*8;do{if(!h){l=N(r,d,1);let b=N(r,d+1,3);if(d+=3,b)if(b==1)h=Zr,p=Jr,g=9,R=5;else if(b==2){let y=N(r,d,31)+257,w=N(r,d+10,15)+4,O=y+N(r,d+5,31)+1;d+=14;let E=new M(O),S=new M(19);for(let T=0;T<w;++T)S[Xr[T]]=N(r,d+T*3,7);d+=w*3;let j=Ye(S),v=(1<<j)-1,L=le(S,j,1);for(let T=0;T<O;){let G=L[N(r,d,v)];d+=G&15;let ie=G>>4;if(ie<16)E[T++]=ie;else{let It=0,Ue=0;for(ie==16?(Ue=3+N(r,d,3),d+=2,It=E[T-1]):ie==17?(Ue=3+N(r,d,7),d+=3):ie==18&&(Ue=11+N(r,d,127),d+=7);Ue--;)E[T++]=It}}let H=E.subarray(0,y),F=E.subarray(y);g=Ye(H),R=Ye(F),h=le(H,g,1),p=le(F,R,1)}else $(1);else{let y=Nt(d)+4,w=r[y-4]|r[y-3]<<8,O=y+w;if(O>s){f&&$(0);break}o&&c(u+w),t.set(r.subarray(y,O),u),e.b=u+=w,e.p=d=O*8,e.f=l;continue}if(d>P){f&&$(0);break}}o&&c(u+131072);let A=(1<<g)-1,x=(1<<R)-1,m=d;for(;;m=d){let b=h[Ze(r,d)&A],y=b>>4;if(d+=b&15,d>P){f&&$(0);break}if(b||$(2),y<256)t[u++]=y;else if(y==256){m=d,h=null;break}else{let w=y-254;if(y>264){let v=y-257,L=Ct[v];w=N(r,d,(1<<L)-1)+Bt[v],d+=L}let O=p[Ze(r,d)&x],E=O>>4;O||$(3),d+=O&15;let S=Yr[E];if(E>3){let v=Ht[E];S+=Ze(r,d)&(1<<v)-1,d+=v}if(d>P){f&&$(0);break}o&&c(u+131072);let j=u+w;if(u<S){let v=a-S,L=Math.min(S,j);for(v+u<0&&$(3);u<L;++u)t[u]=n[v+u]}for(;u<j;++u)t[u]=t[u-S]}}e.l=h,e.p=m,e.b=u,e.f=l,h&&(l=1,e.m=g,e.d=p,e.n=R)}while(!l);return u!=t.length&&i?Qr(t,0,u):t.subarray(0,u)},Ft=r=>(((r[0]&15)!=8||r[0]>>4>7||(r[0]<<8|r[1])%31)&&$(0,"invalid zlib data"),r[1]&32&&$(0,"zlib dictionaries are not supported"),2);function $t(r){let e=Ft(r);return Mt(r.subarray(e,-4),{i:2})}function Qe(r){let e=Ft(r),t={i:2},n=Mt(r.subarray(e),t),s=Nt(t.p);return{result:n,bytesConsumed:e+s+4}}async function en(){let r;if(!(typeof document<"u"))try{r=Le(["node","zlib"].join(":"))}catch{try{r=await import(["node","zlib"].join(":"))}catch{}}if(r&&typeof r.deflateSync=="function"&&typeof r.inflateSync=="function"){let n=null;try{let s=r.inflateSync(r.deflateSync(Buffer.from("x")),{info:!0});s?.engine&&typeof s.engine.bytesWritten=="number"&&(n=a=>{let i=r.inflateSync(a,{info:!0});return{result:new Uint8Array(i.buffer),bytesConsumed:i.engine.bytesWritten}})}catch{}return{deflateSync:s=>new Uint8Array(r.deflateSync(s)),inflateSync:s=>new Uint8Array(r.inflateSync(s)),inflateWithConsumed:n??Qe}}let t;return typeof globalThis.CompressionStream=="function"?t=async n=>{let s=new CompressionStream("deflate"),a=s.writable.getWriter();return a.write(n),a.close(),new Uint8Array(await new Response(s.readable).arrayBuffer())}:t=()=>{throw new Error("No deflate implementation available. Requires node:zlib or CompressionStream.")},{deflateSync:t,inflateSync:$t,inflateWithConsumed:Qe}}var tn=null;function Wt(){return tn??=en()}async function De(r){return await(await Wt()).deflateSync(r)}async function et(r,e){let t=await Wt(),{result:n,bytesConsumed:s}=t.inflateWithConsumed(r);if(n.byteLength!==e)throw new Error(`Inflate size mismatch: got ${n.byteLength}, expected ${e}`);return{result:n,bytesConsumed:s}}var J=1346454347,_e=2,Vt=1,zt=2,Kt=3,Xt=4,q=6,ue=7,Yt={[Vt]:"commit",[zt]:"tree",[Kt]:"blob",[Xt]:"tag"},Zt={commit:Vt,tree:zt,blob:Kt,tag:Xt};async function Jt(r,e){let t=new DataView(r.buffer,r.byteOffset,r.byteLength),n=t.getUint32(0);if(n!==J)throw new Error(`Invalid pack signature: 0x${n.toString(16)} (expected 0x${J.toString(16)})`);let s=t.getUint32(4);if(s!==_e)throw new Error(`Unsupported pack version: ${s}`);if(r.byteLength>=32){let c=ce(r,r.byteLength-20),l=X();l.update(r.subarray(0,r.byteLength-20));let d=await l.hex();if(d!==c)throw new Error(`pack checksum mismatch: expected ${c}, computed ${d}`)}let a=t.getUint32(8),i=[],o=12;for(let c=0;c<a;c++){let l=await rn(r,o);i.push(l),o=l.nextOffset}return(await nn(i,e)).map((c,l)=>({...c,offset:i[l].headerOffset,nextOffset:i[l].nextOffset}))}async function rn(r,e){let t=e,n=r[e++],s=n>>4&7,a=n&15,i=4;for(;n&128;)n=r[e++],a|=(n&127)<<i,i+=7;let o,f;if(s===q){let d=r[e++];for(o=d&127;d&128;)o+=1,d=r[e++],o=(o<<7)+(d&127);o=t-o}else s===ue&&(f=ce(r,e),e+=20);let{result:c,bytesConsumed:l}=await et(r.subarray(e),a);return{headerOffset:t,typeNum:s,inflated:c,baseOffset:o,baseHash:f,nextOffset:e+l}}var Gt=50;async function nn(r,e){let t=new Map;for(let a=0;a<r.length;a++)t.set(r[a].headerOffset,a);let n=new Array(r.length).fill(null);async function s(a,i=0){if(i>Gt)throw new Error(`delta chain depth ${i} exceeds limit of ${Gt}`);let o=n[a];if(o)return o;let f=r[a];if(f.typeNum!==q&&f.typeNum!==ue){let h=Yt[f.typeNum];if(!h)throw new Error(`Unknown object type: ${f.typeNum}`);let p={type:h,content:f.inflated,hash:await Z(h,f.inflated)};return n[a]=p,p}if(f.typeNum===q){let h=t.get(f.baseOffset);if(h===void 0)throw new Error(`OFS_DELTA base not found at offset ${f.baseOffset}`);let p=await s(h,i+1),g=Be(p.content,f.inflated),R={type:p.type,content:g,hash:await Z(p.type,g)};return n[a]=R,R}let c=await sn(r,n,f.baseHash,s),l;if(c!==void 0)l=await s(c,i+1);else if(e){let h=await e(f.baseHash);h&&(l=h)}if(!l)throw new Error(`REF_DELTA base not found for hash ${f.baseHash}`);let d=Be(l.content,f.inflated),u={type:l.type,content:d,hash:await Z(l.type,d)};return n[a]=u,u}for(let a=0;a<r.length;a++)await s(a);return n}async function sn(r,e,t,n){for(let s=0;s<e.length;s++)if(e[s]?.hash===t)return s;for(let s=0;s<r.length;s++){let a=r[s];if(a.typeNum!==q&&a.typeNum!==ue&&(await n(s)).hash===t)return s}}var tt=class{buf=new Uint8Array(0);iter;eof=!1;_bytesRead=0;hasher;constructor(e,t=!1){this.iter=e[Symbol.asyncIterator](),this.hasher=t?X():null}get bytesRead(){return this._bytesRead}async pullMore(){if(this.eof)return!1;let{value:e,done:t}=await this.iter.next();if(t||!e)return this.eof=!0,!1;if(this.buf.byteLength===0)this.buf=new Uint8Array(e);else{let n=new Uint8Array(this.buf.byteLength+e.byteLength);n.set(this.buf),n.set(e,this.buf.byteLength),this.buf=n}return!0}async ensure(e){for(;this.buf.byteLength<e;)if(!await this.pullMore())throw new Error(`Unexpected end of pack data: needed ${e} bytes, have ${this.buf.byteLength}`)}consume(e){let t=new Uint8Array(this.buf.subarray(0,e));return this.hasher?.update(t),this.buf=this.buf.subarray(e),this._bytesRead+=e,t}async readByte(){return await this.ensure(1),this.consume(1)[0]}async readExact(e){return await this.ensure(e),this.consume(e)}async readRaw(e){await this.ensure(e);let t=new Uint8Array(this.buf.subarray(0,e));return this.buf=this.buf.subarray(e),this._bytesRead+=e,t}async inflateNext(e){for(this.buf.byteLength===0&&!this.eof&&await this.pullMore();;)try{let{result:t,bytesConsumed:n}=await et(this.buf,e);return this.consume(n),t}catch{if(!this.eof&&await this.pullMore())continue;throw new Error(`Failed to inflate pack entry at byte ${this._bytesRead} (expected ${e} bytes)`)}}async hashHex(){if(!this.hasher)throw new Error("Hashing not enabled");return this.hasher.hex()}};async function*Qt(r,e){let t=new tt(r,!0),n=await t.readExact(12),s=new DataView(n.buffer,n.byteOffset,n.byteLength),a=s.getUint32(0);if(a!==J)throw new Error(`Invalid pack signature: 0x${a.toString(16)} (expected 0x${J.toString(16)})`);let i=s.getUint32(4);if(i!==_e)throw new Error(`Unsupported pack version: ${i}`);let o=s.getUint32(8),f=new Map,c=new Map;for(let u=0;u<o;u++){let h=t.bytesRead,p=await t.readByte(),g=p>>4&7,R=p&15,P=4;for(;p&128;)p=await t.readByte(),R|=(p&127)<<P,P+=7;let A,x;if(g===q){let y=await t.readByte();for(A=y&127;y&128;)A+=1,y=await t.readByte(),A=(A<<7)+(y&127);A=h-A}else if(g===ue){let y=await t.readExact(20);x=ce(y,0)}let m=await t.inflateNext(R),b;if(g!==q&&g!==ue){let y=Yt[g];if(!y)throw new Error(`Unknown object type: ${g}`);b={type:y,content:m,hash:await Z(y,m)}}else if(g===q){let y=f.get(A);if(!y)throw new Error(`OFS_DELTA base not found at offset ${A}`);let w=Be(y.content,m);b={type:y.type,content:w,hash:await Z(y.type,w)}}else{let y=c.get(x);if(!y&&e&&(y=await e(x)??void 0),!y)throw new Error(`REF_DELTA base not found for hash ${x}`);let w=Be(y.content,m);b={type:y.type,content:w,hash:await Z(y.type,w)}}f.set(h,b),c.set(b.hash,b),yield b}let l=ce(await t.readRaw(20),0),d=await t.hashHex();if(d!==l)throw new Error(`pack checksum mismatch: expected ${l}, computed ${d}`)}function Be(r,e){let t=0,{value:n,newPos:s}=qt(e,t);if(t=s,n!==r.byteLength)throw new Error(`Delta base size mismatch: expected ${n}, got ${r.byteLength}`);let{value:a,newPos:i}=qt(e,t);t=i;let o=new Uint8Array(a),f=0;for(;t<e.byteLength;){let c=e[t++];if(c&128){let l=0,d=0;c&1&&(l=e[t++]),c&2&&(l|=e[t++]<<8),c&4&&(l|=e[t++]<<16),c&8&&(l|=e[t++]<<24),c&16&&(d=e[t++]),c&32&&(d|=e[t++]<<8),c&64&&(d|=e[t++]<<16),d===0&&(d=65536),o.set(r.subarray(l,l+d),f),f+=d}else if(c>0)o.set(e.subarray(t,t+c),f),f+=c,t+=c;else throw new Error("Unexpected delta opcode 0x00 (reserved)")}if(f!==a)throw new Error(`Delta produced ${f} bytes, expected ${a}`);return o}async function Q(r){let e=[],t=new Map,n=new Uint8Array(12),s=new DataView(n.buffer);s.setUint32(0,J),s.setUint32(4,_e),s.setUint32(8,r.length),e.push(n);let a=12,i=[];for(let o of r){let f=a;t.set(o.hash,a);let c=o.delta&&o.deltaBaseHash?t.get(o.deltaBaseHash):void 0;if(o.delta&&c!==void 0){let l=rt(q,o.delta.byteLength),d=on(a-c),u=await De(o.delta);e.push(l,d,u),a+=l.byteLength+d.byteLength+u.byteLength}else{let l=Zt[o.type],d=rt(l,o.content.byteLength),u=await De(o.content);e.push(d,u),a+=d.byteLength+u.byteLength}i.push({hash:o.hash,offset:f,nextOffset:a})}return{data:await an(e),entries:i}}async function*er(r,e){let t=X(),n=new Uint8Array(12),s=new DataView(n.buffer);s.setUint32(0,J),s.setUint32(4,_e),s.setUint32(8,r),t.update(n),yield n;for await(let a of e){let i=Zt[a.type],o=rt(i,a.content.byteLength),f=await De(a.content);t.update(o),t.update(f),yield cn(o,f)}yield fe(await t.hex())}async function an(r){let e=0;for(let i of r)e+=i.byteLength;e+=20;let t=new Uint8Array(e),n=0;for(let i of r)t.set(i,n),n+=i.byteLength;let s=X();s.update(t.subarray(0,n));let a=await s.hex();return t.set(fe(a),n),t}function on(r){let e=[];e.push(r&127);let t=r>>>7;for(;t>0;)e.unshift(128|--t&127),t>>>=7;return new Uint8Array(e)}function rt(r,e){let t=[],n=r<<4|e&15;for(e>>=4;e>0;)t.push(n|128),n=e&127,e>>=7;return t.push(n),new Uint8Array(t)}function qt(r,e){let t=0,n=0,s;do s=r[e++],t|=(s&127)<<n,n+=7;while(s&128);return{value:t,newPos:e}}function cn(r,e){let t=new Uint8Array(r.byteLength+e.byteLength);return t.set(r,0),t.set(e,r.byteLength),t}var fn=new TextEncoder;async function Z(r,e){let t=fn.encode(`${r} ${e.byteLength}\0`),n=X();return n.update(t),n.update(e),n.hex()}var ln=new TextEncoder,As=new TextDecoder;function tr(r,e){let t=ln.encode(`${r} ${e.byteLength}\0`),n=new Uint8Array(t.byteLength+e.byteLength);return n.set(t),n.set(e,t.byteLength),n}function pe(r){let e=r.indexOf("<"),t=r.indexOf(">");if(e===-1||t===-1)throw new Error(`Malformed identity line: "${r}"`);let n=r.slice(0,e).trimEnd(),s=r.slice(e+1,t),a=r.slice(t+2),[i="0",o="+0000"]=a.split(" "),f=parseInt(i,10);return{name:n,email:s,timestamp:f,timezone:o}}function Ne(r){return`${r.name} <${r.email}> ${r.timestamp} ${r.timezone}`}var dn=new TextEncoder,un=new TextDecoder;function he(r){let e=un.decode(r),t=e.indexOf(`
2
2
 
3
- `),n=t===-1?e:e.slice(0,t),s=t===-1?"":e.slice(t+2),a="",o=[],i,f;for(let c of n.split(`
4
- `)){let l=c.indexOf(" ");if(l===-1)continue;let p=c.slice(0,l),u=c.slice(l+1);switch(p){case"tree":a=u;break;case"parent":o.push(u);break;case"author":i=fe(u);break;case"committer":f=fe(u);break}}if(!a)throw new Error("Commit missing tree field");if(!i)throw new Error("Commit missing author field");if(!f)throw new Error("Commit missing committer field");return{type:"commit",tree:a,parents:o,author:i,committer:f,message:s}}function Zt(r){let e=[];e.push(`tree ${r.tree}`);for(let t of r.parents)e.push(`parent ${t}`);return e.push(`author ${Ce(r.author)}`),e.push(`committer ${Ce(r.committer)}`),e.push(""),e.push(r.message),nn.encode(e.join(`
5
- `))}var ws=new TextEncoder,an=new TextDecoder;function J(r){let e=an.decode(r),t=e.indexOf(`
3
+ `),n=t===-1?e:e.slice(0,t),s=t===-1?"":e.slice(t+2),a="",i=[],o,f;for(let c of n.split(`
4
+ `)){let l=c.indexOf(" ");if(l===-1)continue;let d=c.slice(0,l),u=c.slice(l+1);switch(d){case"tree":a=u;break;case"parent":i.push(u);break;case"author":o=pe(u);break;case"committer":f=pe(u);break}}if(!a)throw new Error("Commit missing tree field");if(!o)throw new Error("Commit missing author field");if(!f)throw new Error("Commit missing committer field");return{type:"commit",tree:a,parents:i,author:o,committer:f,message:s}}function rr(r){let e=[];e.push(`tree ${r.tree}`);for(let t of r.parents)e.push(`parent ${t}`);return e.push(`author ${Ne(r.author)}`),e.push(`committer ${Ne(r.committer)}`),e.push(""),e.push(r.message),dn.encode(e.join(`
5
+ `))}var js=new TextEncoder,pn=new TextDecoder;function ee(r){let e=pn.decode(r),t=e.indexOf(`
6
6
 
7
- `),n=t===-1?e:e.slice(0,t),s=t===-1?"":e.slice(t+2),a="",o="commit",i="",f;for(let c of n.split(`
8
- `)){let l=c.indexOf(" ");if(l===-1)continue;let p=c.slice(0,l),u=c.slice(l+1);switch(p){case"object":a=u;break;case"type":o=u;break;case"tag":i=u;break;case"tagger":f=fe(u);break}}if(!a)throw new Error("Tag missing object field");if(!i)throw new Error("Tag missing tag name field");if(!f)throw new Error("Tag missing tagger field");return{type:"tag",object:a,objectType:o,name:i,tagger:f,message:s}}async function He(r,e,t){let n=await r.objectStore.write(e,t);return r.hooks?.onObjectWrite?.({repo:r,type:e,hash:n}),n}async function q(r,e){return r.objectStore.read(e)}async function pe(r,e){return r.objectStore.exists(e)}var Es=new TextDecoder;async function W(r,e){let t=await q(r,e);if(t.type!=="commit")throw new Error(`Expected commit object for ${e}, got ${t.type}`);return le(t.content)}var on=new TextEncoder,Jt=new TextDecoder,cn=new Set(["100644","100755","040000","120000","160000"]);function fn(r){return r.length===4&&r.toLowerCase()===".git"}function ln(r,e){if(r.length===0)throw new Error("invalid tree entry: empty name");if(r.includes("/"))throw new Error(`invalid tree entry: name contains slash: '${r}'`);if(r.includes("\0"))throw new Error("invalid tree entry: name contains null byte");if(r==="."||r==="..")throw new Error(`invalid tree entry: '${r}'`);if(fn(r))throw new Error(`invalid tree entry: '${r}'`);if(!cn.has(e))throw new Error(`invalid tree entry mode: '${e}' for '${r}'`)}function de(r){let e=[],t=0;for(;t<r.byteLength;){let n=r.indexOf(32,t);if(n===-1)break;let s=Jt.decode(r.subarray(t,n)),a=r.indexOf(0,n+1);if(a===-1)break;let o=Jt.decode(r.subarray(n+1,a)),i=r.subarray(a+1,a+21),f=je(i),c=s.padStart(6,"0");ln(o,c),e.push({mode:c,name:o,hash:f}),t=a+21}return{type:"tree",entries:e}}function Qt(r){let e=[];for(let a of r.entries){let o=a.mode.replace(/^0+/,""),i=on.encode(`${o} ${a.name}\0`),f=ae(a.hash);e.push(i),e.push(f)}let t=e.reduce((a,o)=>a+o.byteLength,0),n=new Uint8Array(t),s=0;for(let a of e)n.set(a,s),s+=a.byteLength;return n}function er(r){return typeof r=="string"?{type:"direct",hash:r}:r}var Ze=".lock";var pn=[1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,5,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,4,4];function dn(r,e,t){let n=0,s=!1,a=e;for(;a<r.length;a++){let i=r.charCodeAt(a);switch(i<128?pn[i]:0){case 1:break;case 2:if(n===46)return{len:-1,starConsumed:s};n=i;continue;case 3:if(n===64)return{len:-1,starConsumed:s};n=i;continue;case 4:return{len:-1,starConsumed:s};case 5:if(!t)return{len:-1,starConsumed:s};s=!0,n=i;continue;default:n=i;continue}break}let o=a-e;return o===0?{len:0,starConsumed:s}:r.charCodeAt(e)===46?{len:-1,starConsumed:s}:o>=Ze.length&&r.slice(a-Ze.length,a)===Ze?{len:-1,starConsumed:s}:{len:o,starConsumed:s}}function Je(r,e=0){if(r==="@"||r.length===0)return!1;let t=0,n=0,s=!!(e&2);for(;t<=r.length;){let{len:a,starConsumed:o}=dn(r,t,s);if(a<0||a===0)return!1;o&&(s=!1),n++,t+=a+1}return!(r.charCodeAt(r.length-1)===46||!(e&1)&&n<2)}var un=10;async function hn(r,e){return r.refStore.readRef(e)}async function ue(r,e){let t=e;for(let n=0;n<un;n++){let s=await hn(r,t);if(!s)return null;if(s.type==="direct")return s.hash;t=s.target}throw new Error(`Symbolic ref loop detected resolving "${e}"`)}function yn(r){let e=Math.abs(r),t=r<=0?"+":"-",n=String(Math.floor(e/60)).padStart(2,"0"),s=String(e%60).padStart(2,"0");return`${t}${n}${s}`}function tr(r){if("timestamp"in r)return r;let e=r.date??new Date;return{name:r.name,email:r.email,timestamp:Math.floor(e.getTime()/1e3),timezone:yn(e.getTimezoneOffset())}}async function nr(r,e){let t=e.branch?`refs/heads/${e.branch}`:null,n=t?await ue(r,t):null,s=null;n&&(s=(await W(r,n)).tree);let a=[];for(let[u,h]of Object.entries(e.files))if(h===null)a.push({path:u,hash:null});else{let d=typeof h=="string"?new TextEncoder().encode(h):h,b=await He(r,"blob",d);a.push({path:u,hash:b})}let o;s?o=await mn(r,s,a):o=await et(r,null,Qe(a));let i=tr(e.author),f=e.committer?tr(e.committer):i,l=Zt({type:"commit",tree:o,parents:n?[n]:[],author:i,committer:f,message:e.message});return{hash:await He(r,"commit",l),parentHash:n}}async function mn(r,e,t){return et(r,e,Qe(t))}function Qe(r){let e=new Map,t=new Map;for(let n of r){let s=n.path.indexOf("/");if(s===-1)e.set(n.path,{hash:n.hash,mode:n.mode??"100644"});else{let a=n.path.slice(0,s),o=n.path.slice(s+1),i=t.get(a);i||(i=[],t.set(a,i)),i.push({...n,path:o})}}return{files:e,dirs:t}}async function rr(r,e){let t=await q(r,e);if(t.type!=="tree")throw new Error(`Expected tree object, got ${t.type}`);return de(t.content).entries}async function et(r,e,t){let n=new Map;if(e)for(let o of await rr(r,e))n.set(o.name,o);for(let[o,{hash:i,mode:f}]of t.files)i===null?n.delete(o):n.set(o,{name:o,hash:i,mode:f});for(let[o,i]of t.dirs){let f=n.get(o),c=f?.mode==="040000"?f.hash:null,l=Qe(i),p=await et(r,c,l);(await rr(r,p)).length===0?n.delete(o):n.set(o,{name:o,hash:p,mode:"040000"})}let s=[...n.values()].sort((o,i)=>{let f=o.mode==="040000"?`${o.name}/`:o.name,c=i.mode==="040000"?`${i.name}/`:i.name;return f<c?-1:f>c?1:0}),a=Qt({type:"tree",entries:s});return He(r,"tree",a)}async function tt(r,e,t){if(e===t)return!0;let n=new Set,s=[t],a=0;for(;a<s.length;){let o=s[a++];if(o===e)return!0;if(n.has(o))continue;n.add(o);let i;try{i=await W(r,o)}catch{continue}for(let f of i.parents)n.has(f)||s.push(f)}return!1}var _e=new Uint32Array([0,2874782929,1454598562,4260027763,104818581,2909197124,1351355959,4225088230,209637162,2804382715,1523426952,4053013081,172075199,2702711918,1559413021,4155209164,419274324,3013880453,1313798134,3843506983,516094401,3046853904,1215402083,3811058866,344150398,3218793903,1110456540,3916008461,314324715,3118826042,1141858121,4015451032,838548648,2594343033,1732793610,3423723995,935615293,2627596268,1635201695,3392046670,1032188802,2531018579,1798740512,3228511985,1002083351,2430804166,1829371317,3327150436,688300796,2187269677,2142620510,3572268943,792315241,2220913080,2039131339,3537049626,628649430,2384582919,1942684788,3633492133,591858243,2283716242,1978950625,3735934768,1677097296,3366964609,893718770,2652677155,1707679429,3465587220,863663975,2552480694,1871230586,3302032043,960225240,2455923465,1773654511,3270403390,1057273933,2489126044,2064377604,3495056341,767069862,2262907511,2100592785,3597481024,730327347,2162056674,2004166702,3693911295,566641036,2325738845,1900695483,3658742634,670639641,2359333576,1376601592,4183093545,79572058,2951190667,1412571757,4285241020,42027983,2849570590,1584630482,4113186307,146858864,2744735649,1481436487,4078262678,251626725,2779131956,1257298860,3785977725,474198542,3071936223,1288682553,3885369576,444388763,2972016970,1183716486,3990331479,272465188,3143944693,1085371155,3957901250,369236657,3176902240,1823819377,3354194592,973483987,2438961922,1787437540,3251868981,1010387014,2539715735,1623951707,3415358858,913891577,2636207144,1727327950,3450690079,809994092,2602447805,1950930981,3742461172,586920327,2309096790,1920450480,3643673441,616879634,2409456323,2016810767,3547309022,780500653,2245839484,2114547866,3578840139,683284792,2212736489,1565424345,4128755208,201134971,2695145386,1534139724,4029196701,230847726,2795225151,1362146803,4201185570,126082129,2899994752,1460654694,4233520823,29146052,2867138325,1169417357,4008333404,318803247,3092855294,1133282072,3906287561,356510394,3194379883,1238182823,3801390966,528368133,3022517972,1341279282,3836475619,423699856,2987954497,256065313,2753203184,1508923011,4071219794,159144116,2720394341,1607414038,4103505351,54390795,2825143514,1435408809,4275514744,84055966,2925208399,1404173884,4175973101,398369141,3169260964,1091422423,3931405318,293717728,3134747185,1194504002,3966442387,465595999,2962872974,1299384317,3861558060,503253450,3064380699,1263296616,3759527097,1052246921,2514597720,1745578539,3276988154,948397084,2480853197,1848905150,3312302447,851889315,2577365106,1685431553,3475771856,888777526,2678071271,1649066644,3373495877,642096605,2367432972,1895232639,3685695662,544930376,2334346905,1992922090,3717211963,708530935,2170742310,2089302869,3620835204,738473314,2271052211,2058837184,3522095121]),bn=new Uint32Array([0,2125799437,1446245579,679924934,121527623,2039184714,1359849868,800622977,243055246,1892260483,1481592389,653946440,155379657,2012727236,1601245954,566506255,486110492,1649169681,1254785495,880779738,466036827,1701972054,1307892880,859962525,310759314,1815146399,1152793433,973282132,364614357,1796125400,1133012510,1027425811,972220984,1195887157,1874927347,292830974,1053603711,1081710450,1761559476,373973945,932073654,1228632251,1639818365,520651888,816844273,1308962300,1719925050,406247735,621518628,1539227433,1933077487,227363810,573948515,1551950446,1946564264,179508901,729228714,1438778791,2101662049,66187628,743012589,1392269536,2054851622,80718891,1944441968,223409277,634790075,1533214902,1960544567,175024442,585661948,1549622769,2107207422,53235443,732600885,1428142648,2057778105,68293556,747947890,1377953663,1864147308,296321377,959403431,1201305002,1747123243,379051046,1041303776,1084500205,1633688546,534068207,928247593,1239863076,1717454501,418080424,812495470,1322816099,1243037256,883039813,472173187,1653729934,1294557967,865878786,454727620,1706014665,1147897030,987669707,307785741,1827491840,1129699713,1038154124,359017802,1808993607,1458457428,677079897,14532511,2120785810,1372591635,795162142,132375256,2035729109,1486025178,640143831,245433617,1880368412,1605151901,555322512,161437782,1999272027,1284643889,841432124,446818554,1679083767,1269580150,890855803,497006013,1663735216,1122936511,1012631218,350048884,1785229945,1171323896,996531189,333647667,1834364734,1349216557,786319648,106470886,2028846571,1465201770,702551143,23511201,2144592044,1578619811,547550126,136587112,1989216101,1495895780,664579817,253393455,1907317282,1969288713,198563332,592642754,1575363279,1918806862,216763203,611147653,1524137864,2065452167,94989450,758102092,1402640449,2082607552,43463117,705815819,1420084486,1771668245,388801304,1068136414,1092573139,1856495186,269680223,949234329,1176570516,1743075739,424679830,836160848,1331948893,1624990940,510543057,921210903,1214099482,1064814657,1103292492,1766079626,401677447,944346374,1190966539,1853514189,282018240,822833871,1337873090,1731757572,428713481,909455240,1216352133,1611062083,515111758,596557149,1564187984,1975339414,185100699,615571482,1510326295,1921193169,204879068,770836435,1397172190,2076308248,91542293,718035604,1417247385,2097131103,38440530,109388409,2016412276,1354159794,772011711,29065022,2131648307,1468566517,691907576,150575351,1984739578,1590324284,545213489,264750512,1903355325,1509175675,658575734,444356453,1690924904,1280287662,855278499,490867234,1677142575,1265762025,902094564,335605227,1790299622,1110645024,1015429421,322875564,1837863073,1158497383,1001940074]),De=64,gn=4,rt=4096,sr=65536,wn=127;function Rn(r){let e=r.byteLength;if(e===0)return null;let t=(e-1)/16|0;if(t===0)return null;let n=t>>>2;n<16&&(n=16),n=En(n);let s=n-1,a=new Uint32Array(n),o=[],i=-1>>>0;for(let u=t*16-16;u>=0;u-=16){let h=0;for(let d=1;d<=16;d++)h=(h<<8|r[u+d])^_e[h>>>23];if(h=h>>>0,h===i)o[o.length-1].ptr=u+16;else{i=h;let d=h&s;o.push({ptr:u+16,val:h}),a[d]++}}let f=new Map;for(let u of o){let h=u.val&s,d=f.get(h);d||(d=[],f.set(h,d)),d.push(u)}for(let[u,h]of f){if(h.length<=De)continue;let d=[],b=h.length/De;for(let R=0;R<De;R++)d.push(h[Math.floor(R*b)]);f.set(u,d),a[u]=De}let c=new Uint32Array(n+1),l=[],p=0;for(let u=0;u<n;u++){c[u]=p;let h=f.get(u);if(h){for(let d of h)l.push(d);p+=h.length}}return c[n]=p,{src:r,hashMask:s,buckets:c,entries:l}}function xn(r,e,t){if(!r||e.byteLength===0)return null;let n=r.src.byteLength,s=e.byteLength,a=r.src,o=new Uint8Array(Math.max(s,1024)),i=0;function f(b){for(;i+b>o.length;){let R=new Uint8Array(o.length*2);R.set(o),o=R}}i=ir(o,i,n),i=ir(o,i,s),f(18),i++;let c=0,l=0,p=Math.min(16,s);for(let b=0;b<p;b++)o[i++]=e[b],c=(c<<8|e[b])^_e[c>>>23],l++;c=c>>>0;let u=p,h=0,d=0;for(;u<s;){if(d<rt){c^=bn[e[u-16]],c=((c<<8|e[u])^_e[c>>>23])>>>0;let b=c&r.hashMask,R=r.buckets[b],A=r.buckets[b+1];for(let y=R;y<A;y++){let m=r.entries[y];if(m.val!==c)continue;let k=m.ptr,w=a.byteLength-k,g=s-u;if(w>g&&(w=g),w<=d)break;let x=0;for(;x<w&&a[k+x]===e[u+x];)x++;if(x>d&&(d=x,h=k,d>=rt))break}}if(d<gn)f(2),l===0&&i++,o[i++]=e[u++],l++,l===wn&&(o[i-l-1]=l,l=0),d=0;else{if(l>0){for(;h>0&&a[h-1]===e[u-1];)if(d++,h--,u--,i--,!(--l>0)){i--,l=-1;break}l>0&&(o[i-l-1]=l),l=0}let b=d>sr?d-sr:0;d-=b,f(8);let R=i++,A=128;if(h&255&&(o[i++]=h&255,A|=1),h&65280&&(o[i++]=h>>>8&255,A|=2),h&16711680&&(o[i++]=h>>>16&255,A|=4),h&4278190080&&(o[i++]=h>>>24&255,A|=8),d&255&&(o[i++]=d&255,A|=16),d&65280&&(o[i++]=d>>>8&255,A|=32),o[R]=A,u+=d,h+=d,d=b,h>4294967295&&(d=0),d<rt){c=0;for(let y=-16;y<0;y++)c=(c<<8|e[u+y])^_e[c>>>23];c=c>>>0}}if(t&&i>t)return null}return l>0&&(o[i-l-1]=l),t&&i>t?null:o.subarray(0,i)}var ar={blob:0,tree:1,commit:2,tag:3};function or(r,e){let t=e?.window??10,n=e?.depth??50,s=r.slice().sort((c,l)=>{let p=ar[c.type]??99,u=ar[l.type]??99;return p!==u?p-u:l.content.byteLength-c.content.byteLength}),a=new Map,o=[],i=[],f=[];for(let c=0;c<s.length;c++){let l=s[c],p={hash:l.hash,type:l.type,content:l.content,depth:0},u=null,h=null,d=Math.max(0,c-t);for(let b=c-1;b>=d;b--){let R=s[b];if(R.type!==l.type||(a.get(R.hash)?.depth??0)>=n||l.content.byteLength<R.content.byteLength>>>5)continue;let m=i[b-d]??null;if(!m)continue;let k=u?u.byteLength:l.content.byteLength/2|0;if(k<16)continue;let w=xn(m,l.content,k);w&&(!u||w.byteLength<u.byteLength)&&(u=w,h=R.hash)}if(u&&h){p.delta=u,p.deltaBase=h;let b=a.get(h);p.depth=(b?.depth??0)+1}a.set(l.hash,p),o.push(p),i.length>=t&&(i.shift(),f.shift()),i.push(Rn(l.content)),f.push(l.hash)}return o}function En(r){let e=r;return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e++,e<16?16:e}function ir(r,e,t){let n=t;do{let s=n&127;n>>>=7,n>0&&(s|=128),r[e++]=s}while(n>0);return e}var kn=2147483647;async function nt(r,e,t,n){if(t>=kn)return{shallow:[],unshallow:[...n]};let s=new Map,a=[];for(let c of e)!s.has(c)&&await pe(r,c)&&(s.set(c,1),a.push({hash:c,level:1}));let o=new Set,i=0;for(;i<a.length;){let{hash:c,level:l}=a[i++];if(l>=t){o.add(c);continue}let p;try{p=await W(r,c)}catch{continue}for(let u of p.parents)!s.has(u)&&await pe(r,u)&&(s.set(u,l+1),a.push({hash:u,level:l+1}))}let f=[];for(let c of n){let l=s.get(c);l!==void 0&&l<t&&f.push(c)}return{shallow:[...o],unshallow:f}}async function me(r,e,t,n,s){let a=s??n,o=new Set;for(let l of t)await he(r,l,o,a);let i=[...e];if(s&&n)for(let l of s)try{let p=await W(r,l);for(let u of p.parents)o.has(u)||i.push(u)}catch{}let f=[],c=new Set;for(let l of i)await ye(r,l,o,c,f,n);return{count:f.length,objects:An(f)}}async function cr(r,e,t,n,s){let{count:a,objects:o}=await me(r,e,t,n,s);return{count:a,objects:On(r,o)}}async function*An(r){for(let e of r)yield e}async function*On(r,e){for await(let t of e){let n=await q(r,t.hash);yield{hash:t.hash,type:t.type,content:n.content}}}async function fr(r){let e=[];for await(let t of r.objects)e.push(t);return e}async function he(r,e,t,n){if(t.has(e)||(t.add(e),!await pe(r,e)))return;let s=await q(r,e);switch(s.type){case"commit":{let a=le(s.content);if(await he(r,a.tree,t,n),!n?.has(e))for(let o of a.parents)await he(r,o,t,n);break}case"tree":{let a=de(s.content);for(let o of a.entries)await he(r,o.hash,t,n);break}case"tag":{let a=J(s.content);await he(r,a.object,t,n);break}case"blob":break}}async function ye(r,e,t,n,s,a){if(n.has(e)||t.has(e))return;n.add(e);let o=await q(r,e);switch(s.push({hash:e,type:o.type}),o.type){case"commit":{let i=le(o.content);if(await ye(r,i.tree,t,n,s,a),!a?.has(e))for(let f of i.parents)await ye(r,f,t,n,s,a);break}case"tree":{let i=de(o.content);for(let f of i.entries)await ye(r,f.hash,t,n,s,a);break}case"tag":{let i=J(o.content);await ye(r,i.object,t,n,s,a);break}case"blob":break}}var Pn=new TextEncoder,pr=new TextDecoder,lr=65520,vn=new Uint8Array([48,48,48,48]),Sn=new Uint8Array([48,48,48,49]),Gs=new Uint8Array([48,48,48,50]);function E(r){let e=typeof r=="string"?Pn.encode(r):r,t=4+e.byteLength;if(t>lr)throw new Error(`pkt-line too long: ${t} bytes (max ${lr})`);let n=t.toString(16).padStart(4,"0"),s=new Uint8Array(t);return s[0]=n.charCodeAt(0),s[1]=n.charCodeAt(1),s[2]=n.charCodeAt(2),s[3]=n.charCodeAt(3),s.set(e,4),s}function H(){return vn.slice()}function V(){return Sn.slice()}function C(...r){let e=0;for(let s of r)e+=s.byteLength;let t=new Uint8Array(e),n=0;for(let s of r)t.set(s,n),n+=s.byteLength;return t}function st(r){let e=[],t=0;for(;t<r.byteLength;){if(t+4>r.byteLength)throw new Error("Truncated pkt-line header");let n=pr.decode(r.subarray(t,t+4)),s=parseInt(n,16);if(Number.isNaN(s))throw new Error(`Invalid pkt-line length: ${n}`);if(s===0){e.push({type:"flush"}),t+=4;continue}if(s===1){e.push({type:"delim"}),t+=4;continue}if(s===2){e.push({type:"response-end"}),t+=4;continue}if(s<4)throw new Error(`Invalid pkt-line length: ${s}`);if(t+s>r.byteLength)throw new Error(`Truncated pkt-line: need ${s} bytes at offset ${t}, have ${r.byteLength-t}`);e.push({type:"data",data:r.subarray(t+4,t+s)}),t+=s}return e}function at(r){if(r.type!=="data")return"";let e=pr.decode(r.data);return e.endsWith(`
9
- `)?e.slice(0,-1):e}var Ne=65515;function Me(r,e,t){let n=[],s=[...e];t&&s.push(`symref=HEAD:${t}`),s.push("agent=just-git/1.0");let a=s.join(" ");if(r.length===0)n.push(E(`0000000000000000000000000000000000000000 capabilities^{}\0${a}
10
- `));else for(let o=0;o<r.length;o++){let i=r[o];o===0?n.push(E(`${i.hash} ${i.name}\0${a}
11
- `)):n.push(E(`${i.hash} ${i.name}
12
- `))}return n.push(H()),C(...n)}function dr(r,e,t,n){let s=C(E(`# service=${e}
13
- `),H()),a=Me(r,t,n),o=new Uint8Array(s.byteLength+a.byteLength);return o.set(s,0),o.set(a,s.byteLength),o}function ur(r){let e=st(r),t=[],n=[],s=[],a=[],o,i=!1;for(let f of e){if(f.type==="flush")continue;let c=at(f);if(c.startsWith("want ")){let l=c.slice(5);if(t.length===0){let p=l.indexOf(" ");p!==-1?(t.push(l.slice(0,p)),a=l.slice(p+1).split(" ").filter(Boolean)):t.push(l)}else t.push(l)}else c.startsWith("have ")?n.push(c.slice(5)):c.startsWith("shallow ")?s.push(c.slice(8)):c.startsWith("deepen ")?(o=parseInt(c.slice(7),10),Number.isNaN(o)&&(o=void 0)):c==="done"&&(i=!0)}return{wants:t,haves:n,capabilities:a,clientShallows:s,depth:o,done:i}}function be(r,e,t,n){let s=[];if(n){for(let a of n.shallow)s.push(E(`shallow ${a}
14
- `));for(let a of n.unshallow)s.push(E(`unshallow ${a}
15
- `));s.push(H())}if(t&&t.length>0){for(let o of t)s.push(E(`ACK ${o} common
16
- `));let a=t[t.length-1];s.push(E(`ACK ${a} ready
17
- `)),s.push(E(`ACK ${a}
18
- `))}else s.push(E(`NAK
19
- `));if(e){let a=0;for(;a<r.byteLength;){let o=Math.min(Ne,r.byteLength-a);s.push(ge(1,r.subarray(a,a+o))),a+=o}s.push(H())}else{let a=new Uint8Array(r.byteLength);a.set(r),s.push(a)}return C(...s)}function hr(r){let e=[];for(let t of r.shallow)e.push(E(`shallow ${t}
20
- `));for(let t of r.unshallow)e.push(E(`unshallow ${t}
21
- `));return e.push(H()),C(...e)}async function*yr(r,e,t,n){if(n){let a=[];for(let o of n.shallow)a.push(E(`shallow ${o}
22
- `));for(let o of n.unshallow)a.push(E(`unshallow ${o}
23
- `));a.push(H()),yield C(...a)}let s=[];if(t&&t.length>0){for(let o of t)s.push(E(`ACK ${o} common
24
- `));let a=t[t.length-1];s.push(E(`ACK ${a} ready
25
- `)),s.push(E(`ACK ${a}
26
- `))}else s.push(E(`NAK
27
- `));if(yield C(...s),e){for await(let a of r){let o=0;for(;o<a.byteLength;){let i=Math.min(Ne,a.byteLength-o);yield ge(1,a.subarray(o,o+i)),o+=i}}yield H()}else for await(let a of r)yield a}function mr(r){let e=new TextDecoder,t=[],n=[],s=0,a=!1;for(;s<r.byteLength&&!(s+4>r.byteLength);){let i=e.decode(r.subarray(s,s+4)),f=parseInt(i,16);if(Number.isNaN(f))break;if(f===0){a=!0,s+=4;break}if(f<4||s+f>r.byteLength)break;let c=r.subarray(s+4,s+f);s+=f;let l=c.indexOf(0),p;if(l!==-1)p=e.decode(c.subarray(0,l)),n=e.decode(c.subarray(l+1)).replace(/\n$/,"").split(" ").filter(Boolean);else{let h=e.decode(c);p=h.endsWith(`
28
- `)?h.slice(0,-1):h}let u=p.split(" ");u.length>=3&&t.push({oldHash:u[0],newHash:u[1],refName:u[2]})}let o=s<r.byteLength?r.subarray(s):new Uint8Array(0);return{commands:t,packData:o,capabilities:n,sawFlush:a}}function Q(r,e,t){let n=[];n.push(E(r?`unpack ok
7
+ `),n=t===-1?e:e.slice(0,t),s=t===-1?"":e.slice(t+2),a="",i="commit",o="",f;for(let c of n.split(`
8
+ `)){let l=c.indexOf(" ");if(l===-1)continue;let d=c.slice(0,l),u=c.slice(l+1);switch(d){case"object":a=u;break;case"type":i=u;break;case"tag":o=u;break;case"tagger":f=pe(u);break}}if(!a)throw new Error("Tag missing object field");if(!o)throw new Error("Tag missing tag name field");if(!f)throw new Error("Tag missing tagger field");return{type:"tag",object:a,objectType:i,name:o,tagger:f,message:s}}async function Me(r,e,t){let n=await r.objectStore.write(e,t);return r.hooks?.onObjectWrite?.({repo:r,type:e,hash:n}),n}async function z(r,e){return r.objectStore.read(e)}async function ye(r,e){return r.objectStore.exists(e)}var Us=new TextDecoder;async function V(r,e){let t=await z(r,e);if(t.type!=="commit")throw new Error(`Expected commit object for ${e}, got ${t.type}`);return he(t.content)}var hn=new TextEncoder,nr=new TextDecoder,yn=new Set(["100644","100755","040000","120000","160000"]);function mn(r){return r.length===4&&r.toLowerCase()===".git"}function bn(r,e){if(r.length===0)throw new Error("invalid tree entry: empty name");if(r.includes("/"))throw new Error(`invalid tree entry: name contains slash: '${r}'`);if(r.includes("\0"))throw new Error("invalid tree entry: name contains null byte");if(r==="."||r==="..")throw new Error(`invalid tree entry: '${r}'`);if(mn(r))throw new Error(`invalid tree entry: '${r}'`);if(!yn.has(e))throw new Error(`invalid tree entry mode: '${e}' for '${r}'`)}function me(r){let e=[],t=0;for(;t<r.byteLength;){let n=r.indexOf(32,t);if(n===-1)break;let s=nr.decode(r.subarray(t,n)),a=r.indexOf(0,n+1);if(a===-1)break;let i=nr.decode(r.subarray(n+1,a)),o=r.subarray(a+1,a+21),f=Ce(o),c=s.padStart(6,"0");bn(i,c),e.push({mode:c,name:i,hash:f}),t=a+21}return{type:"tree",entries:e}}function sr(r){let e=[];for(let a of r.entries){let i=a.mode.replace(/^0+/,""),o=hn.encode(`${i} ${a.name}\0`),f=fe(a.hash);e.push(o),e.push(f)}let t=e.reduce((a,i)=>a+i.byteLength,0),n=new Uint8Array(t),s=0;for(let a of e)n.set(a,s),s+=a.byteLength;return n}function ar(r){return typeof r=="string"?{type:"direct",hash:r}:r}var nt=".lock";var gn=[1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,5,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,4,4];function wn(r,e,t){let n=0,s=!1,a=e;for(;a<r.length;a++){let o=r.charCodeAt(a);switch(o<128?gn[o]:0){case 1:break;case 2:if(n===46)return{len:-1,starConsumed:s};n=o;continue;case 3:if(n===64)return{len:-1,starConsumed:s};n=o;continue;case 4:return{len:-1,starConsumed:s};case 5:if(!t)return{len:-1,starConsumed:s};s=!0,n=o;continue;default:n=o;continue}break}let i=a-e;return i===0?{len:0,starConsumed:s}:r.charCodeAt(e)===46?{len:-1,starConsumed:s}:i>=nt.length&&r.slice(a-nt.length,a)===nt?{len:-1,starConsumed:s}:{len:i,starConsumed:s}}function st(r,e=0){if(r==="@"||r.length===0)return!1;let t=0,n=0,s=!!(e&2);for(;t<=r.length;){let{len:a,starConsumed:i}=wn(r,t,s);if(a<0||a===0)return!1;i&&(s=!1),n++,t+=a+1}return!(r.charCodeAt(r.length-1)===46||!(e&1)&&n<2)}var Rn=10;async function xn(r,e){return r.refStore.readRef(e)}async function be(r,e){let t=e;for(let n=0;n<Rn;n++){let s=await xn(r,t);if(!s)return null;if(s.type==="direct")return s.hash;t=s.target}throw new Error(`Symbolic ref loop detected resolving "${e}"`)}function kn(r){let e=Math.abs(r),t=r<=0?"+":"-",n=String(Math.floor(e/60)).padStart(2,"0"),s=String(e%60).padStart(2,"0");return`${t}${n}${s}`}function ir(r){if("timestamp"in r)return r;let e=r.date??new Date;return{name:r.name,email:r.email,timestamp:Math.floor(e.getTime()/1e3),timezone:kn(e.getTimezoneOffset())}}async function cr(r,e){let t=e.branch?`refs/heads/${e.branch}`:null,n=t?await be(r,t):null,s=null;n&&(s=(await V(r,n)).tree);let a=[];for(let[u,h]of Object.entries(e.files))if(h===null)a.push({path:u,hash:null});else{let p=typeof h=="string"?new TextEncoder().encode(h):h,g=await Me(r,"blob",p);a.push({path:u,hash:g})}let i;s?i=await An(r,s,a):i=await it(r,null,at(a));let o=ir(e.author),f=e.committer?ir(e.committer):o,l=rr({type:"commit",tree:i,parents:n?[n]:[],author:o,committer:f,message:e.message});return{hash:await Me(r,"commit",l),parentHash:n}}async function An(r,e,t){return it(r,e,at(t))}function at(r){let e=new Map,t=new Map;for(let n of r){let s=n.path.indexOf("/");if(s===-1)e.set(n.path,{hash:n.hash,mode:n.mode??"100644"});else{let a=n.path.slice(0,s),i=n.path.slice(s+1),o=t.get(a);o||(o=[],t.set(a,o)),o.push({...n,path:i})}}return{files:e,dirs:t}}async function or(r,e){let t=await z(r,e);if(t.type!=="tree")throw new Error(`Expected tree object, got ${t.type}`);return me(t.content).entries}async function it(r,e,t){let n=new Map;if(e)for(let i of await or(r,e))n.set(i.name,i);for(let[i,{hash:o,mode:f}]of t.files)o===null?n.delete(i):n.set(i,{name:i,hash:o,mode:f});for(let[i,o]of t.dirs){let f=n.get(i),c=f?.mode==="040000"?f.hash:null,l=at(o),d=await it(r,c,l);(await or(r,d)).length===0?n.delete(i):n.set(i,{name:i,hash:d,mode:"040000"})}let s=[...n.values()].sort((i,o)=>{let f=i.mode==="040000"?`${i.name}/`:i.name,c=o.mode==="040000"?`${o.name}/`:o.name;return f<c?-1:f>c?1:0}),a=sr({type:"tree",entries:s});return Me(r,"tree",a)}async function ot(r,e,t){if(e===t)return!0;let n=new Set,s=[t],a=0;for(;a<s.length;){let i=s[a++];if(i===e)return!0;if(n.has(i))continue;n.add(i);let o;try{o=await V(r,i)}catch{continue}for(let f of o.parents)n.has(f)||s.push(f)}return!1}var $e=new Uint32Array([0,2874782929,1454598562,4260027763,104818581,2909197124,1351355959,4225088230,209637162,2804382715,1523426952,4053013081,172075199,2702711918,1559413021,4155209164,419274324,3013880453,1313798134,3843506983,516094401,3046853904,1215402083,3811058866,344150398,3218793903,1110456540,3916008461,314324715,3118826042,1141858121,4015451032,838548648,2594343033,1732793610,3423723995,935615293,2627596268,1635201695,3392046670,1032188802,2531018579,1798740512,3228511985,1002083351,2430804166,1829371317,3327150436,688300796,2187269677,2142620510,3572268943,792315241,2220913080,2039131339,3537049626,628649430,2384582919,1942684788,3633492133,591858243,2283716242,1978950625,3735934768,1677097296,3366964609,893718770,2652677155,1707679429,3465587220,863663975,2552480694,1871230586,3302032043,960225240,2455923465,1773654511,3270403390,1057273933,2489126044,2064377604,3495056341,767069862,2262907511,2100592785,3597481024,730327347,2162056674,2004166702,3693911295,566641036,2325738845,1900695483,3658742634,670639641,2359333576,1376601592,4183093545,79572058,2951190667,1412571757,4285241020,42027983,2849570590,1584630482,4113186307,146858864,2744735649,1481436487,4078262678,251626725,2779131956,1257298860,3785977725,474198542,3071936223,1288682553,3885369576,444388763,2972016970,1183716486,3990331479,272465188,3143944693,1085371155,3957901250,369236657,3176902240,1823819377,3354194592,973483987,2438961922,1787437540,3251868981,1010387014,2539715735,1623951707,3415358858,913891577,2636207144,1727327950,3450690079,809994092,2602447805,1950930981,3742461172,586920327,2309096790,1920450480,3643673441,616879634,2409456323,2016810767,3547309022,780500653,2245839484,2114547866,3578840139,683284792,2212736489,1565424345,4128755208,201134971,2695145386,1534139724,4029196701,230847726,2795225151,1362146803,4201185570,126082129,2899994752,1460654694,4233520823,29146052,2867138325,1169417357,4008333404,318803247,3092855294,1133282072,3906287561,356510394,3194379883,1238182823,3801390966,528368133,3022517972,1341279282,3836475619,423699856,2987954497,256065313,2753203184,1508923011,4071219794,159144116,2720394341,1607414038,4103505351,54390795,2825143514,1435408809,4275514744,84055966,2925208399,1404173884,4175973101,398369141,3169260964,1091422423,3931405318,293717728,3134747185,1194504002,3966442387,465595999,2962872974,1299384317,3861558060,503253450,3064380699,1263296616,3759527097,1052246921,2514597720,1745578539,3276988154,948397084,2480853197,1848905150,3312302447,851889315,2577365106,1685431553,3475771856,888777526,2678071271,1649066644,3373495877,642096605,2367432972,1895232639,3685695662,544930376,2334346905,1992922090,3717211963,708530935,2170742310,2089302869,3620835204,738473314,2271052211,2058837184,3522095121]),En=new Uint32Array([0,2125799437,1446245579,679924934,121527623,2039184714,1359849868,800622977,243055246,1892260483,1481592389,653946440,155379657,2012727236,1601245954,566506255,486110492,1649169681,1254785495,880779738,466036827,1701972054,1307892880,859962525,310759314,1815146399,1152793433,973282132,364614357,1796125400,1133012510,1027425811,972220984,1195887157,1874927347,292830974,1053603711,1081710450,1761559476,373973945,932073654,1228632251,1639818365,520651888,816844273,1308962300,1719925050,406247735,621518628,1539227433,1933077487,227363810,573948515,1551950446,1946564264,179508901,729228714,1438778791,2101662049,66187628,743012589,1392269536,2054851622,80718891,1944441968,223409277,634790075,1533214902,1960544567,175024442,585661948,1549622769,2107207422,53235443,732600885,1428142648,2057778105,68293556,747947890,1377953663,1864147308,296321377,959403431,1201305002,1747123243,379051046,1041303776,1084500205,1633688546,534068207,928247593,1239863076,1717454501,418080424,812495470,1322816099,1243037256,883039813,472173187,1653729934,1294557967,865878786,454727620,1706014665,1147897030,987669707,307785741,1827491840,1129699713,1038154124,359017802,1808993607,1458457428,677079897,14532511,2120785810,1372591635,795162142,132375256,2035729109,1486025178,640143831,245433617,1880368412,1605151901,555322512,161437782,1999272027,1284643889,841432124,446818554,1679083767,1269580150,890855803,497006013,1663735216,1122936511,1012631218,350048884,1785229945,1171323896,996531189,333647667,1834364734,1349216557,786319648,106470886,2028846571,1465201770,702551143,23511201,2144592044,1578619811,547550126,136587112,1989216101,1495895780,664579817,253393455,1907317282,1969288713,198563332,592642754,1575363279,1918806862,216763203,611147653,1524137864,2065452167,94989450,758102092,1402640449,2082607552,43463117,705815819,1420084486,1771668245,388801304,1068136414,1092573139,1856495186,269680223,949234329,1176570516,1743075739,424679830,836160848,1331948893,1624990940,510543057,921210903,1214099482,1064814657,1103292492,1766079626,401677447,944346374,1190966539,1853514189,282018240,822833871,1337873090,1731757572,428713481,909455240,1216352133,1611062083,515111758,596557149,1564187984,1975339414,185100699,615571482,1510326295,1921193169,204879068,770836435,1397172190,2076308248,91542293,718035604,1417247385,2097131103,38440530,109388409,2016412276,1354159794,772011711,29065022,2131648307,1468566517,691907576,150575351,1984739578,1590324284,545213489,264750512,1903355325,1509175675,658575734,444356453,1690924904,1280287662,855278499,490867234,1677142575,1265762025,902094564,335605227,1790299622,1110645024,1015429421,322875564,1837863073,1158497383,1001940074]),Fe=64,Pn=4,ct=4096,fr=65536,On=127;function Sn(r){let e=r.byteLength;if(e===0)return null;let t=(e-1)/16|0;if(t===0)return null;let n=t>>>2;n<16&&(n=16),n=jn(n);let s=n-1,a=new Uint32Array(n),i=[],o=-1>>>0;for(let u=t*16-16;u>=0;u-=16){let h=0;for(let p=1;p<=16;p++)h=(h<<8|r[u+p])^$e[h>>>23];if(h=h>>>0,h===o)i[i.length-1].ptr=u+16;else{o=h;let p=h&s;i.push({ptr:u+16,val:h}),a[p]++}}let f=new Map;for(let u of i){let h=u.val&s,p=f.get(h);p||(p=[],f.set(h,p)),p.push(u)}for(let[u,h]of f){if(h.length<=Fe)continue;let p=[],g=h.length/Fe;for(let R=0;R<Fe;R++)p.push(h[Math.floor(R*g)]);f.set(u,p),a[u]=Fe}let c=new Uint32Array(n+1),l=[],d=0;for(let u=0;u<n;u++){c[u]=d;let h=f.get(u);if(h){for(let p of h)l.push(p);d+=h.length}}return c[n]=d,{src:r,hashMask:s,buckets:c,entries:l}}function vn(r,e,t){if(!r||e.byteLength===0)return null;let n=r.src.byteLength,s=e.byteLength,a=r.src,i=new Uint8Array(Math.max(s,1024)),o=0;function f(g){for(;o+g>i.length;){let R=new Uint8Array(i.length*2);R.set(i),i=R}}o=dr(i,o,n),o=dr(i,o,s),f(18),o++;let c=0,l=0,d=Math.min(16,s);for(let g=0;g<d;g++)i[o++]=e[g],c=(c<<8|e[g])^$e[c>>>23],l++;c=c>>>0;let u=d,h=0,p=0;for(;u<s;){if(p<ct){c^=En[e[u-16]],c=((c<<8|e[u])^$e[c>>>23])>>>0;let g=c&r.hashMask,R=r.buckets[g],P=r.buckets[g+1];for(let A=R;A<P;A++){let x=r.entries[A];if(x.val!==c)continue;let m=x.ptr,b=a.byteLength-m,y=s-u;if(b>y&&(b=y),b<=p)break;let w=0;for(;w<b&&a[m+w]===e[u+w];)w++;if(w>p&&(p=w,h=m,p>=ct))break}}if(p<Pn)f(2),l===0&&o++,i[o++]=e[u++],l++,l===On&&(i[o-l-1]=l,l=0),p=0;else{if(l>0){for(;h>0&&a[h-1]===e[u-1];)if(p++,h--,u--,o--,!(--l>0)){o--,l=-1;break}l>0&&(i[o-l-1]=l),l=0}let g=p>fr?p-fr:0;p-=g,f(8);let R=o++,P=128;if(h&255&&(i[o++]=h&255,P|=1),h&65280&&(i[o++]=h>>>8&255,P|=2),h&16711680&&(i[o++]=h>>>16&255,P|=4),h&4278190080&&(i[o++]=h>>>24&255,P|=8),p&255&&(i[o++]=p&255,P|=16),p&65280&&(i[o++]=p>>>8&255,P|=32),i[R]=P,u+=p,h+=p,p=g,h>4294967295&&(p=0),p<ct){c=0;for(let A=-16;A<0;A++)c=(c<<8|e[u+A])^$e[c>>>23];c=c>>>0}}if(t&&o>t)return null}return l>0&&(i[o-l-1]=l),t&&o>t?null:i.subarray(0,o)}var lr={blob:0,tree:1,commit:2,tag:3};function ur(r,e){let t=e?.window??10,n=e?.depth??50,s=r.slice().sort((c,l)=>{let d=lr[c.type]??99,u=lr[l.type]??99;return d!==u?d-u:l.content.byteLength-c.content.byteLength}),a=new Map,i=[],o=[],f=[];for(let c=0;c<s.length;c++){let l=s[c],d={hash:l.hash,type:l.type,content:l.content,depth:0},u=null,h=null,p=Math.max(0,c-t);for(let g=c-1;g>=p;g--){let R=s[g];if(R.type!==l.type||(a.get(R.hash)?.depth??0)>=n||l.content.byteLength<R.content.byteLength>>>5)continue;let x=o[g-p]??null;if(!x)continue;let m=u?u.byteLength:l.content.byteLength/2|0;if(m<16)continue;let b=vn(x,l.content,m);b&&(!u||b.byteLength<u.byteLength)&&(u=b,h=R.hash)}if(u&&h){d.delta=u,d.deltaBase=h;let g=a.get(h);d.depth=(g?.depth??0)+1}a.set(l.hash,d),i.push(d),o.length>=t&&(o.shift(),f.shift()),o.push(Sn(l.content)),f.push(l.hash)}return i}function jn(r){let e=r;return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e++,e<16?16:e}function dr(r,e,t){let n=t;do{let s=n&127;n>>>=7,n>0&&(s|=128),r[e++]=s}while(n>0);return e}var In=2147483647;async function ft(r,e,t,n){if(t>=In)return{shallow:[],unshallow:[...n]};let s=new Map,a=[];for(let c of e)!s.has(c)&&await ye(r,c)&&(s.set(c,1),a.push({hash:c,level:1}));let i=new Set,o=0;for(;o<a.length;){let{hash:c,level:l}=a[o++];if(l>=t){i.add(c);continue}let d;try{d=await V(r,c)}catch{continue}for(let u of d.parents)!s.has(u)&&await ye(r,u)&&(s.set(u,l+1),a.push({hash:u,level:l+1}))}let f=[];for(let c of n){let l=s.get(c);l!==void 0&&l<t&&f.push(c)}return{shallow:[...i],unshallow:f}}async function Re(r,e,t,n,s){let a=s??n,i=new Set;for(let l of t)await ge(r,l,i,a);let o=[...e];if(s&&n)for(let l of s)try{let d=await V(r,l);for(let u of d.parents)i.has(u)||o.push(u)}catch{}let f=[],c=new Set;for(let l of o)await we(r,l,i,c,f,n);return{count:f.length,objects:Tn(f)}}async function pr(r,e,t,n,s){let{count:a,objects:i}=await Re(r,e,t,n,s);return{count:a,objects:Un(r,i)}}async function*Tn(r){for(let e of r)yield e}async function*Un(r,e){for await(let t of e){let n=await z(r,t.hash);yield{hash:t.hash,type:t.type,content:n.content}}}async function hr(r){let e=[];for await(let t of r.objects)e.push(t);return e}async function ge(r,e,t,n){if(t.has(e)||(t.add(e),!await ye(r,e)))return;let s=await z(r,e);switch(s.type){case"commit":{let a=he(s.content);if(await ge(r,a.tree,t,n),!n?.has(e))for(let i of a.parents)await ge(r,i,t,n);break}case"tree":{let a=me(s.content);for(let i of a.entries)await ge(r,i.hash,t,n);break}case"tag":{let a=ee(s.content);await ge(r,a.object,t,n);break}case"blob":break}}async function we(r,e,t,n,s,a){if(n.has(e)||t.has(e))return;n.add(e);let i=await z(r,e);switch(s.push({hash:e,type:i.type}),i.type){case"commit":{let o=he(i.content);if(await we(r,o.tree,t,n,s,a),!a?.has(e))for(let f of o.parents)await we(r,f,t,n,s,a);break}case"tree":{let o=me(i.content);for(let f of o.entries)await we(r,f.hash,t,n,s,a);break}case"tag":{let o=ee(i.content);await we(r,o.object,t,n,s,a);break}case"blob":break}}var Ln=new TextEncoder,mr=new TextDecoder,yr=65520,Cn=new Uint8Array([48,48,48,48]),Hn=new Uint8Array([48,48,48,49]),ea=new Uint8Array([48,48,48,50]);function k(r){let e=typeof r=="string"?Ln.encode(r):r,t=4+e.byteLength;if(t>yr)throw new Error(`pkt-line too long: ${t} bytes (max ${yr})`);let n=t.toString(16).padStart(4,"0"),s=new Uint8Array(t);return s[0]=n.charCodeAt(0),s[1]=n.charCodeAt(1),s[2]=n.charCodeAt(2),s[3]=n.charCodeAt(3),s.set(e,4),s}function _(){return Cn.slice()}function K(){return Hn.slice()}function B(...r){let e=0;for(let s of r)e+=s.byteLength;let t=new Uint8Array(e),n=0;for(let s of r)t.set(s,n),n+=s.byteLength;return t}function lt(r){let e=[],t=0;for(;t<r.byteLength;){if(t+4>r.byteLength)throw new Error("Truncated pkt-line header");let n=mr.decode(r.subarray(t,t+4)),s=parseInt(n,16);if(Number.isNaN(s))throw new Error(`Invalid pkt-line length: ${n}`);if(s===0){e.push({type:"flush"}),t+=4;continue}if(s===1){e.push({type:"delim"}),t+=4;continue}if(s===2){e.push({type:"response-end"}),t+=4;continue}if(s<4)throw new Error(`Invalid pkt-line length: ${s}`);if(t+s>r.byteLength)throw new Error(`Truncated pkt-line: need ${s} bytes at offset ${t}, have ${r.byteLength-t}`);e.push({type:"data",data:r.subarray(t+4,t+s)}),t+=s}return e}function dt(r){if(r.type!=="data")return"";let e=mr.decode(r.data);return e.endsWith(`
9
+ `)?e.slice(0,-1):e}var We=65515;function Ge(r,e,t){let n=[],s=[...e];t&&s.push(`symref=HEAD:${t}`),s.push("agent=just-git/1.0");let a=s.join(" ");if(r.length===0)n.push(k(`0000000000000000000000000000000000000000 capabilities^{}\0${a}
10
+ `));else for(let i=0;i<r.length;i++){let o=r[i];i===0?n.push(k(`${o.hash} ${o.name}\0${a}
11
+ `)):n.push(k(`${o.hash} ${o.name}
12
+ `))}return n.push(_()),B(...n)}function br(r,e,t,n){let s=B(k(`# service=${e}
13
+ `),_()),a=Ge(r,t,n),i=new Uint8Array(s.byteLength+a.byteLength);return i.set(s,0),i.set(a,s.byteLength),i}function gr(r){let e=lt(r),t=[],n=[],s=[],a=[],i,o=!1;for(let f of e){if(f.type==="flush")continue;let c=dt(f);if(c.startsWith("want ")){let l=c.slice(5);if(t.length===0){let d=l.indexOf(" ");d!==-1?(t.push(l.slice(0,d)),a=l.slice(d+1).split(" ").filter(Boolean)):t.push(l)}else t.push(l)}else c.startsWith("have ")?n.push(c.slice(5)):c.startsWith("shallow ")?s.push(c.slice(8)):c.startsWith("deepen ")?(i=parseInt(c.slice(7),10),Number.isNaN(i)&&(i=void 0)):c==="done"&&(o=!0)}return{wants:t,haves:n,capabilities:a,clientShallows:s,depth:i,done:o}}function xe(r,e,t,n){let s=[];if(n){for(let a of n.shallow)s.push(k(`shallow ${a}
14
+ `));for(let a of n.unshallow)s.push(k(`unshallow ${a}
15
+ `));s.push(_())}if(t&&t.length>0){for(let i of t)s.push(k(`ACK ${i} common
16
+ `));let a=t[t.length-1];s.push(k(`ACK ${a} ready
17
+ `)),s.push(k(`ACK ${a}
18
+ `))}else s.push(k(`NAK
19
+ `));if(e){let a=0;for(;a<r.byteLength;){let i=Math.min(We,r.byteLength-a);s.push(ke(1,r.subarray(a,a+i))),a+=i}s.push(_())}else{let a=new Uint8Array(r.byteLength);a.set(r),s.push(a)}return B(...s)}function wr(r){let e=[];for(let t of r.shallow)e.push(k(`shallow ${t}
20
+ `));for(let t of r.unshallow)e.push(k(`unshallow ${t}
21
+ `));return e.push(_()),B(...e)}async function*Rr(r,e,t,n){if(n){let a=[];for(let i of n.shallow)a.push(k(`shallow ${i}
22
+ `));for(let i of n.unshallow)a.push(k(`unshallow ${i}
23
+ `));a.push(_()),yield B(...a)}let s=[];if(t&&t.length>0){for(let i of t)s.push(k(`ACK ${i} common
24
+ `));let a=t[t.length-1];s.push(k(`ACK ${a} ready
25
+ `)),s.push(k(`ACK ${a}
26
+ `))}else s.push(k(`NAK
27
+ `));if(yield B(...s),e){for await(let a of r){let i=0;for(;i<a.byteLength;){let o=Math.min(We,a.byteLength-i);yield ke(1,a.subarray(i,i+o)),i+=o}}yield _()}else for await(let a of r)yield a}function xr(r){let e=new TextDecoder,t=[],n=[],s=0,a=!1;for(;s<r.byteLength&&!(s+4>r.byteLength);){let o=e.decode(r.subarray(s,s+4)),f=parseInt(o,16);if(Number.isNaN(f))break;if(f===0){a=!0,s+=4;break}if(f<4||s+f>r.byteLength)break;let c=r.subarray(s+4,s+f);s+=f;let l=c.indexOf(0),d;if(l!==-1)d=e.decode(c.subarray(0,l)),n=e.decode(c.subarray(l+1)).replace(/\n$/,"").split(" ").filter(Boolean);else{let h=e.decode(c);d=h.endsWith(`
28
+ `)?h.slice(0,-1):h}let u=d.split(" ");u.length>=3&&t.push({oldHash:u[0],newHash:u[1],refName:u[2]})}let i=s<r.byteLength?r.subarray(s):new Uint8Array(0);return{commands:t,packData:i,capabilities:n,sawFlush:a}}function te(r,e,t){let n=[];n.push(k(r?`unpack ok
29
29
  `:`unpack error
30
- `));for(let a of e)a.ok?n.push(E(`ok ${a.name}
31
- `)):n.push(E(`ng ${a.name} ${a.error??"failed"}
32
- `));n.push(H());let s=C(...n);if(t){let a=[];return a.push(ge(1,s)),a.push(H()),C(...a)}return s}function ge(r,e){let t=new Uint8Array(1+e.byteLength);return t[0]=r,t.set(e,1),E(t)}function it(r){let e=[];e.push(E(`version 2
33
- `));for(let t of r)e.push(E(`${t}
34
- `));return e.push(H()),C(...e)}function ot(r){let e=st(r),t="",n=[],s=[],a=!1;for(let o of e){if(o.type==="flush"||o.type==="response-end")break;if(o.type==="delim"){a=!0;continue}let i=at(o);i&&(a?s.push(i):i.startsWith("command=")?t=i.slice(8):n.push(i))}return{command:t,capabilities:n,args:s}}function ct(r){let e=[];for(let t of r){let n=`${t.hash} ${t.name}`;t.symrefTarget&&(n+=` symref-target:${t.symrefTarget}`),t.peeledHash&&(n+=` peeled:${t.peeledHash}`),e.push(E(`${n}
35
- `))}return e.push(H()),C(...e)}function ft(r){let e=[],t=[],n=[],s=[],a=!1,o,i=!1,f=!1;for(let c of r)c.startsWith("want ")?e.push(c.slice(5)):c.startsWith("have ")?t.push(c.slice(5)):c.startsWith("shallow ")?n.push(c.slice(8)):c.startsWith("deepen ")?(o=parseInt(c.slice(7),10),Number.isNaN(o)&&(o=void 0)):c.startsWith("want-ref ")?s.push(c.slice(9)):c==="done"?a=!0:c==="include-tag"?i=!0:c==="ofs-delta"&&(f=!0);return{wants:e,haves:t,done:a,clientShallows:n,depth:o,includeTag:i,ofsDeltas:f,wantRefs:s}}function ee(r,e){let t=[],{commonHashes:n,shallowInfo:s,wantedRefs:a}=e??{};if(n&&n.length>0){t.push(E(`acknowledgments
36
- `));for(let i of n)t.push(E(`ACK ${i}
37
- `));t.push(E(`ready
38
- `)),t.push(V())}if(s&&(s.shallow.length>0||s.unshallow.length>0)){t.push(E(`shallow-info
39
- `));for(let i of s.shallow)t.push(E(`shallow ${i}
40
- `));for(let i of s.unshallow)t.push(E(`unshallow ${i}
41
- `));t.push(V())}if(a&&a.length>0){t.push(E(`wanted-refs
42
- `));for(let i of a)t.push(E(`${i.hash} ${i.name}
43
- `));t.push(V())}t.push(E(`packfile
44
- `));let o=0;for(;o<r.byteLength;){let i=Math.min(Ne,r.byteLength-o);t.push(ge(1,r.subarray(o,o+i))),o+=i}return t.push(H()),C(...t)}function br(r,e){let t=[];if(t.push(E(`acknowledgments
45
- `)),r.length>0)for(let n of r)t.push(E(`ACK ${n}
46
- `));else t.push(E(`NAK
47
- `));return e&&t.push(E(`ready
48
- `)),t.push(H()),C(...t)}async function*gr(r,e){let{commonHashes:t,shallowInfo:n,wantedRefs:s}=e??{};if(t&&t.length>0){let a=[];a.push(E(`acknowledgments
49
- `));for(let o of t)a.push(E(`ACK ${o}
50
- `));a.push(E(`ready
51
- `)),a.push(V()),yield C(...a)}if(n&&(n.shallow.length>0||n.unshallow.length>0)){let a=[];a.push(E(`shallow-info
52
- `));for(let o of n.shallow)a.push(E(`shallow ${o}
53
- `));for(let o of n.unshallow)a.push(E(`unshallow ${o}
54
- `));a.push(V()),yield C(...a)}if(s&&s.length>0){let a=[];a.push(E(`wanted-refs
55
- `));for(let o of s)a.push(E(`${o.hash} ${o.name}
56
- `));a.push(V()),yield C(...a)}yield E(`packfile
57
- `);for await(let a of r){let o=0;for(;o<a.byteLength;){let i=Math.min(Ne,a.byteLength-o);yield ge(1,a.subarray(o,o+i)),o+=i}}yield H()}var te=class{entries=new Map;currentBytes=0;maxBytes;hits=0;misses=0;constructor(e=256*1024*1024){this.maxBytes=e}static key(e,t,n){if(n.length>0)return null;let s=t.slice().sort();return`${e}\0${s.join(",")}`}get(e){let t=this.entries.get(e);return t?this.hits++:this.misses++,t}set(e,t){if(this.entries.has(e))return;let n=t.packData.byteLength;if(!(n>this.maxBytes)){for(;this.currentBytes+n>this.maxBytes&&this.entries.size>0;){let s=this.entries.keys().next().value;this.currentBytes-=this.entries.get(s).packData.byteLength,this.entries.delete(s)}this.entries.set(e,t),this.currentBytes+=n}}clear(){this.entries.clear(),this.currentBytes=0}get stats(){return{entries:this.entries.size,bytes:this.currentBytes,hits:this.hits,misses:this.misses}}},wr=["multi_ack_detailed","no-done","side-band-64k","ofs-delta","include-tag","allow-reachable-sha1-in-want","shallow"],Rr=["report-status","side-band-64k","ofs-delta","delete-refs"];async function xr(r){let e=await r.refStore.listRefs("refs"),t=await r.refStore.readRef("HEAD"),n=[],s=null,a;if(t)if(t.type==="symbolic"){a=t.target;let i=await r.refStore.readRef(t.target);i?.type==="direct"&&(s=i.hash)}else s=t.hash;let o=e.slice().sort((i,f)=>i.name<f.name?-1:i.name>f.name?1:0);if(!s&&o.length>0){let i=In(o);i&&(s=i.hash,a=i.name)}s&&n.push({name:"HEAD",hash:s});for(let i of o)if(n.push({name:i.name,hash:i.hash}),i.name.startsWith("refs/tags/"))try{let f=await r.objectStore.read(i.hash);if(f.type==="tag"){let c=J(f.content);n.push({name:`${i.name}^{}`,hash:c.object})}}catch{}return{refs:n,headTarget:a}}var jn=["refs/heads/main","refs/heads/master"];function In(r){for(let t of jn){let n=r.find(s=>s.name===t);if(n)return n}return r.find(t=>t.name.startsWith("refs/heads/"))??null}function lt(r,e,t){return dr(r,e,e==="git-upload-pack"?wr:Rr,t)}function pt(r,e,t){return Me(r,e==="git-upload-pack"?wr:Rr,t)}async function G(r,e,t,n,s){let{refs:a,headTarget:o}=await xr(r),i=a;if(n?.advertiseRefs){let f=await n.advertiseRefs({repo:r,repoId:e,refs:a,service:t,auth:s});if(L(f))return f;f&&(i=f)}return{refs:i,headTarget:o}}async function we(r,e,t){let{wants:n,haves:s,capabilities:a,clientShallows:o,depth:i,done:f}=ur(e);if(n.length===0)return be(new Uint8Array(0),!1);let c=a.includes("multi_ack_detailed"),l=a.includes("side-band-64k"),p,u,h;if(o.length>0&&(h=new Set(o)),i!==void 0){let m=await nt(r,n,i,h??new Set);p=m,u=new Set(m.shallow)}if(p&&!f)return hr(p);let d;if(c&&s.length>0){d=[];for(let m of s)await r.objectStore.exists(m)&&d.push(m);d.length===0&&(d=void 0)}let b=!u&&t?.cache&&t.cacheKey?te.key(t.cacheKey,n,s):null;if(b&&t?.cache){let m=t.cache.get(b);if(m)return be(m.packData,l,d)}let R=a.includes("include-tag"),A={repo:r,wants:n,haves:s,includeTag:R,shallowBoundary:u,clientShallowBoundary:h,cache:t?.cache,cacheKey:b,deltaWindow:t?.deltaWindow};if(t?.noDelta){let m=await Ar(A);if(!m){let{data:k}=await Z([]);return be(k,l,d,p)}return Or(yr(m,l,d,p))}let y=await kr(A);return be(y,l,d,p)}async function Er(r,e){let t=[],n=await r.refStore.listRefs("refs/tags");for(let s of n)if(!e.has(s.hash))try{let a=await r.objectStore.read(s.hash);if(a.type==="tag"){let o=J(a.content);e.has(o.object)&&(t.push({hash:s.hash,type:"tag",content:a.content}),e.add(s.hash))}}catch{}return t}async function kr(r){let{repo:e,wants:t,haves:n,includeTag:s,shallowBoundary:a,clientShallowBoundary:o}=r,i=await cr(e,t,n,a,o);if(i.count===0){let{data:d}=await Z([]);return d}let f=await fr(i),c=new Set(f.map(d=>d.hash));if(s){let d=await Er(e,c);f.push(...d)}let l=r.deltaWindow?{window:r.deltaWindow}:void 0,p=or(f,l),u=p.map(d=>({hash:d.hash,type:d.type,content:d.content,delta:d.delta,deltaBaseHash:d.deltaBase})),{data:h}=await Z(u);if(r.cacheKey&&r.cache){let d=p.filter(b=>b.delta).length;r.cache.set(r.cacheKey,{packData:h,objectCount:f.length,deltaCount:d})}return h}async function Ar(r){let{repo:e,wants:t,haves:n,includeTag:s,shallowBoundary:a,clientShallowBoundary:o}=r,{count:i,objects:f}=await me(e,t,n,a,o);if(i===0)return null;let c=[];for await(let d of f)c.push(d);let l=new Set(c.map(d=>d.hash)),p=s?await Er(e,l):[],u=c.length+p.length;async function*h(){for(let d of c){let b=await e.objectStore.read(d.hash);yield{type:b.type,content:b.content}}for(let d of p)yield{type:d.type,content:d.content}}return Xt(u,h())}function Or(r){let e=r[Symbol.asyncIterator]();return new ReadableStream({async pull(t){let{value:n,done:s}=await e.next();s?t.close():t.enqueue(n)}})}async function dt(r,e){let{commands:t,packData:n,capabilities:s,sawFlush:a}=mr(e),o=!0;if(n.byteLength>0)try{await r.objectStore.ingestPack(n)}catch{o=!1}return{updates:await Pr(r,t,o),unpackOk:o,capabilities:s,sawFlush:a}}async function ut(r,e,t,n,s=!0){let a=!0;if(e.some(f=>f.newHash!==ne))try{let c=Kt(n,async l=>{try{return await r.objectStore.read(l)}catch{return null}});await r.objectStore.ingestPackStream(c)}catch{a=!1}return{updates:await Pr(r,e,a),unpackOk:a,capabilities:t,sawFlush:s}}async function Pr(r,e,t){let n=[];for(let s of e){let a=s.oldHash===ne,o=s.newHash===ne,i=!1;if(!a&&!o&&t)try{i=await tt(r,s.oldHash,s.newHash)}catch{}n.push({ref:s.refName,oldHash:a?null:s.oldHash,newHash:s.newHash,isFF:i,isCreate:a,isDelete:o})}return n}async function Be(r,e){let t=[],n=[];for(let s of e){if(s.ref==="HEAD"){t.push({ref:s.ref,ok:!1,error:"HEAD cannot be updated via push"});continue}if(!s.isDelete&&!Je(s.ref)){t.push({ref:s.ref,ok:!1,error:"invalid refname"});continue}if(!s.isDelete&&!await r.objectStore.exists(s.newHash)){t.push({ref:s.ref,ok:!1,error:"missing objects"});continue}try{let a=s.isCreate?null:s.oldHash,o=s.isDelete?null:{type:"direct",hash:s.newHash};if(!await r.refStore.compareAndSwapRef(s.ref,a,o)){t.push({ref:s.ref,ok:!1,error:"failed to lock"});continue}t.push({ref:s.ref,ok:!0}),n.push(s)}catch(a){t.push({ref:s.ref,ok:!1,error:a instanceof Error?a.message:String(a)})}}return{refResults:t,applied:n}}async function Re(r){let{repo:e,repoId:t,ingestResult:n,hooks:s,auth:a}=r,{updates:o}=n;if(s?.preReceive){let c=await s.preReceive({repo:e,repoId:t,updates:o,auth:a});if(L(c)){let l=c.message??"pre-receive hook declined";return{refResults:o.map(p=>({ref:p.ref,ok:!1,error:l})),applied:[]}}}let i=[],f=[];for(let c of o){if(c.ref==="HEAD"){i.push({ref:c.ref,ok:!1,error:"HEAD cannot be updated via push"});continue}if(!c.isDelete&&!Je(c.ref)){i.push({ref:c.ref,ok:!1,error:"invalid refname"});continue}if(s?.update){let l=await s.update({repo:e,repoId:t,update:c,auth:a});if(L(l)){i.push({ref:c.ref,ok:!1,error:l.message??"update hook declined"});continue}}if(!c.isDelete&&!await e.objectStore.exists(c.newHash)){i.push({ref:c.ref,ok:!1,error:"missing objects"});continue}try{let l=c.isCreate?null:c.oldHash,p=c.isDelete?null:{type:"direct",hash:c.newHash};if(!await e.refStore.compareAndSwapRef(c.ref,l,p)){i.push({ref:c.ref,ok:!1,error:"failed to lock"});continue}i.push({ref:c.ref,ok:!0}),f.push(c)}catch(l){i.push({ref:c.ref,ok:!1,error:l instanceof Error?l.message:String(l)})}}if(s?.postReceive&&f.length>0)try{await s.postReceive({repo:e,repoId:t,updates:f,auth:a})}catch{}return{refResults:i,applied:f}}async function $e(r,e){let t=[];for(let n of e){let s;n.oldHash!==void 0?s=n.oldHash:s=await ue(r,n.ref);let a=s===null,o=n.newHash===null,i=n.newHash??ne,f=!1;if(!a&&!o)try{f=await tt(r,s,i)}catch{}t.push({ref:n.ref,oldHash:s,newHash:i,isFF:f,isCreate:a,isDelete:o})}return t}var Tn=["agent=just-git/1.0","ls-refs=unborn","fetch=shallow","server-option","object-format=sha1"];function xe(){return it(Tn)}async function Ee(r,e,t,n,s){let a=t.includes("symrefs"),o=t.includes("peel"),i=t.includes("unborn"),f=t.filter(h=>h.startsWith("ref-prefix ")).map(h=>h.slice(11)),c=await G(r,e,"git-upload-pack",n,s);if(L(c))return c;let{refs:l,headTarget:p}=c,u=[];for(let h of l){if(h.name.endsWith("^{}")||f.length>0&&!f.some(b=>h.name.startsWith(b)))continue;let d={hash:h.hash,name:h.name};if(a&&h.name==="HEAD"&&p&&(d.symrefTarget=p),o&&h.name.startsWith("refs/tags/")){let b=l.find(R=>R.name===`${h.name}^{}`);b&&(d.peeledHash=b.hash)}u.push(d)}return i&&!u.some(h=>h.name==="HEAD")&&p&&(f.length===0||f.some(d=>"HEAD".startsWith(d)))&&u.unshift({hash:"unborn",name:"HEAD",symrefTarget:p}),ct(u)}async function ke(r,e,t){let{wants:n,haves:s,done:a,clientShallows:o,depth:i,includeTag:f,wantRefs:c}=ft(e);if(n.length===0&&c.length===0){let{data:w}=await Z([]);return ee(w)}let l=[],p=[...n];for(let w of c){let g=await ue(r,w);g&&(l.push({hash:g,name:w}),p.includes(g)||p.push(g))}let u,h,d;if(o.length>0&&(d=new Set(o)),i!==void 0){let w=await nt(r,p,i,d??new Set);u=w,h=new Set(w.shallow)}let b;if(s.length>0){b=[];for(let w of s)await r.objectStore.exists(w)&&b.push(w);b.length===0&&(b=void 0)}let R=b&&b.length>0;if(!a&&!R)return br(b??[]);let A=!h&&t?.cache&&t.cacheKey?te.key(t.cacheKey,p,s):null,y={commonHashes:b,shallowInfo:u,wantedRefs:l.length>0?l:void 0};if(A&&t?.cache){let w=t.cache.get(A);if(w)return ee(w.packData,y)}let m={repo:r,wants:p,haves:s,includeTag:f,shallowBoundary:h,clientShallowBoundary:d,cache:t?.cache,cacheKey:A,deltaWindow:t?.deltaWindow};if(t?.noDelta){let w=await Ar(m);if(!w){let{data:g}=await Z([]);return ee(g,y)}return Or(gr(w,y))}let k=await kr(m);return ee(k,y)}function Un(r){let e=/--protocol=version=2/.test(r),n=r.replace(/\s*--protocol=version=\d+/g,"").match(/^git[\s-](upload-pack|receive-pack)\s+'?([^']+?)'?\s*$/);if(!n)return null;let s=`git-${n[1]}`,a=n[2];return a.startsWith("/")&&(a=a.slice(1)),e?{service:s,repoPath:a,protocolV2:e}:{service:s,repoPath:a}}var Ln=new TextEncoder;async function Sr(r,e,t){let{resolveRepo:n,hooks:s,packCache:a,packOptions:o,auth:i}=t,f=e.writable.getWriter();try{let c=Un(r);if(!c)return Ae(e,`fatal: unrecognized command '${r}'
58
- `),128;let{service:l,repoPath:p}=c,u=await n(p);if(!u)return Ae(e,`fatal: '${p}' does not appear to be a git repository
59
- `),128;let{repo:h,repoId:d}=u;if(c.protocolV2&&l==="git-upload-pack"){let A=await G(h,d,l,s,i);if(L(A))return Ae(e,`fatal: ${A.message??"access denied"}
60
- `),128;await f.write(xe());let y=new Fe(e.readable);try{await _n(y,f,h,d,{hooks:s,packCache:a,packOptions:o,auth:i})}finally{y.release()}return 0}let b=await G(h,d,l,s,i);if(L(b))return Ae(e,`fatal: ${b.message??"access denied"}
61
- `),128;await f.write(pt(b.refs,l,b.headTarget));let R=new Fe(e.readable);try{if(l==="git-upload-pack"){let A=await Hn(R),y=await we(h,A,{cache:a,cacheKey:d,noDelta:o?.noDelta,deltaWindow:o?.deltaWindow});await jr(f,y)}else{let{commands:A,capabilities:y}=await Dn(R),m=R.streamRemaining();await Cn({writer:f,repo:h,repoId:d,commands:A,capabilities:y,packStream:m,hooks:s,auth:i})}}finally{R.release()}return 0}catch(c){return t.onError?.(c),Ae(e,`fatal: internal error
62
- `),128}finally{try{await f.close()}catch{}}}async function Cn(r){let{writer:e,repo:t,repoId:n,commands:s,capabilities:a,packStream:o,hooks:i,auth:f}=r,c=await ut(t,s,a,o);if(c.updates.length===0)return;let l=c.capabilities.includes("side-band-64k"),p=c.capabilities.includes("report-status");if(!c.unpackOk){if(p){let h=c.updates.map(d=>({name:d.ref,ok:!1,error:"unpack failed"}));await e.write(Q(!1,h,l))}return}let{refResults:u}=await Re({repo:t,repoId:n,ingestResult:c,hooks:i,auth:f});if(p){let h=u.map(d=>({name:d.ref,ok:d.ok,error:d.error}));await e.write(Q(!0,h,l))}}function Ae(r,e){r.writeStderr?.(Ln.encode(e))}var vr=new TextDecoder,Fe=class{buf=new Uint8Array(0);byteReader;eof=!1;constructor(e){this.byteReader=e.getReader()}async fill(e){for(;this.buf.byteLength<e&&!this.eof;){let t=await this.byteReader.read();if(t.done||!t.value){this.eof=!0;break}let n=t.value,s=new Uint8Array(this.buf.byteLength+n.byteLength);s.set(this.buf),s.set(n,this.buf.byteLength),this.buf=s}return this.buf.byteLength>=e}consume(e){let t=this.buf.subarray(0,e);return this.buf=this.buf.subarray(e),t}async readPktLine(){if(!await this.fill(4))return null;let e=vr.decode(this.buf.subarray(0,4)),t=parseInt(e,16);if(t===0)return{type:"flush",raw:this.consume(4)};if(t===1)return{type:"delim",raw:this.consume(4)};if(t===2)return{type:"response-end",raw:this.consume(4)};if(t<4||!await this.fill(t))return null;let n=new Uint8Array(this.consume(t));return{type:"data",raw:n,text:vr.decode(n.subarray(4))}}async*streamRemaining(){for(this.buf.byteLength>0&&(yield this.consume(this.buf.byteLength));!this.eof;){let e=await this.byteReader.read();if(e.done||!e.value){this.eof=!0;break}yield e.value}}release(){this.byteReader.releaseLock()}};async function Hn(r){let e=[];for(;;){let t=await r.readPktLine();if(!t||(e.push(t.raw),t.type==="data"&&t.text.trimEnd()==="done"))break}return Mn(e)}async function Dn(r){let e=[],t=[],n=!0;for(;;){let s=await r.readPktLine();if(!s||s.type==="flush")break;if(s.type!=="data")continue;let a=s.text;if(a.endsWith(`
63
- `)&&(a=a.slice(0,-1)),n){let i=a.indexOf("\0");i!==-1&&(t=a.slice(i+1).split(" ").filter(Boolean),a=a.slice(0,i)),n=!1}let o=a.split(" ");o.length>=3&&e.push({oldHash:o[0],newHash:o[1],refName:o[2]})}return{commands:e,capabilities:t}}async function _n(r,e,t,n,s){let{hooks:a,packCache:o,packOptions:i,auth:f}=s;for(;;){let c=await Nn(r);if(!c)break;if(c.command==="ls-refs"){let l=await Ee(t,n,c.args,a,f);if(L(l))break;await e.write(l)}else if(c.command==="fetch"){let l=await ke(t,c.args,{cache:o,cacheKey:n,noDelta:i?.noDelta,deltaWindow:i?.deltaWindow});await jr(e,l)}else break}}async function Nn(r){let e="",t=[],n=[],s=!1,a=!1;for(;;){let o=await r.readPktLine();if(!o)return a?{command:e,capabilities:t,args:n}:null;if(o.type==="flush"){if(!a)return null;break}if(o.type==="response-end")break;if(o.type==="delim"){s=!0;continue}a=!0;let i=o.text;i.endsWith(`
64
- `)&&(i=i.slice(0,-1)),s?n.push(i):i.startsWith("command=")?e=i.slice(8):t.push(i)}return e?{command:e,capabilities:t,args:n}:null}function Mn(r){if(r.length===0)return new Uint8Array(0);if(r.length===1)return r[0];let e=0;for(let s of r)e+=s.byteLength;let t=new Uint8Array(e),n=0;for(let s of r)t.set(s,n),n+=s.byteLength;return t}async function jr(r,e){if(e instanceof ReadableStream){let t=e.getReader();try{for(;;){let{value:n,done:s}=await t.read();if(s)break;await r.write(n)}}finally{t.releaseLock()}}else await r.write(e)}async function Tr(r,e,t,n,s){let a=n?.dryRun??!1,o=await Ir(r),i=Bn(o);if(s)for(let d of s)i.push(d);if(i.length===0)return{deleted:0,retained:0};let f=await me(r,i,[]),c=new Set;for await(let d of f.objects)c.add(d.hash);let l=await e.listObjectHashes(t),p=[];for(let d of l)c.has(d)||p.push(d);let u=await Ir(r);return $n(o,u)?a||p.length===0?{deleted:p.length,retained:c.size}:{deleted:await e.deleteObjects(t,p),retained:c.size}:{deleted:0,retained:c.size,aborted:!0}}async function Ir(r){return r.refStore.listRefs()}function Bn(r){let e=new Set;for(let t of r)e.add(t.hash);return Array.from(e)}function $n(r,e){if(r.length!==e.length)return!1;let t=new Map;for(let n of r)t.set(n.name,n.hash);for(let n of e)if(t.get(n.name)!==n.hash)return!1;return!0}function Ur(r){async function e(t){let n=r.getForkParent?await r.getForkParent(t):null;return{objectStore:new ht(r,t,n),refStore:new yt(r,t)}}return{async createRepo(t,n){if(await r.hasRepo(t))throw new Error(`repo '${t}' already exists`);let a=n?.defaultBranch??"main";return await r.insertRepo(t),await r.putRef(t,"HEAD",{type:"symbolic",target:`refs/heads/${a}`}),e(t)},async repo(t){return await r.hasRepo(t)?e(t):null},async deleteRepo(t){if(r.listForks){let n=await r.listForks(t);if(n.length>0)throw new Error(`cannot delete repo '${t}': has ${n.length} active fork(s)`)}await r.deleteRepo(t)},async forkRepo(t,n,s){if(!r.forkRepo||!r.getForkParent||!r.listForks)throw new Error("storage backend does not support forks");if(!await r.hasRepo(t))throw new Error(`source repo '${t}' not found`);if(await r.hasRepo(n))throw new Error(`repo '${n}' already exists`);let f=await r.getForkParent(t)??t;await r.insertRepo(n),await r.forkRepo(f,n);let c=await r.listRefs(t);for(let p of c)await r.putRef(n,p.name,p.ref);let l=await r.getRef(t,"HEAD");if(l)await r.putRef(n,"HEAD",l);else{let p=s?.defaultBranch??"main";await r.putRef(n,"HEAD",{type:"symbolic",target:`refs/heads/${p}`})}return e(n)}}}var ht=class{constructor(e,t,n=null){this.driver=e;this.repoId=t;this.parentId=n}cache=new Ie;async write(e,t){let n=Yt(e,t),s=await St(n);return await this.driver.putObject(this.repoId,s,e,t),s}async read(e){let t=this.cache.get(e);if(t)return t;let n=await this.driver.getObject(this.repoId,e);if(!n&&this.parentId&&(n=await this.driver.getObject(this.parentId,e)),!n)throw new Error(`object ${e} not found`);return this.cache.set(e,n),n}async exists(e){return await this.driver.hasObject(this.repoId,e)?!0:this.parentId?!!await this.driver.hasObject(this.parentId,e):!1}async ingestPack(e){if(e.byteLength<32)return 0;let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(0);if(n!==1346454347)throw new Error(`invalid pack signature: 0x${n.toString(16)} (expected 0x5041434b)`);let s=t.getUint32(4);if(s!==2)throw new Error(`unsupported pack version: ${s}`);if(t.getUint32(8)===0)return 0;let o=this.driver,i=this.repoId,f=this.parentId,c=await zt(e,async l=>{let p=await o.getObject(i,l);return!p&&f&&(p=await o.getObject(f,l)),p?{type:p.type,content:new Uint8Array(p.content)}:null});return await o.putObjects(i,c.map(l=>({hash:l.hash,type:l.type,content:l.content}))),c.length}async ingestPackStream(e){let t=[];for await(let n of e)t.push({hash:n.hash,type:n.type,content:n.content});return t.length===0?0:(await this.driver.putObjects(this.repoId,t),t.length)}async findByPrefix(e){if(e.length<4)return[];let t=await this.driver.findObjectsByPrefix(this.repoId,e);if(!this.parentId)return Array.from(t);let n=await this.driver.findObjectsByPrefix(this.parentId,e),s=new Set(t);for(let a of n)s.add(a);return Array.from(s)}},yt=class{constructor(e,t){this.driver=e;this.repoId=t}async readRef(e){return await this.driver.getRef(this.repoId,e)??null}async writeRef(e,t){await this.driver.putRef(this.repoId,e,er(t))}async deleteRef(e){await this.driver.removeRef(this.repoId,e)}async listRefs(e){let t=await this.driver.listRefs(this.repoId,e),n=[];for(let s of t)if(s.ref.type==="direct")n.push({name:s.name,hash:s.ref.hash});else if(s.ref.type==="symbolic"){let a=await mt(o=>this.driver.getRef(this.repoId,o),s.ref.target);a&&n.push({name:s.name,hash:a})}return n}async compareAndSwapRef(e,t,n){return!!await this.driver.atomicRefUpdate(this.repoId,s=>Oe(s.getRef(e),a=>{let o=a?a.type==="direct"?a.hash:mt(i=>s.getRef(i),a.target):null;return Oe(o,i=>{if(t===null){if(a!==null)return!1}else if(i!==t)return!1;return n===null?Oe(s.removeRef(e),()=>!0):Oe(s.putRef(e,n),()=>!0)})}))}};function Oe(r,e){return r instanceof Promise?r.then(e):e(r)}function mt(r,e,t=0){return t>10?null:Oe(r(e),n=>n?n.type==="direct"?n.hash:n.type==="symbolic"?mt(r,n.target,t+1):null:null)}var Pe=class{repos=new Set;objects=new Map;refs=new Map;forks=new Map;hasRepo(e){return this.repos.has(e)}insertRepo(e){this.repos.add(e)}deleteRepo(e){this.repos.delete(e),this.objects.get(e)?.clear(),this.objects.delete(e),this.refs.get(e)?.clear(),this.refs.delete(e),this.forks.delete(e)}getObject(e,t){let n=this.getObjMap(e).get(t);return n?{type:n.type,content:new Uint8Array(n.content)}:null}putObject(e,t,n,s){let a=this.getObjMap(e);a.has(t)||a.set(t,{type:n,content:new Uint8Array(s)})}putObjects(e,t){let n=this.getObjMap(e);for(let s of t)n.has(s.hash)||n.set(s.hash,{type:s.type,content:new Uint8Array(s.content)})}hasObject(e,t){return this.getObjMap(e).has(t)}findObjectsByPrefix(e,t){let n=[];for(let s of this.getObjMap(e).keys())s.startsWith(t)&&n.push(s);return n}listObjectHashes(e){return Array.from(this.getObjMap(e).keys())}deleteObjects(e,t){let n=this.getObjMap(e),s=0;for(let a of t)n.delete(a)&&s++;return s}getRef(e,t){return this.getRefMap(e).get(t)??null}putRef(e,t,n){this.getRefMap(e).set(t,n)}removeRef(e,t){this.getRefMap(e).delete(t)}listRefs(e,t){let n=[];for(let[s,a]of this.getRefMap(e))t&&!s.startsWith(t)||n.push({name:s,ref:a});return n}atomicRefUpdate(e,t){let n=this.getRefMap(e);return t({getRef:s=>n.get(s)??null,putRef:(s,a)=>{n.set(s,a)},removeRef:s=>{n.delete(s)}})}forkRepo(e,t){this.forks.set(t,e)}getForkParent(e){return this.forks.get(e)??null}listForks(e){let t=[];for(let[n,s]of this.forks)s===e&&t.push(n);return t}repoIds(){return Array.from(this.repos)}getObjMap(e){let t=this.objects.get(e);return t||(t=new Map,this.objects.set(e,t)),t}getRefMap(e){let t=this.refs.get(e);return t||(t=new Map,this.refs.set(e,t)),t}};var Lr=new WeakMap,Fn={http:r=>({transport:"http",request:r}),ssh:r=>({transport:"ssh",username:r.username})};function Cr(r){if(r.length===0)return!1;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);if(n===0||n<32||n===127||n===92)return!1}let e=r.split("/");for(let t of e)if(t.length===0||t.charCodeAt(0)===46)return!1;return!0}function Wn(r={}){let e=r.storage??new Pe,t=Ur(e),n=r.resolve??(y=>y),s=r.autoCreate,{basePath:a}=r;async function o(y){if(!Cr(y))return null;let m=await n(y);if(m==null||m!==y&&!Cr(m))return null;let k=await t.repo(m);if(k)return{repo:k,repoId:m};if(!s)return null;let w=typeof s=="object"?{defaultBranch:s.defaultBranch}:void 0;return{repo:await t.createRepo(m,w),repoId:m}}let i=Vn(r.policy,r.hooks),f=r.auth??Fn,c=r.packCache===!1?void 0:new te(r.packCache?.maxBytes),l=r.onError===!1?void 0:r.onError??(y=>{let m=y instanceof Error?y.message:String(y);console.error(`[server] Internal error: ${m}`)}),p=!1,u=0,h=null,d=null;function b(){return p?!1:(u++,!0)}function R(){u--,p&&u===0&&h?.()}let A={async fetch(y){if(!b())return new Response("Service Unavailable",{status:503});let m;try{let k=Lr.get(y);if(k!==void 0)m=k;else{if(!f.http)return new Response("HTTP auth provider not configured",{status:501});let x=await f.http(y);if(x instanceof Response)return x;m=x}let w=new URL(y.url),g=decodeURIComponent(w.pathname);if(a){let x=a.replace(/\/+$/,"");if(!g.startsWith(x))return new Response("Not Found",{status:404});g=g.slice(x.length)}if(g.startsWith("/")||(g=`/${g}`),g.endsWith("/info/refs")&&y.method==="GET"){let x=w.searchParams.get("service");if(x!=="git-upload-pack"&&x!=="git-receive-pack")return new Response("Unsupported service",{status:403});let O=bt(g,"/info/refs"),P=await o(O);if(!P)return new Response("Not Found",{status:404});if(Hr(y)&&x==="git-upload-pack"){let U=await G(P.repo,P.repoId,x,i,m);if(L(U))return new Response(U.message??"Forbidden",{status:403});let B=xe();return new Response(B,{headers:{"Content-Type":`application/x-${x}-advertisement`,"Cache-Control":"no-cache"}})}let j=await G(P.repo,P.repoId,x,i,m);if(L(j))return new Response(j.message??"Forbidden",{status:403});let T=lt(j.refs,x,j.headTarget);return new Response(T,{headers:{"Content-Type":`application/x-${x}-advertisement`,"Cache-Control":"no-cache"}})}if(g.endsWith("/git-upload-pack")&&y.method==="POST"){let x=bt(g,"/git-upload-pack"),O=await o(x);if(!O)return new Response("Not Found",{status:404});let P=await Dr(y);if(Hr(y)){let j=ot(P),T="application/x-git-upload-pack-result";if(j.command==="ls-refs"){let U=await Ee(O.repo,O.repoId,j.args,i,m);return L(U)?new Response(U.message??"Forbidden",{status:403}):new Response(U,{headers:{"Content-Type":T}})}if(j.command==="fetch"){let U=await ke(O.repo,j.args,{cache:c,cacheKey:O.repoId,noDelta:r.packOptions?.noDelta,deltaWindow:r.packOptions?.deltaWindow});return new Response(U,{headers:{"Content-Type":T}})}return new Response(`unknown command: ${j.command}`,{status:400})}let S=await we(O.repo,P,{cache:c,cacheKey:O.repoId,noDelta:r.packOptions?.noDelta,deltaWindow:r.packOptions?.deltaWindow});return new Response(S,{headers:{"Content-Type":"application/x-git-upload-pack-result"}})}if(g.endsWith("/git-receive-pack")&&y.method==="POST"){let x=bt(g,"/git-receive-pack"),O=await o(x);if(!O)return new Response("Not Found",{status:404});let P=await Dr(y),S=await dt(O.repo,P);if(!S.sawFlush&&S.updates.length===0)return new Response("Bad Request",{status:400});let j=S.capabilities.includes("side-band-64k"),T=S.capabilities.includes("report-status");if(!S.unpackOk){if(T){let B=S.updates.map($=>({name:$.ref,ok:!1,error:"unpack failed"}));return new Response(Q(!1,B,j),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}return new Response(new Uint8Array(0),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}let{refResults:U}=await Re({repo:O.repo,repoId:O.repoId,ingestResult:S,hooks:i,auth:m});if(T){let B=U.map($=>({name:$.ref,ok:$.ok,error:$.error}));return new Response(Q(!0,B,j),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}return new Response(new Uint8Array(0),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}return new Response("Not Found",{status:404})}catch(k){return l?.(k,m),new Response("Internal Server Error",{status:500})}finally{R()}},async handleSession(y,m,k){if(!b())return m.writeStderr?.(new TextEncoder().encode(`fatal: server shutting down
65
- `)),128;try{if(!f.ssh)return m.writeStderr?.(new TextEncoder().encode(`fatal: SSH auth provider not configured
66
- `)),128;let w=await f.ssh(k??{});return await Sr(y,m,{resolveRepo:o,hooks:i,packCache:c,packOptions:r.packOptions,auth:w,onError:l?g=>l(g,w):void 0})}finally{R()}},async updateRefs(y,m){if(!b())throw new Error("Server is shutting down");try{let k=await A.requireRepo(y),w=await $e(k,m);return Be(k,w)}finally{R()}},async commit(y,m){if(!b())throw new Error("Server is shutting down");try{let k=await A.requireRepo(y),w=await nr(k,m),g=`refs/heads/${m.branch}`,x=await $e(k,[{ref:g,newHash:w.hash,oldHash:w.parentHash}]),P=(await Be(k,x)).refResults[0];if(!P?.ok)throw new Error(P?.error??"ref update failed");return w}finally{R()}},nodeHandler(y,m){let k=[];y.on("data",w=>k.push(new Uint8Array(w))),y.on("error",()=>{m.writeHead(500),m.end("Internal Server Error")}),y.on("end",()=>{Gn(A,y,k,m).catch(()=>{try{m.writeHead(500),m.end("Internal Server Error")}catch{}})})},createRepo:(y,m)=>t.createRepo(y,m),repo:y=>t.repo(y),async requireRepo(y){let m=await t.repo(y);if(!m)throw new Error(`Repository "${y}" not found`);return m},deleteRepo:y=>t.deleteRepo(y),async forkRepo(y,m,k){if(!b())throw new Error("Server is shutting down");try{return await t.forkRepo(y,m,k)}finally{R()}},async gc(y,m){if(!b())throw new Error("Server is shutting down");try{let k=await A.requireRepo(y),w;if(e.listForks&&e.getForkParent&&!await e.getForkParent(y)){let x=await e.listForks(y);if(x.length>0){w=[];for(let O of x){let P=await t.repo(O);if(!P)continue;let S=await P.refStore.listRefs();for(let j of S)w.push(j.hash)}}}return Tr(k,e,y,m,w)}finally{R()}},get closed(){return p},asNetwork(y="http://git",m){return{allowed:[y.endsWith("/")?y:`${y}/`],fetch:(w,g)=>{let x=new Request(w,g);return m!==void 0&&Lr.set(x,m),A.fetch(x)}}},async close(y){if(p)return d??Promise.resolve();if(p=!0,c?.clear(),u!==0){if(d=new Promise(m=>{h=m}),y?.signal){if(y.signal.aborted){h();return}let m=()=>h?.();y.signal.addEventListener("abort",m,{once:!0}),d.then(()=>y.signal.removeEventListener("abort",m))}return d}}};return A}function Hr(r){let e=r.headers.get("git-protocol");return e!==null&&e.includes("version=2")}function bt(r,e){let t=r.slice(0,-e.length);return t.startsWith("/")&&(t=t.slice(1)),t}async function Dr(r){let e=new Uint8Array(await r.arrayBuffer()),t=r.headers.get("content-encoding");if(t==="gzip"||t==="x-gzip"){let n=new DecompressionStream("gzip"),s=n.writable.getWriter();return s.write(e),s.close(),new Uint8Array(await new Response(n.readable).arrayBuffer())}return e}async function Gn(r,e,t,n){let s=typeof e.headers.host=="string"?e.headers.host:"localhost",a=new URL(e.url??"/",`http://${s}`),o=new Headers;for(let[h,d]of Object.entries(e.headers))if(d!==void 0)if(Array.isArray(d))for(let b of d)o.append(h,b);else o.set(h,d);let i=e.method??"GET",f;if(i!=="GET"&&i!=="HEAD"){let h=0;for(let R of t)h+=R.byteLength;let d=new Uint8Array(h),b=0;for(let R of t)d.set(R,b),b+=R.byteLength;f=d}let c=new Request(a.href,{method:i,headers:o,body:f}),l=await r.fetch(c),p={};l.headers.forEach((h,d)=>{p[d]=h}),n.writeHead(l.status,p);let u=new Uint8Array(await l.arrayBuffer());u.byteLength>0&&n.write(u),n.end()}function qn(r){let{protectedBranches:e=[],denyNonFastForward:t=!1,denyDeletes:n=!1,immutableTags:s=!1}=r,a=new Set(e.map(i=>i.startsWith("refs/")?i:`refs/heads/${i}`)),o={};return a.size>0&&(o.preReceive=async i=>{for(let f of i.updates)if(a.has(f.ref)){if(f.isDelete)return{reject:!0,message:`cannot delete protected branch ${f.ref}`};if(!f.isCreate&&!f.isFF)return{reject:!0,message:`non-fast-forward push to protected branch ${f.ref}`}}}),(t||n||s)&&(o.update=async i=>{if(n&&i.update.isDelete)return{reject:!0,message:"ref deletion denied"};if(s&&i.update.ref.startsWith("refs/tags/")){if(i.update.isDelete)return{reject:!0,message:"tag deletion denied"};if(!i.update.isCreate)return{reject:!0,message:"tag overwrite denied"}}if(t&&!i.update.isCreate&&!i.update.isDelete&&!i.update.isFF)return{reject:!0,message:"non-fast-forward"}}),o}function Vn(r,e){let t=r?qn(r):void 0;return t&&e?_r(t,e):t??e}function _r(...r){let e=r.filter(i=>i!=null);if(e.length===0)return{};if(e.length===1)return e[0];let t={},n=e.filter(i=>i.preReceive).map(i=>i.preReceive);n.length>0&&(t.preReceive=async i=>{for(let f of n){let c=await f(i);if(L(c))return c}});let s=e.filter(i=>i.update).map(i=>i.update);s.length>0&&(t.update=async i=>{for(let f of s){let c=await f(i);if(L(c))return c}});let a=e.filter(i=>i.postReceive).map(i=>i.postReceive);a.length>0&&(t.postReceive=async i=>{for(let f of a)try{await f(i)}catch{}});let o=e.filter(i=>i.advertiseRefs).map(i=>i.advertiseRefs);return o.length>0&&(t.advertiseRefs=async i=>{let f=i.refs;for(let c of o){let l=await c({...i,refs:f});if(L(l))return l;l&&(f=l)}return f}),t}var zn=`
30
+ `));for(let a of e)a.ok?n.push(k(`ok ${a.name}
31
+ `)):n.push(k(`ng ${a.name} ${a.error??"failed"}
32
+ `));n.push(_());let s=B(...n);if(t){let a=[];return a.push(ke(1,s)),a.push(_()),B(...a)}return s}function ke(r,e){let t=new Uint8Array(1+e.byteLength);return t[0]=r,t.set(e,1),k(t)}function ut(r){let e=[];e.push(k(`version 2
33
+ `));for(let t of r)e.push(k(`${t}
34
+ `));return e.push(_()),B(...e)}function pt(r){let e=lt(r),t="",n=[],s=[],a=!1;for(let i of e){if(i.type==="flush"||i.type==="response-end")break;if(i.type==="delim"){a=!0;continue}let o=dt(i);o&&(a?s.push(o):o.startsWith("command=")?t=o.slice(8):n.push(o))}return{command:t,capabilities:n,args:s}}function ht(r){let e=[];for(let t of r){let n=`${t.hash} ${t.name}`;t.symrefTarget&&(n+=` symref-target:${t.symrefTarget}`),t.peeledHash&&(n+=` peeled:${t.peeledHash}`),e.push(k(`${n}
35
+ `))}return e.push(_()),B(...e)}function yt(r){let e=[],t=[],n=[],s=[],a=!1,i,o=!1,f=!1;for(let c of r)c.startsWith("want ")?e.push(c.slice(5)):c.startsWith("have ")?t.push(c.slice(5)):c.startsWith("shallow ")?n.push(c.slice(8)):c.startsWith("deepen ")?(i=parseInt(c.slice(7),10),Number.isNaN(i)&&(i=void 0)):c.startsWith("want-ref ")?s.push(c.slice(9)):c==="done"?a=!0:c==="include-tag"?o=!0:c==="ofs-delta"&&(f=!0);return{wants:e,haves:t,done:a,clientShallows:n,depth:i,includeTag:o,ofsDeltas:f,wantRefs:s}}function re(r,e){let t=[],{commonHashes:n,shallowInfo:s,wantedRefs:a}=e??{};if(n&&n.length>0){t.push(k(`acknowledgments
36
+ `));for(let o of n)t.push(k(`ACK ${o}
37
+ `));t.push(k(`ready
38
+ `)),t.push(K())}if(s&&(s.shallow.length>0||s.unshallow.length>0)){t.push(k(`shallow-info
39
+ `));for(let o of s.shallow)t.push(k(`shallow ${o}
40
+ `));for(let o of s.unshallow)t.push(k(`unshallow ${o}
41
+ `));t.push(K())}if(a&&a.length>0){t.push(k(`wanted-refs
42
+ `));for(let o of a)t.push(k(`${o.hash} ${o.name}
43
+ `));t.push(K())}t.push(k(`packfile
44
+ `));let i=0;for(;i<r.byteLength;){let o=Math.min(We,r.byteLength-i);t.push(ke(1,r.subarray(i,i+o))),i+=o}return t.push(_()),B(...t)}function kr(r,e){let t=[];if(t.push(k(`acknowledgments
45
+ `)),r.length>0)for(let n of r)t.push(k(`ACK ${n}
46
+ `));else t.push(k(`NAK
47
+ `));return e&&t.push(k(`ready
48
+ `)),t.push(_()),B(...t)}async function*Ar(r,e){let{commonHashes:t,shallowInfo:n,wantedRefs:s}=e??{};if(t&&t.length>0){let a=[];a.push(k(`acknowledgments
49
+ `));for(let i of t)a.push(k(`ACK ${i}
50
+ `));a.push(k(`ready
51
+ `)),a.push(K()),yield B(...a)}if(n&&(n.shallow.length>0||n.unshallow.length>0)){let a=[];a.push(k(`shallow-info
52
+ `));for(let i of n.shallow)a.push(k(`shallow ${i}
53
+ `));for(let i of n.unshallow)a.push(k(`unshallow ${i}
54
+ `));a.push(K()),yield B(...a)}if(s&&s.length>0){let a=[];a.push(k(`wanted-refs
55
+ `));for(let i of s)a.push(k(`${i.hash} ${i.name}
56
+ `));a.push(K()),yield B(...a)}yield k(`packfile
57
+ `);for await(let a of r){let i=0;for(;i<a.byteLength;){let o=Math.min(We,a.byteLength-i);yield ke(1,a.subarray(i,i+o)),i+=o}}yield _()}var D=class extends Error{status=413;constructor(e){super(e),this.name="RequestLimitError"}};function Er(r){async function e(t){let n=r.getForkParent?await r.getForkParent(t):null;return{objectStore:new mt(r,t,n),refStore:new bt(r,t)}}return{async createRepo(t,n){if(await r.hasRepo(t))throw new Error(`repo '${t}' already exists`);let a=n?.defaultBranch??"main";return await r.insertRepo(t),await r.putRef(t,"HEAD",{type:"symbolic",target:`refs/heads/${a}`}),e(t)},async repo(t){return await r.hasRepo(t)?e(t):null},async deleteRepo(t){if(r.listForks){let n=await r.listForks(t);if(n.length>0)throw new Error(`cannot delete repo '${t}': has ${n.length} active fork(s)`)}await r.deleteRepo(t)},async forkRepo(t,n,s){if(!r.forkRepo||!r.getForkParent||!r.listForks)throw new Error("storage backend does not support forks");if(!await r.hasRepo(t))throw new Error(`source repo '${t}' not found`);if(await r.hasRepo(n))throw new Error(`repo '${n}' already exists`);let f=await r.getForkParent(t)??t;await r.insertRepo(n),await r.forkRepo(f,n);let c=await r.listRefs(t);for(let d of c)await r.putRef(n,d.name,d.ref);let l=await r.getRef(t,"HEAD");if(l)await r.putRef(n,"HEAD",l);else{let d=s?.defaultBranch??"main";await r.putRef(n,"HEAD",{type:"symbolic",target:`refs/heads/${d}`})}return e(n)}}}function qe(r){return typeof r=="object"&&r!==null&&typeof r.preparePack=="function"&&typeof r.commitPack=="function"&&typeof r.deleteObjects=="function"}var mt=class{constructor(e,t,n=null){this.driver=e;this.repoId=t;this.parentId=n}cache=new He;async write(e,t){let n=tr(e,t),s=await Lt(n);return await this.driver.putObject(this.repoId,s,e,t),s}async read(e){let t=this.cache.get(e);if(t)return t;let n=await this.driver.getObject(this.repoId,e);if(!n&&this.parentId&&(n=await this.driver.getObject(this.parentId,e)),!n)throw new Error(`object ${e} not found`);return this.cache.set(e,n),n}async exists(e){return await this.driver.hasObject(this.repoId,e)?!0:this.parentId?!!await this.driver.hasObject(this.parentId,e):!1}async preparePack(e){if(e.byteLength<32)return[];let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(0);if(n!==1346454347)throw new Error(`invalid pack signature: 0x${n.toString(16)} (expected 0x5041434b)`);let s=t.getUint32(4);if(s!==2)throw new Error(`unsupported pack version: ${s}`);if(t.getUint32(8)===0)return[];let i=this.driver,o=this.repoId,f=this.parentId;return(await Jt(e,async l=>{let d=await i.getObject(o,l);return!d&&f&&(d=await i.getObject(f,l)),d?{type:d.type,content:new Uint8Array(d.content)}:null})).map(l=>({hash:l.hash,type:l.type,content:l.content}))}async preparePackStream(e){let t=[];for await(let n of e)t.push({hash:n.hash,type:n.type,content:n.content});return t}async commitPack(e){return e.length===0?0:(await this.driver.putObjects(this.repoId,e),e.length)}async ingestPack(e){let t=await this.preparePack(e);return this.commitPack(t)}async ingestPackStream(e){let t=await this.preparePackStream(e);return this.commitPack(t)}async deleteObjects(e){return e.length===0?0:this.driver.deleteObjects(this.repoId,e)}async findByPrefix(e){if(e.length<4)return[];let t=await this.driver.findObjectsByPrefix(this.repoId,e);if(!this.parentId)return Array.from(t);let n=await this.driver.findObjectsByPrefix(this.parentId,e),s=new Set(t);for(let a of n)s.add(a);return Array.from(s)}},bt=class{constructor(e,t){this.driver=e;this.repoId=t}async readRef(e){return await this.driver.getRef(this.repoId,e)??null}async writeRef(e,t){await this.driver.putRef(this.repoId,e,ar(t))}async deleteRef(e){await this.driver.removeRef(this.repoId,e)}async listRefs(e){let t=await this.driver.listRefs(this.repoId,e),n=[];for(let s of t)if(s.ref.type==="direct")n.push({name:s.name,hash:s.ref.hash});else if(s.ref.type==="symbolic"){let a=await gt(i=>this.driver.getRef(this.repoId,i),s.ref.target);a&&n.push({name:s.name,hash:a})}return n}async compareAndSwapRef(e,t,n){return!!await this.driver.atomicRefUpdate(this.repoId,s=>Ae(s.getRef(e),a=>{let i=a?a.type==="direct"?a.hash:gt(o=>s.getRef(o),a.target):null;return Ae(i,o=>{if(t===null){if(a!==null)return!1}else if(o!==t)return!1;return n===null?Ae(s.removeRef(e),()=>!0):Ae(s.putRef(e,n),()=>!0)})}))}};function Ae(r,e){return r instanceof Promise?r.then(e):e(r)}function gt(r,e,t=0){return t>10?null:Ae(r(e),n=>n?n.type==="direct"?n.hash:n.type==="symbolic"?gt(r,n.target,t+1):null:null)}var ne=class{entries=new Map;currentBytes=0;maxBytes;hits=0;misses=0;constructor(e=256*1024*1024){this.maxBytes=e}static key(e,t,n){if(n.length>0)return null;let s=t.slice().sort();return`${e}\0${s.join(",")}`}get(e){let t=this.entries.get(e);return t?this.hits++:this.misses++,t}set(e,t){if(this.entries.has(e))return;let n=t.packData.byteLength;if(!(n>this.maxBytes)){for(;this.currentBytes+n>this.maxBytes&&this.entries.size>0;){let s=this.entries.keys().next().value;this.currentBytes-=this.entries.get(s).packData.byteLength,this.entries.delete(s)}this.entries.set(e,t),this.currentBytes+=n}}clear(){this.entries.clear(),this.currentBytes=0}get stats(){return{entries:this.entries.size,bytes:this.currentBytes,hits:this.hits,misses:this.misses}}},Pr=["multi_ack_detailed","no-done","side-band-64k","ofs-delta","include-tag","shallow"],Or=["report-status","side-band-64k","ofs-delta","delete-refs"];async function Sr(r){let e=await r.refStore.listRefs("refs"),t=await r.refStore.readRef("HEAD"),n=[],s=null,a;if(t)if(t.type==="symbolic"){a=t.target;let o=await r.refStore.readRef(t.target);o?.type==="direct"&&(s=o.hash)}else s=t.hash;let i=e.slice().sort((o,f)=>o.name<f.name?-1:o.name>f.name?1:0);if(!s&&i.length>0){let o=Bn(i);o&&(s=o.hash,a=o.name)}s&&n.push({name:"HEAD",hash:s});for(let o of i)if(n.push({name:o.name,hash:o.hash}),o.name.startsWith("refs/tags/"))try{let f=await r.objectStore.read(o.hash);if(f.type==="tag"){let c=ee(f.content);n.push({name:`${o.name}^{}`,hash:c.object})}}catch{}return{refs:n,headTarget:a}}var Dn=["refs/heads/main","refs/heads/master"];function Bn(r){for(let t of Dn){let n=r.find(s=>s.name===t);if(n)return n}return r.find(t=>t.name.startsWith("refs/heads/"))??null}function wt(r,e,t){return br(r,e,e==="git-upload-pack"?Pr:Or,t)}function Rt(r,e,t){return Ge(r,e==="git-upload-pack"?Pr:Or,t)}async function W(r,e,t,n,s){let{refs:a,headTarget:i}=await Sr(r),o=a;if(n?.advertiseRefs){let f=await n.advertiseRefs({repo:r,repoId:e,refs:a,service:t,auth:s});if(U(f))return f;f&&(o=f)}return{refs:o,headTarget:i}}function Ee(r){let e=new Map,t=new Set;for(let n of r.refs)e.set(n.name,n.hash),t.add(n.hash);return{allowedRefHashes:e,allowedWantHashes:t}}async function Pe(r,e,t){let{wants:n,haves:s,capabilities:a,clientShallows:i,depth:o,done:f}=gr(e);if(n.length===0)return xe(new Uint8Array(0),!1);if(t?.authorizedFetchSet){for(let x of n)if(!t.authorizedFetchSet.allowedWantHashes.has(x))return{reject:!0,message:`forbidden want ${x}`}}let c=a.includes("multi_ack_detailed"),l=a.includes("side-band-64k"),d,u,h;if(i.length>0&&(h=new Set(i)),o!==void 0){let x=await ft(r,n,o,h??new Set);d=x,u=new Set(x.shallow)}if(d&&!f)return wr(d);let p;if(c&&s.length>0){p=[];for(let x of s)await r.objectStore.exists(x)&&p.push(x);p.length===0&&(p=void 0)}let g=!u&&t?.cache&&t.cacheKey?ne.key(t.cacheKey,n,s):null;if(g&&t?.cache){let x=t.cache.get(g);if(x)return xe(x.packData,l,p)}let R=a.includes("include-tag"),P={repo:r,wants:n,haves:s,includeTag:R,shallowBoundary:u,clientShallowBoundary:h,cache:t?.cache,cacheKey:g,deltaWindow:t?.deltaWindow};if(t?.noDelta){let x=await Ir(P);if(!x){let{data:m}=await Q([]);return xe(m,l,p,d)}return Tr(Rr(x,l,p,d))}let A=await jr(P);return xe(A,l,p,d)}async function vr(r,e){let t=[],n=await r.refStore.listRefs("refs/tags");for(let s of n)if(!e.has(s.hash))try{let a=await r.objectStore.read(s.hash);if(a.type==="tag"){let i=ee(a.content);e.has(i.object)&&(t.push({hash:s.hash,type:"tag",content:a.content}),e.add(s.hash))}}catch{}return t}async function jr(r){let{repo:e,wants:t,haves:n,includeTag:s,shallowBoundary:a,clientShallowBoundary:i}=r,o=await pr(e,t,n,a,i);if(o.count===0){let{data:p}=await Q([]);return p}let f=await hr(o),c=new Set(f.map(p=>p.hash));if(s){let p=await vr(e,c);f.push(...p)}let l=r.deltaWindow?{window:r.deltaWindow}:void 0,d=ur(f,l),u=d.map(p=>({hash:p.hash,type:p.type,content:p.content,delta:p.delta,deltaBaseHash:p.deltaBase})),{data:h}=await Q(u);if(r.cacheKey&&r.cache){let p=d.filter(g=>g.delta).length;r.cache.set(r.cacheKey,{packData:h,objectCount:f.length,deltaCount:p})}return h}async function Ir(r){let{repo:e,wants:t,haves:n,includeTag:s,shallowBoundary:a,clientShallowBoundary:i}=r,{count:o,objects:f}=await Re(e,t,n,a,i);if(o===0)return null;let c=[];for await(let p of f)c.push(p);let l=new Set(c.map(p=>p.hash)),d=s?await vr(e,l):[],u=c.length+d.length;async function*h(){for(let p of c){let g=await e.objectStore.read(p.hash);yield{type:g.type,content:g.content}}for(let p of d)yield{type:p.type,content:p.content}}return er(u,h())}function Tr(r){let e=r[Symbol.asyncIterator]();return new ReadableStream({async pull(t){let{value:n,done:s}=await e.next();s?t.close():t.enqueue(n)}})}async function Ur(r,e){return await r.commitPack(e),e.map(t=>t.hash)}async function _n(r,e){qe(r.objectStore)&&await r.objectStore.deleteObjects(e)}async function xt(r,e,t){let{commands:n,packData:s,capabilities:a,sawFlush:i}=xr(e),o=!0,f;if(s.byteLength>0)try{if(Mn(s,t),qe(r.objectStore)){let l=await r.objectStore.preparePack(s);f=await Ur(r.objectStore,l)}else await r.objectStore.ingestPack(s)}catch(l){if(l instanceof D)throw l;o=!1}return{updates:await Lr(r,n,o),unpackOk:o,capabilities:a,sawFlush:i,ingestedHashes:f}}async function kt(r,e,t,n,s=!0,a){let i=!0,o;if(e.some(l=>l.newHash!==oe))try{let l=async u=>{try{return await r.objectStore.read(u)}catch{return null}},d=Qt(Fn(n,a),l);if(qe(r.objectStore)){let u=await r.objectStore.preparePackStream(d);o=await Ur(r.objectStore,u)}else await r.objectStore.ingestPackStream(d)}catch(l){if(l instanceof D)throw l;i=!1}return{updates:await Lr(r,e,i),unpackOk:i,capabilities:t,sawFlush:s,ingestedHashes:o}}async function Lr(r,e,t){let n=[];for(let s of e){let a=s.oldHash===oe,i=s.newHash===oe,o=!1;if(!a&&!i&&t)try{o=await ot(r,s.oldHash,s.newHash)}catch{}n.push({ref:s.refName,oldHash:a?null:s.oldHash,newHash:s.newHash,isFF:o,isCreate:a,isDelete:i})}return n}async function Ve(r,e){let t=[],n=[];for(let s of e){if(s.ref==="HEAD"){t.push({ref:s.ref,ok:!1,error:"HEAD cannot be updated via push"});continue}if(!s.isDelete&&!st(s.ref)){t.push({ref:s.ref,ok:!1,error:"invalid refname"});continue}if(!s.isDelete&&!await r.objectStore.exists(s.newHash)){t.push({ref:s.ref,ok:!1,error:"missing objects"});continue}try{let a=s.isCreate?null:s.oldHash,i=s.isDelete?null:{type:"direct",hash:s.newHash};if(!await r.refStore.compareAndSwapRef(s.ref,a,i)){t.push({ref:s.ref,ok:!1,error:"failed to lock"});continue}t.push({ref:s.ref,ok:!0}),n.push(s)}catch(a){t.push({ref:s.ref,ok:!1,error:a instanceof Error?a.message:String(a)})}}return{refResults:t,applied:n}}async function Oe(r){let{repo:e,repoId:t,ingestResult:n,hooks:s,auth:a}=r,{updates:i}=n;if(s?.preReceive){let c=await s.preReceive({repo:e,repoId:t,updates:i,auth:a});if(U(c)){n.ingestedHashes?.length&&await _n(e,n.ingestedHashes);let l=c.message??"pre-receive hook declined";return{refResults:i.map(d=>({ref:d.ref,ok:!1,error:l})),applied:[]}}}let o=[],f=[];for(let c of i){if(c.ref==="HEAD"){o.push({ref:c.ref,ok:!1,error:"HEAD cannot be updated via push"});continue}if(!c.isDelete&&!st(c.ref)){o.push({ref:c.ref,ok:!1,error:"invalid refname"});continue}if(s?.update){let l=await s.update({repo:e,repoId:t,update:c,auth:a});if(U(l)){o.push({ref:c.ref,ok:!1,error:l.message??"update hook declined"});continue}}if(!c.isDelete&&!await e.objectStore.exists(c.newHash)){o.push({ref:c.ref,ok:!1,error:"missing objects"});continue}try{let l=c.isCreate?null:c.oldHash,d=c.isDelete?null:{type:"direct",hash:c.newHash};if(!await e.refStore.compareAndSwapRef(c.ref,l,d)){o.push({ref:c.ref,ok:!1,error:"failed to lock"});continue}o.push({ref:c.ref,ok:!0}),f.push(c)}catch(l){o.push({ref:c.ref,ok:!1,error:l instanceof Error?l.message:String(l)})}}if(s?.postReceive&&f.length>0)try{await s.postReceive({repo:e,repoId:t,updates:f,auth:a})}catch{}return{refResults:o,applied:f}}async function ze(r,e){let t=[];for(let n of e){let s;n.oldHash!==void 0?s=n.oldHash:s=await be(r,n.ref);let a=s===null,i=n.newHash===null,o=n.newHash??oe,f=!1;if(!a&&!i)try{f=await ot(r,s,o)}catch{}t.push({ref:n.ref,oldHash:s,newHash:o,isFF:f,isCreate:a,isDelete:i})}return t}var Nn=["agent=just-git/1.0","ls-refs=unborn","fetch=shallow","server-option","object-format=sha1"];function Se(){return ut(Nn)}async function ve(r,e,t,n,s){let a=t.includes("symrefs"),i=t.includes("peel"),o=t.includes("unborn"),f=t.filter(h=>h.startsWith("ref-prefix ")).map(h=>h.slice(11)),c=await W(r,e,"git-upload-pack",n,s);if(U(c))return c;let{refs:l,headTarget:d}=c,u=[];for(let h of l){if(h.name.endsWith("^{}")||f.length>0&&!f.some(g=>h.name.startsWith(g)))continue;let p={hash:h.hash,name:h.name};if(a&&h.name==="HEAD"&&d&&(p.symrefTarget=d),i&&h.name.startsWith("refs/tags/")){let g=l.find(R=>R.name===`${h.name}^{}`);g&&(p.peeledHash=g.hash)}u.push(p)}return o&&!u.some(h=>h.name==="HEAD")&&d&&(f.length===0||f.some(p=>"HEAD".startsWith(p)))&&u.unshift({hash:"unborn",name:"HEAD",symrefTarget:d}),ht(u)}async function je(r,e,t){let{wants:n,haves:s,done:a,clientShallows:i,depth:o,includeTag:f,wantRefs:c}=yt(e);if(n.length===0&&c.length===0){let{data:y}=await Q([]);return re(y)}let l=t?.authorizedFetchSet,d=[],u=[...n];for(let y of c)if(l){let w=l.allowedRefHashes.get(y);if(!w)return{reject:!0,message:`forbidden want-ref ${y}`};d.push({hash:w,name:y}),u.includes(w)||u.push(w)}else{let w=await be(r,y);w&&(d.push({hash:w,name:y}),u.includes(w)||u.push(w))}if(l){for(let y of n)if(!l.allowedWantHashes.has(y))return{reject:!0,message:`forbidden want ${y}`}}let h,p,g;if(i.length>0&&(g=new Set(i)),o!==void 0){let y=await ft(r,u,o,g??new Set);h=y,p=new Set(y.shallow)}let R;if(s.length>0){R=[];for(let y of s)await r.objectStore.exists(y)&&R.push(y);R.length===0&&(R=void 0)}let P=R&&R.length>0;if(!a&&!P)return kr(R??[]);let A=!p&&t?.cache&&t.cacheKey?ne.key(t.cacheKey,u,s):null,x={commonHashes:R,shallowInfo:h,wantedRefs:d.length>0?d:void 0};if(A&&t?.cache){let y=t.cache.get(A);if(y)return re(y.packData,x)}let m={repo:r,wants:u,haves:s,includeTag:f,shallowBoundary:p,clientShallowBoundary:g,cache:t?.cache,cacheKey:A,deltaWindow:t?.deltaWindow};if(t?.noDelta){let y=await Ir(m);if(!y){let{data:w}=await Q([]);return re(w,x)}return Tr(Ar(y,x))}let b=await jr(m);return re(b,x)}function Mn(r,e){if(e){if(e.maxPackBytes!==void 0&&r.byteLength>e.maxPackBytes)throw new D("Pack payload too large");if(e.maxPackObjects!==void 0&&r.byteLength>=12&&new DataView(r.buffer,r.byteOffset,r.byteLength).getUint32(8)>e.maxPackObjects)throw new D("Pack contains too many objects")}}async function*Fn(r,e){if(!e){for await(let a of r)yield a;return}let t=0,n=new Uint8Array(12),s=0;for await(let a of r){if(t+=a.byteLength,e.maxPackBytes!==void 0&&t>e.maxPackBytes)throw new D("Pack payload too large");if(s<12){let i=Math.min(12-s,a.byteLength);if(n.set(a.subarray(0,i),s),s+=i,s===12&&e.maxPackObjects!==void 0&&new DataView(n.buffer).getUint32(8)>e.maxPackObjects)throw new D("Pack contains too many objects")}yield a}}function $n(r){let e=/--protocol=version=2/.test(r),n=r.replace(/\s*--protocol=version=\d+/g,"").match(/^git[\s-](upload-pack|receive-pack)\s+'?([^']+?)'?\s*$/);if(!n)return null;let s=`git-${n[1]}`,a=n[2];return a.startsWith("/")&&(a=a.slice(1)),e?{service:s,repoPath:a,protocolV2:e}:{service:s,repoPath:a}}var Wn=new TextEncoder;async function Hr(r,e,t){let{resolveRepo:n,hooks:s,packCache:a,packOptions:i,receiveLimits:o,fetchLimits:f,auth:c}=t,l=e.writable.getWriter();try{let d=$n(r);if(!d)return Ie(e,`fatal: unrecognized command '${r}'
58
+ `),128;let{service:u,repoPath:h}=d,p=await n(h);if(!p)return Ie(e,`fatal: '${h}' does not appear to be a git repository
59
+ `),128;let{repo:g,repoId:R}=p;if(d.protocolV2&&u==="git-upload-pack"){let x=await W(g,R,u,s,c);if(U(x))return se(e,x);await l.write(Se());let m=new Ke(e.readable);try{return await zn(m,l,g,R,e,{hooks:s,packCache:a,packOptions:i,receiveLimits:o,fetchLimits:f,auth:c})}finally{m.release()}}let P=await W(g,R,u,s,c);if(U(P))return se(e,P);await l.write(Rt(P.refs,u,P.headTarget));let A=new Ke(e.readable);try{if(u==="git-upload-pack"){let x=s?.advertiseRefs?Ee(P):void 0,m=await qn(A,f?.maxRequestBytes),b=await Pe(g,m,{cache:a,cacheKey:R,noDelta:i?.noDelta,deltaWindow:i?.deltaWindow,authorizedFetchSet:x});if(U(b))return se(e,b);await Dr(l,b)}else{let{commands:x,capabilities:m}=await Vn(A),b=A.streamRemaining();await Gn({writer:l,repo:g,repoId:R,commands:x,capabilities:m,packStream:b,hooks:s,receiveLimits:o,auth:c})}}finally{A.release()}return 0}catch(d){return d instanceof D?(Ie(e,`fatal: ${d.message}
60
+ `),128):(t.onError?.(d),Ie(e,`fatal: internal error
61
+ `),128)}finally{try{await l.close()}catch{}}}async function Gn(r){let{writer:e,repo:t,repoId:n,commands:s,capabilities:a,packStream:i,hooks:o,receiveLimits:f,auth:c}=r,l=await kt(t,s,a,i,!0,f);if(l.updates.length===0)return;let d=l.capabilities.includes("side-band-64k"),u=l.capabilities.includes("report-status");if(!l.unpackOk){if(u){let p=l.updates.map(g=>({name:g.ref,ok:!1,error:"unpack failed"}));await e.write(te(!1,p,d))}return}let{refResults:h}=await Oe({repo:t,repoId:n,ingestResult:l,hooks:o,auth:c});if(u){let p=h.map(g=>({name:g.ref,ok:g.ok,error:g.error}));await e.write(te(!0,p,d))}}function Ie(r,e){r.writeStderr?.(Wn.encode(e))}function se(r,e){return Ie(r,`fatal: ${e.message??"access denied"}
62
+ `),128}var Cr=new TextDecoder,Ke=class{buf=new Uint8Array(0);byteReader;eof=!1;constructor(e){this.byteReader=e.getReader()}async fill(e){for(;this.buf.byteLength<e&&!this.eof;){let t=await this.byteReader.read();if(t.done||!t.value){this.eof=!0;break}let n=t.value,s=new Uint8Array(this.buf.byteLength+n.byteLength);s.set(this.buf),s.set(n,this.buf.byteLength),this.buf=s}return this.buf.byteLength>=e}consume(e){let t=this.buf.subarray(0,e);return this.buf=this.buf.subarray(e),t}async readPktLine(){if(!await this.fill(4))return null;let e=Cr.decode(this.buf.subarray(0,4)),t=parseInt(e,16);if(t===0)return{type:"flush",raw:this.consume(4)};if(t===1)return{type:"delim",raw:this.consume(4)};if(t===2)return{type:"response-end",raw:this.consume(4)};if(t<4||!await this.fill(t))return null;let n=new Uint8Array(this.consume(t));return{type:"data",raw:n,text:Cr.decode(n.subarray(4))}}async*streamRemaining(){for(this.buf.byteLength>0&&(yield this.consume(this.buf.byteLength));!this.eof;){let e=await this.byteReader.read();if(e.done||!e.value){this.eof=!0;break}yield e.value}}release(){this.byteReader.releaseLock()}};async function qn(r,e){let t=[],n=0;for(;;){let s=await r.readPktLine();if(!s)break;if(n+=s.raw.byteLength,e!==void 0&&n>e)throw new D("Request body too large");if(t.push(s.raw),s.type==="data"&&s.text.trimEnd()==="done")break}return Xn(t)}async function Vn(r){let e=[],t=[],n=!0;for(;;){let s=await r.readPktLine();if(!s||s.type==="flush")break;if(s.type!=="data")continue;let a=s.text;if(a.endsWith(`
63
+ `)&&(a=a.slice(0,-1)),n){let o=a.indexOf("\0");o!==-1&&(t=a.slice(o+1).split(" ").filter(Boolean),a=a.slice(0,o)),n=!1}let i=a.split(" ");i.length>=3&&e.push({oldHash:i[0],newHash:i[1],refName:i[2]})}return{commands:e,capabilities:t}}async function zn(r,e,t,n,s,a){let{hooks:i,packCache:o,packOptions:f,fetchLimits:c,auth:l}=a;for(;;){let d=await Kn(r,c?.maxRequestBytes);if(!d)break;if(d.command==="ls-refs"){let u=await ve(t,n,d.args,i,l);if(U(u))return se(s,u);await e.write(u)}else if(d.command==="fetch"){let u;if(i?.advertiseRefs){let p=await W(t,n,"git-upload-pack",i,l);if(U(p))return se(s,p);u=Ee(p)}let h=await je(t,d.args,{cache:o,cacheKey:n,noDelta:f?.noDelta,deltaWindow:f?.deltaWindow,authorizedFetchSet:u});if(U(h))return se(s,h);await Dr(e,h)}else break}return 0}async function Kn(r,e){let t="",n=[],s=[],a=!1,i=!1,o=0;for(;;){let f=await r.readPktLine();if(!f)return i?{command:t,capabilities:n,args:s}:null;if(f.type==="flush"){if(!i)return null;break}if(f.type==="response-end")break;if(o+=f.raw.byteLength,e!==void 0&&o>e)throw new D("Request body too large");if(f.type==="delim"){a=!0;continue}i=!0;let c=f.text;c.endsWith(`
64
+ `)&&(c=c.slice(0,-1)),a?s.push(c):c.startsWith("command=")?t=c.slice(8):n.push(c)}return t?{command:t,capabilities:n,args:s}:null}function Xn(r){if(r.length===0)return new Uint8Array(0);if(r.length===1)return r[0];let e=0;for(let s of r)e+=s.byteLength;let t=new Uint8Array(e),n=0;for(let s of r)t.set(s,n),n+=s.byteLength;return t}async function Dr(r,e){if(e instanceof ReadableStream){let t=e.getReader();try{for(;;){let{value:n,done:s}=await t.read();if(s)break;await r.write(n)}}finally{t.releaseLock()}}else await r.write(e)}async function _r(r,e,t,n,s){let a=n?.dryRun??!1,i=await Br(r),o=Yn(i);if(s)for(let p of s)o.push(p);if(o.length===0)return{deleted:0,retained:0};let f=await Re(r,o,[]),c=new Set;for await(let p of f.objects)c.add(p.hash);let l=await e.listObjectHashes(t),d=[];for(let p of l)c.has(p)||d.push(p);let u=await Br(r);return Zn(i,u)?a||d.length===0?{deleted:d.length,retained:c.size}:{deleted:await e.deleteObjects(t,d),retained:c.size}:{deleted:0,retained:c.size,aborted:!0}}async function Br(r){return r.refStore.listRefs()}function Yn(r){let e=new Set;for(let t of r)e.add(t.hash);return Array.from(e)}function Zn(r,e){if(r.length!==e.length)return!1;let t=new Map;for(let n of r)t.set(n.name,n.hash);for(let n of e)if(t.get(n.name)!==n.hash)return!1;return!0}var Te=class{repos=new Set;objects=new Map;refs=new Map;forks=new Map;hasRepo(e){return this.repos.has(e)}insertRepo(e){this.repos.add(e)}deleteRepo(e){this.repos.delete(e),this.objects.get(e)?.clear(),this.objects.delete(e),this.refs.get(e)?.clear(),this.refs.delete(e),this.forks.delete(e)}getObject(e,t){let n=this.getObjMap(e).get(t);return n?{type:n.type,content:new Uint8Array(n.content)}:null}putObject(e,t,n,s){let a=this.getObjMap(e);a.has(t)||a.set(t,{type:n,content:new Uint8Array(s)})}putObjects(e,t){let n=this.getObjMap(e);for(let s of t)n.has(s.hash)||n.set(s.hash,{type:s.type,content:new Uint8Array(s.content)})}hasObject(e,t){return this.getObjMap(e).has(t)}findObjectsByPrefix(e,t){let n=[];for(let s of this.getObjMap(e).keys())s.startsWith(t)&&n.push(s);return n}listObjectHashes(e){return Array.from(this.getObjMap(e).keys())}deleteObjects(e,t){let n=this.getObjMap(e),s=0;for(let a of t)n.delete(a)&&s++;return s}getRef(e,t){return this.getRefMap(e).get(t)??null}putRef(e,t,n){this.getRefMap(e).set(t,n)}removeRef(e,t){this.getRefMap(e).delete(t)}listRefs(e,t){let n=[];for(let[s,a]of this.getRefMap(e))t&&!s.startsWith(t)||n.push({name:s,ref:a});return n}atomicRefUpdate(e,t){let n=this.getRefMap(e);return t({getRef:s=>n.get(s)??null,putRef:(s,a)=>{n.set(s,a)},removeRef:s=>{n.delete(s)}})}forkRepo(e,t){this.forks.set(t,e)}getForkParent(e){return this.forks.get(e)??null}listForks(e){let t=[];for(let[n,s]of this.forks)s===e&&t.push(n);return t}repoIds(){return Array.from(this.repos)}getObjMap(e){let t=this.objects.get(e);return t||(t=new Map,this.objects.set(e,t)),t}getRefMap(e){let t=this.refs.get(e);return t||(t=new Map,this.refs.set(e,t)),t}};var Nr=new WeakMap,Jn={http:r=>({transport:"http",request:r}),ssh:r=>({transport:"ssh",username:r.username})};function Mr(r){if(r.length===0)return!1;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);if(n===0||n<32||n===127||n===92)return!1}let e=r.split("/");for(let t of e)if(t.length===0||t.charCodeAt(0)===46)return!1;return!0}function Qn(r={}){let e=r.storage??new Te,t=Er(e),n=r.resolve??(m=>m),s=r.autoCreate,{basePath:a}=r,i={maxRequestBytes:128*1024*1024,maxInflatedBytes:256*1024*1024,maxPackBytes:128*1024*1024,maxPackObjects:25e4,...r.receiveLimits},o={maxRequestBytes:10*1024*1024,maxInflatedBytes:20*1024*1024,...r.fetchLimits};async function f(m){if(!Mr(m))return null;let b=await n(m);if(b==null||b!==m&&!Mr(b))return null;let y=await t.repo(b);if(y)return{repo:y,repoId:b};if(!s)return null;let w=typeof s=="object"?{defaultBranch:s.defaultBranch}:void 0;return{repo:await t.createRepo(b,w),repoId:b}}let c=rs(r.policy,r.hooks),l=r.auth??Jn,d=r.packCache===!1?void 0:new ne(r.packCache?.maxBytes),u=r.onError===!1?void 0:r.onError??(m=>{let b=m instanceof Error?m.message:String(m);console.error(`[server] Internal error: ${b}`)}),h=!1,p=0,g=null,R=null;function P(){return h?!1:(p++,!0)}function A(){p--,h&&p===0&&g?.()}let x={async fetch(m){if(!P())return new Response("Service Unavailable",{status:503});let b;try{let y=Nr.get(m);if(y!==void 0)b=y;else{if(!l.http)return new Response("HTTP auth provider not configured",{status:501});let E=await l.http(m);if(E instanceof Response)return E;b=E}let w=new URL(m.url),O=decodeURIComponent(w.pathname);if(a){let E=a.replace(/\/+$/,"");if(!O.startsWith(E))return new Response("Not Found",{status:404});O=O.slice(E.length)}if(O.startsWith("/")||(O=`/${O}`),O.endsWith("/info/refs")&&m.method==="GET"){let E=w.searchParams.get("service");if(E!=="git-upload-pack"&&E!=="git-receive-pack")return new Response("Unsupported service",{status:403});let S=At(O,"/info/refs"),j=await f(S);if(!j)return new Response("Not Found",{status:404});if(Fr(m)&&E==="git-upload-pack"){let F=await W(j.repo,j.repoId,E,c,b);if(U(F))return ae(F);let T=Se();return new Response(T,{headers:{"Content-Type":`application/x-${E}-advertisement`,"Cache-Control":"no-cache"}})}let L=await W(j.repo,j.repoId,E,c,b);if(U(L))return ae(L);let H=wt(L.refs,E,L.headTarget);return new Response(H,{headers:{"Content-Type":`application/x-${E}-advertisement`,"Cache-Control":"no-cache"}})}if(O.endsWith("/git-upload-pack")&&m.method==="POST"){let E=At(O,"/git-upload-pack"),S=await f(E);if(!S)return new Response("Not Found",{status:404});let j;if(c?.advertiseRefs){let H=await W(S.repo,S.repoId,"git-upload-pack",c,b);if(U(H))return ae(H);j=Ee(H)}let v=await $r(m,o);if(Fr(m)){let H=pt(v),F="application/x-git-upload-pack-result";if(H.command==="ls-refs"){let T=await ve(S.repo,S.repoId,H.args,c,b);return U(T)?ae(T):new Response(T,{headers:{"Content-Type":F}})}if(H.command==="fetch"){let T=await je(S.repo,H.args,{cache:d,cacheKey:S.repoId,noDelta:r.packOptions?.noDelta,deltaWindow:r.packOptions?.deltaWindow,authorizedFetchSet:j});return U(T)?ae(T):new Response(T,{headers:{"Content-Type":F}})}return new Response(`unknown command: ${H.command}`,{status:400})}let L=await Pe(S.repo,v,{cache:d,cacheKey:S.repoId,noDelta:r.packOptions?.noDelta,deltaWindow:r.packOptions?.deltaWindow,authorizedFetchSet:j});return U(L)?ae(L):new Response(L,{headers:{"Content-Type":"application/x-git-upload-pack-result"}})}if(O.endsWith("/git-receive-pack")&&m.method==="POST"){let E=At(O,"/git-receive-pack"),S=await f(E);if(!S)return new Response("Not Found",{status:404});let j=await $r(m,i),v=await xt(S.repo,j,i);if(!v.sawFlush&&v.updates.length===0)return new Response("Bad Request",{status:400});let L=v.capabilities.includes("side-band-64k"),H=v.capabilities.includes("report-status");if(!v.unpackOk){if(H){let T=v.updates.map(G=>({name:G.ref,ok:!1,error:"unpack failed"}));return new Response(te(!1,T,L),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}return new Response(new Uint8Array(0),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}let{refResults:F}=await Oe({repo:S.repo,repoId:S.repoId,ingestResult:v,hooks:c,auth:b});if(H){let T=F.map(G=>({name:G.ref,ok:G.ok,error:G.error}));return new Response(te(!0,T,L),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}return new Response(new Uint8Array(0),{headers:{"Content-Type":"application/x-git-receive-pack-result"}})}return new Response("Not Found",{status:404})}catch(y){return y instanceof D?new Response(y.message,{status:y.status}):(u?.(y,b),new Response("Internal Server Error",{status:500}))}finally{A()}},async handleSession(m,b,y){if(!P())return b.writeStderr?.(new TextEncoder().encode(`fatal: server shutting down
65
+ `)),128;try{if(!l.ssh)return b.writeStderr?.(new TextEncoder().encode(`fatal: SSH auth provider not configured
66
+ `)),128;let w=await l.ssh(y??{});return await Hr(m,b,{resolveRepo:f,hooks:c,packCache:d,packOptions:r.packOptions,receiveLimits:i,fetchLimits:o,auth:w,onError:u?O=>u(O,w):void 0})}finally{A()}},async updateRefs(m,b){if(!P())throw new Error("Server is shutting down");try{let y=await x.requireRepo(m),w=await ze(y,b);return Ve(y,w)}finally{A()}},async commit(m,b){if(!P())throw new Error("Server is shutting down");try{let y=await x.requireRepo(m),w=await cr(y,b),O=`refs/heads/${b.branch}`,E=await ze(y,[{ref:O,newHash:w.hash,oldHash:w.parentHash}]),j=(await Ve(y,E)).refResults[0];if(!j?.ok)throw new Error(j?.error??"ref update failed");return w}finally{A()}},nodeHandler(m,b){let y=[],w=0,O=!1,j=new URL(m.url??"/","http://localhost").pathname.endsWith("/git-upload-pack")?o.maxRequestBytes:i.maxRequestBytes;m.on("data",v=>{if(!O){if(w+=v.byteLength,m.method!=="GET"&&m.method!=="HEAD"&&j!==void 0&&w>j){O=!0,y.length=0,b.writeHead(413),b.end("Request body too large");try{m.destroy?.()}catch{}return}y.push(new Uint8Array(v))}}),m.on("error",()=>{b.writeHead(500),b.end("Internal Server Error")}),m.on("end",()=>{O||es(x,m,y,b).catch(()=>{try{b.writeHead(500),b.end("Internal Server Error")}catch{}})})},createRepo:(m,b)=>t.createRepo(m,b),repo:m=>t.repo(m),async requireRepo(m){let b=await t.repo(m);if(!b)throw new Error(`Repository "${m}" not found`);return b},deleteRepo:m=>t.deleteRepo(m),async forkRepo(m,b,y){if(!P())throw new Error("Server is shutting down");try{return await t.forkRepo(m,b,y)}finally{A()}},async gc(m,b){if(!P())throw new Error("Server is shutting down");try{let y=await x.requireRepo(m),w;if(e.listForks&&e.getForkParent&&!await e.getForkParent(m)){let E=await e.listForks(m);if(E.length>0){w=[];for(let S of E){let j=await t.repo(S);if(!j)continue;let v=await j.refStore.listRefs();for(let L of v)w.push(L.hash)}}}return _r(y,e,m,b,w)}finally{A()}},get closed(){return h},asNetwork(m="http://git",b){return{allowed:[m.endsWith("/")?m:`${m}/`],fetch:(w,O)=>{let E=new Request(w,O);return b!==void 0&&Nr.set(E,b),x.fetch(E)}}},async close(m){if(h)return R??Promise.resolve();if(h=!0,d?.clear(),p!==0){if(R=new Promise(b=>{g=b}),m?.signal){if(m.signal.aborted){g();return}let b=()=>g?.();m.signal.addEventListener("abort",b,{once:!0}),R.then(()=>m.signal.removeEventListener("abort",b))}return R}}};return x}function ae(r){return new Response(r.message??"Forbidden",{status:403})}function Fr(r){let e=r.headers.get("git-protocol");return e!==null&&e.includes("version=2")}function At(r,e){let t=r.slice(0,-e.length);return t.startsWith("/")&&(t=t.slice(1)),t}async function $r(r,e){let t=r.headers.get("content-length");if(t){let a=Number(t);if(Number.isFinite(a)&&e.maxRequestBytes!==void 0&&a>e.maxRequestBytes)throw new D("Request body too large")}let n=await Wr(r.body,e.maxRequestBytes,"Request body too large"),s=r.headers.get("content-encoding");if(s==="gzip"||s==="x-gzip"){let a=new DecompressionStream("gzip"),i=a.writable.getWriter(),o=new Uint8Array(n.byteLength);return o.set(n),await i.write(o),await i.close(),Wr(a.readable,e.maxInflatedBytes,"Decompressed body too large")}return n}async function Wr(r,e,t){if(!r)return new Uint8Array(0);let n=r.getReader(),s=[],a=0;try{for(;;){let{value:f,done:c}=await n.read();if(c)break;if(f){if(a+=f.byteLength,e!==void 0&&a>e)throw new D(t);s.push(f)}}}finally{n.releaseLock()}if(s.length===0)return new Uint8Array(0);let i=new Uint8Array(a),o=0;for(let f of s)i.set(f,o),o+=f.byteLength;return i}async function es(r,e,t,n){let s=typeof e.headers.host=="string"?e.headers.host:"localhost",a=new URL(e.url??"/",`http://${s}`),i=new Headers;for(let[h,p]of Object.entries(e.headers))if(p!==void 0)if(Array.isArray(p))for(let g of p)i.append(h,g);else i.set(h,p);let o=e.method??"GET",f;if(o!=="GET"&&o!=="HEAD"){let h=0;for(let R of t)h+=R.byteLength;let p=new Uint8Array(h),g=0;for(let R of t)p.set(R,g),g+=R.byteLength;f=p}let c=new Request(a.href,{method:o,headers:i,body:f}),l=await r.fetch(c),d={};l.headers.forEach((h,p)=>{d[p]=h}),n.writeHead(l.status,d);let u=new Uint8Array(await l.arrayBuffer());u.byteLength>0&&n.write(u),n.end()}function ts(r){let{protectedBranches:e=[],denyNonFastForward:t=!1,denyDeletes:n=!1,immutableTags:s=!1}=r,a=new Set(e.map(o=>o.startsWith("refs/")?o:`refs/heads/${o}`)),i={};return a.size>0&&(i.preReceive=async o=>{for(let f of o.updates)if(a.has(f.ref)){if(f.isDelete)return{reject:!0,message:`cannot delete protected branch ${f.ref}`};if(!f.isCreate&&!f.isFF)return{reject:!0,message:`non-fast-forward push to protected branch ${f.ref}`}}}),(t||n||s)&&(i.update=async o=>{if(n&&o.update.isDelete)return{reject:!0,message:"ref deletion denied"};if(s&&o.update.ref.startsWith("refs/tags/")){if(o.update.isDelete)return{reject:!0,message:"tag deletion denied"};if(!o.update.isCreate)return{reject:!0,message:"tag overwrite denied"}}if(t&&!o.update.isCreate&&!o.update.isDelete&&!o.update.isFF)return{reject:!0,message:"non-fast-forward"}}),i}function rs(r,e){let t=r?ts(r):void 0;return t&&e?Gr(t,e):t??e}function Gr(...r){let e=r.filter(o=>o!=null);if(e.length===0)return{};if(e.length===1)return e[0];let t={},n=e.filter(o=>o.preReceive).map(o=>o.preReceive);n.length>0&&(t.preReceive=async o=>{for(let f of n){let c=await f(o);if(U(c))return c}});let s=e.filter(o=>o.update).map(o=>o.update);s.length>0&&(t.update=async o=>{for(let f of s){let c=await f(o);if(U(c))return c}});let a=e.filter(o=>o.postReceive).map(o=>o.postReceive);a.length>0&&(t.postReceive=async o=>{for(let f of a)try{await f(o)}catch{}});let i=e.filter(o=>o.advertiseRefs).map(o=>o.advertiseRefs);return i.length>0&&(t.advertiseRefs=async o=>{let f=o.refs;for(let c of i){let l=await c({...o,refs:f});if(U(l))return l;l&&(f=l)}return f}),t}var ns=`
67
67
  CREATE TABLE IF NOT EXISTS git_repos (
68
68
  id TEXT PRIMARY KEY
69
69
  );
@@ -89,7 +89,7 @@ CREATE TABLE IF NOT EXISTS git_forks (
89
89
  repo_id TEXT PRIMARY KEY,
90
90
  parent_id TEXT NOT NULL
91
91
  );
92
- `;function Kn(r){return{repoInsert:r.prepare("INSERT INTO git_repos (id) VALUES (?)"),repoExists:r.prepare("SELECT 1 FROM git_repos WHERE id = ? LIMIT 1"),repoDelete:r.prepare("DELETE FROM git_repos WHERE id = ?"),objInsert:r.prepare("INSERT OR IGNORE INTO git_objects (repo_id, hash, type, content) VALUES (?, ?, ?, ?)"),objRead:r.prepare("SELECT type, content FROM git_objects WHERE repo_id = ? AND hash = ?"),objExists:r.prepare("SELECT 1 FROM git_objects WHERE repo_id = ? AND hash = ? LIMIT 1"),objPrefix:r.prepare("SELECT hash FROM git_objects WHERE repo_id = ? AND hash GLOB ?"),objDeleteAll:r.prepare("DELETE FROM git_objects WHERE repo_id = ?"),objListHashes:r.prepare("SELECT hash FROM git_objects WHERE repo_id = ?"),objDelete:r.prepare("DELETE FROM git_objects WHERE repo_id = ? AND hash = ?"),refRead:r.prepare("SELECT type, hash, target FROM git_refs WHERE repo_id = ? AND name = ?"),refWrite:r.prepare("INSERT OR REPLACE INTO git_refs (repo_id, name, type, hash, target) VALUES (?, ?, ?, ?, ?)"),refDelete:r.prepare("DELETE FROM git_refs WHERE repo_id = ? AND name = ?"),refList:r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ? AND name GLOB ?"),refListAll:r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ?"),refDeleteAll:r.prepare("DELETE FROM git_refs WHERE repo_id = ?"),forkInsert:r.prepare("INSERT INTO git_forks (repo_id, parent_id) VALUES (?, ?)"),forkGetParent:r.prepare("SELECT parent_id FROM git_forks WHERE repo_id = ?"),forkListChildren:r.prepare("SELECT repo_id FROM git_forks WHERE parent_id = ?"),forkDelete:r.prepare("DELETE FROM git_forks WHERE repo_id = ?")}}var wt=class{constructor(e){this.db=e;e.run(zn),this.stmts=Kn(e),this.batchInsertTx=e.transaction(t=>{for(let n of t)this.stmts.objInsert.run(n.repoId,n.hash,n.type,n.content)}),this.batchDeleteTx=e.transaction((t,n,s)=>{let a=0;for(let o of n)this.stmts.objDelete.run(t,o),a++;s(a)})}stmts;batchInsertTx;batchDeleteTx;hasRepo(e){return this.stmts.repoExists.get(e)!==null}insertRepo(e){this.stmts.repoInsert.run(e)}deleteRepo(e){this.stmts.repoDelete.run(e),this.stmts.objDeleteAll.run(e),this.stmts.refDeleteAll.run(e),this.stmts.forkDelete.run(e)}getObject(e,t){let n=this.stmts.objRead.get(e,t);return n?{type:n.type,content:new Uint8Array(n.content)}:null}putObject(e,t,n,s){this.stmts.objInsert.run(e,t,n,s)}putObjects(e,t){this.batchInsertTx(t.map(n=>({repoId:e,...n})))}hasObject(e,t){return this.stmts.objExists.get(e,t)!==null}findObjectsByPrefix(e,t){return this.stmts.objPrefix.all(e,`${t}*`).map(s=>s.hash)}listObjectHashes(e){return this.stmts.objListHashes.all(e).map(n=>n.hash)}deleteObjects(e,t){if(t.length===0)return 0;let n=0;return this.batchDeleteTx(e,t,s=>{n+=s}),n}getRef(e,t){let n=this.stmts.refRead.get(e,t);return gt(n)}putRef(e,t,n){n.type==="symbolic"?this.stmts.refWrite.run(e,t,"symbolic",null,n.target):this.stmts.refWrite.run(e,t,"direct",n.hash,null)}removeRef(e,t){this.stmts.refDelete.run(e,t)}listRefs(e,t){return(t?this.stmts.refList.all(e,`${t}*`):this.stmts.refListAll.all(e)).flatMap(s=>{let a=gt(s);return a?[{name:s.name,ref:a}]:[]})}atomicRefUpdate(e,t){let n=this.stmts;return this.db.transaction(()=>t({getRef:a=>gt(n.refRead.get(e,a)),putRef:(a,o)=>{o.type==="symbolic"?n.refWrite.run(e,a,"symbolic",null,o.target):n.refWrite.run(e,a,"direct",o.hash,null)},removeRef:a=>{n.refDelete.run(e,a)}}))()}forkRepo(e,t){this.stmts.forkInsert.run(t,e)}getForkParent(e){return this.stmts.forkGetParent.get(e)?.parent_id??null}listForks(e){return this.stmts.forkListChildren.all(e).map(n=>n.repo_id)}};function gt(r){return r?r.type==="symbolic"&&r.target?{type:"symbolic",target:r.target}:r.type==="direct"&&r.hash?{type:"direct",hash:r.hash}:null:null}var Xn=`
92
+ `;function ss(r){return{repoInsert:r.prepare("INSERT INTO git_repos (id) VALUES (?)"),repoExists:r.prepare("SELECT 1 FROM git_repos WHERE id = ? LIMIT 1"),repoDelete:r.prepare("DELETE FROM git_repos WHERE id = ?"),objInsert:r.prepare("INSERT OR IGNORE INTO git_objects (repo_id, hash, type, content) VALUES (?, ?, ?, ?)"),objRead:r.prepare("SELECT type, content FROM git_objects WHERE repo_id = ? AND hash = ?"),objExists:r.prepare("SELECT 1 FROM git_objects WHERE repo_id = ? AND hash = ? LIMIT 1"),objPrefix:r.prepare("SELECT hash FROM git_objects WHERE repo_id = ? AND hash GLOB ?"),objDeleteAll:r.prepare("DELETE FROM git_objects WHERE repo_id = ?"),objListHashes:r.prepare("SELECT hash FROM git_objects WHERE repo_id = ?"),objDelete:r.prepare("DELETE FROM git_objects WHERE repo_id = ? AND hash = ?"),refRead:r.prepare("SELECT type, hash, target FROM git_refs WHERE repo_id = ? AND name = ?"),refWrite:r.prepare("INSERT OR REPLACE INTO git_refs (repo_id, name, type, hash, target) VALUES (?, ?, ?, ?, ?)"),refDelete:r.prepare("DELETE FROM git_refs WHERE repo_id = ? AND name = ?"),refList:r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ? AND name GLOB ?"),refListAll:r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ?"),refDeleteAll:r.prepare("DELETE FROM git_refs WHERE repo_id = ?"),forkInsert:r.prepare("INSERT INTO git_forks (repo_id, parent_id) VALUES (?, ?)"),forkGetParent:r.prepare("SELECT parent_id FROM git_forks WHERE repo_id = ?"),forkListChildren:r.prepare("SELECT repo_id FROM git_forks WHERE parent_id = ?"),forkDelete:r.prepare("DELETE FROM git_forks WHERE repo_id = ?")}}var Pt=class{constructor(e){this.db=e;e.run(ns),this.stmts=ss(e),this.batchInsertTx=e.transaction(t=>{for(let n of t)this.stmts.objInsert.run(n.repoId,n.hash,n.type,n.content)}),this.batchDeleteTx=e.transaction((t,n,s)=>{let a=0;for(let i of n)this.stmts.objDelete.run(t,i),a++;s(a)})}stmts;batchInsertTx;batchDeleteTx;hasRepo(e){return this.stmts.repoExists.get(e)!==null}insertRepo(e){this.stmts.repoInsert.run(e)}deleteRepo(e){this.stmts.repoDelete.run(e),this.stmts.objDeleteAll.run(e),this.stmts.refDeleteAll.run(e),this.stmts.forkDelete.run(e)}getObject(e,t){let n=this.stmts.objRead.get(e,t);return n?{type:n.type,content:new Uint8Array(n.content)}:null}putObject(e,t,n,s){this.stmts.objInsert.run(e,t,n,s)}putObjects(e,t){this.batchInsertTx(t.map(n=>({repoId:e,...n})))}hasObject(e,t){return this.stmts.objExists.get(e,t)!==null}findObjectsByPrefix(e,t){return this.stmts.objPrefix.all(e,`${t}*`).map(s=>s.hash)}listObjectHashes(e){return this.stmts.objListHashes.all(e).map(n=>n.hash)}deleteObjects(e,t){if(t.length===0)return 0;let n=0;return this.batchDeleteTx(e,t,s=>{n+=s}),n}getRef(e,t){let n=this.stmts.refRead.get(e,t);return Et(n)}putRef(e,t,n){n.type==="symbolic"?this.stmts.refWrite.run(e,t,"symbolic",null,n.target):this.stmts.refWrite.run(e,t,"direct",n.hash,null)}removeRef(e,t){this.stmts.refDelete.run(e,t)}listRefs(e,t){return(t?this.stmts.refList.all(e,`${t}*`):this.stmts.refListAll.all(e)).flatMap(s=>{let a=Et(s);return a?[{name:s.name,ref:a}]:[]})}atomicRefUpdate(e,t){let n=this.stmts;return this.db.transaction(()=>t({getRef:a=>Et(n.refRead.get(e,a)),putRef:(a,i)=>{i.type==="symbolic"?n.refWrite.run(e,a,"symbolic",null,i.target):n.refWrite.run(e,a,"direct",i.hash,null)},removeRef:a=>{n.refDelete.run(e,a)}}))()}forkRepo(e,t){this.stmts.forkInsert.run(t,e)}getForkParent(e){return this.stmts.forkGetParent.get(e)?.parent_id??null}listForks(e){return this.stmts.forkListChildren.all(e).map(n=>n.repo_id)}};function Et(r){return r?r.type==="symbolic"&&r.target?{type:"symbolic",target:r.target}:r.type==="direct"&&r.hash?{type:"direct",hash:r.hash}:null:null}var as=`
93
93
  CREATE TABLE IF NOT EXISTS git_repos (
94
94
  id TEXT PRIMARY KEY
95
95
  );
@@ -115,7 +115,7 @@ CREATE TABLE IF NOT EXISTS git_forks (
115
115
  repo_id TEXT PRIMARY KEY,
116
116
  parent_id TEXT NOT NULL
117
117
  );
118
- `;function I(r){return{run:(...e)=>{r.run(...e)},get:(...e)=>r.get(...e)??null,all:(...e)=>r.all(...e)}}function Yn(r){return{repoInsert:I(r.prepare("INSERT INTO git_repos (id) VALUES (?)")),repoExists:I(r.prepare("SELECT 1 FROM git_repos WHERE id = ? LIMIT 1")),repoDelete:I(r.prepare("DELETE FROM git_repos WHERE id = ?")),objInsert:I(r.prepare("INSERT OR IGNORE INTO git_objects (repo_id, hash, type, content) VALUES (?, ?, ?, ?)")),objRead:I(r.prepare("SELECT type, content FROM git_objects WHERE repo_id = ? AND hash = ?")),objExists:I(r.prepare("SELECT 1 FROM git_objects WHERE repo_id = ? AND hash = ? LIMIT 1")),objPrefix:I(r.prepare("SELECT hash FROM git_objects WHERE repo_id = ? AND hash GLOB ?")),objDeleteAll:I(r.prepare("DELETE FROM git_objects WHERE repo_id = ?")),objListHashes:I(r.prepare("SELECT hash FROM git_objects WHERE repo_id = ?")),objDelete:I(r.prepare("DELETE FROM git_objects WHERE repo_id = ? AND hash = ?")),refRead:I(r.prepare("SELECT type, hash, target FROM git_refs WHERE repo_id = ? AND name = ?")),refWrite:I(r.prepare("INSERT OR REPLACE INTO git_refs (repo_id, name, type, hash, target) VALUES (?, ?, ?, ?, ?)")),refDelete:I(r.prepare("DELETE FROM git_refs WHERE repo_id = ? AND name = ?")),refList:I(r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ? AND name GLOB ?")),refListAll:I(r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ?")),refDeleteAll:I(r.prepare("DELETE FROM git_refs WHERE repo_id = ?")),forkInsert:I(r.prepare("INSERT INTO git_forks (repo_id, parent_id) VALUES (?, ?)")),forkGetParent:I(r.prepare("SELECT parent_id FROM git_forks WHERE repo_id = ?")),forkListChildren:I(r.prepare("SELECT repo_id FROM git_forks WHERE parent_id = ?")),forkDelete:I(r.prepare("DELETE FROM git_forks WHERE repo_id = ?"))}}var xt=class{constructor(e){this.db=e;e.exec(Xn),this.stmts=Yn(e),this.batchInsertTx=e.transaction(t=>{for(let n of t)this.stmts.objInsert.run(n.repoId,n.hash,n.type,n.content)}),this.batchDeleteTx=e.transaction((t,n,s)=>{let a=0;for(let o of n)this.stmts.objDelete.run(t,o),a++;s(a)})}stmts;batchInsertTx;batchDeleteTx;hasRepo(e){return this.stmts.repoExists.get(e)!==null}insertRepo(e){this.stmts.repoInsert.run(e)}deleteRepo(e){this.stmts.repoDelete.run(e),this.stmts.objDeleteAll.run(e),this.stmts.refDeleteAll.run(e),this.stmts.forkDelete.run(e)}getObject(e,t){let n=this.stmts.objRead.get(e,t);return n?{type:n.type,content:new Uint8Array(n.content)}:null}putObject(e,t,n,s){this.stmts.objInsert.run(e,t,n,s)}putObjects(e,t){this.batchInsertTx(t.map(n=>({repoId:e,...n})))}hasObject(e,t){return this.stmts.objExists.get(e,t)!==null}findObjectsByPrefix(e,t){return this.stmts.objPrefix.all(e,`${t}*`).map(s=>s.hash)}listObjectHashes(e){return this.stmts.objListHashes.all(e).map(n=>n.hash)}deleteObjects(e,t){if(t.length===0)return 0;let n=0;return this.batchDeleteTx(e,t,s=>{n+=s}),n}getRef(e,t){let n=this.stmts.refRead.get(e,t);return Rt(n)}putRef(e,t,n){n.type==="symbolic"?this.stmts.refWrite.run(e,t,"symbolic",null,n.target):this.stmts.refWrite.run(e,t,"direct",n.hash,null)}removeRef(e,t){this.stmts.refDelete.run(e,t)}listRefs(e,t){return(t?this.stmts.refList.all(e,`${t}*`):this.stmts.refListAll.all(e)).flatMap(s=>{let a=Rt(s);return a?[{name:s.name,ref:a}]:[]})}atomicRefUpdate(e,t){let n=this.stmts;return this.db.transaction(()=>t({getRef:a=>Rt(n.refRead.get(e,a)),putRef:(a,o)=>{o.type==="symbolic"?n.refWrite.run(e,a,"symbolic",null,o.target):n.refWrite.run(e,a,"direct",o.hash,null)},removeRef:a=>{n.refDelete.run(e,a)}}))()}forkRepo(e,t){this.stmts.forkInsert.run(t,e)}getForkParent(e){return this.stmts.forkGetParent.get(e)?.parent_id??null}listForks(e){return this.stmts.forkListChildren.all(e).map(n=>n.repo_id)}};function Rt(r){return r?r.type==="symbolic"&&r.target?{type:"symbolic",target:r.target}:r.type==="direct"&&r.hash?{type:"direct",hash:r.hash}:null:null}var Zn=`
118
+ `;function C(r){return{run:(...e)=>{r.run(...e)},get:(...e)=>r.get(...e)??null,all:(...e)=>r.all(...e)}}function is(r){return{repoInsert:C(r.prepare("INSERT INTO git_repos (id) VALUES (?)")),repoExists:C(r.prepare("SELECT 1 FROM git_repos WHERE id = ? LIMIT 1")),repoDelete:C(r.prepare("DELETE FROM git_repos WHERE id = ?")),objInsert:C(r.prepare("INSERT OR IGNORE INTO git_objects (repo_id, hash, type, content) VALUES (?, ?, ?, ?)")),objRead:C(r.prepare("SELECT type, content FROM git_objects WHERE repo_id = ? AND hash = ?")),objExists:C(r.prepare("SELECT 1 FROM git_objects WHERE repo_id = ? AND hash = ? LIMIT 1")),objPrefix:C(r.prepare("SELECT hash FROM git_objects WHERE repo_id = ? AND hash GLOB ?")),objDeleteAll:C(r.prepare("DELETE FROM git_objects WHERE repo_id = ?")),objListHashes:C(r.prepare("SELECT hash FROM git_objects WHERE repo_id = ?")),objDelete:C(r.prepare("DELETE FROM git_objects WHERE repo_id = ? AND hash = ?")),refRead:C(r.prepare("SELECT type, hash, target FROM git_refs WHERE repo_id = ? AND name = ?")),refWrite:C(r.prepare("INSERT OR REPLACE INTO git_refs (repo_id, name, type, hash, target) VALUES (?, ?, ?, ?, ?)")),refDelete:C(r.prepare("DELETE FROM git_refs WHERE repo_id = ? AND name = ?")),refList:C(r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ? AND name GLOB ?")),refListAll:C(r.prepare("SELECT name, type, hash, target FROM git_refs WHERE repo_id = ?")),refDeleteAll:C(r.prepare("DELETE FROM git_refs WHERE repo_id = ?")),forkInsert:C(r.prepare("INSERT INTO git_forks (repo_id, parent_id) VALUES (?, ?)")),forkGetParent:C(r.prepare("SELECT parent_id FROM git_forks WHERE repo_id = ?")),forkListChildren:C(r.prepare("SELECT repo_id FROM git_forks WHERE parent_id = ?")),forkDelete:C(r.prepare("DELETE FROM git_forks WHERE repo_id = ?"))}}var St=class{constructor(e){this.db=e;e.exec(as),this.stmts=is(e),this.batchInsertTx=e.transaction(t=>{for(let n of t)this.stmts.objInsert.run(n.repoId,n.hash,n.type,n.content)}),this.batchDeleteTx=e.transaction((t,n,s)=>{let a=0;for(let i of n)this.stmts.objDelete.run(t,i),a++;s(a)})}stmts;batchInsertTx;batchDeleteTx;hasRepo(e){return this.stmts.repoExists.get(e)!==null}insertRepo(e){this.stmts.repoInsert.run(e)}deleteRepo(e){this.stmts.repoDelete.run(e),this.stmts.objDeleteAll.run(e),this.stmts.refDeleteAll.run(e),this.stmts.forkDelete.run(e)}getObject(e,t){let n=this.stmts.objRead.get(e,t);return n?{type:n.type,content:new Uint8Array(n.content)}:null}putObject(e,t,n,s){this.stmts.objInsert.run(e,t,n,s)}putObjects(e,t){this.batchInsertTx(t.map(n=>({repoId:e,...n})))}hasObject(e,t){return this.stmts.objExists.get(e,t)!==null}findObjectsByPrefix(e,t){return this.stmts.objPrefix.all(e,`${t}*`).map(s=>s.hash)}listObjectHashes(e){return this.stmts.objListHashes.all(e).map(n=>n.hash)}deleteObjects(e,t){if(t.length===0)return 0;let n=0;return this.batchDeleteTx(e,t,s=>{n+=s}),n}getRef(e,t){let n=this.stmts.refRead.get(e,t);return Ot(n)}putRef(e,t,n){n.type==="symbolic"?this.stmts.refWrite.run(e,t,"symbolic",null,n.target):this.stmts.refWrite.run(e,t,"direct",n.hash,null)}removeRef(e,t){this.stmts.refDelete.run(e,t)}listRefs(e,t){return(t?this.stmts.refList.all(e,`${t}*`):this.stmts.refListAll.all(e)).flatMap(s=>{let a=Ot(s);return a?[{name:s.name,ref:a}]:[]})}atomicRefUpdate(e,t){let n=this.stmts;return this.db.transaction(()=>t({getRef:a=>Ot(n.refRead.get(e,a)),putRef:(a,i)=>{i.type==="symbolic"?n.refWrite.run(e,a,"symbolic",null,i.target):n.refWrite.run(e,a,"direct",i.hash,null)},removeRef:a=>{n.refDelete.run(e,a)}}))()}forkRepo(e,t){this.stmts.forkInsert.run(t,e)}getForkParent(e){return this.stmts.forkGetParent.get(e)?.parent_id??null}listForks(e){return this.stmts.forkListChildren.all(e).map(n=>n.repo_id)}};function Ot(r){return r?r.type==="symbolic"&&r.target?{type:"symbolic",target:r.target}:r.type==="direct"&&r.hash?{type:"direct",hash:r.hash}:null:null}var os=`
119
119
  CREATE TABLE IF NOT EXISTS git_repos (
120
120
  id TEXT PRIMARY KEY
121
121
  );
@@ -141,5 +141,5 @@ CREATE TABLE IF NOT EXISTS git_forks (
141
141
  repo_id TEXT PRIMARY KEY,
142
142
  parent_id TEXT NOT NULL
143
143
  );
144
- `,v={repoInsert:"INSERT INTO git_repos (id) VALUES ($1)",repoExists:"SELECT 1 FROM git_repos WHERE id = $1 LIMIT 1",repoDelete:"DELETE FROM git_repos WHERE id = $1",objInsert:"INSERT INTO git_objects (repo_id, hash, type, content) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING",objRead:"SELECT type, content FROM git_objects WHERE repo_id = $1 AND hash = $2",objExists:"SELECT 1 FROM git_objects WHERE repo_id = $1 AND hash = $2 LIMIT 1",objPrefix:"SELECT hash FROM git_objects WHERE repo_id = $1 AND hash LIKE $2",objDeleteAll:"DELETE FROM git_objects WHERE repo_id = $1",objListHashes:"SELECT hash FROM git_objects WHERE repo_id = $1",refRead:"SELECT type, hash, target FROM git_refs WHERE repo_id = $1 AND name = $2",refReadForUpdate:"SELECT type, hash, target FROM git_refs WHERE repo_id = $1 AND name = $2 FOR UPDATE",refWrite:`INSERT INTO git_refs (repo_id, name, type, hash, target) VALUES ($1, $2, $3, $4, $5)
145
- ON CONFLICT (repo_id, name) DO UPDATE SET type = EXCLUDED.type, hash = EXCLUDED.hash, target = EXCLUDED.target`,refDelete:"DELETE FROM git_refs WHERE repo_id = $1 AND name = $2",refList:"SELECT name, type, hash, target FROM git_refs WHERE repo_id = $1 AND name LIKE $2",refListAll:"SELECT name, type, hash, target FROM git_refs WHERE repo_id = $1",refDeleteAll:"DELETE FROM git_refs WHERE repo_id = $1",forkInsert:"INSERT INTO git_forks (repo_id, parent_id) VALUES ($1, $2)",forkGetParent:"SELECT parent_id FROM git_forks WHERE repo_id = $1",forkListChildren:"SELECT repo_id FROM git_forks WHERE parent_id = $1",forkDelete:"DELETE FROM git_forks WHERE repo_id = $1"},kt=class r{constructor(e){this.pool=e}static async create(e){return await e.query(Zn),new r(e)}async transaction(e){let t=await this.pool.connect();try{await t.query("BEGIN");let n=await e((s,a)=>t.query(s,a));return await t.query("COMMIT"),n}catch(n){throw await t.query("ROLLBACK"),n}finally{t.release()}}async hasRepo(e){let{rows:t}=await this.pool.query(v.repoExists,[e]);return t.length>0}async insertRepo(e){await this.pool.query(v.repoInsert,[e])}async deleteRepo(e){await this.pool.query(v.repoDelete,[e]),await this.pool.query(v.objDeleteAll,[e]),await this.pool.query(v.refDeleteAll,[e]),await this.pool.query(v.forkDelete,[e])}async getObject(e,t){let{rows:n}=await this.pool.query(v.objRead,[e,t]),s=n[0];return s?{type:s.type,content:new Uint8Array(s.content)}:null}async putObject(e,t,n,s){await this.pool.query(v.objInsert,[e,t,n,s])}async putObjects(e,t){await this.transaction(async n=>{for(let s of t)await n(v.objInsert,[e,s.hash,s.type,s.content])})}async hasObject(e,t){let{rows:n}=await this.pool.query(v.objExists,[e,t]);return n.length>0}async findObjectsByPrefix(e,t){let{rows:n}=await this.pool.query(v.objPrefix,[e,`${t}%`]);return n.map(s=>s.hash)}async listObjectHashes(e){let{rows:t}=await this.pool.query(v.objListHashes,[e]);return t.map(n=>n.hash)}async deleteObjects(e,t){if(t.length===0)return 0;let{rows:n}=await this.pool.query("DELETE FROM git_objects WHERE repo_id = $1 AND hash = ANY($2::text[]) RETURNING hash",[e,Array.from(t)]);return n.length}async getRef(e,t){let{rows:n}=await this.pool.query(v.refRead,[e,t]);return Et(n[0]??null)}async putRef(e,t,n){n.type==="symbolic"?await this.pool.query(v.refWrite,[e,t,"symbolic",null,n.target]):await this.pool.query(v.refWrite,[e,t,"direct",n.hash,null])}async removeRef(e,t){await this.pool.query(v.refDelete,[e,t])}async listRefs(e,t){let n;return t?{rows:n}=await this.pool.query(v.refList,[e,`${t}%`]):{rows:n}=await this.pool.query(v.refListAll,[e]),n.flatMap(s=>{let a=Et(s);return a?[{name:s.name,ref:a}]:[]})}async atomicRefUpdate(e,t){return this.transaction(async n=>t({getRef:async s=>{let{rows:a}=await n(v.refReadForUpdate,[e,s]);return Et(a[0]??null)},putRef:async(s,a)=>{a.type==="symbolic"?await n(v.refWrite,[e,s,"symbolic",null,a.target]):await n(v.refWrite,[e,s,"direct",a.hash,null])},removeRef:async s=>{await n(v.refDelete,[e,s])}}))}async forkRepo(e,t){await this.pool.query(v.forkInsert,[t,e])}async getForkParent(e){let{rows:t}=await this.pool.query(v.forkGetParent,[e]);return t[0]?.parent_id??null}async listForks(e){let{rows:t}=await this.pool.query(v.forkListChildren,[e]);return t.map(n=>n.repo_id)}};function Et(r){return r?r.type==="symbolic"&&r.target?{type:"symbolic",target:r.target}:r.type==="direct"&&r.hash?{type:"direct",hash:r.hash}:null:null}export{xt as BetterSqlite3Storage,wt as BunSqliteStorage,Pe as MemoryStorage,kt as PgStorage,G as advertiseRefsWithHooks,Be as applyCasRefUpdates,Re as applyReceivePack,lt as buildRefAdvertisementBytes,pt as buildRefListBytes,Me as buildRefListPktLines,it as buildV2CapabilityAdvertisement,xe as buildV2CapabilityAdvertisementBytes,ee as buildV2FetchResponse,ct as buildV2LsRefsResponse,xr as collectRefs,_r as composeHooks,Wn as createServer,Ee as handleLsRefs,we as handleUploadPack,ke as handleV2Fetch,dt as ingestReceivePack,ut as ingestReceivePackFromStream,ot as parseV2CommandRequest,ft as parseV2FetchArgs,$e as resolveRefUpdates};
144
+ `,I={repoInsert:"INSERT INTO git_repos (id) VALUES ($1)",repoExists:"SELECT 1 FROM git_repos WHERE id = $1 LIMIT 1",repoDelete:"DELETE FROM git_repos WHERE id = $1",objInsert:"INSERT INTO git_objects (repo_id, hash, type, content) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING",objRead:"SELECT type, content FROM git_objects WHERE repo_id = $1 AND hash = $2",objExists:"SELECT 1 FROM git_objects WHERE repo_id = $1 AND hash = $2 LIMIT 1",objPrefix:"SELECT hash FROM git_objects WHERE repo_id = $1 AND hash LIKE $2",objDeleteAll:"DELETE FROM git_objects WHERE repo_id = $1",objListHashes:"SELECT hash FROM git_objects WHERE repo_id = $1",refRead:"SELECT type, hash, target FROM git_refs WHERE repo_id = $1 AND name = $2",refReadForUpdate:"SELECT type, hash, target FROM git_refs WHERE repo_id = $1 AND name = $2 FOR UPDATE",refWrite:`INSERT INTO git_refs (repo_id, name, type, hash, target) VALUES ($1, $2, $3, $4, $5)
145
+ ON CONFLICT (repo_id, name) DO UPDATE SET type = EXCLUDED.type, hash = EXCLUDED.hash, target = EXCLUDED.target`,refDelete:"DELETE FROM git_refs WHERE repo_id = $1 AND name = $2",refList:"SELECT name, type, hash, target FROM git_refs WHERE repo_id = $1 AND name LIKE $2",refListAll:"SELECT name, type, hash, target FROM git_refs WHERE repo_id = $1",refDeleteAll:"DELETE FROM git_refs WHERE repo_id = $1",forkInsert:"INSERT INTO git_forks (repo_id, parent_id) VALUES ($1, $2)",forkGetParent:"SELECT parent_id FROM git_forks WHERE repo_id = $1",forkListChildren:"SELECT repo_id FROM git_forks WHERE parent_id = $1",forkDelete:"DELETE FROM git_forks WHERE repo_id = $1"},jt=class r{constructor(e){this.pool=e}static async create(e){return await e.query(os),new r(e)}async transaction(e){let t=await this.pool.connect();try{await t.query("BEGIN");let n=await e((s,a)=>t.query(s,a));return await t.query("COMMIT"),n}catch(n){throw await t.query("ROLLBACK"),n}finally{t.release()}}async hasRepo(e){let{rows:t}=await this.pool.query(I.repoExists,[e]);return t.length>0}async insertRepo(e){await this.pool.query(I.repoInsert,[e])}async deleteRepo(e){await this.pool.query(I.repoDelete,[e]),await this.pool.query(I.objDeleteAll,[e]),await this.pool.query(I.refDeleteAll,[e]),await this.pool.query(I.forkDelete,[e])}async getObject(e,t){let{rows:n}=await this.pool.query(I.objRead,[e,t]),s=n[0];return s?{type:s.type,content:new Uint8Array(s.content)}:null}async putObject(e,t,n,s){await this.pool.query(I.objInsert,[e,t,n,s])}async putObjects(e,t){await this.transaction(async n=>{for(let s of t)await n(I.objInsert,[e,s.hash,s.type,s.content])})}async hasObject(e,t){let{rows:n}=await this.pool.query(I.objExists,[e,t]);return n.length>0}async findObjectsByPrefix(e,t){let{rows:n}=await this.pool.query(I.objPrefix,[e,`${t}%`]);return n.map(s=>s.hash)}async listObjectHashes(e){let{rows:t}=await this.pool.query(I.objListHashes,[e]);return t.map(n=>n.hash)}async deleteObjects(e,t){if(t.length===0)return 0;let{rows:n}=await this.pool.query("DELETE FROM git_objects WHERE repo_id = $1 AND hash = ANY($2::text[]) RETURNING hash",[e,Array.from(t)]);return n.length}async getRef(e,t){let{rows:n}=await this.pool.query(I.refRead,[e,t]);return vt(n[0]??null)}async putRef(e,t,n){n.type==="symbolic"?await this.pool.query(I.refWrite,[e,t,"symbolic",null,n.target]):await this.pool.query(I.refWrite,[e,t,"direct",n.hash,null])}async removeRef(e,t){await this.pool.query(I.refDelete,[e,t])}async listRefs(e,t){let n;return t?{rows:n}=await this.pool.query(I.refList,[e,`${t}%`]):{rows:n}=await this.pool.query(I.refListAll,[e]),n.flatMap(s=>{let a=vt(s);return a?[{name:s.name,ref:a}]:[]})}async atomicRefUpdate(e,t){return this.transaction(async n=>t({getRef:async s=>{let{rows:a}=await n(I.refReadForUpdate,[e,s]);return vt(a[0]??null)},putRef:async(s,a)=>{a.type==="symbolic"?await n(I.refWrite,[e,s,"symbolic",null,a.target]):await n(I.refWrite,[e,s,"direct",a.hash,null])},removeRef:async s=>{await n(I.refDelete,[e,s])}}))}async forkRepo(e,t){await this.pool.query(I.forkInsert,[t,e])}async getForkParent(e){let{rows:t}=await this.pool.query(I.forkGetParent,[e]);return t[0]?.parent_id??null}async listForks(e){let{rows:t}=await this.pool.query(I.forkListChildren,[e]);return t.map(n=>n.repo_id)}};function vt(r){return r?r.type==="symbolic"&&r.target?{type:"symbolic",target:r.target}:r.type==="direct"&&r.hash?{type:"direct",hash:r.hash}:null:null}export{St as BetterSqlite3Storage,Pt as BunSqliteStorage,Te as MemoryStorage,jt as PgStorage,W as advertiseRefsWithHooks,Ve as applyCasRefUpdates,Oe as applyReceivePack,wt as buildRefAdvertisementBytes,Rt as buildRefListBytes,Ge as buildRefListPktLines,ut as buildV2CapabilityAdvertisement,Se as buildV2CapabilityAdvertisementBytes,re as buildV2FetchResponse,ht as buildV2LsRefsResponse,Sr as collectRefs,Gr as composeHooks,Qn as createServer,ve as handleLsRefs,Pe as handleUploadPack,je as handleV2Fetch,xt as ingestReceivePack,kt as ingestReceivePackFromStream,pt as parseV2CommandRequest,yt as parseV2FetchArgs,ze as resolveRefUpdates};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "just-git",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "Pure TypeScript git implementation: virtual filesystem client and embeddable server.",
5
5
  "keywords": [
6
6
  "agent",