@preventive/triage 1.0.0-alpha.45 → 1.0.0-alpha.47
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/client/linked-findings.js +3 -0
- package/common/bundle-metadata.d.ts +1 -0
- package/common/bundle-metadata.js +1 -1
- package/common/bundle-sources.js +5 -1
- package/common/line-diff.js +5 -4
- package/common/managed/agent-tasks.ts +5 -3
- package/common/managed/github-agents.ts +28 -10
- package/out/activity.js +4 -0
- package/out/{chunk-NPW52BM2.js → chunk-4HI2MSAV.js} +13 -13
- package/out/chunk-5AHIQFFG.js +36 -0
- package/out/chunk-6ANSHRFQ.js +6 -0
- package/out/chunk-6WF3KNTL.js +3 -0
- package/out/chunk-7BKKYVWR.js +7 -0
- package/out/{chunk-HMAJDVXN.js → chunk-FH24VHSJ.js} +1 -1
- package/out/chunk-NOZJULWS.js +52 -0
- package/out/{chunk-OKRLLE5I.js → chunk-PWFUOLZK.js} +1 -1
- package/out/chunk-S6U2J62U.js +232 -0
- package/out/chunk-SPEFPML6.js +2 -0
- package/out/chunk-UENXT2HK.js +3 -0
- package/out/chunk-VL43BTSO.js +1 -0
- package/out/{chunk-3PS4KWD2.js → chunk-WCPJDAYA.js} +1 -1
- package/out/chunk-ZCS4UYHI.js +1 -0
- package/out/chunk-ZGNMDGSB.js +1 -0
- package/out/client-managed-import.js +1 -1
- package/out/client-managed.js +15 -15
- package/out/client-sync.js +2 -2
- package/out/compare.js +12 -12
- package/out/dialogs.js +28 -28
- package/out/graph.js +11 -11
- package/out/index.html +11 -11
- package/out/scan.js +2 -2
- package/out/terminal.js +6 -6
- package/out/view.css +1 -1
- package/out/view.js +15 -15
- package/package.json +4 -1
- package/risk/actions/findings.js +14 -9
- package/risk/actions/scripts/shell.js +5 -1
- package/risk/index.d.ts +9 -4
- package/risk/npm/assess.js +15 -4
- package/risk/npm/registry.js +6 -1
- package/server-e2e/app.ts +5 -4
- package/server-e2e/http.ts +5 -2
- package/server-managed/activity.ts +24 -11
- package/server-managed/app-agents.ts +10 -21
- package/server-managed/bundle-build-worker.js +7 -3
- package/server-managed/bundle-build.ts +5 -3
- package/server-managed/bundle-cache.ts +16 -4
- package/server-managed/bundle.ts +3 -4
- package/server-managed/combined.ts +3 -2
- package/server-managed/commit-coauthors.ts +5 -9
- package/server-managed/commit-lockfiles.ts +21 -11
- package/server-managed/config.ts +6 -0
- package/server-managed/db-methods.ts +321 -156
- package/server-managed/db-neon.ts +71 -24
- package/server-managed/db-schema.ts +4 -0
- package/server-managed/db.ts +2 -1
- package/server-managed/dependency-reviews.ts +13 -3
- package/server-managed/github-app.ts +12 -6
- package/server-managed/github-issue-links.ts +11 -5
- package/server-managed/github-pulls.ts +2 -2
- package/server-managed/github-requests.ts +39 -0
- package/server-managed/http-response.ts +10 -2
- package/server-managed/http.ts +269 -143
- package/server-managed/index.ts +8 -7
- package/server-managed/kept-briefly.ts +37 -0
- package/server-managed/link-reports.ts +5 -1
- package/server-managed/npm-delta.ts +11 -6
- package/server-managed/npm-kept.ts +51 -7
- package/server-managed/npm-loads.ts +117 -35
- package/server-managed/npm-packages.ts +107 -14
- package/server-managed/npm-risk.ts +68 -18
- package/server-managed/pretty-print.ts +112 -35
- package/server-managed/pull-dependencies.ts +29 -9
- package/server-managed/pull-dependency-reviews.ts +8 -8
- package/server-managed/queue.ts +16 -0
- package/server-managed/rename-diff.ts +22 -13
- package/server-managed/report-sources.ts +1 -1
- package/server-managed/report-store.ts +50 -12
- package/server-managed/repository-actions.ts +15 -6
- package/server-managed/repository-agents.ts +1 -1
- package/server-managed/repository-browser.ts +123 -33
- package/server-managed/repository-code.ts +28 -11
- package/server-managed/repository-dependency-reviews.ts +41 -19
- package/server-managed/repository-history.ts +24 -8
- package/server-managed/repository-pulse.ts +9 -2
- package/server-managed/repository-risk-audit.ts +13 -0
- package/server-managed/repository-risk-read.ts +11 -6
- package/server-managed/repository-risk.ts +27 -20
- package/server-managed/session.ts +18 -4
- package/server-managed/solidity-entry-points.ts +5 -3
- package/server-managed/sql-postgres.ts +3 -0
- package/server-managed/sql.ts +6 -2
- package/server-managed/storage-db.ts +11 -3
- package/server-managed/storage-encryption.ts +7 -4
- package/server-managed/storage.ts +8 -4
- package/server-managed/team-feed.ts +3 -1
- package/server-managed/team-reports.ts +30 -13
- package/server-managed/uploads.ts +29 -9
- package/server-managed/upstream-cache.ts +12 -0
- package/server.ts +14 -5
- package/out/chunk-5DHL5NG3.js +0 -2
- package/out/chunk-6HNXNIQY.js +0 -52
- package/out/chunk-AFLZH7WG.js +0 -1
- package/out/chunk-NV7ES4EW.js +0 -1
- package/out/chunk-PTGDYLNS.js +0 -36
- package/out/chunk-Q6MVYGYV.js +0 -3
- package/out/chunk-QRD6GIG5.js +0 -229
- package/out/chunk-WI7Z5A2T.js +0 -6
- package/out/chunk-WQ74ZBZF.js +0 -7
- package/out/chunk-XVBEOGOS.js +0 -3
package/out/client-sync.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,b as t,c as n,d as r,e as i,f as a,g as o,p as s,u as c,v as l}from"./chunk-WQ74ZBZF.js";import{a as u,b as d,d as f,e as p,f as m,g as h,h as g,i as _}from"./chunk-7C7DWL7I.js";import{a as v,b as y}from"./chunk-PNHBZGDD.js";import{a as b,c as x}from"./chunk-TUII34K2.js";import"./chunk-OOJM4CTU.js";function S(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}var C=e=>e?`"${e}" `:``;function w(e,t=``){if(typeof e!=`boolean`)throw TypeError(C(t)+`expected boolean, got type=`+typeof e);return e}function T(e,t=``){if(typeof e!=`number`)throw TypeError(C(t)+`expected number, got `+typeof e);if(!Number.isSafeInteger(e)||e<0)throw RangeError(C(t)+`expected integer >= 0, got `+e);return e}function E(e,t,n=``){if(S(e)&&(t===void 0||e.length===t))return e;t!==void 0&&T(t,`length`);let r=S(e),i=t===void 0?``:` of length ${t}`,a=r?`length=${e.length}`:`type=${typeof e}`,o=C(n)+`expected Uint8Array`+i+`, got `+a;throw r?RangeError(o):TypeError(o)}var D=(e,t)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(t===`object`?`expected valid options object`:`"${t}" expected object, got type=${typeof e}`)};function O(e,t=!0){if(e.destroyed)throw Error(`hash was destroyed`);if(t&&e.finished)throw Error(`digest() was already called`)}function k(e,t){E(e,void 0,`output`);let n=t.outputLen;if(!(e.length>=n))throw RangeError(`"output" expected length >= `+n)}function A(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function j(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function M(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var N=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function P(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function F(e){for(let t=0;t<e.length;t++)e[t]=P(e[t]);return e}var I=N?e=>e:F;function L(e,t){return!e.byteLength||!t.byteLength?!1:e.buffer===t.buffer&&e.byteOffset<t.byteOffset+t.byteLength&&t.byteOffset<e.byteOffset+e.byteLength}function R(e,t){if(L(e,t)&&e.byteOffset<t.byteOffset)throw Error(`complex overlap of input and output is not supported`)}function z(e,t){return D(e,`defaults`),D(t,`opts`),Object.assign(e,t)}function ee(e,t){if(e=E(e),t=E(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 te(e,t,n){let r=t,i=n||(()=>[]),a=(e,t)=>r(t,...i(e)).update(e).digest(),o=r(new Uint8Array(e),...i(new Uint8Array));return a.outputLen=o.outputLen,a.blockLen=o.blockLen,a.create=(e,...t)=>r(e,...t),a}var ne=(e,t)=>{function n(n,...r){if(E(n,void 0,`key`),e.nonceLength!==void 0){let t=r[0];E(t,e.varSizeNonce?void 0:e.nonceLength,`nonce`)}let i=e.tagLength,a=e.nonceLength===void 0?0:1;if(!e.withAAD){for(let e=a;e<r.length;e++)if(S(r[e]))throw Error(`AAD not supported`)}e.withAAD&&r[a]!==void 0&&E(r[a],void 0,`AAD`);let o=t(n,...r),s=(e,t)=>{if(t!==void 0){if(e!==2)throw Error(`cipher output not supported`);E(t,void 0,`output`)}},c=!1;return{encrypt(e,t){if(c)throw Error(`cannot encrypt() twice with same key + nonce`);return c=!0,E(e,void 0,`data`),s(o.encrypt.length,t),o.encrypt(e,t)},decrypt(e,t){if(E(e,void 0,`data`),i&&e.length<i)throw Error(`"ciphertext" expected length >= tagLength=`+i);return s(o.decrypt.length,t),o.decrypt(e,t)}}}return Object.assign(n,e),n};function B(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(E(t,e,`output`),n&&!ie(t))throw Error(`invalid output, must be aligned`);return t}function re(e,t,n){T(e),T(t),w(n);let r=new Uint8Array(16),i=M(r);return i.setBigUint64(0,BigInt(t),n),i.setBigUint64(8,BigInt(e),n),r}function ie(e){return e.byteOffset%4==0}function ae(e){return Uint8Array.from(E(e))}var oe=e=>Uint8Array.from(e.split(``),e=>e.charCodeAt(0)),se=I(A(oe(`expand 16-byte k`))),ce=I(A(oe(`expand 32-byte k`)));function V(e,t){return e<<t|e>>>32-t}var le=64,ue=16,de=2**32-1,fe=Uint32Array.of();function pe(e,t,n,r,i,a,o,s){let c=i.length,l=new Uint8Array(le),u=A(l),d=N&&ie(i)&&ie(a),f=d?A(i):fe,p=d?A(a):fe;if(!N){for(let d=0;d<c;o++){if(e(t,n,r,u,o,s),I(u),o>=de)throw Error(`arx: counter overflow`);let f=Math.min(le,c-d);for(let e=0,t;e<f;e++)t=d+e,a[t]=i[t]^l[e];d+=f}return}for(let m=0;m<c;o++){if(e(t,n,r,u,o,s),o>=de)throw Error(`arx: counter overflow`);let h=Math.min(le,c-m);if(d&&h===le){let e=m/4;if(m%4!=0)throw Error(`arx: invalid block position`);for(let t=0,n;t<ue;t++)n=e+t,p[n]=f[n]^u[t];m+=le;continue}for(let e=0,t;e<h;e++)t=m+e,a[t]=i[t]^l[e];m+=h}}function me(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:i,counterRight:a,rounds:o}=z({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!=`function`)throw Error(`core must be a function`);return T(i),T(o),w(a),w(n),(t,s,c,l,u=0)=>{E(t,void 0,`key`),E(s,void 0,`nonce`),E(c,void 0,`data`);let d=c.length,f=l!==void 0;if(l=B(d,l,!1),f&&R(c,l),T(u),u<0||u>=de)throw Error(`arx: counter overflow`);let p=[],m=t.length,h,g;if(m===32)p.push(h=ae(t)),g=ce;else if(m===16&&n)h=new Uint8Array(32),h.set(t),h.set(t,16),g=se,p.push(h);else throw E(t,32,`arx key`),Error(`invalid key size`);(!N||!ie(s))&&p.push(s=ae(s));let _=A(h);if(r){if(s.length!==24)throw Error(`arx: extended nonce must be 24 bytes`);let e=s.subarray(0,16);if(N)r(g,_,A(e),_);else{let t=I(Uint32Array.from(g));r(t,_,A(e),_),j(t),I(_)}s=s.subarray(16)}else N||I(_);let v=16-i;if(v!==s.length)throw Error(`arx: nonce must be ${v} or 16 bytes`);if(v!==12){let e=new Uint8Array(12);e.set(s,a?0:12-s.length),s=e,p.push(s)}let y=I(A(s));try{return pe(e,g,_,y,c,l,u,o),l}finally{j(...p)}}}function H(e,t){return e[t++]&255|(e[t++]&255)<<8}var he=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(e){e=ae(E(e,32,`key`));let t=H(e,0),n=H(e,2),r=H(e,4),i=H(e,6),a=H(e,8),o=H(e,10),s=H(e,12),c=H(e,14);this.r[0]=t&8191,this.r[1]=(t>>>13|n<<3)&8191,this.r[2]=(n>>>10|r<<6)&7939,this.r[3]=(r>>>7|i<<9)&8191,this.r[4]=(i>>>4|a<<12)&255,this.r[5]=a>>>1&8190,this.r[6]=(a>>>14|o<<2)&8191,this.r[7]=(o>>>11|s<<5)&8065,this.r[8]=(s>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=H(e,16+2*t)}process(e,t,n=!1){let r=n?0:2048,{h:i,r:a}=this,o=a[0],s=a[1],c=a[2],l=a[3],u=a[4],d=a[5],f=a[6],p=a[7],m=a[8],h=a[9],g=H(e,t+0),_=H(e,t+2),v=H(e,t+4),y=H(e,t+6),b=H(e,t+8),x=H(e,t+10),S=H(e,t+12),C=H(e,t+14),w=i[0]+(g&8191),T=i[1]+((g>>>13|_<<3)&8191),E=i[2]+((_>>>10|v<<6)&8191),D=i[3]+((v>>>7|y<<9)&8191),O=i[4]+((y>>>4|b<<12)&8191),k=i[5]+(b>>>1&8191),A=i[6]+((b>>>14|x<<2)&8191),j=i[7]+((x>>>11|S<<5)&8191),M=i[8]+((S>>>8|C<<8)&8191),N=i[9]+(C>>>5|r),P=0,F=P+w*o+5*h*T+5*m*E+5*p*D+5*f*O;P=F>>>13,F&=8191,F+=5*d*k+5*u*A+5*l*j+5*c*M+5*s*N,P+=F>>>13,F&=8191;let I=P+w*s+T*o+5*h*E+5*m*D+5*p*O;P=I>>>13,I&=8191,I+=5*f*k+5*d*A+5*u*j+5*l*M+5*c*N,P+=I>>>13,I&=8191;let L=P+w*c+T*s+E*o+5*h*D+5*m*O;P=L>>>13,L&=8191,L+=5*p*k+5*f*A+5*d*j+5*u*M+5*l*N,P+=L>>>13,L&=8191;let R=P+w*l+T*c+E*s+D*o+5*h*O;P=R>>>13,R&=8191,R+=5*m*k+5*p*A+5*f*j+5*d*M+5*u*N,P+=R>>>13,R&=8191;let z=P+w*u+T*l+E*c+D*s+O*o;P=z>>>13,z&=8191,z+=5*h*k+5*m*A+5*p*j+5*f*M+5*d*N,P+=z>>>13,z&=8191;let ee=P+w*d+T*u+E*l+D*c+O*s;P=ee>>>13,ee&=8191,ee+=k*o+5*h*A+5*m*j+5*p*M+5*f*N,P+=ee>>>13,ee&=8191;let te=P+w*f+T*d+E*u+D*l+O*c;P=te>>>13,te&=8191,te+=k*s+A*o+5*h*j+5*m*M+5*p*N,P+=te>>>13,te&=8191;let ne=P+w*p+T*f+E*d+D*u+O*l;P=ne>>>13,ne&=8191,ne+=k*c+A*s+j*o+5*h*M+5*m*N,P+=ne>>>13,ne&=8191;let B=P+w*m+T*p+E*f+D*d+O*u;P=B>>>13,B&=8191,B+=k*l+A*c+j*s+M*o+5*h*N,P+=B>>>13,B&=8191;let re=P+w*h+T*m+E*p+D*f+O*d;P=re>>>13,re&=8191,re+=k*u+A*l+j*c+M*s+N*o,P+=re>>>13,re&=8191,P=(P<<2)+P|0,P=P+F|0,F=P&8191,P>>>=13,I+=P,i[0]=F,i[1]=I,i[2]=L,i[3]=R,i[4]=z,i[5]=ee,i[6]=te,i[7]=ne,i[8]=B,i[9]=re}finalize(){let{h:e,pad:t}=this,n=new Uint16Array(10),r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=r*5,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let i=(r^1)-1;for(let e=0;e<10;e++)n[e]&=i;i=~i;for(let t=0;t<10;t++)e[t]=e[t]&i|n[t];e[0]=(e[0]|e[1]<<13)&65535,e[1]=(e[1]>>>3|e[2]<<10)&65535,e[2]=(e[2]>>>6|e[3]<<7)&65535,e[3]=(e[3]>>>9|e[4]<<4)&65535,e[4]=(e[4]>>>12|e[5]<<1|e[6]<<14)&65535,e[5]=(e[6]>>>2|e[7]<<11)&65535,e[6]=(e[7]>>>5|e[8]<<8)&65535,e[7]=(e[8]>>>8|e[9]<<5)&65535;let a=e[0]+t[0];e[0]=a&65535;for(let n=1;n<8;n++)a=(e[n]+t[n]|0)+(a>>>16)|0,e[n]=a&65535;j(n)}update(e){O(this),E(e),e=ae(e);let{buffer:t,blockLen:n}=this,r=e.length;for(let i=0;i<r;){let a=Math.min(n-this.pos,r-i);if(a===n){for(;n<=r-i;i+=n)this.process(e,i);continue}t.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===n&&(this.process(t,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,j(this.h,this.r,this.buffer,this.pad)}digestInto(e){O(this),k(e,this),this.finished=!0;let{buffer:t,h:n}=this,{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let i=0;for(let t=0;t<8;t++)e[i++]=n[t]>>>0,e[i++]=n[t]>>>8}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}},ge=te(32,e=>new he(e));function _e(e,t,n,r,i,a=20){let o=e[0],s=e[1],c=e[2],l=e[3],u=t[0],d=t[1],f=t[2],p=t[3],m=t[4],h=t[5],g=t[6],_=t[7],v=i,y=n[0],b=n[1],x=n[2],S=o,C=s,w=c,T=l,E=u,D=d,O=f,k=p,A=m,j=h,M=g,N=_,P=v,F=y,I=b,L=x;for(let e=0;e<a;e+=2)S=S+E|0,P=V(P^S,16),A=A+P|0,E=V(E^A,12),S=S+E|0,P=V(P^S,8),A=A+P|0,E=V(E^A,7),C=C+D|0,F=V(F^C,16),j=j+F|0,D=V(D^j,12),C=C+D|0,F=V(F^C,8),j=j+F|0,D=V(D^j,7),w=w+O|0,I=V(I^w,16),M=M+I|0,O=V(O^M,12),w=w+O|0,I=V(I^w,8),M=M+I|0,O=V(O^M,7),T=T+k|0,L=V(L^T,16),N=N+L|0,k=V(k^N,12),T=T+k|0,L=V(L^T,8),N=N+L|0,k=V(k^N,7),S=S+D|0,L=V(L^S,16),M=M+L|0,D=V(D^M,12),S=S+D|0,L=V(L^S,8),M=M+L|0,D=V(D^M,7),C=C+O|0,P=V(P^C,16),N=N+P|0,O=V(O^N,12),C=C+O|0,P=V(P^C,8),N=N+P|0,O=V(O^N,7),w=w+k|0,F=V(F^w,16),A=A+F|0,k=V(k^A,12),w=w+k|0,F=V(F^w,8),A=A+F|0,k=V(k^A,7),T=T+E|0,I=V(I^T,16),j=j+I|0,E=V(E^j,12),T=T+E|0,I=V(I^T,8),j=j+I|0,E=V(E^j,7);let R=0;r[R++]=o+S|0,r[R++]=s+C|0,r[R++]=c+w|0,r[R++]=l+T|0,r[R++]=u+E|0,r[R++]=d+D|0,r[R++]=f+O|0,r[R++]=p+k|0,r[R++]=m+A|0,r[R++]=h+j|0,r[R++]=g+M|0,r[R++]=_+N|0,r[R++]=v+P|0,r[R++]=y+F|0,r[R++]=b+I|0,r[R++]=x+L|0}var ve=me(_e,{counterRight:!1,counterLength:4,allowShortKeys:!1}),ye=new Uint8Array(16),be=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(ye.subarray(n))},xe=new Uint8Array(32);function Se(e,t,n,r,i){i!==void 0&&E(i,void 0,`AAD`);let a=e(t,n,xe),o=re(r.length,i?i.length:0,!0),s=ge.create(a);i&&be(s,i),be(s,r),s.update(o);let c=s.digest();return j(a,o),c}var Ce=ne({blockSize:64,nonceLength:12,tagLength:16,withAAD:!0},(e=>(t,n,r)=>({encrypt(i,a){let o=i.length;a=B(o+16,a,!1),a.set(i);let s=a.subarray(0,-16);e(t,n,s,s,1);let c=Se(e,t,n,s,r);return a.set(c,o),j(c),a},decrypt(i,a){a=B(i.length-16,a,!1);let o=i.subarray(0,-16),s=i.subarray(-16),c=Se(e,t,n,o,r);if(!ee(s,c))throw j(c),Error(`invalid tag`);return a.set(i.subarray(0,-16)),e(t,n,a,a,1),j(c),a}}))(ve)),we=`deepview-triage-sync.v1.content-key`,Te=`deepview-triage-sync.v1.sign-key`,Ee=`deepview-triage-sync.v1.save`,De=`deepview-triage-sync.v1.subscribe`,Oe=12,ke=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),Ae=null;function je(){return Ae||(Ae=(async()=>{try{return await crypto.subtle.importKey(`raw`,new Uint8Array(32),{name:`ChaCha20-Poly1305`},!1,[`encrypt`,`decrypt`]),!0}catch{return!1}})(),Ae)}async function Me(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await crypto.subtle.importKey(`raw`,n,`HKDF`,!1,[`deriveBits`]),i=await crypto.subtle.deriveBits({name:`HKDF`,hash:`SHA-256`,salt:new Uint8Array,info:b(t)},r,256);return new Uint8Array(i)}async function Ne(e){return await Me(e,we)}async function Pe(e,t){let n=await Me(e,`${Te}|${t}`),r=new Uint8Array(ke.length+32);r.set(ke,0),r.set(n,ke.length);let i=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!0,[`sign`]),a=await crypto.subtle.exportKey(`jwk`,i),o=a.x;if(delete a.d,o==null)throw Error(`Ed25519 JWK export returned no public key`);let s=Uint8Array.fromBase64(o,{alphabet:`base64url`}),c=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!1,[`sign`]);return n.fill(0),r.fill(0),{privateKey:c,publicKey:s,publicKeyB64:o}}function Fe({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:i}){return b([Ee,e,t==null?``:String(t),n===!0?`1`:``,r,i].join(`
|
|
1
|
+
import{i as e,n as t,o as n,q as r,r as i,s as a,t as o,u as s,v as c,w as l}from"./chunk-7BKKYVWR.js";import{a as u,b as d,d as f,e as p,f as m,g as h,h as g,i as _}from"./chunk-7C7DWL7I.js";import{a as v,b as y}from"./chunk-PNHBZGDD.js";import{a as b,c as x}from"./chunk-TUII34K2.js";import"./chunk-OOJM4CTU.js";function S(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}var C=e=>e?`"${e}" `:``;function w(e,t=``){if(typeof e!=`boolean`)throw TypeError(C(t)+`expected boolean, got type=`+typeof e);return e}function T(e,t=``){if(typeof e!=`number`)throw TypeError(C(t)+`expected number, got `+typeof e);if(!Number.isSafeInteger(e)||e<0)throw RangeError(C(t)+`expected integer >= 0, got `+e);return e}function E(e,t,n=``){if(S(e)&&(t===void 0||e.length===t))return e;t!==void 0&&T(t,`length`);let r=S(e),i=t===void 0?``:` of length ${t}`,a=r?`length=${e.length}`:`type=${typeof e}`,o=C(n)+`expected Uint8Array`+i+`, got `+a;throw r?RangeError(o):TypeError(o)}var D=(e,t)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(t===`object`?`expected valid options object`:`"${t}" expected object, got type=${typeof e}`)};function O(e,t=!0){if(e.destroyed)throw Error(`hash was destroyed`);if(t&&e.finished)throw Error(`digest() was already called`)}function k(e,t){E(e,void 0,`output`);let n=t.outputLen;if(!(e.length>=n))throw RangeError(`"output" expected length >= `+n)}function A(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function j(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function M(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var N=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function P(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function F(e){for(let t=0;t<e.length;t++)e[t]=P(e[t]);return e}var I=N?e=>e:F;function L(e,t){return!e.byteLength||!t.byteLength?!1:e.buffer===t.buffer&&e.byteOffset<t.byteOffset+t.byteLength&&t.byteOffset<e.byteOffset+e.byteLength}function R(e,t){if(L(e,t)&&e.byteOffset<t.byteOffset)throw Error(`complex overlap of input and output is not supported`)}function z(e,t){return D(e,`defaults`),D(t,`opts`),Object.assign(e,t)}function ee(e,t){if(e=E(e),t=E(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 te(e,t,n){let r=t,i=n||(()=>[]),a=(e,t)=>r(t,...i(e)).update(e).digest(),o=r(new Uint8Array(e),...i(new Uint8Array));return a.outputLen=o.outputLen,a.blockLen=o.blockLen,a.create=(e,...t)=>r(e,...t),a}var ne=(e,t)=>{function n(n,...r){if(E(n,void 0,`key`),e.nonceLength!==void 0){let t=r[0];E(t,e.varSizeNonce?void 0:e.nonceLength,`nonce`)}let i=e.tagLength,a=e.nonceLength===void 0?0:1;if(!e.withAAD){for(let e=a;e<r.length;e++)if(S(r[e]))throw Error(`AAD not supported`)}e.withAAD&&r[a]!==void 0&&E(r[a],void 0,`AAD`);let o=t(n,...r),s=(e,t)=>{if(t!==void 0){if(e!==2)throw Error(`cipher output not supported`);E(t,void 0,`output`)}},c=!1;return{encrypt(e,t){if(c)throw Error(`cannot encrypt() twice with same key + nonce`);return c=!0,E(e,void 0,`data`),s(o.encrypt.length,t),o.encrypt(e,t)},decrypt(e,t){if(E(e,void 0,`data`),i&&e.length<i)throw Error(`"ciphertext" expected length >= tagLength=`+i);return s(o.decrypt.length,t),o.decrypt(e,t)}}}return Object.assign(n,e),n};function B(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(E(t,e,`output`),n&&!ie(t))throw Error(`invalid output, must be aligned`);return t}function re(e,t,n){T(e),T(t),w(n);let r=new Uint8Array(16),i=M(r);return i.setBigUint64(0,BigInt(t),n),i.setBigUint64(8,BigInt(e),n),r}function ie(e){return e.byteOffset%4==0}function ae(e){return Uint8Array.from(E(e))}var oe=e=>Uint8Array.from(e.split(``),e=>e.charCodeAt(0)),se=I(A(oe(`expand 16-byte k`))),ce=I(A(oe(`expand 32-byte k`)));function V(e,t){return e<<t|e>>>32-t}var le=64,ue=16,de=2**32-1,fe=Uint32Array.of();function pe(e,t,n,r,i,a,o,s){let c=i.length,l=new Uint8Array(le),u=A(l),d=N&&ie(i)&&ie(a),f=d?A(i):fe,p=d?A(a):fe;if(!N){for(let d=0;d<c;o++){if(e(t,n,r,u,o,s),I(u),o>=de)throw Error(`arx: counter overflow`);let f=Math.min(le,c-d);for(let e=0,t;e<f;e++)t=d+e,a[t]=i[t]^l[e];d+=f}return}for(let m=0;m<c;o++){if(e(t,n,r,u,o,s),o>=de)throw Error(`arx: counter overflow`);let h=Math.min(le,c-m);if(d&&h===le){let e=m/4;if(m%4!=0)throw Error(`arx: invalid block position`);for(let t=0,n;t<ue;t++)n=e+t,p[n]=f[n]^u[t];m+=le;continue}for(let e=0,t;e<h;e++)t=m+e,a[t]=i[t]^l[e];m+=h}}function me(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:i,counterRight:a,rounds:o}=z({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!=`function`)throw Error(`core must be a function`);return T(i),T(o),w(a),w(n),(t,s,c,l,u=0)=>{E(t,void 0,`key`),E(s,void 0,`nonce`),E(c,void 0,`data`);let d=c.length,f=l!==void 0;if(l=B(d,l,!1),f&&R(c,l),T(u),u<0||u>=de)throw Error(`arx: counter overflow`);let p=[],m=t.length,h,g;if(m===32)p.push(h=ae(t)),g=ce;else if(m===16&&n)h=new Uint8Array(32),h.set(t),h.set(t,16),g=se,p.push(h);else throw E(t,32,`arx key`),Error(`invalid key size`);(!N||!ie(s))&&p.push(s=ae(s));let _=A(h);if(r){if(s.length!==24)throw Error(`arx: extended nonce must be 24 bytes`);let e=s.subarray(0,16);if(N)r(g,_,A(e),_);else{let t=I(Uint32Array.from(g));r(t,_,A(e),_),j(t),I(_)}s=s.subarray(16)}else N||I(_);let v=16-i;if(v!==s.length)throw Error(`arx: nonce must be ${v} or 16 bytes`);if(v!==12){let e=new Uint8Array(12);e.set(s,a?0:12-s.length),s=e,p.push(s)}let y=I(A(s));try{return pe(e,g,_,y,c,l,u,o),l}finally{j(...p)}}}function H(e,t){return e[t++]&255|(e[t++]&255)<<8}var he=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(e){e=ae(E(e,32,`key`));let t=H(e,0),n=H(e,2),r=H(e,4),i=H(e,6),a=H(e,8),o=H(e,10),s=H(e,12),c=H(e,14);this.r[0]=t&8191,this.r[1]=(t>>>13|n<<3)&8191,this.r[2]=(n>>>10|r<<6)&7939,this.r[3]=(r>>>7|i<<9)&8191,this.r[4]=(i>>>4|a<<12)&255,this.r[5]=a>>>1&8190,this.r[6]=(a>>>14|o<<2)&8191,this.r[7]=(o>>>11|s<<5)&8065,this.r[8]=(s>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=H(e,16+2*t)}process(e,t,n=!1){let r=n?0:2048,{h:i,r:a}=this,o=a[0],s=a[1],c=a[2],l=a[3],u=a[4],d=a[5],f=a[6],p=a[7],m=a[8],h=a[9],g=H(e,t+0),_=H(e,t+2),v=H(e,t+4),y=H(e,t+6),b=H(e,t+8),x=H(e,t+10),S=H(e,t+12),C=H(e,t+14),w=i[0]+(g&8191),T=i[1]+((g>>>13|_<<3)&8191),E=i[2]+((_>>>10|v<<6)&8191),D=i[3]+((v>>>7|y<<9)&8191),O=i[4]+((y>>>4|b<<12)&8191),k=i[5]+(b>>>1&8191),A=i[6]+((b>>>14|x<<2)&8191),j=i[7]+((x>>>11|S<<5)&8191),M=i[8]+((S>>>8|C<<8)&8191),N=i[9]+(C>>>5|r),P=0,F=P+w*o+5*h*T+5*m*E+5*p*D+5*f*O;P=F>>>13,F&=8191,F+=5*d*k+5*u*A+5*l*j+5*c*M+5*s*N,P+=F>>>13,F&=8191;let I=P+w*s+T*o+5*h*E+5*m*D+5*p*O;P=I>>>13,I&=8191,I+=5*f*k+5*d*A+5*u*j+5*l*M+5*c*N,P+=I>>>13,I&=8191;let L=P+w*c+T*s+E*o+5*h*D+5*m*O;P=L>>>13,L&=8191,L+=5*p*k+5*f*A+5*d*j+5*u*M+5*l*N,P+=L>>>13,L&=8191;let R=P+w*l+T*c+E*s+D*o+5*h*O;P=R>>>13,R&=8191,R+=5*m*k+5*p*A+5*f*j+5*d*M+5*u*N,P+=R>>>13,R&=8191;let z=P+w*u+T*l+E*c+D*s+O*o;P=z>>>13,z&=8191,z+=5*h*k+5*m*A+5*p*j+5*f*M+5*d*N,P+=z>>>13,z&=8191;let ee=P+w*d+T*u+E*l+D*c+O*s;P=ee>>>13,ee&=8191,ee+=k*o+5*h*A+5*m*j+5*p*M+5*f*N,P+=ee>>>13,ee&=8191;let te=P+w*f+T*d+E*u+D*l+O*c;P=te>>>13,te&=8191,te+=k*s+A*o+5*h*j+5*m*M+5*p*N,P+=te>>>13,te&=8191;let ne=P+w*p+T*f+E*d+D*u+O*l;P=ne>>>13,ne&=8191,ne+=k*c+A*s+j*o+5*h*M+5*m*N,P+=ne>>>13,ne&=8191;let B=P+w*m+T*p+E*f+D*d+O*u;P=B>>>13,B&=8191,B+=k*l+A*c+j*s+M*o+5*h*N,P+=B>>>13,B&=8191;let re=P+w*h+T*m+E*p+D*f+O*d;P=re>>>13,re&=8191,re+=k*u+A*l+j*c+M*s+N*o,P+=re>>>13,re&=8191,P=(P<<2)+P|0,P=P+F|0,F=P&8191,P>>>=13,I+=P,i[0]=F,i[1]=I,i[2]=L,i[3]=R,i[4]=z,i[5]=ee,i[6]=te,i[7]=ne,i[8]=B,i[9]=re}finalize(){let{h:e,pad:t}=this,n=new Uint16Array(10),r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=r*5,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let i=(r^1)-1;for(let e=0;e<10;e++)n[e]&=i;i=~i;for(let t=0;t<10;t++)e[t]=e[t]&i|n[t];e[0]=(e[0]|e[1]<<13)&65535,e[1]=(e[1]>>>3|e[2]<<10)&65535,e[2]=(e[2]>>>6|e[3]<<7)&65535,e[3]=(e[3]>>>9|e[4]<<4)&65535,e[4]=(e[4]>>>12|e[5]<<1|e[6]<<14)&65535,e[5]=(e[6]>>>2|e[7]<<11)&65535,e[6]=(e[7]>>>5|e[8]<<8)&65535,e[7]=(e[8]>>>8|e[9]<<5)&65535;let a=e[0]+t[0];e[0]=a&65535;for(let n=1;n<8;n++)a=(e[n]+t[n]|0)+(a>>>16)|0,e[n]=a&65535;j(n)}update(e){O(this),E(e),e=ae(e);let{buffer:t,blockLen:n}=this,r=e.length;for(let i=0;i<r;){let a=Math.min(n-this.pos,r-i);if(a===n){for(;n<=r-i;i+=n)this.process(e,i);continue}t.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===n&&(this.process(t,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,j(this.h,this.r,this.buffer,this.pad)}digestInto(e){O(this),k(e,this),this.finished=!0;let{buffer:t,h:n}=this,{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let i=0;for(let t=0;t<8;t++)e[i++]=n[t]>>>0,e[i++]=n[t]>>>8}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}},ge=te(32,e=>new he(e));function _e(e,t,n,r,i,a=20){let o=e[0],s=e[1],c=e[2],l=e[3],u=t[0],d=t[1],f=t[2],p=t[3],m=t[4],h=t[5],g=t[6],_=t[7],v=i,y=n[0],b=n[1],x=n[2],S=o,C=s,w=c,T=l,E=u,D=d,O=f,k=p,A=m,j=h,M=g,N=_,P=v,F=y,I=b,L=x;for(let e=0;e<a;e+=2)S=S+E|0,P=V(P^S,16),A=A+P|0,E=V(E^A,12),S=S+E|0,P=V(P^S,8),A=A+P|0,E=V(E^A,7),C=C+D|0,F=V(F^C,16),j=j+F|0,D=V(D^j,12),C=C+D|0,F=V(F^C,8),j=j+F|0,D=V(D^j,7),w=w+O|0,I=V(I^w,16),M=M+I|0,O=V(O^M,12),w=w+O|0,I=V(I^w,8),M=M+I|0,O=V(O^M,7),T=T+k|0,L=V(L^T,16),N=N+L|0,k=V(k^N,12),T=T+k|0,L=V(L^T,8),N=N+L|0,k=V(k^N,7),S=S+D|0,L=V(L^S,16),M=M+L|0,D=V(D^M,12),S=S+D|0,L=V(L^S,8),M=M+L|0,D=V(D^M,7),C=C+O|0,P=V(P^C,16),N=N+P|0,O=V(O^N,12),C=C+O|0,P=V(P^C,8),N=N+P|0,O=V(O^N,7),w=w+k|0,F=V(F^w,16),A=A+F|0,k=V(k^A,12),w=w+k|0,F=V(F^w,8),A=A+F|0,k=V(k^A,7),T=T+E|0,I=V(I^T,16),j=j+I|0,E=V(E^j,12),T=T+E|0,I=V(I^T,8),j=j+I|0,E=V(E^j,7);let R=0;r[R++]=o+S|0,r[R++]=s+C|0,r[R++]=c+w|0,r[R++]=l+T|0,r[R++]=u+E|0,r[R++]=d+D|0,r[R++]=f+O|0,r[R++]=p+k|0,r[R++]=m+A|0,r[R++]=h+j|0,r[R++]=g+M|0,r[R++]=_+N|0,r[R++]=v+P|0,r[R++]=y+F|0,r[R++]=b+I|0,r[R++]=x+L|0}var ve=me(_e,{counterRight:!1,counterLength:4,allowShortKeys:!1}),ye=new Uint8Array(16),be=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(ye.subarray(n))},xe=new Uint8Array(32);function Se(e,t,n,r,i){i!==void 0&&E(i,void 0,`AAD`);let a=e(t,n,xe),o=re(r.length,i?i.length:0,!0),s=ge.create(a);i&&be(s,i),be(s,r),s.update(o);let c=s.digest();return j(a,o),c}var Ce=ne({blockSize:64,nonceLength:12,tagLength:16,withAAD:!0},(e=>(t,n,r)=>({encrypt(i,a){let o=i.length;a=B(o+16,a,!1),a.set(i);let s=a.subarray(0,-16);e(t,n,s,s,1);let c=Se(e,t,n,s,r);return a.set(c,o),j(c),a},decrypt(i,a){a=B(i.length-16,a,!1);let o=i.subarray(0,-16),s=i.subarray(-16),c=Se(e,t,n,o,r);if(!ee(s,c))throw j(c),Error(`invalid tag`);return a.set(i.subarray(0,-16)),e(t,n,a,a,1),j(c),a}}))(ve)),we=`deepview-triage-sync.v1.content-key`,Te=`deepview-triage-sync.v1.sign-key`,Ee=`deepview-triage-sync.v1.save`,De=`deepview-triage-sync.v1.subscribe`,Oe=12,ke=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),Ae=null;function je(){return Ae||(Ae=(async()=>{try{return await crypto.subtle.importKey(`raw`,new Uint8Array(32),{name:`ChaCha20-Poly1305`},!1,[`encrypt`,`decrypt`]),!0}catch{return!1}})(),Ae)}async function Me(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await crypto.subtle.importKey(`raw`,n,`HKDF`,!1,[`deriveBits`]),i=await crypto.subtle.deriveBits({name:`HKDF`,hash:`SHA-256`,salt:new Uint8Array,info:b(t)},r,256);return new Uint8Array(i)}async function Ne(e){return await Me(e,we)}async function Pe(e,t){let n=await Me(e,`${Te}|${t}`),r=new Uint8Array(ke.length+32);r.set(ke,0),r.set(n,ke.length);let i=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!0,[`sign`]),a=await crypto.subtle.exportKey(`jwk`,i),o=a.x;if(delete a.d,o==null)throw Error(`Ed25519 JWK export returned no public key`);let s=Uint8Array.fromBase64(o,{alphabet:`base64url`}),c=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!1,[`sign`]);return n.fill(0),r.fill(0),{privateKey:c,publicKey:s,publicKeyB64:o}}function Fe({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:i}){return b([Ee,e,t==null?``:String(t),n===!0?`1`:``,r,i].join(`
|
|
2
2
|
`))}async function Ie(e,t){let n=await crypto.subtle.sign({name:`Ed25519`},e,t);return new Uint8Array(n).toBase64({alphabet:`base64url`,omitPadding:!0})}async function Le(e,t){return await Ie(e,Fe(t))}async function Re(e){let t=Fe(e),n=await crypto.subtle.digest(`SHA-256`,t);return new Uint8Array(n).toBase64({alphabet:`base64url`,omitPadding:!0})}function ze(e,t,n){return b([De,e,t==null?``:String(t),n].join(`
|
|
3
3
|
`))}async function Be(e,t,n,r){return await Ie(e,ze(t,n,r))}async function Ve(e,t,n){try{let r=await crypto.subtle.importKey(`raw`,e,{name:`Ed25519`},!1,[`verify`]),i=Uint8Array.fromBase64(n,{alphabet:`base64url`}),a=Fe(t);return await crypto.subtle.verify({name:`Ed25519`},r,i,a)}catch{return!1}}function He(){let e=new Uint8Array(Oe);return crypto.getRandomValues(e),e}function Ue(e,t){return b(`${e}|${t==null?``:String(t)}`)}async function We(e,t,n){let r=He();if(await je()){let i=await crypto.subtle.importKey(`raw`,e,{name:`ChaCha20-Poly1305`},!1,[`encrypt`]);return{nonce:r,ciphertext:new Uint8Array(await crypto.subtle.encrypt({name:`ChaCha20-Poly1305`,iv:r,additionalData:n},i,t))}}return{nonce:r,ciphertext:Ce(e,r,n).encrypt(t)}}async function Ge(e,t,n,r){if(await je()){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 Ce(e,t,r).decrypt(n)}var Ke=64;function qe(e,t){return e<=t?t:2**(32-Math.clz32(e-1))}async function Je(e){let t=b(JSON.stringify(e)),n=await v(t);if(n.length>1073741820)throw Error(`payload too large`);let r=qe(4+n.length,Ke),i=new Uint8Array(r);return new DataView(i.buffer,i.byteOffset,i.byteLength).setUint32(0,n.length,!1),i.set(n,4),i}var Ye=67108864;async function Xe(e){if(e.length<4)throw Error(`plaintext too short`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(0,!1);if(t+4>e.length)throw Error(`length prefix exceeds buffer`);let n=e.subarray(4,4+t),r=await y(n,{maxBytes:Ye});return JSON.parse(x(r))}async function Ze(e,t,n){let{nonce:r,ciphertext:i}=await We(e,await Je(t),n);return{nonce:r.toBase64(),ciphertext:i.toBase64()}}async function Qe(e,t,n,r){return Xe(await Ge(e,Uint8Array.fromBase64(t),Uint8Array.fromBase64(n),r))}var $e=`deepview-objstore.v1.content`,et=`deepview-objstore.v1.tag`,tt=`objstore-tag
|
|
4
4
|
`,nt=`objstore-bundle-tag
|
|
@@ -8,7 +8,7 @@ ${r}`)).decrypt(a);if(o.length<2)throw Error(`objstore plaintext truncated: ${o.
|
|
|
8
8
|
|
|
9
9
|
`))>=0;){let e=this.buf.slice(0,n);this.buf=this.buf.slice(n+2);let r=``,i=[];for(let t of e.split(`
|
|
10
10
|
`))if(!t.startsWith(`:`)){if(t.startsWith(`event:`)){r=t.slice(6).trim();continue}if(t.startsWith(`data:`)){i.push(t.slice(5).replace(/^ /u,``));continue}}i.length!==0&&t.push({event:r,data:i.join(`
|
|
11
|
-
`)})}return t}},At=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(e){super(),this.baseUrl=wt(e),this.scheduleFlush(!0)}send(t){if(this.readyState===e.CLOSED)throw Error(`sse-transport: send on closed transport`);let n;try{n=JSON.parse(t)}catch(e){throw Error(`sse-transport: send received non-JSON payload: ${e.message}`,{cause:e})}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:Et;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())},Ot),this.downstreamWatchdog.unref?.())}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let e=new Promise(e=>{setTimeout(e,Dt)});await Promise.race([this.inFlightPost.catch(()=>{}),e])}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,i=++this.postSeq;this.armDownstreamWatchdog();let a=(async()=>{let t;try{t=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n),credentials:`same-origin`,signal:this.fetchAbort.signal})}catch(t){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST failed:`,t),this.shutdown();return}if(!t.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${t.status} ${t.statusText}; closing`),this.shutdown();return}let a=t.body;if(!a){this.shutdown();return}this.consumeStream(a,i)})();this.inFlightPost=a,a.finally(()=>{this.inFlightPost===a&&(this.inFlightPost=null)})}async consumeStream(t,n){let r=t.getReader();this.activeReaders.add(r);let i=new kt,a=new TextDecoder,o=!1;try{for(;;){let{value:t,done:s}=await r.read();if(s){o=!0;break}if(this.readyState===e.CLOSED)return;n===this.postSeq&&this.armDownstreamWatchdog();let c=i.parse(a.decode(t,{stream:!0}));for(let e of c)this.dispatchOrderedEvent(e,n)}if(this.readyState!==e.CLOSED){let e=a.decode();if(e.length>0)for(let t of i.parse(e))this.dispatchOrderedEvent(t,n)}o&&this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: live downstream closed without a close frame; reconnecting`),this.shutdown())}catch(t){this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: stream read failed:`,t),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 e,n;try{let r=JSON.parse(t.data);typeof r.code==`number`&&(e=r.code),typeof r.reason==`string`&&(n=r.reason)}catch{}this.shutdown(e,n);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 e of this.activeReaders)try{e.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)}},jt=1e3,Mt=3e4,Nt=3e4,Pt=`session restarted`;function Ft(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,i=null,a=!1,o=null,s=0,c=!1,l=!1,u=null,d=jt,f=null,p=null,m=null,h=null,g=!1,_=null,v=new Set;function y(){u&&=(clearTimeout(u),null)}function b(){f&&=(clearTimeout(f),null)}function x(){y(),!c&&(l||s!==0&&t&&(u=setTimeout(()=>{u=null,N()},Math.round(d*(.5+Math.random()*.5))),d=Math.min(d*2,Mt)))}function S(){C(),!(n<=0)&&(a||(p=setInterval(()=>{!i||i.readyState!==i.OPEN||m||(k({type:`ping`}),m=setTimeout(()=>{m=null,console.warn(`socket-transport: heartbeat timeout; closing socket`);try{i?.close()}catch{}},r))},n)))}function C(){p&&=(clearInterval(p),null),m&&=(clearTimeout(m),null)}function w(e){for(let t of v)try{t.onDisconnected(e)}catch(e){console.warn(`socket-transport: consumer.onDisconnected threw:`,e)}}function T(e){for(let t of v)try{t.onConnected(e)}catch(e){console.warn(`socket-transport: consumer.onConnected threw:`,e)}}function E(e){for(let t of v)try{t.onMessage(e)}catch(e){console.warn(`socket-transport: consumer.onMessage threw:`,e)}}function D(e){let t;try{let n=typeof e.data==`string`?e.data:new TextDecoder().decode(e.data);t=JSON.parse(n)}catch(e){console.warn(`socket-transport: dropping malformed wire frame:`,e);return}if(t&&typeof t==`object`){if(t.type===`pong`){m&&=(clearTimeout(m),null);return}if(t.type===`challenge`){if(typeof t.nonce!=`string`)return;o!=null&&o!==t.nonce&&w(Pt),o=t.nonce,T(o);return}if(t.type===`authenticated`){O(!0),E(t);return}if(t.type===`unauthorized`&&t.kind===`auth-failed`){O(!1);return}E(t)}}function O(e){if(!_)return;let t=_;_=null,t(e)}function k(e){if(!i||i.readyState!==i.OPEN)return!1;try{return i.send(JSON.stringify(e)),!0}catch(e){return console.warn(`socket-transport: send failed:`,e),!1}}function A(e){return new Promise(t=>{_=t,k({type:`authenticate`,password:e})||(_=null,t(!1))})}function j(){if(h)return h;if(!i||i.readyState!==i.OPEN)return Promise.resolve(!1);let t=i,n=(async()=>{await Promise.resolve();try{let n=bt();if(n!=null&&!g){g=!0;let e=await A(n);if(i!==t)return!1;if(e)return!0;try{await St(null)}catch(e){console.warn(`socket-transport: failed to clear cached auth password:`,e)}}let r=!0;for(;;){if(i!==t||!i||i.readyState!==i.OPEN||!e.authResolver)return!1;let n;try{n=await e.authResolver({retry:!r})}catch(e){return console.warn(`socket-transport: authentication resolver threw:`,e),!1}if(i!==t||(r=!1,n==null||n===``))return!1;let a=await A(n);if(i!==t)return!1;if(a){try{await St(n)}catch(e){console.warn(`socket-transport: failed to cache auth password:`,e)}return!0}}}finally{h=null}})();return h=n,n}function M(e){if(b(),!i)return;let t=i;i=null,o=null,g=!1,O(!1),C(),w(e);try{t.close()}catch{}}function N(){c||l||i||s!==0&&t&&P(!1)}function P(e){if(c||l||s===0||!t)return;let n;try{n=e?new At(t):new WebSocket(t)}catch(t){if(!e){console.warn(`socket-transport: WebSocket constructor failed; trying SSE fallback:`,t),P(!0);return}console.warn(`socket-transport: SSE constructor failed:`,t),x();return}i=n,a=e,o=null,g=!1;let r=!1;n.addEventListener(`open`,()=>{i===n&&(r=!0,b(),f=setTimeout(()=>{f=null,i===n&&(d=jt)},Nt),f.unref?.(),S())}),n.addEventListener(`message`,e=>{i===n&&D(e)}),n.addEventListener(`close`,t=>{if(i===n){if(b(),i=null,o=null,g=!1,O(!1),C(),!r&&!e&&!c&&s>0){if(typeof fetch>`u`){w(`socket closed`),x();return}console.warn(`socket-transport: WebSocket failed to open; falling back to SSE`),P(!0);return}t?.code===1001&&(d=jt),w(`socket closed`),!c&&s>0&&x()}}),n.addEventListener(`error`,()=>{})}function F(){if(c)return{release(){}};s+=1,s===1&&!i&&N();let e=!1;return{release(){e||(e=!0,!c&&(--s,s===0&&(y(),d=jt,M(`released`))))}}}function I(e){e!==t&&(y(),d=jt,t=e,i&&M(`serverUrl changed`),s>0&&t&&N())}function L(e){v.add(e);let t=!1;return{remove(){t||(t=!0,v.delete(e))}}}function R(){c||(c=!0,y(),M(`transport closed`),v.clear(),s=0)}function z(e){let{pingMs:t,pongMs:i}=e;typeof t==`number`&&t>=0&&(n=t),typeof i==`number`&&i>0&&(r=i),p&&S()}function ee(){g=!1}function te(e){e!==l&&(l=e,e?(y(),M(`protocol-locked`)):s>0&&t&&N())}return{acquire:F,setServerUrl:I,addConsumer:L,send:k,getNonce:()=>o,getSocket:()=>i,isSse:()=>i!=null&&a,runAuthFlow:j,close:R,setProtocolLocked:te,setHeartbeatTimings:z,resetCachedReplayGuard:ee}}var It=64,Lt=5,Rt=6,zt=25,Bt=500;function Vt(e,t){if(!/^\/api\/objstore\/[\w-]+\/[\w-]+$/u.test(e))throw 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 TypeError(`objstore: urlPath origin mismatch \u2014 expected ${n}, got ${r.origin}`);return r.href}function Ht(s){let c=s.requestTimeoutMs??1e4,l=new URL(s.httpOrigin).origin,u=s.transport===void 0,d=s.transport??Ft(s.authResolver===void 0?{serverUrl:s.serverUrl}:{serverUrl:s.serverUrl,authResolver:s.authResolver}),f=!1,p=new Map,m=new Map,h=[],g=[];function _(e,t,n,r){let i=e.seenVersions.get(t);(!i||i.incarnation!==n||r>i.version)&&e.seenVersions.set(t,{incarnation:n,version:r})}function v(e){e.connectedPromise=new Promise((t,n)=>{e.resolveConnected=t,e.rejectConnected=n}),e.connectedPromise.catch(()=>{})}function y(e){e.listedPromise=new Promise((t,n)=>{e.resolveListed=t,e.rejectListed=n}),e.listedPromise.catch(()=>{})}function b(e,t){let n=new Map(e.inventory),r=e.inventorySeeded;e.inventorySeeded=!0,e.inventory.clear();for(let r of t){let t=e.inventory.get(r.resourceTag)??n.get(r.resourceTag),i=t?.incarnation===r.incarnation&&t.version>=r.version?t:{version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};e.inventory.set(r.resourceTag,i),_(e,r.resourceTag,i.incarnation,i.version)}if(e.resolveListed(),r){for(let[t,r]of n){let n=e.inventory.get(t);if(n?.incarnation!==r.incarnation){n||e.seenVersions.delete(t);for(let n of e.deletedHandlers)try{n({resourceTag:t,version:r.version})}catch{}}}for(let[t,r]of e.inventory){let i=n.get(t);if(i?.version===r.version&&i.incarnation===r.incarnation)continue;let a={resourceTag:t,version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};for(let t of e.putHandlers)try{t(a)}catch{}}}}function x(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)Gt(n)&&t.push(Kt(n));return t}function S(e){let t;return new Promise((n,r)=>{t=setTimeout(()=>r(Error(`objstore: inventory not seeded (no subscribe ack) after ${c}ms`)),c),e.listedPromise.then(n,r)}).finally(()=>clearTimeout(t))}function C(e){for(let t=0;t<h.length;t++)if(e(h[t]))return Promise.resolve(h.splice(t,1)[0]);return new Promise((t,n)=>{let r={predicate:e,resolve:()=>{},reject:e=>{clearTimeout(i);let t=g.indexOf(r);t>=0&&g.splice(t,1),n(e)}},i=setTimeout(()=>r.reject(Error(`objstore: response timeout after ${c}ms`)),c);r.resolve=e=>{clearTimeout(i),t(e)},g.push(r)})}function w(e){if(!d.send(e))throw Error(`objstore: socket not open`)}function T(e){for(let t of g.splice(0))try{t.reject(Error(`objstore: ${e}`))}catch{}}function E(e){if(e.type===`workspace-subscribed`&&typeof e.workspaceTag==`string`){let t=p.get(e.workspaceTag);t&&Array.isArray(e.resources)&&b(t,x(e.resources));return}if(e.type===`objstore-put`&&typeof e.workspaceTag==`string`&&Gt(e)){let t=p.get(e.workspaceTag);if(!t)return;let n=Kt(e),r=t.inventory.get(n.resourceTag);if(r?.incarnation===n.incarnation&&r.version>n.version)return;_(t,n.resourceTag,n.incarnation,n.version),t.inventory.set(n.resourceTag,{version:n.version,incarnation:n.incarnation,contentLength:n.contentLength});let i={resourceTag:n.resourceTag,version:n.version,incarnation:n.incarnation,contentLength:n.contentLength};for(let e of t.putHandlers)try{e(i)}catch{}return}if(e.type===`objstore-deleted`&&typeof e.workspaceTag==`string`&&typeof e.resourceTag==`string`&&typeof e.version==`number`){let t=p.get(e.workspaceTag);if(!t)return;let n=e.resourceTag,r=e.version,i=e.incarnation;if(i!==void 0){if(typeof i!=`string`||i.length===0)return;let e=t.inventory.get(n)??t.seenVersions.get(n);if(e&&(i!==e.incarnation||e.version>r))return}t.seenVersions.delete(n),t.inventory.delete(n);let a={resourceTag:n,version:r};for(let e of t.deletedHandlers)try{e(a)}catch{}return}if(e.type!==`workspace-state`&&e.type!==`workspace-save-ack`&&e.type!==`workspace-save-error`&&e.type!==`workspace-subscribed`&&e.type!==`authenticated`&&e.type!==`server-info`){for(let t=0;t<g.length;t++)if(g[t].predicate(e)){let n=g[t];g.splice(t,1),n.resolve(e);return}if(h.push(e),h.length>It){let e=h.splice(0,h.length-It),t=[...new Set(e.map(e=>e.type??`<no-type>`))].slice(0,4);console.warn(`objstore: dropping ${e.length} unmatched frame(s) over MAX_QUEUE_SIZE=${It} (types: ${t.join(`, `)})`)}}}function D(){for(let e of p.values())e.closed||e.connected||(e.connected=!0,e.resolveConnected())}function O(e){T(e);for(let e of p.values())e.closed||e.connected&&(e.connected=!1,v(e))}let k=d.addConsumer({onMessage:E,onConnected:D,onDisconnected:O}),A=e=>Vt(e,l),j=(e,t)=>A(`/api/objstore/${e}/${t}`);async function M(t,n,r){let i=d.getNonce();if(!i)throw Error(`objstore: socket not open`);let a=await e(t.signingKey,r,i),o,s=!1;for(;w({type:`objstore-put-begin`,...r,signature:a}),o=await C(e=>e.workspaceTag===t.workspaceTag&&e.resourceTag===n&&(e.type===`objstore-put-token`||e.type===`objstore-put-error`||e.type===`objstore-conflict`||e.type===`unauthorized`&&e.kind===`gated`)),!(o.type!==`unauthorized`||s||(s=!0,!await d.runAuthFlow())););if(o.type===`unauthorized`)return{kind:`unauthorized`};if(o.type===`objstore-put-error`){if(o.reason===`workspace-full`)return{kind:`workspace-full`};throw Error(`objstore: put-error reason='${String(o.reason)}'`)}if(o.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(o.current)?Kt(o.current):null};if(typeof o.urlPath!=`string`||typeof o.token!=`string`)throw TypeError(`objstore: malformed put-token (missing urlPath/token)`);return{kind:`token`,urlPath:o.urlPath,token:o.token}}async function N(e,t,n,r){let a=Date.now(),o=await i(e.signingKey,n,a),s=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`put`,ts:a,signature:o,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation,expectedLength:n.expectedLength,contentHash:r})});if(s.status===401)return{kind:`unauthorized`};if(s.status===403)return{kind:`workspace-full`};if(s.status===409)return{kind:`conflict`,current:await Ut(s)};if(!s.ok){let e=``;try{e=await s.text()}catch{}throw Error(`objstore: REST put-begin failed ${s.status} ${e.slice(0,200)}`)}let c;try{c=await s.json()}catch{throw TypeError(`objstore: put-mint JSON parse failed`)}if(!c||typeof c!=`object`||typeof c.urlPath!=`string`||typeof c.token!=`string`)throw TypeError(`objstore: malformed put-mint (missing urlPath/token)`);return{kind:`token`,urlPath:c.urlPath,token:c.token}}async function P(e,t){let n=`objstore: ${Pt}`;for(let r=0;;r++)try{return await t()}catch(t){if(r<Lt&&!e.closed&&t instanceof Error&&t.message===n)continue;throw t}}function F(e,t){return P(e,()=>I(e,t))}async function I(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n=await o(t.bytes),r={workspaceTag:e.workspaceTag,resourceTag:t.resourceTag,prevVersion:t.prev?.version??null,prevIncarnation:t.prev?.incarnation??null,expectedLength:t.bytes.byteLength,contentHash:n},i;if(d.isSse()?(i=await N(e,t.resourceTag,r,n),i.kind===`unauthorized`&&(i=await M(e,t.resourceTag,r))):i=await M(e,t.resourceTag,r),i.kind===`unauthorized`)return{ok:!1,reason:`unauthorized`};if(i.kind===`workspace-full`)return{ok:!1,reason:`workspace-full`};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};let a=await globalThis.fetch(A(i.urlPath),{method:`PUT`,headers:{authorization:`Bearer ${i.token}`,"content-type":`application/octet-stream`},body:t.bytes});if(!a.ok){if(a.status===409||a.status===410)return{ok:!1,reason:`conflict`,current:a.status===409?await Ut(a):null};let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST PUT failed ${a.status} ${e.slice(0,200)}`)}let s;try{s=await a.json()}catch{throw TypeError(`objstore: PUT ack JSON parse failed`)}if(!s||typeof s!=`object`||!Wt(s.version)||typeof s.incarnation!=`string`||typeof s.contentHash!=`string`||!Wt(s.contentLength))throw TypeError(`objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)`);let c=s;if(c.contentHash!==n||c.contentLength!==t.bytes.byteLength)throw Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${c.contentHash.slice(0,16)}\u2026 length=${c.contentLength}, client signed ${n.slice(0,16)}\u2026 length=${t.bytes.byteLength}`);return{ok:!0,meta:c}}async function L(e,t){let r=d.getNonce();if(!r)throw Error(`objstore: socket not open`);let i=await n(e.signingKey,e.workspaceTag,t,r);w({type:`objstore-fetch`,workspaceTag:e.workspaceTag,resourceTag:t,signature:i});let a=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t&&(n.type===`objstore-fetch-token`||n.type===`objstore-fetch-not-found`));if(a.type===`objstore-fetch-not-found`)return{kind:`not-found`};if(typeof a.urlPath!=`string`||typeof a.token!=`string`||!Gt(a))throw TypeError(`objstore: malformed fetch-token (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:a.urlPath,token:a.token,meta:Kt(a)}}async function R(e,t){let n=Date.now(),i=await r(e.signingKey,e.workspaceTag,t,n),a=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`fetch`,ts:n,signature:i})});if(a.status===404)return{kind:`not-found`};if(a.status===401)return{kind:`unauthorized`};if(!a.ok){let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST fetch-mint failed ${a.status} ${e.slice(0,200)}`)}let o;try{o=await a.json()}catch{throw TypeError(`objstore: fetch-mint JSON parse failed`)}if(!o||typeof o!=`object`||typeof o.urlPath!=`string`||typeof o.token!=`string`||!Gt(o))throw TypeError(`objstore: malformed fetch-mint (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:o.urlPath,token:o.token,meta:Kt(o)}}async function z(e,t){for(let n=0;n<Rt;n++){let r=await P(e,()=>ee(e,t));if(r.kind===`ok`)return r.value;if(r.kind===`not-found`)return null;if(n+1<Rt){let e=Math.min(Bt,zt*2**n);await new Promise(t=>{setTimeout(t,e)})}}return null}async function ee(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n;if(d.isSse()?(n=await R(e,t),n.kind===`unauthorized`&&(n=await L(e,t))):n=await L(e,t),n.kind===`not-found`)return{kind:`not-found`};if(n.kind===`unauthorized`)throw Error(`objstore: fetch-mint unauthorized`);let r=n.meta,i=await globalThis.fetch(A(n.urlPath),{method:`GET`,headers:{authorization:`Bearer ${n.token}`}});if(!i.ok){if(i.status===404||i.status===503)return{kind:`retry`};let e=``;try{e=await i.text()}catch{}throw Error(`objstore: REST GET failed ${i.status} ${e.slice(0,200)}`)}let a=new Uint8Array(await i.arrayBuffer()),s=await o(a);if(s!==r.contentHash)throw Error(`objstore: contentHash mismatch \u2014 expected ${r.contentHash.slice(0,16)}\u2026, got ${s.slice(0,16)}\u2026`);return{kind:`ok`,value:{bytes:a,meta:r}}}async function te(e,n){let r=d.getNonce();if(!r)throw Error(`objstore: socket not open`);let i=await t(e.signingKey,n,r);w({type:`objstore-delete`,...n,signature:i});let a=await C(t=>t.workspaceTag===e.workspaceTag&&t.resourceTag===n.resourceTag&&(t.type===`objstore-deleted-ack`||t.type===`objstore-delete-error`||t.type===`objstore-conflict`));if(a.type===`objstore-deleted-ack`){if(typeof a.deletedVersion!=`number`)throw TypeError(`objstore: malformed deleted-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:a.deletedVersion}}if(a.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(a.current)?Kt(a.current):null};if(a.reason===`not-found`)return{kind:`not-found`};throw Error(`objstore: delete-error reason='${String(a.reason)}'`)}async function ne(e,t,n){let r=Date.now(),i=await a(e.signingKey,n,r),o=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`delete`,ts:r,signature:i,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation})});if(o.status===401)return{kind:`unauthorized`};if(o.status===404)return{kind:`not-found`};if(o.status===409)return{kind:`conflict`,current:await Ut(o)};if(!o.ok){let e=``;try{e=await o.text()}catch{}throw Error(`objstore: REST delete failed ${o.status} ${e.slice(0,200)}`)}let s;try{s=await o.json()}catch{throw TypeError(`objstore: delete-ack JSON parse failed`)}if(!s||typeof s!=`object`||typeof s.deletedVersion!=`number`)throw TypeError(`objstore: malformed delete-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:s.deletedVersion}}function B(e,t,n){return P(e,()=>re(e,t,n))}async function re(e,t,n){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let r={workspaceTag:e.workspaceTag,resourceTag:t,prevVersion:n?.version??null,prevIncarnation:n?.incarnation??null},i;if(d.isSse()?(i=await ne(e,t,r),i.kind===`unauthorized`&&(i=await te(e,r))):i=await te(e,r),i.kind===`ok`)return{ok:!0,deletedVersion:i.deletedVersion};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};if(i.kind===`not-found`)return{ok:!1,reason:`not-found`};throw Error(`objstore: delete unauthorized`)}function ie(e,t,n,r){let i=e.seenVersions.get(t);if(i&&i.incarnation===n&&r<i.version)throw Error(`objstore: version-rollback rejected \u2014 fetched v${r} for an incarnation we've already seen at v${i.version}`)}async function ae(e,t){if(f)throw Error(`objstore: client closed`);if(!t||typeof t.workspaceId!=`string`)throw Error(`objstore: openWorkspace requires a WorkspaceSubscription (triageSync.ensureSubscription) — the client must not open a session for a tag with no backing sync subscribe`);let n=e.workspaceTag;if(t.workspaceTag!=null&&t.workspaceTag!==n)throw Error(`objstore: openWorkspace — WorkspaceSubscription is for a different workspace than these keys`);if(p.has(n))throw Error(`objstore: workspace ${n.slice(0,8)}\u2026 is already open on this client`);let r={workspaceTag:n,signingKey:e.signingKey,contentKey:new Uint8Array(e.contentKey),tagKey:new Uint8Array(e.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,inventorySeeded:!1,connected:!1,closed:!1};v(r),y(r),p.set(n,r);let i=r;(async()=>{let e;try{e=await t.resources}catch{return}!i.closed&&!i.inventorySeeded&&b(i,x(e))})();let a=d.acquire();m.set(n,a),d.getNonce()&&(i.connected=!0,i.resolveConnected());let o=null;try{await new Promise((e,t)=>{o=setTimeout(()=>{t(Error(`objstore: connect timeout after ${c}ms`))},c),i.connectedPromise.then(()=>e(),e=>t(e))})}catch(e){o&&clearTimeout(o),p.delete(n),m.delete(n),i.closed=!0;try{i.contentKey.fill(0)}catch{}try{i.tagKey.fill(0)}catch{}throw a.release(),e}o&&clearTimeout(o);async function s(e,t,n){let r=await F(i,{resourceTag:e,bytes:t,prev:n});return r.ok?(n??i.seenVersions.delete(e),_(i,e,r.meta.incarnation,r.meta.version),i.inventory.set(e,{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}),{ok:!0,meta:{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}}):r.reason===`workspace-full`?{ok:!1,reason:`workspace-full`}:r.reason===`unauthorized`?{ok:!1,reason:`unauthorized`}:(r.current&&_(i,e,r.current.incarnation,r.current.version),{ok:!1,reason:`conflict`,current:r.current})}async function l(e){let t=await U(i.tagKey,e.fileName);return await s(t,ct(i.contentKey,e.fileName,e.content,n,t),e.prev)}async function u(e){let t=await U(i.tagKey,e),r=await z(i,t);if(!r)return null;ie(i,t,r.meta.incarnation,r.meta.version);let{fileName:a,content:o}=ft(i.contentKey,r.bytes,n,t);if(a!==e)throw Error(`objstore: fileName-binding mismatch \u2014 requested '${e}', payload encoded '${a}'`);return _(i,t,r.meta.incarnation,r.meta.version),{content:o,version:r.meta.version,incarnation:r.meta.incarnation}}async function h(e){let t=await z(i,e);if(!t)return null;ie(i,e,t.meta.incarnation,t.meta.version);let{fileName:r,content:a}=ft(i.contentKey,t.bytes,n,e);if(await U(i.tagKey,r)===e)return _(i,e,t.meta.incarnation,t.meta.version),{kind:`report`,fileName:r,content:a,version:t.meta.version,incarnation:t.meta.incarnation};if(await st(i.tagKey,r)===e){let{name:n,content:o}=dt(a);return _(i,e,t.meta.incarnation,t.meta.version),{kind:`bundle`,integrity:r,name:n,content:o,version:t.meta.version,incarnation:t.meta.incarnation}}throw Error(`objstore: fetchByTag — decrypted name does not derive back to the requested resourceTag under either the report or bundle tag scheme (relay or workspace member produced a non-round-trippable tag-name pair)`)}async function g(e,t){let n=await B(i,e,t);return n.ok?(i.seenVersions.delete(e),i.inventory.delete(e),n):n.reason===`not-found`?{ok:!1,reason:`not-found`}:(n.current&&_(i,e,n.current.incarnation,n.current.version),{ok:!1,reason:`conflict`,current:n.current})}async function C(e,t){return await g(await U(i.tagKey,e),t)}async function w(){if(await S(i),i.closed)throw Error(`objstore: session closed`);return[...i.inventory.entries()].map(([e,t])=>({resourceTag:e,version:t.version,incarnation:t.incarnation,contentLength:t.contentLength}))}async function T(e){let t=await st(i.tagKey,e.integrity),r=ut(e.name,e.content);return await s(t,ct(i.contentKey,e.integrity,r,n,t),e.prev)}async function E(e){let t=await st(i.tagKey,e),r=await z(i,t);if(!r)return null;ie(i,t,r.meta.incarnation,r.meta.version);let{fileName:a,content:o}=ft(i.contentKey,r.bytes,n,t);if(a!==e)throw Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${e}', payload encoded '${a}'`);let{name:s,content:c}=dt(o);return _(i,t,r.meta.incarnation,r.meta.version),{name:s,content:c,version:r.meta.version,incarnation:r.meta.incarnation}}async function D(e,t){return await g(await st(i.tagKey,e),t)}return{put:l,fetch:u,fetchByTag:h,delete:C,list:w,putBundle:T,fetchBundle:E,deleteBundle:D,onPut(e){return i.putHandlers.add(e),()=>{i.putHandlers.delete(e)}},onDeleted(e){return i.deletedHandlers.add(e),()=>{i.deletedHandlers.delete(e)}},close(){if(i.closed)return;i.closed=!0,p.delete(n);try{i.contentKey.fill(0)}catch{}try{i.tagKey.fill(0)}catch{}try{i.rejectConnected(Error(`objstore: session closed`))}catch{}try{i.rejectListed(Error(`objstore: session closed`))}catch{}let e=m.get(n);m.delete(n),e&&e.release()}}}function oe(){if(!f){f=!0;for(let e of p.values()){e.closed=!0;try{e.contentKey.fill(0)}catch{}try{e.tagKey.fill(0)}catch{}try{e.rejectConnected(Error(`objstore: client closed`))}catch{}try{e.rejectListed(Error(`objstore: client closed`))}catch{}}p.clear();for(let e of m.values())e.release();m.clear(),k.remove(),u&&d.close()}}return{openWorkspace:ae,close:oe}}async function Ut(e){try{let t=await e.json();if(Wt(t.currentVersion)&&typeof t.currentIncarnation==`string`)return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function Wt(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}function Gt(e){return!e||typeof e!=`object`?!1:typeof e.resourceTag==`string`&&Wt(e.version)&&typeof e.incarnation==`string`&&typeof e.contentHash==`string`&&Wt(e.contentLength)&&typeof e.signature==`string`}function Kt(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var qt=null;function Jt(e){qt=typeof e==`function`?e:null}var Yt=Ft({serverUrl:``,authResolver:e=>qt==null?Promise.resolve(null):qt(e)});function Xt(){return Yt}var Zt=new Set([`busy`]);function Qt(e){return typeof e?.color==`string`?e.color:``}function $t(e){return u(e??void 0)??``}function en(e){return typeof e?.comment==`string`?e.comment:``}function tn(e){return typeof e?.fix==`string`?e.fix:``}function nn(e){return e?.flagged===!0?`flagged`:e?.flagged===!1?`not flagged`:``}function rn(e,t,n,r){let i=[];for(let a of Object.keys(e)){let o=e[a],s=t[a],c=n[a],l=o??null,u=[{name:`color`,norm:Qt},{name:`triage`,norm:$t},{name:`comment`,norm:en},{name:`fix`,norm:tn},{name:`flagged`,norm:nn}];for(let{name:e,norm:t}of u){let n=t(s),o=t(l),u=t(c);(o!==n||r?.has(a))&&u!==n&&o!==u&&i.push({id:a,property:e,local:o,imported:u})}}return i}function an(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 i=new Set(n);for(let e of r)if(!i.has(e))return!1;return!0}function on(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&&an(e.ignoredReports,t.ignoredReports)&&an(e.scopedIgnoredReports,t.scopedIgnoredReports)}function sn(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!on(e[r]??{},t[r]??{}))return!1;return!0}function cn(e=[],t=[],n=[]){let r=new Set(e),i=new Set(t),a=new Set(n);for(let e of r)i.has(e)||a.delete(e);for(let e of i)r.has(e)||a.add(e);return[...a]}function ln(e,t,n,r){let i=Object.assign(Object.create(null),n);for(let a of new Set([...Object.keys(e),...Object.keys(t),...r??[]])){let o=r?.has(a),s=p(e[a])??{},c=p(t[a])??{},l={...p(n[a])};for(let e of[`color`,`comment`,`fix`,`flagged`])(s[e]!==c[e]||o)&&Object.assign(l,{[e]:c[e]});if(o||s.triage!==c.triage||!an(s.ignoredReports,c.ignoredReports)){let e=!o&&d(c)&&d(l),t=e?cn(s.ignoredReports,c.ignoredReports,l.ignoredReports):c.ignoredReports??[];(!e||s.triage!==c.triage)&&(c.triage===void 0?delete l.triage:l.triage=c.triage),t.length===0?delete l.ignoredReports:l.ignoredReports=t}l.scopedIgnoredReports=[...new Set([...c.scopedIgnoredReports??[],...l.scopedIgnoredReports??[]])];let u=p(l);u?i[a]=u:delete i[a]}return i}function un(e,t){let n=Object.assign(Object.create(null),e);for(let[e,r]of Object.entries(t))r===null?delete n[e]:r!==void 0&&(n[e]=r);return n}function dn(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of r)on(e[i]??{},t[i]??{})||(n[i]=t[i]??null);return n}function fn(e){for(let t in e)return!1;return!0}function pn(e,t){let n=Object.assign(Object.create(null),e),r=gt().state,i=t instanceof Set?t:new Set(t);for(let e of i){let t=p(r.triage.get(e));t?n[e]=t:delete n[e]}return n}function mn(e,t){let n=gt().state,r=[];for(let i of t){let t=e[i];if(!t||typeof t!=`object`)continue;let a=n.triage.get(i);if(t.color){let e=a?.color;e===void 0?m(n.triage,i,{color:t.color}):e!==t.color&&r.push({id:i,property:`color`,local:e,imported:t.color})}let o=u(t);if(o){let e=u(a);e===void 0?m(n.triage,i,{triage:o}):e!==o&&r.push({id:i,property:`triage`,local:e,imported:o})}if(t.comment){let e=a?.comment;e===void 0?m(n.triage,i,{comment:t.comment}):e!==t.comment&&r.push({id:i,property:`comment`,local:e,imported:t.comment})}if(t.fix){let e=a?.fix;e===void 0?m(n.triage,i,{fix:t.fix}):e!==t.fix&&r.push({id:i,property:`fix`,local:e,imported:t.fix})}if(typeof t.flagged==`boolean`){let e=a?.flagged;e===void 0?m(n.triage,i,{flagged:t.flagged}):e!==t.flagged&&r.push({id:i,property:`flagged`,local:e?`flagged`:`not flagged`,imported:t.flagged?`flagged`:`not flagged`})}if(d(t)&&d(a)&&Array.isArray(t.ignoredReports))for(let e of t.ignoredReports)typeof e==`string`&&((a?.ignoredReports?.length??0)>0&&!a?.ignoredReports?.includes(e)||g(n.triage,i,e,!0,f(t,e)))}return r}function hn(e,t){let n=gt().state;for(let r of e)t[`${r.id}:${r.property}`]===`imported`&&gn(r.id,r.property)===r.local&&(r.property===`color`?m(n.triage,r.id,{color:r.imported}):r.property===`comment`?m(n.triage,r.id,{comment:r.imported}):r.property===`fix`?m(n.triage,r.id,{fix:r.imported}):r.property===`triage`?r.imported===`inprogress`||r.imported===`fixed`||r.imported===`invalid`||r.imported===`deleted`||r.imported===`ignored`?m(n.triage,r.id,{triage:r.imported,...r.imported===`ignored`?{}:{ignoredReports:void 0}}):m(n.triage,r.id,{triage:void 0}):r.property===`flagged`&&m(n.triage,r.id,{flagged:r.imported===`flagged`||r.imported!==`not flagged`&&void 0}))}function gn(e,t){let n=gt().state.triage.get(e);return t===`color`?n?.color??``:t===`triage`?u(n)??``:t===`comment`?n?.comment??``:t===`fix`?n?.fix??``:t===`flagged`?n?.flagged===!0?`flagged`:n?.flagged===!1?`not flagged`:``:``}function _n(e,t){let n=gt().state,r=t instanceof Set?t:new Set(t);for(let t of r){let r=e[t],i=d(r)?r?.ignoredReports:void 0;h(n.triage,t,{...r,ignoredReports:i})}}var vn=`deepview.sync.sessions`,yn=vn,bn=1,xn=!1,Sn=new Set;function Cn(){return xn}function wn(e){if(xn!==e){xn=e,console.warn(e?`triage-sync: can't persist the sessions blob — 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 Sn)try{t(e)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}}function Tn(e){let t=t=>e(t);return Sn.add(t),queueMicrotask(()=>{if(Sn.has(t))try{t(xn)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}),()=>Sn.delete(t)}function En(){try{let e=gt().getSecureItem(vn);if(!e)return{kind:`empty`};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{kind:`empty`};let n=t;return n.version===bn&&n.sessions&&typeof n.sessions==`object`&&!Array.isArray(n.sessions)?{kind:`v1`,map:n.sessions}:n.version===bn?{kind:`empty`}:`version`in n?{kind:`unknown-version`}:{kind:`legacy`,map:n}}catch{return{kind:`empty`}}}function Dn(){let e=En();return e.kind===`v1`||e.kind===`legacy`?e.map:{}}async function On(e){try{return await gt().setSecureItem(vn,JSON.stringify({version:bn,sessions:e})),!0}catch(e){return console.warn(`Triage sync: could not persist session state:`,e),!1}}function kn(e,t){if(!t)return null;let n=Dn()[e];return!n||n.serverUrl!==t?null:{baseRevision:typeof n.baseRevision==`string`?n.baseRevision:null,...n.hasBase===!0?{hasBase:!0}:{},baseState:n.baseState&&typeof n.baseState==`object`?Object.assign(Object.create(null),n.baseState):Object.create(null),savesSinceKeyframe:typeof n.savesSinceKeyframe==`number`?n.savesSinceKeyframe:0}}async function An(e){await navigator.locks.request(yn,async()=>{let t=En();if(t.kind===`unknown-version`){wn(!0);return}let n=t.kind===`v1`||t.kind===`legacy`?t.map:{};await e(n)!==!1&&wn(!await On(n))})}function jn(e=null){An(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(gt().listWorkspaces().map(e=>e.id)),i=!1;for(let a of n){let n=t[a];(!r.has(a)||e!=null&&n?.serverUrl!==e)&&(delete t[a],i=!0)}return i?void 0:!1}).catch(e=>{console.warn(`Triage sync: prunePersistedSessions lock failed:`,e)})}function Mn(e){return An(t=>{if(!(e in t))return!1;delete t[e]})}var Nn=!1,Pn=new Set;function Fn(){return Nn}function In(e){if(Nn!==e){Nn=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 — reconnects are being redirected to the proxy login. Reload the page to sign in again.`);for(let t of Pn)try{t(e)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}}function Ln(e){let t=t=>e(t);return Pn.add(t),queueMicrotask(()=>{if(Pn.has(t))try{t(Nn)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}),()=>Pn.delete(t)}async function Rn(e){if(typeof fetch>`u`||!e)return!1;let t;try{t=wt(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 zn,Bn,Vn,Hn,Un,Wn=`deepview.triageSyncUrl`,Gn=`deepview.sync.userEnabled`,Kn=/^\d+$/u,qn=()=>{},Jn=null,W=``,Yn=!0,Xn=!1,G=Xt(),Zn=null,Qn=100,$n=5,er=2e3;function tr(){return Yn&&!Xn&&!!W&&nr()}function nr(){try{return Bn().length>0}catch{return!1}}var rr=new Set,ir=new Set,ar=null;function or(e){let t=s(e);if(t!=null){ar=t;for(let e of ir)try{e(t)}catch(e){console.warn(`Triage sync: onServerInfo listener failed:`,e)}}}function sr(){if(!tr())return`off`;for(let e of q.values())if(e.error)return`error`;let e=G.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return`offline`;for(let e of q.values())if(!e.subscribeAcked)return`connecting`;return`online`}var cr=`off`;function K(){let e=sr();if(e!==cr){cr=e,vr(e);for(let t of rr)try{t(e)}catch(e){console.warn(`Triage sync status listener:`,e)}}}var lr=6e3,ur=3e4,dr=null,fr=!1,pr=0;function mr(e){return e===`offline`||e===`connecting`}function hr(){pr+=1,dr!=null&&(clearTimeout(dr),dr=null)}function gr(e){hr(),dr=setTimeout(()=>{dr=null,_r()},e),dr.unref?.()}async function _r(){if(fr||!tr()||!mr(sr()))return;let e=pr;fr=!0;let t=!1;try{t=await Rn(W)}catch{t=!1}finally{fr=!1}if(pr===e){if(!tr()||!mr(sr())){In(!1);return}if(t){In(!0);return}gr(ur)}}function vr(e){mr(e)?dr==null&&!fr&&!Fn()&&gr(lr):(hr(),In(!1))}var yr=0,q=new Map;function br(e){for(let t of q.values())if(t.workspaceTag===e)return t;return null}function J(e){return q.get(e.workspaceId)===e}function xr(e){e.busyRetryTimer??(e.busyRetryTimer=setTimeout(()=>{e.busyRetryTimer=null,J(e)&&(e.error||e.pending||!e.pendingSave||(e.pendingSave=!1,Y(e)))},er),e.busyRetryTimer.unref?.())}function Sr(e){e.busyRetryTimer!=null&&(clearTimeout(e.busyRetryTimer),e.busyRetryTimer=null)}function Cr(e){if(e.appliedRevisions.clear(),Sr(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 e of t)try{e([])}catch{}}}function wr(e){let t=new Set,n=Bn().find(t=>t.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let e of zn.reports)if(r.has(e.fileName))for(let n of e.groups)for(let e of n){let n=e.id??String(e._id);Kn.test(n)||t.add(n)}return t}function Tr(e){let t=wr(e.workspaceId),n=[];for(let r of t)e.ids.has(r)||n.push(r);let r=[];return n.length>0&&(r=mn(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function Er(){let e=En();e.kind===`unknown-version`?wn(!0):(e.kind===`v1`||e.kind===`legacy`)&&wn(!1),xt(),G.resetCachedReplayGuard()}function Dr(e){if(!e||!W)return;let t=W,n=e.generation,r={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState,...e.baseRevision===null&&e.hasBase?{hasBase:!0}:{}};An(i=>{if(!J(e)||e.generation!==n||W!==t)return!1;i[e.workspaceId]=r}).catch(e=>{console.warn(`Triage sync: persistSession lock failed:`,e)})}function Or(e){let t=Bn().find(t=>t.id===e.workspaceId);if(!t){e.error=`workspace no longer exists`,K();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,i]=await Promise.all([Ne(t.privateKey),Pe(t.privateKey,e.workspaceId)]);if(q.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=i.privateKey,e.verifyingKey=i.publicKey,e.workspaceTag=i.publicKeyB64,G.getSocket()?.readyState!==WebSocket.OPEN){qr();return}Mr(e),Y(e),K()}catch(t){console.warn(`Triage sync: key derivation failed:`,t),q.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${t instanceof Error?t.message:String(t)}`,K())}})()}function kr(e){return G.send(e)}function Ar(e,t){if(!G.isSse()){kr(t);return}let n=e.generation,r=e.pending,i=()=>J(e)&&e.generation===n&&e.pending===r;jr(t,i).then(e=>(e&&i()&&kr(t),null)).catch(()=>{i()&&kr(t)})}async function jr(e,t){if(!W)return!0;let n;try{n=Tt(W)}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 i=e.workspaceTag,a=e.base??null;if(r.status===401)return!0;if(r.ok){let e=null;try{e=await r.json()}catch{return!0}return t()?!e||typeof e.id!=`string`||(Wr({type:`workspace-save-ack`,workspaceTag:i,base:a,id:e.id},t),!1):!1}if(r.status===409){let e=null;try{e=await r.json()}catch{return!0}return t()?(Wr({type:`workspace-state`,workspaceTag:i,revisions:e&&Array.isArray(e.revisions)?e.revisions:[]},t),Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`stale-base`},t),!1):!1}return r.status!==413||(Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`too-large`},t),!1)}function Mr(e,t=!1){if(!J(e)||!tr())return;let n=G.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=G.getNonce();if(r==null)return;let i=e.baseRevision,a=n,o=e.signingKey,s=e.workspaceTag,c=e.generation;(async()=>{try{let t=await Be(o,s,i,r);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s||G.getSocket()!==a||G.getNonce()!==r)return;e.subscribed=!0,kr({type:`workspace-subscribe`,workspaceTag:s,from:i,signature:t})}catch(e){console.warn(`Triage sync: subscribe sign failed:`,e)}})()}function Y(e){if(!J(e)||!tr()||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}Tr(e),e.localState=pn(e.baseState,e.ids);let t=G.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=Qn,r=dn(n?Object.create(null):e.baseState,e.localState);if(fn(r)&&!n)return;let i=e.baseRevision,a=e.key,o=e.signingKey,s=e.workspaceTag,c=e.generation;e.encrypting=!0,(async()=>{try{let t=Ue(s,i),{nonce:l,ciphertext:u}=await Ze(a,r,t),d={publicKeyB64:s,base:i,keyframe:n,nonceB64:l,ciphertextB64:u},f=await Le(o,d),p=await Re(d);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s)return;if(e.baseRevision!==i||e.receiving){e.pendingSave=!0;return}e.pending={base:i,id:p,changeset:r,keyframe:n},e.pendingSave=!1;let m={type:`workspace-save`,workspaceTag:s,base:i,nonce:l,ciphertext:u,signature:f};n&&(m.keyframe=!0),Ar(e,m),e.consecutiveFailures=0,e.error&&(e.error=null,K())}catch(t){console.warn(`Triage sync: encrypt/sign failed:`,t),J(e)&&e.generation===c&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=$n&&(e.error=`encrypt/sign failed: ${t instanceof Error?t.message:String(t)}`,K()))}finally{J(e)&&e.generation===c&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&!e.receiving&&(e.pendingSave=!1,Y(e)))}})()}async function Nr(e,t,n,r){for(let i of t){if(!i||typeof i!=`object`||typeof i.id==`string`&&(i.id===e.baseRevision||e.appliedRevisions.has(i.id)||r.has(i.id)))continue;let t=e.baseRevision,a=i.keyframe===!0;if(!(t==null?i.base==null||a:i.base===t))return console.warn(`Triage sync: chain base mismatch (expected ${t}, got ${i.base})`),!1;if(typeof i.signature!=`string`||typeof i.nonce!=`string`||typeof i.ciphertext!=`string`||typeof i.id!=`string`)return console.warn(`Triage sync: revision missing signature/nonce/ciphertext/id; resyncing`),e.savesSinceKeyframe=Qn,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let o=typeof i.base==`string`?i.base:null,s={publicKeyB64:e.workspaceTag,base:o,keyframe:a,nonceB64:i.nonce,ciphertextB64:i.ciphertext},c=await Ve(e.verifyingKey,s,i.signature);if(!n())return!1;if(!c)return console.warn(`Triage sync: revision signature did not verify; resyncing`),e.savesSinceKeyframe=Qn,!1;let l=await Re(s);if(!n())return!1;if(i.id!==l)return console.warn(`Triage sync: revision id does not match content hash; resyncing`),e.savesSinceKeyframe=Qn,!1;let u;try{let t=Ue(e.workspaceTag,o);u=await Qe(e.key,i.nonce,i.ciphertext,t)}catch(t){return console.warn(`Triage sync: decrypt failed; resyncing`,t),e.savesSinceKeyframe=Qn,!1}if(!n())return!1;e.baseState=un(a?Object.create(null):e.baseState,u??{}),e.baseRevision=i.id,e.appliedRevisions.add(i.id),e.pending?.id===i.id&&(e.pending=null),e.savesSinceKeyframe=a?0:Math.min((e.savesSinceKeyframe??0)+1,Qn)}return!0}async function Pr(e,t,n=[],r=null){if(!J(e))return;let i=e.generation;e.localState=un(e.baseState,t),yr++;try{_n(e.localState,e.ids),r&&n.length>0&&(hn(n.filter(({id:t})=>e.ids.has(t)),r),e.localState=pn(e.baseState,e.ids)),Dr(e),await Vn()}finally{yr--}if(J(e)&&e.generation===i){e.localState=pn(e.baseState,e.ids),qn();for(let t of q.values())t!==e&&Y(t)}}function Fr(e){return Tr(e),e.localState=pn(e.baseState,e.ids),dn(e.baseState,e.localState)}async function Ir(e,t){let n=e.generation;if(e.pending&&t.base===e.pending.base&&typeof t.id==`string`&&t.id===e.pending.id){Fr(e);let r=e.localState;if(e.baseState=un(e.pending.keyframe?Object.create(null):e.baseState,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,Qn),e.pending=null,e.staleResetAttempted=!1,await Pr(e,dn(e.baseState,r)),!J(e)||e.generation!==n)return;(e.pendingSave||!sn(e.localState,e.baseState))&&(e.pendingSave=!1,Y(e));return}if(e.pending){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: ack mismatch (pending ${e.pending.base}/${e.pending.id.slice(0,8)}, ack ${t.base}/${n})`);return}if(t.id!==e.baseRevision){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${n}\u2026; pending was already cleared`),e.pendingSave=!0,Y(e)}}async function Lr(e,t){if(!Array.isArray(t)||!e.key)return;if(t.length===0){e.resyncAttempted&&(e.resyncAttempted=!1,e.pending||(e.pendingSave=!1,Y(e)));return}let n=e.generation,r=e.workspaceTag,i=()=>J(e)&&e.generation===n&&e.workspaceTag===r;e.receiving=!0;try{Fr(e);let n=e.baseState,r=e.pending,a=e.baseRevision,o={...e,appliedRevisions:new Set},s=await Nr(o,t,i,e.appliedRevisions);if(!i())return;if(o.baseRevision!==a){let t=r&&o.pending===null?un(r.keyframe?Object.create(null):n,r.changeset):n;Fr(e);let s=dn(t,e.localState),c=a===null&&!(r&&o.pending===null)?new Set([...Object.keys(t),...e.hasBase?e.ids:[]]):void 0;if(c)for(let t of c)s[t]=e.localState[t]??null;let l=rn(s,t,o.baseState,c).filter(({id:t})=>e.ids.has(t)),u=null;if(l.length>0&&Jn){try{u=await Jn(l,o.baseState,`chain`)??null}catch(e){console.warn(`Triage sync: chain-conflict resolver failed:`,e)}if(!i())return}Fr(e);let d=ln(t,e.localState,o.baseState,c);e.baseRevision=o.baseRevision,e.hasBase=!0;for(let t of o.appliedRevisions)e.appliedRevisions.add(t);if(e.baseState=o.baseState,e.savesSinceKeyframe=o.savesSinceKeyframe,e.pending&&(e.pendingSave=!0),e.pending=null,await Pr(e,dn(e.baseState,d),l,u),!i())return}else e.savesSinceKeyframe=o.savesSinceKeyframe;if(!s){if(e.pendingSave=!1,!e.resyncAttempted){e.resyncAttempted=!0,Mr(e,!0);return}console.warn(`Triage sync: catch-up also broke continuity; full state push`),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Qn,e.pending=null,e.resyncAttempted=!1,e.pendingSave=!0,Dr(e),qn();return}e.resyncAttempted=!1,e.staleResetAttempted=!1,sn(e.localState,e.baseState)||(e.pendingSave=!0)}finally{i()&&(e.receiving=!1,e.pendingSave&&!e.pending&&!e.error&&(e.pendingSave=!1,Y(e)))}}async function Rr(e){if(e.type===`server-info`){or(e);return}if(e.type===`authenticated`){for(let e of q.values())Mr(e),Y(e);return}if(e.type===`unauthorized`){if(e.kind===`gated`){if(typeof e.workspaceTag==`string`){let t=br(e.workspaceTag);t&&typeof e.resourceTag!=`string`&&zr(t,e)}G.runAuthFlow().catch(e=>{console.warn(`Triage sync: auth flow failed:`,e)})}return}if(typeof e.workspaceTag!=`string`)return;let t=br(e.workspaceTag);if(t){if(e.type===`workspace-save-ack`)await Ir(t,e);else if(e.type===`workspace-state`)await Lr(t,e.revisions);else if(e.type===`workspace-save-error`)Vr(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 e of r)try{e(n)}catch{}}K()}}}function zr(e,t){e.pending&&(typeof t.base!=`string`&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var Br=/^[\w-]+$/u;function Vr(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&&Br.test(n)?n:`rejected`;if(e.pending=null,Zt.has(r)){e.pendingSave=!0,xr(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=Qn,e.pendingSave=!1,e.resyncAttempted=!1,Dr(e),qn(),Y(e);return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,K()}var Hr=Promise.resolve(),Ur=0;function Wr(e,t=()=>!0){let n=Ur,r=typeof e.workspaceTag==`string`?br(e.workspaceTag):null;if(typeof e.workspaceTag==`string`&&!r)return;let i=r?.generation;Hr=Hr.then(()=>{if(t()&&Ur===n&&(!r||J(r)&&r.generation===i))return Rr(e)}).catch(e=>{console.warn(`Triage sync handler error:`,e)})}function Gr(e){for(let e of q.values())e.pending=null,e.pendingSave=!1,Mr(e),Y(e);K()}function Kr(e){Ur++,Hr=Promise.resolve();for(let e of q.values())e.generation++,e.encrypting=!1,e.receiving=!1,e.pending=null,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,e.pendingSave=!0,Sr(e);K()}G.addConsumer({onMessage:Wr,onConnected:Gr,onDisconnected:Kr});function qr(){tr()?Zn||=G.acquire():Zn&&=(Zn.release(),null)}function Jr(e){qn=typeof e==`function`?e:()=>{}}function Yr(e){Jn=typeof e==`function`?e:null}function Xr(e){Jt(e)}function Zr(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&Or(e)}function Qr(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,Sr(e)}var $r={setServerUrl(e){let t=(e??``).trim();if(t===W)return;let n=W;Ur++,Hr=Promise.resolve(),W=t,hr(),In(!1),t&&jn(t),n&&t&&n!==t&&St(null).catch(e=>{console.warn(`Triage sync: failed to drop cached auth password on server change:`,e)}),G.setServerUrl(t);for(let e of q.values()){Qr(e);let n=t?kn(e.workspaceId,t):null;e.baseRevision=n?.baseRevision??null,e.appliedRevisions.clear(),e.baseState=n?.baseState??Object.create(null),e.hasBase=n?.hasBase===!0||e.baseRevision!==null||Object.keys(e.baseState).length>0,e.savesSinceKeyframe=n?.savesSinceKeyframe??0,e.localState=pn(e.baseState,e.ids),Zr(e)}qr(),K()},setEnabled(e){let t=!!e;if(t!==Yn){if(Yn=t,Un(Gn,t?`1`:`0`).catch(e=>{console.warn(`Triage sync: could not persist user-enabled:`,e)}),tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},isEnabled(){return Yn},setForcedOff(e){let t=!!e;if(t!==Xn){if(Xn=t,tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},getServerUrl(){return W},get connected(){return G.getSocket()?.readyState===WebSocket.OPEN},get status(){return sr()},onStatusChange(e){return rr.add(e),()=>rr.delete(e)},onServerInfo(e){if(ir.add(e),ar!=null)try{e(ar)}catch{}return()=>ir.delete(e)},setProtocolLocked(e){G.setProtocolLocked(e)},notify(){if(!(yr>0))for(let e of q.values())Y(e)},ensureSubscription(e){let t=q.has(e);$r.openSession(e);let n=q.get(e);if(!n)return null;let r=new Promise(e=>{n.objstoreResourceWaiters.push(e)});return t&&Mr(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||q.has(e)||!Bn().find(t=>t.id===e))return;let t=wr(e),n=kn(e,W),r=n?.baseState??Object.create(null);mn(r,t);let i={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:t,baseRevision:n?.baseRevision??null,appliedRevisions:new Set,baseState:r,hasBase:n?.hasBase===!0||n?.baseRevision!=null||Object.keys(r).length>0,savesSinceKeyframe:n?.savesSinceKeyframe??0,localState:pn(r,t),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:[]};q.set(e,i),Or(i),qr(),K()},closeSession(e){if(e==null){for(let e of q.values())Cr(e);q.clear()}else{let t=q.get(e);t&&Cr(t),q.delete(e)}K()},refreshSession(e){let t=q.get(e);if(!t){console.debug(`triage-sync: refreshSession bail — no session for`,e,`(caller must openSession first)`);return}ei(t)},sessionInfo(e){let t=q.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[...q.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...q.keys()]:[e],n=!1;for(let e of t){let t=q.get(e);!t||!t.error||(t.error=null,t.consecutiveFailures=0,n=!0,!t.key||!t.signingKey?Or(t):G.getSocket()?.readyState===WebSocket.OPEN&&(Mr(t),Y(t)))}n&&K()},get persistenceDegraded(){return Cn()},onPersistenceDegraded(e){return Tn(e)},get proxyAuthRequired(){return Fn()},onProxyAuthRequired(e){return Ln(e)}};_t(e=>{zn=e.state,Bn=e.listWorkspaces,Vn=e.saveTriage,Hn=e.getSecureItem,Un=e.setSecureItem,e.onSecureStorageHydrated(Er);try{localStorage.removeItem(Wn),Hn(Gn)===`0`&&(Yn=!1),qr()}catch{}e.onWorkspaceDeleted(e=>{let t=q.get(e);t&&Sr(t);let n=q.delete(e);Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)}),qr(),n&&K()}),e.onWorkspacePrivateKeyChanged(e=>{let t=q.get(e);if(!t){Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)});return}t.signingKey=null,t.key=null,t.verifyingKey=null,t.workspaceTag=null,Qr(t),t.keyDerivationGen=(t.keyDerivationGen??0)+1,(async()=>{await Mn(e),q.delete(e),$r.openSession(e),K()})().catch(t=>{console.warn(`Triage sync: privateKey rotation IIFE failed:`,t),q.delete(e),K()})}),e.onReportMembershipChanged(e=>{$r.openSession(e);let t=q.get(e);t&&ei(t)}),jn()});function ei(e){let t=e.generation,{conflicts:n,hydrated:r}=Tr(e);(async()=>{if(n.length===0){r?await Vn():Y(e);return}let i=null;if(Jn)try{i=await Jn(n,e.baseState,`attach`)}catch(e){console.warn(`Triage sync: hydration conflict resolver failed:`,e)}!J(e)||e.generation!==t||(i&&hn(n.filter(({id:t})=>e.ids.has(t)),i),await Vn())})().catch(e=>{console.warn(`Triage sync: refreshAndPropagate failed:`,e)})}var ti,ni,ri,ii,ai,oi,si,ci,li,ui,di,fi,X=new Map,pi=2e3,mi={setTimeout:(e,t)=>setTimeout(e,t)},hi=new Map,gi=new Set;function Z(e,t){try{let n={names:Object.fromEntries(t.remoteNameByTag),bundles:Object.fromEntries(t.remoteBundleByTag),bundleNames:Object.fromEntries(t.remoteBundleNameByIntegrity),baselines:Object.fromEntries(t.baselines),localVersions:Object.fromEntries([...t.baselines].filter(([,e])=>e.synced).map(([e,t])=>[e,t.version]))};localStorage.setItem(c(e),JSON.stringify(n))}catch(t){console.warn(`objstore-presence: cache persist failed for ${e}:`,t)}}function _i(e){try{localStorage.removeItem(c(e))}catch{}}var vi=null;function yi(e){return vi||=Ht({serverUrl:``,httpOrigin:e,transport:Xt()}),vi}var bi=new Set,xi=new Set;function Q(){for(let e of gi)try{e()}catch{}}function Si(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 Ci=256;function wi(e){return typeof e==`string`?e.length<=Ci?e:e.slice(0,Ci):``}function Ti(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 Ei(e){if(X.has(e))return;let t=ti().find(t=>t.id===e);if(!t)return;let n=$r.ensureSubscription(e);if(!n)return;let r={workspaceId:e,session:null,keys:null,remoteTags:new Set,fileTags:new Map,bundleTags:new Map,remoteNameByTag:new Map,remoteBundleByTag:new Map,remoteBundleNameByIntegrity:new Map,remoteMeta:new Map,baselines:new Map,localChanged:new Set,selfWrites:new Map,selfWriteNotices:new Map,tagLocks:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};X.set(e,r),r.ready=(async()=>{if(r.keys=await at(t.privateKey,t.id),r.disposed)return;let a=new Map;for(let e of t.reports??[]){let t=await U(r.keys.tagKey,e);r.fileTags.set(e,t),a.set(t,e)}if(r.disposed)return;let o=new Map;for(let e of t.bundles??[]){let t=await st(r.keys.tagKey,e);r.bundleTags.set(e,t),o.set(t,e)}if(r.disposed)return;try{let e=await si();if(r.disposed)return;for(let t of e)r.bundleTags.has(t.integrity)&&r.remoteBundleNameByIntegrity.set(t.integrity,t.name)}catch(t){console.warn(`objstore-presence: listBundles failed during ${e} open:`,t)}Q();let s=$r.getServerUrl();if(!s)return;let c=Ti(s);if(c)try{let t=await yi(c).openWorkspace(r.keys,n);if(r.disposed){try{t.close()}catch{}return}r.session=t,i();let s=await t.list();if(r.disposed)return;for(let e of s)r.remoteTags.add(e.resourceTag),Hi(r,e.resourceTag,e.version,e.incarnation);let u=l(e),d=!1;if(u)for(let[e,t]of Object.entries(u.baselines))(r.remoteTags.has(e)||a.has(e))&&r.baselines.set(e,t);for(let e of r.remoteTags){let t=a.get(e);t!==void 0&&!r.remoteNameByTag.has(e)&&(r.remoteNameByTag.set(e,t),d=!0);let n=o.get(e);if(n!==void 0&&!r.remoteBundleByTag.has(e)&&(r.remoteBundleByTag.set(e,n),d=!0),u){let t=u.names[e];typeof t==`string`&&!r.remoteNameByTag.has(e)&&!r.remoteBundleByTag.has(e)&&(r.remoteNameByTag.set(e,t),r.fileTags.set(t,e),d=!0);let n=u.bundles[e];if(typeof n==`string`&&!r.remoteBundleByTag.has(e)&&!r.remoteNameByTag.has(e)){r.remoteBundleByTag.set(e,n),r.bundleTags.set(n,e);let t=u.bundleNames[n];typeof t==`string`&&!r.remoteBundleNameByIntegrity.has(n)&&r.remoteBundleNameByIntegrity.set(n,t),d=!0}}}(d||u)&&Z(e,r),Q(),ia(r);for(let e of r.remoteTags)Ui(r.baselines.get(e),r.remoteMeta.get(e))&&ca(r,e).catch(()=>{});Qi(r).catch(()=>{})}catch(e){r.err=e}})();function i(){let t=r.session;t.onPut(({resourceTag:e,version:t,incarnation:n})=>{let i=r.remoteMeta.get(e),a=r.remoteTags.has(e)&&i!==void 0&&(i.incarnation!==n||t>i.version);if(r.remoteTags.add(e),Hi(r,e,t,n),Q(),a){ca(r,e).catch(()=>{});return}ia(r)}),t.onDeleted(({resourceTag:t})=>{r.remoteTags.delete(t),r.remoteMeta.delete(t);let n=r.remoteNameByTag.get(t);r.remoteNameByTag.delete(t);let i=ti().find(t=>t.id===e),a=i?.reports??[],o=i?.bundles??[];n&&!a.includes(n)&&r.fileTags.delete(n);let s=r.remoteBundleByTag.get(t);r.remoteBundleByTag.delete(t),s&&(r.remoteBundleNameByIntegrity.delete(s),o.includes(s)||r.bundleTags.delete(s)),Z(e,r),Q()})}r.ready.catch(()=>{})}function Di(e){let t=X.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}X.delete(e),Q()}}_t(e=>{ti=e.listWorkspaces,ni=e.addReportToWorkspace,ri=e.addBundleToWorkspace,ii=e.analyzeContent,ai=e.setCount,oi=e.gunzipBytes,si=e.listBundles,ci=e.listFiles,li=e.readBundle,ui=e.readFileBytes,di=e.saveBundle,fi=e.saveFileBytes,e.onFileMutated?.((e,t)=>{for(let n of X.values()){let r=n.fileTags.get(e);if(r!==void 0){if(t===`delete`){n.localChanged.delete(r)&&Q();continue}if(n.selfWrites.has(e)){n.selfWriteNotices.set(e,(n.selfWriteNotices.get(e)??0)+1);continue}hi.has(e)||Xi(n,r,e)}}}),e.onReportMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.reports??[])t.fileTags.has(r)||Ai(e,r).catch(()=>{})}),e.onBundleMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.bundles??[])t.bundleTags.has(r)||Mi(e,r).catch(()=>{})}),e.onWorkspaceDeleted(e=>{Di(e),_i(e)}),e.onWorkspacePrivateKeyChanged(e=>{X.has(e)&&(Di(e),_i(e),Ei(e))})});function Oi(){return Array.from(X.keys())}function ki(e,t){let n=X.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function Ai(e,t){let n=X.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await U(n.keys.tagKey,t)),n.disposed||Q()))}function ji(e,t){let n=X.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function Mi(e,t){let n=X.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await st(n.keys.tagKey,t)),n.disposed||Q()))}function Ni(e){return gi.add(e),()=>gi.delete(e)}function Pi(e){return bi.add(e),()=>bi.delete(e)}function Fi(e){return xi.add(e),()=>xi.delete(e)}function Ii(e){hi.set(e,(hi.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let n=hi.get(e)-1;if(n>0){hi.set(e,n);return}hi.delete(e);for(let t of X.values()){let n=t.fileTags.get(e);n!==void 0&&Zi(t,n,e).catch(()=>{})}}}function Li(e){let t=X.get(e);return t?(ti().find(t=>t.id===e)?.reports??[]).filter(e=>{let n=t.fileTags.get(e);return n!==void 0&&Ji(t,n)}):[]}function Ri(e){let t=X.get(e);return t?t.remoteTags.size:0}async function zi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function Bi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function Vi(e,t){let n=X.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}function Hi(e,t,n,r){let i=e.remoteMeta.get(t);i&&i.incarnation===r&&i.version>=n||e.remoteMeta.set(t,{version:n,incarnation:r})}function Ui(e,t){return!e||!t?!1:e.incarnation===null?t.version!==e.version:e.incarnation!==t.incarnation||t.version>e.version}function Wi(e,t){let n=e.baselines.get(t);return!!n&&n.incarnation!==null}function Gi(e,t){return!!e&&e.synced&&e.incarnation===t.incarnation&&e.version===t.version}function $(e,t,n,r,i=null){let a=Ji(e,t);e.baselines.set(t,{version:n.version,incarnation:n.incarnation,synced:r,hash:r?i:null}),e.localChanged.delete(t),!e.disposed&&Ji(e,t)!==a&&Q()}function Ki(e,t){return!!e&&e.synced&&!!e.hash&&!!t&&e.hash!==t}function qi(e,t){return!!e&&!e.synced||Ki(e,t)}function Ji(e,t){if(!e.remoteTags.has(t))return!1;if(e.localChanged.has(t))return!0;let n=e.baselines.get(t);return!!n&&!n.synced}async function Yi(e,t,n){e.selfWrites.set(t,(e.selfWrites.get(t)??0)+1);try{await fi(t,n),e.selfWriteNotices.set(t,(e.selfWriteNotices.get(t)??0)-1)}finally{let n=e.selfWrites.get(t)-1;if(n>0)e.selfWrites.set(t,n);else{e.selfWrites.delete(t);let n=e.selfWriteNotices.get(t)??0;e.selfWriteNotices.delete(t);let r=e.fileTags.get(t);n>0&&r!==void 0&&!e.disposed&&Xi(e,r,t)}}}function Xi(e,t,n){mi.setTimeout(()=>Zi(e,t,n).catch(()=>{}),pi)}function Zi(e,t,n){return $i(e,t,async()=>{if(hi.has(n))return;let r=e.baselines.get(t);if(e.disposed||!r?.synced||!r.hash)return;let i;try{i=await ui(n)}catch{return}let a=await o(i);if(e.disposed||e.baselines.get(t)!==r)return;let s=r.hash!==a;s!==e.localChanged.has(t)&&(s?e.localChanged.add(t):e.localChanged.delete(t),Q())})}async function Qi(e){let t=ti().find(t=>t.id===e.workspaceId);for(let n of t?.reports??[]){if(e.disposed)return;let t=e.fileTags.get(n);if(t!==void 0&&e.baselines.get(t)?.hash)try{await Zi(e,t,n)}catch{}}}function $i(e,t,n){let r=(e.tagLocks.get(t)??Promise.resolve()).then(()=>n()),i=r.catch(()=>{}).finally(()=>{e.tagLocks.get(t)===i&&e.tagLocks.delete(t)});return e.tagLocks.set(t,i),r}function ea(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}async function ta(e,t){let n;try{n=await ui(e)}catch{return{same:null,hash:null}}let r=await o(n);if(ea(n,t))return{same:!0,hash:r};try{let[e,i]=await Promise.all([oi(n),oi(t)]);return{same:ea(e,i),hash:r}}catch{return{same:!1,hash:r}}}async function na(e,t,n,r){let i;try{i=x(await oi(n.content))}catch(e){throw Error(`gunzip/decode of "${n.fileName}" failed (likely forged peer payload)`,{cause:e})}if(!r())return!1;let a=ii(i);if(!a.recognized)throw Error(`cloud copy of "${n.fileName}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);if(await Yi(e,n.fileName,n.content),e.disposed)return!1;ai(n.fileName,a.count,a.source),$(e,t,n,!0,await o(n.content)),Z(e.workspaceId,e);for(let t of bi)try{t(e.workspaceId,n.fileName)}catch{}return!0}async function ra(e,t,n,r,{keepLocalChanges:i=!0}={}){let{same:a,hash:o}=await ta(n.fileName,n.content);return r()?a?($(e,t,n,!0,o),Z(e.workspaceId,e),!1):i&&a===!1&&qi(e.baselines.get(t),o)?($(e,t,n,!1),Z(e.workspaceId,e),!1):await na(e,t,n,r):!1}async function ia(e){if(!e.session||e.disposed)return;let t=ti().find(t=>t.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),i=new Set;try{i=new Set(await ci())}catch(t){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,t)}if(e.disposed||!e.session)return;let a=[];for(let t of e.remoteTags){let o=e.remoteNameByTag.get(t);if(o!==void 0&&n.has(o)&&i.has(o)&&Wi(e,t))continue;if(e.remoteBundleByTag.has(t)){let n=e.remoteBundleByTag.get(t);if(e.remoteBundleNameByIntegrity.has(n)&&r.has(n))continue}let s=e.inFlight.get(t);if(!s){let n=e.remoteMeta.get(t),r=()=>e.disposed||!e.remoteTags.has(t)||e.remoteMeta.get(t)===n?null:ia(e).then(()=>null,()=>null);s=e.session.fetchByTag(t).then(async n=>(e.inFlight.delete(t),e.disposed?null:n?e.remoteTags.has(t)?n.kind===`bundle`?(e.remoteBundleByTag.set(t,n.integrity),e.bundleTags.set(n.integrity,t),n.name&&e.remoteBundleNameByIntegrity.set(n.integrity,n.name),await la(e,t,n.integrity,n.name,n.content),null):(e.remoteNameByTag.set(t,n.fileName),e.fileTags.set(n.fileName,t),await aa(e,t,n),null):null:r()),()=>(e.inFlight.delete(t),r())),e.inFlight.set(t,s)}a.push(s)}a.length!==0&&(await Promise.all(a),!e.disposed&&(Z(e.workspaceId,e),Q()))}async function aa(e,t,n){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{await oa(e,t,n),!e.disposed&&e.remoteTags.has(t)&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t).catch(()=>{})})}async function oa(e,t,n){let r=n.fileName,i=n.content;if(e.disposed||!e.remoteTags.has(t))return;let a=ti().find(t=>t.id===e.workspaceId),s=!!(a&&Array.isArray(a.reports)&&a.reports.includes(r)),c;try{let n=await ci();if(e.disposed||!e.remoteTags.has(t))return;c=n.includes(r)}catch(e){console.warn(`auto-download: listFiles failed before saving "${r}":`,e);return}if(c){if(s){await sa(e,t,n);return}if(e.disposed||!e.remoteTags.has(t))return;try{await ni(r,e.workspaceId)}catch(t){console.warn(`auto-download: attaching local "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(e.disposed)return;if(!e.baselines.has(t)){let{same:a,hash:o}=await ta(r,i);if(e.disposed)return;a!==null&&($(e,t,n,a,o),Z(e.workspaceId,e))}for(let t of bi)try{t(e.workspaceId,r)}catch{}return}let l;try{l=x(await oi(i))}catch(e){console.warn(`auto-download: gunzip/decode of "${r}" failed (likely forged peer payload):`,e);return}if(e.disposed||!e.remoteTags.has(t))return;let u=ii(l);if(u.recognized){try{if(await Yi(e,r,i),e.disposed||!e.remoteTags.has(t)||(ai(r,u.count,u.source),$(e,t,n,!0,await o(i)),!e.remoteTags.has(t)))return;await ni(r,e.workspaceId),Z(e.workspaceId,e)}catch(t){console.warn(`auto-download: persisting "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of bi)try{t(e.workspaceId,r)}catch{}}}async function sa(e,t,n){let r=()=>!e.disposed&&e.remoteTags.has(t),{same:i,hash:a}=await ta(n.fileName,n.content);if(!r()||i===null)return;let o=e.baselines.get(t);if(i){(!Gi(o,n)||o.hash!==a)&&($(e,t,n,!0,a),Z(e.workspaceId,e));return}if(Ui(o,n)&&!qi(o,a)){try{await na(e,t,n,r)}catch(e){console.warn(`auto-download: ${e.message}`,e)}return}if(!o||o.incarnation===null||Ui(o,n)){$(e,t,n,!1),Z(e.workspaceId,e);return}Ki(o,a)&&!e.localChanged.has(t)&&(e.localChanged.add(t),Q())}async function ca(e,t,n=0){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{let r=()=>!e.disposed&&e.remoteTags.has(t);if(!r())return;let i=e.baselines.get(t);if(i?.synced&&!Ui(i,e.remoteMeta.get(t)))return;let a;try{a=await e.session.fetchByTag(t)}catch(t){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,t);return}if(a&&r()&&a.kind!==`bundle`){e.remoteNameByTag.set(t,a.fileName),e.fileTags.set(a.fileName,t);try{await ra(e,t,a,r)}catch(e){console.warn(`replace-refetch: ${e.message}`,e);return}n<2&&r()&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t,n+1).catch(()=>{})}})}async function la(e,t,n,r,i){if(e.disposed||!e.remoteTags.has(t))return;let a;try{a=await si()}catch(e){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,e);return}if(e.disposed||!e.remoteTags.has(t))return;if(a.some(e=>e.integrity===n)){try{await ri(n,e.workspaceId)}catch(e){console.warn(`auto-download: attach pre-existing bundle failed:`,e);return}if(e.disposed)return;let t=a.find(e=>e.integrity===n)?.name??``;for(let r of xi)try{r(e.workspaceId,n,t)}catch{}return}let o=await _(i);if(e.disposed||!e.remoteTags.has(t))return;if(o!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${o}) \u2014 refusing to save`);return}let s=wi(r&&r.length>0?r:`bundle-${n.slice(7,15)}`);try{if(await di(s,i),e.disposed||!e.remoteTags.has(t))return;await ri(n,e.workspaceId)}catch(t){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of xi)try{t(e.workspaceId,n,s)}catch{}}async function ua(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw Error(`Objstore session is not connected${Si(e.err)}`)}async function da(e){let t=await e(null);return!t.ok&&t.reason===`conflict`&&t.current&&(t=await e(t.current)),t}async function fa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);return await ua(n),n.session.fetch(t)}async function pa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let r=n.fileTags.get(t)??await U(n.keys.tagKey,t),i=await $i(n,r,async()=>{let i=await n.session.fetch(t);if(!i)return{ok:!1,reason:`not found in remote`};let a;try{a=x(await oi(i.content))}catch{return{ok:!1,reason:`remote payload is not gzipped UTF-8`}}let s=ii(a);return s.recognized?(await Yi(n,t,i.content),ai(t,s.count,s.source),n.disposed||(n.fileTags.set(t,r),$(n,r,i,!0,await o(i.content)),Z(e,n)),{ok:!0}):{ok:!1,reason:`remote payload is not a recognized report format`}});return i.ok&&await ni(t,e),i}async function ma(e,t,n){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.fileTags.get(t)??await U(r.keys.tagKey,t);return await $i(r,i,async()=>{let e=await da(e=>r.session.put({fileName:t,content:n,prev:e}));if(e.ok)try{await ha(r,t,i,e.meta,n)}catch{}return e})}async function ha(e,t,n,r,i){let a=await o(i);e.disposed||(e.fileTags.set(t,n),$(e,n,r,!0,a),Z(e.workspaceId,e),Ui(e.baselines.get(n),e.remoteMeta.get(n))&&ca(e,n).catch(()=>{}))}async function ga(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.fileTags.has(t)||n.fileTags.set(t,await U(n.keys.tagKey,t));let r=n.fileTags.get(t);return await $i(n,r,async()=>{let e=await da(e=>n.session.delete(t,e));return e.ok&&(n.remoteTags.delete(r),n.remoteNameByTag.delete(r),n.remoteMeta.delete(r),n.baselines.delete(r),Q()),e})}finally{n&&Di(e)}}async function _a(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await li(t),i=(await si()).find(e=>e.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await da(e=>n.session.putBundle({integrity:t,name:i,content:r,prev:e}))}async function va(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:`not-found`};if(await _(r.content)!==t)return{ok:!1,reason:`integrity-mismatch`};let i=wi(r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`);await di(i,r.content);for(let n of xi)try{n(e,t,i)}catch{}return{ok:!0,integrity:t,name:i}}async function ya(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.bundleTags.has(t)||n.bundleTags.set(t,await st(n.keys.tagKey,t));let r=n.bundleTags.get(t),i=await da(e=>n.session.deleteBundle(t,e));return i.ok&&(n.remoteTags.delete(r),n.remoteBundleByTag.delete(r),Q()),i}finally{n&&Di(e)}}async function ba(e,{onList:t,onItem:n}={}){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.keys.tagKey,a=new Set,o=r.session.onDeleted(e=>{a.add(e.resourceTag)});try{let o=await xa(r,e),s=await Pa(),c=await Fa(),l=new Map;for(let e of s)l.set(await U(i,e),e);let u=new Map;for(let e of c)u.set(await st(i,e.integrity),e.integrity);let d=o.map(e=>{let t=l.get(e.resourceTag),n=u.get(e.resourceTag);return{resourceTag:e.resourceTag,kind:Aa(r,e.resourceTag,t,n),label:ja(r,e.resourceTag,t,n),contentLength:e.contentLength,reportName:t,bundleIntegrity:n,identifier:t??n,status:`checking`}});if(typeof t==`function`)try{t(d.map(Ma))}catch{}let f={good:0,updated:0,uploaded:0,differs:0,reuploaded:0,failed:0,"check-failed":0,missing:0};for(let t of d)if(t.status=await Ca(r,e,t,a),f[t.status]+=1,typeof n==`function`)try{n(Ma(t))}catch{}return{items:d.map(Ma),counts:f}}finally{o()}}async function xa(e,t){try{let e=$r.ensureSubscription(t);if(e){let t=await Na(e.resources,1e4);if(Array.isArray(t))return Sa(t)}}catch(e){console.warn(`objstore-recovery: fresh DB listing for ${t} failed; using cached inventory:`,e)}try{return(await e.session.list()).map(e=>({resourceTag:e.resourceTag,contentLength:e.contentLength}))}catch{return[]}}function Sa(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 Ca(e,t,n,r){let i;try{i=await e.session.fetchByTag(n.resourceTag)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}return i?i.kind===`report`?(n.kind=`report`,n.label=i.fileName,n.identifier=i.fileName,await wa(e,t,n,i,r)):(n.kind=`bundle`,n.label=i.name??n.label,n.bundleIntegrity=i.integrity,n.identifier=i.integrity,`good`):r.has(n.resourceTag)?`missing`:n.reportName===void 0?n.bundleIntegrity===void 0?`missing`:await ka(t,n,r):await Oa(t,n,r)}async function wa(e,t,n,r,i){let a=ti().find(e=>e.id===t);if(!a||!Array.isArray(a.reports)||!a.reports.includes(r.fileName))return`good`;let o=n.resourceTag,s=()=>!e.disposed&&!i.has(o);return await $i(e,o,async()=>{let i=r;if(Ta(e,o,i)){let t;try{t=await e.session.fetchByTag(o)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}if(!t||!s())return`missing`;if(t.kind!==`report`)return`good`;i=t}let{same:a,hash:c}=await ta(i.fileName,i.content);if(!s())return`missing`;let l=e.baselines.get(o);if(a)return(!Gi(l,i)||l.hash!==c)&&($(e,o,i,!0,c),Z(t,e)),`good`;if(a===!1&&Gi(l,i)){let t=await Ea(e,o,i.fileName,i,s);return n.detail=t.detail,t.status}if(a===null||Ui(l,i)&&!qi(l,c))try{return await na(e,o,i,s)?`updated`:`missing`}catch(e){return n.detail=`updating your copy failed: ${e?.message??String(e)}`,console.warn(`objstore-recovery: updating the local copy of "${i.fileName}" failed:`,e),`failed`}return $(e,o,i,!1),Z(t,e),n.compared={version:i.version,incarnation:i.incarnation},`differs`})}function Ta(e,t,n){return[e.baselines.get(t),e.remoteMeta.get(t)].some(e=>e&&e.incarnation===n.incarnation&&e.version>n.version)}async function Ea(e,t,n,r,i){try{let a=await ui(n);if(!i())return{status:`missing`};let s=await e.session.put({fileName:n,content:a,prev:{version:r.version,incarnation:r.incarnation}});return s.ok?($(e,t,s.meta,!0,await o(a)),Z(e.workspaceId,e),{status:`uploaded`}):{status:`failed`,detail:s.reason===`conflict`?`the cloud copy changed since it was compared — re-check again`:`upload rejected: ${s.reason??`unknown`}`}}catch(e){return console.warn(`objstore-recovery: uploading the local copy of "${n}" failed:`,e),{status:`failed`,detail:`upload error: ${e?.message??String(e)}`}}}async function Da(e,t,n,r){if(n!==`cloud`&&n!==`local`)throw TypeError(`resolveReportDifference: keep must be 'cloud' or 'local', got ${String(n)}`);if(n===`local`&&(!r||!Number.isSafeInteger(r.version)||typeof r.incarnation!=`string`))throw TypeError(`resolveReportDifference: keeping the local copy needs the compared cloud state ({ version, incarnation })`);let i=X.get(e);if(!i)throw Error(`Workspace ${e} is not open`);if(await ua(i),!i.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let a=i.fileTags.get(t)??await U(i.keys.tagKey,t),o=()=>!i.disposed;return await $i(i,a,async()=>{if(n===`local`)return await Ea(i,a,t,r,o);try{let e=await i.session.fetch(t);if(!e)return{status:`missing`,detail:`the report is no longer in the cloud`};let n={fileName:t,content:e.content,version:e.version,incarnation:e.incarnation};return{status:await ra(i,a,n,o,{keepLocalChanges:!1})?`updated`:`good`}}catch(e){return console.warn(`objstore-recovery: replacing the local copy of "${t}" with the cloud copy failed:`,e),{status:`failed`,detail:`updating your copy failed: ${e?.message??String(e)}`}}})}async function Oa(e,t,n){let r;try{r=await ui(t.reportName)}catch{return`missing`}if(t.contentLength==null||lt(t.reportName,r.length)!==t.contentLength||n.has(t.resourceTag))return`missing`;try{let n=await ma(e,t.reportName,r);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: re-upload of "${t.reportName}" failed:`,e),`failed`}}async function ka(e,t,n){try{await li(t.bundleIntegrity)}catch{return`missing`}if(n.has(t.resourceTag))return`missing`;try{let n=await _a(e,t.bundleIntegrity);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: bundle re-upload of "${t.bundleIntegrity}" failed:`,e),`failed`}}function Aa(e,t,n,r){return n===void 0?r!==void 0||e.remoteBundleByTag.has(t)?`bundle`:e.remoteNameByTag.has(t)?`report`:`unknown`:`report`}function ja(e,t,n,r){if(n!==void 0)return n;if(r!==void 0)return e.remoteBundleNameByIntegrity.get(r)??r;let i=e.remoteNameByTag.get(t);if(i!==void 0)return i;let a=e.remoteBundleByTag.get(t);return a===void 0?`${t.slice(0,10)}\u2026`:e.remoteBundleNameByIntegrity.get(a)??a}function Ma(e){let t={resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier,detail:e.detail};return e.compared&&(t.compared=e.compared),t}function Na(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let i=new Promise((e,r)=>{n=setTimeout(()=>r(Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,i]).finally(()=>clearTimeout(n))}async function Pa(){try{return await ci()}catch(e){return console.warn(`objstore-recovery: listFiles failed; treating as no local reports:`,e),[]}}async function Fa(){try{return await si()}catch(e){return console.warn(`objstore-recovery: listBundles failed; treating as no local bundles:`,e),[]}}export{Di as closeWorkspace,ya as deleteBundleFromRemote,ga as deleteFromRemote,Li as differingReports,Bi as discoverRemoteBundleIntegrities,zi as discoverRemoteFileNames,pa as downloadFileFromRemote,va as fetchBundleFromRemote,fa as fetchFile,Ii as holdLocalChangeChecks,ht as installSyncHost,ji as isBundleInRemote,ki as isInRemote,Pi as onAutoDownloaded,Fi as onBundleAutoDownloaded,Ni as onChange,Ei as openWorkspace,Oi as openWorkspaceIds,_a as putBundleToRemote,ma as putFile,ba as recheckRemoteStorage,Vi as remoteBundleName,Ri as remoteCount,Da as resolveReportDifference,Xr as setAuthenticationResolver,Yr as setHydrationConflictResolver,Jr as setRedraw,$r as triageSync};
|
|
11
|
+
`)})}return t}},At=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(e){super(),this.baseUrl=wt(e),this.scheduleFlush(!0)}send(t){if(this.readyState===e.CLOSED)throw Error(`sse-transport: send on closed transport`);let n;try{n=JSON.parse(t)}catch(e){throw Error(`sse-transport: send received non-JSON payload: ${e.message}`,{cause:e})}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:Et;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())},Ot),this.downstreamWatchdog.unref?.())}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let e=new Promise(e=>{setTimeout(e,Dt)});await Promise.race([this.inFlightPost.catch(()=>{}),e])}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,i=++this.postSeq;this.armDownstreamWatchdog();let a=(async()=>{let t;try{t=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n),credentials:`same-origin`,signal:this.fetchAbort.signal})}catch(t){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST failed:`,t),this.shutdown();return}if(!t.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${t.status} ${t.statusText}; closing`),this.shutdown();return}let a=t.body;if(!a){this.shutdown();return}this.consumeStream(a,i)})();this.inFlightPost=a,a.finally(()=>{this.inFlightPost===a&&(this.inFlightPost=null)})}async consumeStream(t,n){let r=t.getReader();this.activeReaders.add(r);let i=new kt,a=new TextDecoder,o=!1;try{for(;;){let{value:t,done:s}=await r.read();if(s){o=!0;break}if(this.readyState===e.CLOSED)return;n===this.postSeq&&this.armDownstreamWatchdog();let c=i.parse(a.decode(t,{stream:!0}));for(let e of c)this.dispatchOrderedEvent(e,n)}if(this.readyState!==e.CLOSED){let e=a.decode();if(e.length>0)for(let t of i.parse(e))this.dispatchOrderedEvent(t,n)}o&&this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: live downstream closed without a close frame; reconnecting`),this.shutdown())}catch(t){this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: stream read failed:`,t),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 e,n;try{let r=JSON.parse(t.data);typeof r.code==`number`&&(e=r.code),typeof r.reason==`string`&&(n=r.reason)}catch{}this.shutdown(e,n);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 e of this.activeReaders)try{e.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)}},jt=1e3,Mt=3e4,Nt=3e4,Pt=`session restarted`;function Ft(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,i=null,a=!1,o=null,s=0,c=!1,l=!1,u=null,d=jt,f=null,p=null,m=null,h=null,g=!1,_=null,v=new Set;function y(){u&&=(clearTimeout(u),null)}function b(){f&&=(clearTimeout(f),null)}function x(){y(),!c&&(l||s!==0&&t&&(u=setTimeout(()=>{u=null,N()},Math.round(d*(.5+Math.random()*.5))),d=Math.min(d*2,Mt)))}function S(){C(),!(n<=0)&&(a||(p=setInterval(()=>{!i||i.readyState!==i.OPEN||m||(k({type:`ping`}),m=setTimeout(()=>{m=null,console.warn(`socket-transport: heartbeat timeout; closing socket`);try{i?.close()}catch{}},r))},n)))}function C(){p&&=(clearInterval(p),null),m&&=(clearTimeout(m),null)}function w(e){for(let t of v)try{t.onDisconnected(e)}catch(e){console.warn(`socket-transport: consumer.onDisconnected threw:`,e)}}function T(e){for(let t of v)try{t.onConnected(e)}catch(e){console.warn(`socket-transport: consumer.onConnected threw:`,e)}}function E(e){for(let t of v)try{t.onMessage(e)}catch(e){console.warn(`socket-transport: consumer.onMessage threw:`,e)}}function D(e){let t;try{let n=typeof e.data==`string`?e.data:new TextDecoder().decode(e.data);t=JSON.parse(n)}catch(e){console.warn(`socket-transport: dropping malformed wire frame:`,e);return}if(t&&typeof t==`object`){if(t.type===`pong`){m&&=(clearTimeout(m),null);return}if(t.type===`challenge`){if(typeof t.nonce!=`string`)return;o!=null&&o!==t.nonce&&w(Pt),o=t.nonce,T(o);return}if(t.type===`authenticated`){O(!0),E(t);return}if(t.type===`unauthorized`&&t.kind===`auth-failed`){O(!1);return}E(t)}}function O(e){if(!_)return;let t=_;_=null,t(e)}function k(e){if(!i||i.readyState!==i.OPEN)return!1;try{return i.send(JSON.stringify(e)),!0}catch(e){return console.warn(`socket-transport: send failed:`,e),!1}}function A(e){return new Promise(t=>{_=t,k({type:`authenticate`,password:e})||(_=null,t(!1))})}function j(){if(h)return h;if(!i||i.readyState!==i.OPEN)return Promise.resolve(!1);let t=i,n=(async()=>{await Promise.resolve();try{let n=bt();if(n!=null&&!g){g=!0;let e=await A(n);if(i!==t)return!1;if(e)return!0;try{await St(null)}catch(e){console.warn(`socket-transport: failed to clear cached auth password:`,e)}}let r=!0;for(;;){if(i!==t||!i||i.readyState!==i.OPEN||!e.authResolver)return!1;let n;try{n=await e.authResolver({retry:!r})}catch(e){return console.warn(`socket-transport: authentication resolver threw:`,e),!1}if(i!==t||(r=!1,n==null||n===``))return!1;let a=await A(n);if(i!==t)return!1;if(a){try{await St(n)}catch(e){console.warn(`socket-transport: failed to cache auth password:`,e)}return!0}}}finally{h=null}})();return h=n,n}function M(e){if(b(),!i)return;let t=i;i=null,o=null,g=!1,O(!1),C(),w(e);try{t.close()}catch{}}function N(){c||l||i||s!==0&&t&&P(!1)}function P(e){if(c||l||s===0||!t)return;let n;try{n=e?new At(t):new WebSocket(t)}catch(t){if(!e){console.warn(`socket-transport: WebSocket constructor failed; trying SSE fallback:`,t),P(!0);return}console.warn(`socket-transport: SSE constructor failed:`,t),x();return}i=n,a=e,o=null,g=!1;let r=!1;n.addEventListener(`open`,()=>{i===n&&(r=!0,b(),f=setTimeout(()=>{f=null,i===n&&(d=jt)},Nt),f.unref?.(),S())}),n.addEventListener(`message`,e=>{i===n&&D(e)}),n.addEventListener(`close`,t=>{if(i===n){if(b(),i=null,o=null,g=!1,O(!1),C(),!r&&!e&&!c&&s>0){if(typeof fetch>`u`){w(`socket closed`),x();return}console.warn(`socket-transport: WebSocket failed to open; falling back to SSE`),P(!0);return}t?.code===1001&&(d=jt),w(`socket closed`),!c&&s>0&&x()}}),n.addEventListener(`error`,()=>{})}function F(){if(c)return{release(){}};s+=1,s===1&&!i&&N();let e=!1;return{release(){e||(e=!0,!c&&(--s,s===0&&(y(),d=jt,M(`released`))))}}}function I(e){e!==t&&(y(),d=jt,t=e,i&&M(`serverUrl changed`),s>0&&t&&N())}function L(e){v.add(e);let t=!1;return{remove(){t||(t=!0,v.delete(e))}}}function R(){c||(c=!0,y(),M(`transport closed`),v.clear(),s=0)}function z(e){let{pingMs:t,pongMs:i}=e;typeof t==`number`&&t>=0&&(n=t),typeof i==`number`&&i>0&&(r=i),p&&S()}function ee(){g=!1}function te(e){e!==l&&(l=e,e?(y(),M(`protocol-locked`)):s>0&&t&&N())}return{acquire:F,setServerUrl:I,addConsumer:L,send:k,getNonce:()=>o,getSocket:()=>i,isSse:()=>i!=null&&a,runAuthFlow:j,close:R,setProtocolLocked:te,setHeartbeatTimings:z,resetCachedReplayGuard:ee}}var It=64,Lt=5,Rt=6,zt=25,Bt=500;function Vt(e,t){if(!/^\/api\/objstore\/[\w-]+\/[\w-]+$/u.test(e))throw 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 TypeError(`objstore: urlPath origin mismatch \u2014 expected ${n}, got ${r.origin}`);return r.href}function Ht(e){let t=e.requestTimeoutMs??1e4,n=new URL(e.httpOrigin).origin,u=e.transport===void 0,d=e.transport??Ft(e.authResolver===void 0?{serverUrl:e.serverUrl}:{serverUrl:e.serverUrl,authResolver:e.authResolver}),f=!1,p=new Map,m=new Map,h=[],g=[];function _(e,t,n,r){let i=e.seenVersions.get(t);(!i||i.incarnation!==n||r>i.version)&&e.seenVersions.set(t,{incarnation:n,version:r})}function v(e){e.connectedPromise=new Promise((t,n)=>{e.resolveConnected=t,e.rejectConnected=n}),e.connectedPromise.catch(()=>{})}function y(e){e.listedPromise=new Promise((t,n)=>{e.resolveListed=t,e.rejectListed=n}),e.listedPromise.catch(()=>{})}function b(e,t){let n=new Map(e.inventory),r=e.inventorySeeded;e.inventorySeeded=!0,e.inventory.clear();for(let r of t){let t=e.inventory.get(r.resourceTag)??n.get(r.resourceTag),i=t?.incarnation===r.incarnation&&t.version>=r.version?t:{version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};e.inventory.set(r.resourceTag,i),_(e,r.resourceTag,i.incarnation,i.version)}if(e.resolveListed(),r){for(let[t,r]of n){let n=e.inventory.get(t);if(n?.incarnation!==r.incarnation){n||e.seenVersions.delete(t);for(let n of e.deletedHandlers)try{n({resourceTag:t,version:r.version})}catch{}}}for(let[t,r]of e.inventory){let i=n.get(t);if(i?.version===r.version&&i.incarnation===r.incarnation)continue;let a={resourceTag:t,version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};for(let t of e.putHandlers)try{t(a)}catch{}}}}function x(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)Gt(n)&&t.push(Kt(n));return t}function S(e){let n;return new Promise((r,i)=>{n=setTimeout(()=>i(Error(`objstore: inventory not seeded (no subscribe ack) after ${t}ms`)),t),e.listedPromise.then(r,i)}).finally(()=>clearTimeout(n))}function C(e){for(let t=0;t<h.length;t++)if(e(h[t]))return Promise.resolve(h.splice(t,1)[0]);return new Promise((n,r)=>{let i={predicate:e,resolve:()=>{},reject:e=>{clearTimeout(a);let t=g.indexOf(i);t>=0&&g.splice(t,1),r(e)}},a=setTimeout(()=>i.reject(Error(`objstore: response timeout after ${t}ms`)),t);i.resolve=e=>{clearTimeout(a),n(e)},g.push(i)})}function w(e){if(!d.send(e))throw Error(`objstore: socket not open`)}function T(e){for(let t of g.splice(0))try{t.reject(Error(`objstore: ${e}`))}catch{}}function E(e){if(e.type===`workspace-subscribed`&&typeof e.workspaceTag==`string`){let t=p.get(e.workspaceTag);t&&Array.isArray(e.resources)&&b(t,x(e.resources));return}if(e.type===`objstore-put`&&typeof e.workspaceTag==`string`&&Gt(e)){let t=p.get(e.workspaceTag);if(!t)return;let n=Kt(e),r=t.inventory.get(n.resourceTag);if(r?.incarnation===n.incarnation&&r.version>n.version)return;_(t,n.resourceTag,n.incarnation,n.version),t.inventory.set(n.resourceTag,{version:n.version,incarnation:n.incarnation,contentLength:n.contentLength});let i={resourceTag:n.resourceTag,version:n.version,incarnation:n.incarnation,contentLength:n.contentLength};for(let e of t.putHandlers)try{e(i)}catch{}return}if(e.type===`objstore-deleted`&&typeof e.workspaceTag==`string`&&typeof e.resourceTag==`string`&&typeof e.version==`number`){let t=p.get(e.workspaceTag);if(!t)return;let n=e.resourceTag,r=e.version,i=e.incarnation;if(i!==void 0){if(typeof i!=`string`||i.length===0)return;let e=t.inventory.get(n)??t.seenVersions.get(n);if(e&&(i!==e.incarnation||e.version>r))return}t.seenVersions.delete(n),t.inventory.delete(n);let a={resourceTag:n,version:r};for(let e of t.deletedHandlers)try{e(a)}catch{}return}if(e.type!==`workspace-state`&&e.type!==`workspace-save-ack`&&e.type!==`workspace-save-error`&&e.type!==`workspace-subscribed`&&e.type!==`authenticated`&&e.type!==`server-info`){for(let t=0;t<g.length;t++)if(g[t].predicate(e)){let n=g[t];g.splice(t,1),n.resolve(e);return}if(h.push(e),h.length>It){let e=h.splice(0,h.length-It),t=[...new Set(e.map(e=>e.type??`<no-type>`))].slice(0,4);console.warn(`objstore: dropping ${e.length} unmatched frame(s) over MAX_QUEUE_SIZE=${It} (types: ${t.join(`, `)})`)}}}function D(){for(let e of p.values())e.closed||e.connected||(e.connected=!0,e.resolveConnected())}function O(e){T(e);for(let e of p.values())e.closed||e.connected&&(e.connected=!1,v(e))}let k=d.addConsumer({onMessage:E,onConnected:D,onDisconnected:O}),A=e=>Vt(e,n),j=(e,t)=>A(`/api/objstore/${e}/${t}`);async function M(e,t,n){let i=d.getNonce();if(!i)throw Error(`objstore: socket not open`);let a=await r(e.signingKey,n,i),o,s=!1;for(;w({type:`objstore-put-begin`,...n,signature:a}),o=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t&&(n.type===`objstore-put-token`||n.type===`objstore-put-error`||n.type===`objstore-conflict`||n.type===`unauthorized`&&n.kind===`gated`)),!(o.type!==`unauthorized`||s||(s=!0,!await d.runAuthFlow())););if(o.type===`unauthorized`)return{kind:`unauthorized`};if(o.type===`objstore-put-error`){if(o.reason===`workspace-full`)return{kind:`workspace-full`};throw Error(`objstore: put-error reason='${String(o.reason)}'`)}if(o.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(o.current)?Kt(o.current):null};if(typeof o.urlPath!=`string`||typeof o.token!=`string`)throw TypeError(`objstore: malformed put-token (missing urlPath/token)`);return{kind:`token`,urlPath:o.urlPath,token:o.token}}async function N(e,t,n,r){let i=Date.now(),a=await s(e.signingKey,n,i),o=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`put`,ts:i,signature:a,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation,expectedLength:n.expectedLength,contentHash:r})});if(o.status===401)return{kind:`unauthorized`};if(o.status===403)return{kind:`workspace-full`};if(o.status===409)return{kind:`conflict`,current:await Ut(o)};if(!o.ok){let e=``;try{e=await o.text()}catch{}throw Error(`objstore: REST put-begin failed ${o.status} ${e.slice(0,200)}`)}let c;try{c=await o.json()}catch{throw TypeError(`objstore: put-mint JSON parse failed`)}if(!c||typeof c!=`object`||typeof c.urlPath!=`string`||typeof c.token!=`string`)throw TypeError(`objstore: malformed put-mint (missing urlPath/token)`);return{kind:`token`,urlPath:c.urlPath,token:c.token}}async function P(e,t){let n=`objstore: ${Pt}`;for(let r=0;;r++)try{return await t()}catch(t){if(r<Lt&&!e.closed&&t instanceof Error&&t.message===n)continue;throw t}}function F(e,t){return P(e,()=>I(e,t))}async function I(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n=await l(t.bytes),r={workspaceTag:e.workspaceTag,resourceTag:t.resourceTag,prevVersion:t.prev?.version??null,prevIncarnation:t.prev?.incarnation??null,expectedLength:t.bytes.byteLength,contentHash:n},i;if(d.isSse()?(i=await N(e,t.resourceTag,r,n),i.kind===`unauthorized`&&(i=await M(e,t.resourceTag,r))):i=await M(e,t.resourceTag,r),i.kind===`unauthorized`)return{ok:!1,reason:`unauthorized`};if(i.kind===`workspace-full`)return{ok:!1,reason:`workspace-full`};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};let a=await globalThis.fetch(A(i.urlPath),{method:`PUT`,headers:{authorization:`Bearer ${i.token}`,"content-type":`application/octet-stream`},body:t.bytes});if(!a.ok){if(a.status===409||a.status===410)return{ok:!1,reason:`conflict`,current:a.status===409?await Ut(a):null};let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST PUT failed ${a.status} ${e.slice(0,200)}`)}let o;try{o=await a.json()}catch{throw TypeError(`objstore: PUT ack JSON parse failed`)}if(!o||typeof o!=`object`||!Wt(o.version)||typeof o.incarnation!=`string`||typeof o.contentHash!=`string`||!Wt(o.contentLength))throw TypeError(`objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)`);let s=o;if(s.contentHash!==n||s.contentLength!==t.bytes.byteLength)throw Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${s.contentHash.slice(0,16)}\u2026 length=${s.contentLength}, client signed ${n.slice(0,16)}\u2026 length=${t.bytes.byteLength}`);return{ok:!0,meta:s}}async function L(e,t){let n=d.getNonce();if(!n)throw Error(`objstore: socket not open`);let r=await a(e.signingKey,e.workspaceTag,t,n);w({type:`objstore-fetch`,workspaceTag:e.workspaceTag,resourceTag:t,signature:r});let i=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t&&(n.type===`objstore-fetch-token`||n.type===`objstore-fetch-not-found`));if(i.type===`objstore-fetch-not-found`)return{kind:`not-found`};if(typeof i.urlPath!=`string`||typeof i.token!=`string`||!Gt(i))throw TypeError(`objstore: malformed fetch-token (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:i.urlPath,token:i.token,meta:Kt(i)}}async function R(e,t){let n=Date.now(),r=await o(e.signingKey,e.workspaceTag,t,n),i=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`fetch`,ts:n,signature:r})});if(i.status===404)return{kind:`not-found`};if(i.status===401)return{kind:`unauthorized`};if(!i.ok){let e=``;try{e=await i.text()}catch{}throw Error(`objstore: REST fetch-mint failed ${i.status} ${e.slice(0,200)}`)}let a;try{a=await i.json()}catch{throw TypeError(`objstore: fetch-mint JSON parse failed`)}if(!a||typeof a!=`object`||typeof a.urlPath!=`string`||typeof a.token!=`string`||!Gt(a))throw TypeError(`objstore: malformed fetch-mint (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:a.urlPath,token:a.token,meta:Kt(a)}}async function z(e,t){for(let n=0;n<Rt;n++){let r=await P(e,()=>ee(e,t));if(r.kind===`ok`)return r.value;if(r.kind===`not-found`)return null;if(n+1<Rt){let e=Math.min(Bt,zt*2**n);await new Promise(t=>{setTimeout(t,e)})}}return null}async function ee(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n;if(d.isSse()?(n=await R(e,t),n.kind===`unauthorized`&&(n=await L(e,t))):n=await L(e,t),n.kind===`not-found`)return{kind:`not-found`};if(n.kind===`unauthorized`)throw Error(`objstore: fetch-mint unauthorized`);let r=n.meta,i=await globalThis.fetch(A(n.urlPath),{method:`GET`,headers:{authorization:`Bearer ${n.token}`}});if(!i.ok){if(i.status===404||i.status===503)return{kind:`retry`};let e=``;try{e=await i.text()}catch{}throw Error(`objstore: REST GET failed ${i.status} ${e.slice(0,200)}`)}let a=new Uint8Array(await i.arrayBuffer()),o=await l(a);if(o!==r.contentHash)throw Error(`objstore: contentHash mismatch \u2014 expected ${r.contentHash.slice(0,16)}\u2026, got ${o.slice(0,16)}\u2026`);return{kind:`ok`,value:{bytes:a,meta:r}}}async function te(e,t){let n=d.getNonce();if(!n)throw Error(`objstore: socket not open`);let r=await i(e.signingKey,t,n);w({type:`objstore-delete`,...t,signature:r});let a=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t.resourceTag&&(n.type===`objstore-deleted-ack`||n.type===`objstore-delete-error`||n.type===`objstore-conflict`));if(a.type===`objstore-deleted-ack`){if(typeof a.deletedVersion!=`number`)throw TypeError(`objstore: malformed deleted-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:a.deletedVersion}}if(a.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(a.current)?Kt(a.current):null};if(a.reason===`not-found`)return{kind:`not-found`};throw Error(`objstore: delete-error reason='${String(a.reason)}'`)}async function ne(e,t,n){let r=Date.now(),i=await c(e.signingKey,n,r),a=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`delete`,ts:r,signature:i,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation})});if(a.status===401)return{kind:`unauthorized`};if(a.status===404)return{kind:`not-found`};if(a.status===409)return{kind:`conflict`,current:await Ut(a)};if(!a.ok){let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST delete failed ${a.status} ${e.slice(0,200)}`)}let o;try{o=await a.json()}catch{throw TypeError(`objstore: delete-ack JSON parse failed`)}if(!o||typeof o!=`object`||typeof o.deletedVersion!=`number`)throw TypeError(`objstore: malformed delete-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:o.deletedVersion}}function B(e,t,n){return P(e,()=>re(e,t,n))}async function re(e,t,n){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let r={workspaceTag:e.workspaceTag,resourceTag:t,prevVersion:n?.version??null,prevIncarnation:n?.incarnation??null},i;if(d.isSse()?(i=await ne(e,t,r),i.kind===`unauthorized`&&(i=await te(e,r))):i=await te(e,r),i.kind===`ok`)return{ok:!0,deletedVersion:i.deletedVersion};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};if(i.kind===`not-found`)return{ok:!1,reason:`not-found`};throw Error(`objstore: delete unauthorized`)}function ie(e,t,n,r){let i=e.seenVersions.get(t);if(i&&i.incarnation===n&&r<i.version)throw Error(`objstore: version-rollback rejected \u2014 fetched v${r} for an incarnation we've already seen at v${i.version}`)}async function ae(e,n){if(f)throw Error(`objstore: client closed`);if(!n||typeof n.workspaceId!=`string`)throw Error(`objstore: openWorkspace requires a WorkspaceSubscription (triageSync.ensureSubscription) — the client must not open a session for a tag with no backing sync subscribe`);let r=e.workspaceTag;if(n.workspaceTag!=null&&n.workspaceTag!==r)throw Error(`objstore: openWorkspace — WorkspaceSubscription is for a different workspace than these keys`);if(p.has(r))throw Error(`objstore: workspace ${r.slice(0,8)}\u2026 is already open on this client`);let i={workspaceTag:r,signingKey:e.signingKey,contentKey:new Uint8Array(e.contentKey),tagKey:new Uint8Array(e.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,inventorySeeded:!1,connected:!1,closed:!1};v(i),y(i),p.set(r,i);let a=i;(async()=>{let e;try{e=await n.resources}catch{return}!a.closed&&!a.inventorySeeded&&b(a,x(e))})();let o=d.acquire();m.set(r,o),d.getNonce()&&(a.connected=!0,a.resolveConnected());let s=null;try{await new Promise((e,n)=>{s=setTimeout(()=>{n(Error(`objstore: connect timeout after ${t}ms`))},t),a.connectedPromise.then(()=>e(),e=>n(e))})}catch(e){s&&clearTimeout(s),p.delete(r),m.delete(r),a.closed=!0;try{a.contentKey.fill(0)}catch{}try{a.tagKey.fill(0)}catch{}throw o.release(),e}s&&clearTimeout(s);async function c(e,t,n){let r=await F(a,{resourceTag:e,bytes:t,prev:n});return r.ok?(n??a.seenVersions.delete(e),_(a,e,r.meta.incarnation,r.meta.version),a.inventory.set(e,{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}),{ok:!0,meta:{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}}):r.reason===`workspace-full`?{ok:!1,reason:`workspace-full`}:r.reason===`unauthorized`?{ok:!1,reason:`unauthorized`}:(r.current&&_(a,e,r.current.incarnation,r.current.version),{ok:!1,reason:`conflict`,current:r.current})}async function l(e){let t=await U(a.tagKey,e.fileName);return await c(t,ct(a.contentKey,e.fileName,e.content,r,t),e.prev)}async function u(e){let t=await U(a.tagKey,e),n=await z(a,t);if(!n)return null;ie(a,t,n.meta.incarnation,n.meta.version);let{fileName:i,content:o}=ft(a.contentKey,n.bytes,r,t);if(i!==e)throw Error(`objstore: fileName-binding mismatch \u2014 requested '${e}', payload encoded '${i}'`);return _(a,t,n.meta.incarnation,n.meta.version),{content:o,version:n.meta.version,incarnation:n.meta.incarnation}}async function h(e){let t=await z(a,e);if(!t)return null;ie(a,e,t.meta.incarnation,t.meta.version);let{fileName:n,content:i}=ft(a.contentKey,t.bytes,r,e);if(await U(a.tagKey,n)===e)return _(a,e,t.meta.incarnation,t.meta.version),{kind:`report`,fileName:n,content:i,version:t.meta.version,incarnation:t.meta.incarnation};if(await st(a.tagKey,n)===e){let{name:r,content:o}=dt(i);return _(a,e,t.meta.incarnation,t.meta.version),{kind:`bundle`,integrity:n,name:r,content:o,version:t.meta.version,incarnation:t.meta.incarnation}}throw Error(`objstore: fetchByTag — decrypted name does not derive back to the requested resourceTag under either the report or bundle tag scheme (relay or workspace member produced a non-round-trippable tag-name pair)`)}async function g(e,t){let n=await B(a,e,t);return n.ok?(a.seenVersions.delete(e),a.inventory.delete(e),n):n.reason===`not-found`?{ok:!1,reason:`not-found`}:(n.current&&_(a,e,n.current.incarnation,n.current.version),{ok:!1,reason:`conflict`,current:n.current})}async function C(e,t){return await g(await U(a.tagKey,e),t)}async function w(){if(await S(a),a.closed)throw Error(`objstore: session closed`);return[...a.inventory.entries()].map(([e,t])=>({resourceTag:e,version:t.version,incarnation:t.incarnation,contentLength:t.contentLength}))}async function T(e){let t=await st(a.tagKey,e.integrity),n=ut(e.name,e.content);return await c(t,ct(a.contentKey,e.integrity,n,r,t),e.prev)}async function E(e){let t=await st(a.tagKey,e),n=await z(a,t);if(!n)return null;ie(a,t,n.meta.incarnation,n.meta.version);let{fileName:i,content:o}=ft(a.contentKey,n.bytes,r,t);if(i!==e)throw Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${e}', payload encoded '${i}'`);let{name:s,content:c}=dt(o);return _(a,t,n.meta.incarnation,n.meta.version),{name:s,content:c,version:n.meta.version,incarnation:n.meta.incarnation}}async function D(e,t){return await g(await st(a.tagKey,e),t)}return{put:l,fetch:u,fetchByTag:h,delete:C,list:w,putBundle:T,fetchBundle:E,deleteBundle:D,onPut(e){return a.putHandlers.add(e),()=>{a.putHandlers.delete(e)}},onDeleted(e){return a.deletedHandlers.add(e),()=>{a.deletedHandlers.delete(e)}},close(){if(a.closed)return;a.closed=!0,p.delete(r);try{a.contentKey.fill(0)}catch{}try{a.tagKey.fill(0)}catch{}try{a.rejectConnected(Error(`objstore: session closed`))}catch{}try{a.rejectListed(Error(`objstore: session closed`))}catch{}let e=m.get(r);m.delete(r),e&&e.release()}}}function oe(){if(!f){f=!0;for(let e of p.values()){e.closed=!0;try{e.contentKey.fill(0)}catch{}try{e.tagKey.fill(0)}catch{}try{e.rejectConnected(Error(`objstore: client closed`))}catch{}try{e.rejectListed(Error(`objstore: client closed`))}catch{}}p.clear();for(let e of m.values())e.release();m.clear(),k.remove(),u&&d.close()}}return{openWorkspace:ae,close:oe}}async function Ut(e){try{let t=await e.json();if(Wt(t.currentVersion)&&typeof t.currentIncarnation==`string`)return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function Wt(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}function Gt(e){return!e||typeof e!=`object`?!1:typeof e.resourceTag==`string`&&Wt(e.version)&&typeof e.incarnation==`string`&&typeof e.contentHash==`string`&&Wt(e.contentLength)&&typeof e.signature==`string`}function Kt(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var qt=null;function Jt(e){qt=typeof e==`function`?e:null}var Yt=Ft({serverUrl:``,authResolver:e=>qt==null?Promise.resolve(null):qt(e)});function Xt(){return Yt}var Zt=new Set([`busy`]);function Qt(e){return typeof e?.color==`string`?e.color:``}function $t(e){return u(e??void 0)??``}function en(e){return typeof e?.comment==`string`?e.comment:``}function tn(e){return typeof e?.fix==`string`?e.fix:``}function nn(e){return e?.flagged===!0?`flagged`:e?.flagged===!1?`not flagged`:``}function rn(e,t,n,r){let i=[];for(let a of Object.keys(e)){let o=e[a],s=t[a],c=n[a],l=o??null,u=[{name:`color`,norm:Qt},{name:`triage`,norm:$t},{name:`comment`,norm:en},{name:`fix`,norm:tn},{name:`flagged`,norm:nn}];for(let{name:e,norm:t}of u){let n=t(s),o=t(l),u=t(c);(o!==n||r?.has(a))&&u!==n&&o!==u&&i.push({id:a,property:e,local:o,imported:u})}}return i}function an(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 i=new Set(n);for(let e of r)if(!i.has(e))return!1;return!0}function on(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&&an(e.ignoredReports,t.ignoredReports)&&an(e.scopedIgnoredReports,t.scopedIgnoredReports)}function sn(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!on(e[r]??{},t[r]??{}))return!1;return!0}function cn(e=[],t=[],n=[]){let r=new Set(e),i=new Set(t),a=new Set(n);for(let e of r)i.has(e)||a.delete(e);for(let e of i)r.has(e)||a.add(e);return[...a]}function ln(e,t,n,r){let i=Object.assign(Object.create(null),n);for(let a of new Set([...Object.keys(e),...Object.keys(t),...r??[]])){let o=r?.has(a),s=p(e[a])??{},c=p(t[a])??{},l={...p(n[a])};for(let e of[`color`,`comment`,`fix`,`flagged`])(s[e]!==c[e]||o)&&Object.assign(l,{[e]:c[e]});if(o||s.triage!==c.triage||!an(s.ignoredReports,c.ignoredReports)){let e=!o&&d(c)&&d(l),t=e?cn(s.ignoredReports,c.ignoredReports,l.ignoredReports):c.ignoredReports??[];(!e||s.triage!==c.triage)&&(c.triage===void 0?delete l.triage:l.triage=c.triage),t.length===0?delete l.ignoredReports:l.ignoredReports=t}l.scopedIgnoredReports=[...new Set([...c.scopedIgnoredReports??[],...l.scopedIgnoredReports??[]])];let u=p(l);u?i[a]=u:delete i[a]}return i}function un(e,t){let n=Object.assign(Object.create(null),e);for(let[e,r]of Object.entries(t))r===null?delete n[e]:r!==void 0&&(n[e]=r);return n}function dn(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of r)on(e[i]??{},t[i]??{})||(n[i]=t[i]??null);return n}function fn(e){for(let t in e)return!1;return!0}function pn(e,t){let n=Object.assign(Object.create(null),e),r=gt().state,i=t instanceof Set?t:new Set(t);for(let e of i){let t=p(r.triage.get(e));t?n[e]=t:delete n[e]}return n}function mn(e,t){let n=gt().state,r=[];for(let i of t){let t=e[i];if(!t||typeof t!=`object`)continue;let a=n.triage.get(i);if(t.color){let e=a?.color;e===void 0?m(n.triage,i,{color:t.color}):e!==t.color&&r.push({id:i,property:`color`,local:e,imported:t.color})}let o=u(t);if(o){let e=u(a);e===void 0?m(n.triage,i,{triage:o}):e!==o&&r.push({id:i,property:`triage`,local:e,imported:o})}if(t.comment){let e=a?.comment;e===void 0?m(n.triage,i,{comment:t.comment}):e!==t.comment&&r.push({id:i,property:`comment`,local:e,imported:t.comment})}if(t.fix){let e=a?.fix;e===void 0?m(n.triage,i,{fix:t.fix}):e!==t.fix&&r.push({id:i,property:`fix`,local:e,imported:t.fix})}if(typeof t.flagged==`boolean`){let e=a?.flagged;e===void 0?m(n.triage,i,{flagged:t.flagged}):e!==t.flagged&&r.push({id:i,property:`flagged`,local:e?`flagged`:`not flagged`,imported:t.flagged?`flagged`:`not flagged`})}if(d(t)&&d(a)&&Array.isArray(t.ignoredReports))for(let e of t.ignoredReports)typeof e==`string`&&((a?.ignoredReports?.length??0)>0&&!a?.ignoredReports?.includes(e)||g(n.triage,i,e,!0,f(t,e)))}return r}function hn(e,t){let n=gt().state;for(let r of e)t[`${r.id}:${r.property}`]===`imported`&&gn(r.id,r.property)===r.local&&(r.property===`color`?m(n.triage,r.id,{color:r.imported}):r.property===`comment`?m(n.triage,r.id,{comment:r.imported}):r.property===`fix`?m(n.triage,r.id,{fix:r.imported}):r.property===`triage`?r.imported===`inprogress`||r.imported===`fixed`||r.imported===`invalid`||r.imported===`deleted`||r.imported===`ignored`?m(n.triage,r.id,{triage:r.imported,...r.imported===`ignored`?{}:{ignoredReports:void 0}}):m(n.triage,r.id,{triage:void 0}):r.property===`flagged`&&m(n.triage,r.id,{flagged:r.imported===`flagged`||r.imported!==`not flagged`&&void 0}))}function gn(e,t){let n=gt().state.triage.get(e);return t===`color`?n?.color??``:t===`triage`?u(n)??``:t===`comment`?n?.comment??``:t===`fix`?n?.fix??``:t===`flagged`?n?.flagged===!0?`flagged`:n?.flagged===!1?`not flagged`:``:``}function _n(e,t){let n=gt().state,r=t instanceof Set?t:new Set(t);for(let t of r){let r=e[t],i=d(r)?r?.ignoredReports:void 0;h(n.triage,t,{...r,ignoredReports:i})}}var vn=`deepview.sync.sessions`,yn=vn,bn=1,xn=!1,Sn=new Set;function Cn(){return xn}function wn(e){if(xn!==e){xn=e,console.warn(e?`triage-sync: can't persist the sessions blob — 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 Sn)try{t(e)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}}function Tn(e){let t=t=>e(t);return Sn.add(t),queueMicrotask(()=>{if(Sn.has(t))try{t(xn)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}),()=>Sn.delete(t)}function En(){try{let e=gt().getSecureItem(vn);if(!e)return{kind:`empty`};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{kind:`empty`};let n=t;return n.version===bn&&n.sessions&&typeof n.sessions==`object`&&!Array.isArray(n.sessions)?{kind:`v1`,map:n.sessions}:n.version===bn?{kind:`empty`}:`version`in n?{kind:`unknown-version`}:{kind:`legacy`,map:n}}catch{return{kind:`empty`}}}function Dn(){let e=En();return e.kind===`v1`||e.kind===`legacy`?e.map:{}}async function On(e){try{return await gt().setSecureItem(vn,JSON.stringify({version:bn,sessions:e})),!0}catch(e){return console.warn(`Triage sync: could not persist session state:`,e),!1}}function kn(e,t){if(!t)return null;let n=Dn()[e];return!n||n.serverUrl!==t?null:{baseRevision:typeof n.baseRevision==`string`?n.baseRevision:null,...n.hasBase===!0?{hasBase:!0}:{},baseState:n.baseState&&typeof n.baseState==`object`?Object.assign(Object.create(null),n.baseState):Object.create(null),savesSinceKeyframe:typeof n.savesSinceKeyframe==`number`?n.savesSinceKeyframe:0}}async function An(e){await navigator.locks.request(yn,async()=>{let t=En();if(t.kind===`unknown-version`){wn(!0);return}let n=t.kind===`v1`||t.kind===`legacy`?t.map:{};await e(n)!==!1&&wn(!await On(n))})}function jn(e=null){An(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(gt().listWorkspaces().map(e=>e.id)),i=!1;for(let a of n){let n=t[a];(!r.has(a)||e!=null&&n?.serverUrl!==e)&&(delete t[a],i=!0)}return i?void 0:!1}).catch(e=>{console.warn(`Triage sync: prunePersistedSessions lock failed:`,e)})}function Mn(e){return An(t=>{if(!(e in t))return!1;delete t[e]})}var Nn=!1,Pn=new Set;function Fn(){return Nn}function In(e){if(Nn!==e){Nn=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 — reconnects are being redirected to the proxy login. Reload the page to sign in again.`);for(let t of Pn)try{t(e)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}}function Ln(e){let t=t=>e(t);return Pn.add(t),queueMicrotask(()=>{if(Pn.has(t))try{t(Nn)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}),()=>Pn.delete(t)}async function Rn(e){if(typeof fetch>`u`||!e)return!1;let t;try{t=wt(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 zn,Bn,Vn,Hn,Un,Wn=`deepview.triageSyncUrl`,Gn=`deepview.sync.userEnabled`,Kn=/^\d+$/u,qn=()=>{},Jn=null,W=``,Yn=!0,Xn=!1,G=Xt(),Zn=null,Qn=100,$n=5,er=2e3;function tr(){return Yn&&!Xn&&!!W&&nr()}function nr(){try{return Bn().length>0}catch{return!1}}var rr=new Set,ir=new Set,ar=null;function or(t){let n=e(t);if(n!=null){ar=n;for(let e of ir)try{e(n)}catch(e){console.warn(`Triage sync: onServerInfo listener failed:`,e)}}}function sr(){if(!tr())return`off`;for(let e of q.values())if(e.error)return`error`;let e=G.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return`offline`;for(let e of q.values())if(!e.subscribeAcked)return`connecting`;return`online`}var cr=`off`;function K(){let e=sr();if(e!==cr){cr=e,vr(e);for(let t of rr)try{t(e)}catch(e){console.warn(`Triage sync status listener:`,e)}}}var lr=6e3,ur=3e4,dr=null,fr=!1,pr=0;function mr(e){return e===`offline`||e===`connecting`}function hr(){pr+=1,dr!=null&&(clearTimeout(dr),dr=null)}function gr(e){hr(),dr=setTimeout(()=>{dr=null,_r()},e),dr.unref?.()}async function _r(){if(fr||!tr()||!mr(sr()))return;let e=pr;fr=!0;let t=!1;try{t=await Rn(W)}catch{t=!1}finally{fr=!1}if(pr===e){if(!tr()||!mr(sr())){In(!1);return}if(t){In(!0);return}gr(ur)}}function vr(e){mr(e)?dr==null&&!fr&&!Fn()&&gr(lr):(hr(),In(!1))}var yr=0,q=new Map;function br(e){for(let t of q.values())if(t.workspaceTag===e)return t;return null}function J(e){return q.get(e.workspaceId)===e}function xr(e){e.busyRetryTimer??(e.busyRetryTimer=setTimeout(()=>{e.busyRetryTimer=null,J(e)&&(e.error||e.pending||!e.pendingSave||(e.pendingSave=!1,Y(e)))},er),e.busyRetryTimer.unref?.())}function Sr(e){e.busyRetryTimer!=null&&(clearTimeout(e.busyRetryTimer),e.busyRetryTimer=null)}function Cr(e){if(e.appliedRevisions.clear(),Sr(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 e of t)try{e([])}catch{}}}function wr(e){let t=new Set,n=Bn().find(t=>t.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let e of zn.reports)if(r.has(e.fileName))for(let n of e.groups)for(let e of n){let n=e.id??String(e._id);Kn.test(n)||t.add(n)}return t}function Tr(e){let t=wr(e.workspaceId),n=[];for(let r of t)e.ids.has(r)||n.push(r);let r=[];return n.length>0&&(r=mn(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function Er(){let e=En();e.kind===`unknown-version`?wn(!0):(e.kind===`v1`||e.kind===`legacy`)&&wn(!1),xt(),G.resetCachedReplayGuard()}function Dr(e){if(!e||!W)return;let t=W,n=e.generation,r={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState,...e.baseRevision===null&&e.hasBase?{hasBase:!0}:{}};An(i=>{if(!J(e)||e.generation!==n||W!==t)return!1;i[e.workspaceId]=r}).catch(e=>{console.warn(`Triage sync: persistSession lock failed:`,e)})}function Or(e){let t=Bn().find(t=>t.id===e.workspaceId);if(!t){e.error=`workspace no longer exists`,K();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,i]=await Promise.all([Ne(t.privateKey),Pe(t.privateKey,e.workspaceId)]);if(q.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=i.privateKey,e.verifyingKey=i.publicKey,e.workspaceTag=i.publicKeyB64,G.getSocket()?.readyState!==WebSocket.OPEN){qr();return}Mr(e),Y(e),K()}catch(t){console.warn(`Triage sync: key derivation failed:`,t),q.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${t instanceof Error?t.message:String(t)}`,K())}})()}function kr(e){return G.send(e)}function Ar(e,t){if(!G.isSse()){kr(t);return}let n=e.generation,r=e.pending,i=()=>J(e)&&e.generation===n&&e.pending===r;jr(t,i).then(e=>(e&&i()&&kr(t),null)).catch(()=>{i()&&kr(t)})}async function jr(e,t){if(!W)return!0;let n;try{n=Tt(W)}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 i=e.workspaceTag,a=e.base??null;if(r.status===401)return!0;if(r.ok){let e=null;try{e=await r.json()}catch{return!0}return t()?!e||typeof e.id!=`string`||(Wr({type:`workspace-save-ack`,workspaceTag:i,base:a,id:e.id},t),!1):!1}if(r.status===409){let e=null;try{e=await r.json()}catch{return!0}return t()?(Wr({type:`workspace-state`,workspaceTag:i,revisions:e&&Array.isArray(e.revisions)?e.revisions:[]},t),Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`stale-base`},t),!1):!1}return r.status!==413||(Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`too-large`},t),!1)}function Mr(e,t=!1){if(!J(e)||!tr())return;let n=G.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=G.getNonce();if(r==null)return;let i=e.baseRevision,a=n,o=e.signingKey,s=e.workspaceTag,c=e.generation;(async()=>{try{let t=await Be(o,s,i,r);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s||G.getSocket()!==a||G.getNonce()!==r)return;e.subscribed=!0,kr({type:`workspace-subscribe`,workspaceTag:s,from:i,signature:t})}catch(e){console.warn(`Triage sync: subscribe sign failed:`,e)}})()}function Y(e){if(!J(e)||!tr()||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}Tr(e),e.localState=pn(e.baseState,e.ids);let t=G.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=Qn,r=dn(n?Object.create(null):e.baseState,e.localState);if(fn(r)&&!n)return;let i=e.baseRevision,a=e.key,o=e.signingKey,s=e.workspaceTag,c=e.generation;e.encrypting=!0,(async()=>{try{let t=Ue(s,i),{nonce:l,ciphertext:u}=await Ze(a,r,t),d={publicKeyB64:s,base:i,keyframe:n,nonceB64:l,ciphertextB64:u},f=await Le(o,d),p=await Re(d);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s)return;if(e.baseRevision!==i||e.receiving){e.pendingSave=!0;return}e.pending={base:i,id:p,changeset:r,keyframe:n},e.pendingSave=!1;let m={type:`workspace-save`,workspaceTag:s,base:i,nonce:l,ciphertext:u,signature:f};n&&(m.keyframe=!0),Ar(e,m),e.consecutiveFailures=0,e.error&&(e.error=null,K())}catch(t){console.warn(`Triage sync: encrypt/sign failed:`,t),J(e)&&e.generation===c&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=$n&&(e.error=`encrypt/sign failed: ${t instanceof Error?t.message:String(t)}`,K()))}finally{J(e)&&e.generation===c&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&!e.receiving&&(e.pendingSave=!1,Y(e)))}})()}async function Nr(e,t,n,r){for(let i of t){if(!i||typeof i!=`object`||typeof i.id==`string`&&(i.id===e.baseRevision||e.appliedRevisions.has(i.id)||r.has(i.id)))continue;let t=e.baseRevision,a=i.keyframe===!0;if(!(t==null?i.base==null||a:i.base===t))return console.warn(`Triage sync: chain base mismatch (expected ${t}, got ${i.base})`),!1;if(typeof i.signature!=`string`||typeof i.nonce!=`string`||typeof i.ciphertext!=`string`||typeof i.id!=`string`)return console.warn(`Triage sync: revision missing signature/nonce/ciphertext/id; resyncing`),e.savesSinceKeyframe=Qn,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let o=typeof i.base==`string`?i.base:null,s={publicKeyB64:e.workspaceTag,base:o,keyframe:a,nonceB64:i.nonce,ciphertextB64:i.ciphertext},c=await Ve(e.verifyingKey,s,i.signature);if(!n())return!1;if(!c)return console.warn(`Triage sync: revision signature did not verify; resyncing`),e.savesSinceKeyframe=Qn,!1;let l=await Re(s);if(!n())return!1;if(i.id!==l)return console.warn(`Triage sync: revision id does not match content hash; resyncing`),e.savesSinceKeyframe=Qn,!1;let u;try{let t=Ue(e.workspaceTag,o);u=await Qe(e.key,i.nonce,i.ciphertext,t)}catch(t){return console.warn(`Triage sync: decrypt failed; resyncing`,t),e.savesSinceKeyframe=Qn,!1}if(!n())return!1;e.baseState=un(a?Object.create(null):e.baseState,u??{}),e.baseRevision=i.id,e.appliedRevisions.add(i.id),e.pending?.id===i.id&&(e.pending=null),e.savesSinceKeyframe=a?0:Math.min((e.savesSinceKeyframe??0)+1,Qn)}return!0}async function Pr(e,t,n=[],r=null){if(!J(e))return;let i=e.generation;e.localState=un(e.baseState,t),yr++;try{_n(e.localState,e.ids),r&&n.length>0&&(hn(n.filter(({id:t})=>e.ids.has(t)),r),e.localState=pn(e.baseState,e.ids)),Dr(e),await Vn()}finally{yr--}if(J(e)&&e.generation===i){e.localState=pn(e.baseState,e.ids),qn();for(let t of q.values())t!==e&&Y(t)}}function Fr(e){return Tr(e),e.localState=pn(e.baseState,e.ids),dn(e.baseState,e.localState)}async function Ir(e,t){let n=e.generation;if(e.pending&&t.base===e.pending.base&&typeof t.id==`string`&&t.id===e.pending.id){Fr(e);let r=e.localState;if(e.baseState=un(e.pending.keyframe?Object.create(null):e.baseState,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,Qn),e.pending=null,e.staleResetAttempted=!1,await Pr(e,dn(e.baseState,r)),!J(e)||e.generation!==n)return;(e.pendingSave||!sn(e.localState,e.baseState))&&(e.pendingSave=!1,Y(e));return}if(e.pending){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: ack mismatch (pending ${e.pending.base}/${e.pending.id.slice(0,8)}, ack ${t.base}/${n})`);return}if(t.id!==e.baseRevision){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${n}\u2026; pending was already cleared`),e.pendingSave=!0,Y(e)}}async function Lr(e,t){if(!Array.isArray(t)||!e.key)return;if(t.length===0){e.resyncAttempted&&(e.resyncAttempted=!1,e.pending||(e.pendingSave=!1,Y(e)));return}let n=e.generation,r=e.workspaceTag,i=()=>J(e)&&e.generation===n&&e.workspaceTag===r;e.receiving=!0;try{Fr(e);let n=e.baseState,r=e.pending,a=e.baseRevision,o={...e,appliedRevisions:new Set},s=await Nr(o,t,i,e.appliedRevisions);if(!i())return;if(o.baseRevision!==a){let t=r&&o.pending===null?un(r.keyframe?Object.create(null):n,r.changeset):n;Fr(e);let s=dn(t,e.localState),c=a===null&&!(r&&o.pending===null)?new Set([...Object.keys(t),...e.hasBase?e.ids:[]]):void 0;if(c)for(let t of c)s[t]=e.localState[t]??null;let l=rn(s,t,o.baseState,c).filter(({id:t})=>e.ids.has(t)),u=null;if(l.length>0&&Jn){try{u=await Jn(l,o.baseState,`chain`)??null}catch(e){console.warn(`Triage sync: chain-conflict resolver failed:`,e)}if(!i())return}Fr(e);let d=ln(t,e.localState,o.baseState,c);e.baseRevision=o.baseRevision,e.hasBase=!0;for(let t of o.appliedRevisions)e.appliedRevisions.add(t);if(e.baseState=o.baseState,e.savesSinceKeyframe=o.savesSinceKeyframe,e.pending&&(e.pendingSave=!0),e.pending=null,await Pr(e,dn(e.baseState,d),l,u),!i())return}else e.savesSinceKeyframe=o.savesSinceKeyframe;if(!s){if(e.pendingSave=!1,!e.resyncAttempted){e.resyncAttempted=!0,Mr(e,!0);return}console.warn(`Triage sync: catch-up also broke continuity; full state push`),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Qn,e.pending=null,e.resyncAttempted=!1,e.pendingSave=!0,Dr(e),qn();return}e.resyncAttempted=!1,e.staleResetAttempted=!1,sn(e.localState,e.baseState)||(e.pendingSave=!0)}finally{i()&&(e.receiving=!1,e.pendingSave&&!e.pending&&!e.error&&(e.pendingSave=!1,Y(e)))}}async function Rr(e){if(e.type===`server-info`){or(e);return}if(e.type===`authenticated`){for(let e of q.values())Mr(e),Y(e);return}if(e.type===`unauthorized`){if(e.kind===`gated`){if(typeof e.workspaceTag==`string`){let t=br(e.workspaceTag);t&&typeof e.resourceTag!=`string`&&zr(t,e)}G.runAuthFlow().catch(e=>{console.warn(`Triage sync: auth flow failed:`,e)})}return}if(typeof e.workspaceTag!=`string`)return;let t=br(e.workspaceTag);if(t){if(e.type===`workspace-save-ack`)await Ir(t,e);else if(e.type===`workspace-state`)await Lr(t,e.revisions);else if(e.type===`workspace-save-error`)Vr(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 e of r)try{e(n)}catch{}}K()}}}function zr(e,t){e.pending&&(typeof t.base!=`string`&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var Br=/^[\w-]+$/u;function Vr(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&&Br.test(n)?n:`rejected`;if(e.pending=null,Zt.has(r)){e.pendingSave=!0,xr(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=Qn,e.pendingSave=!1,e.resyncAttempted=!1,Dr(e),qn(),Y(e);return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,K()}var Hr=Promise.resolve(),Ur=0;function Wr(e,t=()=>!0){let n=Ur,r=typeof e.workspaceTag==`string`?br(e.workspaceTag):null;if(typeof e.workspaceTag==`string`&&!r)return;let i=r?.generation;Hr=Hr.then(()=>{if(t()&&Ur===n&&(!r||J(r)&&r.generation===i))return Rr(e)}).catch(e=>{console.warn(`Triage sync handler error:`,e)})}function Gr(e){for(let e of q.values())e.pending=null,e.pendingSave=!1,Mr(e),Y(e);K()}function Kr(e){Ur++,Hr=Promise.resolve();for(let e of q.values())e.generation++,e.encrypting=!1,e.receiving=!1,e.pending=null,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,e.pendingSave=!0,Sr(e);K()}G.addConsumer({onMessage:Wr,onConnected:Gr,onDisconnected:Kr});function qr(){tr()?Zn||=G.acquire():Zn&&=(Zn.release(),null)}function Jr(e){qn=typeof e==`function`?e:()=>{}}function Yr(e){Jn=typeof e==`function`?e:null}function Xr(e){Jt(e)}function Zr(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&Or(e)}function Qr(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,Sr(e)}var $r={setServerUrl(e){let t=(e??``).trim();if(t===W)return;let n=W;Ur++,Hr=Promise.resolve(),W=t,hr(),In(!1),t&&jn(t),n&&t&&n!==t&&St(null).catch(e=>{console.warn(`Triage sync: failed to drop cached auth password on server change:`,e)}),G.setServerUrl(t);for(let e of q.values()){Qr(e);let n=t?kn(e.workspaceId,t):null;e.baseRevision=n?.baseRevision??null,e.appliedRevisions.clear(),e.baseState=n?.baseState??Object.create(null),e.hasBase=n?.hasBase===!0||e.baseRevision!==null||Object.keys(e.baseState).length>0,e.savesSinceKeyframe=n?.savesSinceKeyframe??0,e.localState=pn(e.baseState,e.ids),Zr(e)}qr(),K()},setEnabled(e){let t=!!e;if(t!==Yn){if(Yn=t,Un(Gn,t?`1`:`0`).catch(e=>{console.warn(`Triage sync: could not persist user-enabled:`,e)}),tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},isEnabled(){return Yn},setForcedOff(e){let t=!!e;if(t!==Xn){if(Xn=t,tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},getServerUrl(){return W},get connected(){return G.getSocket()?.readyState===WebSocket.OPEN},get status(){return sr()},onStatusChange(e){return rr.add(e),()=>rr.delete(e)},onServerInfo(e){if(ir.add(e),ar!=null)try{e(ar)}catch{}return()=>ir.delete(e)},setProtocolLocked(e){G.setProtocolLocked(e)},notify(){if(!(yr>0))for(let e of q.values())Y(e)},ensureSubscription(e){let t=q.has(e);$r.openSession(e);let n=q.get(e);if(!n)return null;let r=new Promise(e=>{n.objstoreResourceWaiters.push(e)});return t&&Mr(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||q.has(e)||!Bn().find(t=>t.id===e))return;let t=wr(e),n=kn(e,W),r=n?.baseState??Object.create(null);mn(r,t);let i={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:t,baseRevision:n?.baseRevision??null,appliedRevisions:new Set,baseState:r,hasBase:n?.hasBase===!0||n?.baseRevision!=null||Object.keys(r).length>0,savesSinceKeyframe:n?.savesSinceKeyframe??0,localState:pn(r,t),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:[]};q.set(e,i),Or(i),qr(),K()},closeSession(e){if(e==null){for(let e of q.values())Cr(e);q.clear()}else{let t=q.get(e);t&&Cr(t),q.delete(e)}K()},refreshSession(e){let t=q.get(e);if(!t){console.debug(`triage-sync: refreshSession bail — no session for`,e,`(caller must openSession first)`);return}ei(t)},sessionInfo(e){let t=q.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[...q.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...q.keys()]:[e],n=!1;for(let e of t){let t=q.get(e);!t||!t.error||(t.error=null,t.consecutiveFailures=0,n=!0,!t.key||!t.signingKey?Or(t):G.getSocket()?.readyState===WebSocket.OPEN&&(Mr(t),Y(t)))}n&&K()},get persistenceDegraded(){return Cn()},onPersistenceDegraded(e){return Tn(e)},get proxyAuthRequired(){return Fn()},onProxyAuthRequired(e){return Ln(e)}};_t(e=>{zn=e.state,Bn=e.listWorkspaces,Vn=e.saveTriage,Hn=e.getSecureItem,Un=e.setSecureItem,e.onSecureStorageHydrated(Er);try{localStorage.removeItem(Wn),Hn(Gn)===`0`&&(Yn=!1),qr()}catch{}e.onWorkspaceDeleted(e=>{let t=q.get(e);t&&Sr(t);let n=q.delete(e);Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)}),qr(),n&&K()}),e.onWorkspacePrivateKeyChanged(e=>{let t=q.get(e);if(!t){Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)});return}t.signingKey=null,t.key=null,t.verifyingKey=null,t.workspaceTag=null,Qr(t),t.keyDerivationGen=(t.keyDerivationGen??0)+1,(async()=>{await Mn(e),q.delete(e),$r.openSession(e),K()})().catch(t=>{console.warn(`Triage sync: privateKey rotation IIFE failed:`,t),q.delete(e),K()})}),e.onReportMembershipChanged(e=>{$r.openSession(e);let t=q.get(e);t&&ei(t)}),jn()});function ei(e){let t=e.generation,{conflicts:n,hydrated:r}=Tr(e);(async()=>{if(n.length===0){r?await Vn():Y(e);return}let i=null;if(Jn)try{i=await Jn(n,e.baseState,`attach`)}catch(e){console.warn(`Triage sync: hydration conflict resolver failed:`,e)}!J(e)||e.generation!==t||(i&&hn(n.filter(({id:t})=>e.ids.has(t)),i),await Vn())})().catch(e=>{console.warn(`Triage sync: refreshAndPropagate failed:`,e)})}var ti,ni,ri,ii,ai,oi,si,ci,li,ui,di,fi,X=new Map,pi=2e3,mi={setTimeout:(e,t)=>setTimeout(e,t)},hi=new Map,gi=new Set;function Z(e,n){try{let r={names:Object.fromEntries(n.remoteNameByTag),bundles:Object.fromEntries(n.remoteBundleByTag),bundleNames:Object.fromEntries(n.remoteBundleNameByIntegrity),baselines:Object.fromEntries(n.baselines),localVersions:Object.fromEntries([...n.baselines].filter(([,e])=>e.synced).map(([e,t])=>[e,t.version]))};localStorage.setItem(t(e),JSON.stringify(r))}catch(t){console.warn(`objstore-presence: cache persist failed for ${e}:`,t)}}function _i(e){try{localStorage.removeItem(t(e))}catch{}}var vi=null;function yi(e){return vi||=Ht({serverUrl:``,httpOrigin:e,transport:Xt()}),vi}var bi=new Set,xi=new Set;function Q(){for(let e of gi)try{e()}catch{}}function Si(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 Ci=256;function wi(e){return typeof e==`string`?e.length<=Ci?e:e.slice(0,Ci):``}function Ti(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 Ei(e){if(X.has(e))return;let t=ti().find(t=>t.id===e);if(!t)return;let r=$r.ensureSubscription(e);if(!r)return;let i={workspaceId:e,session:null,keys:null,remoteTags:new Set,fileTags:new Map,bundleTags:new Map,remoteNameByTag:new Map,remoteBundleByTag:new Map,remoteBundleNameByIntegrity:new Map,remoteMeta:new Map,baselines:new Map,localChanged:new Set,selfWrites:new Map,selfWriteNotices:new Map,tagLocks:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};X.set(e,i),i.ready=(async()=>{if(i.keys=await at(t.privateKey,t.id),i.disposed)return;let o=new Map;for(let e of t.reports??[]){let t=await U(i.keys.tagKey,e);i.fileTags.set(e,t),o.set(t,e)}if(i.disposed)return;let s=new Map;for(let e of t.bundles??[]){let t=await st(i.keys.tagKey,e);i.bundleTags.set(e,t),s.set(t,e)}if(i.disposed)return;try{let e=await si();if(i.disposed)return;for(let t of e)i.bundleTags.has(t.integrity)&&i.remoteBundleNameByIntegrity.set(t.integrity,t.name)}catch(t){console.warn(`objstore-presence: listBundles failed during ${e} open:`,t)}Q();let c=$r.getServerUrl();if(!c)return;let l=Ti(c);if(l)try{let t=await yi(l).openWorkspace(i.keys,r);if(i.disposed){try{t.close()}catch{}return}i.session=t,a();let c=await t.list();if(i.disposed)return;for(let e of c)i.remoteTags.add(e.resourceTag),Hi(i,e.resourceTag,e.version,e.incarnation);let u=n(e),d=!1;if(u)for(let[e,t]of Object.entries(u.baselines))(i.remoteTags.has(e)||o.has(e))&&i.baselines.set(e,t);for(let e of i.remoteTags){let t=o.get(e);t!==void 0&&!i.remoteNameByTag.has(e)&&(i.remoteNameByTag.set(e,t),d=!0);let n=s.get(e);if(n!==void 0&&!i.remoteBundleByTag.has(e)&&(i.remoteBundleByTag.set(e,n),d=!0),u){let t=u.names[e];typeof t==`string`&&!i.remoteNameByTag.has(e)&&!i.remoteBundleByTag.has(e)&&(i.remoteNameByTag.set(e,t),i.fileTags.set(t,e),d=!0);let n=u.bundles[e];if(typeof n==`string`&&!i.remoteBundleByTag.has(e)&&!i.remoteNameByTag.has(e)){i.remoteBundleByTag.set(e,n),i.bundleTags.set(n,e);let t=u.bundleNames[n];typeof t==`string`&&!i.remoteBundleNameByIntegrity.has(n)&&i.remoteBundleNameByIntegrity.set(n,t),d=!0}}}(d||u)&&Z(e,i),Q(),ia(i);for(let e of i.remoteTags)Ui(i.baselines.get(e),i.remoteMeta.get(e))&&ca(i,e).catch(()=>{});Qi(i).catch(()=>{})}catch(e){i.err=e}})();function a(){let t=i.session;t.onPut(({resourceTag:e,version:t,incarnation:n})=>{let r=i.remoteMeta.get(e),a=i.remoteTags.has(e)&&r!==void 0&&(r.incarnation!==n||t>r.version);if(i.remoteTags.add(e),Hi(i,e,t,n),Q(),a){ca(i,e).catch(()=>{});return}ia(i)}),t.onDeleted(({resourceTag:t})=>{i.remoteTags.delete(t),i.remoteMeta.delete(t);let n=i.remoteNameByTag.get(t);i.remoteNameByTag.delete(t);let r=ti().find(t=>t.id===e),a=r?.reports??[],o=r?.bundles??[];n&&!a.includes(n)&&i.fileTags.delete(n);let s=i.remoteBundleByTag.get(t);i.remoteBundleByTag.delete(t),s&&(i.remoteBundleNameByIntegrity.delete(s),o.includes(s)||i.bundleTags.delete(s)),Z(e,i),Q()})}i.ready.catch(()=>{})}function Di(e){let t=X.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}X.delete(e),Q()}}_t(e=>{ti=e.listWorkspaces,ni=e.addReportToWorkspace,ri=e.addBundleToWorkspace,ii=e.analyzeContent,ai=e.setCount,oi=e.gunzipBytes,si=e.listBundles,ci=e.listFiles,li=e.readBundle,ui=e.readFileBytes,di=e.saveBundle,fi=e.saveFileBytes,e.onFileMutated?.((e,t)=>{for(let n of X.values()){let r=n.fileTags.get(e);if(r!==void 0){if(t===`delete`){n.localChanged.delete(r)&&Q();continue}if(n.selfWrites.has(e)){n.selfWriteNotices.set(e,(n.selfWriteNotices.get(e)??0)+1);continue}hi.has(e)||Xi(n,r,e)}}}),e.onReportMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.reports??[])t.fileTags.has(r)||Ai(e,r).catch(()=>{})}),e.onBundleMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.bundles??[])t.bundleTags.has(r)||Mi(e,r).catch(()=>{})}),e.onWorkspaceDeleted(e=>{Di(e),_i(e)}),e.onWorkspacePrivateKeyChanged(e=>{X.has(e)&&(Di(e),_i(e),Ei(e))})});function Oi(){return Array.from(X.keys())}function ki(e,t){let n=X.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function Ai(e,t){let n=X.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await U(n.keys.tagKey,t)),n.disposed||Q()))}function ji(e,t){let n=X.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function Mi(e,t){let n=X.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await st(n.keys.tagKey,t)),n.disposed||Q()))}function Ni(e){return gi.add(e),()=>gi.delete(e)}function Pi(e){return bi.add(e),()=>bi.delete(e)}function Fi(e){return xi.add(e),()=>xi.delete(e)}function Ii(e){hi.set(e,(hi.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let n=hi.get(e)-1;if(n>0){hi.set(e,n);return}hi.delete(e);for(let t of X.values()){let n=t.fileTags.get(e);n!==void 0&&Zi(t,n,e).catch(()=>{})}}}function Li(e){let t=X.get(e);return t?(ti().find(t=>t.id===e)?.reports??[]).filter(e=>{let n=t.fileTags.get(e);return n!==void 0&&Ji(t,n)}):[]}function Ri(e){let t=X.get(e);return t?t.remoteTags.size:0}async function zi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function Bi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function Vi(e,t){let n=X.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}function Hi(e,t,n,r){let i=e.remoteMeta.get(t);i&&i.incarnation===r&&i.version>=n||e.remoteMeta.set(t,{version:n,incarnation:r})}function Ui(e,t){return!e||!t?!1:e.incarnation===null?t.version!==e.version:e.incarnation!==t.incarnation||t.version>e.version}function Wi(e,t){let n=e.baselines.get(t);return!!n&&n.incarnation!==null}function Gi(e,t){return!!e&&e.synced&&e.incarnation===t.incarnation&&e.version===t.version}function $(e,t,n,r,i=null){let a=Ji(e,t);e.baselines.set(t,{version:n.version,incarnation:n.incarnation,synced:r,hash:r?i:null}),e.localChanged.delete(t),!e.disposed&&Ji(e,t)!==a&&Q()}function Ki(e,t){return!!e&&e.synced&&!!e.hash&&!!t&&e.hash!==t}function qi(e,t){return!!e&&!e.synced||Ki(e,t)}function Ji(e,t){if(!e.remoteTags.has(t))return!1;if(e.localChanged.has(t))return!0;let n=e.baselines.get(t);return!!n&&!n.synced}async function Yi(e,t,n){e.selfWrites.set(t,(e.selfWrites.get(t)??0)+1);try{await fi(t,n),e.selfWriteNotices.set(t,(e.selfWriteNotices.get(t)??0)-1)}finally{let n=e.selfWrites.get(t)-1;if(n>0)e.selfWrites.set(t,n);else{e.selfWrites.delete(t);let n=e.selfWriteNotices.get(t)??0;e.selfWriteNotices.delete(t);let r=e.fileTags.get(t);n>0&&r!==void 0&&!e.disposed&&Xi(e,r,t)}}}function Xi(e,t,n){mi.setTimeout(()=>Zi(e,t,n).catch(()=>{}),pi)}function Zi(e,t,n){return $i(e,t,async()=>{if(hi.has(n))return;let r=e.baselines.get(t);if(e.disposed||!r?.synced||!r.hash)return;let i;try{i=await ui(n)}catch{return}let a=await l(i);if(e.disposed||e.baselines.get(t)!==r)return;let o=r.hash!==a;o!==e.localChanged.has(t)&&(o?e.localChanged.add(t):e.localChanged.delete(t),Q())})}async function Qi(e){let t=ti().find(t=>t.id===e.workspaceId);for(let n of t?.reports??[]){if(e.disposed)return;let t=e.fileTags.get(n);if(t!==void 0&&e.baselines.get(t)?.hash)try{await Zi(e,t,n)}catch{}}}function $i(e,t,n){let r=(e.tagLocks.get(t)??Promise.resolve()).then(()=>n()),i=r.catch(()=>{}).finally(()=>{e.tagLocks.get(t)===i&&e.tagLocks.delete(t)});return e.tagLocks.set(t,i),r}function ea(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}async function ta(e,t){let n;try{n=await ui(e)}catch{return{same:null,hash:null}}let r=await l(n);if(ea(n,t))return{same:!0,hash:r};try{let[e,i]=await Promise.all([oi(n),oi(t)]);return{same:ea(e,i),hash:r}}catch{return{same:!1,hash:r}}}async function na(e,t,n,r){let i;try{i=x(await oi(n.content))}catch(e){throw Error(`gunzip/decode of "${n.fileName}" failed (likely forged peer payload)`,{cause:e})}if(!r())return!1;let a=ii(i);if(!a.recognized)throw Error(`cloud copy of "${n.fileName}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);if(await Yi(e,n.fileName,n.content),e.disposed)return!1;ai(n.fileName,a.count,a.source),$(e,t,n,!0,await l(n.content)),Z(e.workspaceId,e);for(let t of bi)try{t(e.workspaceId,n.fileName)}catch{}return!0}async function ra(e,t,n,r,{keepLocalChanges:i=!0}={}){let{same:a,hash:o}=await ta(n.fileName,n.content);return r()?a?($(e,t,n,!0,o),Z(e.workspaceId,e),!1):i&&a===!1&&qi(e.baselines.get(t),o)?($(e,t,n,!1),Z(e.workspaceId,e),!1):await na(e,t,n,r):!1}async function ia(e){if(!e.session||e.disposed)return;let t=ti().find(t=>t.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),i=new Set;try{i=new Set(await ci())}catch(t){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,t)}if(e.disposed||!e.session)return;let a=[];for(let t of e.remoteTags){let o=e.remoteNameByTag.get(t);if(o!==void 0&&n.has(o)&&i.has(o)&&Wi(e,t))continue;if(e.remoteBundleByTag.has(t)){let n=e.remoteBundleByTag.get(t);if(e.remoteBundleNameByIntegrity.has(n)&&r.has(n))continue}let s=e.inFlight.get(t);if(!s){let n=e.remoteMeta.get(t),r=()=>e.disposed||!e.remoteTags.has(t)||e.remoteMeta.get(t)===n?null:ia(e).then(()=>null,()=>null);s=e.session.fetchByTag(t).then(async n=>(e.inFlight.delete(t),e.disposed?null:n?e.remoteTags.has(t)?n.kind===`bundle`?(e.remoteBundleByTag.set(t,n.integrity),e.bundleTags.set(n.integrity,t),n.name&&e.remoteBundleNameByIntegrity.set(n.integrity,n.name),await la(e,t,n.integrity,n.name,n.content),null):(e.remoteNameByTag.set(t,n.fileName),e.fileTags.set(n.fileName,t),await aa(e,t,n),null):null:r()),()=>(e.inFlight.delete(t),r())),e.inFlight.set(t,s)}a.push(s)}a.length!==0&&(await Promise.all(a),!e.disposed&&(Z(e.workspaceId,e),Q()))}async function aa(e,t,n){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{await oa(e,t,n),!e.disposed&&e.remoteTags.has(t)&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t).catch(()=>{})})}async function oa(e,t,n){let r=n.fileName,i=n.content;if(e.disposed||!e.remoteTags.has(t))return;let a=ti().find(t=>t.id===e.workspaceId),o=!!(a&&Array.isArray(a.reports)&&a.reports.includes(r)),s;try{let n=await ci();if(e.disposed||!e.remoteTags.has(t))return;s=n.includes(r)}catch(e){console.warn(`auto-download: listFiles failed before saving "${r}":`,e);return}if(s){if(o){await sa(e,t,n);return}if(e.disposed||!e.remoteTags.has(t))return;try{await ni(r,e.workspaceId)}catch(t){console.warn(`auto-download: attaching local "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(e.disposed)return;if(!e.baselines.has(t)){let{same:a,hash:o}=await ta(r,i);if(e.disposed)return;a!==null&&($(e,t,n,a,o),Z(e.workspaceId,e))}for(let t of bi)try{t(e.workspaceId,r)}catch{}return}let c;try{c=x(await oi(i))}catch(e){console.warn(`auto-download: gunzip/decode of "${r}" failed (likely forged peer payload):`,e);return}if(e.disposed||!e.remoteTags.has(t))return;let u=ii(c);if(u.recognized){try{if(await Yi(e,r,i),e.disposed||!e.remoteTags.has(t)||(ai(r,u.count,u.source),$(e,t,n,!0,await l(i)),!e.remoteTags.has(t)))return;await ni(r,e.workspaceId),Z(e.workspaceId,e)}catch(t){console.warn(`auto-download: persisting "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of bi)try{t(e.workspaceId,r)}catch{}}}async function sa(e,t,n){let r=()=>!e.disposed&&e.remoteTags.has(t),{same:i,hash:a}=await ta(n.fileName,n.content);if(!r()||i===null)return;let o=e.baselines.get(t);if(i){(!Gi(o,n)||o.hash!==a)&&($(e,t,n,!0,a),Z(e.workspaceId,e));return}if(Ui(o,n)&&!qi(o,a)){try{await na(e,t,n,r)}catch(e){console.warn(`auto-download: ${e.message}`,e)}return}if(!o||o.incarnation===null||Ui(o,n)){$(e,t,n,!1),Z(e.workspaceId,e);return}Ki(o,a)&&!e.localChanged.has(t)&&(e.localChanged.add(t),Q())}async function ca(e,t,n=0){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{let r=()=>!e.disposed&&e.remoteTags.has(t);if(!r())return;let i=e.baselines.get(t);if(i?.synced&&!Ui(i,e.remoteMeta.get(t)))return;let a;try{a=await e.session.fetchByTag(t)}catch(t){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,t);return}if(a&&r()&&a.kind!==`bundle`){e.remoteNameByTag.set(t,a.fileName),e.fileTags.set(a.fileName,t);try{await ra(e,t,a,r)}catch(e){console.warn(`replace-refetch: ${e.message}`,e);return}n<2&&r()&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t,n+1).catch(()=>{})}})}async function la(e,t,n,r,i){if(e.disposed||!e.remoteTags.has(t))return;let a;try{a=await si()}catch(e){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,e);return}if(e.disposed||!e.remoteTags.has(t))return;if(a.some(e=>e.integrity===n)){try{await ri(n,e.workspaceId)}catch(e){console.warn(`auto-download: attach pre-existing bundle failed:`,e);return}if(e.disposed)return;let t=a.find(e=>e.integrity===n)?.name??``;for(let r of xi)try{r(e.workspaceId,n,t)}catch{}return}let o=await _(i);if(e.disposed||!e.remoteTags.has(t))return;if(o!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${o}) \u2014 refusing to save`);return}let s=wi(r&&r.length>0?r:`bundle-${n.slice(7,15)}`);try{if(await di(s,i),e.disposed||!e.remoteTags.has(t))return;await ri(n,e.workspaceId)}catch(t){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of xi)try{t(e.workspaceId,n,s)}catch{}}async function ua(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw Error(`Objstore session is not connected${Si(e.err)}`)}async function da(e){let t=await e(null);return!t.ok&&t.reason===`conflict`&&t.current&&(t=await e(t.current)),t}async function fa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);return await ua(n),n.session.fetch(t)}async function pa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let r=n.fileTags.get(t)??await U(n.keys.tagKey,t),i=await $i(n,r,async()=>{let i=await n.session.fetch(t);if(!i)return{ok:!1,reason:`not found in remote`};let a;try{a=x(await oi(i.content))}catch{return{ok:!1,reason:`remote payload is not gzipped UTF-8`}}let o=ii(a);return o.recognized?(await Yi(n,t,i.content),ai(t,o.count,o.source),n.disposed||(n.fileTags.set(t,r),$(n,r,i,!0,await l(i.content)),Z(e,n)),{ok:!0}):{ok:!1,reason:`remote payload is not a recognized report format`}});return i.ok&&await ni(t,e),i}async function ma(e,t,n){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.fileTags.get(t)??await U(r.keys.tagKey,t);return await $i(r,i,async()=>{let e=await da(e=>r.session.put({fileName:t,content:n,prev:e}));if(e.ok)try{await ha(r,t,i,e.meta,n)}catch{}return e})}async function ha(e,t,n,r,i){let a=await l(i);e.disposed||(e.fileTags.set(t,n),$(e,n,r,!0,a),Z(e.workspaceId,e),Ui(e.baselines.get(n),e.remoteMeta.get(n))&&ca(e,n).catch(()=>{}))}async function ga(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.fileTags.has(t)||n.fileTags.set(t,await U(n.keys.tagKey,t));let r=n.fileTags.get(t);return await $i(n,r,async()=>{let e=await da(e=>n.session.delete(t,e));return e.ok&&(n.remoteTags.delete(r),n.remoteNameByTag.delete(r),n.remoteMeta.delete(r),n.baselines.delete(r),Q()),e})}finally{n&&Di(e)}}async function _a(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await li(t),i=(await si()).find(e=>e.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await da(e=>n.session.putBundle({integrity:t,name:i,content:r,prev:e}))}async function va(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:`not-found`};if(await _(r.content)!==t)return{ok:!1,reason:`integrity-mismatch`};let i=wi(r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`);await di(i,r.content);for(let n of xi)try{n(e,t,i)}catch{}return{ok:!0,integrity:t,name:i}}async function ya(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.bundleTags.has(t)||n.bundleTags.set(t,await st(n.keys.tagKey,t));let r=n.bundleTags.get(t),i=await da(e=>n.session.deleteBundle(t,e));return i.ok&&(n.remoteTags.delete(r),n.remoteBundleByTag.delete(r),Q()),i}finally{n&&Di(e)}}async function ba(e,{onList:t,onItem:n}={}){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.keys.tagKey,a=new Set,o=r.session.onDeleted(e=>{a.add(e.resourceTag)});try{let o=await xa(r,e),s=await Pa(),c=await Fa(),l=new Map;for(let e of s)l.set(await U(i,e),e);let u=new Map;for(let e of c)u.set(await st(i,e.integrity),e.integrity);let d=o.map(e=>{let t=l.get(e.resourceTag),n=u.get(e.resourceTag);return{resourceTag:e.resourceTag,kind:Aa(r,e.resourceTag,t,n),label:ja(r,e.resourceTag,t,n),contentLength:e.contentLength,reportName:t,bundleIntegrity:n,identifier:t??n,status:`checking`}});if(typeof t==`function`)try{t(d.map(Ma))}catch{}let f={good:0,updated:0,uploaded:0,differs:0,reuploaded:0,failed:0,"check-failed":0,missing:0};for(let t of d)if(t.status=await Ca(r,e,t,a),f[t.status]+=1,typeof n==`function`)try{n(Ma(t))}catch{}return{items:d.map(Ma),counts:f}}finally{o()}}async function xa(e,t){try{let e=$r.ensureSubscription(t);if(e){let t=await Na(e.resources,1e4);if(Array.isArray(t))return Sa(t)}}catch(e){console.warn(`objstore-recovery: fresh DB listing for ${t} failed; using cached inventory:`,e)}try{return(await e.session.list()).map(e=>({resourceTag:e.resourceTag,contentLength:e.contentLength}))}catch{return[]}}function Sa(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 Ca(e,t,n,r){let i;try{i=await e.session.fetchByTag(n.resourceTag)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}return i?i.kind===`report`?(n.kind=`report`,n.label=i.fileName,n.identifier=i.fileName,await wa(e,t,n,i,r)):(n.kind=`bundle`,n.label=i.name??n.label,n.bundleIntegrity=i.integrity,n.identifier=i.integrity,`good`):r.has(n.resourceTag)?`missing`:n.reportName===void 0?n.bundleIntegrity===void 0?`missing`:await ka(t,n,r):await Oa(t,n,r)}async function wa(e,t,n,r,i){let a=ti().find(e=>e.id===t);if(!a||!Array.isArray(a.reports)||!a.reports.includes(r.fileName))return`good`;let o=n.resourceTag,s=()=>!e.disposed&&!i.has(o);return await $i(e,o,async()=>{let i=r;if(Ta(e,o,i)){let t;try{t=await e.session.fetchByTag(o)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}if(!t||!s())return`missing`;if(t.kind!==`report`)return`good`;i=t}let{same:a,hash:c}=await ta(i.fileName,i.content);if(!s())return`missing`;let l=e.baselines.get(o);if(a)return(!Gi(l,i)||l.hash!==c)&&($(e,o,i,!0,c),Z(t,e)),`good`;if(a===!1&&Gi(l,i)){let t=await Ea(e,o,i.fileName,i,s);return n.detail=t.detail,t.status}if(a===null||Ui(l,i)&&!qi(l,c))try{return await na(e,o,i,s)?`updated`:`missing`}catch(e){return n.detail=`updating your copy failed: ${e?.message??String(e)}`,console.warn(`objstore-recovery: updating the local copy of "${i.fileName}" failed:`,e),`failed`}return $(e,o,i,!1),Z(t,e),n.compared={version:i.version,incarnation:i.incarnation},`differs`})}function Ta(e,t,n){return[e.baselines.get(t),e.remoteMeta.get(t)].some(e=>e&&e.incarnation===n.incarnation&&e.version>n.version)}async function Ea(e,t,n,r,i){try{let a=await ui(n);if(!i())return{status:`missing`};let o=await e.session.put({fileName:n,content:a,prev:{version:r.version,incarnation:r.incarnation}});return o.ok?($(e,t,o.meta,!0,await l(a)),Z(e.workspaceId,e),{status:`uploaded`}):{status:`failed`,detail:o.reason===`conflict`?`the cloud copy changed since it was compared — re-check again`:`upload rejected: ${o.reason??`unknown`}`}}catch(e){return console.warn(`objstore-recovery: uploading the local copy of "${n}" failed:`,e),{status:`failed`,detail:`upload error: ${e?.message??String(e)}`}}}async function Da(e,t,n,r){if(n!==`cloud`&&n!==`local`)throw TypeError(`resolveReportDifference: keep must be 'cloud' or 'local', got ${String(n)}`);if(n===`local`&&(!r||!Number.isSafeInteger(r.version)||typeof r.incarnation!=`string`))throw TypeError(`resolveReportDifference: keeping the local copy needs the compared cloud state ({ version, incarnation })`);let i=X.get(e);if(!i)throw Error(`Workspace ${e} is not open`);if(await ua(i),!i.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let a=i.fileTags.get(t)??await U(i.keys.tagKey,t),o=()=>!i.disposed;return await $i(i,a,async()=>{if(n===`local`)return await Ea(i,a,t,r,o);try{let e=await i.session.fetch(t);if(!e)return{status:`missing`,detail:`the report is no longer in the cloud`};let n={fileName:t,content:e.content,version:e.version,incarnation:e.incarnation};return{status:await ra(i,a,n,o,{keepLocalChanges:!1})?`updated`:`good`}}catch(e){return console.warn(`objstore-recovery: replacing the local copy of "${t}" with the cloud copy failed:`,e),{status:`failed`,detail:`updating your copy failed: ${e?.message??String(e)}`}}})}async function Oa(e,t,n){let r;try{r=await ui(t.reportName)}catch{return`missing`}if(t.contentLength==null||lt(t.reportName,r.length)!==t.contentLength||n.has(t.resourceTag))return`missing`;try{let n=await ma(e,t.reportName,r);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: re-upload of "${t.reportName}" failed:`,e),`failed`}}async function ka(e,t,n){try{await li(t.bundleIntegrity)}catch{return`missing`}if(n.has(t.resourceTag))return`missing`;try{let n=await _a(e,t.bundleIntegrity);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: bundle re-upload of "${t.bundleIntegrity}" failed:`,e),`failed`}}function Aa(e,t,n,r){return n===void 0?r!==void 0||e.remoteBundleByTag.has(t)?`bundle`:e.remoteNameByTag.has(t)?`report`:`unknown`:`report`}function ja(e,t,n,r){if(n!==void 0)return n;if(r!==void 0)return e.remoteBundleNameByIntegrity.get(r)??r;let i=e.remoteNameByTag.get(t);if(i!==void 0)return i;let a=e.remoteBundleByTag.get(t);return a===void 0?`${t.slice(0,10)}\u2026`:e.remoteBundleNameByIntegrity.get(a)??a}function Ma(e){let t={resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier,detail:e.detail};return e.compared&&(t.compared=e.compared),t}function Na(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let i=new Promise((e,r)=>{n=setTimeout(()=>r(Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,i]).finally(()=>clearTimeout(n))}async function Pa(){try{return await ci()}catch(e){return console.warn(`objstore-recovery: listFiles failed; treating as no local reports:`,e),[]}}async function Fa(){try{return await si()}catch(e){return console.warn(`objstore-recovery: listBundles failed; treating as no local bundles:`,e),[]}}export{Di as closeWorkspace,ya as deleteBundleFromRemote,ga as deleteFromRemote,Li as differingReports,Bi as discoverRemoteBundleIntegrities,zi as discoverRemoteFileNames,pa as downloadFileFromRemote,va as fetchBundleFromRemote,fa as fetchFile,Ii as holdLocalChangeChecks,ht as installSyncHost,ji as isBundleInRemote,ki as isInRemote,Pi as onAutoDownloaded,Fi as onBundleAutoDownloaded,Ni as onChange,Ei as openWorkspace,Oi as openWorkspaceIds,_a as putBundleToRemote,ma as putFile,ba as recheckRemoteStorage,Vi as remoteBundleName,Ri as remoteCount,Da as resolveReportDifference,Xr as setAuthenticationResolver,Yr as setHydrationConflictResolver,Jr as setRedraw,$r as triageSync};
|
|
12
12
|
/*! Bundled license information:
|
|
13
13
|
|
|
14
14
|
@noble/ciphers/utils.js:
|