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