@preventive/triage 1.0.0-alpha.21 → 1.0.0-alpha.23
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/common/bundle-source-links.d.ts +5 -0
- package/common/bundle-source-links.js +82 -0
- package/common/github-issue-labels.d.ts +1 -0
- package/common/github-issue-labels.js +11 -0
- package/common/managed/routes.js +3 -0
- package/common/server-info.ts +1 -0
- package/out/client-managed-import.js +1 -1
- package/out/client-managed.js +74 -58
- package/out/client-sync.js +3 -3
- package/out/github-issue-authorized.html +3 -0
- package/out/github-issue-authorized.js +1 -0
- package/out/graph.js +6 -6
- package/out/prism.js +2 -2
- package/out/view.css +1 -1
- package/out/view.js +186 -159
- package/package.json +12 -1
- package/server-e2e/app.ts +2 -1
- package/server-e2e/config.ts +2 -0
- package/server-managed/config.ts +9 -16
- package/server-managed/db-methods.ts +52 -21
- package/server-managed/db-neon.ts +6 -1
- package/server-managed/db-schema.ts +1 -0
- package/server-managed/db.ts +2 -1
- package/server-managed/github-app.ts +107 -49
- package/server-managed/github-errors.ts +28 -0
- package/server-managed/github-issue-oauth.ts +48 -0
- package/server-managed/github-issues.ts +152 -0
- package/server-managed/github-oauth.ts +7 -23
- package/server-managed/http.ts +181 -9
- package/server-managed/managed-issues.ts +47 -0
- package/server-managed/report-sources.ts +4 -2
- package/server-managed/repository-browser.ts +127 -0
- package/server-managed/workspace-shares.ts +3 -3
package/out/client-sync.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function Zt(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}var bt=e=>e?`"${e}" `:"";function vt(e,t=""){if(typeof e!="boolean")throw new TypeError(bt(t)+"expected boolean, got type="+typeof e);return e}function Ce(e,t=""){if(typeof e!="number")throw new TypeError(bt(t)+"expected number, got "+typeof e);if(!Number.isSafeInteger(e)||e<0)throw new RangeError(bt(t)+"expected integer >= 0, got "+e);return e}function Z(e,t,n=""){if(Zt(e)&&(t===void 0||e.length===t))return e;t!==void 0&&Ce(t,"length");let r=Zt(e),o=t!==void 0?` of length ${t}`:"",i=r?`length=${e.length}`:`type=${typeof e}`,s=bt(n)+"expected Uint8Array"+o+", got "+i;throw r?new RangeError(s):new TypeError(s)}var nr=(e,t)=>{if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(t==="object"?"expected valid options object":`"${t}" expected object, got type=${typeof e}`)};function Qt(e,t=!0){if(e.destroyed)throw new Error("hash was destroyed");if(t&&e.finished)throw new Error("digest() was already called")}function rr(e,t){Z(e,void 0,"output");let n=t.outputLen;if(!(e.length>=n))throw new RangeError('"output" expected length >= '+n)}function be(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function he(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function No(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var Re=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function Ko(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function Io(e){for(let t=0;t<e.length;t++)e[t]=Ko(e[t]);return e}var ke=Re?e=>e:Io;function or(e,t){return nr(e,"defaults"),nr(t,"opts"),Object.assign(e,t)}function ir(e,t){if(e=Z(e),t=Z(t),e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function sr(e,t,n){let r=t,o=n||(()=>[]),i=(a,l)=>r(l,...o(a)).update(a).digest(),s=r(new Uint8Array(e),...o(new Uint8Array(0)));return i.outputLen=s.outputLen,i.blockLen=s.blockLen,i.create=(a,...l)=>r(a,...l),i}var ar=(e,t)=>{function n(r,...o){if(Z(r,void 0,"key"),e.nonceLength!==void 0){let y=o[0];Z(y,e.varSizeNonce?void 0:e.nonceLength,"nonce")}let i=e.tagLength,s=e.nonceLength!==void 0?1:0;if(!e.withAAD){for(let y=s;y<o.length;y++)if(Zt(o[y]))throw new Error("AAD not supported")}e.withAAD&&o[s]!==void 0&&Z(o[s],void 0,"AAD");let a=t(r,...o),l=(y,b)=>{if(b!==void 0){if(y!==2)throw new Error("cipher output not supported");Z(b,void 0,"output")}},d=!1;return{encrypt(y,b){if(d)throw new Error("cannot encrypt() twice with same key + nonce");return d=!0,Z(y,void 0,"data"),l(a.encrypt.length,b),a.encrypt(y,b)},decrypt(y,b){if(Z(y,void 0,"data"),i&&y.length<i)throw new Error('"ciphertext" expected length >= tagLength='+i);return l(a.decrypt.length,b),a.decrypt(y,b)}}}return Object.assign(n,e),n};function Xe(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(Z(t,e,"output"),n&&!Ze(t))throw new Error("invalid output, must be aligned");return t}function cr(e,t,n){Ce(e),Ce(t),vt(n);let r=new Uint8Array(16),o=No(r);return o.setBigUint64(0,BigInt(t),n),o.setBigUint64(8,BigInt(e),n),r}function Ze(e){return e.byteOffset%4===0}function Fe(e){return Uint8Array.from(Z(e))}var ur=e=>Uint8Array.from(e.split(""),t=>t.charCodeAt(0)),Do=ke(be(ur("expand 16-byte k"))),Fo=ke(be(ur("expand 32-byte k")));function C(e,t){return e<<t|e>>>32-t}var Qe=64,$o=16,en=2**32-1,lr=Uint32Array.of();function Wo(e,t,n,r,o,i,s,a){let l=o.length,d=new Uint8Array(Qe),p=be(d),y=Re&&Ze(o)&&Ze(i),b=y?be(o):lr,A=y?be(i):lr;if(!Re){for(let h=0;h<l;s++){if(e(t,n,r,p,s,a),ke(p),s>=en)throw new Error("arx: counter overflow");let x=Math.min(Qe,l-h);for(let k=0,E;k<x;k++)E=h+k,i[E]=o[E]^d[k];h+=x}return}for(let h=0;h<l;s++){if(e(t,n,r,p,s,a),s>=en)throw new Error("arx: counter overflow");let x=Math.min(Qe,l-h);if(y&&x===Qe){let k=h/4;if(h%4!==0)throw new Error("arx: invalid block position");for(let E=0,B;E<$o;E++)B=k+E,A[B]=b[B]^p[E];h+=Qe;continue}for(let k=0,E;k<x;k++)E=h+k,i[E]=o[E]^d[k];h+=x}}function fr(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:o,counterRight:i,rounds:s}=or({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!="function")throw new Error("core must be a function");return Ce(o),Ce(s),vt(i),vt(n),(a,l,d,p,y=0)=>{Z(a,void 0,"key"),Z(l,void 0,"nonce"),Z(d,void 0,"data");let b=d.length;if(p=Xe(b,p,!1),Ce(y),y<0||y>=en)throw new Error("arx: counter overflow");let A=[],h=a.length,x,k;if(h===32)A.push(x=Fe(a)),k=Fo;else if(h===16&&n)x=new Uint8Array(32),x.set(a),x.set(a,16),k=Do,A.push(x);else throw Z(a,32,"arx key"),new Error("invalid key size");(!Re||!Ze(l))&&A.push(l=Fe(l));let E=be(x);if(r){if(l.length!==24)throw new Error("arx: extended nonce must be 24 bytes");let te=l.subarray(0,16);if(Re)r(k,E,be(te),E);else{let ie=ke(Uint32Array.from(k));r(ie,E,be(te),E),he(ie),ke(E)}l=l.subarray(16)}else Re||ke(E);let B=16-o;if(B!==l.length)throw new Error(`arx: nonce must be ${B} or 16 bytes`);if(B!==12){let te=new Uint8Array(12);te.set(l,i?0:12-l.length),l=te,A.push(l)}let Q=ke(be(l));try{return Wo(e,k,E,Q,d,p,y,s),p}finally{he(...A)}}}function re(e,t){return e[t++]&255|(e[t++]&255)<<8}var tn=class{blockLen=16;outputLen=16;buffer=new Uint8Array(16);r=new Uint16Array(10);h=new Uint16Array(10);pad=new Uint16Array(8);pos=0;finished=!1;destroyed=!1;constructor(t){t=Fe(Z(t,32,"key"));let n=re(t,0),r=re(t,2),o=re(t,4),i=re(t,6),s=re(t,8),a=re(t,10),l=re(t,12),d=re(t,14);this.r[0]=n&8191,this.r[1]=(n>>>13|r<<3)&8191,this.r[2]=(r>>>10|o<<6)&7939,this.r[3]=(o>>>7|i<<9)&8191,this.r[4]=(i>>>4|s<<12)&255,this.r[5]=s>>>1&8190,this.r[6]=(s>>>14|a<<2)&8191,this.r[7]=(a>>>11|l<<5)&8065,this.r[8]=(l>>>8|d<<8)&8191,this.r[9]=d>>>5&127;for(let p=0;p<8;p++)this.pad[p]=re(t,16+2*p)}process(t,n,r=!1){let o=r?0:2048,{h:i,r:s}=this,a=s[0],l=s[1],d=s[2],p=s[3],y=s[4],b=s[5],A=s[6],h=s[7],x=s[8],k=s[9],E=re(t,n+0),B=re(t,n+2),Q=re(t,n+4),te=re(t,n+6),ie=re(t,n+8),X=re(t,n+10),J=re(t,n+12),q=re(t,n+14),$=i[0]+(E&8191),W=i[1]+((E>>>13|B<<3)&8191),I=i[2]+((B>>>10|Q<<6)&8191),U=i[3]+((Q>>>7|te<<9)&8191),D=i[4]+((te>>>4|ie<<12)&8191),F=i[5]+(ie>>>1&8191),_=i[6]+((ie>>>14|X<<2)&8191),j=i[7]+((X>>>11|J<<5)&8191),N=i[8]+((J>>>8|q<<8)&8191),K=i[9]+(q>>>5|o),T=0,z=T+$*a+W*(5*k)+I*(5*x)+U*(5*h)+D*(5*A);T=z>>>13,z&=8191,z+=F*(5*b)+_*(5*y)+j*(5*p)+N*(5*d)+K*(5*l),T+=z>>>13,z&=8191;let G=T+$*l+W*a+I*(5*k)+U*(5*x)+D*(5*h);T=G>>>13,G&=8191,G+=F*(5*A)+_*(5*b)+j*(5*y)+N*(5*p)+K*(5*d),T+=G>>>13,G&=8191;let H=T+$*d+W*l+I*a+U*(5*k)+D*(5*x);T=H>>>13,H&=8191,H+=F*(5*h)+_*(5*A)+j*(5*b)+N*(5*y)+K*(5*p),T+=H>>>13,H&=8191;let le=T+$*p+W*d+I*l+U*a+D*(5*k);T=le>>>13,le&=8191,le+=F*(5*x)+_*(5*h)+j*(5*A)+N*(5*b)+K*(5*y),T+=le>>>13,le&=8191;let we=T+$*y+W*p+I*d+U*l+D*a;T=we>>>13,we&=8191,we+=F*(5*k)+_*(5*x)+j*(5*h)+N*(5*A)+K*(5*b),T+=we>>>13,we&=8191;let g=T+$*b+W*y+I*p+U*d+D*l;T=g>>>13,g&=8191,g+=F*a+_*(5*k)+j*(5*x)+N*(5*h)+K*(5*A),T+=g>>>13,g&=8191;let f=T+$*A+W*b+I*y+U*p+D*d;T=f>>>13,f&=8191,f+=F*l+_*a+j*(5*k)+N*(5*x)+K*(5*h),T+=f>>>13,f&=8191;let u=T+$*h+W*A+I*b+U*y+D*p;T=u>>>13,u&=8191,u+=F*d+_*l+j*a+N*(5*k)+K*(5*x),T+=u>>>13,u&=8191;let w=T+$*x+W*h+I*A+U*b+D*y;T=w>>>13,w&=8191,w+=F*p+_*d+j*l+N*a+K*(5*k),T+=w>>>13,w&=8191;let c=T+$*k+W*x+I*h+U*A+D*b;T=c>>>13,c&=8191,c+=F*y+_*p+j*d+N*l+K*a,T+=c>>>13,c&=8191,T=(T<<2)+T|0,T=T+z|0,z=T&8191,T=T>>>13,G+=T,i[0]=z,i[1]=G,i[2]=H,i[3]=le,i[4]=we,i[5]=g,i[6]=f,i[7]=u,i[8]=w,i[9]=c}finalize(){let{h:t,pad:n}=this,r=new Uint16Array(10),o=t[1]>>>13;t[1]&=8191;for(let a=2;a<10;a++)t[a]+=o,o=t[a]>>>13,t[a]&=8191;t[0]+=o*5,o=t[0]>>>13,t[0]&=8191,t[1]+=o,o=t[1]>>>13,t[1]&=8191,t[2]+=o,r[0]=t[0]+5,o=r[0]>>>13,r[0]&=8191;for(let a=1;a<10;a++)r[a]=t[a]+o,o=r[a]>>>13,r[a]&=8191;r[9]-=8192;let i=(o^1)-1;for(let a=0;a<10;a++)r[a]&=i;i=~i;for(let a=0;a<10;a++)t[a]=t[a]&i|r[a];t[0]=(t[0]|t[1]<<13)&65535,t[1]=(t[1]>>>3|t[2]<<10)&65535,t[2]=(t[2]>>>6|t[3]<<7)&65535,t[3]=(t[3]>>>9|t[4]<<4)&65535,t[4]=(t[4]>>>12|t[5]<<1|t[6]<<14)&65535,t[5]=(t[6]>>>2|t[7]<<11)&65535,t[6]=(t[7]>>>5|t[8]<<8)&65535,t[7]=(t[8]>>>8|t[9]<<5)&65535;let s=t[0]+n[0];t[0]=s&65535;for(let a=1;a<8;a++)s=(t[a]+n[a]|0)+(s>>>16)|0,t[a]=s&65535;he(r)}update(t){Qt(this),Z(t),t=Fe(t);let{buffer:n,blockLen:r}=this,o=t.length;for(let i=0;i<o;){let s=Math.min(r-this.pos,o-i);if(s===r){for(;r<=o-i;i+=r)this.process(t,i);continue}n.set(t.subarray(i,i+s),this.pos),this.pos+=s,i+=s,this.pos===r&&(this.process(n,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,he(this.h,this.r,this.buffer,this.pad)}digestInto(t){Qt(this),rr(t,this),this.finished=!0;let{buffer:n,h:r}=this,{pos:o}=this;if(o){for(n[o++]=1;o<16;o++)n[o]=0;this.process(n,0,!0)}this.finalize();let i=0;for(let s=0;s<8;s++)t[i++]=r[s]>>>0,t[i++]=r[s]>>>8}digest(){let{buffer:t,outputLen:n}=this;this.digestInto(t);let r=t.slice(0,n);return this.destroy(),r}},dr=sr(32,e=>new tn(e));function Ho(e,t,n,r,o,i=20){let s=e[0],a=e[1],l=e[2],d=e[3],p=t[0],y=t[1],b=t[2],A=t[3],h=t[4],x=t[5],k=t[6],E=t[7],B=o,Q=n[0],te=n[1],ie=n[2],X=s,J=a,q=l,$=d,W=p,I=y,U=b,D=A,F=h,_=x,j=k,N=E,K=B,T=Q,z=te,G=ie;for(let le=0;le<i;le+=2)X=X+W|0,K=C(K^X,16),F=F+K|0,W=C(W^F,12),X=X+W|0,K=C(K^X,8),F=F+K|0,W=C(W^F,7),J=J+I|0,T=C(T^J,16),_=_+T|0,I=C(I^_,12),J=J+I|0,T=C(T^J,8),_=_+T|0,I=C(I^_,7),q=q+U|0,z=C(z^q,16),j=j+z|0,U=C(U^j,12),q=q+U|0,z=C(z^q,8),j=j+z|0,U=C(U^j,7),$=$+D|0,G=C(G^$,16),N=N+G|0,D=C(D^N,12),$=$+D|0,G=C(G^$,8),N=N+G|0,D=C(D^N,7),X=X+I|0,G=C(G^X,16),j=j+G|0,I=C(I^j,12),X=X+I|0,G=C(G^X,8),j=j+G|0,I=C(I^j,7),J=J+U|0,K=C(K^J,16),N=N+K|0,U=C(U^N,12),J=J+U|0,K=C(K^J,8),N=N+K|0,U=C(U^N,7),q=q+D|0,T=C(T^q,16),F=F+T|0,D=C(D^F,12),q=q+D|0,T=C(T^q,8),F=F+T|0,D=C(D^F,7),$=$+W|0,z=C(z^$,16),_=_+z|0,W=C(W^_,12),$=$+W|0,z=C(z^$,8),_=_+z|0,W=C(W^_,7);let H=0;r[H++]=s+X|0,r[H++]=a+J|0,r[H++]=l+q|0,r[H++]=d+$|0,r[H++]=p+W|0,r[H++]=y+I|0,r[H++]=b+U|0,r[H++]=A+D|0,r[H++]=h+F|0,r[H++]=x+_|0,r[H++]=k+j|0,r[H++]=E+N|0,r[H++]=B+K|0,r[H++]=Q+T|0,r[H++]=te+z|0,r[H++]=ie+G|0}var _o=fr(Ho,{counterRight:!1,counterLength:4,allowShortKeys:!1});var zo=new Uint8Array(16),gr=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(zo.subarray(n))},Vo=new Uint8Array(32);function pr(e,t,n,r,o){o!==void 0&&Z(o,void 0,"AAD");let i=e(t,n,Vo),s=cr(r.length,o?o.length:0,!0),a=dr.create(i);o&&gr(a,o),gr(a,r),a.update(s);let l=a.digest();return he(i,s),l}var qo=e=>(t,n,r)=>({encrypt(i,s){let a=i.length;s=Xe(a+16,s,!1),s.set(i);let l=s.subarray(0,-16);e(t,n,l,l,1);let d=pr(e,t,n,l,r);return s.set(d,a),he(d),s},decrypt(i,s){s=Xe(i.length-16,s,!1);let a=i.subarray(0,-16),l=i.subarray(-16),d=pr(e,t,n,a,r);if(!ir(l,d))throw he(d),new Error("invalid tag");return s.set(i.subarray(0,-16)),e(t,n,s,s,1),he(d),s}}),$e=ar({blockSize:64,nonceLength:12,tagLength:16,withAAD:!0},qo(_o));var Go=new TextEncoder,Jo=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function Y(e){if(typeof e!="string")throw new TypeError(`encodeUtf8 expects a string, got ${typeof e}`);if(!e.isWellFormed())throw new TypeError("encodeUtf8: input contains lone surrogates");return Go.encode(e)}function Le(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return Jo.decode(e)}async function yr(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function hr(e,{maxBytes:t}={}){let n=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));if(t==null)return new Uint8Array(await new Response(n).arrayBuffer());let r=n.getReader(),o=[],i=0;for(;;){let{value:l,done:d}=await r.read();if(d)break;if(i+=l.length,i>t){try{await r.cancel()}catch{}throw new Error(`gunzipBytes: decompressed size exceeds ${t}-byte cap`)}o.push(l)}let s=new Uint8Array(i),a=0;for(let l of o)s.set(l,a),a+=l.length;return s}var Yo="deepview-triage-sync.v1.content-key",Xo="deepview-triage-sync.v1.sign-key",Zo="deepview-triage-sync.v1.save",Qo="deepview-triage-sync.v1.subscribe",ei=12,nn=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),St=null;function mr(){return St||(St=(async()=>{try{return await crypto.subtle.importKey("raw",new Uint8Array(32),{name:"ChaCha20-Poly1305"},!1,["encrypt","decrypt"]),!0}catch{return!1}})(),St)}async function wr(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw new Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await crypto.subtle.importKey("raw",n,"HKDF",!1,["deriveBits"]),o=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array,info:Y(t)},r,256);return new Uint8Array(o)}async function br(e){return await wr(e,Yo)}async function kt(e,t){let n=await wr(e,`${Xo}|${t}`),r=new Uint8Array(nn.length+32);r.set(nn,0),r.set(n,nn.length);let o=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!0,["sign"]),i=await crypto.subtle.exportKey("jwk",o),s=i.x;if(delete i.d,s==null)throw new Error("Ed25519 JWK export returned no public key");let a=Uint8Array.fromBase64(s,{alphabet:"base64url"}),l=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!1,["sign"]);return n.fill(0),r.fill(0),{privateKey:l,publicKey:a,publicKeyB64:s}}function rn({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:o}){return Y([Zo,e,t==null?"":String(t),n===!0?"1":"",r,o].join(`
|
|
1
|
+
function Zt(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}var bt=e=>e?`"${e}" `:"";function vt(e,t=""){if(typeof e!="boolean")throw new TypeError(bt(t)+"expected boolean, got type="+typeof e);return e}function Ce(e,t=""){if(typeof e!="number")throw new TypeError(bt(t)+"expected number, got "+typeof e);if(!Number.isSafeInteger(e)||e<0)throw new RangeError(bt(t)+"expected integer >= 0, got "+e);return e}function Z(e,t,n=""){if(Zt(e)&&(t===void 0||e.length===t))return e;t!==void 0&&Ce(t,"length");let r=Zt(e),o=t!==void 0?` of length ${t}`:"",i=r?`length=${e.length}`:`type=${typeof e}`,s=bt(n)+"expected Uint8Array"+o+", got "+i;throw r?new RangeError(s):new TypeError(s)}var nr=(e,t)=>{if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(t==="object"?"expected valid options object":`"${t}" expected object, got type=${typeof e}`)};function Qt(e,t=!0){if(e.destroyed)throw new Error("hash was destroyed");if(t&&e.finished)throw new Error("digest() was already called")}function rr(e,t){Z(e,void 0,"output");let n=t.outputLen;if(!(e.length>=n))throw new RangeError('"output" expected length >= '+n)}function be(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function he(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function No(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var Re=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function Io(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function Ko(e){for(let t=0;t<e.length;t++)e[t]=Io(e[t]);return e}var ke=Re?e=>e:Ko;function or(e,t){return nr(e,"defaults"),nr(t,"opts"),Object.assign(e,t)}function ir(e,t){if(e=Z(e),t=Z(t),e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function sr(e,t,n){let r=t,o=n||(()=>[]),i=(a,l)=>r(l,...o(a)).update(a).digest(),s=r(new Uint8Array(e),...o(new Uint8Array(0)));return i.outputLen=s.outputLen,i.blockLen=s.blockLen,i.create=(a,...l)=>r(a,...l),i}var ar=(e,t)=>{function n(r,...o){if(Z(r,void 0,"key"),e.nonceLength!==void 0){let y=o[0];Z(y,e.varSizeNonce?void 0:e.nonceLength,"nonce")}let i=e.tagLength,s=e.nonceLength!==void 0?1:0;if(!e.withAAD){for(let y=s;y<o.length;y++)if(Zt(o[y]))throw new Error("AAD not supported")}e.withAAD&&o[s]!==void 0&&Z(o[s],void 0,"AAD");let a=t(r,...o),l=(y,b)=>{if(b!==void 0){if(y!==2)throw new Error("cipher output not supported");Z(b,void 0,"output")}},d=!1;return{encrypt(y,b){if(d)throw new Error("cannot encrypt() twice with same key + nonce");return d=!0,Z(y,void 0,"data"),l(a.encrypt.length,b),a.encrypt(y,b)},decrypt(y,b){if(Z(y,void 0,"data"),i&&y.length<i)throw new Error('"ciphertext" expected length >= tagLength='+i);return l(a.decrypt.length,b),a.decrypt(y,b)}}}return Object.assign(n,e),n};function Xe(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(Z(t,e,"output"),n&&!Ze(t))throw new Error("invalid output, must be aligned");return t}function cr(e,t,n){Ce(e),Ce(t),vt(n);let r=new Uint8Array(16),o=No(r);return o.setBigUint64(0,BigInt(t),n),o.setBigUint64(8,BigInt(e),n),r}function Ze(e){return e.byteOffset%4===0}function Fe(e){return Uint8Array.from(Z(e))}var ur=e=>Uint8Array.from(e.split(""),t=>t.charCodeAt(0)),Do=ke(be(ur("expand 16-byte k"))),Fo=ke(be(ur("expand 32-byte k")));function C(e,t){return e<<t|e>>>32-t}var Qe=64,$o=16,en=2**32-1,lr=Uint32Array.of();function Wo(e,t,n,r,o,i,s,a){let l=o.length,d=new Uint8Array(Qe),p=be(d),y=Re&&Ze(o)&&Ze(i),b=y?be(o):lr,A=y?be(i):lr;if(!Re){for(let h=0;h<l;s++){if(e(t,n,r,p,s,a),ke(p),s>=en)throw new Error("arx: counter overflow");let x=Math.min(Qe,l-h);for(let k=0,E;k<x;k++)E=h+k,i[E]=o[E]^d[k];h+=x}return}for(let h=0;h<l;s++){if(e(t,n,r,p,s,a),s>=en)throw new Error("arx: counter overflow");let x=Math.min(Qe,l-h);if(y&&x===Qe){let k=h/4;if(h%4!==0)throw new Error("arx: invalid block position");for(let E=0,B;E<$o;E++)B=k+E,A[B]=b[B]^p[E];h+=Qe;continue}for(let k=0,E;k<x;k++)E=h+k,i[E]=o[E]^d[k];h+=x}}function fr(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:o,counterRight:i,rounds:s}=or({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!="function")throw new Error("core must be a function");return Ce(o),Ce(s),vt(i),vt(n),(a,l,d,p,y=0)=>{Z(a,void 0,"key"),Z(l,void 0,"nonce"),Z(d,void 0,"data");let b=d.length;if(p=Xe(b,p,!1),Ce(y),y<0||y>=en)throw new Error("arx: counter overflow");let A=[],h=a.length,x,k;if(h===32)A.push(x=Fe(a)),k=Fo;else if(h===16&&n)x=new Uint8Array(32),x.set(a),x.set(a,16),k=Do,A.push(x);else throw Z(a,32,"arx key"),new Error("invalid key size");(!Re||!Ze(l))&&A.push(l=Fe(l));let E=be(x);if(r){if(l.length!==24)throw new Error("arx: extended nonce must be 24 bytes");let te=l.subarray(0,16);if(Re)r(k,E,be(te),E);else{let ie=ke(Uint32Array.from(k));r(ie,E,be(te),E),he(ie),ke(E)}l=l.subarray(16)}else Re||ke(E);let B=16-o;if(B!==l.length)throw new Error(`arx: nonce must be ${B} or 16 bytes`);if(B!==12){let te=new Uint8Array(12);te.set(l,i?0:12-l.length),l=te,A.push(l)}let Q=ke(be(l));try{return Wo(e,k,E,Q,d,p,y,s),p}finally{he(...A)}}}function re(e,t){return e[t++]&255|(e[t++]&255)<<8}var tn=class{blockLen=16;outputLen=16;buffer=new Uint8Array(16);r=new Uint16Array(10);h=new Uint16Array(10);pad=new Uint16Array(8);pos=0;finished=!1;destroyed=!1;constructor(t){t=Fe(Z(t,32,"key"));let n=re(t,0),r=re(t,2),o=re(t,4),i=re(t,6),s=re(t,8),a=re(t,10),l=re(t,12),d=re(t,14);this.r[0]=n&8191,this.r[1]=(n>>>13|r<<3)&8191,this.r[2]=(r>>>10|o<<6)&7939,this.r[3]=(o>>>7|i<<9)&8191,this.r[4]=(i>>>4|s<<12)&255,this.r[5]=s>>>1&8190,this.r[6]=(s>>>14|a<<2)&8191,this.r[7]=(a>>>11|l<<5)&8065,this.r[8]=(l>>>8|d<<8)&8191,this.r[9]=d>>>5&127;for(let p=0;p<8;p++)this.pad[p]=re(t,16+2*p)}process(t,n,r=!1){let o=r?0:2048,{h:i,r:s}=this,a=s[0],l=s[1],d=s[2],p=s[3],y=s[4],b=s[5],A=s[6],h=s[7],x=s[8],k=s[9],E=re(t,n+0),B=re(t,n+2),Q=re(t,n+4),te=re(t,n+6),ie=re(t,n+8),X=re(t,n+10),J=re(t,n+12),q=re(t,n+14),$=i[0]+(E&8191),W=i[1]+((E>>>13|B<<3)&8191),K=i[2]+((B>>>10|Q<<6)&8191),U=i[3]+((Q>>>7|te<<9)&8191),D=i[4]+((te>>>4|ie<<12)&8191),F=i[5]+(ie>>>1&8191),_=i[6]+((ie>>>14|X<<2)&8191),j=i[7]+((X>>>11|J<<5)&8191),N=i[8]+((J>>>8|q<<8)&8191),I=i[9]+(q>>>5|o),T=0,z=T+$*a+W*(5*k)+K*(5*x)+U*(5*h)+D*(5*A);T=z>>>13,z&=8191,z+=F*(5*b)+_*(5*y)+j*(5*p)+N*(5*d)+I*(5*l),T+=z>>>13,z&=8191;let G=T+$*l+W*a+K*(5*k)+U*(5*x)+D*(5*h);T=G>>>13,G&=8191,G+=F*(5*A)+_*(5*b)+j*(5*y)+N*(5*p)+I*(5*d),T+=G>>>13,G&=8191;let H=T+$*d+W*l+K*a+U*(5*k)+D*(5*x);T=H>>>13,H&=8191,H+=F*(5*h)+_*(5*A)+j*(5*b)+N*(5*y)+I*(5*p),T+=H>>>13,H&=8191;let le=T+$*p+W*d+K*l+U*a+D*(5*k);T=le>>>13,le&=8191,le+=F*(5*x)+_*(5*h)+j*(5*A)+N*(5*b)+I*(5*y),T+=le>>>13,le&=8191;let we=T+$*y+W*p+K*d+U*l+D*a;T=we>>>13,we&=8191,we+=F*(5*k)+_*(5*x)+j*(5*h)+N*(5*A)+I*(5*b),T+=we>>>13,we&=8191;let g=T+$*b+W*y+K*p+U*d+D*l;T=g>>>13,g&=8191,g+=F*a+_*(5*k)+j*(5*x)+N*(5*h)+I*(5*A),T+=g>>>13,g&=8191;let f=T+$*A+W*b+K*y+U*p+D*d;T=f>>>13,f&=8191,f+=F*l+_*a+j*(5*k)+N*(5*x)+I*(5*h),T+=f>>>13,f&=8191;let u=T+$*h+W*A+K*b+U*y+D*p;T=u>>>13,u&=8191,u+=F*d+_*l+j*a+N*(5*k)+I*(5*x),T+=u>>>13,u&=8191;let w=T+$*x+W*h+K*A+U*b+D*y;T=w>>>13,w&=8191,w+=F*p+_*d+j*l+N*a+I*(5*k),T+=w>>>13,w&=8191;let c=T+$*k+W*x+K*h+U*A+D*b;T=c>>>13,c&=8191,c+=F*y+_*p+j*d+N*l+I*a,T+=c>>>13,c&=8191,T=(T<<2)+T|0,T=T+z|0,z=T&8191,T=T>>>13,G+=T,i[0]=z,i[1]=G,i[2]=H,i[3]=le,i[4]=we,i[5]=g,i[6]=f,i[7]=u,i[8]=w,i[9]=c}finalize(){let{h:t,pad:n}=this,r=new Uint16Array(10),o=t[1]>>>13;t[1]&=8191;for(let a=2;a<10;a++)t[a]+=o,o=t[a]>>>13,t[a]&=8191;t[0]+=o*5,o=t[0]>>>13,t[0]&=8191,t[1]+=o,o=t[1]>>>13,t[1]&=8191,t[2]+=o,r[0]=t[0]+5,o=r[0]>>>13,r[0]&=8191;for(let a=1;a<10;a++)r[a]=t[a]+o,o=r[a]>>>13,r[a]&=8191;r[9]-=8192;let i=(o^1)-1;for(let a=0;a<10;a++)r[a]&=i;i=~i;for(let a=0;a<10;a++)t[a]=t[a]&i|r[a];t[0]=(t[0]|t[1]<<13)&65535,t[1]=(t[1]>>>3|t[2]<<10)&65535,t[2]=(t[2]>>>6|t[3]<<7)&65535,t[3]=(t[3]>>>9|t[4]<<4)&65535,t[4]=(t[4]>>>12|t[5]<<1|t[6]<<14)&65535,t[5]=(t[6]>>>2|t[7]<<11)&65535,t[6]=(t[7]>>>5|t[8]<<8)&65535,t[7]=(t[8]>>>8|t[9]<<5)&65535;let s=t[0]+n[0];t[0]=s&65535;for(let a=1;a<8;a++)s=(t[a]+n[a]|0)+(s>>>16)|0,t[a]=s&65535;he(r)}update(t){Qt(this),Z(t),t=Fe(t);let{buffer:n,blockLen:r}=this,o=t.length;for(let i=0;i<o;){let s=Math.min(r-this.pos,o-i);if(s===r){for(;r<=o-i;i+=r)this.process(t,i);continue}n.set(t.subarray(i,i+s),this.pos),this.pos+=s,i+=s,this.pos===r&&(this.process(n,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,he(this.h,this.r,this.buffer,this.pad)}digestInto(t){Qt(this),rr(t,this),this.finished=!0;let{buffer:n,h:r}=this,{pos:o}=this;if(o){for(n[o++]=1;o<16;o++)n[o]=0;this.process(n,0,!0)}this.finalize();let i=0;for(let s=0;s<8;s++)t[i++]=r[s]>>>0,t[i++]=r[s]>>>8}digest(){let{buffer:t,outputLen:n}=this;this.digestInto(t);let r=t.slice(0,n);return this.destroy(),r}},dr=sr(32,e=>new tn(e));function Ho(e,t,n,r,o,i=20){let s=e[0],a=e[1],l=e[2],d=e[3],p=t[0],y=t[1],b=t[2],A=t[3],h=t[4],x=t[5],k=t[6],E=t[7],B=o,Q=n[0],te=n[1],ie=n[2],X=s,J=a,q=l,$=d,W=p,K=y,U=b,D=A,F=h,_=x,j=k,N=E,I=B,T=Q,z=te,G=ie;for(let le=0;le<i;le+=2)X=X+W|0,I=C(I^X,16),F=F+I|0,W=C(W^F,12),X=X+W|0,I=C(I^X,8),F=F+I|0,W=C(W^F,7),J=J+K|0,T=C(T^J,16),_=_+T|0,K=C(K^_,12),J=J+K|0,T=C(T^J,8),_=_+T|0,K=C(K^_,7),q=q+U|0,z=C(z^q,16),j=j+z|0,U=C(U^j,12),q=q+U|0,z=C(z^q,8),j=j+z|0,U=C(U^j,7),$=$+D|0,G=C(G^$,16),N=N+G|0,D=C(D^N,12),$=$+D|0,G=C(G^$,8),N=N+G|0,D=C(D^N,7),X=X+K|0,G=C(G^X,16),j=j+G|0,K=C(K^j,12),X=X+K|0,G=C(G^X,8),j=j+G|0,K=C(K^j,7),J=J+U|0,I=C(I^J,16),N=N+I|0,U=C(U^N,12),J=J+U|0,I=C(I^J,8),N=N+I|0,U=C(U^N,7),q=q+D|0,T=C(T^q,16),F=F+T|0,D=C(D^F,12),q=q+D|0,T=C(T^q,8),F=F+T|0,D=C(D^F,7),$=$+W|0,z=C(z^$,16),_=_+z|0,W=C(W^_,12),$=$+W|0,z=C(z^$,8),_=_+z|0,W=C(W^_,7);let H=0;r[H++]=s+X|0,r[H++]=a+J|0,r[H++]=l+q|0,r[H++]=d+$|0,r[H++]=p+W|0,r[H++]=y+K|0,r[H++]=b+U|0,r[H++]=A+D|0,r[H++]=h+F|0,r[H++]=x+_|0,r[H++]=k+j|0,r[H++]=E+N|0,r[H++]=B+I|0,r[H++]=Q+T|0,r[H++]=te+z|0,r[H++]=ie+G|0}var _o=fr(Ho,{counterRight:!1,counterLength:4,allowShortKeys:!1});var zo=new Uint8Array(16),gr=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(zo.subarray(n))},Vo=new Uint8Array(32);function pr(e,t,n,r,o){o!==void 0&&Z(o,void 0,"AAD");let i=e(t,n,Vo),s=cr(r.length,o?o.length:0,!0),a=dr.create(i);o&&gr(a,o),gr(a,r),a.update(s);let l=a.digest();return he(i,s),l}var qo=e=>(t,n,r)=>({encrypt(i,s){let a=i.length;s=Xe(a+16,s,!1),s.set(i);let l=s.subarray(0,-16);e(t,n,l,l,1);let d=pr(e,t,n,l,r);return s.set(d,a),he(d),s},decrypt(i,s){s=Xe(i.length-16,s,!1);let a=i.subarray(0,-16),l=i.subarray(-16),d=pr(e,t,n,a,r);if(!ir(l,d))throw he(d),new Error("invalid tag");return s.set(i.subarray(0,-16)),e(t,n,s,s,1),he(d),s}}),$e=ar({blockSize:64,nonceLength:12,tagLength:16,withAAD:!0},qo(_o));var Go=new TextEncoder,Jo=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function Y(e){if(typeof e!="string")throw new TypeError(`encodeUtf8 expects a string, got ${typeof e}`);if(!e.isWellFormed())throw new TypeError("encodeUtf8: input contains lone surrogates");return Go.encode(e)}function Le(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return Jo.decode(e)}async function yr(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function hr(e,{maxBytes:t}={}){let n=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));if(t==null)return new Uint8Array(await new Response(n).arrayBuffer());let r=n.getReader(),o=[],i=0;for(;;){let{value:l,done:d}=await r.read();if(d)break;if(i+=l.length,i>t){try{await r.cancel()}catch{}throw new Error(`gunzipBytes: decompressed size exceeds ${t}-byte cap`)}o.push(l)}let s=new Uint8Array(i),a=0;for(let l of o)s.set(l,a),a+=l.length;return s}var Yo="deepview-triage-sync.v1.content-key",Xo="deepview-triage-sync.v1.sign-key",Zo="deepview-triage-sync.v1.save",Qo="deepview-triage-sync.v1.subscribe",ei=12,nn=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),St=null;function mr(){return St||(St=(async()=>{try{return await crypto.subtle.importKey("raw",new Uint8Array(32),{name:"ChaCha20-Poly1305"},!1,["encrypt","decrypt"]),!0}catch{return!1}})(),St)}async function wr(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw new Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await crypto.subtle.importKey("raw",n,"HKDF",!1,["deriveBits"]),o=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array,info:Y(t)},r,256);return new Uint8Array(o)}async function br(e){return await wr(e,Yo)}async function kt(e,t){let n=await wr(e,`${Xo}|${t}`),r=new Uint8Array(nn.length+32);r.set(nn,0),r.set(n,nn.length);let o=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!0,["sign"]),i=await crypto.subtle.exportKey("jwk",o),s=i.x;if(delete i.d,s==null)throw new Error("Ed25519 JWK export returned no public key");let a=Uint8Array.fromBase64(s,{alphabet:"base64url"}),l=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!1,["sign"]);return n.fill(0),r.fill(0),{privateKey:l,publicKey:a,publicKeyB64:s}}function rn({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:o}){return Y([Zo,e,t==null?"":String(t),n===!0?"1":"",r,o].join(`
|
|
2
2
|
`))}async function vr(e,t){let n=await crypto.subtle.sign({name:"Ed25519"},e,t);return new Uint8Array(n).toBase64({alphabet:"base64url",omitPadding:!0})}async function Sr(e,t){return await vr(e,rn(t))}async function on(e){let t=rn(e),n=await crypto.subtle.digest("SHA-256",t);return new Uint8Array(n).toBase64({alphabet:"base64url",omitPadding:!0})}function ti(e,t,n){let r=t==null?"":String(t);return Y([Qo,e,r,n].join(`
|
|
3
3
|
`))}async function kr(e,t,n,r){return await vr(e,ti(t,n,r))}async function Tr(e,t,n){try{let r=await crypto.subtle.importKey("raw",e,{name:"Ed25519"},!1,["verify"]),o=Uint8Array.fromBase64(n,{alphabet:"base64url"}),i=rn(t);return await crypto.subtle.verify({name:"Ed25519"},r,o,i)}catch{return!1}}function ni(){let e=new Uint8Array(ei);return crypto.getRandomValues(e),e}function sn(e,t){let n=t==null?"":String(t);return Y(`${e}|${n}`)}async function ri(e,t,n){let r=ni();if(await mr()){let i=await crypto.subtle.importKey("raw",e,{name:"ChaCha20-Poly1305"},!1,["encrypt"]),s=new Uint8Array(await crypto.subtle.encrypt({name:"ChaCha20-Poly1305",iv:r,additionalData:n},i,t));return{nonce:r,ciphertext:s}}let o=$e(e,r,n);return{nonce:r,ciphertext:o.encrypt(t)}}async function oi(e,t,n,r){if(await mr()){let i=await crypto.subtle.importKey("raw",e,{name:"ChaCha20-Poly1305"},!1,["decrypt"]);return new Uint8Array(await crypto.subtle.decrypt({name:"ChaCha20-Poly1305",iv:t,additionalData:r},i,n))}return $e(e,t,r).decrypt(n)}var ii=64;function si(e,t){return e<=t?t:2**(32-Math.clz32(e-1))}async function ai(e){let t=Y(JSON.stringify(e)),n=await yr(t);if(n.length>1073741820)throw new Error("payload too large");let r=si(4+n.length,ii),o=new Uint8Array(r);return new DataView(o.buffer,o.byteOffset,o.byteLength).setUint32(0,n.length,!1),o.set(n,4),o}var ci=64*1024*1024;async function li(e){if(e.length<4)throw new Error("plaintext too short");let n=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(0,!1);if(n+4>e.length)throw new Error("length prefix exceeds buffer");let r=e.subarray(4,4+n),o=await hr(r,{maxBytes:ci});return JSON.parse(Le(o))}async function xr(e,t,n){let r=await ai(t),{nonce:o,ciphertext:i}=await ri(e,r,n);return{nonce:o.toBase64(),ciphertext:i.toBase64()}}async function Ar(e,t,n,r){let o=Uint8Array.fromBase64(t),i=Uint8Array.fromBase64(n),s=await oi(e,o,i,r);return li(s)}var ui="deepview-objstore.v1.content",fi="deepview-objstore.v1.tag",di=`objstore-tag
|
|
4
4
|
`,gi=`objstore-bundle-tag
|
|
@@ -10,11 +10,11 @@ ${r}`),a=$e(e,o,s).decrypt(i);if(a.length<2)throw new Error(`objstore plaintext
|
|
|
10
10
|
`))}async function We(e,t){return new Uint8Array(await crypto.subtle.sign({name:"Ed25519"},e,t)).toBase64({alphabet:"base64url",omitPadding:!0})}function Br(e,t,n){return We(e,Si(t,n))}function Or(e,t,n){return We(e,ki(t,n))}function jr(e,t,n,r){return We(e,Ti(t,n,r))}function xi(e,t,n){return Y([wi,e,t,String(n)].join(`
|
|
11
11
|
`))}function Cr(e,t,n,r){return We(e,xi(t,n,r))}function Ai(e,t){return Y([bi,e.workspaceTag,e.resourceTag,xt(e.prevVersion),At(e.prevIncarnation),e.contentHash,String(e.expectedLength),String(t)].join(`
|
|
12
12
|
`))}function Lr(e,t,n){return We(e,Ai(t,n))}function Ei(e,t){return Y([vi,e.workspaceTag,e.resourceTag,xt(e.prevVersion),At(e.prevIncarnation),String(t)].join(`
|
|
13
|
-
`))}function Mr(e,t,n){return We(e,Ei(t,n))}async function me(e){let t=await crypto.subtle.digest("SHA-256",e);return new Uint8Array(t).toBase64({alphabet:"base64url",omitPadding:!0})}var Ue=null,Ur=[];function Ri(e){if(Ue===e)return;if(Ue!==null)throw new Error("SyncHost: a different host is already installed");Ue=e;let t=Ur.splice(0);for(let n of t)try{n(e)}catch(r){console.warn("SyncHost install listener:",r)}}function fe(){if(Ue===null)throw new Error("SyncHost: not installed \u2014 call installSyncHost(host) during app boot");return Ue}function Et(e){if(Ue!==null){try{e(Ue)}catch(t){console.warn("SyncHost install listener:",t)}return}Ur.push(e)}var un="deepview.sync.password",fn=null;function Nr(){return fn}function
|
|
13
|
+
`))}function Mr(e,t,n){return We(e,Ei(t,n))}async function me(e){let t=await crypto.subtle.digest("SHA-256",e);return new Uint8Array(t).toBase64({alphabet:"base64url",omitPadding:!0})}var Ue=null,Ur=[];function Ri(e){if(Ue===e)return;if(Ue!==null)throw new Error("SyncHost: a different host is already installed");Ue=e;let t=Ur.splice(0);for(let n of t)try{n(e)}catch(r){console.warn("SyncHost install listener:",r)}}function fe(){if(Ue===null)throw new Error("SyncHost: not installed \u2014 call installSyncHost(host) during app boot");return Ue}function Et(e){if(Ue!==null){try{e(Ue)}catch(t){console.warn("SyncHost install listener:",t)}return}Ur.push(e)}var un="deepview.sync.password",fn=null;function Nr(){return fn}function Ir(){let e=fe().getSecureItem(un);fn=typeof e=="string"&&e.length>0?e:null}async function et(e){fn=e;let t=fe();e==null?await t.removeSecureItem(un):await t.setSecureItem(un,e)}function Kr(e){let t,n;if(e.startsWith("wss://"))t="https://",n=e.slice(6);else if(e.startsWith("ws://"))t="http://",n=e.slice(5);else if(e.startsWith("https://"))t="https://",n=e.slice(8);else if(e.startsWith("http://"))t="http://",n=e.slice(7);else throw new Error(`sse-transport: unsupported URL scheme: ${e}`);let r=n.indexOf("?");return r>=0&&(n=n.slice(0,r)),`${t}${n}`}function gn(e){return`${Kr(e)}/sse`}function Dr(e){return`${Kr(e)}/save`}var Pi=100,Bi=5e3,Oi=75e3;var dn=class{buf="";parse(t){this.buf+=t;let n=[],r;for(;(r=this.buf.indexOf(`
|
|
14
14
|
|
|
15
15
|
`))>=0;){let o=this.buf.slice(0,r);this.buf=this.buf.slice(r+2);let i="",s=[];for(let a of o.split(`
|
|
16
16
|
`))if(!a.startsWith(":")){if(a.startsWith("event:")){i=a.slice(6).trim();continue}if(a.startsWith("data:")){s.push(a.slice(5).replace(/^ /u,""));continue}}s.length!==0&&n.push({event:i,data:s.join(`
|
|
17
|
-
`)})}return n}},Rt=class e extends EventTarget{static CONNECTING=0;static OPEN=1;static CLOSING=2;static CLOSED=3;CONNECTING=e.CONNECTING;OPEN=e.OPEN;CLOSING=e.CLOSING;CLOSED=e.CLOSED;readyState=e.CONNECTING;baseUrl;sessionId=null;cachedPassword=null;outbound=[];flushTimer=null;inFlightPost=null;activeReaders=new Set;fetchAbort=new AbortController;postSeq=0;lastDispatchedSeq=0;downstreamWatchdog=null;constructor(t){super(),this.baseUrl=gn(t),this.scheduleFlush(!0)}send(t){if(this.readyState===e.CLOSED)throw new Error("sse-transport: send on closed transport");let n;try{n=JSON.parse(t)}catch(r){throw new Error(`sse-transport: send received non-JSON payload: ${r.message}`,{cause:r})}if(n.type==="authenticate"&&typeof n.password=="string"){this.cachedPassword=n.password,this.scheduleFlush();return}this.outbound.push(n),this.scheduleFlush()}close(){this.shutdown()}scheduleFlush(t=!1){if(this.readyState===e.CLOSED)return;if(this.flushTimer!=null)if(t)clearTimeout(this.flushTimer),this.flushTimer=null;else return;let n=t?0:Pi;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},n)}armDownstreamWatchdog(){this.readyState!==e.CLOSED&&(this.downstreamWatchdog!=null&&clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=setTimeout(()=>{this.downstreamWatchdog=null,this.readyState!==e.CLOSED&&(console.warn("sse-transport: no downstream activity within the liveness window; reconnecting"),this.shutdown())},Oi),this.downstreamWatchdog.unref?.())}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let s=new Promise(a=>{setTimeout(a,Bi)});await Promise.race([this.inFlightPost.catch(()=>{}),s])}if(this.readyState===e.CLOSED)return;let t=this.outbound;this.outbound=[];let n={};this.sessionId!=null&&(n.id=this.sessionId),this.cachedPassword!=null&&(n.password=this.cachedPassword),t.length>0&&(n.frames=t);let r=this.baseUrl,o=++this.postSeq;this.armDownstreamWatchdog();let i=(async()=>{let s;try{s=await fetch(r,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n),credentials:"same-origin",signal:this.fetchAbort.signal})}catch(l){this.readyState!==e.CLOSED&&console.warn("sse-transport: POST failed:",l),this.shutdown();return}if(!s.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${s.status} ${s.statusText}; closing`),this.shutdown();return}let a=s.body;if(!a){this.shutdown();return}this.consumeStream(a,o)})();this.inFlightPost=i,i.finally(()=>{this.inFlightPost===i&&(this.inFlightPost=null)})}async consumeStream(t,n){let r=t.getReader();this.activeReaders.add(r);let o=new dn,i=new TextDecoder,s=!1;try{for(;;){let{value:a,done:l}=await r.read();if(l){s=!0;break}if(this.readyState===e.CLOSED)return;n===this.postSeq&&this.armDownstreamWatchdog();let d=o.parse(i.decode(a,{stream:!0}));for(let p of d)this.dispatchOrderedEvent(p,n)}if(this.readyState!==e.CLOSED){let a=i.decode();if(a.length>0)for(let l of o.parse(a))this.dispatchOrderedEvent(l,n)}s&&this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn("sse-transport: live downstream closed without a close frame; reconnecting"),this.shutdown())}catch(a){this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn("sse-transport: stream read failed:",a),this.shutdown())}finally{this.activeReaders.delete(r);try{r.releaseLock()}catch{}}}dispatchOrderedEvent(t,n){if(this.readyState!==e.CLOSED){if(n<this.lastDispatchedSeq){this.shutdown();return}this.lastDispatchedSeq=n,this.dispatchEvent_(t)}}dispatchEvent_(t){if(t.event==="session"){if(this.readyState===e.CLOSED)return;this.sessionId=t.data,this.readyState===e.CONNECTING&&(this.readyState=e.OPEN,this.dispatchEvent(new Event("open")));return}if(t.event==="close"){let n,r;try{let o=JSON.parse(t.data);typeof o.code=="number"&&(n=o.code),typeof o.reason=="string"&&(r=o.reason)}catch{}this.shutdown(n,r);return}if(t.event===""||t.event==="message"){if(this.readyState!==e.OPEN)return;this.dispatchEvent(new MessageEvent("message",{data:t.data}))}}shutdown(t,n){if(this.readyState===e.CLOSED)return;this.readyState=e.CLOSING,this.flushTimer!=null&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.downstreamWatchdog!=null&&(clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=null);try{this.fetchAbort.abort()}catch{}for(let o of this.activeReaders)try{o.cancel().catch(()=>{})}catch{}this.activeReaders.clear(),this.readyState=e.CLOSED;let r=new Event("close");t!=null&&(r.code=t),n!=null&&(r.reason=n),this.dispatchEvent(r)}};var tt=1e3,ji=3e4,Ci=3e4,pn="session restarted";function Pt(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,o=null,i=!1,s=null,a=0,l=!1,d=!1,p=null,y=tt,b=null,A=null,h=null,x=null,k=!1,E=null,B=new Set;function Q(){p&&(clearTimeout(p),p=null)}function te(){b&&(clearTimeout(b),b=null)}function ie(){Q(),!l&&(d||a!==0&&t&&(p=setTimeout(()=>{p=null,N()},Math.round(y*(.5+Math.random()*.5))),y=Math.min(y*2,ji)))}function X(){J(),!(n<=0)&&(i||(A=setInterval(()=>{!o||o.readyState!==o.OPEN||h||(D({type:"ping"}),h=setTimeout(()=>{h=null,console.warn("socket-transport: heartbeat timeout; closing socket");try{o?.close()}catch{}},r))},n)))}function J(){A&&(clearInterval(A),A=null),h&&(clearTimeout(h),h=null)}function q(f){for(let u of B)try{u.onDisconnected(f)}catch(w){console.warn("socket-transport: consumer.onDisconnected threw:",w)}}function $(f){for(let u of B)try{u.onConnected(f)}catch(w){console.warn("socket-transport: consumer.onConnected threw:",w)}}function W(f){for(let u of B)try{u.onMessage(f)}catch(w){console.warn("socket-transport: consumer.onMessage threw:",w)}}function I(f){let u;try{let w=typeof f.data=="string"?f.data:new TextDecoder().decode(f.data);u=JSON.parse(w)}catch(w){console.warn("socket-transport: dropping malformed wire frame:",w);return}if(!(!u||typeof u!="object")){if(u.type==="pong"){h&&(clearTimeout(h),h=null);return}if(u.type==="challenge"){if(typeof u.nonce!="string")return;s!=null&&s!==u.nonce&&q(pn),s=u.nonce,$(s);return}if(u.type==="authenticated"){U(!0),W(u);return}if(u.type==="unauthorized"&&u.kind==="auth-failed"){U(!1);return}W(u)}}function U(f){if(!E)return;let u=E;E=null,u(f)}function D(f){if(!o||o.readyState!==o.OPEN)return!1;try{return o.send(JSON.stringify(f)),!0}catch(u){return console.warn("socket-transport: send failed:",u),!1}}function F(f){return new Promise(u=>{E=u,D({type:"authenticate",password:f})||(E=null,u(!1))})}function _(){if(x)return x;if(!o||o.readyState!==o.OPEN)return Promise.resolve(!1);let f=o,u=(async()=>{await Promise.resolve();try{let w=Nr();if(w!=null&&!k){k=!0;let m=await F(w);if(o!==f)return!1;if(m)return!0;try{await et(null)}catch(v){console.warn("socket-transport: failed to clear cached auth password:",v)}}let c=!0;for(;;){if(o!==f||!o||o.readyState!==o.OPEN||!e.authResolver)return!1;let m;try{m=await e.authResolver({retry:!c})}catch(L){return console.warn("socket-transport: authentication resolver threw:",L),!1}if(o!==f||(c=!1,m==null||m===""))return!1;let v=await F(m);if(o!==f)return!1;if(v){try{await et(m)}catch(L){console.warn("socket-transport: failed to cache auth password:",L)}return!0}}}finally{x=null}})();return x=u,u}function j(f){if(te(),!o)return;let u=o;o=null,s=null,k=!1,U(!1),J(),q(f);try{u.close()}catch{}}function N(){l||d||o||a!==0&&t&&K(!1)}function K(f){if(l||d||a===0||!t)return;let u;try{u=f?new Rt(t):new WebSocket(t)}catch(c){if(!f){console.warn("socket-transport: WebSocket constructor failed; trying SSE fallback:",c),K(!0);return}console.warn("socket-transport: SSE constructor failed:",c),ie();return}o=u,i=f,s=null,k=!1;let w=!1;u.addEventListener("open",()=>{o===u&&(w=!0,te(),b=setTimeout(()=>{b=null,o===u&&(y=tt)},Ci),b.unref?.(),X())}),u.addEventListener("message",c=>{o===u&&I(c)}),u.addEventListener("close",c=>{if(o!==u)return;if(te(),o=null,s=null,k=!1,U(!1),J(),!w&&!f&&!l&&a>0){if(typeof fetch>"u"){q("socket closed"),ie();return}console.warn("socket-transport: WebSocket failed to open; falling back to SSE"),K(!0);return}c?.code===1001&&(y=tt),q("socket closed"),!l&&a>0&&ie()}),u.addEventListener("error",()=>{})}function T(){if(l)return{release(){}};a+=1,a===1&&!o&&N();let f=!1;return{release(){f||(f=!0,!l&&(a-=1,a===0&&(Q(),y=tt,j("released"))))}}}function z(f){f!==t&&(Q(),y=tt,t=f,o&&j("serverUrl changed"),a>0&&t&&N())}function G(f){B.add(f);let u=!1;return{remove(){u||(u=!0,B.delete(f))}}}function H(){l||(l=!0,Q(),j("transport closed"),B.clear(),a=0)}function le(f){let{pingMs:u,pongMs:w}=f;typeof u=="number"&&u>=0&&(n=u),typeof w=="number"&&w>0&&(r=w),A&&X()}function we(){k=!1}function g(f){f!==d&&(d=f,f?(Q(),j("protocol-locked")):a>0&&t&&N())}return{acquire:T,setServerUrl:z,addConsumer:G,send:D,getNonce:()=>s,getSocket:()=>o,isSse:()=>o!=null&&i,runAuthFlow:_,close:H,setProtocolLocked:g,setHeartbeatTimings:le,resetCachedReplayGuard:we}}var yn=64,Li=5,Fr=6,Mi=25,Ui=500;function Ni(e,t){if(!/^\/api\/objstore\/[\w-]+\/[\w-]+$/u.test(e))throw new TypeError(`objstore: urlPath rejected (unexpected shape): ${JSON.stringify(e)}`);let n=new URL(t).origin,r=new URL(e,n);if(r.origin!==n)throw new TypeError(`objstore: urlPath origin mismatch \u2014 expected ${n}, got ${r.origin}`);return r.href}function $r(e){let t=e.requestTimeoutMs??1e4,n=new URL(e.httpOrigin).origin,r=e.transport===void 0,o=e.transport??Pt(e.authResolver===void 0?{serverUrl:e.serverUrl}:{serverUrl:e.serverUrl,authResolver:e.authResolver}),i=!1,s=new Map,a=new Map,l=[],d=[];function p(g,f,u,w){let c=g.seenVersions.get(f);(!c||c.incarnation!==u||w>c.version)&&g.seenVersions.set(f,{incarnation:u,version:w})}function y(g){g.connectedPromise=new Promise((f,u)=>{g.resolveConnected=f,g.rejectConnected=u}),g.connectedPromise.catch(()=>{})}function b(g){g.listedPromise=new Promise((f,u)=>{g.resolveListed=f,g.rejectListed=u}),g.listedPromise.catch(()=>{})}function A(g,f){let u=new Map(g.inventory),w=g.inventorySeeded;g.inventorySeeded=!0,g.inventory.clear();for(let c of f){let m=g.inventory.get(c.resourceTag)??u.get(c.resourceTag),v=m?.incarnation===c.incarnation&&m.version>=c.version?m:{version:c.version,incarnation:c.incarnation,contentLength:c.contentLength};g.inventory.set(c.resourceTag,v),p(g,c.resourceTag,v.incarnation,v.version)}if(g.resolveListed(),!!w){for(let[c,m]of u){let v=g.inventory.get(c);if(v?.incarnation!==m.incarnation){v||g.seenVersions.delete(c);for(let L of g.deletedHandlers)try{L({resourceTag:c,version:m.version})}catch{}}}for(let[c,m]of g.inventory){let v=u.get(c);if(v?.version===m.version&&v.incarnation===m.incarnation)continue;let L={resourceTag:c,version:m.version,incarnation:m.incarnation,contentLength:m.contentLength};for(let ne of g.putHandlers)try{ne(L)}catch{}}}}function h(g){if(!Array.isArray(g))return[];let f=[];for(let u of g)He(u)&&f.push(_e(u));return f}function x(g){let f;return new Promise((u,w)=>{f=setTimeout(()=>w(new Error(`objstore: inventory not seeded (no subscribe ack) after ${t}ms`)),t),g.listedPromise.then(u,w)}).finally(()=>clearTimeout(f))}function k(g){for(let f=0;f<l.length;f++)if(g(l[f]))return Promise.resolve(l.splice(f,1)[0]);return new Promise((f,u)=>{let w={predicate:g,resolve:()=>{},reject:m=>{clearTimeout(c);let v=d.indexOf(w);v>=0&&d.splice(v,1),u(m)}},c=setTimeout(()=>w.reject(new Error(`objstore: response timeout after ${t}ms`)),t);w.resolve=m=>{clearTimeout(c),f(m)},d.push(w)})}function E(g){if(!o.send(g))throw new Error("objstore: socket not open")}function B(g){for(let f of d.splice(0))try{f.reject(new Error(`objstore: ${g}`))}catch{}}function Q(g){if(g.type==="workspace-subscribed"&&typeof g.workspaceTag=="string"){let f=s.get(g.workspaceTag);f&&Array.isArray(g.resources)&&A(f,h(g.resources));return}if(g.type==="objstore-put"&&typeof g.workspaceTag=="string"&&He(g)){let f=s.get(g.workspaceTag);if(!f)return;let u=_e(g),w=f.inventory.get(u.resourceTag);if(w?.incarnation===u.incarnation&&w.version>u.version)return;p(f,u.resourceTag,u.incarnation,u.version),f.inventory.set(u.resourceTag,{version:u.version,incarnation:u.incarnation,contentLength:u.contentLength});let c={resourceTag:u.resourceTag,version:u.version,incarnation:u.incarnation,contentLength:u.contentLength};for(let m of f.putHandlers)try{m(c)}catch{}return}if(g.type==="objstore-deleted"&&typeof g.workspaceTag=="string"&&typeof g.resourceTag=="string"&&typeof g.version=="number"){let f=s.get(g.workspaceTag);if(!f)return;let u=g.resourceTag,w=g.version,c=g.incarnation;if(c!==void 0){if(typeof c!="string"||c.length===0)return;let v=f.inventory.get(u)??f.seenVersions.get(u);if(v&&(c!==v.incarnation||v.version>w))return}f.seenVersions.delete(u),f.inventory.delete(u);let m={resourceTag:u,version:w};for(let v of f.deletedHandlers)try{v(m)}catch{}return}if(!(g.type==="workspace-state"||g.type==="workspace-save-ack"||g.type==="workspace-save-error"||g.type==="workspace-subscribed"||g.type==="authenticated"||g.type==="server-info")){for(let f=0;f<d.length;f++)if(d[f].predicate(g)){let u=d[f];d.splice(f,1),u.resolve(g);return}if(l.push(g),l.length>yn){let f=l.splice(0,l.length-yn),u=[...new Set(f.map(w=>w.type??"<no-type>"))].slice(0,4);console.warn(`objstore: dropping ${f.length} unmatched frame(s) over MAX_QUEUE_SIZE=${yn} (types: ${u.join(", ")})`)}}}function te(){for(let g of s.values())g.closed||g.connected||(g.connected=!0,g.resolveConnected())}function ie(g){B(g);for(let f of s.values())f.closed||f.connected&&(f.connected=!1,y(f))}let X=o.addConsumer({onMessage:Q,onConnected:te,onDisconnected:ie}),J=g=>Ni(g,n),q=(g,f)=>J(`/api/objstore/${g}/${f}`);async function $(g,f,u){let w=o.getNonce();if(!w)throw new Error("objstore: socket not open");let c=await Br(g.signingKey,u,w),m,v=!1;for(;E({type:"objstore-put-begin",...u,signature:c}),m=await k(ne=>ne.workspaceTag===g.workspaceTag&&ne.resourceTag===f&&(ne.type==="objstore-put-token"||ne.type==="objstore-put-error"||ne.type==="objstore-conflict"||ne.type==="unauthorized"&&ne.kind==="gated")),!(m.type!=="unauthorized"||v||(v=!0,!await o.runAuthFlow())););if(m.type==="unauthorized")return{kind:"unauthorized"};if(m.type==="objstore-put-error"){if(m.reason==="workspace-full")return{kind:"workspace-full"};throw new Error(`objstore: put-error reason='${String(m.reason)}'`)}if(m.type==="objstore-conflict")return{kind:"conflict",current:He(m.current)?_e(m.current):null};if(typeof m.urlPath!="string"||typeof m.token!="string")throw new TypeError("objstore: malformed put-token (missing urlPath/token)");return{kind:"token",urlPath:m.urlPath,token:m.token}}async function W(g,f,u,w){let c=Date.now(),m=await Lr(g.signingKey,u,c),v=await globalThis.fetch(q(g.workspaceTag,f),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"put",ts:c,signature:m,prevVersion:u.prevVersion,prevIncarnation:u.prevIncarnation,expectedLength:u.expectedLength,contentHash:w})});if(v.status===401)return{kind:"unauthorized"};if(v.status===403)return{kind:"workspace-full"};if(v.status===409)return{kind:"conflict",current:await hn(v)};if(!v.ok){let ne="";try{ne=await v.text()}catch{}throw new Error(`objstore: REST put-begin failed ${v.status} ${ne.slice(0,200)}`)}let L;try{L=await v.json()}catch{throw new TypeError("objstore: put-mint JSON parse failed")}if(!L||typeof L!="object"||typeof L.urlPath!="string"||typeof L.token!="string")throw new TypeError("objstore: malformed put-mint (missing urlPath/token)");return{kind:"token",urlPath:L.urlPath,token:L.token}}async function I(g,f){let u=`objstore: ${pn}`;for(let w=0;;w++)try{return await f()}catch(c){if(w<Li&&!g.closed&&c instanceof Error&&c.message===u)continue;throw c}}function U(g,f){return I(g,()=>D(g,f))}async function D(g,f){if(await g.connectedPromise,g.closed)throw new Error("objstore: session closed");let u=await me(f.bytes),w={workspaceTag:g.workspaceTag,resourceTag:f.resourceTag,prevVersion:f.prev?.version??null,prevIncarnation:f.prev?.incarnation??null,expectedLength:f.bytes.byteLength,contentHash:u},c;if(o.isSse()?(c=await W(g,f.resourceTag,w,u),c.kind==="unauthorized"&&(c=await $(g,f.resourceTag,w))):c=await $(g,f.resourceTag,w),c.kind==="unauthorized")return{ok:!1,reason:"unauthorized"};if(c.kind==="workspace-full")return{ok:!1,reason:"workspace-full"};if(c.kind==="conflict")return{ok:!1,reason:"conflict",current:c.current};let m=await globalThis.fetch(J(c.urlPath),{method:"PUT",headers:{authorization:`Bearer ${c.token}`,"content-type":"application/octet-stream"},body:f.bytes});if(!m.ok){if(m.status===409||m.status===410)return{ok:!1,reason:"conflict",current:m.status===409?await hn(m):null};let ne="";try{ne=await m.text()}catch{}throw new Error(`objstore: REST PUT failed ${m.status} ${ne.slice(0,200)}`)}let v;try{v=await m.json()}catch{throw new TypeError("objstore: PUT ack JSON parse failed")}if(!v||typeof v!="object"||!nt(v.version)||typeof v.incarnation!="string"||typeof v.contentHash!="string"||!nt(v.contentLength))throw new TypeError("objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)");let L=v;if(L.contentHash!==u||L.contentLength!==f.bytes.byteLength)throw new Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${L.contentHash.slice(0,16)}\u2026 length=${L.contentLength}, client signed ${u.slice(0,16)}\u2026 length=${f.bytes.byteLength}`);return{ok:!0,meta:L}}async function F(g,f){let u=o.getNonce();if(!u)throw new Error("objstore: socket not open");let w=await jr(g.signingKey,g.workspaceTag,f,u);E({type:"objstore-fetch",workspaceTag:g.workspaceTag,resourceTag:f,signature:w});let c=await k(m=>m.workspaceTag===g.workspaceTag&&m.resourceTag===f&&(m.type==="objstore-fetch-token"||m.type==="objstore-fetch-not-found"));if(c.type==="objstore-fetch-not-found")return{kind:"not-found"};if(typeof c.urlPath!="string"||typeof c.token!="string"||!He(c))throw new TypeError("objstore: malformed fetch-token (missing urlPath / token / metadata)");return{kind:"token",urlPath:c.urlPath,token:c.token,meta:_e(c)}}async function _(g,f){let u=Date.now(),w=await Cr(g.signingKey,g.workspaceTag,f,u),c=await globalThis.fetch(q(g.workspaceTag,f),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"fetch",ts:u,signature:w})});if(c.status===404)return{kind:"not-found"};if(c.status===401)return{kind:"unauthorized"};if(!c.ok){let v="";try{v=await c.text()}catch{}throw new Error(`objstore: REST fetch-mint failed ${c.status} ${v.slice(0,200)}`)}let m;try{m=await c.json()}catch{throw new TypeError("objstore: fetch-mint JSON parse failed")}if(!m||typeof m!="object"||typeof m.urlPath!="string"||typeof m.token!="string"||!He(m))throw new TypeError("objstore: malformed fetch-mint (missing urlPath / token / metadata)");return{kind:"token",urlPath:m.urlPath,token:m.token,meta:_e(m)}}async function j(g,f){for(let u=0;u<Fr;u++){let w=await I(g,()=>N(g,f));if(w.kind==="ok")return w.value;if(w.kind==="not-found")return null;if(u+1<Fr){let c=Math.min(Ui,Mi*2**u);await new Promise(m=>{setTimeout(m,c)})}}return null}async function N(g,f){if(await g.connectedPromise,g.closed)throw new Error("objstore: session closed");let u;if(o.isSse()?(u=await _(g,f),u.kind==="unauthorized"&&(u=await F(g,f))):u=await F(g,f),u.kind==="not-found")return{kind:"not-found"};if(u.kind==="unauthorized")throw new Error("objstore: fetch-mint unauthorized");let w=u.meta,c=await globalThis.fetch(J(u.urlPath),{method:"GET",headers:{authorization:`Bearer ${u.token}`}});if(!c.ok){if(c.status===404||c.status===503)return{kind:"retry"};let L="";try{L=await c.text()}catch{}throw new Error(`objstore: REST GET failed ${c.status} ${L.slice(0,200)}`)}let m=new Uint8Array(await c.arrayBuffer()),v=await me(m);if(v!==w.contentHash)throw new Error(`objstore: contentHash mismatch \u2014 expected ${w.contentHash.slice(0,16)}\u2026, got ${v.slice(0,16)}\u2026`);return{kind:"ok",value:{bytes:m,meta:w}}}async function K(g,f){let u=o.getNonce();if(!u)throw new Error("objstore: socket not open");let w=await Or(g.signingKey,f,u);E({type:"objstore-delete",...f,signature:w});let c=await k(m=>m.workspaceTag===g.workspaceTag&&m.resourceTag===f.resourceTag&&(m.type==="objstore-deleted-ack"||m.type==="objstore-delete-error"||m.type==="objstore-conflict"));if(c.type==="objstore-deleted-ack"){if(typeof c.deletedVersion!="number")throw new TypeError("objstore: malformed deleted-ack (deletedVersion not a number)");return{kind:"ok",deletedVersion:c.deletedVersion}}if(c.type==="objstore-conflict")return{kind:"conflict",current:He(c.current)?_e(c.current):null};if(c.reason==="not-found")return{kind:"not-found"};throw new Error(`objstore: delete-error reason='${String(c.reason)}'`)}async function T(g,f,u){let w=Date.now(),c=await Mr(g.signingKey,u,w),m=await globalThis.fetch(q(g.workspaceTag,f),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"delete",ts:w,signature:c,prevVersion:u.prevVersion,prevIncarnation:u.prevIncarnation})});if(m.status===401)return{kind:"unauthorized"};if(m.status===404)return{kind:"not-found"};if(m.status===409)return{kind:"conflict",current:await hn(m)};if(!m.ok){let L="";try{L=await m.text()}catch{}throw new Error(`objstore: REST delete failed ${m.status} ${L.slice(0,200)}`)}let v;try{v=await m.json()}catch{throw new TypeError("objstore: delete-ack JSON parse failed")}if(!v||typeof v!="object"||typeof v.deletedVersion!="number")throw new TypeError("objstore: malformed delete-ack (deletedVersion not a number)");return{kind:"ok",deletedVersion:v.deletedVersion}}function z(g,f,u){return I(g,()=>G(g,f,u))}async function G(g,f,u){if(await g.connectedPromise,g.closed)throw new Error("objstore: session closed");let w={workspaceTag:g.workspaceTag,resourceTag:f,prevVersion:u?.version??null,prevIncarnation:u?.incarnation??null},c;if(o.isSse()?(c=await T(g,f,w),c.kind==="unauthorized"&&(c=await K(g,w))):c=await K(g,w),c.kind==="ok")return{ok:!0,deletedVersion:c.deletedVersion};if(c.kind==="conflict")return{ok:!1,reason:"conflict",current:c.current};if(c.kind==="not-found")return{ok:!1,reason:"not-found"};throw new Error("objstore: delete unauthorized")}function H(g,f,u,w){let c=g.seenVersions.get(f);if(c&&c.incarnation===u&&w<c.version)throw new Error(`objstore: version-rollback rejected \u2014 fetched v${w} for an incarnation we've already seen at v${c.version}`)}async function le(g,f){if(i)throw new Error("objstore: client closed");if(!f||typeof f.workspaceId!="string")throw new Error("objstore: openWorkspace requires a WorkspaceSubscription (triageSync.ensureSubscription) \u2014 the client must not open a session for a tag with no backing sync subscribe");let u=g.workspaceTag;if(f.workspaceTag!=null&&f.workspaceTag!==u)throw new Error("objstore: openWorkspace \u2014 WorkspaceSubscription is for a different workspace than these keys");if(s.has(u))throw new Error(`objstore: workspace ${u.slice(0,8)}\u2026 is already open on this client`);let w={workspaceTag:u,signingKey:g.signingKey,contentKey:new Uint8Array(g.contentKey),tagKey:new Uint8Array(g.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,inventorySeeded:!1,connected:!1,closed:!1};y(w),b(w),s.set(u,w);let c=w;(async()=>{let S;try{S=await f.resources}catch{return}!c.closed&&!c.inventorySeeded&&A(c,h(S))})();let m=o.acquire();a.set(u,m),o.getNonce()&&(c.connected=!0,c.resolveConnected());let v=null;try{await new Promise((S,R)=>{v=setTimeout(()=>{R(new Error(`objstore: connect timeout after ${t}ms`))},t),c.connectedPromise.then(()=>S(),P=>R(P))})}catch(S){v&&clearTimeout(v),s.delete(u),a.delete(u),c.closed=!0;try{c.contentKey.fill(0)}catch{}try{c.tagKey.fill(0)}catch{}throw m.release(),S}v&&clearTimeout(v);async function L(S,R,P){let V=await U(c,{resourceTag:S,bytes:R,prev:P});return V.ok?(P==null&&c.seenVersions.delete(S),p(c,S,V.meta.incarnation,V.meta.version),c.inventory.set(S,{version:V.meta.version,incarnation:V.meta.incarnation,contentLength:V.meta.contentLength}),{ok:!0,meta:{version:V.meta.version,incarnation:V.meta.incarnation,contentLength:V.meta.contentLength}}):V.reason==="workspace-full"?{ok:!1,reason:"workspace-full"}:V.reason==="unauthorized"?{ok:!1,reason:"unauthorized"}:(V.current&&p(c,S,V.current.incarnation,V.current.version),{ok:!1,reason:"conflict",current:V.current})}async function ne(S){let R=await ue(c.tagKey,S.fileName),P=cn(c.contentKey,S.fileName,S.content,u,R);return await L(R,P,S.prev)}async function Qn(S){let R=await ue(c.tagKey,S),P=await j(c,R);if(!P)return null;H(c,R,P.meta.incarnation,P.meta.version);let{fileName:V,content:wt}=Tt(c.contentKey,P.bytes,u,R);if(V!==S)throw new Error(`objstore: fileName-binding mismatch \u2014 requested '${S}', payload encoded '${V}'`);return p(c,R,P.meta.incarnation,P.meta.version),{content:wt,version:P.meta.version,incarnation:P.meta.incarnation}}async function Bo(S){let R=await j(c,S);if(!R)return null;H(c,S,R.meta.incarnation,R.meta.version);let{fileName:P,content:V}=Tt(c.contentKey,R.bytes,u,S);if(await ue(c.tagKey,P)===S)return p(c,S,R.meta.incarnation,R.meta.version),{kind:"report",fileName:P,content:V,version:R.meta.version,incarnation:R.meta.incarnation};if(await ve(c.tagKey,P)===S){let{name:Xt,content:Uo}=ln(V);return p(c,S,R.meta.incarnation,R.meta.version),{kind:"bundle",integrity:P,name:Xt,content:Uo,version:R.meta.version,incarnation:R.meta.incarnation}}throw new Error("objstore: fetchByTag \u2014 decrypted name does not derive back to the requested resourceTag under either the report or bundle tag scheme (relay or workspace member produced a non-round-trippable tag-name pair)")}async function er(S,R){let P=await z(c,S,R);return P.ok?(c.seenVersions.delete(S),c.inventory.delete(S),P):P.reason==="not-found"?{ok:!1,reason:"not-found"}:(P.current&&p(c,S,P.current.incarnation,P.current.version),{ok:!1,reason:"conflict",current:P.current})}async function Oo(S,R){let P=await ue(c.tagKey,S);return await er(P,R)}async function jo(){if(await x(c),c.closed)throw new Error("objstore: session closed");return[...c.inventory.entries()].map(([S,R])=>({resourceTag:S,version:R.version,incarnation:R.incarnation,contentLength:R.contentLength}))}async function Co(S){let R=await ve(c.tagKey,S.integrity),P=Pr(S.name,S.content),V=cn(c.contentKey,S.integrity,P,u,R);return await L(R,V,S.prev)}async function Lo(S){let R=await ve(c.tagKey,S),P=await j(c,R);if(!P)return null;H(c,R,P.meta.incarnation,P.meta.version);let{fileName:V,content:wt}=Tt(c.contentKey,P.bytes,u,R);if(V!==S)throw new Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${S}', payload encoded '${V}'`);let{name:tr,content:Xt}=ln(wt);return p(c,R,P.meta.incarnation,P.meta.version),{name:tr,content:Xt,version:P.meta.version,incarnation:P.meta.incarnation}}async function Mo(S,R){let P=await ve(c.tagKey,S);return await er(P,R)}return{put:ne,fetch:Qn,fetchByTag:Bo,delete:Oo,list:jo,putBundle:Co,fetchBundle:Lo,deleteBundle:Mo,onPut(S){return c.putHandlers.add(S),()=>{c.putHandlers.delete(S)}},onDeleted(S){return c.deletedHandlers.add(S),()=>{c.deletedHandlers.delete(S)}},close(){if(c.closed)return;c.closed=!0,s.delete(u);try{c.contentKey.fill(0)}catch{}try{c.tagKey.fill(0)}catch{}try{c.rejectConnected(new Error("objstore: session closed"))}catch{}try{c.rejectListed(new Error("objstore: session closed"))}catch{}let S=a.get(u);a.delete(u),S&&S.release()}}}function we(){if(!i){i=!0;for(let g of s.values()){g.closed=!0;try{g.contentKey.fill(0)}catch{}try{g.tagKey.fill(0)}catch{}try{g.rejectConnected(new Error("objstore: client closed"))}catch{}try{g.rejectListed(new Error("objstore: client closed"))}catch{}}s.clear();for(let g of a.values())g.release();a.clear(),X.remove(),r&&o.close()}}return{openWorkspace:le,close:we}}async function hn(e){try{let t=await e.json();if(nt(t.currentVersion)&&typeof t.currentIncarnation=="string")return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function nt(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function He(e){return!e||typeof e!="object"?!1:typeof e.resourceTag=="string"&&nt(e.version)&&typeof e.incarnation=="string"&&typeof e.contentHash=="string"&&nt(e.contentLength)&&typeof e.signature=="string"}function _e(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var mn=null;function Wr(e){mn=typeof e=="function"?e:null}var Ki=Pt({serverUrl:"",authResolver:e=>mn==null?Promise.resolve(null):mn(e)});function Bt(){return Ki}var Hr=new Set(["busy"]);function _r(e){return e==="inprogress"||e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function Te(e){if(e)return _r(e.triage)??(e.deleted?"deleted":void 0)}function Ii(e){return e?!e.color&&!Te(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0)&&e.flagged===void 0:!0}function xe(e){if(!e||typeof e!="object")return;let t=e,n={};typeof t.color=="string"&&t.color&&(n.color=t.color);let r=_r(t.triage)??(t.deleted?"deleted":void 0);if(r&&(n.triage=r),typeof t.comment=="string"&&t.comment&&(n.comment=t.comment),typeof t.fix=="string"&&t.fix&&(n.fix=t.fix),typeof t.flagged=="boolean"&&(n.flagged=t.flagged),Array.isArray(t.ignoredReports)){let o=t.ignoredReports.filter(i=>typeof i=="string"&&i.length>0);o.length>0&&(n.ignoredReports=o)}return Ii(n)?void 0:n}function Di(e,t){let n=e??[],r=t??[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let o=new Set(n);for(let i of r)if(!o.has(i))return!1;return!0}function zr(e,t){let n=e??{},r=t??{};return(n.color??"")===(r.color??"")&&(Te(n)??"")===(Te(r)??"")&&(n.comment??"")===(r.comment??"")&&(n.fix??"")===(r.fix??"")&&n.flagged===r.flagged&&Di(n.ignoredReports,r.ignoredReports)}function de(e,t,n){let r=e.get(t),o=xe({...r,...n});return o===void 0?e.delete(t):zr(r,o)?!1:(e.set(t,o),!0)}function Vr(e,t,n){let r=xe(n),o=e.get(t);return r===void 0?e.delete(t):zr(o,r)?!1:(e.set(t,r),!0)}function qr(e,t,n,r){let o=new Set(e.get(t)?.ignoredReports??[]);return r?o.add(n):o.delete(n),de(e,t,{ignoredReports:o.size>0?[...o]:void 0})}function Fi(e){return typeof e?.color=="string"?e.color:""}function $i(e){return e?.triage==="inprogress"||e?.triage==="fixed"||e?.triage==="invalid"||e?.triage==="deleted"?e.triage:e?.deleted?"deleted":""}function Wi(e){return typeof e?.comment=="string"?e.comment:""}function Hi(e){return typeof e?.fix=="string"?e.fix:""}function _i(e){return e?.flagged===!0?"flagged":e?.flagged===!1?"not flagged":""}function Gr(e,t,n,r){let o=[];for(let i of Object.keys(e)){let s=e[i],a=t[i],l=n[i],d=s??null,p=[{name:"color",norm:Fi},{name:"triage",norm:$i},{name:"comment",norm:Wi},{name:"fix",norm:Hi},{name:"flagged",norm:_i}];for(let{name:y,norm:b}of p){let A=b(a),h=b(d),x=b(l);(h!==A||r?.has(i))&&x!==A&&h!==x&&o.push({id:i,property:y,local:h,imported:x})}}return o}function Jr(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let o=new Set(n);for(let i of r)if(!o.has(i))return!1;return!0}function Yr(e,t){let n=e.triage??(e.deleted?"deleted":""),r=t.triage??(t.deleted?"deleted":"");return e.color===t.color&&n===r&&(e.comment??"")===(t.comment??"")&&(e.fix??"")===(t.fix??"")&&e.flagged===t.flagged&&Jr(e.ignoredReports,t.ignoredReports)}function wn(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!Yr(e[r]??{},t[r]??{}))return!1;return!0}function zi(e=[],t=[],n=[]){let r=new Set(e),o=new Set(t),i=new Set(n);for(let s of r)o.has(s)||i.delete(s);for(let s of o)r.has(s)||i.add(s);return[...i]}function Xr(e,t,n,r){let o=Object.assign(Object.create(null),n);for(let i of new Set([...Object.keys(e),...Object.keys(t),...r??[]])){let s=r?.has(i),a=xe(e[i])??{},l=xe(t[i])??{},d={...xe(n[i])};for(let y of["color","comment","fix","flagged"])(a[y]!==l[y]||s)&&Object.assign(d,{[y]:l[y]});if(s||a.triage!==l.triage||!Jr(a.ignoredReports,l.ignoredReports)){let y=!s&&l.triage===void 0&&d.triage===void 0?zi(a.ignoredReports,l.ignoredReports,d.ignoredReports):l.ignoredReports??[];l.triage===void 0?delete d.triage:d.triage=l.triage,y.length===0?delete d.ignoredReports:d.ignoredReports=y}let p=xe(d);p?o[i]=p:delete o[i]}return o}function rt(e,t){let n=Object.assign(Object.create(null),e);for(let[r,o]of Object.entries(t))o===null?delete n[r]:o!==void 0&&(n[r]=o);return n}function ze(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r){let i=e[o]??{},s=t[o]??{};Yr(i,s)||(n[o]=t[o]??null)}return n}function Zr(e){for(let t in e)return!1;return!0}function Ne(e,t){let n=Object.assign(Object.create(null),e),r=fe().state,o=t instanceof Set?t:new Set(t);for(let i of o){let s=xe(r.triage.get(i));s?n[i]=s:delete n[i]}return n}function bn(e,t){let n=fe().state,r=[];for(let o of t){let i=e[o];if(!i||typeof i!="object")continue;let s=n.triage.get(o);if(i.color){let d=s?.color;d===void 0?de(n.triage,o,{color:i.color}):d!==i.color&&r.push({id:o,property:"color",local:d,imported:i.color})}let a=Te(i);if(a){let d=Te(s);d===void 0?de(n.triage,o,{triage:a}):d!==a&&r.push({id:o,property:"triage",local:d,imported:a})}if(i.comment){let d=s?.comment;d===void 0?de(n.triage,o,{comment:i.comment}):d!==i.comment&&r.push({id:o,property:"comment",local:d,imported:i.comment})}if(i.fix){let d=s?.fix;d===void 0?de(n.triage,o,{fix:i.fix}):d!==i.fix&&r.push({id:o,property:"fix",local:d,imported:i.fix})}if(typeof i.flagged=="boolean"){let d=s?.flagged;d===void 0?de(n.triage,o,{flagged:i.flagged}):d!==i.flagged&&r.push({id:o,property:"flagged",local:d?"flagged":"not flagged",imported:i.flagged?"flagged":"not flagged"})}if(!(a!=null||Te(s)!=null||!Array.isArray(i.ignoredReports))&&!((s?.ignoredReports?.length??0)>0))for(let d of i.ignoredReports)typeof d=="string"&&qr(n.triage,o,d,!0)}return r}function vn(e,t){let n=fe().state;for(let r of e){let o=`${r.id}:${r.property}`;t[o]==="imported"&&Vi(r.id,r.property)===r.local&&(r.property==="color"?de(n.triage,r.id,{color:r.imported}):r.property==="comment"?de(n.triage,r.id,{comment:r.imported}):r.property==="fix"?de(n.triage,r.id,{fix:r.imported}):r.property==="triage"?r.imported==="inprogress"||r.imported==="fixed"||r.imported==="invalid"||r.imported==="deleted"?de(n.triage,r.id,{triage:r.imported,ignoredReports:void 0}):de(n.triage,r.id,{triage:void 0}):r.property==="flagged"&&de(n.triage,r.id,{flagged:r.imported==="flagged"?!0:r.imported==="not flagged"?!1:void 0}))}}function Vi(e,t){let n=fe().state.triage.get(e);return t==="color"?n?.color??"":t==="triage"?Te(n)??"":t==="comment"?n?.comment??"":t==="fix"?n?.fix??"":t==="flagged"?n?.flagged===!0?"flagged":n?.flagged===!1?"not flagged":"":""}function Qr(e,t){let n=fe().state,r=t instanceof Set?t:new Set(t);for(let o of r){let i=e[o],s=Te(i)?void 0:i?.ignoredReports;Vr(n.triage,o,{...i,ignoredReports:s})}}var kn="deepview.sync.sessions",qi=kn,Sn=1,jt=!1,Ot=new Set;function eo(){return jt}function ot(e){if(jt!==e){jt=e,console.warn(e?"triage-sync: can't persist the sessions blob \u2014 either it's an unrecognised future version (writes skipped to avoid clobbering a newer build's data) or the write itself failed (storage full / vault locked). Your in-memory triage state still works this session but will not persist across reload. Free up storage and/or clear localStorage[deepview.sync.sessions]; the badge clears on the next successful save.":"triage-sync: persistence recovered; persisted-sessions blob is now writable.");for(let t of Ot)try{t(e)}catch(n){console.warn("persistenceDegraded listener:",n)}}}function to(e){let t=n=>e(n);return Ot.add(t),queueMicrotask(()=>{if(Ot.has(t))try{t(jt)}catch(n){console.warn("persistenceDegraded listener:",n)}}),()=>Ot.delete(t)}function Ct(){try{let e=fe().getSecureItem(kn);if(!e)return{kind:"empty"};let t=JSON.parse(e);if(!t||typeof t!="object")return{kind:"empty"};let n=t;return n.version===Sn&&n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions)?{kind:"v1",map:n.sessions}:n.version===Sn?{kind:"empty"}:"version"in n?{kind:"unknown-version"}:{kind:"legacy",map:n}}catch{return{kind:"empty"}}}function Gi(){let e=Ct();return e.kind==="v1"||e.kind==="legacy"?e.map:{}}async function Ji(e){try{return await fe().setSecureItem(kn,JSON.stringify({version:Sn,sessions:e})),!0}catch(t){return console.warn("Triage sync: could not persist session state:",t),!1}}function Tn(e,t){if(!t)return null;let r=Gi()[e];return!r||r.serverUrl!==t?null:{baseRevision:typeof r.baseRevision=="string"?r.baseRevision:null,...r.hasBase===!0?{hasBase:!0}:{},baseState:r.baseState&&typeof r.baseState=="object"?Object.assign(Object.create(null),r.baseState):Object.create(null),savesSinceKeyframe:typeof r.savesSinceKeyframe=="number"?r.savesSinceKeyframe:0}}async function Lt(e){await navigator.locks.request(qi,async()=>{let t=Ct();if(t.kind==="unknown-version"){ot(!0);return}let n=t.kind==="v1"||t.kind==="legacy"?t.map:{};if(await e(n)===!1)return;let o=await Ji(n);ot(!o)})}function xn(e=null){Lt(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(fe().listWorkspaces().map(i=>i.id)),o=!1;for(let i of n){let s=t[i];(!r.has(i)||e!=null&&s?.serverUrl!==e)&&(delete t[i],o=!0)}return o?void 0:!1}).catch(t=>{console.warn("Triage sync: prunePersistedSessions lock failed:",t)})}function Mt(e){return Lt(t=>{if(!(e in t))return!1;delete t[e]})}function no(e){if(typeof e!="string"||!e.trim())return null;try{let t=new URL(e);return!["http:","https:"].includes(t.protocol)||t.username||t.password||t.search||t.hash?null:(t.pathname=t.pathname.replace(/\/+$/u,"")+"/",t.href)}catch{return null}}function ro(e){if(e==null||typeof e!="object")return null;let t=e.mode;if(t!=="e2e"&&t!=="managed"&&t!=="managed+e2e"&&t!=="e2e+managed")return null;let n=null,r=e.managed;if(r!=null&&typeof r=="object"){let i=r.loginPath,s=r.cookieName;typeof i=="string"&&typeof s=="string"&&(n={loginPath:i,cookieName:s},r.allowShare===!0&&(n.allowShare=!0))}let o=t==="managed"?null:no(e.deepviewScanServer);return{mode:t,managed:n,...o?{deepviewScanServer:o}:{}}}var Nt=!1,Ut=new Set;function An(){return Nt}function it(e){if(Nt!==e){Nt=e,e&&console.warn("triage-sync: the sync relay appears to sit behind an authentication proxy (e.g. Cloudflare Access) and this session is no longer authorised \u2014 reconnects are being redirected to the proxy login. Reload the page to sign in again.");for(let t of Ut)try{t(e)}catch(n){console.warn("proxyAuthRequired listener:",n)}}}function oo(e){let t=n=>e(n);return Ut.add(t),queueMicrotask(()=>{if(Ut.has(t))try{t(Nt)}catch(n){console.warn("proxyAuthRequired listener:",n)}}),()=>Ut.delete(t)}async function io(e){if(typeof fetch>"u"||!e)return!1;let t;try{t=gn(e)}catch{return!1}let n;try{n=await fetch(t,{method:"GET",redirect:"manual",credentials:"same-origin",cache:"no-store"})}catch{return!1}return n.type==="opaqueredirect"}var lo,ut,$t,so,uo,Yi="deepview.triageSyncUrl",fo="deepview.sync.userEnabled",Xi=/^\d+$/u,Ht=()=>{},lt=null,pe="",ct=!0,Rn=!1,oe=Bt(),st=null,Ae=100,Zi=5,Qi=2e3;function Pe(){return ct&&!Rn&&!!pe&&es()}function es(){try{return ut().length>0}catch{return!1}}var Pn=new Set,Bn=new Set,On=null;function ts(e){let t=ro(e);if(t!=null){On=t;for(let n of Bn)try{n(t)}catch(r){console.warn("Triage sync: onServerInfo listener failed:",r)}}}function Wt(){if(!Pe())return"off";for(let t of O.values())if(t.error)return"error";let e=oe.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return"offline";for(let t of O.values())if(!t.subscribeAcked)return"connecting";return"online"}var ao="off";function ee(){let e=Wt();if(e!==ao){ao=e,is(e);for(let t of Pn)try{t(e)}catch(n){console.warn("Triage sync status listener:",n)}}}var ns=6e3,rs=3e4,Ie=null,Kt=!1,jn=0;function Cn(e){return e==="offline"||e==="connecting"}function Nn(){jn+=1,Ie!=null&&(clearTimeout(Ie),Ie=null)}function go(e){Nn(),Ie=setTimeout(()=>{Ie=null,os()},e),Ie.unref?.()}async function os(){if(Kt||!Pe()||!Cn(Wt()))return;let e=jn;Kt=!0;let t=!1;try{t=await io(pe)}catch{t=!1}finally{Kt=!1}if(jn===e){if(!Pe()||!Cn(Wt())){it(!1);return}if(t){it(!0);return}go(rs)}}function is(e){Cn(e)?Ie==null&&!Kt&&!An()&&go(ns):(Nn(),it(!1))}var Ln=0,O=new Map;function Mn(e){for(let t of O.values())if(t.workspaceTag===e)return t;return null}function ge(e){return O.get(e.workspaceId)===e}function ss(e){e.busyRetryTimer==null&&(e.busyRetryTimer=setTimeout(()=>{e.busyRetryTimer=null,ge(e)&&(e.error||e.pending||!e.pendingSave||(e.pendingSave=!1,ae(e)))},Qi),e.busyRetryTimer.unref?.())}function _t(e){e.busyRetryTimer!=null&&(clearTimeout(e.busyRetryTimer),e.busyRetryTimer=null)}function co(e){if(e.appliedRevisions.clear(),_t(e),e.key){try{e.key.fill(0)}catch{}e.key=null}if(e.signingKey=null,e.verifyingKey=null,e.objstoreResourceWaiters.length>0){let t=e.objstoreResourceWaiters.splice(0);for(let n of t)try{n([])}catch{}}}function po(e){let t=new Set,n=ut().find(o=>o.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let o of lo.reports)if(r.has(o.fileName))for(let i of o.groups)for(let s of i){let a=s.id??String(s._id);Xi.test(a)||t.add(a)}return t}function Kn(e){let t=po(e.workspaceId),n=[];for(let o of t)e.ids.has(o)||n.push(o);let r=[];return n.length>0&&(r=bn(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function as(){let e=Ct();e.kind==="unknown-version"?ot(!0):(e.kind==="v1"||e.kind==="legacy")&&ot(!1),Kr(),oe.resetCachedReplayGuard()}function In(e){if(!e||!pe)return;let t=pe,n=e.generation,r={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState,...e.baseRevision===null&&e.hasBase?{hasBase:!0}:{}};Lt(o=>{if(!ge(e)||e.generation!==n||pe!==t)return!1;o[e.workspaceId]=r}).catch(o=>{console.warn("Triage sync: persistSession lock failed:",o)})}function Un(e){let t=ut().find(r=>r.id===e.workspaceId);if(!t){e.error="workspace no longer exists",ee();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,o]=await Promise.all([br(t.privateKey),kt(t.privateKey,e.workspaceId)]);if(O.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=o.privateKey,e.verifyingKey=o.publicKey,e.workspaceTag=o.publicKeyB64,oe.getSocket()?.readyState!==WebSocket.OPEN){Ke();return}Ge(e),ae(e),ee()}catch(r){console.warn("Triage sync: key derivation failed:",r),O.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${r instanceof Error?r.message:String(r)}`,ee())}})()}function It(e){return oe.send(e)}function cs(e,t){if(!oe.isSse()){It(t);return}let n=e.generation,r=e.pending,o=()=>ge(e)&&e.generation===n&&e.pending===r;ls(t,o).then(i=>(i&&o()&&It(t),null)).catch(()=>{o()&&It(t)})}async function ls(e,t){if(!pe)return!0;let n;try{n=Dr(pe)}catch{return!0}let r;try{r=await globalThis.fetch(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e),signal:AbortSignal.timeout(3e4)})}catch{return!0}if(!t())return!1;let o=e.workspaceTag,i=e.base??null;if(r.status===401)return!0;if(r.ok){let s=null;try{s=await r.json()}catch{return!0}return t()?!s||typeof s.id!="string"?!0:(at({type:"workspace-save-ack",workspaceTag:o,base:i,id:s.id},t),!1):!1}if(r.status===409){let s=null;try{s=await r.json()}catch{return!0}if(!t())return!1;let a=s&&Array.isArray(s.revisions)?s.revisions:[];return at({type:"workspace-state",workspaceTag:o,revisions:a},t),at({type:"workspace-save-error",workspaceTag:o,base:i,reason:"stale-base"},t),!1}return r.status===413?(at({type:"workspace-save-error",workspaceTag:o,base:i,reason:"too-large"},t),!1):!0}function Ge(e,t=!1){if(!ge(e)||!Pe())return;let n=oe.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=oe.getNonce();if(r==null)return;let o=e.baseRevision,i=n,s=e.signingKey,a=e.workspaceTag,l=e.generation;(async()=>{try{let d=await kr(s,a,o,r);if(O.get(e.workspaceId)!==e||e.generation!==l||e.workspaceTag!==a||oe.getSocket()!==i||oe.getNonce()!==r)return;e.subscribed=!0,It({type:"workspace-subscribe",workspaceTag:a,from:o,signature:d})}catch(d){console.warn("Triage sync: subscribe sign failed:",d)}})()}function ae(e){if(!ge(e)||!Pe()||e.error)return;if(e.pending||e.encrypting||e.receiving){e.pendingSave=!0;return}if(!e.key||!e.signingKey||!e.workspaceTag){e.pendingSave=!0;return}Kn(e),e.localState=Ne(e.baseState,e.ids);let t=oe.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=Ae,r=n?Object.create(null):e.baseState,o=ze(r,e.localState);if(Zr(o)&&!n)return;let i=e.baseRevision,s=e.key,a=e.signingKey,l=e.workspaceTag,d=e.generation;e.encrypting=!0,(async()=>{try{let p=sn(l,i),{nonce:y,ciphertext:b}=await xr(s,o,p),A={publicKeyB64:l,base:i,keyframe:n,nonceB64:y,ciphertextB64:b},h=await Sr(a,A),x=await on(A);if(O.get(e.workspaceId)!==e||e.generation!==d||e.workspaceTag!==l)return;if(e.baseRevision!==i||e.receiving){e.pendingSave=!0;return}e.pending={base:i,id:x,changeset:o,keyframe:n},e.pendingSave=!1;let k={type:"workspace-save",workspaceTag:l,base:i,nonce:y,ciphertext:b,signature:h};n&&(k.keyframe=!0),cs(e,k),e.consecutiveFailures=0,e.error&&(e.error=null,ee())}catch(p){console.warn("Triage sync: encrypt/sign failed:",p),ge(e)&&e.generation===d&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=Zi&&(e.error=`encrypt/sign failed: ${p instanceof Error?p.message:String(p)}`,ee()))}finally{ge(e)&&e.generation===d&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&!e.receiving&&(e.pendingSave=!1,ae(e)))}})()}async function us(e,t,n,r){for(let o of t){if(!o||typeof o!="object"||typeof o.id=="string"&&(o.id===e.baseRevision||e.appliedRevisions.has(o.id)||r.has(o.id)))continue;let i=e.baseRevision,s=o.keyframe===!0;if(!(i==null?o.base==null||s:o.base===i))return console.warn(`Triage sync: chain base mismatch (expected ${i}, got ${o.base})`),!1;if(typeof o.signature!="string"||typeof o.nonce!="string"||typeof o.ciphertext!="string"||typeof o.id!="string")return console.warn("Triage sync: revision missing signature/nonce/ciphertext/id; resyncing"),e.savesSinceKeyframe=Ae,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let l=typeof o.base=="string"?o.base:null,d={publicKeyB64:e.workspaceTag,base:l,keyframe:s,nonceB64:o.nonce,ciphertextB64:o.ciphertext},p=await Tr(e.verifyingKey,d,o.signature);if(!n())return!1;if(!p)return console.warn("Triage sync: revision signature did not verify; resyncing"),e.savesSinceKeyframe=Ae,!1;let y=await on(d);if(!n())return!1;if(o.id!==y)return console.warn("Triage sync: revision id does not match content hash; resyncing"),e.savesSinceKeyframe=Ae,!1;let b;try{let h=sn(e.workspaceTag,l);b=await Ar(e.key,o.nonce,o.ciphertext,h)}catch(h){return console.warn("Triage sync: decrypt failed; resyncing",h),e.savesSinceKeyframe=Ae,!1}if(!n())return!1;let A=s?Object.create(null):e.baseState;e.baseState=rt(A,b??{}),e.baseRevision=o.id,e.appliedRevisions.add(o.id),e.pending?.id===o.id&&(e.pending=null),s?e.savesSinceKeyframe=0:e.savesSinceKeyframe=Math.min((e.savesSinceKeyframe??0)+1,Ae)}return!0}async function yo(e,t,n=[],r=null){if(!ge(e))return;let o=e.generation;e.localState=rt(e.baseState,t),Ln++;try{Qr(e.localState,e.ids),r&&n.length>0&&(vn(n.filter(({id:i})=>e.ids.has(i)),r),e.localState=Ne(e.baseState,e.ids)),In(e),await $t()}finally{Ln--}if(!(!ge(e)||e.generation!==o)){e.localState=Ne(e.baseState,e.ids),Ht();for(let i of O.values())i!==e&&ae(i)}}function Dt(e){return Kn(e),e.localState=Ne(e.baseState,e.ids),ze(e.baseState,e.localState)}async function fs(e,t){let n=e.generation;if(e.pending&&t.base===e.pending.base&&typeof t.id=="string"&&t.id===e.pending.id){Dt(e);let r=e.localState,o=e.pending.keyframe?Object.create(null):e.baseState;if(e.baseState=rt(o,e.pending.changeset),e.baseRevision=t.id,e.hasBase=!0,e.appliedRevisions.add(t.id),e.savesSinceKeyframe=e.pending.keyframe?0:Math.min((e.savesSinceKeyframe??0)+1,Ae),e.pending=null,e.staleResetAttempted=!1,await yo(e,ze(e.baseState,r)),!ge(e)||e.generation!==n)return;(e.pendingSave||!wn(e.localState,e.baseState))&&(e.pendingSave=!1,ae(e));return}if(e.pending){let r=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: ack mismatch (pending ${e.pending.base}/${e.pending.id.slice(0,8)}, ack ${t.base}/${r})`);return}if(t.id!==e.baseRevision){let r=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${r}\u2026; pending was already cleared`),e.pendingSave=!0,ae(e)}}async function ds(e,t){if(!Array.isArray(t)||!e.key)return;if(t.length===0){e.resyncAttempted&&(e.resyncAttempted=!1,e.pending||(e.pendingSave=!1,ae(e)));return}let n=e.generation,r=e.workspaceTag,o=()=>ge(e)&&e.generation===n&&e.workspaceTag===r;e.receiving=!0;try{Dt(e);let i=e.baseState,s=e.pending,a=e.baseRevision,l={...e,appliedRevisions:new Set},d=await us(l,t,o,e.appliedRevisions);if(!o())return;if(l.baseRevision!==a){let y=s&&l.pending===null?rt(s.keyframe?Object.create(null):i,s.changeset):i;Dt(e);let b=ze(y,e.localState),h=a===null&&!(s&&l.pending===null)?new Set([...Object.keys(y),...e.hasBase?e.ids:[]]):void 0;if(h)for(let B of h)b[B]=e.localState[B]??null;let x=Gr(b,y,l.baseState,h).filter(({id:B})=>e.ids.has(B)),k=null;if(x.length>0&<){try{k=await lt(x,l.baseState,"chain")??null}catch(B){console.warn("Triage sync: chain-conflict resolver failed:",B)}if(!o())return}Dt(e);let E=Xr(y,e.localState,l.baseState,h);e.baseRevision=l.baseRevision,e.hasBase=!0;for(let B of l.appliedRevisions)e.appliedRevisions.add(B);if(e.baseState=l.baseState,e.savesSinceKeyframe=l.savesSinceKeyframe,e.pending&&(e.pendingSave=!0),e.pending=null,await yo(e,ze(e.baseState,E),x,k),!o())return}else e.savesSinceKeyframe=l.savesSinceKeyframe;if(!d){if(e.pendingSave=!1,!e.resyncAttempted){e.resyncAttempted=!0,Ge(e,!0);return}console.warn("Triage sync: catch-up also broke continuity; full state push"),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Ae,e.pending=null,e.resyncAttempted=!1,e.pendingSave=!0,In(e),Ht();return}e.resyncAttempted=!1,e.staleResetAttempted=!1,wn(e.localState,e.baseState)||(e.pendingSave=!0)}finally{o()&&(e.receiving=!1,e.pendingSave&&!e.pending&&!e.error&&(e.pendingSave=!1,ae(e)))}}async function gs(e){if(e.type==="server-info"){ts(e);return}if(e.type==="authenticated"){for(let n of O.values())Ge(n),ae(n);return}if(e.type==="unauthorized"){if(e.kind==="gated"){if(typeof e.workspaceTag=="string"){let n=Mn(e.workspaceTag);n&&typeof e.resourceTag!="string"&&ps(n,e)}oe.runAuthFlow().catch(n=>{console.warn("Triage sync: auth flow failed:",n)})}return}if(typeof e.workspaceTag!="string")return;let t=Mn(e.workspaceTag);if(t){if(e.type==="workspace-save-ack")await fs(t,e);else if(e.type==="workspace-state")await ds(t,e.revisions);else if(e.type==="workspace-save-error")hs(t,e);else if(e.type==="workspace-subscribed"){if(t.subscribeAcked=!0,Array.isArray(e.resources)){let n=e.resources,r=t.objstoreResourceWaiters.splice(0);for(let o of r)try{o(n)}catch{}}ee()}}}function ps(e,t){e.pending&&(typeof t.base!="string"&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var ys=/^[\w-]+$/u;function hs(e,t){if(!e.pending||typeof t.base!="string"&&t.base!==null||t.base!==e.pending.base)return;let n=t.reason,r=typeof n=="string"&&n.length>0&&n.length<=64&&ys.test(n)?n:"rejected";if(e.pending=null,Hr.has(r)){e.pendingSave=!0,ss(e);return}if(r==="stale-base"&&!e.staleResetAttempted){e.staleResetAttempted=!0,console.warn("Triage sync: stale-base catch-up did not apply (server chain gone or rebuilt past our base); full state push"),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Ae,e.pendingSave=!1,e.resyncAttempted=!1,In(e),Ht(),ae(e);return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,ee()}var Ve=Promise.resolve(),qe=0;function at(e,t=()=>!0){let n=qe,r=typeof e.workspaceTag=="string"?Mn(e.workspaceTag):null;if(typeof e.workspaceTag=="string"&&!r)return;let o=r?.generation;Ve=Ve.then(()=>{if(!(!t()||qe!==n||r&&(!ge(r)||r.generation!==o)))return gs(e)}).catch(i=>{console.warn("Triage sync handler error:",i)})}function ms(e){for(let t of O.values())t.pending=null,t.pendingSave=!1,Ge(t),ae(t);ee()}function ws(e){qe++,Ve=Promise.resolve();for(let t of O.values())t.generation++,t.encrypting=!1,t.receiving=!1,t.pending=null,t.subscribed=!1,t.subscribeAcked=!1,t.resyncAttempted=!1,t.staleResetAttempted=!1,t.pendingSave=!0,_t(t);ee()}oe.addConsumer({onMessage:at,onConnected:ms,onDisconnected:ws});function Ke(){Pe()?st||(st=oe.acquire()):st&&(st.release(),st=null)}function bs(e){Ht=typeof e=="function"?e:()=>{}}function vs(e){lt=typeof e=="function"?e:null}function Ss(e){Wr(e)}function En(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&Un(e)}function Ft(e){e.generation++,e.receiving=!1,e.pending=null,e.pendingSave=!1,e.encrypting=!1,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,_t(e)}var Be={setServerUrl(e){let t=(e??"").trim();if(t===pe)return;let n=pe;qe++,Ve=Promise.resolve(),pe=t,Nn(),it(!1),t&&xn(t),n&&t&&n!==t&&et(null).catch(r=>{console.warn("Triage sync: failed to drop cached auth password on server change:",r)}),oe.setServerUrl(t);for(let r of O.values()){Ft(r);let o=t?Tn(r.workspaceId,t):null;r.baseRevision=o?.baseRevision??null,r.appliedRevisions.clear(),r.baseState=o?.baseState??Object.create(null),r.hasBase=o?.hasBase===!0||r.baseRevision!==null||Object.keys(r.baseState).length>0,r.savesSinceKeyframe=o?.savesSinceKeyframe??0,r.localState=Ne(r.baseState,r.ids),En(r)}Ke(),ee()},setEnabled(e){let t=!!e;if(t!==ct){if(ct=t,uo(fo,t?"1":"0").catch(n=>{console.warn("Triage sync: could not persist user-enabled:",n)}),Pe())for(let n of O.values())En(n);else{qe++,Ve=Promise.resolve();for(let n of O.values())Ft(n)}Ke(),ee()}},isEnabled(){return ct},setForcedOff(e){let t=!!e;if(t!==Rn){if(Rn=t,Pe())for(let n of O.values())En(n);else{qe++,Ve=Promise.resolve();for(let n of O.values())Ft(n)}Ke(),ee()}},getServerUrl(){return pe},get connected(){return oe.getSocket()?.readyState===WebSocket.OPEN},get status(){return Wt()},onStatusChange(e){return Pn.add(e),()=>Pn.delete(e)},onServerInfo(e){if(Bn.add(e),On!=null)try{e(On)}catch{}return()=>Bn.delete(e)},setProtocolLocked(e){oe.setProtocolLocked(e)},notify(){if(!(Ln>0))for(let e of O.values())ae(e)},ensureSubscription(e){let t=O.has(e);Be.openSession(e);let n=O.get(e);if(!n)return null;let r=new Promise(o=>{n.objstoreResourceWaiters.push(o)});return t&&Ge(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||O.has(e)||!ut().find(s=>s.id===e))return;let n=po(e),r=Tn(e,pe),o=r?.baseState??Object.create(null);bn(o,n);let i={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:n,baseRevision:r?.baseRevision??null,appliedRevisions:new Set,baseState:o,hasBase:r?.hasBase===!0||r?.baseRevision!=null||Object.keys(o).length>0,savesSinceKeyframe:r?.savesSinceKeyframe??0,localState:Ne(o,n),pending:null,pendingSave:!1,key:null,encrypting:!1,receiving:!1,generation:0,subscribed:!1,subscribeAcked:!1,resyncAttempted:!1,staleResetAttempted:!1,consecutiveFailures:0,error:null,busyRetryTimer:null,objstoreResourceWaiters:[]};O.set(e,i),Un(i),Ke(),ee()},closeSession(e){if(e==null){for(let t of O.values())co(t);O.clear()}else{let t=O.get(e);t&&co(t),O.delete(e)}ee()},refreshSession(e){let t=O.get(e);if(!t){console.debug("triage-sync: refreshSession bail \u2014 no session for",e,"(caller must openSession first)");return}ho(t)},sessionInfo(e){let t=O.get(e);return t?{workspaceId:t.workspaceId,workspaceTag:t.workspaceTag,baseRevision:t.baseRevision,pending:t.pending&&{base:t.pending.base,keyframe:t.pending.keyframe},pendingSave:t.pendingSave,keyReady:t.key!==null,encrypting:t.encrypting,tracked:t.ids.size,savesSinceKeyframe:t.savesSinceKeyframe??0,error:t.error??null}:null},get openSessions(){return[...O.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...O.keys()]:[e],n=!1;for(let r of t){let o=O.get(r);!o||!o.error||(o.error=null,o.consecutiveFailures=0,n=!0,!o.key||!o.signingKey?Un(o):oe.getSocket()?.readyState===WebSocket.OPEN&&(Ge(o),ae(o)))}n&&ee()},get persistenceDegraded(){return eo()},onPersistenceDegraded(e){return to(e)},get proxyAuthRequired(){return An()},onProxyAuthRequired(e){return oo(e)}};Et(e=>{lo=e.state,ut=e.listWorkspaces,$t=e.saveTriage,so=e.getSecureItem,uo=e.setSecureItem,e.onSecureStorageHydrated(as);try{localStorage.removeItem(Yi),so(fo)==="0"&&(ct=!1),Ke()}catch{}e.onWorkspaceDeleted(t=>{let n=O.get(t);n&&_t(n);let r=O.delete(t);Mt(t).catch(o=>{console.warn("Triage sync: dropPersistedSession lock failed:",o)}),Ke(),r&&ee()}),e.onWorkspacePrivateKeyChanged(t=>{let n=O.get(t);if(!n){Mt(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)});return}n.signingKey=null,n.key=null,n.verifyingKey=null,n.workspaceTag=null,Ft(n),n.keyDerivationGen=(n.keyDerivationGen??0)+1,(async()=>{await Mt(t),O.delete(t),Be.openSession(t),ee()})().catch(r=>{console.warn("Triage sync: privateKey rotation IIFE failed:",r),O.delete(t),ee()})}),e.onReportMembershipChanged(t=>{Be.openSession(t);let n=O.get(t);n&&ho(n)}),xn()});function ho(e){let t=e.generation,{conflicts:n,hydrated:r}=Kn(e);(async()=>{if(n.length===0){r?await $t():ae(e);return}let o=null;if(lt)try{o=await lt(n,e.baseState,"attach")}catch(i){console.warn("Triage sync: hydration conflict resolver failed:",i)}!ge(e)||e.generation!==t||(o&&vn(n.filter(({id:i})=>e.ids.has(i)),o),await $t())})().catch(o=>{console.warn("Triage sync: refreshAndPropagate failed:",o)})}async function Dn(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var Se,zt,Wn,Vt,qt,Ye,ht,Gt,Vn,mt,qn,So,M=new Map,ks=2e3,Ts={setTimeout:(e,t)=>setTimeout(e,t)},De=new Map,Hn=new Set,xs="deepview.objstore-presence.";function Gn(e){return xs+e}function As(e){try{let t=localStorage.getItem(Gn(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!="object"?null:{names:n.names&&typeof n.names=="object"?n.names:{},bundles:n.bundles&&typeof n.bundles=="object"?n.bundles:{},bundleNames:n.bundleNames&&typeof n.bundleNames=="object"?n.bundleNames:{},baselines:Es(n.baselines,n.localVersions)}}catch{return null}}function Es(e,t){let n={};if(t&&typeof t=="object")for(let[r,o]of Object.entries(t))Number.isSafeInteger(o)&&o>=0&&(n[r]={version:o,incarnation:null,synced:!0,hash:null});if(e&&typeof e=="object")for(let[r,o]of Object.entries(e))!o||typeof o!="object"||!Number.isSafeInteger(o.version)||o.version<0||o.incarnation!=null&&typeof o.incarnation!="string"||(n[r]={version:o.version,incarnation:o.incarnation??null,synced:o.synced===!0,hash:typeof o.hash=="string"?o.hash:null});return n}function se(e,t){try{let n={names:Object.fromEntries(t.remoteNameByTag),bundles:Object.fromEntries(t.remoteBundleByTag),bundleNames:Object.fromEntries(t.remoteBundleNameByIntegrity),baselines:Object.fromEntries(t.baselines),localVersions:Object.fromEntries([...t.baselines].filter(([,r])=>r.synced).map(([r,o])=>[r,o.version]))};localStorage.setItem(Gn(e),JSON.stringify(n))}catch(n){console.warn(`objstore-presence: cache persist failed for ${e}:`,n)}}function mo(e){try{localStorage.removeItem(Gn(e))}catch{}}var Fn=null;function Rs(e){return Fn||(Fn=$r({serverUrl:"",httpOrigin:e,transport:Bt()})),Fn}var ft=new Set,dt=new Set;function ce(){for(let e of Hn)try{e()}catch{}}function Ps(e){if(e==null)return"";if(e instanceof Error&&e.message)return`: ${e.message}`;if(typeof e=="string"&&e)return`: ${e}`;if(typeof e=="object"&&typeof e.message=="string"&&e.message)return`: ${e.message}`;try{return`: ${String(e)}`}catch{return""}}var wo=256;function ko(e){return typeof e!="string"?"":e.length<=wo?e:e.slice(0,wo)}function Bs(e){try{let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/",t.search="",t.hash="",t.origin}catch{return null}}function Je(e){if(M.has(e))return;let t=Se().find(i=>i.id===e);if(!t)return;let n=Be.ensureSubscription(e);if(!n)return;let r={workspaceId:e,session:null,keys:null,remoteTags:new Set,fileTags:new Map,bundleTags:new Map,remoteNameByTag:new Map,remoteBundleByTag:new Map,remoteBundleNameByIntegrity:new Map,remoteMeta:new Map,baselines:new Map,localChanged:new Set,selfWrites:new Map,selfWriteNotices:new Map,tagLocks:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};M.set(e,r),r.ready=(async()=>{if(r.keys=await an(t.privateKey,t.id),r.disposed)return;let i=new Map;for(let d of t.reports??[]){let p=await ue(r.keys.tagKey,d);r.fileTags.set(d,p),i.set(p,d)}if(r.disposed)return;let s=new Map;for(let d of t.bundles??[]){let p=await ve(r.keys.tagKey,d);r.bundleTags.set(d,p),s.set(p,d)}if(r.disposed)return;try{let d=await ht();if(r.disposed)return;for(let p of d)r.bundleTags.has(p.integrity)&&r.remoteBundleNameByIntegrity.set(p.integrity,p.name)}catch(d){console.warn(`objstore-presence: listBundles failed during ${e} open:`,d)}ce();let a=Be.getServerUrl();if(!a)return;let l=Bs(a);if(l)try{let p=await Rs(l).openWorkspace(r.keys,n);if(r.disposed){try{p.close()}catch{}return}r.session=p,o();let y=await p.list();if(r.disposed)return;for(let h of y)r.remoteTags.add(h.resourceTag),bo(r,h.resourceTag,h.version,h.incarnation);let b=As(e),A=!1;if(b)for(let[h,x]of Object.entries(b.baselines))(r.remoteTags.has(h)||i.has(h))&&r.baselines.set(h,x);for(let h of r.remoteTags){let x=i.get(h);x!==void 0&&!r.remoteNameByTag.has(h)&&(r.remoteNameByTag.set(h,x),A=!0);let k=s.get(h);if(k!==void 0&&!r.remoteBundleByTag.has(h)&&(r.remoteBundleByTag.set(h,k),A=!0),b){let E=b.names[h];typeof E=="string"&&!r.remoteNameByTag.has(h)&&!r.remoteBundleByTag.has(h)&&(r.remoteNameByTag.set(h,E),r.fileTags.set(E,h),A=!0);let B=b.bundles[h];if(typeof B=="string"&&!r.remoteBundleByTag.has(h)&&!r.remoteNameByTag.has(h)){r.remoteBundleByTag.set(h,B),r.bundleTags.set(B,h);let Q=b.bundleNames[B];typeof Q=="string"&&!r.remoteBundleNameByIntegrity.has(B)&&r.remoteBundleNameByIntegrity.set(B,Q),A=!0}}}(A||b)&&se(e,r),ce(),pt(r);for(let h of r.remoteTags)Oe(r.baselines.get(h),r.remoteMeta.get(h))&&yt(r,h).catch(()=>{});zs(r).catch(()=>{})}catch(d){r.err=d}})();function o(){let i=r.session;i.onPut(({resourceTag:s,version:a,incarnation:l})=>{let d=r.remoteMeta.get(s),p=r.remoteTags.has(s)&&d!==void 0&&(d.incarnation!==l||a>d.version);if(r.remoteTags.add(s),bo(r,s,a,l),ce(),p){yt(r,s).catch(()=>{});return}pt(r)}),i.onDeleted(({resourceTag:s})=>{r.remoteTags.delete(s),r.remoteMeta.delete(s);let a=r.remoteNameByTag.get(s);r.remoteNameByTag.delete(s);let l=Se().find(b=>b.id===e),d=l?.reports??[],p=l?.bundles??[];a&&!d.includes(a)&&r.fileTags.delete(a);let y=r.remoteBundleByTag.get(s);r.remoteBundleByTag.delete(s),y&&(r.remoteBundleNameByIntegrity.delete(y),p.includes(y)||r.bundleTags.delete(y)),se(e,r),ce()})}r.ready.catch(()=>{})}function gt(e){let t=M.get(e);if(t){t.disposed=!0;try{t.session?.close()}catch{}if(t.keys){try{t.keys.contentKey.fill(0)}catch{}try{t.keys.tagKey.fill(0)}catch{}t.keys=null}M.delete(e),ce()}}Et(e=>{Se=e.listWorkspaces,zt=e.addReportToWorkspace,Wn=e.addBundleToWorkspace,Vt=e.analyzeContent,qt=e.setCount,Ye=e.gunzipBytes,ht=e.listBundles,Gt=e.listFiles,Vn=e.readBundle,mt=e.readFileBytes,qn=e.saveBundle,So=e.saveFileBytes,e.onFileMutated?.((t,n)=>{for(let r of M.values()){let o=r.fileTags.get(t);if(o!==void 0){if(n==="delete"){r.localChanged.delete(o)&&ce();continue}if(r.selfWrites.has(t)){r.selfWriteNotices.set(t,(r.selfWriteNotices.get(t)??0)+1);continue}De.has(t)||xo(r,o,t)}}}),e.onReportMembershipChanged(t=>{M.has(t)||Je(t);let n=M.get(t);if(!n)return;let r=Se().find(o=>o.id===t);if(r)for(let o of r.reports??[])n.fileTags.has(o)||Cs(t,o).catch(()=>{})}),e.onBundleMembershipChanged(t=>{M.has(t)||Je(t);let n=M.get(t);if(!n)return;let r=Se().find(o=>o.id===t);if(r)for(let o of r.bundles??[])n.bundleTags.has(o)||Ms(t,o).catch(()=>{})}),e.onWorkspaceDeleted(t=>{gt(t),mo(t)}),e.onWorkspacePrivateKeyChanged(t=>{M.has(t)&&(gt(t),mo(t),Je(t))})});function Os(){return Array.from(M.keys())}function js(e,t){let n=M.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function Cs(e,t){let n=M.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await ue(n.keys.tagKey,t)),n.disposed||ce()))}function Ls(e,t){let n=M.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function Ms(e,t){let n=M.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await ve(n.keys.tagKey,t)),n.disposed||ce()))}function Us(e){return Hn.add(e),()=>Hn.delete(e)}function Ns(e){return ft.add(e),()=>ft.delete(e)}function Ks(e){return dt.add(e),()=>dt.delete(e)}function Is(e){De.set(e,(De.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let n=De.get(e)-1;if(n>0){De.set(e,n);return}De.delete(e);for(let r of M.values()){let o=r.fileTags.get(e);o!==void 0&&Xn(r,o,e).catch(()=>{})}}}function Ds(e){let t=M.get(e);return t?(Se().find(r=>r.id===e)?.reports??[]).filter(r=>{let o=t.fileTags.get(r);return o!==void 0&&zn(t,o)}):[]}function Fs(e){let t=M.get(e);return t?t.remoteTags.size:0}async function $s(e){let t=M.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await pt(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function Ws(e){let t=M.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await pt(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function Hs(e,t){let n=M.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}function bo(e,t,n,r){let o=e.remoteMeta.get(t);o&&o.incarnation===r&&o.version>=n||e.remoteMeta.set(t,{version:n,incarnation:r})}function Oe(e,t){return!e||!t?!1:e.incarnation===null?t.version!==e.version:e.incarnation!==t.incarnation||t.version>e.version}function _s(e,t){let n=e.baselines.get(t);return!!n&&n.incarnation!==null}function _n(e,t){return!!e&&e.synced&&e.incarnation===t.incarnation&&e.version===t.version}function ye(e,t,n,r,o=null){let i=zn(e,t);e.baselines.set(t,{version:n.version,incarnation:n.incarnation,synced:r,hash:r?o:null}),e.localChanged.delete(t),!e.disposed&&zn(e,t)!==i&&ce()}function To(e,t){return!!e&&e.synced&&!!e.hash&&!!t&&e.hash!==t}function Jn(e,t){return!!e&&!e.synced||To(e,t)}function zn(e,t){if(!e.remoteTags.has(t))return!1;if(e.localChanged.has(t))return!0;let n=e.baselines.get(t);return!!n&&!n.synced}async function Yn(e,t,n){e.selfWrites.set(t,(e.selfWrites.get(t)??0)+1);try{await So(t,n),e.selfWriteNotices.set(t,(e.selfWriteNotices.get(t)??0)-1)}finally{let r=e.selfWrites.get(t)-1;if(r>0)e.selfWrites.set(t,r);else{e.selfWrites.delete(t);let o=e.selfWriteNotices.get(t)??0;e.selfWriteNotices.delete(t);let i=e.fileTags.get(t);o>0&&i!==void 0&&!e.disposed&&xo(e,i,t)}}}function xo(e,t,n){Ts.setTimeout(()=>Xn(e,t,n).catch(()=>{}),ks)}function Xn(e,t,n){return je(e,t,async()=>{if(De.has(n))return;let r=e.baselines.get(t);if(e.disposed||!r?.synced||!r.hash)return;let o;try{o=await mt(n)}catch{return}let i=await me(o);if(e.disposed||e.baselines.get(t)!==r)return;let s=r.hash!==i;s!==e.localChanged.has(t)&&(s?e.localChanged.add(t):e.localChanged.delete(t),ce())})}async function zs(e){let t=Se().find(n=>n.id===e.workspaceId);for(let n of t?.reports??[]){if(e.disposed)return;let r=e.fileTags.get(n);if(!(r===void 0||!e.baselines.get(r)?.hash))try{await Xn(e,r,n)}catch{}}}function je(e,t,n){let r=(e.tagLocks.get(t)??Promise.resolve()).then(()=>n()),o=r.catch(()=>{}).finally(()=>{e.tagLocks.get(t)===o&&e.tagLocks.delete(t)});return e.tagLocks.set(t,o),r}function vo(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}async function Jt(e,t){let n;try{n=await mt(e)}catch{return{same:null,hash:null}}let r=await me(n);if(vo(n,t))return{same:!0,hash:r};try{let[o,i]=await Promise.all([Ye(n),Ye(t)]);return{same:vo(o,i),hash:r}}catch{return{same:!1,hash:r}}}async function Zn(e,t,n,r){let o;try{o=Le(await Ye(n.content))}catch(s){throw new Error(`gunzip/decode of "${n.fileName}" failed (likely forged peer payload)`,{cause:s})}if(!r())return!1;let i=Vt(o);if(!i.recognized)throw new Error(`cloud copy of "${n.fileName}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);if(await Yn(e,n.fileName,n.content),e.disposed)return!1;qt(n.fileName,i.count,i.source),ye(e,t,n,!0,await me(n.content)),se(e.workspaceId,e);for(let s of ft)try{s(e.workspaceId,n.fileName)}catch{}return!0}async function Ao(e,t,n,r,{keepLocalChanges:o=!0}={}){let{same:i,hash:s}=await Jt(n.fileName,n.content);return r()?i?(ye(e,t,n,!0,s),se(e.workspaceId,e),!1):o&&i===!1&&Jn(e.baselines.get(t),s)?(ye(e,t,n,!1),se(e.workspaceId,e),!1):await Zn(e,t,n,r):!1}async function pt(e){if(!e.session||e.disposed)return;let t=Se().find(s=>s.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),o=new Set;try{o=new Set(await Gt())}catch(s){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,s)}if(e.disposed||!e.session)return;let i=[];for(let s of e.remoteTags){let a=e.remoteNameByTag.get(s);if(a!==void 0&&n.has(a)&&o.has(a)&&_s(e,s))continue;if(e.remoteBundleByTag.has(s)){let d=e.remoteBundleByTag.get(s);if(e.remoteBundleNameByIntegrity.has(d)&&r.has(d))continue}let l=e.inFlight.get(s);if(!l){let d=e.remoteMeta.get(s),p=()=>e.disposed||!e.remoteTags.has(s)||e.remoteMeta.get(s)===d?null:pt(e).then(()=>null,()=>null);l=e.session.fetchByTag(s).then(async y=>(e.inFlight.delete(s),e.disposed?null:y?e.remoteTags.has(s)?y.kind==="bundle"?(e.remoteBundleByTag.set(s,y.integrity),e.bundleTags.set(y.integrity,s),y.name&&e.remoteBundleNameByIntegrity.set(y.integrity,y.name),await Js(e,s,y.integrity,y.name,y.content),null):(e.remoteNameByTag.set(s,y.fileName),e.fileTags.set(y.fileName,s),await Vs(e,s,y),null):null:p()),()=>(e.inFlight.delete(s),p())),e.inFlight.set(s,l)}i.push(l)}i.length!==0&&(await Promise.all(i),!e.disposed&&(se(e.workspaceId,e),ce()))}async function Vs(e,t,n){e.disposed||!e.remoteTags.has(t)||await je(e,t,async()=>{await qs(e,t,n),!e.disposed&&e.remoteTags.has(t)&&Oe(e.baselines.get(t),e.remoteMeta.get(t))&&yt(e,t).catch(()=>{})})}async function qs(e,t,n){let r=n.fileName,o=n.content;if(e.disposed||!e.remoteTags.has(t))return;let i=Se().find(p=>p.id===e.workspaceId),s=!!(i&&Array.isArray(i.reports)&&i.reports.includes(r)),a;try{let p=await Gt();if(e.disposed||!e.remoteTags.has(t))return;a=p.includes(r)}catch(p){console.warn(`auto-download: listFiles failed before saving "${r}":`,p);return}if(a){if(s){await Gs(e,t,n);return}if(e.disposed||!e.remoteTags.has(t))return;try{await zt(r,e.workspaceId)}catch(p){console.warn(`auto-download: attaching local "${r}" to workspace "${e.workspaceId}" failed:`,p);return}if(e.disposed)return;if(!e.baselines.has(t)){let{same:p,hash:y}=await Jt(r,o);if(e.disposed)return;p!==null&&(ye(e,t,n,p,y),se(e.workspaceId,e))}for(let p of ft)try{p(e.workspaceId,r)}catch{}return}let l;try{l=Le(await Ye(o))}catch(p){console.warn(`auto-download: gunzip/decode of "${r}" failed (likely forged peer payload):`,p);return}if(e.disposed||!e.remoteTags.has(t))return;let d=Vt(l);if(d.recognized){try{if(await Yn(e,r,o),e.disposed||!e.remoteTags.has(t)||(qt(r,d.count,d.source),ye(e,t,n,!0,await me(o)),!e.remoteTags.has(t)))return;await zt(r,e.workspaceId),se(e.workspaceId,e)}catch(p){console.warn(`auto-download: persisting "${r}" to workspace "${e.workspaceId}" failed:`,p);return}if(!e.disposed)for(let p of ft)try{p(e.workspaceId,r)}catch{}}}async function Gs(e,t,n){let r=()=>!e.disposed&&e.remoteTags.has(t),{same:o,hash:i}=await Jt(n.fileName,n.content);if(!r()||o===null)return;let s=e.baselines.get(t);if(o){(!_n(s,n)||s.hash!==i)&&(ye(e,t,n,!0,i),se(e.workspaceId,e));return}if(Oe(s,n)&&!Jn(s,i)){try{await Zn(e,t,n,r)}catch(a){console.warn(`auto-download: ${a.message}`,a)}return}if(!s||s.incarnation===null||Oe(s,n)){ye(e,t,n,!1),se(e.workspaceId,e);return}To(s,i)&&!e.localChanged.has(t)&&(e.localChanged.add(t),ce())}async function yt(e,t,n=0){e.disposed||!e.remoteTags.has(t)||await je(e,t,async()=>{let r=()=>!e.disposed&&e.remoteTags.has(t);if(!r())return;let o=e.baselines.get(t);if(o?.synced&&!Oe(o,e.remoteMeta.get(t)))return;let i;try{i=await e.session.fetchByTag(t)}catch(s){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,s);return}if(!(!i||!r())&&i.kind!=="bundle"){e.remoteNameByTag.set(t,i.fileName),e.fileTags.set(i.fileName,t);try{await Ao(e,t,i,r)}catch(s){console.warn(`replace-refetch: ${s.message}`,s);return}n<2&&r()&&Oe(e.baselines.get(t),e.remoteMeta.get(t))&&yt(e,t,n+1).catch(()=>{})}})}async function Js(e,t,n,r,o){if(e.disposed||!e.remoteTags.has(t))return;let i;try{i=await ht()}catch(d){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,d);return}if(e.disposed||!e.remoteTags.has(t))return;if(i.some(d=>d.integrity===n)){try{await Wn(n,e.workspaceId)}catch(p){console.warn("auto-download: attach pre-existing bundle failed:",p);return}if(e.disposed)return;let d=i.find(p=>p.integrity===n)?.name??"";for(let p of dt)try{p(e.workspaceId,n,d)}catch{}return}let s=await Dn(o);if(e.disposed||!e.remoteTags.has(t))return;if(s!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${s}) \u2014 refusing to save`);return}let a=r&&r.length>0?r:`bundle-${n.slice(7,15)}`,l=ko(a);try{if(await qn(l,o),e.disposed||!e.remoteTags.has(t))return;await Wn(n,e.workspaceId)}catch(d){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,d);return}if(!e.disposed)for(let d of dt)try{d(e.workspaceId,n,l)}catch{}}async function Ee(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw new Error(`Objstore session is not connected${Ps(e.err)}`)}async function Yt(e){let t=await e(null);return!t.ok&&t.reason==="conflict"&&t.current&&(t=await e(t.current)),t}async function Ys(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);return await Ee(n),n.session.fetch(t)}async function Xs(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);if(await Ee(n),!n.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let r=n.fileTags.get(t)??await ue(n.keys.tagKey,t),o=await je(n,r,async()=>{let i=await n.session.fetch(t);if(!i)return{ok:!1,reason:"not found in remote"};let s;try{s=Le(await Ye(i.content))}catch{return{ok:!1,reason:"remote payload is not gzipped UTF-8"}}let a=Vt(s);return a.recognized?(await Yn(n,t,i.content),qt(t,a.count,a.source),n.disposed||(n.fileTags.set(t,r),ye(n,r,i,!0,await me(i.content)),se(e,n)),{ok:!0}):{ok:!1,reason:"remote payload is not a recognized report format"}});return o.ok&&await zt(t,e),o}async function Eo(e,t,n){let r=M.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let o=r.fileTags.get(t)??await ue(r.keys.tagKey,t);return await je(r,o,async()=>{let i=await Yt(s=>r.session.put({fileName:t,content:n,prev:s}));if(i.ok)try{await Zs(r,t,o,i.meta,n)}catch{}return i})}async function Zs(e,t,n,r,o){let i=await me(o);e.disposed||(e.fileTags.set(t,n),ye(e,n,r,!0,i),se(e.workspaceId,e),Oe(e.baselines.get(n),e.remoteMeta.get(n))&&yt(e,n).catch(()=>{}))}async function Qs(e,t){let n=!1;M.has(e)||(Je(e),n=!0);try{let r=M.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.fileTags.has(t)||r.fileTags.set(t,await ue(r.keys.tagKey,t));let o=r.fileTags.get(t);return await je(r,o,async()=>{let i=await Yt(s=>r.session.delete(t,s));return i.ok&&(r.remoteTags.delete(o),r.remoteNameByTag.delete(o),r.remoteMeta.delete(o),r.baselines.delete(o),ce()),i})}finally{n&>(e)}}async function Ro(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Ee(n);let r=await Vn(t),s=(await ht()).find(a=>a.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await Yt(a=>n.session.putBundle({integrity:t,name:s,content:r,prev:a}))}async function ea(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Ee(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:"not-found"};if(await Dn(r.content)!==t)return{ok:!1,reason:"integrity-mismatch"};let i=r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`,s=ko(i);await qn(s,r.content);for(let a of dt)try{a(e,t,s)}catch{}return{ok:!0,integrity:t,name:s}}async function ta(e,t){let n=!1;M.has(e)||(Je(e),n=!0);try{let r=M.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.bundleTags.has(t)||r.bundleTags.set(t,await ve(r.keys.tagKey,t));let o=r.bundleTags.get(t),i=await Yt(s=>r.session.deleteBundle(t,s));return i.ok&&(r.remoteTags.delete(o),r.remoteBundleByTag.delete(o),ce()),i}finally{n&>(e)}}async function na(e,{onList:t,onItem:n}={}){let r=M.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let o=r.keys.tagKey,i=new Set,s=r.session.onDeleted(a=>{i.add(a.resourceTag)});try{let a=await ra(r,e),l=await pa(),d=await ya(),p=new Map;for(let h of l)p.set(await ue(o,h),h);let y=new Map;for(let h of d)y.set(await ve(o,h.integrity),h.integrity);let b=a.map(h=>{let x=p.get(h.resourceTag),k=y.get(h.resourceTag);return{resourceTag:h.resourceTag,kind:fa(r,h.resourceTag,x,k),label:da(r,h.resourceTag,x,k),contentLength:h.contentLength,reportName:x,bundleIntegrity:k,identifier:x??k,status:"checking"}});if(typeof t=="function")try{t(b.map($n))}catch{}let A={good:0,updated:0,uploaded:0,differs:0,reuploaded:0,failed:0,"check-failed":0,missing:0};for(let h of b)if(h.status=await ia(r,e,h,i),A[h.status]+=1,typeof n=="function")try{n($n(h))}catch{}return{items:b.map($n),counts:A}}finally{s()}}async function ra(e,t){try{let n=Be.ensureSubscription(t);if(n){let r=await ga(n.resources,1e4);if(Array.isArray(r))return oa(r)}}catch(n){console.warn(`objstore-recovery: fresh DB listing for ${t} failed; using cached inventory:`,n)}try{return(await e.session.list()).map(n=>({resourceTag:n.resourceTag,contentLength:n.contentLength}))}catch{return[]}}function oa(e){let t=[];for(let n of e)!n||typeof n!="object"||typeof n.resourceTag=="string"&&t.push({resourceTag:n.resourceTag,contentLength:Number.isSafeInteger(n.contentLength)?n.contentLength:null});return t}async function ia(e,t,n,r){let o;try{o=await e.session.fetchByTag(n.resourceTag)}catch(i){return n.detail=`verification fetch failed: ${i?.message??String(i)}`,"check-failed"}return o?o.kind==="report"?(n.kind="report",n.label=o.fileName,n.identifier=o.fileName,await sa(e,t,n,o,r)):(n.kind="bundle",n.label=o.name??n.label,n.bundleIntegrity=o.integrity,n.identifier=o.integrity,"good"):r.has(n.resourceTag)?"missing":n.reportName!==void 0?await la(t,n,r):n.bundleIntegrity!==void 0?await ua(t,n,r):"missing"}async function sa(e,t,n,r,o){let i=Se().find(l=>l.id===t);if(!i||!Array.isArray(i.reports)||!i.reports.includes(r.fileName))return"good";let s=n.resourceTag,a=()=>!e.disposed&&!o.has(s);return await je(e,s,async()=>{let l=r;if(aa(e,s,l)){let b;try{b=await e.session.fetchByTag(s)}catch(A){return n.detail=`verification fetch failed: ${A?.message??String(A)}`,"check-failed"}if(!b||!a())return"missing";if(b.kind!=="report")return"good";l=b}let{same:d,hash:p}=await Jt(l.fileName,l.content);if(!a())return"missing";let y=e.baselines.get(s);if(d)return(!_n(y,l)||y.hash!==p)&&(ye(e,s,l,!0,p),se(t,e)),"good";if(d===!1&&_n(y,l)){let b=await Po(e,s,l.fileName,l,a);return n.detail=b.detail,b.status}if(d===null||Oe(y,l)&&!Jn(y,p))try{return await Zn(e,s,l,a)?"updated":"missing"}catch(b){return n.detail=`updating your copy failed: ${b?.message??String(b)}`,console.warn(`objstore-recovery: updating the local copy of "${l.fileName}" failed:`,b),"failed"}return ye(e,s,l,!1),se(t,e),n.compared={version:l.version,incarnation:l.incarnation},"differs"})}function aa(e,t,n){return[e.baselines.get(t),e.remoteMeta.get(t)].some(r=>r&&r.incarnation===n.incarnation&&r.version>n.version)}async function Po(e,t,n,r,o){try{let i=await mt(n);if(!o())return{status:"missing"};let s=await e.session.put({fileName:n,content:i,prev:{version:r.version,incarnation:r.incarnation}});return s.ok?(ye(e,t,s.meta,!0,await me(i)),se(e.workspaceId,e),{status:"uploaded"}):{status:"failed",detail:s.reason==="conflict"?"the cloud copy changed since it was compared \u2014 re-check again":`upload rejected: ${s.reason??"unknown"}`}}catch(i){return console.warn(`objstore-recovery: uploading the local copy of "${n}" failed:`,i),{status:"failed",detail:`upload error: ${i?.message??String(i)}`}}}async function ca(e,t,n,r){if(n!=="cloud"&&n!=="local")throw new TypeError(`resolveReportDifference: keep must be 'cloud' or 'local', got ${String(n)}`);if(n==="local"&&(!r||!Number.isSafeInteger(r.version)||typeof r.incarnation!="string"))throw new TypeError("resolveReportDifference: keeping the local copy needs the compared cloud state ({ version, incarnation })");let o=M.get(e);if(!o)throw new Error(`Workspace ${e} is not open`);if(await Ee(o),!o.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let i=o.fileTags.get(t)??await ue(o.keys.tagKey,t),s=()=>!o.disposed;return await je(o,i,async()=>{if(n==="local")return await Po(o,i,t,r,s);try{let a=await o.session.fetch(t);if(!a)return{status:"missing",detail:"the report is no longer in the cloud"};let l={fileName:t,content:a.content,version:a.version,incarnation:a.incarnation};return{status:await Ao(o,i,l,s,{keepLocalChanges:!1})?"updated":"good"}}catch(a){return console.warn(`objstore-recovery: replacing the local copy of "${t}" with the cloud copy failed:`,a),{status:"failed",detail:`updating your copy failed: ${a?.message??String(a)}`}}})}async function la(e,t,n){let r;try{r=await mt(t.reportName)}catch{return"missing"}if(t.contentLength==null||Rr(t.reportName,r.length)!==t.contentLength||n.has(t.resourceTag))return"missing";try{let o=await Eo(e,t.reportName,r);return o&&o.ok?"reuploaded":(t.detail=`re-upload rejected: ${o?.reason??"unknown"}`,"failed")}catch(o){return t.detail=`re-upload error: ${o?.message??String(o)}`,console.warn(`objstore-recovery: re-upload of "${t.reportName}" failed:`,o),"failed"}}async function ua(e,t,n){try{await Vn(t.bundleIntegrity)}catch{return"missing"}if(n.has(t.resourceTag))return"missing";try{let r=await Ro(e,t.bundleIntegrity);return r&&r.ok?"reuploaded":(t.detail=`re-upload rejected: ${r?.reason??"unknown"}`,"failed")}catch(r){return t.detail=`re-upload error: ${r?.message??String(r)}`,console.warn(`objstore-recovery: bundle re-upload of "${t.bundleIntegrity}" failed:`,r),"failed"}}function fa(e,t,n,r){return n!==void 0?"report":r!==void 0||e.remoteBundleByTag.has(t)?"bundle":e.remoteNameByTag.has(t)?"report":"unknown"}function da(e,t,n,r){if(n!==void 0)return n;if(r!==void 0)return e.remoteBundleNameByIntegrity.get(r)??r;let o=e.remoteNameByTag.get(t);if(o!==void 0)return o;let i=e.remoteBundleByTag.get(t);return i!==void 0?e.remoteBundleNameByIntegrity.get(i)??i:`${t.slice(0,10)}\u2026`}function $n(e){let t={resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier,detail:e.detail};return e.compared&&(t.compared=e.compared),t}function ga(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let o=new Promise((i,s)=>{n=setTimeout(()=>s(new Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,o]).finally(()=>clearTimeout(n))}async function pa(){try{return await Gt()}catch(e){return console.warn("objstore-recovery: listFiles failed; treating as no local reports:",e),[]}}async function ya(){try{return await ht()}catch(e){return console.warn("objstore-recovery: listBundles failed; treating as no local bundles:",e),[]}}export{gt as closeWorkspace,ta as deleteBundleFromRemote,Qs as deleteFromRemote,Ds as differingReports,Ws as discoverRemoteBundleIntegrities,$s as discoverRemoteFileNames,Xs as downloadFileFromRemote,ea as fetchBundleFromRemote,Ys as fetchFile,Is as holdLocalChangeChecks,Ri as installSyncHost,Ls as isBundleInRemote,js as isInRemote,Ns as onAutoDownloaded,Ks as onBundleAutoDownloaded,Us as onChange,Je as openWorkspace,Os as openWorkspaceIds,Ro as putBundleToRemote,Eo as putFile,na as recheckRemoteStorage,Hs as remoteBundleName,Fs as remoteCount,ca as resolveReportDifference,Ss as setAuthenticationResolver,vs as setHydrationConflictResolver,bs as setRedraw,Be as triageSync};
|
|
17
|
+
`)})}return n}},Rt=class e extends EventTarget{static CONNECTING=0;static OPEN=1;static CLOSING=2;static CLOSED=3;CONNECTING=e.CONNECTING;OPEN=e.OPEN;CLOSING=e.CLOSING;CLOSED=e.CLOSED;readyState=e.CONNECTING;baseUrl;sessionId=null;cachedPassword=null;outbound=[];flushTimer=null;inFlightPost=null;activeReaders=new Set;fetchAbort=new AbortController;postSeq=0;lastDispatchedSeq=0;downstreamWatchdog=null;constructor(t){super(),this.baseUrl=gn(t),this.scheduleFlush(!0)}send(t){if(this.readyState===e.CLOSED)throw new Error("sse-transport: send on closed transport");let n;try{n=JSON.parse(t)}catch(r){throw new Error(`sse-transport: send received non-JSON payload: ${r.message}`,{cause:r})}if(n.type==="authenticate"&&typeof n.password=="string"){this.cachedPassword=n.password,this.scheduleFlush();return}this.outbound.push(n),this.scheduleFlush()}close(){this.shutdown()}scheduleFlush(t=!1){if(this.readyState===e.CLOSED)return;if(this.flushTimer!=null)if(t)clearTimeout(this.flushTimer),this.flushTimer=null;else return;let n=t?0:Pi;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},n)}armDownstreamWatchdog(){this.readyState!==e.CLOSED&&(this.downstreamWatchdog!=null&&clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=setTimeout(()=>{this.downstreamWatchdog=null,this.readyState!==e.CLOSED&&(console.warn("sse-transport: no downstream activity within the liveness window; reconnecting"),this.shutdown())},Oi),this.downstreamWatchdog.unref?.())}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let s=new Promise(a=>{setTimeout(a,Bi)});await Promise.race([this.inFlightPost.catch(()=>{}),s])}if(this.readyState===e.CLOSED)return;let t=this.outbound;this.outbound=[];let n={};this.sessionId!=null&&(n.id=this.sessionId),this.cachedPassword!=null&&(n.password=this.cachedPassword),t.length>0&&(n.frames=t);let r=this.baseUrl,o=++this.postSeq;this.armDownstreamWatchdog();let i=(async()=>{let s;try{s=await fetch(r,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n),credentials:"same-origin",signal:this.fetchAbort.signal})}catch(l){this.readyState!==e.CLOSED&&console.warn("sse-transport: POST failed:",l),this.shutdown();return}if(!s.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${s.status} ${s.statusText}; closing`),this.shutdown();return}let a=s.body;if(!a){this.shutdown();return}this.consumeStream(a,o)})();this.inFlightPost=i,i.finally(()=>{this.inFlightPost===i&&(this.inFlightPost=null)})}async consumeStream(t,n){let r=t.getReader();this.activeReaders.add(r);let o=new dn,i=new TextDecoder,s=!1;try{for(;;){let{value:a,done:l}=await r.read();if(l){s=!0;break}if(this.readyState===e.CLOSED)return;n===this.postSeq&&this.armDownstreamWatchdog();let d=o.parse(i.decode(a,{stream:!0}));for(let p of d)this.dispatchOrderedEvent(p,n)}if(this.readyState!==e.CLOSED){let a=i.decode();if(a.length>0)for(let l of o.parse(a))this.dispatchOrderedEvent(l,n)}s&&this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn("sse-transport: live downstream closed without a close frame; reconnecting"),this.shutdown())}catch(a){this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn("sse-transport: stream read failed:",a),this.shutdown())}finally{this.activeReaders.delete(r);try{r.releaseLock()}catch{}}}dispatchOrderedEvent(t,n){if(this.readyState!==e.CLOSED){if(n<this.lastDispatchedSeq){this.shutdown();return}this.lastDispatchedSeq=n,this.dispatchEvent_(t)}}dispatchEvent_(t){if(t.event==="session"){if(this.readyState===e.CLOSED)return;this.sessionId=t.data,this.readyState===e.CONNECTING&&(this.readyState=e.OPEN,this.dispatchEvent(new Event("open")));return}if(t.event==="close"){let n,r;try{let o=JSON.parse(t.data);typeof o.code=="number"&&(n=o.code),typeof o.reason=="string"&&(r=o.reason)}catch{}this.shutdown(n,r);return}if(t.event===""||t.event==="message"){if(this.readyState!==e.OPEN)return;this.dispatchEvent(new MessageEvent("message",{data:t.data}))}}shutdown(t,n){if(this.readyState===e.CLOSED)return;this.readyState=e.CLOSING,this.flushTimer!=null&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.downstreamWatchdog!=null&&(clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=null);try{this.fetchAbort.abort()}catch{}for(let o of this.activeReaders)try{o.cancel().catch(()=>{})}catch{}this.activeReaders.clear(),this.readyState=e.CLOSED;let r=new Event("close");t!=null&&(r.code=t),n!=null&&(r.reason=n),this.dispatchEvent(r)}};var tt=1e3,ji=3e4,Ci=3e4,pn="session restarted";function Pt(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,o=null,i=!1,s=null,a=0,l=!1,d=!1,p=null,y=tt,b=null,A=null,h=null,x=null,k=!1,E=null,B=new Set;function Q(){p&&(clearTimeout(p),p=null)}function te(){b&&(clearTimeout(b),b=null)}function ie(){Q(),!l&&(d||a!==0&&t&&(p=setTimeout(()=>{p=null,N()},Math.round(y*(.5+Math.random()*.5))),y=Math.min(y*2,ji)))}function X(){J(),!(n<=0)&&(i||(A=setInterval(()=>{!o||o.readyState!==o.OPEN||h||(D({type:"ping"}),h=setTimeout(()=>{h=null,console.warn("socket-transport: heartbeat timeout; closing socket");try{o?.close()}catch{}},r))},n)))}function J(){A&&(clearInterval(A),A=null),h&&(clearTimeout(h),h=null)}function q(f){for(let u of B)try{u.onDisconnected(f)}catch(w){console.warn("socket-transport: consumer.onDisconnected threw:",w)}}function $(f){for(let u of B)try{u.onConnected(f)}catch(w){console.warn("socket-transport: consumer.onConnected threw:",w)}}function W(f){for(let u of B)try{u.onMessage(f)}catch(w){console.warn("socket-transport: consumer.onMessage threw:",w)}}function K(f){let u;try{let w=typeof f.data=="string"?f.data:new TextDecoder().decode(f.data);u=JSON.parse(w)}catch(w){console.warn("socket-transport: dropping malformed wire frame:",w);return}if(!(!u||typeof u!="object")){if(u.type==="pong"){h&&(clearTimeout(h),h=null);return}if(u.type==="challenge"){if(typeof u.nonce!="string")return;s!=null&&s!==u.nonce&&q(pn),s=u.nonce,$(s);return}if(u.type==="authenticated"){U(!0),W(u);return}if(u.type==="unauthorized"&&u.kind==="auth-failed"){U(!1);return}W(u)}}function U(f){if(!E)return;let u=E;E=null,u(f)}function D(f){if(!o||o.readyState!==o.OPEN)return!1;try{return o.send(JSON.stringify(f)),!0}catch(u){return console.warn("socket-transport: send failed:",u),!1}}function F(f){return new Promise(u=>{E=u,D({type:"authenticate",password:f})||(E=null,u(!1))})}function _(){if(x)return x;if(!o||o.readyState!==o.OPEN)return Promise.resolve(!1);let f=o,u=(async()=>{await Promise.resolve();try{let w=Nr();if(w!=null&&!k){k=!0;let m=await F(w);if(o!==f)return!1;if(m)return!0;try{await et(null)}catch(v){console.warn("socket-transport: failed to clear cached auth password:",v)}}let c=!0;for(;;){if(o!==f||!o||o.readyState!==o.OPEN||!e.authResolver)return!1;let m;try{m=await e.authResolver({retry:!c})}catch(L){return console.warn("socket-transport: authentication resolver threw:",L),!1}if(o!==f||(c=!1,m==null||m===""))return!1;let v=await F(m);if(o!==f)return!1;if(v){try{await et(m)}catch(L){console.warn("socket-transport: failed to cache auth password:",L)}return!0}}}finally{x=null}})();return x=u,u}function j(f){if(te(),!o)return;let u=o;o=null,s=null,k=!1,U(!1),J(),q(f);try{u.close()}catch{}}function N(){l||d||o||a!==0&&t&&I(!1)}function I(f){if(l||d||a===0||!t)return;let u;try{u=f?new Rt(t):new WebSocket(t)}catch(c){if(!f){console.warn("socket-transport: WebSocket constructor failed; trying SSE fallback:",c),I(!0);return}console.warn("socket-transport: SSE constructor failed:",c),ie();return}o=u,i=f,s=null,k=!1;let w=!1;u.addEventListener("open",()=>{o===u&&(w=!0,te(),b=setTimeout(()=>{b=null,o===u&&(y=tt)},Ci),b.unref?.(),X())}),u.addEventListener("message",c=>{o===u&&K(c)}),u.addEventListener("close",c=>{if(o!==u)return;if(te(),o=null,s=null,k=!1,U(!1),J(),!w&&!f&&!l&&a>0){if(typeof fetch>"u"){q("socket closed"),ie();return}console.warn("socket-transport: WebSocket failed to open; falling back to SSE"),I(!0);return}c?.code===1001&&(y=tt),q("socket closed"),!l&&a>0&&ie()}),u.addEventListener("error",()=>{})}function T(){if(l)return{release(){}};a+=1,a===1&&!o&&N();let f=!1;return{release(){f||(f=!0,!l&&(a-=1,a===0&&(Q(),y=tt,j("released"))))}}}function z(f){f!==t&&(Q(),y=tt,t=f,o&&j("serverUrl changed"),a>0&&t&&N())}function G(f){B.add(f);let u=!1;return{remove(){u||(u=!0,B.delete(f))}}}function H(){l||(l=!0,Q(),j("transport closed"),B.clear(),a=0)}function le(f){let{pingMs:u,pongMs:w}=f;typeof u=="number"&&u>=0&&(n=u),typeof w=="number"&&w>0&&(r=w),A&&X()}function we(){k=!1}function g(f){f!==d&&(d=f,f?(Q(),j("protocol-locked")):a>0&&t&&N())}return{acquire:T,setServerUrl:z,addConsumer:G,send:D,getNonce:()=>s,getSocket:()=>o,isSse:()=>o!=null&&i,runAuthFlow:_,close:H,setProtocolLocked:g,setHeartbeatTimings:le,resetCachedReplayGuard:we}}var yn=64,Li=5,Fr=6,Mi=25,Ui=500;function Ni(e,t){if(!/^\/api\/objstore\/[\w-]+\/[\w-]+$/u.test(e))throw new TypeError(`objstore: urlPath rejected (unexpected shape): ${JSON.stringify(e)}`);let n=new URL(t).origin,r=new URL(e,n);if(r.origin!==n)throw new TypeError(`objstore: urlPath origin mismatch \u2014 expected ${n}, got ${r.origin}`);return r.href}function $r(e){let t=e.requestTimeoutMs??1e4,n=new URL(e.httpOrigin).origin,r=e.transport===void 0,o=e.transport??Pt(e.authResolver===void 0?{serverUrl:e.serverUrl}:{serverUrl:e.serverUrl,authResolver:e.authResolver}),i=!1,s=new Map,a=new Map,l=[],d=[];function p(g,f,u,w){let c=g.seenVersions.get(f);(!c||c.incarnation!==u||w>c.version)&&g.seenVersions.set(f,{incarnation:u,version:w})}function y(g){g.connectedPromise=new Promise((f,u)=>{g.resolveConnected=f,g.rejectConnected=u}),g.connectedPromise.catch(()=>{})}function b(g){g.listedPromise=new Promise((f,u)=>{g.resolveListed=f,g.rejectListed=u}),g.listedPromise.catch(()=>{})}function A(g,f){let u=new Map(g.inventory),w=g.inventorySeeded;g.inventorySeeded=!0,g.inventory.clear();for(let c of f){let m=g.inventory.get(c.resourceTag)??u.get(c.resourceTag),v=m?.incarnation===c.incarnation&&m.version>=c.version?m:{version:c.version,incarnation:c.incarnation,contentLength:c.contentLength};g.inventory.set(c.resourceTag,v),p(g,c.resourceTag,v.incarnation,v.version)}if(g.resolveListed(),!!w){for(let[c,m]of u){let v=g.inventory.get(c);if(v?.incarnation!==m.incarnation){v||g.seenVersions.delete(c);for(let L of g.deletedHandlers)try{L({resourceTag:c,version:m.version})}catch{}}}for(let[c,m]of g.inventory){let v=u.get(c);if(v?.version===m.version&&v.incarnation===m.incarnation)continue;let L={resourceTag:c,version:m.version,incarnation:m.incarnation,contentLength:m.contentLength};for(let ne of g.putHandlers)try{ne(L)}catch{}}}}function h(g){if(!Array.isArray(g))return[];let f=[];for(let u of g)He(u)&&f.push(_e(u));return f}function x(g){let f;return new Promise((u,w)=>{f=setTimeout(()=>w(new Error(`objstore: inventory not seeded (no subscribe ack) after ${t}ms`)),t),g.listedPromise.then(u,w)}).finally(()=>clearTimeout(f))}function k(g){for(let f=0;f<l.length;f++)if(g(l[f]))return Promise.resolve(l.splice(f,1)[0]);return new Promise((f,u)=>{let w={predicate:g,resolve:()=>{},reject:m=>{clearTimeout(c);let v=d.indexOf(w);v>=0&&d.splice(v,1),u(m)}},c=setTimeout(()=>w.reject(new Error(`objstore: response timeout after ${t}ms`)),t);w.resolve=m=>{clearTimeout(c),f(m)},d.push(w)})}function E(g){if(!o.send(g))throw new Error("objstore: socket not open")}function B(g){for(let f of d.splice(0))try{f.reject(new Error(`objstore: ${g}`))}catch{}}function Q(g){if(g.type==="workspace-subscribed"&&typeof g.workspaceTag=="string"){let f=s.get(g.workspaceTag);f&&Array.isArray(g.resources)&&A(f,h(g.resources));return}if(g.type==="objstore-put"&&typeof g.workspaceTag=="string"&&He(g)){let f=s.get(g.workspaceTag);if(!f)return;let u=_e(g),w=f.inventory.get(u.resourceTag);if(w?.incarnation===u.incarnation&&w.version>u.version)return;p(f,u.resourceTag,u.incarnation,u.version),f.inventory.set(u.resourceTag,{version:u.version,incarnation:u.incarnation,contentLength:u.contentLength});let c={resourceTag:u.resourceTag,version:u.version,incarnation:u.incarnation,contentLength:u.contentLength};for(let m of f.putHandlers)try{m(c)}catch{}return}if(g.type==="objstore-deleted"&&typeof g.workspaceTag=="string"&&typeof g.resourceTag=="string"&&typeof g.version=="number"){let f=s.get(g.workspaceTag);if(!f)return;let u=g.resourceTag,w=g.version,c=g.incarnation;if(c!==void 0){if(typeof c!="string"||c.length===0)return;let v=f.inventory.get(u)??f.seenVersions.get(u);if(v&&(c!==v.incarnation||v.version>w))return}f.seenVersions.delete(u),f.inventory.delete(u);let m={resourceTag:u,version:w};for(let v of f.deletedHandlers)try{v(m)}catch{}return}if(!(g.type==="workspace-state"||g.type==="workspace-save-ack"||g.type==="workspace-save-error"||g.type==="workspace-subscribed"||g.type==="authenticated"||g.type==="server-info")){for(let f=0;f<d.length;f++)if(d[f].predicate(g)){let u=d[f];d.splice(f,1),u.resolve(g);return}if(l.push(g),l.length>yn){let f=l.splice(0,l.length-yn),u=[...new Set(f.map(w=>w.type??"<no-type>"))].slice(0,4);console.warn(`objstore: dropping ${f.length} unmatched frame(s) over MAX_QUEUE_SIZE=${yn} (types: ${u.join(", ")})`)}}}function te(){for(let g of s.values())g.closed||g.connected||(g.connected=!0,g.resolveConnected())}function ie(g){B(g);for(let f of s.values())f.closed||f.connected&&(f.connected=!1,y(f))}let X=o.addConsumer({onMessage:Q,onConnected:te,onDisconnected:ie}),J=g=>Ni(g,n),q=(g,f)=>J(`/api/objstore/${g}/${f}`);async function $(g,f,u){let w=o.getNonce();if(!w)throw new Error("objstore: socket not open");let c=await Br(g.signingKey,u,w),m,v=!1;for(;E({type:"objstore-put-begin",...u,signature:c}),m=await k(ne=>ne.workspaceTag===g.workspaceTag&&ne.resourceTag===f&&(ne.type==="objstore-put-token"||ne.type==="objstore-put-error"||ne.type==="objstore-conflict"||ne.type==="unauthorized"&&ne.kind==="gated")),!(m.type!=="unauthorized"||v||(v=!0,!await o.runAuthFlow())););if(m.type==="unauthorized")return{kind:"unauthorized"};if(m.type==="objstore-put-error"){if(m.reason==="workspace-full")return{kind:"workspace-full"};throw new Error(`objstore: put-error reason='${String(m.reason)}'`)}if(m.type==="objstore-conflict")return{kind:"conflict",current:He(m.current)?_e(m.current):null};if(typeof m.urlPath!="string"||typeof m.token!="string")throw new TypeError("objstore: malformed put-token (missing urlPath/token)");return{kind:"token",urlPath:m.urlPath,token:m.token}}async function W(g,f,u,w){let c=Date.now(),m=await Lr(g.signingKey,u,c),v=await globalThis.fetch(q(g.workspaceTag,f),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"put",ts:c,signature:m,prevVersion:u.prevVersion,prevIncarnation:u.prevIncarnation,expectedLength:u.expectedLength,contentHash:w})});if(v.status===401)return{kind:"unauthorized"};if(v.status===403)return{kind:"workspace-full"};if(v.status===409)return{kind:"conflict",current:await hn(v)};if(!v.ok){let ne="";try{ne=await v.text()}catch{}throw new Error(`objstore: REST put-begin failed ${v.status} ${ne.slice(0,200)}`)}let L;try{L=await v.json()}catch{throw new TypeError("objstore: put-mint JSON parse failed")}if(!L||typeof L!="object"||typeof L.urlPath!="string"||typeof L.token!="string")throw new TypeError("objstore: malformed put-mint (missing urlPath/token)");return{kind:"token",urlPath:L.urlPath,token:L.token}}async function K(g,f){let u=`objstore: ${pn}`;for(let w=0;;w++)try{return await f()}catch(c){if(w<Li&&!g.closed&&c instanceof Error&&c.message===u)continue;throw c}}function U(g,f){return K(g,()=>D(g,f))}async function D(g,f){if(await g.connectedPromise,g.closed)throw new Error("objstore: session closed");let u=await me(f.bytes),w={workspaceTag:g.workspaceTag,resourceTag:f.resourceTag,prevVersion:f.prev?.version??null,prevIncarnation:f.prev?.incarnation??null,expectedLength:f.bytes.byteLength,contentHash:u},c;if(o.isSse()?(c=await W(g,f.resourceTag,w,u),c.kind==="unauthorized"&&(c=await $(g,f.resourceTag,w))):c=await $(g,f.resourceTag,w),c.kind==="unauthorized")return{ok:!1,reason:"unauthorized"};if(c.kind==="workspace-full")return{ok:!1,reason:"workspace-full"};if(c.kind==="conflict")return{ok:!1,reason:"conflict",current:c.current};let m=await globalThis.fetch(J(c.urlPath),{method:"PUT",headers:{authorization:`Bearer ${c.token}`,"content-type":"application/octet-stream"},body:f.bytes});if(!m.ok){if(m.status===409||m.status===410)return{ok:!1,reason:"conflict",current:m.status===409?await hn(m):null};let ne="";try{ne=await m.text()}catch{}throw new Error(`objstore: REST PUT failed ${m.status} ${ne.slice(0,200)}`)}let v;try{v=await m.json()}catch{throw new TypeError("objstore: PUT ack JSON parse failed")}if(!v||typeof v!="object"||!nt(v.version)||typeof v.incarnation!="string"||typeof v.contentHash!="string"||!nt(v.contentLength))throw new TypeError("objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)");let L=v;if(L.contentHash!==u||L.contentLength!==f.bytes.byteLength)throw new Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${L.contentHash.slice(0,16)}\u2026 length=${L.contentLength}, client signed ${u.slice(0,16)}\u2026 length=${f.bytes.byteLength}`);return{ok:!0,meta:L}}async function F(g,f){let u=o.getNonce();if(!u)throw new Error("objstore: socket not open");let w=await jr(g.signingKey,g.workspaceTag,f,u);E({type:"objstore-fetch",workspaceTag:g.workspaceTag,resourceTag:f,signature:w});let c=await k(m=>m.workspaceTag===g.workspaceTag&&m.resourceTag===f&&(m.type==="objstore-fetch-token"||m.type==="objstore-fetch-not-found"));if(c.type==="objstore-fetch-not-found")return{kind:"not-found"};if(typeof c.urlPath!="string"||typeof c.token!="string"||!He(c))throw new TypeError("objstore: malformed fetch-token (missing urlPath / token / metadata)");return{kind:"token",urlPath:c.urlPath,token:c.token,meta:_e(c)}}async function _(g,f){let u=Date.now(),w=await Cr(g.signingKey,g.workspaceTag,f,u),c=await globalThis.fetch(q(g.workspaceTag,f),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"fetch",ts:u,signature:w})});if(c.status===404)return{kind:"not-found"};if(c.status===401)return{kind:"unauthorized"};if(!c.ok){let v="";try{v=await c.text()}catch{}throw new Error(`objstore: REST fetch-mint failed ${c.status} ${v.slice(0,200)}`)}let m;try{m=await c.json()}catch{throw new TypeError("objstore: fetch-mint JSON parse failed")}if(!m||typeof m!="object"||typeof m.urlPath!="string"||typeof m.token!="string"||!He(m))throw new TypeError("objstore: malformed fetch-mint (missing urlPath / token / metadata)");return{kind:"token",urlPath:m.urlPath,token:m.token,meta:_e(m)}}async function j(g,f){for(let u=0;u<Fr;u++){let w=await K(g,()=>N(g,f));if(w.kind==="ok")return w.value;if(w.kind==="not-found")return null;if(u+1<Fr){let c=Math.min(Ui,Mi*2**u);await new Promise(m=>{setTimeout(m,c)})}}return null}async function N(g,f){if(await g.connectedPromise,g.closed)throw new Error("objstore: session closed");let u;if(o.isSse()?(u=await _(g,f),u.kind==="unauthorized"&&(u=await F(g,f))):u=await F(g,f),u.kind==="not-found")return{kind:"not-found"};if(u.kind==="unauthorized")throw new Error("objstore: fetch-mint unauthorized");let w=u.meta,c=await globalThis.fetch(J(u.urlPath),{method:"GET",headers:{authorization:`Bearer ${u.token}`}});if(!c.ok){if(c.status===404||c.status===503)return{kind:"retry"};let L="";try{L=await c.text()}catch{}throw new Error(`objstore: REST GET failed ${c.status} ${L.slice(0,200)}`)}let m=new Uint8Array(await c.arrayBuffer()),v=await me(m);if(v!==w.contentHash)throw new Error(`objstore: contentHash mismatch \u2014 expected ${w.contentHash.slice(0,16)}\u2026, got ${v.slice(0,16)}\u2026`);return{kind:"ok",value:{bytes:m,meta:w}}}async function I(g,f){let u=o.getNonce();if(!u)throw new Error("objstore: socket not open");let w=await Or(g.signingKey,f,u);E({type:"objstore-delete",...f,signature:w});let c=await k(m=>m.workspaceTag===g.workspaceTag&&m.resourceTag===f.resourceTag&&(m.type==="objstore-deleted-ack"||m.type==="objstore-delete-error"||m.type==="objstore-conflict"));if(c.type==="objstore-deleted-ack"){if(typeof c.deletedVersion!="number")throw new TypeError("objstore: malformed deleted-ack (deletedVersion not a number)");return{kind:"ok",deletedVersion:c.deletedVersion}}if(c.type==="objstore-conflict")return{kind:"conflict",current:He(c.current)?_e(c.current):null};if(c.reason==="not-found")return{kind:"not-found"};throw new Error(`objstore: delete-error reason='${String(c.reason)}'`)}async function T(g,f,u){let w=Date.now(),c=await Mr(g.signingKey,u,w),m=await globalThis.fetch(q(g.workspaceTag,f),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"delete",ts:w,signature:c,prevVersion:u.prevVersion,prevIncarnation:u.prevIncarnation})});if(m.status===401)return{kind:"unauthorized"};if(m.status===404)return{kind:"not-found"};if(m.status===409)return{kind:"conflict",current:await hn(m)};if(!m.ok){let L="";try{L=await m.text()}catch{}throw new Error(`objstore: REST delete failed ${m.status} ${L.slice(0,200)}`)}let v;try{v=await m.json()}catch{throw new TypeError("objstore: delete-ack JSON parse failed")}if(!v||typeof v!="object"||typeof v.deletedVersion!="number")throw new TypeError("objstore: malformed delete-ack (deletedVersion not a number)");return{kind:"ok",deletedVersion:v.deletedVersion}}function z(g,f,u){return K(g,()=>G(g,f,u))}async function G(g,f,u){if(await g.connectedPromise,g.closed)throw new Error("objstore: session closed");let w={workspaceTag:g.workspaceTag,resourceTag:f,prevVersion:u?.version??null,prevIncarnation:u?.incarnation??null},c;if(o.isSse()?(c=await T(g,f,w),c.kind==="unauthorized"&&(c=await I(g,w))):c=await I(g,w),c.kind==="ok")return{ok:!0,deletedVersion:c.deletedVersion};if(c.kind==="conflict")return{ok:!1,reason:"conflict",current:c.current};if(c.kind==="not-found")return{ok:!1,reason:"not-found"};throw new Error("objstore: delete unauthorized")}function H(g,f,u,w){let c=g.seenVersions.get(f);if(c&&c.incarnation===u&&w<c.version)throw new Error(`objstore: version-rollback rejected \u2014 fetched v${w} for an incarnation we've already seen at v${c.version}`)}async function le(g,f){if(i)throw new Error("objstore: client closed");if(!f||typeof f.workspaceId!="string")throw new Error("objstore: openWorkspace requires a WorkspaceSubscription (triageSync.ensureSubscription) \u2014 the client must not open a session for a tag with no backing sync subscribe");let u=g.workspaceTag;if(f.workspaceTag!=null&&f.workspaceTag!==u)throw new Error("objstore: openWorkspace \u2014 WorkspaceSubscription is for a different workspace than these keys");if(s.has(u))throw new Error(`objstore: workspace ${u.slice(0,8)}\u2026 is already open on this client`);let w={workspaceTag:u,signingKey:g.signingKey,contentKey:new Uint8Array(g.contentKey),tagKey:new Uint8Array(g.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,inventorySeeded:!1,connected:!1,closed:!1};y(w),b(w),s.set(u,w);let c=w;(async()=>{let S;try{S=await f.resources}catch{return}!c.closed&&!c.inventorySeeded&&A(c,h(S))})();let m=o.acquire();a.set(u,m),o.getNonce()&&(c.connected=!0,c.resolveConnected());let v=null;try{await new Promise((S,R)=>{v=setTimeout(()=>{R(new Error(`objstore: connect timeout after ${t}ms`))},t),c.connectedPromise.then(()=>S(),P=>R(P))})}catch(S){v&&clearTimeout(v),s.delete(u),a.delete(u),c.closed=!0;try{c.contentKey.fill(0)}catch{}try{c.tagKey.fill(0)}catch{}throw m.release(),S}v&&clearTimeout(v);async function L(S,R,P){let V=await U(c,{resourceTag:S,bytes:R,prev:P});return V.ok?(P==null&&c.seenVersions.delete(S),p(c,S,V.meta.incarnation,V.meta.version),c.inventory.set(S,{version:V.meta.version,incarnation:V.meta.incarnation,contentLength:V.meta.contentLength}),{ok:!0,meta:{version:V.meta.version,incarnation:V.meta.incarnation,contentLength:V.meta.contentLength}}):V.reason==="workspace-full"?{ok:!1,reason:"workspace-full"}:V.reason==="unauthorized"?{ok:!1,reason:"unauthorized"}:(V.current&&p(c,S,V.current.incarnation,V.current.version),{ok:!1,reason:"conflict",current:V.current})}async function ne(S){let R=await ue(c.tagKey,S.fileName),P=cn(c.contentKey,S.fileName,S.content,u,R);return await L(R,P,S.prev)}async function Qn(S){let R=await ue(c.tagKey,S),P=await j(c,R);if(!P)return null;H(c,R,P.meta.incarnation,P.meta.version);let{fileName:V,content:wt}=Tt(c.contentKey,P.bytes,u,R);if(V!==S)throw new Error(`objstore: fileName-binding mismatch \u2014 requested '${S}', payload encoded '${V}'`);return p(c,R,P.meta.incarnation,P.meta.version),{content:wt,version:P.meta.version,incarnation:P.meta.incarnation}}async function Bo(S){let R=await j(c,S);if(!R)return null;H(c,S,R.meta.incarnation,R.meta.version);let{fileName:P,content:V}=Tt(c.contentKey,R.bytes,u,S);if(await ue(c.tagKey,P)===S)return p(c,S,R.meta.incarnation,R.meta.version),{kind:"report",fileName:P,content:V,version:R.meta.version,incarnation:R.meta.incarnation};if(await ve(c.tagKey,P)===S){let{name:Xt,content:Uo}=ln(V);return p(c,S,R.meta.incarnation,R.meta.version),{kind:"bundle",integrity:P,name:Xt,content:Uo,version:R.meta.version,incarnation:R.meta.incarnation}}throw new Error("objstore: fetchByTag \u2014 decrypted name does not derive back to the requested resourceTag under either the report or bundle tag scheme (relay or workspace member produced a non-round-trippable tag-name pair)")}async function er(S,R){let P=await z(c,S,R);return P.ok?(c.seenVersions.delete(S),c.inventory.delete(S),P):P.reason==="not-found"?{ok:!1,reason:"not-found"}:(P.current&&p(c,S,P.current.incarnation,P.current.version),{ok:!1,reason:"conflict",current:P.current})}async function Oo(S,R){let P=await ue(c.tagKey,S);return await er(P,R)}async function jo(){if(await x(c),c.closed)throw new Error("objstore: session closed");return[...c.inventory.entries()].map(([S,R])=>({resourceTag:S,version:R.version,incarnation:R.incarnation,contentLength:R.contentLength}))}async function Co(S){let R=await ve(c.tagKey,S.integrity),P=Pr(S.name,S.content),V=cn(c.contentKey,S.integrity,P,u,R);return await L(R,V,S.prev)}async function Lo(S){let R=await ve(c.tagKey,S),P=await j(c,R);if(!P)return null;H(c,R,P.meta.incarnation,P.meta.version);let{fileName:V,content:wt}=Tt(c.contentKey,P.bytes,u,R);if(V!==S)throw new Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${S}', payload encoded '${V}'`);let{name:tr,content:Xt}=ln(wt);return p(c,R,P.meta.incarnation,P.meta.version),{name:tr,content:Xt,version:P.meta.version,incarnation:P.meta.incarnation}}async function Mo(S,R){let P=await ve(c.tagKey,S);return await er(P,R)}return{put:ne,fetch:Qn,fetchByTag:Bo,delete:Oo,list:jo,putBundle:Co,fetchBundle:Lo,deleteBundle:Mo,onPut(S){return c.putHandlers.add(S),()=>{c.putHandlers.delete(S)}},onDeleted(S){return c.deletedHandlers.add(S),()=>{c.deletedHandlers.delete(S)}},close(){if(c.closed)return;c.closed=!0,s.delete(u);try{c.contentKey.fill(0)}catch{}try{c.tagKey.fill(0)}catch{}try{c.rejectConnected(new Error("objstore: session closed"))}catch{}try{c.rejectListed(new Error("objstore: session closed"))}catch{}let S=a.get(u);a.delete(u),S&&S.release()}}}function we(){if(!i){i=!0;for(let g of s.values()){g.closed=!0;try{g.contentKey.fill(0)}catch{}try{g.tagKey.fill(0)}catch{}try{g.rejectConnected(new Error("objstore: client closed"))}catch{}try{g.rejectListed(new Error("objstore: client closed"))}catch{}}s.clear();for(let g of a.values())g.release();a.clear(),X.remove(),r&&o.close()}}return{openWorkspace:le,close:we}}async function hn(e){try{let t=await e.json();if(nt(t.currentVersion)&&typeof t.currentIncarnation=="string")return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function nt(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function He(e){return!e||typeof e!="object"?!1:typeof e.resourceTag=="string"&&nt(e.version)&&typeof e.incarnation=="string"&&typeof e.contentHash=="string"&&nt(e.contentLength)&&typeof e.signature=="string"}function _e(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var mn=null;function Wr(e){mn=typeof e=="function"?e:null}var Ii=Pt({serverUrl:"",authResolver:e=>mn==null?Promise.resolve(null):mn(e)});function Bt(){return Ii}var Hr=new Set(["busy"]);function _r(e){return e==="inprogress"||e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function Te(e){if(e)return _r(e.triage)??(e.deleted?"deleted":void 0)}function Ki(e){return e?!e.color&&!Te(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0)&&e.flagged===void 0:!0}function xe(e){if(!e||typeof e!="object")return;let t=e,n={};typeof t.color=="string"&&t.color&&(n.color=t.color);let r=_r(t.triage)??(t.deleted?"deleted":void 0);if(r&&(n.triage=r),typeof t.comment=="string"&&t.comment&&(n.comment=t.comment),typeof t.fix=="string"&&t.fix&&(n.fix=t.fix),typeof t.flagged=="boolean"&&(n.flagged=t.flagged),Array.isArray(t.ignoredReports)){let o=t.ignoredReports.filter(i=>typeof i=="string"&&i.length>0);o.length>0&&(n.ignoredReports=o)}return Ki(n)?void 0:n}function Di(e,t){let n=e??[],r=t??[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let o=new Set(n);for(let i of r)if(!o.has(i))return!1;return!0}function zr(e,t){let n=e??{},r=t??{};return(n.color??"")===(r.color??"")&&(Te(n)??"")===(Te(r)??"")&&(n.comment??"")===(r.comment??"")&&(n.fix??"")===(r.fix??"")&&n.flagged===r.flagged&&Di(n.ignoredReports,r.ignoredReports)}function de(e,t,n){let r=e.get(t),o=xe({...r,...n});return o===void 0?e.delete(t):zr(r,o)?!1:(e.set(t,o),!0)}function Vr(e,t,n){let r=xe(n),o=e.get(t);return r===void 0?e.delete(t):zr(o,r)?!1:(e.set(t,r),!0)}function qr(e,t,n,r){let o=new Set(e.get(t)?.ignoredReports??[]);return r?o.add(n):o.delete(n),de(e,t,{ignoredReports:o.size>0?[...o]:void 0})}function Fi(e){return typeof e?.color=="string"?e.color:""}function $i(e){return e?.triage==="inprogress"||e?.triage==="fixed"||e?.triage==="invalid"||e?.triage==="deleted"?e.triage:e?.deleted?"deleted":""}function Wi(e){return typeof e?.comment=="string"?e.comment:""}function Hi(e){return typeof e?.fix=="string"?e.fix:""}function _i(e){return e?.flagged===!0?"flagged":e?.flagged===!1?"not flagged":""}function Gr(e,t,n,r){let o=[];for(let i of Object.keys(e)){let s=e[i],a=t[i],l=n[i],d=s??null,p=[{name:"color",norm:Fi},{name:"triage",norm:$i},{name:"comment",norm:Wi},{name:"fix",norm:Hi},{name:"flagged",norm:_i}];for(let{name:y,norm:b}of p){let A=b(a),h=b(d),x=b(l);(h!==A||r?.has(i))&&x!==A&&h!==x&&o.push({id:i,property:y,local:h,imported:x})}}return o}function Jr(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let o=new Set(n);for(let i of r)if(!o.has(i))return!1;return!0}function Yr(e,t){let n=e.triage??(e.deleted?"deleted":""),r=t.triage??(t.deleted?"deleted":"");return e.color===t.color&&n===r&&(e.comment??"")===(t.comment??"")&&(e.fix??"")===(t.fix??"")&&e.flagged===t.flagged&&Jr(e.ignoredReports,t.ignoredReports)}function wn(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!Yr(e[r]??{},t[r]??{}))return!1;return!0}function zi(e=[],t=[],n=[]){let r=new Set(e),o=new Set(t),i=new Set(n);for(let s of r)o.has(s)||i.delete(s);for(let s of o)r.has(s)||i.add(s);return[...i]}function Xr(e,t,n,r){let o=Object.assign(Object.create(null),n);for(let i of new Set([...Object.keys(e),...Object.keys(t),...r??[]])){let s=r?.has(i),a=xe(e[i])??{},l=xe(t[i])??{},d={...xe(n[i])};for(let y of["color","comment","fix","flagged"])(a[y]!==l[y]||s)&&Object.assign(d,{[y]:l[y]});if(s||a.triage!==l.triage||!Jr(a.ignoredReports,l.ignoredReports)){let y=!s&&l.triage===void 0&&d.triage===void 0?zi(a.ignoredReports,l.ignoredReports,d.ignoredReports):l.ignoredReports??[];l.triage===void 0?delete d.triage:d.triage=l.triage,y.length===0?delete d.ignoredReports:d.ignoredReports=y}let p=xe(d);p?o[i]=p:delete o[i]}return o}function rt(e,t){let n=Object.assign(Object.create(null),e);for(let[r,o]of Object.entries(t))o===null?delete n[r]:o!==void 0&&(n[r]=o);return n}function ze(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r){let i=e[o]??{},s=t[o]??{};Yr(i,s)||(n[o]=t[o]??null)}return n}function Zr(e){for(let t in e)return!1;return!0}function Ne(e,t){let n=Object.assign(Object.create(null),e),r=fe().state,o=t instanceof Set?t:new Set(t);for(let i of o){let s=xe(r.triage.get(i));s?n[i]=s:delete n[i]}return n}function bn(e,t){let n=fe().state,r=[];for(let o of t){let i=e[o];if(!i||typeof i!="object")continue;let s=n.triage.get(o);if(i.color){let d=s?.color;d===void 0?de(n.triage,o,{color:i.color}):d!==i.color&&r.push({id:o,property:"color",local:d,imported:i.color})}let a=Te(i);if(a){let d=Te(s);d===void 0?de(n.triage,o,{triage:a}):d!==a&&r.push({id:o,property:"triage",local:d,imported:a})}if(i.comment){let d=s?.comment;d===void 0?de(n.triage,o,{comment:i.comment}):d!==i.comment&&r.push({id:o,property:"comment",local:d,imported:i.comment})}if(i.fix){let d=s?.fix;d===void 0?de(n.triage,o,{fix:i.fix}):d!==i.fix&&r.push({id:o,property:"fix",local:d,imported:i.fix})}if(typeof i.flagged=="boolean"){let d=s?.flagged;d===void 0?de(n.triage,o,{flagged:i.flagged}):d!==i.flagged&&r.push({id:o,property:"flagged",local:d?"flagged":"not flagged",imported:i.flagged?"flagged":"not flagged"})}if(!(a!=null||Te(s)!=null||!Array.isArray(i.ignoredReports))&&!((s?.ignoredReports?.length??0)>0))for(let d of i.ignoredReports)typeof d=="string"&&qr(n.triage,o,d,!0)}return r}function vn(e,t){let n=fe().state;for(let r of e){let o=`${r.id}:${r.property}`;t[o]==="imported"&&Vi(r.id,r.property)===r.local&&(r.property==="color"?de(n.triage,r.id,{color:r.imported}):r.property==="comment"?de(n.triage,r.id,{comment:r.imported}):r.property==="fix"?de(n.triage,r.id,{fix:r.imported}):r.property==="triage"?r.imported==="inprogress"||r.imported==="fixed"||r.imported==="invalid"||r.imported==="deleted"?de(n.triage,r.id,{triage:r.imported,ignoredReports:void 0}):de(n.triage,r.id,{triage:void 0}):r.property==="flagged"&&de(n.triage,r.id,{flagged:r.imported==="flagged"?!0:r.imported==="not flagged"?!1:void 0}))}}function Vi(e,t){let n=fe().state.triage.get(e);return t==="color"?n?.color??"":t==="triage"?Te(n)??"":t==="comment"?n?.comment??"":t==="fix"?n?.fix??"":t==="flagged"?n?.flagged===!0?"flagged":n?.flagged===!1?"not flagged":"":""}function Qr(e,t){let n=fe().state,r=t instanceof Set?t:new Set(t);for(let o of r){let i=e[o],s=Te(i)?void 0:i?.ignoredReports;Vr(n.triage,o,{...i,ignoredReports:s})}}var kn="deepview.sync.sessions",qi=kn,Sn=1,jt=!1,Ot=new Set;function eo(){return jt}function ot(e){if(jt!==e){jt=e,console.warn(e?"triage-sync: can't persist the sessions blob \u2014 either it's an unrecognised future version (writes skipped to avoid clobbering a newer build's data) or the write itself failed (storage full / vault locked). Your in-memory triage state still works this session but will not persist across reload. Free up storage and/or clear localStorage[deepview.sync.sessions]; the badge clears on the next successful save.":"triage-sync: persistence recovered; persisted-sessions blob is now writable.");for(let t of Ot)try{t(e)}catch(n){console.warn("persistenceDegraded listener:",n)}}}function to(e){let t=n=>e(n);return Ot.add(t),queueMicrotask(()=>{if(Ot.has(t))try{t(jt)}catch(n){console.warn("persistenceDegraded listener:",n)}}),()=>Ot.delete(t)}function Ct(){try{let e=fe().getSecureItem(kn);if(!e)return{kind:"empty"};let t=JSON.parse(e);if(!t||typeof t!="object")return{kind:"empty"};let n=t;return n.version===Sn&&n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions)?{kind:"v1",map:n.sessions}:n.version===Sn?{kind:"empty"}:"version"in n?{kind:"unknown-version"}:{kind:"legacy",map:n}}catch{return{kind:"empty"}}}function Gi(){let e=Ct();return e.kind==="v1"||e.kind==="legacy"?e.map:{}}async function Ji(e){try{return await fe().setSecureItem(kn,JSON.stringify({version:Sn,sessions:e})),!0}catch(t){return console.warn("Triage sync: could not persist session state:",t),!1}}function Tn(e,t){if(!t)return null;let r=Gi()[e];return!r||r.serverUrl!==t?null:{baseRevision:typeof r.baseRevision=="string"?r.baseRevision:null,...r.hasBase===!0?{hasBase:!0}:{},baseState:r.baseState&&typeof r.baseState=="object"?Object.assign(Object.create(null),r.baseState):Object.create(null),savesSinceKeyframe:typeof r.savesSinceKeyframe=="number"?r.savesSinceKeyframe:0}}async function Lt(e){await navigator.locks.request(qi,async()=>{let t=Ct();if(t.kind==="unknown-version"){ot(!0);return}let n=t.kind==="v1"||t.kind==="legacy"?t.map:{};if(await e(n)===!1)return;let o=await Ji(n);ot(!o)})}function xn(e=null){Lt(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(fe().listWorkspaces().map(i=>i.id)),o=!1;for(let i of n){let s=t[i];(!r.has(i)||e!=null&&s?.serverUrl!==e)&&(delete t[i],o=!0)}return o?void 0:!1}).catch(t=>{console.warn("Triage sync: prunePersistedSessions lock failed:",t)})}function Mt(e){return Lt(t=>{if(!(e in t))return!1;delete t[e]})}function no(e){if(typeof e!="string"||!e.trim())return null;try{let t=new URL(e);return!["http:","https:"].includes(t.protocol)||t.username||t.password||t.search||t.hash?null:(t.pathname=t.pathname.replace(/\/+$/u,"")+"/",t.href)}catch{return null}}function ro(e){if(e==null||typeof e!="object")return null;let t=e.mode;if(t!=="e2e"&&t!=="managed"&&t!=="managed+e2e"&&t!=="e2e+managed")return null;let n=null,r=e.managed;if(r!=null&&typeof r=="object"){let s=r.loginPath,a=r.cookieName;typeof s=="string"&&typeof a=="string"&&(n={loginPath:s,cookieName:a},r.allowShare===!0&&(n.allowShare=!0))}let o=t==="managed"?null:no(e.deepviewScanServer),i=e.githubNewIssueLabels;return{mode:t,managed:n,...o?{deepviewScanServer:o}:{},...typeof i=="string"&&i.length<=4096?{githubNewIssueLabels:i}:{}}}var Nt=!1,Ut=new Set;function An(){return Nt}function it(e){if(Nt!==e){Nt=e,e&&console.warn("triage-sync: the sync relay appears to sit behind an authentication proxy (e.g. Cloudflare Access) and this session is no longer authorised \u2014 reconnects are being redirected to the proxy login. Reload the page to sign in again.");for(let t of Ut)try{t(e)}catch(n){console.warn("proxyAuthRequired listener:",n)}}}function oo(e){let t=n=>e(n);return Ut.add(t),queueMicrotask(()=>{if(Ut.has(t))try{t(Nt)}catch(n){console.warn("proxyAuthRequired listener:",n)}}),()=>Ut.delete(t)}async function io(e){if(typeof fetch>"u"||!e)return!1;let t;try{t=gn(e)}catch{return!1}let n;try{n=await fetch(t,{method:"GET",redirect:"manual",credentials:"same-origin",cache:"no-store"})}catch{return!1}return n.type==="opaqueredirect"}var lo,ut,$t,so,uo,Yi="deepview.triageSyncUrl",fo="deepview.sync.userEnabled",Xi=/^\d+$/u,Ht=()=>{},lt=null,pe="",ct=!0,Rn=!1,oe=Bt(),st=null,Ae=100,Zi=5,Qi=2e3;function Pe(){return ct&&!Rn&&!!pe&&es()}function es(){try{return ut().length>0}catch{return!1}}var Pn=new Set,Bn=new Set,On=null;function ts(e){let t=ro(e);if(t!=null){On=t;for(let n of Bn)try{n(t)}catch(r){console.warn("Triage sync: onServerInfo listener failed:",r)}}}function Wt(){if(!Pe())return"off";for(let t of O.values())if(t.error)return"error";let e=oe.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return"offline";for(let t of O.values())if(!t.subscribeAcked)return"connecting";return"online"}var ao="off";function ee(){let e=Wt();if(e!==ao){ao=e,is(e);for(let t of Pn)try{t(e)}catch(n){console.warn("Triage sync status listener:",n)}}}var ns=6e3,rs=3e4,Ke=null,It=!1,jn=0;function Cn(e){return e==="offline"||e==="connecting"}function Nn(){jn+=1,Ke!=null&&(clearTimeout(Ke),Ke=null)}function go(e){Nn(),Ke=setTimeout(()=>{Ke=null,os()},e),Ke.unref?.()}async function os(){if(It||!Pe()||!Cn(Wt()))return;let e=jn;It=!0;let t=!1;try{t=await io(pe)}catch{t=!1}finally{It=!1}if(jn===e){if(!Pe()||!Cn(Wt())){it(!1);return}if(t){it(!0);return}go(rs)}}function is(e){Cn(e)?Ke==null&&!It&&!An()&&go(ns):(Nn(),it(!1))}var Ln=0,O=new Map;function Mn(e){for(let t of O.values())if(t.workspaceTag===e)return t;return null}function ge(e){return O.get(e.workspaceId)===e}function ss(e){e.busyRetryTimer==null&&(e.busyRetryTimer=setTimeout(()=>{e.busyRetryTimer=null,ge(e)&&(e.error||e.pending||!e.pendingSave||(e.pendingSave=!1,ae(e)))},Qi),e.busyRetryTimer.unref?.())}function _t(e){e.busyRetryTimer!=null&&(clearTimeout(e.busyRetryTimer),e.busyRetryTimer=null)}function co(e){if(e.appliedRevisions.clear(),_t(e),e.key){try{e.key.fill(0)}catch{}e.key=null}if(e.signingKey=null,e.verifyingKey=null,e.objstoreResourceWaiters.length>0){let t=e.objstoreResourceWaiters.splice(0);for(let n of t)try{n([])}catch{}}}function po(e){let t=new Set,n=ut().find(o=>o.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let o of lo.reports)if(r.has(o.fileName))for(let i of o.groups)for(let s of i){let a=s.id??String(s._id);Xi.test(a)||t.add(a)}return t}function In(e){let t=po(e.workspaceId),n=[];for(let o of t)e.ids.has(o)||n.push(o);let r=[];return n.length>0&&(r=bn(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function as(){let e=Ct();e.kind==="unknown-version"?ot(!0):(e.kind==="v1"||e.kind==="legacy")&&ot(!1),Ir(),oe.resetCachedReplayGuard()}function Kn(e){if(!e||!pe)return;let t=pe,n=e.generation,r={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState,...e.baseRevision===null&&e.hasBase?{hasBase:!0}:{}};Lt(o=>{if(!ge(e)||e.generation!==n||pe!==t)return!1;o[e.workspaceId]=r}).catch(o=>{console.warn("Triage sync: persistSession lock failed:",o)})}function Un(e){let t=ut().find(r=>r.id===e.workspaceId);if(!t){e.error="workspace no longer exists",ee();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,o]=await Promise.all([br(t.privateKey),kt(t.privateKey,e.workspaceId)]);if(O.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=o.privateKey,e.verifyingKey=o.publicKey,e.workspaceTag=o.publicKeyB64,oe.getSocket()?.readyState!==WebSocket.OPEN){Ie();return}Ge(e),ae(e),ee()}catch(r){console.warn("Triage sync: key derivation failed:",r),O.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${r instanceof Error?r.message:String(r)}`,ee())}})()}function Kt(e){return oe.send(e)}function cs(e,t){if(!oe.isSse()){Kt(t);return}let n=e.generation,r=e.pending,o=()=>ge(e)&&e.generation===n&&e.pending===r;ls(t,o).then(i=>(i&&o()&&Kt(t),null)).catch(()=>{o()&&Kt(t)})}async function ls(e,t){if(!pe)return!0;let n;try{n=Dr(pe)}catch{return!0}let r;try{r=await globalThis.fetch(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e),signal:AbortSignal.timeout(3e4)})}catch{return!0}if(!t())return!1;let o=e.workspaceTag,i=e.base??null;if(r.status===401)return!0;if(r.ok){let s=null;try{s=await r.json()}catch{return!0}return t()?!s||typeof s.id!="string"?!0:(at({type:"workspace-save-ack",workspaceTag:o,base:i,id:s.id},t),!1):!1}if(r.status===409){let s=null;try{s=await r.json()}catch{return!0}if(!t())return!1;let a=s&&Array.isArray(s.revisions)?s.revisions:[];return at({type:"workspace-state",workspaceTag:o,revisions:a},t),at({type:"workspace-save-error",workspaceTag:o,base:i,reason:"stale-base"},t),!1}return r.status===413?(at({type:"workspace-save-error",workspaceTag:o,base:i,reason:"too-large"},t),!1):!0}function Ge(e,t=!1){if(!ge(e)||!Pe())return;let n=oe.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=oe.getNonce();if(r==null)return;let o=e.baseRevision,i=n,s=e.signingKey,a=e.workspaceTag,l=e.generation;(async()=>{try{let d=await kr(s,a,o,r);if(O.get(e.workspaceId)!==e||e.generation!==l||e.workspaceTag!==a||oe.getSocket()!==i||oe.getNonce()!==r)return;e.subscribed=!0,Kt({type:"workspace-subscribe",workspaceTag:a,from:o,signature:d})}catch(d){console.warn("Triage sync: subscribe sign failed:",d)}})()}function ae(e){if(!ge(e)||!Pe()||e.error)return;if(e.pending||e.encrypting||e.receiving){e.pendingSave=!0;return}if(!e.key||!e.signingKey||!e.workspaceTag){e.pendingSave=!0;return}In(e),e.localState=Ne(e.baseState,e.ids);let t=oe.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=Ae,r=n?Object.create(null):e.baseState,o=ze(r,e.localState);if(Zr(o)&&!n)return;let i=e.baseRevision,s=e.key,a=e.signingKey,l=e.workspaceTag,d=e.generation;e.encrypting=!0,(async()=>{try{let p=sn(l,i),{nonce:y,ciphertext:b}=await xr(s,o,p),A={publicKeyB64:l,base:i,keyframe:n,nonceB64:y,ciphertextB64:b},h=await Sr(a,A),x=await on(A);if(O.get(e.workspaceId)!==e||e.generation!==d||e.workspaceTag!==l)return;if(e.baseRevision!==i||e.receiving){e.pendingSave=!0;return}e.pending={base:i,id:x,changeset:o,keyframe:n},e.pendingSave=!1;let k={type:"workspace-save",workspaceTag:l,base:i,nonce:y,ciphertext:b,signature:h};n&&(k.keyframe=!0),cs(e,k),e.consecutiveFailures=0,e.error&&(e.error=null,ee())}catch(p){console.warn("Triage sync: encrypt/sign failed:",p),ge(e)&&e.generation===d&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=Zi&&(e.error=`encrypt/sign failed: ${p instanceof Error?p.message:String(p)}`,ee()))}finally{ge(e)&&e.generation===d&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&!e.receiving&&(e.pendingSave=!1,ae(e)))}})()}async function us(e,t,n,r){for(let o of t){if(!o||typeof o!="object"||typeof o.id=="string"&&(o.id===e.baseRevision||e.appliedRevisions.has(o.id)||r.has(o.id)))continue;let i=e.baseRevision,s=o.keyframe===!0;if(!(i==null?o.base==null||s:o.base===i))return console.warn(`Triage sync: chain base mismatch (expected ${i}, got ${o.base})`),!1;if(typeof o.signature!="string"||typeof o.nonce!="string"||typeof o.ciphertext!="string"||typeof o.id!="string")return console.warn("Triage sync: revision missing signature/nonce/ciphertext/id; resyncing"),e.savesSinceKeyframe=Ae,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let l=typeof o.base=="string"?o.base:null,d={publicKeyB64:e.workspaceTag,base:l,keyframe:s,nonceB64:o.nonce,ciphertextB64:o.ciphertext},p=await Tr(e.verifyingKey,d,o.signature);if(!n())return!1;if(!p)return console.warn("Triage sync: revision signature did not verify; resyncing"),e.savesSinceKeyframe=Ae,!1;let y=await on(d);if(!n())return!1;if(o.id!==y)return console.warn("Triage sync: revision id does not match content hash; resyncing"),e.savesSinceKeyframe=Ae,!1;let b;try{let h=sn(e.workspaceTag,l);b=await Ar(e.key,o.nonce,o.ciphertext,h)}catch(h){return console.warn("Triage sync: decrypt failed; resyncing",h),e.savesSinceKeyframe=Ae,!1}if(!n())return!1;let A=s?Object.create(null):e.baseState;e.baseState=rt(A,b??{}),e.baseRevision=o.id,e.appliedRevisions.add(o.id),e.pending?.id===o.id&&(e.pending=null),s?e.savesSinceKeyframe=0:e.savesSinceKeyframe=Math.min((e.savesSinceKeyframe??0)+1,Ae)}return!0}async function yo(e,t,n=[],r=null){if(!ge(e))return;let o=e.generation;e.localState=rt(e.baseState,t),Ln++;try{Qr(e.localState,e.ids),r&&n.length>0&&(vn(n.filter(({id:i})=>e.ids.has(i)),r),e.localState=Ne(e.baseState,e.ids)),Kn(e),await $t()}finally{Ln--}if(!(!ge(e)||e.generation!==o)){e.localState=Ne(e.baseState,e.ids),Ht();for(let i of O.values())i!==e&&ae(i)}}function Dt(e){return In(e),e.localState=Ne(e.baseState,e.ids),ze(e.baseState,e.localState)}async function fs(e,t){let n=e.generation;if(e.pending&&t.base===e.pending.base&&typeof t.id=="string"&&t.id===e.pending.id){Dt(e);let r=e.localState,o=e.pending.keyframe?Object.create(null):e.baseState;if(e.baseState=rt(o,e.pending.changeset),e.baseRevision=t.id,e.hasBase=!0,e.appliedRevisions.add(t.id),e.savesSinceKeyframe=e.pending.keyframe?0:Math.min((e.savesSinceKeyframe??0)+1,Ae),e.pending=null,e.staleResetAttempted=!1,await yo(e,ze(e.baseState,r)),!ge(e)||e.generation!==n)return;(e.pendingSave||!wn(e.localState,e.baseState))&&(e.pendingSave=!1,ae(e));return}if(e.pending){let r=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: ack mismatch (pending ${e.pending.base}/${e.pending.id.slice(0,8)}, ack ${t.base}/${r})`);return}if(t.id!==e.baseRevision){let r=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${r}\u2026; pending was already cleared`),e.pendingSave=!0,ae(e)}}async function ds(e,t){if(!Array.isArray(t)||!e.key)return;if(t.length===0){e.resyncAttempted&&(e.resyncAttempted=!1,e.pending||(e.pendingSave=!1,ae(e)));return}let n=e.generation,r=e.workspaceTag,o=()=>ge(e)&&e.generation===n&&e.workspaceTag===r;e.receiving=!0;try{Dt(e);let i=e.baseState,s=e.pending,a=e.baseRevision,l={...e,appliedRevisions:new Set},d=await us(l,t,o,e.appliedRevisions);if(!o())return;if(l.baseRevision!==a){let y=s&&l.pending===null?rt(s.keyframe?Object.create(null):i,s.changeset):i;Dt(e);let b=ze(y,e.localState),h=a===null&&!(s&&l.pending===null)?new Set([...Object.keys(y),...e.hasBase?e.ids:[]]):void 0;if(h)for(let B of h)b[B]=e.localState[B]??null;let x=Gr(b,y,l.baseState,h).filter(({id:B})=>e.ids.has(B)),k=null;if(x.length>0&<){try{k=await lt(x,l.baseState,"chain")??null}catch(B){console.warn("Triage sync: chain-conflict resolver failed:",B)}if(!o())return}Dt(e);let E=Xr(y,e.localState,l.baseState,h);e.baseRevision=l.baseRevision,e.hasBase=!0;for(let B of l.appliedRevisions)e.appliedRevisions.add(B);if(e.baseState=l.baseState,e.savesSinceKeyframe=l.savesSinceKeyframe,e.pending&&(e.pendingSave=!0),e.pending=null,await yo(e,ze(e.baseState,E),x,k),!o())return}else e.savesSinceKeyframe=l.savesSinceKeyframe;if(!d){if(e.pendingSave=!1,!e.resyncAttempted){e.resyncAttempted=!0,Ge(e,!0);return}console.warn("Triage sync: catch-up also broke continuity; full state push"),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Ae,e.pending=null,e.resyncAttempted=!1,e.pendingSave=!0,Kn(e),Ht();return}e.resyncAttempted=!1,e.staleResetAttempted=!1,wn(e.localState,e.baseState)||(e.pendingSave=!0)}finally{o()&&(e.receiving=!1,e.pendingSave&&!e.pending&&!e.error&&(e.pendingSave=!1,ae(e)))}}async function gs(e){if(e.type==="server-info"){ts(e);return}if(e.type==="authenticated"){for(let n of O.values())Ge(n),ae(n);return}if(e.type==="unauthorized"){if(e.kind==="gated"){if(typeof e.workspaceTag=="string"){let n=Mn(e.workspaceTag);n&&typeof e.resourceTag!="string"&&ps(n,e)}oe.runAuthFlow().catch(n=>{console.warn("Triage sync: auth flow failed:",n)})}return}if(typeof e.workspaceTag!="string")return;let t=Mn(e.workspaceTag);if(t){if(e.type==="workspace-save-ack")await fs(t,e);else if(e.type==="workspace-state")await ds(t,e.revisions);else if(e.type==="workspace-save-error")hs(t,e);else if(e.type==="workspace-subscribed"){if(t.subscribeAcked=!0,Array.isArray(e.resources)){let n=e.resources,r=t.objstoreResourceWaiters.splice(0);for(let o of r)try{o(n)}catch{}}ee()}}}function ps(e,t){e.pending&&(typeof t.base!="string"&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var ys=/^[\w-]+$/u;function hs(e,t){if(!e.pending||typeof t.base!="string"&&t.base!==null||t.base!==e.pending.base)return;let n=t.reason,r=typeof n=="string"&&n.length>0&&n.length<=64&&ys.test(n)?n:"rejected";if(e.pending=null,Hr.has(r)){e.pendingSave=!0,ss(e);return}if(r==="stale-base"&&!e.staleResetAttempted){e.staleResetAttempted=!0,console.warn("Triage sync: stale-base catch-up did not apply (server chain gone or rebuilt past our base); full state push"),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Ae,e.pendingSave=!1,e.resyncAttempted=!1,Kn(e),Ht(),ae(e);return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,ee()}var Ve=Promise.resolve(),qe=0;function at(e,t=()=>!0){let n=qe,r=typeof e.workspaceTag=="string"?Mn(e.workspaceTag):null;if(typeof e.workspaceTag=="string"&&!r)return;let o=r?.generation;Ve=Ve.then(()=>{if(!(!t()||qe!==n||r&&(!ge(r)||r.generation!==o)))return gs(e)}).catch(i=>{console.warn("Triage sync handler error:",i)})}function ms(e){for(let t of O.values())t.pending=null,t.pendingSave=!1,Ge(t),ae(t);ee()}function ws(e){qe++,Ve=Promise.resolve();for(let t of O.values())t.generation++,t.encrypting=!1,t.receiving=!1,t.pending=null,t.subscribed=!1,t.subscribeAcked=!1,t.resyncAttempted=!1,t.staleResetAttempted=!1,t.pendingSave=!0,_t(t);ee()}oe.addConsumer({onMessage:at,onConnected:ms,onDisconnected:ws});function Ie(){Pe()?st||(st=oe.acquire()):st&&(st.release(),st=null)}function bs(e){Ht=typeof e=="function"?e:()=>{}}function vs(e){lt=typeof e=="function"?e:null}function Ss(e){Wr(e)}function En(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&Un(e)}function Ft(e){e.generation++,e.receiving=!1,e.pending=null,e.pendingSave=!1,e.encrypting=!1,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,_t(e)}var Be={setServerUrl(e){let t=(e??"").trim();if(t===pe)return;let n=pe;qe++,Ve=Promise.resolve(),pe=t,Nn(),it(!1),t&&xn(t),n&&t&&n!==t&&et(null).catch(r=>{console.warn("Triage sync: failed to drop cached auth password on server change:",r)}),oe.setServerUrl(t);for(let r of O.values()){Ft(r);let o=t?Tn(r.workspaceId,t):null;r.baseRevision=o?.baseRevision??null,r.appliedRevisions.clear(),r.baseState=o?.baseState??Object.create(null),r.hasBase=o?.hasBase===!0||r.baseRevision!==null||Object.keys(r.baseState).length>0,r.savesSinceKeyframe=o?.savesSinceKeyframe??0,r.localState=Ne(r.baseState,r.ids),En(r)}Ie(),ee()},setEnabled(e){let t=!!e;if(t!==ct){if(ct=t,uo(fo,t?"1":"0").catch(n=>{console.warn("Triage sync: could not persist user-enabled:",n)}),Pe())for(let n of O.values())En(n);else{qe++,Ve=Promise.resolve();for(let n of O.values())Ft(n)}Ie(),ee()}},isEnabled(){return ct},setForcedOff(e){let t=!!e;if(t!==Rn){if(Rn=t,Pe())for(let n of O.values())En(n);else{qe++,Ve=Promise.resolve();for(let n of O.values())Ft(n)}Ie(),ee()}},getServerUrl(){return pe},get connected(){return oe.getSocket()?.readyState===WebSocket.OPEN},get status(){return Wt()},onStatusChange(e){return Pn.add(e),()=>Pn.delete(e)},onServerInfo(e){if(Bn.add(e),On!=null)try{e(On)}catch{}return()=>Bn.delete(e)},setProtocolLocked(e){oe.setProtocolLocked(e)},notify(){if(!(Ln>0))for(let e of O.values())ae(e)},ensureSubscription(e){let t=O.has(e);Be.openSession(e);let n=O.get(e);if(!n)return null;let r=new Promise(o=>{n.objstoreResourceWaiters.push(o)});return t&&Ge(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||O.has(e)||!ut().find(s=>s.id===e))return;let n=po(e),r=Tn(e,pe),o=r?.baseState??Object.create(null);bn(o,n);let i={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:n,baseRevision:r?.baseRevision??null,appliedRevisions:new Set,baseState:o,hasBase:r?.hasBase===!0||r?.baseRevision!=null||Object.keys(o).length>0,savesSinceKeyframe:r?.savesSinceKeyframe??0,localState:Ne(o,n),pending:null,pendingSave:!1,key:null,encrypting:!1,receiving:!1,generation:0,subscribed:!1,subscribeAcked:!1,resyncAttempted:!1,staleResetAttempted:!1,consecutiveFailures:0,error:null,busyRetryTimer:null,objstoreResourceWaiters:[]};O.set(e,i),Un(i),Ie(),ee()},closeSession(e){if(e==null){for(let t of O.values())co(t);O.clear()}else{let t=O.get(e);t&&co(t),O.delete(e)}ee()},refreshSession(e){let t=O.get(e);if(!t){console.debug("triage-sync: refreshSession bail \u2014 no session for",e,"(caller must openSession first)");return}ho(t)},sessionInfo(e){let t=O.get(e);return t?{workspaceId:t.workspaceId,workspaceTag:t.workspaceTag,baseRevision:t.baseRevision,pending:t.pending&&{base:t.pending.base,keyframe:t.pending.keyframe},pendingSave:t.pendingSave,keyReady:t.key!==null,encrypting:t.encrypting,tracked:t.ids.size,savesSinceKeyframe:t.savesSinceKeyframe??0,error:t.error??null}:null},get openSessions(){return[...O.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...O.keys()]:[e],n=!1;for(let r of t){let o=O.get(r);!o||!o.error||(o.error=null,o.consecutiveFailures=0,n=!0,!o.key||!o.signingKey?Un(o):oe.getSocket()?.readyState===WebSocket.OPEN&&(Ge(o),ae(o)))}n&&ee()},get persistenceDegraded(){return eo()},onPersistenceDegraded(e){return to(e)},get proxyAuthRequired(){return An()},onProxyAuthRequired(e){return oo(e)}};Et(e=>{lo=e.state,ut=e.listWorkspaces,$t=e.saveTriage,so=e.getSecureItem,uo=e.setSecureItem,e.onSecureStorageHydrated(as);try{localStorage.removeItem(Yi),so(fo)==="0"&&(ct=!1),Ie()}catch{}e.onWorkspaceDeleted(t=>{let n=O.get(t);n&&_t(n);let r=O.delete(t);Mt(t).catch(o=>{console.warn("Triage sync: dropPersistedSession lock failed:",o)}),Ie(),r&&ee()}),e.onWorkspacePrivateKeyChanged(t=>{let n=O.get(t);if(!n){Mt(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)});return}n.signingKey=null,n.key=null,n.verifyingKey=null,n.workspaceTag=null,Ft(n),n.keyDerivationGen=(n.keyDerivationGen??0)+1,(async()=>{await Mt(t),O.delete(t),Be.openSession(t),ee()})().catch(r=>{console.warn("Triage sync: privateKey rotation IIFE failed:",r),O.delete(t),ee()})}),e.onReportMembershipChanged(t=>{Be.openSession(t);let n=O.get(t);n&&ho(n)}),xn()});function ho(e){let t=e.generation,{conflicts:n,hydrated:r}=In(e);(async()=>{if(n.length===0){r?await $t():ae(e);return}let o=null;if(lt)try{o=await lt(n,e.baseState,"attach")}catch(i){console.warn("Triage sync: hydration conflict resolver failed:",i)}!ge(e)||e.generation!==t||(o&&vn(n.filter(({id:i})=>e.ids.has(i)),o),await $t())})().catch(o=>{console.warn("Triage sync: refreshAndPropagate failed:",o)})}async function Dn(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var Se,zt,Wn,Vt,qt,Ye,ht,Gt,Vn,mt,qn,So,M=new Map,ks=2e3,Ts={setTimeout:(e,t)=>setTimeout(e,t)},De=new Map,Hn=new Set,xs="deepview.objstore-presence.";function Gn(e){return xs+e}function As(e){try{let t=localStorage.getItem(Gn(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!="object"?null:{names:n.names&&typeof n.names=="object"?n.names:{},bundles:n.bundles&&typeof n.bundles=="object"?n.bundles:{},bundleNames:n.bundleNames&&typeof n.bundleNames=="object"?n.bundleNames:{},baselines:Es(n.baselines,n.localVersions)}}catch{return null}}function Es(e,t){let n={};if(t&&typeof t=="object")for(let[r,o]of Object.entries(t))Number.isSafeInteger(o)&&o>=0&&(n[r]={version:o,incarnation:null,synced:!0,hash:null});if(e&&typeof e=="object")for(let[r,o]of Object.entries(e))!o||typeof o!="object"||!Number.isSafeInteger(o.version)||o.version<0||o.incarnation!=null&&typeof o.incarnation!="string"||(n[r]={version:o.version,incarnation:o.incarnation??null,synced:o.synced===!0,hash:typeof o.hash=="string"?o.hash:null});return n}function se(e,t){try{let n={names:Object.fromEntries(t.remoteNameByTag),bundles:Object.fromEntries(t.remoteBundleByTag),bundleNames:Object.fromEntries(t.remoteBundleNameByIntegrity),baselines:Object.fromEntries(t.baselines),localVersions:Object.fromEntries([...t.baselines].filter(([,r])=>r.synced).map(([r,o])=>[r,o.version]))};localStorage.setItem(Gn(e),JSON.stringify(n))}catch(n){console.warn(`objstore-presence: cache persist failed for ${e}:`,n)}}function mo(e){try{localStorage.removeItem(Gn(e))}catch{}}var Fn=null;function Rs(e){return Fn||(Fn=$r({serverUrl:"",httpOrigin:e,transport:Bt()})),Fn}var ft=new Set,dt=new Set;function ce(){for(let e of Hn)try{e()}catch{}}function Ps(e){if(e==null)return"";if(e instanceof Error&&e.message)return`: ${e.message}`;if(typeof e=="string"&&e)return`: ${e}`;if(typeof e=="object"&&typeof e.message=="string"&&e.message)return`: ${e.message}`;try{return`: ${String(e)}`}catch{return""}}var wo=256;function ko(e){return typeof e!="string"?"":e.length<=wo?e:e.slice(0,wo)}function Bs(e){try{let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/",t.search="",t.hash="",t.origin}catch{return null}}function Je(e){if(M.has(e))return;let t=Se().find(i=>i.id===e);if(!t)return;let n=Be.ensureSubscription(e);if(!n)return;let r={workspaceId:e,session:null,keys:null,remoteTags:new Set,fileTags:new Map,bundleTags:new Map,remoteNameByTag:new Map,remoteBundleByTag:new Map,remoteBundleNameByIntegrity:new Map,remoteMeta:new Map,baselines:new Map,localChanged:new Set,selfWrites:new Map,selfWriteNotices:new Map,tagLocks:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};M.set(e,r),r.ready=(async()=>{if(r.keys=await an(t.privateKey,t.id),r.disposed)return;let i=new Map;for(let d of t.reports??[]){let p=await ue(r.keys.tagKey,d);r.fileTags.set(d,p),i.set(p,d)}if(r.disposed)return;let s=new Map;for(let d of t.bundles??[]){let p=await ve(r.keys.tagKey,d);r.bundleTags.set(d,p),s.set(p,d)}if(r.disposed)return;try{let d=await ht();if(r.disposed)return;for(let p of d)r.bundleTags.has(p.integrity)&&r.remoteBundleNameByIntegrity.set(p.integrity,p.name)}catch(d){console.warn(`objstore-presence: listBundles failed during ${e} open:`,d)}ce();let a=Be.getServerUrl();if(!a)return;let l=Bs(a);if(l)try{let p=await Rs(l).openWorkspace(r.keys,n);if(r.disposed){try{p.close()}catch{}return}r.session=p,o();let y=await p.list();if(r.disposed)return;for(let h of y)r.remoteTags.add(h.resourceTag),bo(r,h.resourceTag,h.version,h.incarnation);let b=As(e),A=!1;if(b)for(let[h,x]of Object.entries(b.baselines))(r.remoteTags.has(h)||i.has(h))&&r.baselines.set(h,x);for(let h of r.remoteTags){let x=i.get(h);x!==void 0&&!r.remoteNameByTag.has(h)&&(r.remoteNameByTag.set(h,x),A=!0);let k=s.get(h);if(k!==void 0&&!r.remoteBundleByTag.has(h)&&(r.remoteBundleByTag.set(h,k),A=!0),b){let E=b.names[h];typeof E=="string"&&!r.remoteNameByTag.has(h)&&!r.remoteBundleByTag.has(h)&&(r.remoteNameByTag.set(h,E),r.fileTags.set(E,h),A=!0);let B=b.bundles[h];if(typeof B=="string"&&!r.remoteBundleByTag.has(h)&&!r.remoteNameByTag.has(h)){r.remoteBundleByTag.set(h,B),r.bundleTags.set(B,h);let Q=b.bundleNames[B];typeof Q=="string"&&!r.remoteBundleNameByIntegrity.has(B)&&r.remoteBundleNameByIntegrity.set(B,Q),A=!0}}}(A||b)&&se(e,r),ce(),pt(r);for(let h of r.remoteTags)Oe(r.baselines.get(h),r.remoteMeta.get(h))&&yt(r,h).catch(()=>{});zs(r).catch(()=>{})}catch(d){r.err=d}})();function o(){let i=r.session;i.onPut(({resourceTag:s,version:a,incarnation:l})=>{let d=r.remoteMeta.get(s),p=r.remoteTags.has(s)&&d!==void 0&&(d.incarnation!==l||a>d.version);if(r.remoteTags.add(s),bo(r,s,a,l),ce(),p){yt(r,s).catch(()=>{});return}pt(r)}),i.onDeleted(({resourceTag:s})=>{r.remoteTags.delete(s),r.remoteMeta.delete(s);let a=r.remoteNameByTag.get(s);r.remoteNameByTag.delete(s);let l=Se().find(b=>b.id===e),d=l?.reports??[],p=l?.bundles??[];a&&!d.includes(a)&&r.fileTags.delete(a);let y=r.remoteBundleByTag.get(s);r.remoteBundleByTag.delete(s),y&&(r.remoteBundleNameByIntegrity.delete(y),p.includes(y)||r.bundleTags.delete(y)),se(e,r),ce()})}r.ready.catch(()=>{})}function gt(e){let t=M.get(e);if(t){t.disposed=!0;try{t.session?.close()}catch{}if(t.keys){try{t.keys.contentKey.fill(0)}catch{}try{t.keys.tagKey.fill(0)}catch{}t.keys=null}M.delete(e),ce()}}Et(e=>{Se=e.listWorkspaces,zt=e.addReportToWorkspace,Wn=e.addBundleToWorkspace,Vt=e.analyzeContent,qt=e.setCount,Ye=e.gunzipBytes,ht=e.listBundles,Gt=e.listFiles,Vn=e.readBundle,mt=e.readFileBytes,qn=e.saveBundle,So=e.saveFileBytes,e.onFileMutated?.((t,n)=>{for(let r of M.values()){let o=r.fileTags.get(t);if(o!==void 0){if(n==="delete"){r.localChanged.delete(o)&&ce();continue}if(r.selfWrites.has(t)){r.selfWriteNotices.set(t,(r.selfWriteNotices.get(t)??0)+1);continue}De.has(t)||xo(r,o,t)}}}),e.onReportMembershipChanged(t=>{M.has(t)||Je(t);let n=M.get(t);if(!n)return;let r=Se().find(o=>o.id===t);if(r)for(let o of r.reports??[])n.fileTags.has(o)||Cs(t,o).catch(()=>{})}),e.onBundleMembershipChanged(t=>{M.has(t)||Je(t);let n=M.get(t);if(!n)return;let r=Se().find(o=>o.id===t);if(r)for(let o of r.bundles??[])n.bundleTags.has(o)||Ms(t,o).catch(()=>{})}),e.onWorkspaceDeleted(t=>{gt(t),mo(t)}),e.onWorkspacePrivateKeyChanged(t=>{M.has(t)&&(gt(t),mo(t),Je(t))})});function Os(){return Array.from(M.keys())}function js(e,t){let n=M.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function Cs(e,t){let n=M.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await ue(n.keys.tagKey,t)),n.disposed||ce()))}function Ls(e,t){let n=M.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function Ms(e,t){let n=M.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await ve(n.keys.tagKey,t)),n.disposed||ce()))}function Us(e){return Hn.add(e),()=>Hn.delete(e)}function Ns(e){return ft.add(e),()=>ft.delete(e)}function Is(e){return dt.add(e),()=>dt.delete(e)}function Ks(e){De.set(e,(De.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let n=De.get(e)-1;if(n>0){De.set(e,n);return}De.delete(e);for(let r of M.values()){let o=r.fileTags.get(e);o!==void 0&&Xn(r,o,e).catch(()=>{})}}}function Ds(e){let t=M.get(e);return t?(Se().find(r=>r.id===e)?.reports??[]).filter(r=>{let o=t.fileTags.get(r);return o!==void 0&&zn(t,o)}):[]}function Fs(e){let t=M.get(e);return t?t.remoteTags.size:0}async function $s(e){let t=M.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await pt(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function Ws(e){let t=M.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await pt(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function Hs(e,t){let n=M.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}function bo(e,t,n,r){let o=e.remoteMeta.get(t);o&&o.incarnation===r&&o.version>=n||e.remoteMeta.set(t,{version:n,incarnation:r})}function Oe(e,t){return!e||!t?!1:e.incarnation===null?t.version!==e.version:e.incarnation!==t.incarnation||t.version>e.version}function _s(e,t){let n=e.baselines.get(t);return!!n&&n.incarnation!==null}function _n(e,t){return!!e&&e.synced&&e.incarnation===t.incarnation&&e.version===t.version}function ye(e,t,n,r,o=null){let i=zn(e,t);e.baselines.set(t,{version:n.version,incarnation:n.incarnation,synced:r,hash:r?o:null}),e.localChanged.delete(t),!e.disposed&&zn(e,t)!==i&&ce()}function To(e,t){return!!e&&e.synced&&!!e.hash&&!!t&&e.hash!==t}function Jn(e,t){return!!e&&!e.synced||To(e,t)}function zn(e,t){if(!e.remoteTags.has(t))return!1;if(e.localChanged.has(t))return!0;let n=e.baselines.get(t);return!!n&&!n.synced}async function Yn(e,t,n){e.selfWrites.set(t,(e.selfWrites.get(t)??0)+1);try{await So(t,n),e.selfWriteNotices.set(t,(e.selfWriteNotices.get(t)??0)-1)}finally{let r=e.selfWrites.get(t)-1;if(r>0)e.selfWrites.set(t,r);else{e.selfWrites.delete(t);let o=e.selfWriteNotices.get(t)??0;e.selfWriteNotices.delete(t);let i=e.fileTags.get(t);o>0&&i!==void 0&&!e.disposed&&xo(e,i,t)}}}function xo(e,t,n){Ts.setTimeout(()=>Xn(e,t,n).catch(()=>{}),ks)}function Xn(e,t,n){return je(e,t,async()=>{if(De.has(n))return;let r=e.baselines.get(t);if(e.disposed||!r?.synced||!r.hash)return;let o;try{o=await mt(n)}catch{return}let i=await me(o);if(e.disposed||e.baselines.get(t)!==r)return;let s=r.hash!==i;s!==e.localChanged.has(t)&&(s?e.localChanged.add(t):e.localChanged.delete(t),ce())})}async function zs(e){let t=Se().find(n=>n.id===e.workspaceId);for(let n of t?.reports??[]){if(e.disposed)return;let r=e.fileTags.get(n);if(!(r===void 0||!e.baselines.get(r)?.hash))try{await Xn(e,r,n)}catch{}}}function je(e,t,n){let r=(e.tagLocks.get(t)??Promise.resolve()).then(()=>n()),o=r.catch(()=>{}).finally(()=>{e.tagLocks.get(t)===o&&e.tagLocks.delete(t)});return e.tagLocks.set(t,o),r}function vo(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}async function Jt(e,t){let n;try{n=await mt(e)}catch{return{same:null,hash:null}}let r=await me(n);if(vo(n,t))return{same:!0,hash:r};try{let[o,i]=await Promise.all([Ye(n),Ye(t)]);return{same:vo(o,i),hash:r}}catch{return{same:!1,hash:r}}}async function Zn(e,t,n,r){let o;try{o=Le(await Ye(n.content))}catch(s){throw new Error(`gunzip/decode of "${n.fileName}" failed (likely forged peer payload)`,{cause:s})}if(!r())return!1;let i=Vt(o);if(!i.recognized)throw new Error(`cloud copy of "${n.fileName}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);if(await Yn(e,n.fileName,n.content),e.disposed)return!1;qt(n.fileName,i.count,i.source),ye(e,t,n,!0,await me(n.content)),se(e.workspaceId,e);for(let s of ft)try{s(e.workspaceId,n.fileName)}catch{}return!0}async function Ao(e,t,n,r,{keepLocalChanges:o=!0}={}){let{same:i,hash:s}=await Jt(n.fileName,n.content);return r()?i?(ye(e,t,n,!0,s),se(e.workspaceId,e),!1):o&&i===!1&&Jn(e.baselines.get(t),s)?(ye(e,t,n,!1),se(e.workspaceId,e),!1):await Zn(e,t,n,r):!1}async function pt(e){if(!e.session||e.disposed)return;let t=Se().find(s=>s.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),o=new Set;try{o=new Set(await Gt())}catch(s){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,s)}if(e.disposed||!e.session)return;let i=[];for(let s of e.remoteTags){let a=e.remoteNameByTag.get(s);if(a!==void 0&&n.has(a)&&o.has(a)&&_s(e,s))continue;if(e.remoteBundleByTag.has(s)){let d=e.remoteBundleByTag.get(s);if(e.remoteBundleNameByIntegrity.has(d)&&r.has(d))continue}let l=e.inFlight.get(s);if(!l){let d=e.remoteMeta.get(s),p=()=>e.disposed||!e.remoteTags.has(s)||e.remoteMeta.get(s)===d?null:pt(e).then(()=>null,()=>null);l=e.session.fetchByTag(s).then(async y=>(e.inFlight.delete(s),e.disposed?null:y?e.remoteTags.has(s)?y.kind==="bundle"?(e.remoteBundleByTag.set(s,y.integrity),e.bundleTags.set(y.integrity,s),y.name&&e.remoteBundleNameByIntegrity.set(y.integrity,y.name),await Js(e,s,y.integrity,y.name,y.content),null):(e.remoteNameByTag.set(s,y.fileName),e.fileTags.set(y.fileName,s),await Vs(e,s,y),null):null:p()),()=>(e.inFlight.delete(s),p())),e.inFlight.set(s,l)}i.push(l)}i.length!==0&&(await Promise.all(i),!e.disposed&&(se(e.workspaceId,e),ce()))}async function Vs(e,t,n){e.disposed||!e.remoteTags.has(t)||await je(e,t,async()=>{await qs(e,t,n),!e.disposed&&e.remoteTags.has(t)&&Oe(e.baselines.get(t),e.remoteMeta.get(t))&&yt(e,t).catch(()=>{})})}async function qs(e,t,n){let r=n.fileName,o=n.content;if(e.disposed||!e.remoteTags.has(t))return;let i=Se().find(p=>p.id===e.workspaceId),s=!!(i&&Array.isArray(i.reports)&&i.reports.includes(r)),a;try{let p=await Gt();if(e.disposed||!e.remoteTags.has(t))return;a=p.includes(r)}catch(p){console.warn(`auto-download: listFiles failed before saving "${r}":`,p);return}if(a){if(s){await Gs(e,t,n);return}if(e.disposed||!e.remoteTags.has(t))return;try{await zt(r,e.workspaceId)}catch(p){console.warn(`auto-download: attaching local "${r}" to workspace "${e.workspaceId}" failed:`,p);return}if(e.disposed)return;if(!e.baselines.has(t)){let{same:p,hash:y}=await Jt(r,o);if(e.disposed)return;p!==null&&(ye(e,t,n,p,y),se(e.workspaceId,e))}for(let p of ft)try{p(e.workspaceId,r)}catch{}return}let l;try{l=Le(await Ye(o))}catch(p){console.warn(`auto-download: gunzip/decode of "${r}" failed (likely forged peer payload):`,p);return}if(e.disposed||!e.remoteTags.has(t))return;let d=Vt(l);if(d.recognized){try{if(await Yn(e,r,o),e.disposed||!e.remoteTags.has(t)||(qt(r,d.count,d.source),ye(e,t,n,!0,await me(o)),!e.remoteTags.has(t)))return;await zt(r,e.workspaceId),se(e.workspaceId,e)}catch(p){console.warn(`auto-download: persisting "${r}" to workspace "${e.workspaceId}" failed:`,p);return}if(!e.disposed)for(let p of ft)try{p(e.workspaceId,r)}catch{}}}async function Gs(e,t,n){let r=()=>!e.disposed&&e.remoteTags.has(t),{same:o,hash:i}=await Jt(n.fileName,n.content);if(!r()||o===null)return;let s=e.baselines.get(t);if(o){(!_n(s,n)||s.hash!==i)&&(ye(e,t,n,!0,i),se(e.workspaceId,e));return}if(Oe(s,n)&&!Jn(s,i)){try{await Zn(e,t,n,r)}catch(a){console.warn(`auto-download: ${a.message}`,a)}return}if(!s||s.incarnation===null||Oe(s,n)){ye(e,t,n,!1),se(e.workspaceId,e);return}To(s,i)&&!e.localChanged.has(t)&&(e.localChanged.add(t),ce())}async function yt(e,t,n=0){e.disposed||!e.remoteTags.has(t)||await je(e,t,async()=>{let r=()=>!e.disposed&&e.remoteTags.has(t);if(!r())return;let o=e.baselines.get(t);if(o?.synced&&!Oe(o,e.remoteMeta.get(t)))return;let i;try{i=await e.session.fetchByTag(t)}catch(s){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,s);return}if(!(!i||!r())&&i.kind!=="bundle"){e.remoteNameByTag.set(t,i.fileName),e.fileTags.set(i.fileName,t);try{await Ao(e,t,i,r)}catch(s){console.warn(`replace-refetch: ${s.message}`,s);return}n<2&&r()&&Oe(e.baselines.get(t),e.remoteMeta.get(t))&&yt(e,t,n+1).catch(()=>{})}})}async function Js(e,t,n,r,o){if(e.disposed||!e.remoteTags.has(t))return;let i;try{i=await ht()}catch(d){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,d);return}if(e.disposed||!e.remoteTags.has(t))return;if(i.some(d=>d.integrity===n)){try{await Wn(n,e.workspaceId)}catch(p){console.warn("auto-download: attach pre-existing bundle failed:",p);return}if(e.disposed)return;let d=i.find(p=>p.integrity===n)?.name??"";for(let p of dt)try{p(e.workspaceId,n,d)}catch{}return}let s=await Dn(o);if(e.disposed||!e.remoteTags.has(t))return;if(s!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${s}) \u2014 refusing to save`);return}let a=r&&r.length>0?r:`bundle-${n.slice(7,15)}`,l=ko(a);try{if(await qn(l,o),e.disposed||!e.remoteTags.has(t))return;await Wn(n,e.workspaceId)}catch(d){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,d);return}if(!e.disposed)for(let d of dt)try{d(e.workspaceId,n,l)}catch{}}async function Ee(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw new Error(`Objstore session is not connected${Ps(e.err)}`)}async function Yt(e){let t=await e(null);return!t.ok&&t.reason==="conflict"&&t.current&&(t=await e(t.current)),t}async function Ys(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);return await Ee(n),n.session.fetch(t)}async function Xs(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);if(await Ee(n),!n.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let r=n.fileTags.get(t)??await ue(n.keys.tagKey,t),o=await je(n,r,async()=>{let i=await n.session.fetch(t);if(!i)return{ok:!1,reason:"not found in remote"};let s;try{s=Le(await Ye(i.content))}catch{return{ok:!1,reason:"remote payload is not gzipped UTF-8"}}let a=Vt(s);return a.recognized?(await Yn(n,t,i.content),qt(t,a.count,a.source),n.disposed||(n.fileTags.set(t,r),ye(n,r,i,!0,await me(i.content)),se(e,n)),{ok:!0}):{ok:!1,reason:"remote payload is not a recognized report format"}});return o.ok&&await zt(t,e),o}async function Eo(e,t,n){let r=M.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let o=r.fileTags.get(t)??await ue(r.keys.tagKey,t);return await je(r,o,async()=>{let i=await Yt(s=>r.session.put({fileName:t,content:n,prev:s}));if(i.ok)try{await Zs(r,t,o,i.meta,n)}catch{}return i})}async function Zs(e,t,n,r,o){let i=await me(o);e.disposed||(e.fileTags.set(t,n),ye(e,n,r,!0,i),se(e.workspaceId,e),Oe(e.baselines.get(n),e.remoteMeta.get(n))&&yt(e,n).catch(()=>{}))}async function Qs(e,t){let n=!1;M.has(e)||(Je(e),n=!0);try{let r=M.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.fileTags.has(t)||r.fileTags.set(t,await ue(r.keys.tagKey,t));let o=r.fileTags.get(t);return await je(r,o,async()=>{let i=await Yt(s=>r.session.delete(t,s));return i.ok&&(r.remoteTags.delete(o),r.remoteNameByTag.delete(o),r.remoteMeta.delete(o),r.baselines.delete(o),ce()),i})}finally{n&>(e)}}async function Ro(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Ee(n);let r=await Vn(t),s=(await ht()).find(a=>a.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await Yt(a=>n.session.putBundle({integrity:t,name:s,content:r,prev:a}))}async function ea(e,t){let n=M.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Ee(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:"not-found"};if(await Dn(r.content)!==t)return{ok:!1,reason:"integrity-mismatch"};let i=r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`,s=ko(i);await qn(s,r.content);for(let a of dt)try{a(e,t,s)}catch{}return{ok:!0,integrity:t,name:s}}async function ta(e,t){let n=!1;M.has(e)||(Je(e),n=!0);try{let r=M.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.bundleTags.has(t)||r.bundleTags.set(t,await ve(r.keys.tagKey,t));let o=r.bundleTags.get(t),i=await Yt(s=>r.session.deleteBundle(t,s));return i.ok&&(r.remoteTags.delete(o),r.remoteBundleByTag.delete(o),ce()),i}finally{n&>(e)}}async function na(e,{onList:t,onItem:n}={}){let r=M.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);if(await Ee(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let o=r.keys.tagKey,i=new Set,s=r.session.onDeleted(a=>{i.add(a.resourceTag)});try{let a=await ra(r,e),l=await pa(),d=await ya(),p=new Map;for(let h of l)p.set(await ue(o,h),h);let y=new Map;for(let h of d)y.set(await ve(o,h.integrity),h.integrity);let b=a.map(h=>{let x=p.get(h.resourceTag),k=y.get(h.resourceTag);return{resourceTag:h.resourceTag,kind:fa(r,h.resourceTag,x,k),label:da(r,h.resourceTag,x,k),contentLength:h.contentLength,reportName:x,bundleIntegrity:k,identifier:x??k,status:"checking"}});if(typeof t=="function")try{t(b.map($n))}catch{}let A={good:0,updated:0,uploaded:0,differs:0,reuploaded:0,failed:0,"check-failed":0,missing:0};for(let h of b)if(h.status=await ia(r,e,h,i),A[h.status]+=1,typeof n=="function")try{n($n(h))}catch{}return{items:b.map($n),counts:A}}finally{s()}}async function ra(e,t){try{let n=Be.ensureSubscription(t);if(n){let r=await ga(n.resources,1e4);if(Array.isArray(r))return oa(r)}}catch(n){console.warn(`objstore-recovery: fresh DB listing for ${t} failed; using cached inventory:`,n)}try{return(await e.session.list()).map(n=>({resourceTag:n.resourceTag,contentLength:n.contentLength}))}catch{return[]}}function oa(e){let t=[];for(let n of e)!n||typeof n!="object"||typeof n.resourceTag=="string"&&t.push({resourceTag:n.resourceTag,contentLength:Number.isSafeInteger(n.contentLength)?n.contentLength:null});return t}async function ia(e,t,n,r){let o;try{o=await e.session.fetchByTag(n.resourceTag)}catch(i){return n.detail=`verification fetch failed: ${i?.message??String(i)}`,"check-failed"}return o?o.kind==="report"?(n.kind="report",n.label=o.fileName,n.identifier=o.fileName,await sa(e,t,n,o,r)):(n.kind="bundle",n.label=o.name??n.label,n.bundleIntegrity=o.integrity,n.identifier=o.integrity,"good"):r.has(n.resourceTag)?"missing":n.reportName!==void 0?await la(t,n,r):n.bundleIntegrity!==void 0?await ua(t,n,r):"missing"}async function sa(e,t,n,r,o){let i=Se().find(l=>l.id===t);if(!i||!Array.isArray(i.reports)||!i.reports.includes(r.fileName))return"good";let s=n.resourceTag,a=()=>!e.disposed&&!o.has(s);return await je(e,s,async()=>{let l=r;if(aa(e,s,l)){let b;try{b=await e.session.fetchByTag(s)}catch(A){return n.detail=`verification fetch failed: ${A?.message??String(A)}`,"check-failed"}if(!b||!a())return"missing";if(b.kind!=="report")return"good";l=b}let{same:d,hash:p}=await Jt(l.fileName,l.content);if(!a())return"missing";let y=e.baselines.get(s);if(d)return(!_n(y,l)||y.hash!==p)&&(ye(e,s,l,!0,p),se(t,e)),"good";if(d===!1&&_n(y,l)){let b=await Po(e,s,l.fileName,l,a);return n.detail=b.detail,b.status}if(d===null||Oe(y,l)&&!Jn(y,p))try{return await Zn(e,s,l,a)?"updated":"missing"}catch(b){return n.detail=`updating your copy failed: ${b?.message??String(b)}`,console.warn(`objstore-recovery: updating the local copy of "${l.fileName}" failed:`,b),"failed"}return ye(e,s,l,!1),se(t,e),n.compared={version:l.version,incarnation:l.incarnation},"differs"})}function aa(e,t,n){return[e.baselines.get(t),e.remoteMeta.get(t)].some(r=>r&&r.incarnation===n.incarnation&&r.version>n.version)}async function Po(e,t,n,r,o){try{let i=await mt(n);if(!o())return{status:"missing"};let s=await e.session.put({fileName:n,content:i,prev:{version:r.version,incarnation:r.incarnation}});return s.ok?(ye(e,t,s.meta,!0,await me(i)),se(e.workspaceId,e),{status:"uploaded"}):{status:"failed",detail:s.reason==="conflict"?"the cloud copy changed since it was compared \u2014 re-check again":`upload rejected: ${s.reason??"unknown"}`}}catch(i){return console.warn(`objstore-recovery: uploading the local copy of "${n}" failed:`,i),{status:"failed",detail:`upload error: ${i?.message??String(i)}`}}}async function ca(e,t,n,r){if(n!=="cloud"&&n!=="local")throw new TypeError(`resolveReportDifference: keep must be 'cloud' or 'local', got ${String(n)}`);if(n==="local"&&(!r||!Number.isSafeInteger(r.version)||typeof r.incarnation!="string"))throw new TypeError("resolveReportDifference: keeping the local copy needs the compared cloud state ({ version, incarnation })");let o=M.get(e);if(!o)throw new Error(`Workspace ${e} is not open`);if(await Ee(o),!o.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let i=o.fileTags.get(t)??await ue(o.keys.tagKey,t),s=()=>!o.disposed;return await je(o,i,async()=>{if(n==="local")return await Po(o,i,t,r,s);try{let a=await o.session.fetch(t);if(!a)return{status:"missing",detail:"the report is no longer in the cloud"};let l={fileName:t,content:a.content,version:a.version,incarnation:a.incarnation};return{status:await Ao(o,i,l,s,{keepLocalChanges:!1})?"updated":"good"}}catch(a){return console.warn(`objstore-recovery: replacing the local copy of "${t}" with the cloud copy failed:`,a),{status:"failed",detail:`updating your copy failed: ${a?.message??String(a)}`}}})}async function la(e,t,n){let r;try{r=await mt(t.reportName)}catch{return"missing"}if(t.contentLength==null||Rr(t.reportName,r.length)!==t.contentLength||n.has(t.resourceTag))return"missing";try{let o=await Eo(e,t.reportName,r);return o&&o.ok?"reuploaded":(t.detail=`re-upload rejected: ${o?.reason??"unknown"}`,"failed")}catch(o){return t.detail=`re-upload error: ${o?.message??String(o)}`,console.warn(`objstore-recovery: re-upload of "${t.reportName}" failed:`,o),"failed"}}async function ua(e,t,n){try{await Vn(t.bundleIntegrity)}catch{return"missing"}if(n.has(t.resourceTag))return"missing";try{let r=await Ro(e,t.bundleIntegrity);return r&&r.ok?"reuploaded":(t.detail=`re-upload rejected: ${r?.reason??"unknown"}`,"failed")}catch(r){return t.detail=`re-upload error: ${r?.message??String(r)}`,console.warn(`objstore-recovery: bundle re-upload of "${t.bundleIntegrity}" failed:`,r),"failed"}}function fa(e,t,n,r){return n!==void 0?"report":r!==void 0||e.remoteBundleByTag.has(t)?"bundle":e.remoteNameByTag.has(t)?"report":"unknown"}function da(e,t,n,r){if(n!==void 0)return n;if(r!==void 0)return e.remoteBundleNameByIntegrity.get(r)??r;let o=e.remoteNameByTag.get(t);if(o!==void 0)return o;let i=e.remoteBundleByTag.get(t);return i!==void 0?e.remoteBundleNameByIntegrity.get(i)??i:`${t.slice(0,10)}\u2026`}function $n(e){let t={resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier,detail:e.detail};return e.compared&&(t.compared=e.compared),t}function ga(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let o=new Promise((i,s)=>{n=setTimeout(()=>s(new Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,o]).finally(()=>clearTimeout(n))}async function pa(){try{return await Gt()}catch(e){return console.warn("objstore-recovery: listFiles failed; treating as no local reports:",e),[]}}async function ya(){try{return await ht()}catch(e){return console.warn("objstore-recovery: listBundles failed; treating as no local bundles:",e),[]}}export{gt as closeWorkspace,ta as deleteBundleFromRemote,Qs as deleteFromRemote,Ds as differingReports,Ws as discoverRemoteBundleIntegrities,$s as discoverRemoteFileNames,Xs as downloadFileFromRemote,ea as fetchBundleFromRemote,Ys as fetchFile,Ks as holdLocalChangeChecks,Ri as installSyncHost,Ls as isBundleInRemote,js as isInRemote,Ns as onAutoDownloaded,Is as onBundleAutoDownloaded,Us as onChange,Je as openWorkspace,Os as openWorkspaceIds,Ro as putBundleToRemote,Eo as putFile,na as recheckRemoteStorage,Hs as remoteBundleName,Fs as remoteCount,ca as resolveReportDifference,Ss as setAuthenticationResolver,vs as setHydrationConflictResolver,bs as setRedraw,Be as triageSync};
|
|
18
18
|
/*! Bundled license information:
|
|
19
19
|
|
|
20
20
|
@noble/ciphers/utils.js:
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self'; base-uri 'none'; form-action 'none'"><meta name="viewport" content="width=device-width,initial-scale=1"><title>GitHub authorized — DeepView</title></head>
|
|
3
|
+
<body><p>GitHub is authorized. You can close this tab and return to DeepView to create your issue.</p><script type="module" src="./github-issue-authorized.js"></script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
window.close();
|