@preventive/triage 1.0.0-alpha.37 → 1.0.0-alpha.38

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