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