@preventive/triage 1.0.0-alpha.1 → 1.0.0-alpha.3
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/out/client-sync.js +11 -11
- package/out/graph.js +3 -3
- package/out/index.html +3 -15
- package/out/view.css +1 -1
- package/out/view.js +51 -48
- package/package.json +11 -4
- package/server/bus-receiver.ts +7 -7
- package/server/cli.js +22 -0
- package/server/config.ts +4 -4
- package/server/db-neon.ts +29 -23
- package/server/db-revision-sql.ts +6 -9
- package/server/db.ts +95 -134
- package/server/hub.ts +4 -5
- package/server/index.ts +42 -27
- package/server/lifecycle.ts +6 -1
- package/server/objstore/blob-fs.ts +4 -6
- package/server/objstore/blob-vercel.ts +66 -33
- package/server/objstore/blob.ts +16 -8
- package/server/objstore/handlers.ts +11 -13
- package/server/objstore/init.ts +18 -9
- package/server/objstore/rest.ts +60 -68
- package/server/objstore/store-neon.ts +16 -16
- package/server/objstore/store.ts +92 -112
- package/server/objstore/tokens.ts +9 -12
- package/server/peer.ts +7 -9
- package/server/pubsub.ts +17 -27
- package/server/sign.ts +8 -10
- package/server/sse-server.ts +10 -12
- package/server/sse-session.ts +2 -8
- package/server/static.ts +8 -12
- package/server/sync-handlers.ts +32 -39
- package/server/ws-server.ts +9 -14
- package/strip-types-loader.js +94 -0
package/out/client-sync.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
function xr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}function qe(e){if(typeof e!="boolean")throw new TypeError(`boolean expected, not ${e}`)}function ke(e){if(typeof e!="number")throw new TypeError("number expected, got "+typeof e);if(!Number.isSafeInteger(e)||e<0)throw new RangeError("positive integer expected, got "+e)}function q(e,t,n=""){let r=xr(e),o=e?.length,s=t!==void 0;if(!r||s&&o!==t){let i=n&&`"${n}" `,a=s?` of length ${t}`:"",l=r?`length=${o}`:`type=${typeof e}`,f=i+"expected Uint8Array"+a+", got "+l;throw r?new RangeError(f):new TypeError(f)}return e}function yt(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function an(e,t,n=!1){q(e,void 0,"output");let r=t.outputLen;if(e.length<r)throw new RangeError("digestInto() expects output buffer of length at least "+r);if(n&&!Te(e))throw new Error("invalid output, must be aligned")}function ae(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function oe(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Ar(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var he=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68,Er=e=>e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255;var Br=e=>{for(let t=0;t<e.length;t++)e[t]=Er(e[t]);return e},ue=he?e=>e:Br;function cn(e,t){if(t==null||typeof t!="object")throw new Error("options must be defined");return Object.assign(e,t)}function ln(e,t){if(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 un(e,t,n){let r=t,o=n||(()=>[]),s=(a,l)=>r(l,...o(a)).update(a).digest(),i=r(new Uint8Array(e),...o(new Uint8Array(0)));return s.outputLen=i.outputLen,s.blockLen=i.blockLen,s.create=(a,...l)=>r(a,...l),s}var fn=(e,t)=>{function n(r,...o){if(q(r,void 0,"key"),e.nonceLength!==void 0){let y=o[0];q(y,e.varSizeNonce?void 0:e.nonceLength,"nonce")}let s=e.tagLength;s&&o[1]!==void 0&&q(o[1],void 0,"AAD");let i=t(r,...o),a=(y,b)=>{if(b!==void 0){if(y!==2)throw new Error("cipher output not supported");q(b,void 0,"output")}},l=!1;return{encrypt(y,b){if(l)throw new Error("cannot encrypt() twice with same key + nonce");return l=!0,q(y),a(i.encrypt.length,b),i.encrypt(y,b)},decrypt(y,b){if(q(y),s&&y.length<s)throw new Error('"ciphertext" expected length bigger than tagLength='+s);return a(i.decrypt.length,b),i.decrypt(y,b)}}}return Object.assign(n,e),n};function Ue(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(q(t,void 0,"output"),t.length!==e)throw new Error('"output" expected Uint8Array of length '+e+", got: "+t.length);if(n&&!Te(t))throw new Error("invalid output, must be aligned");return t}function dn(e,t,n){ke(e),ke(t),qe(n);let r=new Uint8Array(16),o=Ar(r);return o.setBigUint64(0,BigInt(t),n),o.setBigUint64(8,BigInt(e),n),r}function Te(e){return e.byteOffset%4===0}function xe(e){return Uint8Array.from(q(e))}var gn=e=>Uint8Array.from(e.split(""),t=>t.charCodeAt(0)),Pr=ue(ae(gn("expand 16-byte k"))),Rr=ue(ae(gn("expand 32-byte k")));function j(e,t){return e<<t|e>>>32-t}var Le=64,Cr=16,ht=2**32-1,pn=Uint32Array.of();function Or(e,t,n,r,o,s,i,a){let l=o.length,f=new Uint8Array(Le),y=ae(f),b=he&&Te(o)&&Te(s),T=b?ae(o):pn,B=b?ae(s):pn;if(!he){for(let m=0;m<l;i++){if(e(t,n,r,y,i,a),ue(y),i>=ht)throw new Error("arx: counter overflow");let S=Math.min(Le,l-m);for(let k=0,R;k<S;k++)R=m+k,s[R]=o[R]^f[k];m+=S}return}for(let m=0;m<l;i++){if(e(t,n,r,y,i,a),i>=ht)throw new Error("arx: counter overflow");let S=Math.min(Le,l-m);if(b&&S===Le){let k=m/4;if(m%4!==0)throw new Error("arx: invalid block position");for(let R=0,D;R<Cr;R++)D=k+R,B[D]=T[D]^y[R];m+=Le;continue}for(let k=0,R;k<S;k++)R=m+k,s[R]=o[R]^f[k];m+=S}}function yn(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:o,counterRight:s,rounds:i}=cn({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!="function")throw new Error("core must be a function");return ke(o),ke(i),qe(s),qe(n),(a,l,f,y,b=0)=>{q(a,void 0,"key"),q(l,void 0,"nonce"),q(f,void 0,"data");let T=f.length;if(y=Ue(T,y,!1),ke(b),b<0||b>=ht)throw new Error("arx: counter overflow");let B=[],m=a.length,S,k;if(m===32)B.push(S=xe(a)),k=Rr;else if(m===16&&n)S=new Uint8Array(32),S.set(a),S.set(a,16),k=Pr,B.push(S);else throw q(a,32,"arx key"),new Error("invalid key size");(!he||!Te(l))&&B.push(l=xe(l));let R=ae(S);if(r){if(l.length!==24)throw new Error("arx: extended nonce must be 24 bytes");let J=l.subarray(0,16);if(he)r(k,R,ae(J),R);else{let te=ue(Uint32Array.from(k));r(te,R,ae(J),R),oe(te),ue(R)}l=l.subarray(16)}else he||ue(R);let D=16-o;if(D!==l.length)throw new Error(`arx: nonce must be ${D} or 16 bytes`);if(D!==12){let J=new Uint8Array(12);J.set(l,s?0:12-l.length),l=J,B.push(l)}let Z=ue(ae(l));try{return Or(e,k,R,Z,f,y,b,i),y}finally{oe(...B)}}}function Q(e,t){return e[t++]&255|(e[t++]&255)<<8}var mt=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=xe(q(t,32,"key"));let n=Q(t,0),r=Q(t,2),o=Q(t,4),s=Q(t,6),i=Q(t,8),a=Q(t,10),l=Q(t,12),f=Q(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|s<<9)&8191,this.r[4]=(s>>>4|i<<12)&255,this.r[5]=i>>>1&8190,this.r[6]=(i>>>14|a<<2)&8191,this.r[7]=(a>>>11|l<<5)&8065,this.r[8]=(l>>>8|f<<8)&8191,this.r[9]=f>>>5&127;for(let y=0;y<8;y++)this.pad[y]=Q(t,16+2*y)}process(t,n,r=!1){let o=r?0:2048,{h:s,r:i}=this,a=i[0],l=i[1],f=i[2],y=i[3],b=i[4],T=i[5],B=i[6],m=i[7],S=i[8],k=i[9],R=Q(t,n+0),D=Q(t,n+2),Z=Q(t,n+4),J=Q(t,n+6),te=Q(t,n+8),_=Q(t,n+10),V=Q(t,n+12),W=Q(t,n+14),U=s[0]+(R&8191),N=s[1]+((R>>>13|D<<3)&8191),I=s[2]+((D>>>10|Z<<6)&8191),L=s[3]+((Z>>>7|J<<9)&8191),K=s[4]+((J>>>4|te<<12)&8191),M=s[5]+(te>>>1&8191),u=s[6]+((te>>>14|_<<2)&8191),d=s[7]+((_>>>11|V<<5)&8191),p=s[8]+((V>>>8|W<<8)&8191),w=s[9]+(W>>>5|o),c=0,P=c+U*a+N*(5*k)+I*(5*S)+L*(5*m)+K*(5*B);c=P>>>13,P&=8191,P+=M*(5*T)+u*(5*b)+d*(5*y)+p*(5*f)+w*(5*l),c+=P>>>13,P&=8191;let g=c+U*l+N*a+I*(5*k)+L*(5*S)+K*(5*m);c=g>>>13,g&=8191,g+=M*(5*B)+u*(5*T)+d*(5*b)+p*(5*y)+w*(5*f),c+=g>>>13,g&=8191;let h=c+U*f+N*l+I*a+L*(5*k)+K*(5*S);c=h>>>13,h&=8191,h+=M*(5*m)+u*(5*B)+d*(5*T)+p*(5*b)+w*(5*y),c+=h>>>13,h&=8191;let x=c+U*y+N*f+I*l+L*a+K*(5*k);c=x>>>13,x&=8191,x+=M*(5*S)+u*(5*m)+d*(5*B)+p*(5*T)+w*(5*b),c+=x>>>13,x&=8191;let O=c+U*b+N*y+I*f+L*l+K*a;c=O>>>13,O&=8191,O+=M*(5*k)+u*(5*S)+d*(5*m)+p*(5*B)+w*(5*T),c+=O>>>13,O&=8191;let $=c+U*T+N*b+I*y+L*f+K*l;c=$>>>13,$&=8191,$+=M*a+u*(5*k)+d*(5*S)+p*(5*m)+w*(5*B),c+=$>>>13,$&=8191;let Y=c+U*B+N*T+I*b+L*y+K*f;c=Y>>>13,Y&=8191,Y+=M*l+u*a+d*(5*k)+p*(5*S)+w*(5*m),c+=Y>>>13,Y&=8191;let z=c+U*m+N*B+I*T+L*b+K*y;c=z>>>13,z&=8191,z+=M*f+u*l+d*a+p*(5*k)+w*(5*S),c+=z>>>13,z&=8191;let pe=c+U*S+N*m+I*B+L*T+K*b;c=pe>>>13,pe&=8191,pe+=M*y+u*f+d*l+p*a+w*(5*k),c+=pe>>>13,pe&=8191;let ge=c+U*k+N*S+I*m+L*B+K*T;c=ge>>>13,ge&=8191,ge+=M*b+u*y+d*f+p*l+w*a,c+=ge>>>13,ge&=8191,c=(c<<2)+c|0,c=c+P|0,P=c&8191,c=c>>>13,g+=c,s[0]=P,s[1]=g,s[2]=h,s[3]=x,s[4]=O,s[5]=$,s[6]=Y,s[7]=z,s[8]=pe,s[9]=ge}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 s=(o^1)-1;for(let a=0;a<10;a++)r[a]&=s;s=~s;for(let a=0;a<10;a++)t[a]=t[a]&s|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 i=t[0]+n[0];t[0]=i&65535;for(let a=1;a<8;a++)i=(t[a]+n[a]|0)+(i>>>16)|0,t[a]=i&65535;oe(r)}update(t){yt(this),q(t),t=xe(t);let{buffer:n,blockLen:r}=this,o=t.length;for(let s=0;s<o;){let i=Math.min(r-this.pos,o-s);if(i===r){for(;r<=o-s;s+=r)this.process(t,s);continue}n.set(t.subarray(s,s+i),this.pos),this.pos+=i,s+=i,this.pos===r&&(this.process(n,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,oe(this.h,this.r,this.buffer,this.pad)}digestInto(t){yt(this),an(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 s=0;for(let i=0;i<8;i++)t[s++]=r[i]>>>0,t[s++]=r[i]>>>8}digest(){let{buffer:t,outputLen:n}=this;this.digestInto(t);let r=t.slice(0,n);return this.destroy(),r}},hn=un(32,e=>new mt(e));function jr(e,t,n,r,o,s=20){let i=e[0],a=e[1],l=e[2],f=e[3],y=t[0],b=t[1],T=t[2],B=t[3],m=t[4],S=t[5],k=t[6],R=t[7],D=o,Z=n[0],J=n[1],te=n[2],_=i,V=a,W=l,U=f,N=y,I=b,L=T,K=B,M=m,u=S,d=k,p=R,w=D,c=Z,P=J,g=te;for(let x=0;x<s;x+=2)_=_+N|0,w=j(w^_,16),M=M+w|0,N=j(N^M,12),_=_+N|0,w=j(w^_,8),M=M+w|0,N=j(N^M,7),V=V+I|0,c=j(c^V,16),u=u+c|0,I=j(I^u,12),V=V+I|0,c=j(c^V,8),u=u+c|0,I=j(I^u,7),W=W+L|0,P=j(P^W,16),d=d+P|0,L=j(L^d,12),W=W+L|0,P=j(P^W,8),d=d+P|0,L=j(L^d,7),U=U+K|0,g=j(g^U,16),p=p+g|0,K=j(K^p,12),U=U+K|0,g=j(g^U,8),p=p+g|0,K=j(K^p,7),_=_+I|0,g=j(g^_,16),d=d+g|0,I=j(I^d,12),_=_+I|0,g=j(g^_,8),d=d+g|0,I=j(I^d,7),V=V+L|0,w=j(w^V,16),p=p+w|0,L=j(L^p,12),V=V+L|0,w=j(w^V,8),p=p+w|0,L=j(L^p,7),W=W+K|0,c=j(c^W,16),M=M+c|0,K=j(K^M,12),W=W+K|0,c=j(c^W,8),M=M+c|0,K=j(K^M,7),U=U+N|0,P=j(P^U,16),u=u+P|0,N=j(N^u,12),U=U+N|0,P=j(P^U,8),u=u+P|0,N=j(N^u,7);let h=0;r[h++]=i+_|0,r[h++]=a+V|0,r[h++]=l+W|0,r[h++]=f+U|0,r[h++]=y+N|0,r[h++]=b+I|0,r[h++]=T+L|0,r[h++]=B+K|0,r[h++]=m+M|0,r[h++]=S+u|0,r[h++]=k+d|0,r[h++]=R+p|0,r[h++]=D+w|0,r[h++]=Z+c|0,r[h++]=J+P|0,r[h++]=te+g|0}var Ur=yn(jr,{counterRight:!1,counterLength:4,allowShortKeys:!1});var Lr=new Uint8Array(16),mn=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(Lr.subarray(n))},Kr=new Uint8Array(32);function bn(e,t,n,r,o){o!==void 0&&q(o,void 0,"AAD");let s=e(t,n,Kr),i=dn(r.length,o?o.length:0,!0),a=hn.create(s);o&&mn(a,o),mn(a,r),a.update(i);let l=a.digest();return oe(s,i),l}var Mr=e=>(t,n,r)=>({encrypt(s,i){let a=s.length;i=Ue(a+16,i,!1),i.set(s);let l=i.subarray(0,-16);e(t,n,l,l,1);let f=bn(e,t,n,l,r);return i.set(f,a),oe(f),i},decrypt(s,i){i=Ue(s.length-16,i,!1);let a=s.subarray(0,-16),l=s.subarray(-16),f=bn(e,t,n,a,r);if(!ln(l,f))throw oe(f),new Error("invalid tag");return i.set(s.subarray(0,-16)),e(t,n,i,i,1),oe(f),i}}),Ae=fn({blockSize:64,nonceLength:12,tagLength:16},Mr(Ur));var Nr=new TextEncoder,Ir=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function G(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 Nr.encode(e)}function Ee(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return Ir.decode(e)}async function wn(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function vn(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}var Fr="deepview-triage-sync.v1.content-key",Hr="deepview-triage-sync.v1.sign-key",Dr="deepview-triage-sync.v1.save",Wr="deepview-triage-sync.v1.subscribe",$r=12,bt=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),Ge=null;function Sn(){return Ge||(Ge=(async()=>{try{return await crypto.subtle.importKey("raw",new Uint8Array(32),{name:"ChaCha20-Poly1305"},!1,["encrypt","decrypt"]),!0}catch{return!1}})(),Ge)}async function kn(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:G(t)},r,256);return new Uint8Array(o)}async function Tn(e){return await kn(e,Fr)}async function Je(e,t){let n=await kn(e,`${Hr}|${t}`),r=new Uint8Array(bt.length+32);r.set(bt,0),r.set(n,bt.length);let o=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!0,["sign"]),s=await crypto.subtle.exportKey("jwk",o),i=s.x;if(delete s.d,i==null)throw new Error("Ed25519 JWK export returned no public key");let a=Uint8Array.fromBase64(i,{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:i}}function wt({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:o}){return G([Dr,e,t==null?"":String(t),n===!0?"1":"",r,o].join(`
|
|
2
|
-
`))}async function
|
|
3
|
-
`))}async function
|
|
4
|
-
`,
|
|
5
|
-
`,
|
|
6
|
-
${o}`),y=
|
|
7
|
-
${r}`),a=
|
|
8
|
-
`))}function
|
|
9
|
-
`))}function
|
|
10
|
-
`))}async function
|
|
1
|
+
function Cr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}function Je(e){if(typeof e!="boolean")throw new TypeError(`boolean expected, not ${e}`)}function xe(e){if(typeof e!="number")throw new TypeError("number expected, got "+typeof e);if(!Number.isSafeInteger(e)||e<0)throw new RangeError("positive integer expected, got "+e)}function G(e,t,n=""){let r=Cr(e),o=e?.length,s=t!==void 0;if(!r||s&&o!==t){let i=n&&`"${n}" `,a=s?` of length ${t}`:"",f=r?`length=${o}`:`type=${typeof e}`,c=i+"expected Uint8Array"+a+", got "+f;throw r?new RangeError(c):new TypeError(c)}return e}function mt(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function un(e,t,n=!1){G(e,void 0,"output");let r=t.outputLen;if(e.length<r)throw new RangeError("digestInto() expects output buffer of length at least "+r);if(n&&!Ae(e))throw new Error("invalid output, must be aligned")}function ce(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function oe(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Or(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var me=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68,jr=e=>e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255;var Ur=e=>{for(let t=0;t<e.length;t++)e[t]=jr(e[t]);return e},fe=me?e=>e:Ur;function fn(e,t){if(t==null||typeof t!="object")throw new Error("options must be defined");return Object.assign(e,t)}function dn(e,t){if(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 gn(e,t,n){let r=t,o=n||(()=>[]),s=(a,f)=>r(f,...o(a)).update(a).digest(),i=r(new Uint8Array(e),...o(new Uint8Array(0)));return s.outputLen=i.outputLen,s.blockLen=i.blockLen,s.create=(a,...f)=>r(a,...f),s}var pn=(e,t)=>{function n(r,...o){if(G(r,void 0,"key"),e.nonceLength!==void 0){let y=o[0];G(y,e.varSizeNonce?void 0:e.nonceLength,"nonce")}let s=e.tagLength;s&&o[1]!==void 0&&G(o[1],void 0,"AAD");let i=t(r,...o),a=(y,b)=>{if(b!==void 0){if(y!==2)throw new Error("cipher output not supported");G(b,void 0,"output")}},f=!1;return{encrypt(y,b){if(f)throw new Error("cannot encrypt() twice with same key + nonce");return f=!0,G(y),a(i.encrypt.length,b),i.encrypt(y,b)},decrypt(y,b){if(G(y),s&&y.length<s)throw new Error('"ciphertext" expected length bigger than tagLength='+s);return a(i.decrypt.length,b),i.decrypt(y,b)}}}return Object.assign(n,e),n};function Ue(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(G(t,void 0,"output"),t.length!==e)throw new Error('"output" expected Uint8Array of length '+e+", got: "+t.length);if(n&&!Ae(t))throw new Error("invalid output, must be aligned");return t}function yn(e,t,n){xe(e),xe(t),Je(n);let r=new Uint8Array(16),o=Or(r);return o.setBigUint64(0,BigInt(t),n),o.setBigUint64(8,BigInt(e),n),r}function Ae(e){return e.byteOffset%4===0}function Ee(e){return Uint8Array.from(G(e))}var mn=e=>Uint8Array.from(e.split(""),t=>t.charCodeAt(0)),Lr=fe(ce(mn("expand 16-byte k"))),Kr=fe(ce(mn("expand 32-byte k")));function j(e,t){return e<<t|e>>>32-t}var Le=64,Mr=16,bt=2**32-1,hn=Uint32Array.of();function Nr(e,t,n,r,o,s,i,a){let f=o.length,c=new Uint8Array(Le),y=ce(c),b=me&&Ae(o)&&Ae(s),v=b?ce(o):hn,T=b?ce(s):hn;if(!me){for(let m=0;m<f;i++){if(e(t,n,r,y,i,a),fe(y),i>=bt)throw new Error("arx: counter overflow");let k=Math.min(Le,f-m);for(let x=0,R;x<k;x++)R=m+x,s[R]=o[R]^c[x];m+=k}return}for(let m=0;m<f;i++){if(e(t,n,r,y,i,a),i>=bt)throw new Error("arx: counter overflow");let k=Math.min(Le,f-m);if(b&&k===Le){let x=m/4;if(m%4!==0)throw new Error("arx: invalid block position");for(let R=0,D;R<Mr;R++)D=x+R,T[D]=v[D]^y[R];m+=Le;continue}for(let x=0,R;x<k;x++)R=m+x,s[R]=o[R]^c[x];m+=k}}function bn(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:o,counterRight:s,rounds:i}=fn({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!="function")throw new Error("core must be a function");return xe(o),xe(i),Je(s),Je(n),(a,f,c,y,b=0)=>{G(a,void 0,"key"),G(f,void 0,"nonce"),G(c,void 0,"data");let v=c.length;if(y=Ue(v,y,!1),xe(b),b<0||b>=bt)throw new Error("arx: counter overflow");let T=[],m=a.length,k,x;if(m===32)T.push(k=Ee(a)),x=Kr;else if(m===16&&n)k=new Uint8Array(32),k.set(a),k.set(a,16),x=Lr,T.push(k);else throw G(a,32,"arx key"),new Error("invalid key size");(!me||!Ae(f))&&T.push(f=Ee(f));let R=ce(k);if(r){if(f.length!==24)throw new Error("arx: extended nonce must be 24 bytes");let J=f.subarray(0,16);if(me)r(x,R,ce(J),R);else{let te=fe(Uint32Array.from(x));r(te,R,ce(J),R),oe(te),fe(R)}f=f.subarray(16)}else me||fe(R);let D=16-o;if(D!==f.length)throw new Error(`arx: nonce must be ${D} or 16 bytes`);if(D!==12){let J=new Uint8Array(12);J.set(f,s?0:12-f.length),f=J,T.push(f)}let Z=fe(ce(f));try{return Nr(e,x,R,Z,c,y,b,i),y}finally{oe(...T)}}}function Q(e,t){return e[t++]&255|(e[t++]&255)<<8}var wt=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=Ee(G(t,32,"key"));let n=Q(t,0),r=Q(t,2),o=Q(t,4),s=Q(t,6),i=Q(t,8),a=Q(t,10),f=Q(t,12),c=Q(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|s<<9)&8191,this.r[4]=(s>>>4|i<<12)&255,this.r[5]=i>>>1&8190,this.r[6]=(i>>>14|a<<2)&8191,this.r[7]=(a>>>11|f<<5)&8065,this.r[8]=(f>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let y=0;y<8;y++)this.pad[y]=Q(t,16+2*y)}process(t,n,r=!1){let o=r?0:2048,{h:s,r:i}=this,a=i[0],f=i[1],c=i[2],y=i[3],b=i[4],v=i[5],T=i[6],m=i[7],k=i[8],x=i[9],R=Q(t,n+0),D=Q(t,n+2),Z=Q(t,n+4),J=Q(t,n+6),te=Q(t,n+8),_=Q(t,n+10),V=Q(t,n+12),$=Q(t,n+14),U=s[0]+(R&8191),N=s[1]+((R>>>13|D<<3)&8191),I=s[2]+((D>>>10|Z<<6)&8191),L=s[3]+((Z>>>7|J<<9)&8191),K=s[4]+((J>>>4|te<<12)&8191),M=s[5]+(te>>>1&8191),u=s[6]+((te>>>14|_<<2)&8191),d=s[7]+((_>>>11|V<<5)&8191),g=s[8]+((V>>>8|$<<8)&8191),w=s[9]+($>>>5|o),l=0,A=l+U*a+N*(5*x)+I*(5*k)+L*(5*m)+K*(5*T);l=A>>>13,A&=8191,A+=M*(5*v)+u*(5*b)+d*(5*y)+g*(5*c)+w*(5*f),l+=A>>>13,A&=8191;let p=l+U*f+N*a+I*(5*x)+L*(5*k)+K*(5*m);l=p>>>13,p&=8191,p+=M*(5*T)+u*(5*v)+d*(5*b)+g*(5*y)+w*(5*c),l+=p>>>13,p&=8191;let h=l+U*c+N*f+I*a+L*(5*x)+K*(5*k);l=h>>>13,h&=8191,h+=M*(5*m)+u*(5*T)+d*(5*v)+g*(5*b)+w*(5*y),l+=h>>>13,h&=8191;let E=l+U*y+N*c+I*f+L*a+K*(5*x);l=E>>>13,E&=8191,E+=M*(5*k)+u*(5*m)+d*(5*T)+g*(5*v)+w*(5*b),l+=E>>>13,E&=8191;let O=l+U*b+N*y+I*c+L*f+K*a;l=O>>>13,O&=8191,O+=M*(5*x)+u*(5*k)+d*(5*m)+g*(5*T)+w*(5*v),l+=O>>>13,O&=8191;let W=l+U*v+N*b+I*y+L*c+K*f;l=W>>>13,W&=8191,W+=M*a+u*(5*x)+d*(5*k)+g*(5*m)+w*(5*T),l+=W>>>13,W&=8191;let Y=l+U*T+N*v+I*b+L*y+K*c;l=Y>>>13,Y&=8191,Y+=M*f+u*a+d*(5*x)+g*(5*k)+w*(5*m),l+=Y>>>13,Y&=8191;let z=l+U*m+N*T+I*v+L*b+K*y;l=z>>>13,z&=8191,z+=M*c+u*f+d*a+g*(5*x)+w*(5*k),l+=z>>>13,z&=8191;let ge=l+U*k+N*m+I*T+L*v+K*b;l=ge>>>13,ge&=8191,ge+=M*y+u*c+d*f+g*a+w*(5*x),l+=ge>>>13,ge&=8191;let pe=l+U*x+N*k+I*m+L*T+K*v;l=pe>>>13,pe&=8191,pe+=M*b+u*y+d*c+g*f+w*a,l+=pe>>>13,pe&=8191,l=(l<<2)+l|0,l=l+A|0,A=l&8191,l=l>>>13,p+=l,s[0]=A,s[1]=p,s[2]=h,s[3]=E,s[4]=O,s[5]=W,s[6]=Y,s[7]=z,s[8]=ge,s[9]=pe}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 s=(o^1)-1;for(let a=0;a<10;a++)r[a]&=s;s=~s;for(let a=0;a<10;a++)t[a]=t[a]&s|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 i=t[0]+n[0];t[0]=i&65535;for(let a=1;a<8;a++)i=(t[a]+n[a]|0)+(i>>>16)|0,t[a]=i&65535;oe(r)}update(t){mt(this),G(t),t=Ee(t);let{buffer:n,blockLen:r}=this,o=t.length;for(let s=0;s<o;){let i=Math.min(r-this.pos,o-s);if(i===r){for(;r<=o-s;s+=r)this.process(t,s);continue}n.set(t.subarray(s,s+i),this.pos),this.pos+=i,s+=i,this.pos===r&&(this.process(n,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,oe(this.h,this.r,this.buffer,this.pad)}digestInto(t){mt(this),un(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 s=0;for(let i=0;i<8;i++)t[s++]=r[i]>>>0,t[s++]=r[i]>>>8}digest(){let{buffer:t,outputLen:n}=this;this.digestInto(t);let r=t.slice(0,n);return this.destroy(),r}},wn=gn(32,e=>new wt(e));function Ir(e,t,n,r,o,s=20){let i=e[0],a=e[1],f=e[2],c=e[3],y=t[0],b=t[1],v=t[2],T=t[3],m=t[4],k=t[5],x=t[6],R=t[7],D=o,Z=n[0],J=n[1],te=n[2],_=i,V=a,$=f,U=c,N=y,I=b,L=v,K=T,M=m,u=k,d=x,g=R,w=D,l=Z,A=J,p=te;for(let E=0;E<s;E+=2)_=_+N|0,w=j(w^_,16),M=M+w|0,N=j(N^M,12),_=_+N|0,w=j(w^_,8),M=M+w|0,N=j(N^M,7),V=V+I|0,l=j(l^V,16),u=u+l|0,I=j(I^u,12),V=V+I|0,l=j(l^V,8),u=u+l|0,I=j(I^u,7),$=$+L|0,A=j(A^$,16),d=d+A|0,L=j(L^d,12),$=$+L|0,A=j(A^$,8),d=d+A|0,L=j(L^d,7),U=U+K|0,p=j(p^U,16),g=g+p|0,K=j(K^g,12),U=U+K|0,p=j(p^U,8),g=g+p|0,K=j(K^g,7),_=_+I|0,p=j(p^_,16),d=d+p|0,I=j(I^d,12),_=_+I|0,p=j(p^_,8),d=d+p|0,I=j(I^d,7),V=V+L|0,w=j(w^V,16),g=g+w|0,L=j(L^g,12),V=V+L|0,w=j(w^V,8),g=g+w|0,L=j(L^g,7),$=$+K|0,l=j(l^$,16),M=M+l|0,K=j(K^M,12),$=$+K|0,l=j(l^$,8),M=M+l|0,K=j(K^M,7),U=U+N|0,A=j(A^U,16),u=u+A|0,N=j(N^u,12),U=U+N|0,A=j(A^U,8),u=u+A|0,N=j(N^u,7);let h=0;r[h++]=i+_|0,r[h++]=a+V|0,r[h++]=f+$|0,r[h++]=c+U|0,r[h++]=y+N|0,r[h++]=b+I|0,r[h++]=v+L|0,r[h++]=T+K|0,r[h++]=m+M|0,r[h++]=k+u|0,r[h++]=x+d|0,r[h++]=R+g|0,r[h++]=D+w|0,r[h++]=Z+l|0,r[h++]=J+A|0,r[h++]=te+p|0}var Fr=bn(Ir,{counterRight:!1,counterLength:4,allowShortKeys:!1});var Hr=new Uint8Array(16),vn=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(Hr.subarray(n))},Dr=new Uint8Array(32);function Sn(e,t,n,r,o){o!==void 0&&G(o,void 0,"AAD");let s=e(t,n,Dr),i=yn(r.length,o?o.length:0,!0),a=wn.create(s);o&&vn(a,o),vn(a,r),a.update(i);let f=a.digest();return oe(s,i),f}var $r=e=>(t,n,r)=>({encrypt(s,i){let a=s.length;i=Ue(a+16,i,!1),i.set(s);let f=i.subarray(0,-16);e(t,n,f,f,1);let c=Sn(e,t,n,f,r);return i.set(c,a),oe(c),i},decrypt(s,i){i=Ue(s.length-16,i,!1);let a=s.subarray(0,-16),f=s.subarray(-16),c=Sn(e,t,n,a,r);if(!dn(f,c))throw oe(c),new Error("invalid tag");return i.set(s.subarray(0,-16)),e(t,n,i,i,1),oe(c),i}}),Be=pn({blockSize:64,nonceLength:12,tagLength:16},$r(Fr));var Wr=new TextEncoder,_r=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function q(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 Wr.encode(e)}function Pe(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return _r.decode(e)}async function kn(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function Tn(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}var Vr="deepview-triage-sync.v1.content-key",zr="deepview-triage-sync.v1.sign-key",qr="deepview-triage-sync.v1.save",Gr="deepview-triage-sync.v1.subscribe",Jr=12,vt=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),Ye=null;function xn(){return Ye||(Ye=(async()=>{try{return await crypto.subtle.importKey("raw",new Uint8Array(32),{name:"ChaCha20-Poly1305"},!1,["encrypt","decrypt"]),!0}catch{return!1}})(),Ye)}async function An(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:q(t)},r,256);return new Uint8Array(o)}async function En(e){return await An(e,Vr)}async function Xe(e,t){let n=await An(e,`${zr}|${t}`),r=new Uint8Array(vt.length+32);r.set(vt,0),r.set(n,vt.length);let o=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!0,["sign"]),s=await crypto.subtle.exportKey("jwk",o),i=s.x;if(delete s.d,i==null)throw new Error("Ed25519 JWK export returned no public key");let a=Uint8Array.fromBase64(i,{alphabet:"base64url"}),f=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!1,["sign"]);return n.fill(0),r.fill(0),{privateKey:f,publicKey:a,publicKeyB64:i}}function St({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:o}){return q([qr,e,t==null?"":String(t),n===!0?"1":"",r,o].join(`
|
|
2
|
+
`))}async function Bn(e,t){let n=await crypto.subtle.sign({name:"Ed25519"},e,t);return new Uint8Array(n).toBase64({alphabet:"base64url",omitPadding:!0})}async function Pn(e,t){return await Bn(e,St(t))}async function kt(e){let t=St(e),n=await crypto.subtle.digest("SHA-256",t);return new Uint8Array(n).toBase64({alphabet:"base64url",omitPadding:!0})}function Yr(e,t,n){let r=t==null?"":String(t);return q([Gr,e,r,n].join(`
|
|
3
|
+
`))}async function Rn(e,t,n,r){return await Bn(e,Yr(t,n,r))}async function Cn(e,t,n){try{let r=await crypto.subtle.importKey("raw",e,{name:"Ed25519"},!1,["verify"]),o=Uint8Array.fromBase64(n,{alphabet:"base64url"}),s=St(t);return await crypto.subtle.verify({name:"Ed25519"},r,o,s)}catch{return!1}}function Xr(){let e=new Uint8Array(Jr);return crypto.getRandomValues(e),e}function Tt(e,t){let n=t==null?"":String(t);return q(`${e}|${n}`)}async function Qr(e,t,n){let r=Xr();if(await xn()){let s=await crypto.subtle.importKey("raw",e,{name:"ChaCha20-Poly1305"},!1,["encrypt"]),i=new Uint8Array(await crypto.subtle.encrypt({name:"ChaCha20-Poly1305",iv:r,additionalData:n},s,t));return{nonce:r,ciphertext:i}}let o=Be(e,r,n);return{nonce:r,ciphertext:o.encrypt(t)}}async function Zr(e,t,n,r){if(await xn()){let s=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},s,n))}return Be(e,t,r).decrypt(n)}var eo=64;function to(e,t){return e<=t?t:2**(32-Math.clz32(e-1))}async function no(e){let t=q(JSON.stringify(e)),n=await kn(t);if(n.length>1073741820)throw new Error("payload too large");let r=to(4+n.length,eo),o=new Uint8Array(r);return new DataView(o.buffer,o.byteOffset,o.byteLength).setUint32(0,n.length,!1),o.set(n,4),o}async function ro(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 Tn(r);return JSON.parse(Pe(o))}async function On(e,t,n){let r=await no(t),{nonce:o,ciphertext:s}=await Qr(e,r,n);return{nonce:o.toBase64(),ciphertext:s.toBase64()}}async function jn(e,t,n,r){let o=Uint8Array.fromBase64(t),s=Uint8Array.fromBase64(n),i=await Zr(e,o,s,r);return ro(i)}var oo="deepview-objstore.v1.content",so="deepview-objstore.v1.tag",io=`objstore-tag
|
|
4
|
+
`,ao=`objstore-bundle-tag
|
|
5
|
+
`,be=12,co=16;async function xt(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 Un(n,oo,32),o=await Un(n,so,32);n.fill(0);let{privateKey:s,publicKeyB64:i}=await Xe(e,t);return{signingKey:s,contentKey:r,tagKey:o,workspaceTag:i}}async function Un(e,t,n){let r=await crypto.subtle.importKey("raw",e,"HKDF",!1,["deriveBits"]),o=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array,info:q(t)},r,n*8);return new Uint8Array(o)}async function se(e,t){let n=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return new Uint8Array(await crypto.subtle.sign("HMAC",n,q(io+t))).toBase64({alphabet:"base64url",omitPadding:!0})}async function le(e,t){let n=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return new Uint8Array(await crypto.subtle.sign("HMAC",n,q(ao+t))).toBase64({alphabet:"base64url",omitPadding:!0})}function At(e,t,n,r,o){let s=q(t);if(s.length>65535)throw new Error(`fileName too long: ${s.length} bytes (max 65535)`);let i=new Uint8Array(2+s.length+n.length);new DataView(i.buffer).setUint16(0,s.length,!1),i.set(s,2),i.set(n,2+s.length);let f=new Uint8Array(be);crypto.getRandomValues(f);let c=q(`${r}
|
|
6
|
+
${o}`),y=Be(e,f,c).encrypt(i),b=new Uint8Array(be+y.length);return b.set(f,0),b.set(y,be),b}function Ln(e,t){return be+2+q(e).length+t+co}function Kn(e,t){let n=q(e);if(n.length>65535)throw new Error(`bundle name too long: ${n.length} bytes (max 65535)`);let r=new Uint8Array(2+n.length+t.length);return new DataView(r.buffer).setUint16(0,n.length,!1),r.set(n,2),r.set(t,2+n.length),r}function Et(e){if(e.length<2)throw new Error(`bundle wrapped content truncated: ${e.length} bytes`);let n=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1);if(2+n>e.length)throw new Error(`bundle wrapped nameLen ${n} overflows ${e.length}`);let r=new TextDecoder("utf-8",{fatal:!0}).decode(e.subarray(2,2+n)),o=new Uint8Array(e.subarray(2+n));return{name:r,content:o}}function Qe(e,t,n,r){if(t.length<be+16)throw new Error(`objstore payload too short: ${t.length} bytes`);let o=t.subarray(0,be),s=t.subarray(be),i=q(`${n}
|
|
7
|
+
${r}`),a=Be(e,o,i).decrypt(s);if(a.length<2)throw new Error(`objstore plaintext truncated: ${a.length} bytes`);let c=new DataView(a.buffer,a.byteOffset,a.byteLength).getUint16(0,!1);if(2+c>a.length)throw new Error(`objstore plaintext nameLen ${c} overflows ${a.length}`);let y=new TextDecoder("utf-8",{fatal:!0}).decode(a.subarray(2,2+c)),b=a.subarray(2+c);return{fileName:y,content:new Uint8Array(b)}}var lo="deepview-objstore.v1.put",uo="deepview-objstore.v1.delete",fo="deepview-objstore.v1.fetch";function Mn(e){return e==null?"":String(e)}function Nn(e){return e??""}function go(e,t){return q([lo,e.workspaceTag,e.resourceTag,Mn(e.prevVersion),Nn(e.prevIncarnation),e.contentHash,String(e.expectedLength),t].join(`
|
|
8
|
+
`))}function po(e,t){return q([uo,e.workspaceTag,e.resourceTag,Mn(e.prevVersion),Nn(e.prevIncarnation),t].join(`
|
|
9
|
+
`))}function yo(e,t,n){return q([fo,e,t,n].join(`
|
|
10
|
+
`))}async function Bt(e,t){return new Uint8Array(await crypto.subtle.sign({name:"Ed25519"},e,t)).toBase64({alphabet:"base64url",omitPadding:!0})}function In(e,t,n){return Bt(e,go(t,n))}function Fn(e,t,n){return Bt(e,po(t,n))}function Hn(e,t,n,r){return Bt(e,yo(t,n,r))}async function Pt(e){let t=await crypto.subtle.digest("SHA-256",e);return new Uint8Array(t).toBase64({alphabet:"base64url",omitPadding:!0})}var we=null,Dn=[];function ho(e){if(we===e)return;if(we!==null)throw new Error("SyncHost: a different host is already installed");we=e;let t=Dn.splice(0);for(let n of t)try{n(e)}catch(r){console.warn("SyncHost install listener:",r)}}function ne(){if(we===null)throw new Error("SyncHost: not installed \u2014 call installSyncHost(host) during app boot");return we}function Ze(e){if(we!==null){try{e(we)}catch(t){console.warn("SyncHost install listener:",t)}return}Dn.push(e)}var Rt="deepview.sync.password",Ct=null;function $n(){return Ct}function Wn(){let e=ne().getSecureItem(Rt);Ct=typeof e=="string"&&e.length>0?e:null}async function Ke(e){Ct=e;let t=ne();e==null?await t.removeSecureItem(Rt):await t.setSecureItem(Rt,e)}function mo(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}/sse`}var bo=100,wo=5e3,Ot=class{buf="";parse(t){this.buf+=t;let n=[],r;for(;(r=this.buf.indexOf(`
|
|
11
11
|
|
|
12
12
|
`))>=0;){let o=this.buf.slice(0,r);this.buf=this.buf.slice(r+2);let s="",i=[];for(let a of o.split(`
|
|
13
13
|
`))if(!a.startsWith(":")){if(a.startsWith("event:")){s=a.slice(6).trim();continue}if(a.startsWith("data:")){i.push(a.slice(5).replace(/^ /u,""));continue}}i.length!==0&&n.push({event:s,data:i.join(`
|
|
14
|
-
`)})}return n}},Qe=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;constructor(t){super(),this.baseUrl=lo(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:uo;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},n)}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let s=new Promise(i=>{setTimeout(i,fo)});await Promise.race([this.inFlightPost.catch(()=>{}),s])}if(this.readyState===e.CLOSED)return;let t=this.outbound;this.outbound=[];let n={};this.cachedPassword!=null&&(n.password=this.cachedPassword),t.length>0&&(n.frames=t);let r=this.sessionId==null?this.baseUrl:`${this.baseUrl}?id=${encodeURIComponent(this.sessionId)}`,o=(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(a){this.readyState!==e.CLOSED&&console.warn("sse-transport: POST failed:",a),this.shutdown();return}if(!s.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${s.status} ${s.statusText}; closing`),this.shutdown();return}let i=s.body;if(!i){this.shutdown();return}this.consumeStream(i)})();this.inFlightPost=o,o.finally(()=>{this.inFlightPost===o&&(this.inFlightPost=null)})}async consumeStream(t){let n=t.getReader();this.activeReaders.add(n);let r=new Rt,o=new TextDecoder;try{for(;;){let{value:s,done:i}=await n.read();if(i)break;if(this.readyState===e.CLOSED)return;let a=r.parse(o.decode(s,{stream:!0}));for(let l of a)this.dispatchEvent_(l)}if(this.readyState!==e.CLOSED){let s=o.decode();if(s.length>0)for(let i of r.parse(s))this.dispatchEvent_(i)}}catch(s){this.readyState!==e.CLOSED&&(console.warn("sse-transport: stream read failed:",s),this.shutdown())}finally{this.activeReaders.delete(n);try{n.releaseLock()}catch{}}}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);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 Ze=1e3,po=3e4;function et(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,o=null,s=null,i=0,a=!1,l=null,f=Ze,y=null,b=null,T=null,B=!1,m=null,S=new Set;function k(){l&&(clearTimeout(l),l=null)}function R(){k(),!a&&i!==0&&t&&(l=setTimeout(()=>{l=null,K()},f),f=Math.min(f*2,po))}function D(){Z(),!(n<=0)&&(y=setInterval(()=>{!o||o.readyState!==o.OPEN||b||(U({type:"ping"}),b=setTimeout(()=>{b=null,console.warn("socket-transport: heartbeat timeout; closing socket");try{o?.close()}catch{}},r))},n))}function Z(){y&&(clearInterval(y),y=null),b&&(clearTimeout(b),b=null)}function J(g){for(let h of S)try{h.onDisconnected(g)}catch(x){console.warn("socket-transport: consumer.onDisconnected threw:",x)}}function te(g){for(let h of S)try{h.onConnected(g)}catch(x){console.warn("socket-transport: consumer.onConnected threw:",x)}}function _(g){for(let h of S)try{h.onMessage(g)}catch(x){console.warn("socket-transport: consumer.onMessage threw:",x)}}function V(g){let h;try{let x=typeof g.data=="string"?g.data:new TextDecoder().decode(g.data);h=JSON.parse(x)}catch(x){console.warn("socket-transport: dropping malformed wire frame:",x);return}if(!(!h||typeof h!="object")){if(h.type==="pong"){b&&(clearTimeout(b),b=null);return}if(h.type==="challenge"){if(typeof h.nonce!="string")return;s!=null&&s!==h.nonce&&J("session restarted"),s=h.nonce,te(s);return}if(h.type==="authenticated"){W(!0),_(h);return}if(h.type==="unauthorized"&&h.kind==="auth-failed"){W(!1);return}_(h)}}function W(g){if(!m)return;let h=m;m=null,h(g)}function U(g){if(!o||o.readyState!==o.OPEN)return!1;try{return o.send(JSON.stringify(g)),!0}catch(h){return console.warn("socket-transport: send failed:",h),!1}}function N(g){return new Promise(h=>{m=h,U({type:"authenticate",password:g})||(m=null,h(!1))})}function I(){if(T)return T;if(!o||o.readyState!==o.OPEN)return Promise.resolve(!1);let g=o,h=(async()=>{try{let x=In();if(x!=null&&!B){B=!0;let $=await N(x);if(o!==g)return!1;if($)return!0;try{await Ke(null)}catch(Y){console.warn("socket-transport: failed to clear cached auth password:",Y)}}let O=!0;for(;;){if(o!==g||!o||o.readyState!==o.OPEN||!e.authResolver)return!1;let $;try{$=await e.authResolver({retry:!O})}catch(z){return console.warn("socket-transport: authentication resolver threw:",z),!1}if(o!==g||(O=!1,$==null||$===""))return!1;let Y=await N($);if(o!==g)return!1;if(Y){try{await Ke($)}catch(z){console.warn("socket-transport: failed to cache auth password:",z)}return!0}}}finally{T=null}})();return T=h,h}function L(g){if(!o)return;let h=o;o=null,s=null,B=!1,W(!1),Z(),J(g);try{h.close()}catch{}}function K(){a||o||i!==0&&t&&M(!1)}function M(g){if(a||i===0||!t)return;let h;try{h=g?new Qe(t):new WebSocket(t)}catch(O){if(!g){console.warn("socket-transport: WebSocket constructor failed; trying SSE fallback:",O),M(!0);return}console.warn("socket-transport: SSE constructor failed:",O),R();return}o=h,s=null,B=!1;let x=!1;h.addEventListener("open",()=>{o===h&&(x=!0,f=Ze,D())}),h.addEventListener("message",O=>{o===h&&V(O)}),h.addEventListener("close",O=>{if(o!==h)return;if(o=null,s=null,B=!1,W(!1),Z(),!x&&!g&&!a&&i>0){if(typeof fetch>"u"){J("socket closed"),R();return}console.warn("socket-transport: WebSocket failed to open; falling back to SSE"),M(!0);return}O?.code===1001&&(f=Ze),J("socket closed"),!a&&i>0&&R()}),h.addEventListener("error",()=>{})}function u(){if(a)return{release(){}};i+=1,i===1&&!o&&K();let g=!1;return{release(){g||(g=!0,!a&&(i-=1,i===0&&(k(),f=Ze,L("released"))))}}}function d(g){g!==t&&(t=g,o&&L("serverUrl changed"),i>0&&t&&K())}function p(g){S.add(g);let h=!1;return{remove(){h||(h=!0,S.delete(g))}}}function w(){a||(a=!0,k(),L("transport closed"),S.clear(),i=0)}function c(g){let{pingMs:h,pongMs:x}=g;typeof h=="number"&&h>=0&&(n=h),typeof x=="number"&&x>0&&(r=x),y&&D()}function P(){B=!1}return{acquire:u,setServerUrl:d,addConsumer:p,send:U,getNonce:()=>s,getSocket:()=>o,runAuthFlow:I,close:w,setHeartbeatTimings:c,resetCachedReplayGuard:P}}var Ct=64,Hn=4,go=15;function yo(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 Dn(e){let t=e.requestTimeoutMs??1e4,n=new URL(e.httpOrigin).origin,r=e.transport===void 0,o=e.transport??et(e.authResolver===void 0?{serverUrl:e.serverUrl}:{serverUrl:e.serverUrl,authResolver:e.authResolver}),s=!1,i=new Map,a=new Map,l=[],f=[];function y(u,d,p,w){let c=u.seenVersions.get(d);(!c||c.incarnation!==p||w>c.version)&&u.seenVersions.set(d,{incarnation:p,version:w})}function b(u){u.connectedPromise=new Promise((d,p)=>{u.resolveConnected=d,u.rejectConnected=p}),u.connectedPromise.catch(()=>{})}function T(u){u.listedPromise=new Promise((d,p)=>{u.resolveListed=d,u.rejectListed=p}),u.listedPromise.catch(()=>{})}function B(u,d){u.inventory.clear();for(let p of d)u.inventory.set(p.resourceTag,{version:p.version,incarnation:p.incarnation,contentLength:p.contentLength}),y(u,p.resourceTag,p.incarnation,p.version);u.resolveListed()}function m(u){if(!Array.isArray(u))return[];let d=[];for(let p of u)Me(p)&&d.push(Ne(p));return d}function S(u){let d;return new Promise((p,w)=>{d=setTimeout(()=>w(new Error(`objstore: inventory not seeded (no subscribe ack) after ${t}ms`)),t),u.listedPromise.then(p,w)}).finally(()=>clearTimeout(d))}function k(u){for(let d=0;d<l.length;d++)if(u(l[d]))return Promise.resolve(l.splice(d,1)[0]);return new Promise((d,p)=>{let w={predicate:u,resolve:()=>{},reject:P=>{clearTimeout(c);let g=f.indexOf(w);g>=0&&f.splice(g,1),p(P)}},c=setTimeout(()=>w.reject(new Error(`objstore: response timeout after ${t}ms`)),t);w.resolve=P=>{clearTimeout(c),d(P)},f.push(w)})}function R(u){if(!o.send(u))throw new Error("objstore: socket not open")}function D(u){for(let d of f.splice(0))try{d.reject(new Error(`objstore: ${u}`))}catch{}}function Z(u){if(u.type==="objstore-put"&&typeof u.workspaceTag=="string"&&Me(u)){let d=i.get(u.workspaceTag);if(!d)return;let p=Ne(u);y(d,p.resourceTag,p.incarnation,p.version),d.inventory.set(p.resourceTag,{version:p.version,incarnation:p.incarnation,contentLength:p.contentLength});let w={resourceTag:p.resourceTag,version:p.version,contentLength:p.contentLength};for(let c of d.putHandlers)try{c(w)}catch{}return}if(u.type==="objstore-deleted"&&typeof u.workspaceTag=="string"&&typeof u.resourceTag=="string"&&typeof u.version=="number"){let d=i.get(u.workspaceTag);if(!d)return;let p=u.resourceTag,w=u.version;d.seenVersions.delete(p),d.inventory.delete(p);let c={resourceTag:p,version:w};for(let P of d.deletedHandlers)try{P(c)}catch{}return}if(!(u.type==="workspace-state"||u.type==="workspace-save-ack"||u.type==="workspace-save-error"||u.type==="workspace-subscribed"||u.type==="authenticated")){for(let d=0;d<f.length;d++)if(f[d].predicate(u)){let p=f[d];f.splice(d,1),p.resolve(u);return}if(l.push(u),l.length>Ct){let d=l.splice(0,l.length-Ct),p=[...new Set(d.map(w=>w.type??"<no-type>"))].slice(0,4);console.warn(`objstore: dropping ${d.length} unmatched frame(s) over MAX_QUEUE_SIZE=${Ct} (types: ${p.join(", ")})`)}}}function J(){for(let u of i.values())u.closed||u.connected||(u.connected=!0,u.resolveConnected())}function te(u){D(u);for(let d of i.values())d.closed||d.connected&&(d.connected=!1,b(d))}let _=o.addConsumer({onMessage:Z,onConnected:J,onDisconnected:te}),V=u=>yo(u,n);async function W(u,d){if(await u.connectedPromise,u.closed)throw new Error("objstore: session closed");let p=o.getNonce();if(!p)throw new Error("objstore: socket not open");let w=await Et(d.bytes),c={workspaceTag:u.workspaceTag,resourceTag:d.resourceTag,prevVersion:d.prev?.version??null,prevIncarnation:d.prev?.incarnation??null,expectedLength:d.bytes.byteLength,contentHash:w},P=await Ln(u.signingKey,c,p),g,h=!1;for(;R({type:"objstore-put-begin",...c,signature:P}),g=await k(z=>z.workspaceTag===u.workspaceTag&&z.resourceTag===d.resourceTag&&(z.type==="objstore-put-token"||z.type==="objstore-put-error"||z.type==="objstore-conflict"||z.type==="unauthorized"&&z.kind==="gated")),!(g.type!=="unauthorized"||h||(h=!0,!await o.runAuthFlow())););if(g.type==="unauthorized")return{ok:!1,reason:"unauthorized"};if(g.type==="objstore-put-error"){if(g.reason==="workspace-full")return{ok:!1,reason:"workspace-full"};throw new Error(`objstore: put-error reason='${String(g.reason)}'`)}if(g.type==="objstore-conflict")return{ok:!1,reason:"conflict",current:Me(g.current)?Ne(g.current):null};if(typeof g.urlPath!="string"||typeof g.token!="string")throw new TypeError("objstore: malformed put-token (missing urlPath/token)");let x=await globalThis.fetch(V(g.urlPath),{method:"PUT",headers:{authorization:`Bearer ${g.token}`,"content-type":"application/octet-stream"},body:d.bytes});if(!x.ok){if(x.status===409||x.status===410)return{ok:!1,reason:"conflict",current:x.status===409?await ho(x):null};let Y="";try{Y=await x.text()}catch{}throw new Error(`objstore: REST PUT failed ${x.status} ${Y.slice(0,200)}`)}let O;try{O=await x.json()}catch{throw new TypeError("objstore: PUT ack JSON parse failed")}if(!O||typeof O!="object"||typeof O.version!="number"||typeof O.incarnation!="string"||typeof O.contentHash!="string"||typeof O.contentLength!="number")throw new TypeError("objstore: PUT ack malformed (missing version/incarnation/contentHash/contentLength)");let $=O;if($.contentHash!==w||$.contentLength!==d.bytes.byteLength)throw new Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${$.contentHash.slice(0,16)}\u2026 length=${$.contentLength}, client signed ${w.slice(0,16)}\u2026 length=${d.bytes.byteLength}`);return{ok:!0,meta:$}}async function U(u,d){for(let p=0;p<Hn;p++){let w=await N(u,d);if(w.kind==="ok")return w.value;if(w.kind==="not-found")return null;p+1<Hn&&await new Promise(c=>{setTimeout(c,go)})}return null}async function N(u,d){if(await u.connectedPromise,u.closed)throw new Error("objstore: session closed");let p=o.getNonce();if(!p)throw new Error("objstore: socket not open");let w=await Mn(u.signingKey,u.workspaceTag,d,p);R({type:"objstore-fetch",workspaceTag:u.workspaceTag,resourceTag:d,signature:w});let c=await k(O=>O.workspaceTag===u.workspaceTag&&O.resourceTag===d&&(O.type==="objstore-fetch-token"||O.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"||!Me(c))throw new TypeError("objstore: malformed fetch-token (missing urlPath / token / metadata)");let P=Ne(c),g=await globalThis.fetch(V(c.urlPath),{method:"GET",headers:{authorization:`Bearer ${c.token}`}});if(!g.ok){if(g.status===404||g.status===503)return{kind:"retry"};let O="";try{O=await g.text()}catch{}throw new Error(`objstore: REST GET failed ${g.status} ${O.slice(0,200)}`)}let h=new Uint8Array(await g.arrayBuffer()),x=await Et(h);if(x!==P.contentHash)throw new Error(`objstore: contentHash mismatch \u2014 expected ${P.contentHash.slice(0,16)}\u2026, got ${x.slice(0,16)}\u2026`);return{kind:"ok",value:{bytes:h,meta:P}}}async function I(u,d,p){if(await u.connectedPromise,u.closed)throw new Error("objstore: session closed");let w=o.getNonce();if(!w)throw new Error("objstore: socket not open");let c={workspaceTag:u.workspaceTag,resourceTag:d,prevVersion:p?.version??null,prevIncarnation:p?.incarnation??null},P=await Kn(u.signingKey,c,w);R({type:"objstore-delete",...c,signature:P});let g=await k(h=>h.workspaceTag===u.workspaceTag&&h.resourceTag===d&&(h.type==="objstore-deleted-ack"||h.type==="objstore-delete-error"||h.type==="objstore-conflict"));if(g.type==="objstore-deleted-ack"){if(typeof g.deletedVersion!="number")throw new TypeError("objstore: malformed deleted-ack (deletedVersion not a number)");return{ok:!0,deletedVersion:g.deletedVersion}}if(g.type==="objstore-conflict")return{ok:!1,reason:"conflict",current:Me(g.current)?Ne(g.current):null};if(g.reason==="not-found")return{ok:!1,reason:"not-found"};throw new Error(`objstore: delete-error reason='${String(g.reason)}'`)}function L(u,d,p,w){let c=u.seenVersions.get(d);if(c&&c.incarnation===p&&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 K(u,d){if(s)throw new Error("objstore: client closed");if(!d||typeof d.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 p=u.workspaceTag;if(d.workspaceTag!=null&&d.workspaceTag!==p)throw new Error("objstore: openWorkspace \u2014 WorkspaceSubscription is for a different workspace than these keys");if(i.has(p))throw new Error(`objstore: workspace ${p.slice(0,8)}\u2026 is already open on this client`);let w={workspaceTag:p,signingKey:u.signingKey,contentKey:new Uint8Array(u.contentKey),tagKey:new Uint8Array(u.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,connected:!1,closed:!1};b(w),T(w),i.set(p,w);let c=w;(async()=>{let v;try{v=await d.resources}catch{return}c.closed||B(c,m(v))})();let P=o.acquire();a.set(p,P),o.getNonce()&&(c.connected=!0,c.resolveConnected());let g=null;try{await new Promise((v,A)=>{g=setTimeout(()=>{A(new Error(`objstore: connect timeout after ${t}ms`))},t),c.connectedPromise.then(()=>v(),E=>A(E))})}catch(v){g&&clearTimeout(g),i.delete(p),a.delete(p),c.closed=!0;try{c.contentKey.fill(0)}catch{}try{c.tagKey.fill(0)}catch{}throw P.release(),v}g&&clearTimeout(g);async function h(v,A,E){let F=await W(c,{resourceTag:v,bytes:A,prev:E});return F.ok?(E==null&&c.seenVersions.delete(v),y(c,v,F.meta.incarnation,F.meta.version),c.inventory.set(v,{version:F.meta.version,incarnation:F.meta.incarnation,contentLength:F.meta.contentLength}),{ok:!0,meta:{version:F.meta.version,incarnation:F.meta.incarnation,contentLength:F.meta.contentLength}}):F.reason==="workspace-full"?{ok:!1,reason:"workspace-full"}:F.reason==="unauthorized"?{ok:!1,reason:"unauthorized"}:(F.current&&y(c,v,F.current.incarnation,F.current.version),{ok:!1,reason:"conflict",current:F.current})}async function x(v){let A=await ce(c.tagKey,v.fileName),E=Tt(c.contentKey,v.fileName,v.content,p,A);return await h(A,E,v.prev)}async function O(v){let A=await ce(c.tagKey,v),E=await U(c,A);if(!E)return null;L(c,A,E.meta.incarnation,E.meta.version);let{fileName:F,content:ze}=Ye(c.contentKey,E.bytes,p,A);if(F!==v)throw new Error(`objstore: fileName-binding mismatch \u2014 requested '${v}', payload encoded '${F}'`);return y(c,A,E.meta.incarnation,E.meta.version),{content:ze,version:E.meta.version,incarnation:E.meta.incarnation}}async function $(v){let A=await U(c,v);if(!A)return null;L(c,v,A.meta.incarnation,A.meta.version);let{fileName:E,content:F}=Ye(c.contentKey,A.bytes,p,v);if(await ce(c.tagKey,E)===v)return y(c,v,A.meta.incarnation,A.meta.version),{kind:"report",fileName:E,content:F,version:A.meta.version,incarnation:A.meta.incarnation};if(await fe(c.tagKey,E)===v){let{name:gt,content:Tr}=xt(F);return y(c,v,A.meta.incarnation,A.meta.version),{kind:"bundle",integrity:E,name:gt,content:Tr,version:A.meta.version,incarnation:A.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 Y(v,A){let E=await I(c,v,A);return E.ok?(c.seenVersions.delete(v),c.inventory.delete(v),E):E.reason==="not-found"?{ok:!1,reason:"not-found"}:(E.current&&y(c,v,E.current.incarnation,E.current.version),{ok:!1,reason:"conflict",current:E.current})}async function z(v,A){let E=await ce(c.tagKey,v);return await Y(E,A)}async function pe(){if(await S(c),c.closed)throw new Error("objstore: session closed");return[...c.inventory.entries()].map(([v,A])=>({resourceTag:v,version:A.version,incarnation:A.incarnation,contentLength:A.contentLength}))}async function ge(v){let A=await fe(c.tagKey,v.integrity),E=On(v.name,v.content),F=Tt(c.contentKey,v.integrity,E,p,A);return await h(A,F,v.prev)}async function Sr(v){let A=await fe(c.tagKey,v),E=await U(c,A);if(!E)return null;L(c,A,E.meta.incarnation,E.meta.version);let{fileName:F,content:ze}=Ye(c.contentKey,E.bytes,p,A);if(F!==v)throw new Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${v}', payload encoded '${F}'`);let{name:sn,content:gt}=xt(ze);return y(c,A,E.meta.incarnation,E.meta.version),{name:sn,content:gt,version:E.meta.version,incarnation:E.meta.incarnation}}async function kr(v,A){let E=await fe(c.tagKey,v);return await Y(E,A)}return{put:x,fetch:O,fetchByTag:$,delete:z,list:pe,putBundle:ge,fetchBundle:Sr,deleteBundle:kr,onPut(v){return c.putHandlers.add(v),()=>{c.putHandlers.delete(v)}},onDeleted(v){return c.deletedHandlers.add(v),()=>{c.deletedHandlers.delete(v)}},close(){if(c.closed)return;c.closed=!0,i.delete(p);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 v=a.get(p);a.delete(p),v&&v.release()}}}function M(){if(!s){s=!0;for(let u of i.values()){u.closed=!0;try{u.contentKey.fill(0)}catch{}try{u.tagKey.fill(0)}catch{}try{u.rejectConnected(new Error("objstore: client closed"))}catch{}try{u.rejectListed(new Error("objstore: client closed"))}catch{}}i.clear();for(let u of a.values())u.release();a.clear(),_.remove(),r&&o.close()}}return{openWorkspace:K,close:M}}async function ho(e){try{let t=await e.json();if(typeof t.currentVersion=="number"&&Number.isSafeInteger(t.currentVersion)&&typeof t.currentIncarnation=="string")return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function Me(e){return!e||typeof e!="object"?!1:typeof e.resourceTag=="string"&&typeof e.version=="number"&&typeof e.incarnation=="string"&&typeof e.contentHash=="string"&&typeof e.contentLength=="number"&&typeof e.signature=="string"}function Ne(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var Ot=null;function Wn(e){Ot=typeof e=="function"?e:null}var mo=et({serverUrl:"",authResolver:e=>Ot==null?Promise.resolve(null):Ot(e)});function tt(){return mo}var $n=new Set(["busy"]);function bo(e){return typeof e?.color=="string"?e.color:""}function wo(e){return e?.triage==="fixed"||e?.triage==="invalid"||e?.triage==="deleted"?e.triage:e?.deleted?"deleted":""}function vo(e){return typeof e?.comment=="string"?e.comment:""}function So(e){return typeof e?.fix=="string"?e.fix:""}function _n(e,t,n){let r=[];for(let o of Object.keys(e)){let s=e[o],i=t[o],a=n[o],l=s??null,f=[{name:"color",norm:bo},{name:"triage",norm:wo},{name:"comment",norm:vo},{name:"fix",norm:So}];for(let{name:y,norm:b}of f){let T=b(i),B=b(l),m=b(a);B!==T&&m!==T&&B!==m&&r.push({id:o,property:y,local:B,imported:m})}}return r}function ko(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 s of r)if(!o.has(s))return!1;return!0}function Vn(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??"")&&ko(e.ignoredReports,t.ignoredReports)}function jt(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!Vn(e[r]??{},t[r]??{}))return!1;return!0}function nt(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 Ut(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r){let s=e[o]??{},i=t[o]??{};Vn(s,i)||(n[o]=t[o]??null)}return n}function zn(e){for(let t in e)return!1;return!0}function qn(e){return e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function de(e){if(e)return qn(e.triage)??(e.deleted?"deleted":void 0)}function To(e){return e?!e.color&&!de(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0):!0}function rt(e){if(!e||typeof e!="object")return;let t=e,n={};typeof t.color=="string"&&t.color&&(n.color=t.color);let r=qn(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),Array.isArray(t.ignoredReports)){let o=t.ignoredReports.filter(s=>typeof s=="string"&&s.length>0);o.length>0&&(n.ignoredReports=o)}return To(n)?void 0:n}function xo(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 s of r)if(!o.has(s))return!1;return!0}function Gn(e,t){let n=e??{},r=t??{};return(n.color??"")===(r.color??"")&&(de(n)??"")===(de(r)??"")&&(n.comment??"")===(r.comment??"")&&(n.fix??"")===(r.fix??"")&&xo(n.ignoredReports,r.ignoredReports)}function se(e,t,n){let r=e.get(t),o=rt({...r,...n});return o===void 0?e.delete(t):Gn(r,o)?!1:(e.set(t,o),!0)}function Jn(e,t,n){let r=rt(n),o=e.get(t);return r===void 0?e.delete(t):Gn(o,r)?!1:(e.set(t,r),!0)}function Yn(e,t,n,r){let o=new Set(e.get(t)?.ignoredReports??[]);return r?o.add(n):o.delete(n),se(e,t,{ignoredReports:o.size>0?[...o]:void 0})}function Pe(e,t){let n=Object.assign(Object.create(null),e),r=ne().state,o=t instanceof Set?t:new Set(t);for(let s of o){let i=rt(r.triage.get(s));i?n[s]=i:delete n[s]}return n}function Lt(e,t){let n=ne().state,r=[];for(let o of t){let s=e[o];if(!s||typeof s!="object")continue;let i=n.triage.get(o);if(s.color){let f=i?.color;f===void 0?se(n.triage,o,{color:s.color}):f!==s.color&&r.push({id:o,property:"color",local:f,imported:s.color})}let a=de(s);if(a){let f=de(i);f===void 0?se(n.triage,o,{triage:a}):f!==a&&r.push({id:o,property:"triage",local:f,imported:a})}if(s.comment){let f=i?.comment;f===void 0?se(n.triage,o,{comment:s.comment}):f!==s.comment&&r.push({id:o,property:"comment",local:f,imported:s.comment})}if(s.fix){let f=i?.fix;f===void 0?se(n.triage,o,{fix:s.fix}):f!==s.fix&&r.push({id:o,property:"fix",local:f,imported:s.fix})}if(!(a!=null||de(i)!=null||!Array.isArray(s.ignoredReports))&&!((i?.ignoredReports?.length??0)>0))for(let f of s.ignoredReports)typeof f=="string"&&Yn(n.triage,o,f,!0)}return r}function Kt(e,t){let n=ne().state;for(let r of e){let o=`${r.id}:${r.property}`;t[o]==="imported"&&Ao(r.id,r.property)===r.local&&(r.property==="color"?se(n.triage,r.id,{color:r.imported}):r.property==="comment"?se(n.triage,r.id,{comment:r.imported}):r.property==="fix"?se(n.triage,r.id,{fix:r.imported}):r.property==="triage"&&(r.imported==="fixed"||r.imported==="invalid"||r.imported==="deleted"?se(n.triage,r.id,{triage:r.imported,ignoredReports:void 0}):se(n.triage,r.id,{triage:void 0})))}}function Ao(e,t){let n=ne().state.triage.get(e);return t==="color"?n?.color??"":t==="triage"?de(n)??"":t==="comment"?n?.comment??"":t==="fix"?n?.fix??"":""}function Xn(e,t){let n=ne().state,r=t instanceof Set?t:new Set(t);for(let o of r){let s=e[o],i=de(s)?void 0:s?.ignoredReports;Jn(n.triage,o,{...s,ignoredReports:i})}}var Nt="deepview.sync.sessions",Eo=Nt,Mt=1,st=!1,ot=new Set;function Qn(){return st}function Ie(e){if(st!==e){st=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 Zn(e){return ot.add(e),queueMicrotask(()=>{if(ot.has(e))try{e(st)}catch(t){console.warn("persistenceDegraded listener:",t)}}),()=>ot.delete(e)}function it(){try{let e=ne().getSecureItem(Nt);if(!e)return{kind:"empty"};let t=JSON.parse(e);if(!t||typeof t!="object")return{kind:"empty"};let n=t;return n.version===Mt&&n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions)?{kind:"v1",map:n.sessions}:n.version===Mt?{kind:"empty"}:"version"in n?{kind:"unknown-version"}:{kind:"legacy",map:n}}catch{return{kind:"empty"}}}function Bo(){let e=it();return e.kind==="v1"||e.kind==="legacy"?e.map:{}}async function Po(e){try{return await ne().setSecureItem(Nt,JSON.stringify({version:Mt,sessions:e})),!0}catch(t){return console.warn("Triage sync: could not persist session state:",t),!1}}function It(e,t){if(!t)return null;let r=Bo()[e];return!r||r.serverUrl!==t?null:{baseRevision:typeof r.baseRevision=="string"?r.baseRevision:null,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 at(e){await navigator.locks.request(Eo,async()=>{let t=it();if(t.kind==="unknown-version"){Ie(!0);return}let n=t.kind==="v1"||t.kind==="legacy"?t.map:{};if(await e(n)===!1)return;let o=await Po(n);Ie(!o)})}function Ft(e=null){at(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(ne().listWorkspaces().map(s=>s.id)),o=!1;for(let s of n){let i=t[s];(!r.has(s)||e!=null&&i?.serverUrl!==e)&&(delete t[s],o=!0)}return o?void 0:!1}).catch(t=>{console.warn("Triage sync: prunePersistedSessions lock failed:",t)})}function ct(e){return at(t=>{if(!(e in t))return!1;delete t[e]})}var sr,We,lt,er,ir,Ro="deepview.triageSyncUrl",ar="deepview.sync.userEnabled",Co=/^\d+$/u,zt=()=>{},De=null,ye="",He=!0,Wt=!1,ee=tt(),Fe=null,be=100,Oo=5;function ut(){return He&&!Wt&&!!ye&&jo()}function jo(){try{return We().length>0}catch{return!1}}var $t=new Set;function cr(){if(!ut())return"off";for(let t of C.values())if(t.error)return"error";let e=ee.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return"offline";for(let t of C.values())if(t.subscribed&&!t.subscribeAcked)return"connecting";return"online"}var tr="off";function X(){let e=cr();if(e!==tr){tr=e;for(let t of $t)try{t(e)}catch(n){console.warn("Triage sync status listener:",n)}}}var _t=0,C=new Map;function nr(e){for(let t of C.values())if(t.workspaceTag===e)return t;return null}function ie(e){return C.get(e.workspaceId)===e}function rr(e){if(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 lr(e){let t=new Set,n=We().find(o=>o.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let o of sr.reports)if(r.has(o.fileName))for(let s of o.groups)for(let i of s){let a=i.id??String(i._id);Co.test(a)||t.add(a)}return t}function qt(e){let t=lr(e.workspaceId),n=[];for(let o of t)e.ids.has(o)||n.push(o);let r=[];return n.length>0&&(r=Lt(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function Uo(){let e=it();e.kind==="unknown-version"?Ie(!0):(e.kind==="v1"||e.kind==="legacy")&&Ie(!1),Fn(),ee.resetCachedReplayGuard()}function ur(e){if(!e||!ye)return;let t=ye;at(n=>{n[e.workspaceId]={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState}}).catch(n=>{console.warn("Triage sync: persistSession lock failed:",n)})}function Vt(e){let t=We().find(r=>r.id===e.workspaceId);if(!t){e.error="workspace no longer exists",X();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,o]=await Promise.all([Tn(t.privateKey),Je(t.privateKey,e.workspaceId)]);if(C.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=o.privateKey,e.verifyingKey=o.publicKey,e.workspaceTag=o.publicKeyB64,ee.getSocket()?.readyState!==WebSocket.OPEN){we();return}Re(e),re(e),X()}catch(r){console.warn("Triage sync: key derivation failed:",r),C.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${r instanceof Error?r.message:String(r)}`,X())}})()}function fr(e){return ee.send(e)}function Re(e,t=!1){if(!e)return;let n=ee.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=ee.getNonce();if(r==null)return;let o=e.baseRevision,s=n,i=e.signingKey,a=e.workspaceTag;(async()=>{try{let l=await En(i,a,o,r);if(C.get(e.workspaceId)!==e||e.workspaceTag!==a||ee.getSocket()!==s||ee.getNonce()!==r)return;e.subscribed=!0,fr({type:"workspace-subscribe",workspaceTag:a,from:o,signature:l})}catch(l){console.warn("Triage sync: subscribe sign failed:",l)}})()}function re(e){if(!e||e.error)return;if(e.pending||e.encrypting){e.pendingSave=!0;return}if(!e.key||!e.signingKey||!e.workspaceTag){e.pendingSave=!0;return}qt(e),e.localState=Pe(e.baseState,e.ids);let t=ee.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=be,r=n?Object.create(null):e.baseState,o=Ut(r,e.localState);if(zn(o)&&!n)return;let s=e.baseRevision,i=e.key,a=e.signingKey,l=e.workspaceTag;e.encrypting=!0,(async()=>{try{let f=St(l,s),{nonce:y,ciphertext:b}=await Pn(i,o,f),T={publicKeyB64:l,base:s,keyframe:n,nonceB64:y,ciphertextB64:b},B=await An(a,T),m=await vt(T);if(C.get(e.workspaceId)!==e||e.workspaceTag!==l)return;if(e.baseRevision!==s){e.pendingSave=!0;return}e.pending={base:s,id:m,changeset:o,keyframe:n},e.pendingSave=!1;let S={type:"workspace-save",workspaceTag:l,base:s,nonce:y,ciphertext:b,signature:B};n&&(S.keyframe=!0),fr(S),e.consecutiveFailures=0,e.error&&(e.error=null,X())}catch(f){console.warn("Triage sync: encrypt/sign failed:",f),C.get(e.workspaceId)===e&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=Oo&&(e.error=`encrypt/sign failed: ${f instanceof Error?f.message:String(f)}`,X()))}finally{C.get(e.workspaceId)===e&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&(e.pendingSave=!1,re(e)))}})()}async function Lo(e,t){for(let n of t){if(!n||typeof n!="object"||typeof n.id=="string"&&n.id===e.baseRevision)continue;let r=e.baseRevision,o=!!n.keyframe;if(!(r==null?n.base==null||o:n.base===r))return console.warn(`Triage sync: chain base mismatch (expected ${r}, got ${n.base})`),!1;if(typeof n.signature!="string"||typeof n.nonce!="string"||typeof n.ciphertext!="string"||typeof n.id!="string")return console.warn("Triage sync: revision missing signature/nonce/ciphertext/id; resyncing"),e.savesSinceKeyframe=be,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let i=typeof n.base=="string"?n.base:null,a={publicKeyB64:e.workspaceTag,base:i,keyframe:o,nonceB64:n.nonce,ciphertextB64:n.ciphertext},l=await Bn(e.verifyingKey,a,n.signature);if(!ie(e))return!1;if(!l)return console.warn("Triage sync: revision signature did not verify; resyncing"),e.savesSinceKeyframe=be,!1;let f=await vt(a);if(!ie(e))return!1;if(n.id!==f)return console.warn("Triage sync: revision id does not match content hash; resyncing"),e.savesSinceKeyframe=be,!1;let y;try{let T=St(e.workspaceTag,i);y=await Rn(e.key,n.nonce,n.ciphertext,T)}catch(T){return console.warn("Triage sync: decrypt failed; resyncing",T),e.savesSinceKeyframe=be,!1}if(!ie(e))return!1;let b=o?Object.create(null):e.baseState;e.baseState=nt(b,y??{}),e.baseRevision=n.id,o?e.savesSinceKeyframe=0:e.savesSinceKeyframe=Math.min((e.savesSinceKeyframe??0)+1,be)}return!0}async function dr(e,t,n=[],r=null){if(ie(e)){e.localState=nt(e.baseState,t),_t++;try{Xn(e.localState,e.ids),r&&n.length>0&&(Kt(n,r),e.localState=Pe(e.baseState,e.ids)),ur(e),await lt()}finally{_t--}if(ie(e)){zt();for(let o of C.values())o!==e&&re(o)}}}function pr(e){return qt(e),e.localState=Pe(e.baseState,e.ids),Ut(e.baseState,e.localState)}async function Ko(e,t){if(e.pending&&t.base===e.pending.base&&typeof t.id=="string"&&t.id===e.pending.id){let n=pr(e),r=e.pending.keyframe?Object.create(null):e.baseState;if(e.baseState=nt(r,e.pending.changeset),e.baseRevision=t.id,e.savesSinceKeyframe=e.pending.keyframe?0:Math.min((e.savesSinceKeyframe??0)+1,be),e.pending=null,await dr(e,n),!ie(e))return;(e.pendingSave||!jt(e.localState,e.baseState))&&(e.pendingSave=!1,re(e));return}if(e.pending){let n=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}/${n})`);return}if(t.id!==e.baseRevision){let n=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${n}\u2026; pending was already cleared`),e.pendingSave=!0,re(e)}}async function Mo(e,t){if(!Array.isArray(t)||t.length===0||!e.key)return;let n=pr(e),r=e.baseRevision,o=e.baseState,s=await Lo(e,t);if(!ie(e))return;if(!s){if(!e.resyncAttempted){e.resyncAttempted=!0,console.warn("Triage sync: requesting catch-up from last known baseRevision"),Re(e,!0);return}console.warn("Triage sync: catch-up also broke continuity; full state push"),e.baseRevision=null,e.baseState=Object.create(null),e.pending=null,e.pendingSave=!1,e.resyncAttempted=!1,ur(e),zt(),re(e);return}if(e.resyncAttempted=!1,e.pending&&(e.pending=null,e.pendingSave=!0),e.baseRevision===r){if(!ie(e))return;e.pendingSave&&(e.pendingSave=!1,re(e));return}let i=_n(n,o,e.baseState),a=null;if(i.length>0&&De){try{a=await De(i,e.baseState,"chain")??null}catch(l){console.warn("Triage sync: chain-conflict resolver failed:",l)}if(!ie(e))return}await dr(e,n,i,a),ie(e)&&(e.pendingSave||!jt(e.localState,e.baseState))&&(e.pendingSave=!1,re(e))}async function No(e){if(e.type==="authenticated"){for(let n of C.values())Re(n),re(n);return}if(e.type==="unauthorized"){if(e.kind==="gated"){if(typeof e.workspaceTag=="string"){let n=nr(e.workspaceTag);n&&typeof e.resourceTag!="string"&&Io(n,e)}ee.runAuthFlow().catch(n=>{console.warn("Triage sync: auth flow failed:",n)})}return}if(typeof e.workspaceTag!="string")return;let t=nr(e.workspaceTag);if(t){if(e.type==="workspace-save-ack")await Ko(t,e);else if(e.type==="workspace-state")await Mo(t,e.revisions);else if(e.type==="workspace-save-error")Ho(t,e);else if(e.type==="workspace-subscribed"){t.subscribeAcked=!0;let n=Array.isArray(e.resources)?e.resources:[],r=t.objstoreResourceWaiters.splice(0);for(let o of r)try{o(n)}catch{}X()}}}function Io(e,t){e.pending&&(typeof t.base!="string"&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var Fo=/^[\w-]+$/u;function Ho(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&&Fo.test(n)?n:"rejected";if(e.pending=null,$n.has(r)){e.pendingSave=!0;return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,X()}var or=Promise.resolve();function Do(e){or=or.then(()=>No(e)).catch(t=>{console.warn("Triage sync handler error:",t)})}function Wo(e){for(let t of C.values())t.pending=null,t.pendingSave=!1,Re(t),re(t);X()}function $o(e){for(let t of C.values())t.pending=null,t.subscribed=!1,t.subscribeAcked=!1,t.resyncAttempted=!1,t.pendingSave=!0;X()}ee.addConsumer({onMessage:Do,onConnected:Wo,onDisconnected:$o});function we(){ut()?Fe||(Fe=ee.acquire()):Fe&&(Fe.release(),Fe=null)}function _o(e){zt=typeof e=="function"?e:()=>{}}function Vo(e){De=typeof e=="function"?e:null}function zo(e){Wn(e)}function Ht(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&Vt(e)}function Dt(e){e.pending=null,e.pendingSave=!1,e.encrypting=!1,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1}var ve={setServerUrl(e){let t=(e??"").trim();if(t===ye)return;let n=ye;ye=t,t&&Ft(t),n&&t&&n!==t&&Ke(null).catch(r=>{console.warn("Triage sync: failed to drop cached auth password on server change:",r)}),ee.setServerUrl(t);for(let r of C.values()){Dt(r);let o=t?It(r.workspaceId,t):null;r.baseRevision=o?.baseRevision??null,r.baseState=o?.baseState??Object.create(null),r.savesSinceKeyframe=o?.savesSinceKeyframe??0,r.localState=Pe(r.baseState,r.ids),Ht(r)}we(),X()},setEnabled(e){let t=!!e;if(t!==He){if(He=t,ir(ar,t?"1":"0").catch(n=>{console.warn("Triage sync: could not persist user-enabled:",n)}),ut())for(let n of C.values())Ht(n);else for(let n of C.values())Dt(n);we(),X()}},isEnabled(){return He},setForcedOff(e){let t=!!e;if(t!==Wt){if(Wt=t,ut())for(let n of C.values())Ht(n);else for(let n of C.values())Dt(n);we(),X()}},getServerUrl(){return ye},get connected(){return ee.getSocket()?.readyState===WebSocket.OPEN},get status(){return cr()},onStatusChange(e){return $t.add(e),()=>$t.delete(e)},notify(){if(!(_t>0))for(let e of C.values())re(e)},ensureSubscription(e){let t=C.has(e);ve.openSession(e);let n=C.get(e);if(!n)return null;let r=new Promise(o=>{n.objstoreResourceWaiters.push(o)});return t&&Re(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||C.has(e)||!We().find(i=>i.id===e))return;let n=lr(e),r=It(e,ye),o=r?.baseState??Object.create(null);Lt(o,n);let s={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:n,baseRevision:r?.baseRevision??null,baseState:o,savesSinceKeyframe:r?.savesSinceKeyframe??0,localState:Pe(o,n),pending:null,pendingSave:!1,key:null,encrypting:!1,subscribed:!1,subscribeAcked:!1,resyncAttempted:!1,consecutiveFailures:0,error:null,objstoreResourceWaiters:[]};C.set(e,s),Vt(s),we(),X()},closeSession(e){if(e==null){for(let t of C.values())rr(t);C.clear()}else{let t=C.get(e);t&&rr(t),C.delete(e)}X()},refreshSession(e){let t=C.get(e);if(!t){console.debug("triage-sync: refreshSession bail \u2014 no session for",e,"(caller must openSession first)");return}gr(t)},sessionInfo(e){let t=C.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[...C.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...C.keys()]:[e],n=!1;for(let r of t){let o=C.get(r);!o||!o.error||(o.error=null,o.consecutiveFailures=0,n=!0,!o.key||!o.signingKey?Vt(o):ee.getSocket()?.readyState===WebSocket.OPEN&&(Re(o),re(o)))}n&&X()},get persistenceDegraded(){return Qn()},onPersistenceDegraded(e){return Zn(e)}};Xe(e=>{sr=e.state,We=e.listWorkspaces,lt=e.saveTriage,er=e.getSecureItem,ir=e.setSecureItem,e.onSecureStorageHydrated(Uo);try{localStorage.removeItem(Ro),er(ar)==="0"&&(He=!1),we()}catch{}e.onWorkspaceDeleted(t=>{let n=C.delete(t);ct(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)}),we(),n&&X()}),e.onWorkspacePrivateKeyChanged(t=>{let n=C.get(t);if(!n){ct(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)});return}n.signingKey=null,n.key=null,n.verifyingKey=null,n.workspaceTag=null,(async()=>{await ct(t),C.delete(t),ve.openSession(t),X()})().catch(r=>{console.warn("Triage sync: privateKey rotation IIFE failed:",r),C.delete(t),X()})}),e.onReportMembershipChanged(t=>{ve.openSession(t);let n=C.get(t);n&&gr(n)}),Ft()});function gr(e){let{conflicts:t,hydrated:n}=qt(e);(async()=>{if(t.length===0){n?await lt():re(e);return}let r=null;if(De)try{r=await De(t,e.baseState,"attach")}catch(o){console.warn("Triage sync: hydration conflict resolver failed:",o)}ie(e)&&(r&&Kt(t,r),await lt())})().catch(r=>{console.warn("Triage sync: refreshAndPropagate failed:",r)})}async function Gt(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var Se,Yt,Xt,Zt,en,tn,dt,br,wr,nn,rn,H=new Map,Qt=new Set,qo="deepview.objstore-presence.";function on(e){return qo+e}function Go(e){try{let t=localStorage.getItem(on(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:{},localVersions:n.localVersions&&typeof n.localVersions=="object"?n.localVersions:{}}}catch{return null}}function Oe(e,t){try{let n={names:Object.fromEntries(t.remoteNameByTag),bundles:Object.fromEntries(t.remoteBundleByTag),bundleNames:Object.fromEntries(t.remoteBundleNameByIntegrity),localVersions:Object.fromEntries(t.localVersions)};localStorage.setItem(on(e),JSON.stringify(n))}catch(n){console.warn(`objstore-presence: cache persist failed for ${e}:`,n)}}function yr(e){try{localStorage.removeItem(on(e))}catch{}}var Jt=null;function Jo(e){return Jt||(Jt=Dn({serverUrl:"",httpOrigin:e,transport:tt()})),Jt}var $e=new Set,_e=new Set;function le(){for(let e of Qt)try{e()}catch{}}function Yo(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 hr=256;function vr(e){return typeof e!="string"?"":e.length<=hr?e:e.slice(0,hr)}function Xo(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 Ce(e){if(H.has(e))return;let t=Se().find(s=>s.id===e);if(!t)return;let n=ve.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,remoteVersions:new Map,localVersions:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};H.set(e,r),r.ready=(async()=>{if(r.keys=await kt(t.privateKey,t.id),r.disposed)return;let s=new Map;for(let f of t.reports??[]){let y=await ce(r.keys.tagKey,f);r.fileTags.set(f,y),s.set(y,f)}if(r.disposed)return;let i=new Map;for(let f of t.bundles??[]){let y=await fe(r.keys.tagKey,f);r.bundleTags.set(f,y),i.set(y,f)}if(r.disposed)return;try{let f=await dt();if(r.disposed)return;for(let y of f)r.bundleTags.has(y.integrity)&&r.remoteBundleNameByIntegrity.set(y.integrity,y.name)}catch(f){console.warn(`objstore-presence: listBundles failed during ${e} open:`,f)}le();let a=ve.getServerUrl();if(!a)return;let l=Xo(a);if(l)try{let y=await Jo(l).openWorkspace(r.keys,n);if(r.disposed){try{y.close()}catch{}return}r.session=y,o();let b=await y.list();if(r.disposed)return;for(let m of b){r.remoteTags.add(m.resourceTag);let S=r.remoteVersions.get(m.resourceTag);(S===void 0||m.version>S)&&r.remoteVersions.set(m.resourceTag,m.version)}let T=Go(e),B=!1;if(T&&T.localVersions)for(let m of r.remoteTags){let S=T.localVersions[m];typeof S=="number"&&r.localVersions.set(m,S)}for(let m of r.remoteTags){let S=s.get(m);S!==void 0&&!r.remoteNameByTag.has(m)&&(r.remoteNameByTag.set(m,S),B=!0);let k=i.get(m);if(k!==void 0&&!r.remoteBundleByTag.has(m)&&(r.remoteBundleByTag.set(m,k),B=!0),T){let R=T.names[m];typeof R=="string"&&!r.remoteNameByTag.has(m)&&!r.remoteBundleByTag.has(m)&&(r.remoteNameByTag.set(m,R),r.fileTags.set(R,m),B=!0);let D=T.bundles[m];if(typeof D=="string"&&!r.remoteBundleByTag.has(m)&&!r.remoteNameByTag.has(m)){r.remoteBundleByTag.set(m,D),r.bundleTags.set(D,m);let Z=T.bundleNames[D];typeof Z=="string"&&!r.remoteBundleNameByIntegrity.has(D)&&r.remoteBundleNameByIntegrity.set(D,Z),B=!0}}}(B||T)&&Oe(e,r),le(),ft(r);for(let m of r.remoteTags){let S=r.localVersions.get(m),k=r.remoteVersions.get(m);typeof S!="number"||typeof k!="number"||k>S&&mr(r,m).catch(()=>{})}}catch(f){r.err=f}})();function o(){let s=r.session;s.onPut(({resourceTag:i,version:a})=>{let l=r.remoteVersions.get(i),f=r.remoteTags.has(i)&&typeof l=="number"&&a>l;if(r.remoteTags.add(i),(l===void 0||a>l)&&r.remoteVersions.set(i,a),le(),f){mr(r,i).catch(()=>{});return}ft(r)}),s.onDeleted(({resourceTag:i})=>{r.remoteTags.delete(i),r.remoteVersions.delete(i),r.localVersions.delete(i);let a=r.remoteNameByTag.get(i);r.remoteNameByTag.delete(i);let l=Se().find(T=>T.id===e),f=l?.reports??[],y=l?.bundles??[];a&&!f.includes(a)&&r.fileTags.delete(a);let b=r.remoteBundleByTag.get(i);r.remoteBundleByTag.delete(i),b&&(r.remoteBundleNameByIntegrity.delete(b),y.includes(b)||r.bundleTags.delete(b)),Oe(e,r),le()})}r.ready.catch(()=>{})}function Ve(e){let t=H.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}H.delete(e),le()}}Xe(e=>{Se=e.listWorkspaces,Yt=e.addReportToWorkspace,Xt=e.addBundleToWorkspace,Zt=e.analyzeContent,en=e.setCount,tn=e.gunzipBytes,dt=e.listBundles,br=e.listFiles,wr=e.readBundle,nn=e.saveBundle,rn=e.saveFileBytes,e.onReportMembershipChanged(t=>{H.has(t)||Ce(t);let n=H.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)||es(t,o).catch(()=>{})}),e.onBundleMembershipChanged(t=>{H.has(t)||Ce(t);let n=H.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)||ns(t,o).catch(()=>{})}),e.onWorkspaceDeleted(t=>{Ve(t),yr(t)}),e.onWorkspacePrivateKeyChanged(t=>{H.has(t)&&(Ve(t),yr(t),Ce(t))})});function Qo(){return Array.from(H.keys())}function Zo(e,t){let n=H.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function es(e,t){let n=H.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await ce(n.keys.tagKey,t)),n.disposed||le()))}function ts(e,t){let n=H.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function ns(e,t){let n=H.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await fe(n.keys.tagKey,t)),n.disposed||le()))}function rs(e){return Qt.add(e),()=>Qt.delete(e)}function os(e){return $e.add(e),()=>$e.delete(e)}function ss(e){return _e.add(e),()=>_e.delete(e)}function is(e){let t=H.get(e);return t?t.remoteTags.size:0}async function as(e){let t=H.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ft(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function cs(e){let t=H.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ft(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function ls(e,t){let n=H.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}async function ft(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=[];for(let s of e.remoteTags){if(e.remoteNameByTag.has(s)&&n.has(e.remoteNameByTag.get(s)))continue;if(e.remoteBundleByTag.has(s)){let a=e.remoteBundleByTag.get(s);if(e.remoteBundleNameByIntegrity.has(a)&&r.has(a))continue}let i=e.inFlight.get(s);i||(i=e.session.fetchByTag(s).then(async a=>(e.inFlight.delete(s),!a||e.disposed||!e.remoteTags.has(s)?null:a.kind==="bundle"?(e.remoteBundleByTag.set(s,a.integrity),e.bundleTags.set(a.integrity,s),a.name&&e.remoteBundleNameByIntegrity.set(a.integrity,a.name),await fs(e,s,a.integrity,a.name,a.content),null):(e.remoteNameByTag.set(s,a.fileName),e.fileTags.set(a.fileName,s),await us(e,s,a.fileName,a.content),null)),()=>(e.inFlight.delete(s),null)),e.inFlight.set(s,i)),o.push(i)}o.length!==0&&(await Promise.all(o),!e.disposed&&(Oe(e.workspaceId,e),le()))}async function us(e,t,n,r){if(e.disposed||!e.remoteTags.has(t))return;let o=Se().find(l=>l.id===e.workspaceId);if(o&&Array.isArray(o.reports)&&o.reports.includes(n))return;let s;try{let l=await br();if(e.disposed||!e.remoteTags.has(t))return;s=l.includes(n)}catch(l){console.warn(`auto-download: listFiles failed before saving "${n}":`,l);return}if(s){if(e.disposed||!e.remoteTags.has(t))return;try{await Yt(n,e.workspaceId)}catch(l){console.warn(`auto-download: attaching local "${n}" to workspace "${e.workspaceId}" failed:`,l);return}if(e.disposed)return;for(let l of $e)try{l(e.workspaceId,n)}catch{}return}let i;try{i=Ee(await tn(r))}catch(l){console.warn(`auto-download: gunzip/decode of "${n}" failed (likely forged peer payload):`,l);return}if(e.disposed||!e.remoteTags.has(t))return;let a=Zt(i);if(a.recognized){try{if(await rn(n,r),e.disposed||!e.remoteTags.has(t))return;en(n,a.count,a.source);let l=e.remoteVersions.get(t);if(typeof l=="number"&&e.localVersions.set(t,l),!e.remoteTags.has(t))return;await Yt(n,e.workspaceId),Oe(e.workspaceId,e)}catch(l){console.warn(`auto-download: persisting "${n}" to workspace "${e.workspaceId}" failed:`,l);return}if(!e.disposed)for(let l of $e)try{l(e.workspaceId,n)}catch{}}}async function mr(e,t){if(e.disposed||!e.remoteTags.has(t))return;let n;try{n=await e.session.fetchByTag(t)}catch(a){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,a);return}if(!n||e.disposed||!e.remoteTags.has(t)||n.kind==="bundle")return;let r=n.fileName,o=n.content,s;try{s=Ee(await tn(o))}catch(a){console.warn(`replace-refetch: gunzip/decode of "${r}" failed (likely forged peer payload):`,a);return}if(e.disposed||!e.remoteTags.has(t))return;let i=Zt(s);if(!i.recognized){console.warn(`replace-refetch: peer-uploaded replacement for "${r}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);return}try{if(await rn(r,o),e.disposed)return;en(r,i.count,i.source),typeof n.version=="number"&&e.localVersions.set(t,n.version),Oe(e.workspaceId,e)}catch(a){console.warn(`replace-refetch: saveFileBytes failed for "${r}":`,a);return}if(!e.disposed)for(let a of $e)try{a(e.workspaceId,r)}catch{}}async function fs(e,t,n,r,o){if(e.disposed||!e.remoteTags.has(t))return;let s;try{s=await dt()}catch(f){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,f);return}if(e.disposed||!e.remoteTags.has(t))return;if(s.some(f=>f.integrity===n)){try{await Xt(n,e.workspaceId)}catch(y){console.warn("auto-download: attach pre-existing bundle failed:",y);return}if(e.disposed)return;let f=s.find(y=>y.integrity===n)?.name??"";for(let y of _e)try{y(e.workspaceId,n,f)}catch{}return}let i=await Gt(o);if(e.disposed||!e.remoteTags.has(t))return;if(i!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${i}) \u2014 refusing to save`);return}let a=r&&r.length>0?r:`bundle-${n.slice(7,15)}`,l=vr(a);try{if(await nn(l,o),e.disposed||!e.remoteTags.has(t))return;await Xt(n,e.workspaceId)}catch(f){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,f);return}if(!e.disposed)for(let f of _e)try{f(e.workspaceId,n,l)}catch{}}async function je(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw new Error(`Objstore session is not connected${Yo(e.err)}`)}async function pt(e){let t=await e(null);return!t.ok&&t.reason==="conflict"&&t.current&&(t=await e(t.current)),t}async function ds(e,t){let n=H.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);return await je(n),n.session.fetch(t)}async function ps(e,t,n){let r=H.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);await je(r);let o=await pt(s=>r.session.put({fileName:t,content:n,prev:s}));if(o.ok&&r.keys&&!r.disposed)try{let s=r.fileTags.get(t)??await ce(r.keys.tagKey,t);r.fileTags.set(t,s),r.remoteVersions.set(s,o.meta.version),r.localVersions.set(s,o.meta.version),Oe(r.workspaceId,r)}catch{}return o}async function gs(e,t){let n=!1;H.has(e)||(Ce(e),n=!0);try{let r=H.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await je(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.fileTags.has(t)||r.fileTags.set(t,await ce(r.keys.tagKey,t));let o=r.fileTags.get(t),s=await pt(i=>r.session.delete(t,i));return s.ok&&(r.remoteTags.delete(o),r.remoteNameByTag.delete(o),r.remoteVersions.delete(o),r.localVersions.delete(o),le()),s}finally{n&&Ve(e)}}async function ys(e,t){let n=H.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await je(n);let r=await wr(t),i=(await dt()).find(a=>a.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await pt(a=>n.session.putBundle({integrity:t,name:i,content:r,prev:a}))}async function hs(e,t){let n=H.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await je(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:"not-found"};if(await Gt(r.content)!==t)return{ok:!1,reason:"integrity-mismatch"};let s=r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`,i=vr(s);await nn(i,r.content);for(let a of _e)try{a(e,t,i)}catch{}return{ok:!0,integrity:t,name:i}}async function ms(e,t){let n=!1;H.has(e)||(Ce(e),n=!0);try{let r=H.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await je(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.bundleTags.has(t)||r.bundleTags.set(t,await fe(r.keys.tagKey,t));let o=r.bundleTags.get(t),s=await pt(i=>r.session.deleteBundle(t,i));return s.ok&&(r.remoteTags.delete(o),r.remoteBundleByTag.delete(o),le()),s}finally{n&&Ve(e)}}export{Ve as closeWorkspace,ms as deleteBundleFromRemote,gs as deleteFromRemote,cs as discoverRemoteBundleIntegrities,as as discoverRemoteFileNames,hs as fetchBundleFromRemote,ds as fetchFile,co as installSyncHost,ts as isBundleInRemote,Zo as isInRemote,os as onAutoDownloaded,ss as onBundleAutoDownloaded,rs as onChange,Ce as openWorkspace,Qo as openWorkspaceIds,ys as putBundleToRemote,ps as putFile,ls as remoteBundleName,is as remoteCount,zo as setAuthenticationResolver,Vo as setHydrationConflictResolver,_o as setRedraw,ve as triageSync};
|
|
14
|
+
`)})}return n}},et=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;constructor(t){super(),this.baseUrl=mo(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:bo;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},n)}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let s=new Promise(i=>{setTimeout(i,wo)});await Promise.race([this.inFlightPost.catch(()=>{}),s])}if(this.readyState===e.CLOSED)return;let t=this.outbound;this.outbound=[];let n={};this.cachedPassword!=null&&(n.password=this.cachedPassword),t.length>0&&(n.frames=t);let r=this.sessionId==null?this.baseUrl:`${this.baseUrl}?id=${encodeURIComponent(this.sessionId)}`,o=(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(a){this.readyState!==e.CLOSED&&console.warn("sse-transport: POST failed:",a),this.shutdown();return}if(!s.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${s.status} ${s.statusText}; closing`),this.shutdown();return}let i=s.body;if(!i){this.shutdown();return}this.consumeStream(i)})();this.inFlightPost=o,o.finally(()=>{this.inFlightPost===o&&(this.inFlightPost=null)})}async consumeStream(t){let n=t.getReader();this.activeReaders.add(n);let r=new Ot,o=new TextDecoder;try{for(;;){let{value:s,done:i}=await n.read();if(i)break;if(this.readyState===e.CLOSED)return;let a=r.parse(o.decode(s,{stream:!0}));for(let f of a)this.dispatchEvent_(f)}if(this.readyState!==e.CLOSED){let s=o.decode();if(s.length>0)for(let i of r.parse(s))this.dispatchEvent_(i)}}catch(s){this.readyState!==e.CLOSED&&(console.warn("sse-transport: stream read failed:",s),this.shutdown())}finally{this.activeReaders.delete(n);try{n.releaseLock()}catch{}}}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);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,vo=3e4;function nt(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,o=null,s=null,i=0,a=!1,f=null,c=tt,y=null,b=null,v=null,T=!1,m=null,k=new Set;function x(){f&&(clearTimeout(f),f=null)}function R(){x(),!a&&i!==0&&t&&(f=setTimeout(()=>{f=null,K()},c),c=Math.min(c*2,vo))}function D(){Z(),!(n<=0)&&(y=setInterval(()=>{!o||o.readyState!==o.OPEN||b||(U({type:"ping"}),b=setTimeout(()=>{b=null,console.warn("socket-transport: heartbeat timeout; closing socket");try{o?.close()}catch{}},r))},n))}function Z(){y&&(clearInterval(y),y=null),b&&(clearTimeout(b),b=null)}function J(p){for(let h of k)try{h.onDisconnected(p)}catch(E){console.warn("socket-transport: consumer.onDisconnected threw:",E)}}function te(p){for(let h of k)try{h.onConnected(p)}catch(E){console.warn("socket-transport: consumer.onConnected threw:",E)}}function _(p){for(let h of k)try{h.onMessage(p)}catch(E){console.warn("socket-transport: consumer.onMessage threw:",E)}}function V(p){let h;try{let E=typeof p.data=="string"?p.data:new TextDecoder().decode(p.data);h=JSON.parse(E)}catch(E){console.warn("socket-transport: dropping malformed wire frame:",E);return}if(!(!h||typeof h!="object")){if(h.type==="pong"){b&&(clearTimeout(b),b=null);return}if(h.type==="challenge"){if(typeof h.nonce!="string")return;s!=null&&s!==h.nonce&&J("session restarted"),s=h.nonce,te(s);return}if(h.type==="authenticated"){$(!0),_(h);return}if(h.type==="unauthorized"&&h.kind==="auth-failed"){$(!1);return}_(h)}}function $(p){if(!m)return;let h=m;m=null,h(p)}function U(p){if(!o||o.readyState!==o.OPEN)return!1;try{return o.send(JSON.stringify(p)),!0}catch(h){return console.warn("socket-transport: send failed:",h),!1}}function N(p){return new Promise(h=>{m=h,U({type:"authenticate",password:p})||(m=null,h(!1))})}function I(){if(v)return v;if(!o||o.readyState!==o.OPEN)return Promise.resolve(!1);let p=o,h=(async()=>{await Promise.resolve();try{let E=$n();if(E!=null&&!T){T=!0;let W=await N(E);if(o!==p)return!1;if(W)return!0;try{await Ke(null)}catch(Y){console.warn("socket-transport: failed to clear cached auth password:",Y)}}let O=!0;for(;;){if(o!==p||!o||o.readyState!==o.OPEN||!e.authResolver)return!1;let W;try{W=await e.authResolver({retry:!O})}catch(z){return console.warn("socket-transport: authentication resolver threw:",z),!1}if(o!==p||(O=!1,W==null||W===""))return!1;let Y=await N(W);if(o!==p)return!1;if(Y){try{await Ke(W)}catch(z){console.warn("socket-transport: failed to cache auth password:",z)}return!0}}}finally{v=null}})();return v=h,h}function L(p){if(!o)return;let h=o;o=null,s=null,T=!1,$(!1),Z(),J(p);try{h.close()}catch{}}function K(){a||o||i!==0&&t&&M(!1)}function M(p){if(a||i===0||!t)return;let h;try{h=p?new et(t):new WebSocket(t)}catch(O){if(!p){console.warn("socket-transport: WebSocket constructor failed; trying SSE fallback:",O),M(!0);return}console.warn("socket-transport: SSE constructor failed:",O),R();return}o=h,s=null,T=!1;let E=!1;h.addEventListener("open",()=>{o===h&&(E=!0,c=tt,D())}),h.addEventListener("message",O=>{o===h&&V(O)}),h.addEventListener("close",O=>{if(o!==h)return;if(o=null,s=null,T=!1,$(!1),Z(),!E&&!p&&!a&&i>0){if(typeof fetch>"u"){J("socket closed"),R();return}console.warn("socket-transport: WebSocket failed to open; falling back to SSE"),M(!0);return}O?.code===1001&&(c=tt),J("socket closed"),!a&&i>0&&R()}),h.addEventListener("error",()=>{})}function u(){if(a)return{release(){}};i+=1,i===1&&!o&&K();let p=!1;return{release(){p||(p=!0,!a&&(i-=1,i===0&&(x(),c=tt,L("released"))))}}}function d(p){p!==t&&(t=p,o&&L("serverUrl changed"),i>0&&t&&K())}function g(p){k.add(p);let h=!1;return{remove(){h||(h=!0,k.delete(p))}}}function w(){a||(a=!0,x(),L("transport closed"),k.clear(),i=0)}function l(p){let{pingMs:h,pongMs:E}=p;typeof h=="number"&&h>=0&&(n=h),typeof E=="number"&&E>0&&(r=E),y&&D()}function A(){T=!1}return{acquire:u,setServerUrl:d,addConsumer:g,send:U,getNonce:()=>s,getSocket:()=>o,runAuthFlow:I,close:w,setHeartbeatTimings:l,resetCachedReplayGuard:A}}var jt=64,_n=6,So=25,ko=500;function To(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 Vn(e){let t=e.requestTimeoutMs??1e4,n=new URL(e.httpOrigin).origin,r=e.transport===void 0,o=e.transport??nt(e.authResolver===void 0?{serverUrl:e.serverUrl}:{serverUrl:e.serverUrl,authResolver:e.authResolver}),s=!1,i=new Map,a=new Map,f=[],c=[];function y(u,d,g,w){let l=u.seenVersions.get(d);(!l||l.incarnation!==g||w>l.version)&&u.seenVersions.set(d,{incarnation:g,version:w})}function b(u){u.connectedPromise=new Promise((d,g)=>{u.resolveConnected=d,u.rejectConnected=g}),u.connectedPromise.catch(()=>{})}function v(u){u.listedPromise=new Promise((d,g)=>{u.resolveListed=d,u.rejectListed=g}),u.listedPromise.catch(()=>{})}function T(u,d){u.inventory.clear();for(let g of d)u.inventory.set(g.resourceTag,{version:g.version,incarnation:g.incarnation,contentLength:g.contentLength}),y(u,g.resourceTag,g.incarnation,g.version);u.resolveListed()}function m(u){if(!Array.isArray(u))return[];let d=[];for(let g of u)Me(g)&&d.push(Ne(g));return d}function k(u){let d;return new Promise((g,w)=>{d=setTimeout(()=>w(new Error(`objstore: inventory not seeded (no subscribe ack) after ${t}ms`)),t),u.listedPromise.then(g,w)}).finally(()=>clearTimeout(d))}function x(u){for(let d=0;d<f.length;d++)if(u(f[d]))return Promise.resolve(f.splice(d,1)[0]);return new Promise((d,g)=>{let w={predicate:u,resolve:()=>{},reject:A=>{clearTimeout(l);let p=c.indexOf(w);p>=0&&c.splice(p,1),g(A)}},l=setTimeout(()=>w.reject(new Error(`objstore: response timeout after ${t}ms`)),t);w.resolve=A=>{clearTimeout(l),d(A)},c.push(w)})}function R(u){if(!o.send(u))throw new Error("objstore: socket not open")}function D(u){for(let d of c.splice(0))try{d.reject(new Error(`objstore: ${u}`))}catch{}}function Z(u){if(u.type==="objstore-put"&&typeof u.workspaceTag=="string"&&Me(u)){let d=i.get(u.workspaceTag);if(!d)return;let g=Ne(u);y(d,g.resourceTag,g.incarnation,g.version),d.inventory.set(g.resourceTag,{version:g.version,incarnation:g.incarnation,contentLength:g.contentLength});let w={resourceTag:g.resourceTag,version:g.version,contentLength:g.contentLength};for(let l of d.putHandlers)try{l(w)}catch{}return}if(u.type==="objstore-deleted"&&typeof u.workspaceTag=="string"&&typeof u.resourceTag=="string"&&typeof u.version=="number"){let d=i.get(u.workspaceTag);if(!d)return;let g=u.resourceTag,w=u.version;d.seenVersions.delete(g),d.inventory.delete(g);let l={resourceTag:g,version:w};for(let A of d.deletedHandlers)try{A(l)}catch{}return}if(!(u.type==="workspace-state"||u.type==="workspace-save-ack"||u.type==="workspace-save-error"||u.type==="workspace-subscribed"||u.type==="authenticated")){for(let d=0;d<c.length;d++)if(c[d].predicate(u)){let g=c[d];c.splice(d,1),g.resolve(u);return}if(f.push(u),f.length>jt){let d=f.splice(0,f.length-jt),g=[...new Set(d.map(w=>w.type??"<no-type>"))].slice(0,4);console.warn(`objstore: dropping ${d.length} unmatched frame(s) over MAX_QUEUE_SIZE=${jt} (types: ${g.join(", ")})`)}}}function J(){for(let u of i.values())u.closed||u.connected||(u.connected=!0,u.resolveConnected())}function te(u){D(u);for(let d of i.values())d.closed||d.connected&&(d.connected=!1,b(d))}let _=o.addConsumer({onMessage:Z,onConnected:J,onDisconnected:te}),V=u=>To(u,n);async function $(u,d){if(await u.connectedPromise,u.closed)throw new Error("objstore: session closed");let g=o.getNonce();if(!g)throw new Error("objstore: socket not open");let w=await Pt(d.bytes),l={workspaceTag:u.workspaceTag,resourceTag:d.resourceTag,prevVersion:d.prev?.version??null,prevIncarnation:d.prev?.incarnation??null,expectedLength:d.bytes.byteLength,contentHash:w},A=await In(u.signingKey,l,g),p,h=!1;for(;R({type:"objstore-put-begin",...l,signature:A}),p=await x(z=>z.workspaceTag===u.workspaceTag&&z.resourceTag===d.resourceTag&&(z.type==="objstore-put-token"||z.type==="objstore-put-error"||z.type==="objstore-conflict"||z.type==="unauthorized"&&z.kind==="gated")),!(p.type!=="unauthorized"||h||(h=!0,!await o.runAuthFlow())););if(p.type==="unauthorized")return{ok:!1,reason:"unauthorized"};if(p.type==="objstore-put-error"){if(p.reason==="workspace-full")return{ok:!1,reason:"workspace-full"};throw new Error(`objstore: put-error reason='${String(p.reason)}'`)}if(p.type==="objstore-conflict")return{ok:!1,reason:"conflict",current:Me(p.current)?Ne(p.current):null};if(typeof p.urlPath!="string"||typeof p.token!="string")throw new TypeError("objstore: malformed put-token (missing urlPath/token)");let E=await globalThis.fetch(V(p.urlPath),{method:"PUT",headers:{authorization:`Bearer ${p.token}`,"content-type":"application/octet-stream"},body:d.bytes});if(!E.ok){if(E.status===409||E.status===410)return{ok:!1,reason:"conflict",current:E.status===409?await xo(E):null};let Y="";try{Y=await E.text()}catch{}throw new Error(`objstore: REST PUT failed ${E.status} ${Y.slice(0,200)}`)}let O;try{O=await E.json()}catch{throw new TypeError("objstore: PUT ack JSON parse failed")}if(!O||typeof O!="object"||!Ie(O.version)||typeof O.incarnation!="string"||typeof O.contentHash!="string"||!Ie(O.contentLength))throw new TypeError("objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)");let W=O;if(W.contentHash!==w||W.contentLength!==d.bytes.byteLength)throw new Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${W.contentHash.slice(0,16)}\u2026 length=${W.contentLength}, client signed ${w.slice(0,16)}\u2026 length=${d.bytes.byteLength}`);return{ok:!0,meta:W}}async function U(u,d){for(let g=0;g<_n;g++){let w=await N(u,d);if(w.kind==="ok")return w.value;if(w.kind==="not-found")return null;if(g+1<_n){let l=Math.min(ko,So*2**g);await new Promise(A=>{setTimeout(A,l)})}}return null}async function N(u,d){if(await u.connectedPromise,u.closed)throw new Error("objstore: session closed");let g=o.getNonce();if(!g)throw new Error("objstore: socket not open");let w=await Hn(u.signingKey,u.workspaceTag,d,g);R({type:"objstore-fetch",workspaceTag:u.workspaceTag,resourceTag:d,signature:w});let l=await x(O=>O.workspaceTag===u.workspaceTag&&O.resourceTag===d&&(O.type==="objstore-fetch-token"||O.type==="objstore-fetch-not-found"));if(l.type==="objstore-fetch-not-found")return{kind:"not-found"};if(typeof l.urlPath!="string"||typeof l.token!="string"||!Me(l))throw new TypeError("objstore: malformed fetch-token (missing urlPath / token / metadata)");let A=Ne(l),p=await globalThis.fetch(V(l.urlPath),{method:"GET",headers:{authorization:`Bearer ${l.token}`}});if(!p.ok){if(p.status===404||p.status===503)return{kind:"retry"};let O="";try{O=await p.text()}catch{}throw new Error(`objstore: REST GET failed ${p.status} ${O.slice(0,200)}`)}let h=new Uint8Array(await p.arrayBuffer()),E=await Pt(h);if(E!==A.contentHash)throw new Error(`objstore: contentHash mismatch \u2014 expected ${A.contentHash.slice(0,16)}\u2026, got ${E.slice(0,16)}\u2026`);return{kind:"ok",value:{bytes:h,meta:A}}}async function I(u,d,g){if(await u.connectedPromise,u.closed)throw new Error("objstore: session closed");let w=o.getNonce();if(!w)throw new Error("objstore: socket not open");let l={workspaceTag:u.workspaceTag,resourceTag:d,prevVersion:g?.version??null,prevIncarnation:g?.incarnation??null},A=await Fn(u.signingKey,l,w);R({type:"objstore-delete",...l,signature:A});let p=await x(h=>h.workspaceTag===u.workspaceTag&&h.resourceTag===d&&(h.type==="objstore-deleted-ack"||h.type==="objstore-delete-error"||h.type==="objstore-conflict"));if(p.type==="objstore-deleted-ack"){if(typeof p.deletedVersion!="number")throw new TypeError("objstore: malformed deleted-ack (deletedVersion not a number)");return{ok:!0,deletedVersion:p.deletedVersion}}if(p.type==="objstore-conflict")return{ok:!1,reason:"conflict",current:Me(p.current)?Ne(p.current):null};if(p.reason==="not-found")return{ok:!1,reason:"not-found"};throw new Error(`objstore: delete-error reason='${String(p.reason)}'`)}function L(u,d,g,w){let l=u.seenVersions.get(d);if(l&&l.incarnation===g&&w<l.version)throw new Error(`objstore: version-rollback rejected \u2014 fetched v${w} for an incarnation we've already seen at v${l.version}`)}async function K(u,d){if(s)throw new Error("objstore: client closed");if(!d||typeof d.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 g=u.workspaceTag;if(d.workspaceTag!=null&&d.workspaceTag!==g)throw new Error("objstore: openWorkspace \u2014 WorkspaceSubscription is for a different workspace than these keys");if(i.has(g))throw new Error(`objstore: workspace ${g.slice(0,8)}\u2026 is already open on this client`);let w={workspaceTag:g,signingKey:u.signingKey,contentKey:new Uint8Array(u.contentKey),tagKey:new Uint8Array(u.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,connected:!1,closed:!1};b(w),v(w),i.set(g,w);let l=w;(async()=>{let S;try{S=await d.resources}catch{return}l.closed||T(l,m(S))})();let A=o.acquire();a.set(g,A),o.getNonce()&&(l.connected=!0,l.resolveConnected());let p=null;try{await new Promise((S,B)=>{p=setTimeout(()=>{B(new Error(`objstore: connect timeout after ${t}ms`))},t),l.connectedPromise.then(()=>S(),P=>B(P))})}catch(S){p&&clearTimeout(p),i.delete(g),a.delete(g),l.closed=!0;try{l.contentKey.fill(0)}catch{}try{l.tagKey.fill(0)}catch{}throw A.release(),S}p&&clearTimeout(p);async function h(S,B,P){let H=await $(l,{resourceTag:S,bytes:B,prev:P});return H.ok?(P==null&&l.seenVersions.delete(S),y(l,S,H.meta.incarnation,H.meta.version),l.inventory.set(S,{version:H.meta.version,incarnation:H.meta.incarnation,contentLength:H.meta.contentLength}),{ok:!0,meta:{version:H.meta.version,incarnation:H.meta.incarnation,contentLength:H.meta.contentLength}}):H.reason==="workspace-full"?{ok:!1,reason:"workspace-full"}:H.reason==="unauthorized"?{ok:!1,reason:"unauthorized"}:(H.current&&y(l,S,H.current.incarnation,H.current.version),{ok:!1,reason:"conflict",current:H.current})}async function E(S){let B=await se(l.tagKey,S.fileName),P=At(l.contentKey,S.fileName,S.content,g,B);return await h(B,P,S.prev)}async function O(S){let B=await se(l.tagKey,S),P=await U(l,B);if(!P)return null;L(l,B,P.meta.incarnation,P.meta.version);let{fileName:H,content:Ge}=Qe(l.contentKey,P.bytes,g,B);if(H!==S)throw new Error(`objstore: fileName-binding mismatch \u2014 requested '${S}', payload encoded '${H}'`);return y(l,B,P.meta.incarnation,P.meta.version),{content:Ge,version:P.meta.version,incarnation:P.meta.incarnation}}async function W(S){let B=await U(l,S);if(!B)return null;L(l,S,B.meta.incarnation,B.meta.version);let{fileName:P,content:H}=Qe(l.contentKey,B.bytes,g,S);if(await se(l.tagKey,P)===S)return y(l,S,B.meta.incarnation,B.meta.version),{kind:"report",fileName:P,content:H,version:B.meta.version,incarnation:B.meta.incarnation};if(await le(l.tagKey,P)===S){let{name:ht,content:Rr}=Et(H);return y(l,S,B.meta.incarnation,B.meta.version),{kind:"bundle",integrity:P,name:ht,content:Rr,version:B.meta.version,incarnation:B.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 Y(S,B){let P=await I(l,S,B);return P.ok?(l.seenVersions.delete(S),l.inventory.delete(S),P):P.reason==="not-found"?{ok:!1,reason:"not-found"}:(P.current&&y(l,S,P.current.incarnation,P.current.version),{ok:!1,reason:"conflict",current:P.current})}async function z(S,B){let P=await se(l.tagKey,S);return await Y(P,B)}async function ge(){if(await k(l),l.closed)throw new Error("objstore: session closed");return[...l.inventory.entries()].map(([S,B])=>({resourceTag:S,version:B.version,incarnation:B.incarnation,contentLength:B.contentLength}))}async function pe(S){let B=await le(l.tagKey,S.integrity),P=Kn(S.name,S.content),H=At(l.contentKey,S.integrity,P,g,B);return await h(B,H,S.prev)}async function Br(S){let B=await le(l.tagKey,S),P=await U(l,B);if(!P)return null;L(l,B,P.meta.incarnation,P.meta.version);let{fileName:H,content:Ge}=Qe(l.contentKey,P.bytes,g,B);if(H!==S)throw new Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${S}', payload encoded '${H}'`);let{name:ln,content:ht}=Et(Ge);return y(l,B,P.meta.incarnation,P.meta.version),{name:ln,content:ht,version:P.meta.version,incarnation:P.meta.incarnation}}async function Pr(S,B){let P=await le(l.tagKey,S);return await Y(P,B)}return{put:E,fetch:O,fetchByTag:W,delete:z,list:ge,putBundle:pe,fetchBundle:Br,deleteBundle:Pr,onPut(S){return l.putHandlers.add(S),()=>{l.putHandlers.delete(S)}},onDeleted(S){return l.deletedHandlers.add(S),()=>{l.deletedHandlers.delete(S)}},close(){if(l.closed)return;l.closed=!0,i.delete(g);try{l.contentKey.fill(0)}catch{}try{l.tagKey.fill(0)}catch{}try{l.rejectConnected(new Error("objstore: session closed"))}catch{}try{l.rejectListed(new Error("objstore: session closed"))}catch{}let S=a.get(g);a.delete(g),S&&S.release()}}}function M(){if(!s){s=!0;for(let u of i.values()){u.closed=!0;try{u.contentKey.fill(0)}catch{}try{u.tagKey.fill(0)}catch{}try{u.rejectConnected(new Error("objstore: client closed"))}catch{}try{u.rejectListed(new Error("objstore: client closed"))}catch{}}i.clear();for(let u of a.values())u.release();a.clear(),_.remove(),r&&o.close()}}return{openWorkspace:K,close:M}}async function xo(e){try{let t=await e.json();if(Ie(t.currentVersion)&&typeof t.currentIncarnation=="string")return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function Ie(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function Me(e){return!e||typeof e!="object"?!1:typeof e.resourceTag=="string"&&Ie(e.version)&&typeof e.incarnation=="string"&&typeof e.contentHash=="string"&&Ie(e.contentLength)&&typeof e.signature=="string"}function Ne(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var Ut=null;function zn(e){Ut=typeof e=="function"?e:null}var Ao=nt({serverUrl:"",authResolver:e=>Ut==null?Promise.resolve(null):Ut(e)});function rt(){return Ao}var qn=new Set(["busy"]);function Eo(e){return typeof e?.color=="string"?e.color:""}function Bo(e){return e?.triage==="fixed"||e?.triage==="invalid"||e?.triage==="deleted"?e.triage:e?.deleted?"deleted":""}function Po(e){return typeof e?.comment=="string"?e.comment:""}function Ro(e){return typeof e?.fix=="string"?e.fix:""}function Gn(e,t,n){let r=[];for(let o of Object.keys(e)){let s=e[o],i=t[o],a=n[o],f=s??null,c=[{name:"color",norm:Eo},{name:"triage",norm:Bo},{name:"comment",norm:Po},{name:"fix",norm:Ro}];for(let{name:y,norm:b}of c){let v=b(i),T=b(f),m=b(a);T!==v&&m!==v&&T!==m&&r.push({id:o,property:y,local:T,imported:m})}}return r}function Co(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 s of r)if(!o.has(s))return!1;return!0}function Jn(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??"")&&Co(e.ignoredReports,t.ignoredReports)}function Lt(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!Jn(e[r]??{},t[r]??{}))return!1;return!0}function ot(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 Kt(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r){let s=e[o]??{},i=t[o]??{};Jn(s,i)||(n[o]=t[o]??null)}return n}function Yn(e){for(let t in e)return!1;return!0}function Xn(e){return e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function de(e){if(e)return Xn(e.triage)??(e.deleted?"deleted":void 0)}function Oo(e){return e?!e.color&&!de(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0):!0}function st(e){if(!e||typeof e!="object")return;let t=e,n={};typeof t.color=="string"&&t.color&&(n.color=t.color);let r=Xn(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),Array.isArray(t.ignoredReports)){let o=t.ignoredReports.filter(s=>typeof s=="string"&&s.length>0);o.length>0&&(n.ignoredReports=o)}return Oo(n)?void 0:n}function jo(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 s of r)if(!o.has(s))return!1;return!0}function Qn(e,t){let n=e??{},r=t??{};return(n.color??"")===(r.color??"")&&(de(n)??"")===(de(r)??"")&&(n.comment??"")===(r.comment??"")&&(n.fix??"")===(r.fix??"")&&jo(n.ignoredReports,r.ignoredReports)}function ie(e,t,n){let r=e.get(t),o=st({...r,...n});return o===void 0?e.delete(t):Qn(r,o)?!1:(e.set(t,o),!0)}function Zn(e,t,n){let r=st(n),o=e.get(t);return r===void 0?e.delete(t):Qn(o,r)?!1:(e.set(t,r),!0)}function er(e,t,n,r){let o=new Set(e.get(t)?.ignoredReports??[]);return r?o.add(n):o.delete(n),ie(e,t,{ignoredReports:o.size>0?[...o]:void 0})}function Re(e,t){let n=Object.assign(Object.create(null),e),r=ne().state,o=t instanceof Set?t:new Set(t);for(let s of o){let i=st(r.triage.get(s));i?n[s]=i:delete n[s]}return n}function Mt(e,t){let n=ne().state,r=[];for(let o of t){let s=e[o];if(!s||typeof s!="object")continue;let i=n.triage.get(o);if(s.color){let c=i?.color;c===void 0?ie(n.triage,o,{color:s.color}):c!==s.color&&r.push({id:o,property:"color",local:c,imported:s.color})}let a=de(s);if(a){let c=de(i);c===void 0?ie(n.triage,o,{triage:a}):c!==a&&r.push({id:o,property:"triage",local:c,imported:a})}if(s.comment){let c=i?.comment;c===void 0?ie(n.triage,o,{comment:s.comment}):c!==s.comment&&r.push({id:o,property:"comment",local:c,imported:s.comment})}if(s.fix){let c=i?.fix;c===void 0?ie(n.triage,o,{fix:s.fix}):c!==s.fix&&r.push({id:o,property:"fix",local:c,imported:s.fix})}if(!(a!=null||de(i)!=null||!Array.isArray(s.ignoredReports))&&!((i?.ignoredReports?.length??0)>0))for(let c of s.ignoredReports)typeof c=="string"&&er(n.triage,o,c,!0)}return r}function Nt(e,t){let n=ne().state;for(let r of e){let o=`${r.id}:${r.property}`;t[o]==="imported"&&Uo(r.id,r.property)===r.local&&(r.property==="color"?ie(n.triage,r.id,{color:r.imported}):r.property==="comment"?ie(n.triage,r.id,{comment:r.imported}):r.property==="fix"?ie(n.triage,r.id,{fix:r.imported}):r.property==="triage"&&(r.imported==="fixed"||r.imported==="invalid"||r.imported==="deleted"?ie(n.triage,r.id,{triage:r.imported,ignoredReports:void 0}):ie(n.triage,r.id,{triage:void 0})))}}function Uo(e,t){let n=ne().state.triage.get(e);return t==="color"?n?.color??"":t==="triage"?de(n)??"":t==="comment"?n?.comment??"":t==="fix"?n?.fix??"":""}function tr(e,t){let n=ne().state,r=t instanceof Set?t:new Set(t);for(let o of r){let s=e[o],i=de(s)?void 0:s?.ignoredReports;Zn(n.triage,o,{...s,ignoredReports:i})}}var Ft="deepview.sync.sessions",Lo=Ft,It=1,at=!1,it=new Set;function nr(){return at}function Fe(e){if(at!==e){at=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 it)try{t(e)}catch(n){console.warn("persistenceDegraded listener:",n)}}}function rr(e){let t=n=>e(n);return it.add(t),queueMicrotask(()=>{if(it.has(t))try{t(at)}catch(n){console.warn("persistenceDegraded listener:",n)}}),()=>it.delete(t)}function ct(){try{let e=ne().getSecureItem(Ft);if(!e)return{kind:"empty"};let t=JSON.parse(e);if(!t||typeof t!="object")return{kind:"empty"};let n=t;return n.version===It&&n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions)?{kind:"v1",map:n.sessions}:n.version===It?{kind:"empty"}:"version"in n?{kind:"unknown-version"}:{kind:"legacy",map:n}}catch{return{kind:"empty"}}}function Ko(){let e=ct();return e.kind==="v1"||e.kind==="legacy"?e.map:{}}async function Mo(e){try{return await ne().setSecureItem(Ft,JSON.stringify({version:It,sessions:e})),!0}catch(t){return console.warn("Triage sync: could not persist session state:",t),!1}}function Ht(e,t){if(!t)return null;let r=Ko()[e];return!r||r.serverUrl!==t?null:{baseRevision:typeof r.baseRevision=="string"?r.baseRevision:null,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(Lo,async()=>{let t=ct();if(t.kind==="unknown-version"){Fe(!0);return}let n=t.kind==="v1"||t.kind==="legacy"?t.map:{};if(await e(n)===!1)return;let o=await Mo(n);Fe(!o)})}function Dt(e=null){lt(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(ne().listWorkspaces().map(s=>s.id)),o=!1;for(let s of n){let i=t[s];(!r.has(s)||e!=null&&i?.serverUrl!==e)&&(delete t[s],o=!0)}return o?void 0:!1}).catch(t=>{console.warn("Triage sync: prunePersistedSessions lock failed:",t)})}function ut(e){return lt(t=>{if(!(e in t))return!1;delete t[e]})}var lr,We,ft,or,ur,No="deepview.triageSyncUrl",fr="deepview.sync.userEnabled",Io=/^\d+$/u,Gt=()=>{},$e=null,ye="",De=!0,_t=!1,ee=rt(),He=null,ve=100,Fo=5;function dt(){return De&&!_t&&!!ye&&Ho()}function Ho(){try{return We().length>0}catch{return!1}}var Vt=new Set;function dr(){if(!dt())return"off";for(let t of C.values())if(t.error)return"error";let e=ee.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return"offline";for(let t of C.values())if(t.subscribed&&!t.subscribeAcked)return"connecting";return"online"}var sr="off";function X(){let e=dr();if(e!==sr){sr=e;for(let t of Vt)try{t(e)}catch(n){console.warn("Triage sync status listener:",n)}}}var zt=0,C=new Map;function ir(e){for(let t of C.values())if(t.workspaceTag===e)return t;return null}function ae(e){return C.get(e.workspaceId)===e}function ar(e){if(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 gr(e){let t=new Set,n=We().find(o=>o.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let o of lr.reports)if(r.has(o.fileName))for(let s of o.groups)for(let i of s){let a=i.id??String(i._id);Io.test(a)||t.add(a)}return t}function Jt(e){let t=gr(e.workspaceId),n=[];for(let o of t)e.ids.has(o)||n.push(o);let r=[];return n.length>0&&(r=Mt(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function Do(){let e=ct();e.kind==="unknown-version"?Fe(!0):(e.kind==="v1"||e.kind==="legacy")&&Fe(!1),Wn(),ee.resetCachedReplayGuard()}function pr(e){if(!e||!ye)return;let t=ye;lt(n=>{n[e.workspaceId]={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState}}).catch(n=>{console.warn("Triage sync: persistSession lock failed:",n)})}function qt(e){let t=We().find(r=>r.id===e.workspaceId);if(!t){e.error="workspace no longer exists",X();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,o]=await Promise.all([En(t.privateKey),Xe(t.privateKey,e.workspaceId)]);if(C.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=o.privateKey,e.verifyingKey=o.publicKey,e.workspaceTag=o.publicKeyB64,ee.getSocket()?.readyState!==WebSocket.OPEN){Se();return}Ce(e),re(e),X()}catch(r){console.warn("Triage sync: key derivation failed:",r),C.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${r instanceof Error?r.message:String(r)}`,X())}})()}function yr(e){return ee.send(e)}function Ce(e,t=!1){if(!e)return;let n=ee.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=ee.getNonce();if(r==null)return;let o=e.baseRevision,s=n,i=e.signingKey,a=e.workspaceTag;(async()=>{try{let f=await Rn(i,a,o,r);if(C.get(e.workspaceId)!==e||e.workspaceTag!==a||ee.getSocket()!==s||ee.getNonce()!==r)return;e.subscribed=!0,yr({type:"workspace-subscribe",workspaceTag:a,from:o,signature:f})}catch(f){console.warn("Triage sync: subscribe sign failed:",f)}})()}function re(e){if(!e||e.error)return;if(e.pending||e.encrypting){e.pendingSave=!0;return}if(!e.key||!e.signingKey||!e.workspaceTag){e.pendingSave=!0;return}Jt(e),e.localState=Re(e.baseState,e.ids);let t=ee.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=ve,r=n?Object.create(null):e.baseState,o=Kt(r,e.localState);if(Yn(o)&&!n)return;let s=e.baseRevision,i=e.key,a=e.signingKey,f=e.workspaceTag;e.encrypting=!0,(async()=>{try{let c=Tt(f,s),{nonce:y,ciphertext:b}=await On(i,o,c),v={publicKeyB64:f,base:s,keyframe:n,nonceB64:y,ciphertextB64:b},T=await Pn(a,v),m=await kt(v);if(C.get(e.workspaceId)!==e||e.workspaceTag!==f)return;if(e.baseRevision!==s){e.pendingSave=!0;return}e.pending={base:s,id:m,changeset:o,keyframe:n},e.pendingSave=!1;let k={type:"workspace-save",workspaceTag:f,base:s,nonce:y,ciphertext:b,signature:T};n&&(k.keyframe=!0),yr(k),e.consecutiveFailures=0,e.error&&(e.error=null,X())}catch(c){console.warn("Triage sync: encrypt/sign failed:",c),C.get(e.workspaceId)===e&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=Fo&&(e.error=`encrypt/sign failed: ${c instanceof Error?c.message:String(c)}`,X()))}finally{C.get(e.workspaceId)===e&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&(e.pendingSave=!1,re(e)))}})()}async function $o(e,t){for(let n of t){if(!n||typeof n!="object"||typeof n.id=="string"&&n.id===e.baseRevision)continue;let r=e.baseRevision,o=!!n.keyframe;if(!(r==null?n.base==null||o:n.base===r))return console.warn(`Triage sync: chain base mismatch (expected ${r}, got ${n.base})`),!1;if(typeof n.signature!="string"||typeof n.nonce!="string"||typeof n.ciphertext!="string"||typeof n.id!="string")return console.warn("Triage sync: revision missing signature/nonce/ciphertext/id; resyncing"),e.savesSinceKeyframe=ve,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let i=typeof n.base=="string"?n.base:null,a={publicKeyB64:e.workspaceTag,base:i,keyframe:o,nonceB64:n.nonce,ciphertextB64:n.ciphertext},f=await Cn(e.verifyingKey,a,n.signature);if(!ae(e))return!1;if(!f)return console.warn("Triage sync: revision signature did not verify; resyncing"),e.savesSinceKeyframe=ve,!1;let c=await kt(a);if(!ae(e))return!1;if(n.id!==c)return console.warn("Triage sync: revision id does not match content hash; resyncing"),e.savesSinceKeyframe=ve,!1;let y;try{let v=Tt(e.workspaceTag,i);y=await jn(e.key,n.nonce,n.ciphertext,v)}catch(v){return console.warn("Triage sync: decrypt failed; resyncing",v),e.savesSinceKeyframe=ve,!1}if(!ae(e))return!1;let b=o?Object.create(null):e.baseState;e.baseState=ot(b,y??{}),e.baseRevision=n.id,o?e.savesSinceKeyframe=0:e.savesSinceKeyframe=Math.min((e.savesSinceKeyframe??0)+1,ve)}return!0}async function hr(e,t,n=[],r=null){if(ae(e)){e.localState=ot(e.baseState,t),zt++;try{tr(e.localState,e.ids),r&&n.length>0&&(Nt(n,r),e.localState=Re(e.baseState,e.ids)),pr(e),await ft()}finally{zt--}if(ae(e)){Gt();for(let o of C.values())o!==e&&re(o)}}}function mr(e){return Jt(e),e.localState=Re(e.baseState,e.ids),Kt(e.baseState,e.localState)}async function Wo(e,t){if(e.pending&&t.base===e.pending.base&&typeof t.id=="string"&&t.id===e.pending.id){let n=mr(e),r=e.pending.keyframe?Object.create(null):e.baseState;if(e.baseState=ot(r,e.pending.changeset),e.baseRevision=t.id,e.savesSinceKeyframe=e.pending.keyframe?0:Math.min((e.savesSinceKeyframe??0)+1,ve),e.pending=null,await hr(e,n),!ae(e))return;(e.pendingSave||!Lt(e.localState,e.baseState))&&(e.pendingSave=!1,re(e));return}if(e.pending){let n=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}/${n})`);return}if(t.id!==e.baseRevision){let n=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${n}\u2026; pending was already cleared`),e.pendingSave=!0,re(e)}}async function _o(e,t){if(!Array.isArray(t)||t.length===0||!e.key)return;let n=mr(e),r=e.baseRevision,o=e.baseState,s=await $o(e,t);if(!ae(e))return;if(!s){if(!e.resyncAttempted){e.resyncAttempted=!0,console.warn("Triage sync: requesting catch-up from last known baseRevision"),Ce(e,!0);return}console.warn("Triage sync: catch-up also broke continuity; full state push"),e.baseRevision=null,e.baseState=Object.create(null),e.pending=null,e.pendingSave=!1,e.resyncAttempted=!1,pr(e),Gt(),re(e);return}if(e.resyncAttempted=!1,e.pending&&(e.pending=null,e.pendingSave=!0),e.baseRevision===r){if(!ae(e))return;e.pendingSave&&(e.pendingSave=!1,re(e));return}let i=Gn(n,o,e.baseState),a=null;if(i.length>0&&$e){try{a=await $e(i,e.baseState,"chain")??null}catch(f){console.warn("Triage sync: chain-conflict resolver failed:",f)}if(!ae(e))return}await hr(e,n,i,a),ae(e)&&(e.pendingSave||!Lt(e.localState,e.baseState))&&(e.pendingSave=!1,re(e))}async function Vo(e){if(e.type==="authenticated"){for(let n of C.values())Ce(n),re(n);return}if(e.type==="unauthorized"){if(e.kind==="gated"){if(typeof e.workspaceTag=="string"){let n=ir(e.workspaceTag);n&&typeof e.resourceTag!="string"&&zo(n,e)}ee.runAuthFlow().catch(n=>{console.warn("Triage sync: auth flow failed:",n)})}return}if(typeof e.workspaceTag!="string")return;let t=ir(e.workspaceTag);if(t){if(e.type==="workspace-save-ack")await Wo(t,e);else if(e.type==="workspace-state")await _o(t,e.revisions);else if(e.type==="workspace-save-error")Go(t,e);else if(e.type==="workspace-subscribed"){t.subscribeAcked=!0;let n=Array.isArray(e.resources)?e.resources:[],r=t.objstoreResourceWaiters.splice(0);for(let o of r)try{o(n)}catch{}X()}}}function zo(e,t){e.pending&&(typeof t.base!="string"&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var qo=/^[\w-]+$/u;function Go(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&&qo.test(n)?n:"rejected";if(e.pending=null,qn.has(r)){e.pendingSave=!0;return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,X()}var cr=Promise.resolve();function Jo(e){cr=cr.then(()=>Vo(e)).catch(t=>{console.warn("Triage sync handler error:",t)})}function Yo(e){for(let t of C.values())t.pending=null,t.pendingSave=!1,Ce(t),re(t);X()}function Xo(e){for(let t of C.values())t.pending=null,t.subscribed=!1,t.subscribeAcked=!1,t.resyncAttempted=!1,t.pendingSave=!0;X()}ee.addConsumer({onMessage:Jo,onConnected:Yo,onDisconnected:Xo});function Se(){dt()?He||(He=ee.acquire()):He&&(He.release(),He=null)}function Qo(e){Gt=typeof e=="function"?e:()=>{}}function Zo(e){$e=typeof e=="function"?e:null}function es(e){zn(e)}function $t(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&qt(e)}function Wt(e){e.pending=null,e.pendingSave=!1,e.encrypting=!1,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1}var he={setServerUrl(e){let t=(e??"").trim();if(t===ye)return;let n=ye;ye=t,t&&Dt(t),n&&t&&n!==t&&Ke(null).catch(r=>{console.warn("Triage sync: failed to drop cached auth password on server change:",r)}),ee.setServerUrl(t);for(let r of C.values()){Wt(r);let o=t?Ht(r.workspaceId,t):null;r.baseRevision=o?.baseRevision??null,r.baseState=o?.baseState??Object.create(null),r.savesSinceKeyframe=o?.savesSinceKeyframe??0,r.localState=Re(r.baseState,r.ids),$t(r)}Se(),X()},setEnabled(e){let t=!!e;if(t!==De){if(De=t,ur(fr,t?"1":"0").catch(n=>{console.warn("Triage sync: could not persist user-enabled:",n)}),dt())for(let n of C.values())$t(n);else for(let n of C.values())Wt(n);Se(),X()}},isEnabled(){return De},setForcedOff(e){let t=!!e;if(t!==_t){if(_t=t,dt())for(let n of C.values())$t(n);else for(let n of C.values())Wt(n);Se(),X()}},getServerUrl(){return ye},get connected(){return ee.getSocket()?.readyState===WebSocket.OPEN},get status(){return dr()},onStatusChange(e){return Vt.add(e),()=>Vt.delete(e)},notify(){if(!(zt>0))for(let e of C.values())re(e)},ensureSubscription(e){let t=C.has(e);he.openSession(e);let n=C.get(e);if(!n)return null;let r=new Promise(o=>{n.objstoreResourceWaiters.push(o)});return t&&Ce(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||C.has(e)||!We().find(i=>i.id===e))return;let n=gr(e),r=Ht(e,ye),o=r?.baseState??Object.create(null);Mt(o,n);let s={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:n,baseRevision:r?.baseRevision??null,baseState:o,savesSinceKeyframe:r?.savesSinceKeyframe??0,localState:Re(o,n),pending:null,pendingSave:!1,key:null,encrypting:!1,subscribed:!1,subscribeAcked:!1,resyncAttempted:!1,consecutiveFailures:0,error:null,objstoreResourceWaiters:[]};C.set(e,s),qt(s),Se(),X()},closeSession(e){if(e==null){for(let t of C.values())ar(t);C.clear()}else{let t=C.get(e);t&&ar(t),C.delete(e)}X()},refreshSession(e){let t=C.get(e);if(!t){console.debug("triage-sync: refreshSession bail \u2014 no session for",e,"(caller must openSession first)");return}br(t)},sessionInfo(e){let t=C.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[...C.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...C.keys()]:[e],n=!1;for(let r of t){let o=C.get(r);!o||!o.error||(o.error=null,o.consecutiveFailures=0,n=!0,!o.key||!o.signingKey?qt(o):ee.getSocket()?.readyState===WebSocket.OPEN&&(Ce(o),re(o)))}n&&X()},get persistenceDegraded(){return nr()},onPersistenceDegraded(e){return rr(e)}};Ze(e=>{lr=e.state,We=e.listWorkspaces,ft=e.saveTriage,or=e.getSecureItem,ur=e.setSecureItem,e.onSecureStorageHydrated(Do);try{localStorage.removeItem(No),or(fr)==="0"&&(De=!1),Se()}catch{}e.onWorkspaceDeleted(t=>{let n=C.delete(t);ut(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)}),Se(),n&&X()}),e.onWorkspacePrivateKeyChanged(t=>{let n=C.get(t);if(!n){ut(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)});return}n.signingKey=null,n.key=null,n.verifyingKey=null,n.workspaceTag=null,n.keyDerivationGen=(n.keyDerivationGen??0)+1,(async()=>{await ut(t),C.delete(t),he.openSession(t),X()})().catch(r=>{console.warn("Triage sync: privateKey rotation IIFE failed:",r),C.delete(t),X()})}),e.onReportMembershipChanged(t=>{he.openSession(t);let n=C.get(t);n&&br(n)}),Dt()});function br(e){let{conflicts:t,hydrated:n}=Jt(e);(async()=>{if(t.length===0){n?await ft():re(e);return}let r=null;if($e)try{r=await $e(t,e.baseState,"attach")}catch(o){console.warn("Triage sync: hydration conflict resolver failed:",o)}ae(e)&&(r&&Nt(t,r),await ft())})().catch(r=>{console.warn("Triage sync: refreshAndPropagate failed:",r)})}async function Yt(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var ke,Zt,en,nn,rn,on,qe,pt,kr,Tr,sn,an,F=new Map,tn=new Set,ts="deepview.objstore-presence.";function cn(e){return ts+e}function ns(e){try{let t=localStorage.getItem(cn(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:{},localVersions:n.localVersions&&typeof n.localVersions=="object"?n.localVersions:{}}}catch{return null}}function je(e,t){try{let n={names:Object.fromEntries(t.remoteNameByTag),bundles:Object.fromEntries(t.remoteBundleByTag),bundleNames:Object.fromEntries(t.remoteBundleNameByIntegrity),localVersions:Object.fromEntries(t.localVersions)};localStorage.setItem(cn(e),JSON.stringify(n))}catch(n){console.warn(`objstore-presence: cache persist failed for ${e}:`,n)}}function wr(e){try{localStorage.removeItem(cn(e))}catch{}}var Xt=null;function rs(e){return Xt||(Xt=Vn({serverUrl:"",httpOrigin:e,transport:rt()})),Xt}var _e=new Set,Ve=new Set;function ue(){for(let e of tn)try{e()}catch{}}function os(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 vr=256;function xr(e){return typeof e!="string"?"":e.length<=vr?e:e.slice(0,vr)}function ss(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 Oe(e){if(F.has(e))return;let t=ke().find(s=>s.id===e);if(!t)return;let n=he.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,remoteVersions:new Map,localVersions:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};F.set(e,r),r.ready=(async()=>{if(r.keys=await xt(t.privateKey,t.id),r.disposed)return;let s=new Map;for(let c of t.reports??[]){let y=await se(r.keys.tagKey,c);r.fileTags.set(c,y),s.set(y,c)}if(r.disposed)return;let i=new Map;for(let c of t.bundles??[]){let y=await le(r.keys.tagKey,c);r.bundleTags.set(c,y),i.set(y,c)}if(r.disposed)return;try{let c=await qe();if(r.disposed)return;for(let y of c)r.bundleTags.has(y.integrity)&&r.remoteBundleNameByIntegrity.set(y.integrity,y.name)}catch(c){console.warn(`objstore-presence: listBundles failed during ${e} open:`,c)}ue();let a=he.getServerUrl();if(!a)return;let f=ss(a);if(f)try{let y=await rs(f).openWorkspace(r.keys,n);if(r.disposed){try{y.close()}catch{}return}r.session=y,o();let b=await y.list();if(r.disposed)return;for(let m of b){r.remoteTags.add(m.resourceTag);let k=r.remoteVersions.get(m.resourceTag);(k===void 0||m.version>k)&&r.remoteVersions.set(m.resourceTag,m.version)}let v=ns(e),T=!1;if(v&&v.localVersions)for(let m of r.remoteTags){let k=v.localVersions[m];typeof k=="number"&&r.localVersions.set(m,k)}for(let m of r.remoteTags){let k=s.get(m);k!==void 0&&!r.remoteNameByTag.has(m)&&(r.remoteNameByTag.set(m,k),T=!0);let x=i.get(m);if(x!==void 0&&!r.remoteBundleByTag.has(m)&&(r.remoteBundleByTag.set(m,x),T=!0),v){let R=v.names[m];typeof R=="string"&&!r.remoteNameByTag.has(m)&&!r.remoteBundleByTag.has(m)&&(r.remoteNameByTag.set(m,R),r.fileTags.set(R,m),T=!0);let D=v.bundles[m];if(typeof D=="string"&&!r.remoteBundleByTag.has(m)&&!r.remoteNameByTag.has(m)){r.remoteBundleByTag.set(m,D),r.bundleTags.set(D,m);let Z=v.bundleNames[D];typeof Z=="string"&&!r.remoteBundleNameByIntegrity.has(D)&&r.remoteBundleNameByIntegrity.set(D,Z),T=!0}}}(T||v)&&je(e,r),ue(),gt(r);for(let m of r.remoteTags){let k=r.localVersions.get(m),x=r.remoteVersions.get(m);typeof k!="number"||typeof x!="number"||x>k&&Sr(r,m).catch(()=>{})}}catch(c){r.err=c}})();function o(){let s=r.session;s.onPut(({resourceTag:i,version:a})=>{let f=r.remoteVersions.get(i),c=r.remoteTags.has(i)&&typeof f=="number"&&a>f;if(r.remoteTags.add(i),(f===void 0||a>f)&&r.remoteVersions.set(i,a),ue(),c){Sr(r,i).catch(()=>{});return}gt(r)}),s.onDeleted(({resourceTag:i})=>{r.remoteTags.delete(i),r.remoteVersions.delete(i),r.localVersions.delete(i);let a=r.remoteNameByTag.get(i);r.remoteNameByTag.delete(i);let f=ke().find(v=>v.id===e),c=f?.reports??[],y=f?.bundles??[];a&&!c.includes(a)&&r.fileTags.delete(a);let b=r.remoteBundleByTag.get(i);r.remoteBundleByTag.delete(i),b&&(r.remoteBundleNameByIntegrity.delete(b),y.includes(b)||r.bundleTags.delete(b)),je(e,r),ue()})}r.ready.catch(()=>{})}function ze(e){let t=F.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}F.delete(e),ue()}}Ze(e=>{ke=e.listWorkspaces,Zt=e.addReportToWorkspace,en=e.addBundleToWorkspace,nn=e.analyzeContent,rn=e.setCount,on=e.gunzipBytes,qe=e.listBundles,pt=e.listFiles,kr=e.readBundle,Tr=e.readFileBytes,sn=e.saveBundle,an=e.saveFileBytes,e.onReportMembershipChanged(t=>{F.has(t)||Oe(t);let n=F.get(t);if(!n)return;let r=ke().find(o=>o.id===t);if(r)for(let o of r.reports??[])n.fileTags.has(o)||cs(t,o).catch(()=>{})}),e.onBundleMembershipChanged(t=>{F.has(t)||Oe(t);let n=F.get(t);if(!n)return;let r=ke().find(o=>o.id===t);if(r)for(let o of r.bundles??[])n.bundleTags.has(o)||us(t,o).catch(()=>{})}),e.onWorkspaceDeleted(t=>{ze(t),wr(t)}),e.onWorkspacePrivateKeyChanged(t=>{F.has(t)&&(ze(t),wr(t),Oe(t))})});function is(){return Array.from(F.keys())}function as(e,t){let n=F.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=F.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await se(n.keys.tagKey,t)),n.disposed||ue()))}function ls(e,t){let n=F.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function us(e,t){let n=F.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await le(n.keys.tagKey,t)),n.disposed||ue()))}function fs(e){return tn.add(e),()=>tn.delete(e)}function ds(e){return _e.add(e),()=>_e.delete(e)}function gs(e){return Ve.add(e),()=>Ve.delete(e)}function ps(e){let t=F.get(e);return t?t.remoteTags.size:0}async function ys(e){let t=F.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await gt(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function hs(e){let t=F.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await gt(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function ms(e,t){let n=F.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}async function gt(e){if(!e.session||e.disposed)return;let t=ke().find(i=>i.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),o=new Set;try{o=new Set(await pt())}catch(i){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,i)}if(e.disposed||!e.session)return;let s=[];for(let i of e.remoteTags){let a=e.remoteNameByTag.get(i);if(a!==void 0&&n.has(a)&&o.has(a))continue;if(e.remoteBundleByTag.has(i)){let c=e.remoteBundleByTag.get(i);if(e.remoteBundleNameByIntegrity.has(c)&&r.has(c))continue}let f=e.inFlight.get(i);f||(f=e.session.fetchByTag(i).then(async c=>(e.inFlight.delete(i),!c||e.disposed||!e.remoteTags.has(i)?null:c.kind==="bundle"?(e.remoteBundleByTag.set(i,c.integrity),e.bundleTags.set(c.integrity,i),c.name&&e.remoteBundleNameByIntegrity.set(c.integrity,c.name),await ws(e,i,c.integrity,c.name,c.content),null):(e.remoteNameByTag.set(i,c.fileName),e.fileTags.set(c.fileName,i),await bs(e,i,c.fileName,c.content),null)),()=>(e.inFlight.delete(i),null)),e.inFlight.set(i,f)),s.push(f)}s.length!==0&&(await Promise.all(s),!e.disposed&&(je(e.workspaceId,e),ue()))}async function bs(e,t,n,r){if(e.disposed||!e.remoteTags.has(t))return;let o=ke().find(c=>c.id===e.workspaceId),s=!!(o&&Array.isArray(o.reports)&&o.reports.includes(n)),i;try{let c=await pt();if(e.disposed||!e.remoteTags.has(t))return;i=c.includes(n)}catch(c){console.warn(`auto-download: listFiles failed before saving "${n}":`,c);return}if(i){if(s||e.disposed||!e.remoteTags.has(t))return;try{await Zt(n,e.workspaceId)}catch(c){console.warn(`auto-download: attaching local "${n}" to workspace "${e.workspaceId}" failed:`,c);return}if(e.disposed)return;for(let c of _e)try{c(e.workspaceId,n)}catch{}return}let a;try{a=Pe(await on(r))}catch(c){console.warn(`auto-download: gunzip/decode of "${n}" failed (likely forged peer payload):`,c);return}if(e.disposed||!e.remoteTags.has(t))return;let f=nn(a);if(f.recognized){try{if(await an(n,r),e.disposed||!e.remoteTags.has(t))return;rn(n,f.count,f.source);let c=e.remoteVersions.get(t);if(typeof c=="number"&&e.localVersions.set(t,c),!e.remoteTags.has(t))return;await Zt(n,e.workspaceId),je(e.workspaceId,e)}catch(c){console.warn(`auto-download: persisting "${n}" to workspace "${e.workspaceId}" failed:`,c);return}if(!e.disposed)for(let c of _e)try{c(e.workspaceId,n)}catch{}}}async function Sr(e,t){if(e.disposed||!e.remoteTags.has(t))return;let n;try{n=await e.session.fetchByTag(t)}catch(a){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,a);return}if(!n||e.disposed||!e.remoteTags.has(t)||n.kind==="bundle")return;let r=n.fileName,o=n.content,s;try{s=Pe(await on(o))}catch(a){console.warn(`replace-refetch: gunzip/decode of "${r}" failed (likely forged peer payload):`,a);return}if(e.disposed||!e.remoteTags.has(t))return;let i=nn(s);if(!i.recognized){console.warn(`replace-refetch: peer-uploaded replacement for "${r}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);return}try{if(await an(r,o),e.disposed)return;rn(r,i.count,i.source),typeof n.version=="number"&&e.localVersions.set(t,n.version),je(e.workspaceId,e)}catch(a){console.warn(`replace-refetch: saveFileBytes failed for "${r}":`,a);return}if(!e.disposed)for(let a of _e)try{a(e.workspaceId,r)}catch{}}async function ws(e,t,n,r,o){if(e.disposed||!e.remoteTags.has(t))return;let s;try{s=await qe()}catch(c){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,c);return}if(e.disposed||!e.remoteTags.has(t))return;if(s.some(c=>c.integrity===n)){try{await en(n,e.workspaceId)}catch(y){console.warn("auto-download: attach pre-existing bundle failed:",y);return}if(e.disposed)return;let c=s.find(y=>y.integrity===n)?.name??"";for(let y of Ve)try{y(e.workspaceId,n,c)}catch{}return}let i=await Yt(o);if(e.disposed||!e.remoteTags.has(t))return;if(i!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${i}) \u2014 refusing to save`);return}let a=r&&r.length>0?r:`bundle-${n.slice(7,15)}`,f=xr(a);try{if(await sn(f,o),e.disposed||!e.remoteTags.has(t))return;await en(n,e.workspaceId)}catch(c){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,c);return}if(!e.disposed)for(let c of Ve)try{c(e.workspaceId,n,f)}catch{}}async function Te(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw new Error(`Objstore session is not connected${os(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 vs(e,t){let n=F.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);return await Te(n),n.session.fetch(t)}async function Ar(e,t,n){let r=F.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);await Te(r);let o=await yt(s=>r.session.put({fileName:t,content:n,prev:s}));if(o.ok&&r.keys&&!r.disposed)try{let s=r.fileTags.get(t)??await se(r.keys.tagKey,t);r.fileTags.set(t,s),r.remoteVersions.set(s,o.meta.version),r.localVersions.set(s,o.meta.version),je(r.workspaceId,r)}catch{}return o}async function Ss(e,t){let n=!1;F.has(e)||(Oe(e),n=!0);try{let r=F.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Te(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.fileTags.has(t)||r.fileTags.set(t,await se(r.keys.tagKey,t));let o=r.fileTags.get(t),s=await yt(i=>r.session.delete(t,i));return s.ok&&(r.remoteTags.delete(o),r.remoteNameByTag.delete(o),r.remoteVersions.delete(o),r.localVersions.delete(o),ue()),s}finally{n&&ze(e)}}async function Er(e,t){let n=F.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Te(n);let r=await kr(t),i=(await qe()).find(a=>a.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await yt(a=>n.session.putBundle({integrity:t,name:i,content:r,prev:a}))}async function ks(e,t){let n=F.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Te(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:"not-found"};if(await Yt(r.content)!==t)return{ok:!1,reason:"integrity-mismatch"};let s=r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`,i=xr(s);await sn(i,r.content);for(let a of Ve)try{a(e,t,i)}catch{}return{ok:!0,integrity:t,name:i}}async function Ts(e,t){let n=!1;F.has(e)||(Oe(e),n=!0);try{let r=F.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Te(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.bundleTags.has(t)||r.bundleTags.set(t,await le(r.keys.tagKey,t));let o=r.bundleTags.get(t),s=await yt(i=>r.session.deleteBundle(t,i));return s.ok&&(r.remoteTags.delete(o),r.remoteBundleByTag.delete(o),ue()),s}finally{n&&ze(e)}}async function xs(e,{onList:t,onItem:n}={}){let r=F.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);if(await Te(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let o=r.keys.tagKey,s=await As(r,e),i=await Us(),a=await Ls(),f=new Map;for(let v of i)f.set(await se(o,v),v);let c=new Map;for(let v of a)c.set(await le(o,v.integrity),v.integrity);let y=s.map(v=>{let T=f.get(v.resourceTag),m=c.get(v.resourceTag);return{resourceTag:v.resourceTag,kind:Cs(r,v.resourceTag,T,m),label:Os(r,v.resourceTag,T,m),contentLength:v.contentLength,reportName:T,bundleIntegrity:m,identifier:T??m,status:"checking"}});if(typeof t=="function")try{t(y.map(Qt))}catch{}let b={good:0,reuploaded:0,missing:0};for(let v of y)if(v.status=await Bs(r,e,v),b[v.status]+=1,typeof n=="function")try{n(Qt(v))}catch{}return{items:y.map(Qt),counts:b}}async function As(e,t){try{let n=he.ensureSubscription(t);if(n){let r=await js(n.resources,1e4);if(Array.isArray(r))return Es(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 Es(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 Bs(e,t,n){let r;try{r=await e.session.fetchByTag(n.resourceTag)}catch{r=null}return r?(r.kind==="report"?(n.kind="report",n.label=r.fileName,n.identifier=r.fileName):(n.kind="bundle",n.label=r.name??n.label,n.bundleIntegrity=r.integrity,n.identifier=r.integrity),"good"):e.remoteTags.has(n.resourceTag)?n.reportName!==void 0?await Ps(t,n):n.bundleIntegrity!==void 0?await Rs(t,n):"missing":"missing"}async function Ps(e,t){let n;try{n=await Tr(t.reportName)}catch{return"missing"}if(t.contentLength==null||Ln(t.reportName,n.length)!==t.contentLength)return"missing";try{let r=await Ar(e,t.reportName,n);return r&&r.ok?"reuploaded":"missing"}catch{return"missing"}}async function Rs(e,t){try{let n=await Er(e,t.bundleIntegrity);return n&&n.ok?"reuploaded":"missing"}catch{return"missing"}}function Cs(e,t,n,r){return n!==void 0?"report":r!==void 0||e.remoteBundleByTag.has(t)?"bundle":e.remoteNameByTag.has(t)?"report":"unknown"}function Os(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 s=e.remoteBundleByTag.get(t);return s!==void 0?e.remoteBundleNameByIntegrity.get(s)??s:`${t.slice(0,10)}\u2026`}function Qt(e){return{resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier}}function js(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let o=new Promise((s,i)=>{n=setTimeout(()=>i(new Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,o]).finally(()=>clearTimeout(n))}async function Us(){try{return await pt()}catch(e){return console.warn("objstore-recovery: listFiles failed; treating as no local reports:",e),[]}}async function Ls(){try{return await qe()}catch(e){return console.warn("objstore-recovery: listBundles failed; treating as no local bundles:",e),[]}}export{ze as closeWorkspace,Ts as deleteBundleFromRemote,Ss as deleteFromRemote,hs as discoverRemoteBundleIntegrities,ys as discoverRemoteFileNames,ks as fetchBundleFromRemote,vs as fetchFile,ho as installSyncHost,ls as isBundleInRemote,as as isInRemote,ds as onAutoDownloaded,gs as onBundleAutoDownloaded,fs as onChange,Oe as openWorkspace,is as openWorkspaceIds,Er as putBundleToRemote,Ar as putFile,xs as recheckRemoteStorage,ms as remoteBundleName,ps as remoteCount,es as setAuthenticationResolver,Zo as setHydrationConflictResolver,Qo as setRedraw,he as triageSync};
|
|
15
15
|
/*! Bundled license information:
|
|
16
16
|
|
|
17
17
|
@noble/ciphers/utils.js:
|