@preventive/triage 1.0.0-alpha.44 → 1.0.0-alpha.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/linked-findings.js +3 -0
- package/common/bundle-metadata.d.ts +1 -0
- package/common/bundle-metadata.js +1 -1
- package/common/bundle-sources.js +25 -2
- package/common/default-scan-models.ts +1 -1
- package/common/dependency-reviews.d.ts +0 -5
- package/common/dependency-reviews.js +0 -17
- package/common/line-diff.js +5 -4
- package/common/managed/agent-tasks.ts +292 -0
- package/common/managed/github-agents.ts +92 -0
- package/common/managed/github-logins.ts +49 -0
- package/common/managed/roles.ts +7 -0
- package/common/managed/routes.js +88 -7
- package/common/managed/team-app.d.ts +5 -2
- package/common/managed/team-app.js +2 -2
- package/common/server-info.ts +3 -0
- package/common/workspace-app.js +6 -3
- package/out/brotli-fallback.js +3 -3
- package/out/chunk-2XUEZHIP.js +18 -18
- package/out/chunk-2ZDZWLFY.js +1 -0
- package/out/chunk-3PS4KWD2.js +10 -0
- package/out/chunk-4HI2MSAV.js +17 -0
- package/out/chunk-4UFAMJAX.js +1 -0
- package/out/chunk-7C7DWL7I.js +1 -0
- package/out/chunk-7XRR4OFU.js +1 -0
- package/out/chunk-BC2UCLFJ.js +1 -0
- package/out/chunk-BOIXMUU5.js +3 -0
- package/out/chunk-C4Z6ZBXV.js +6 -6
- package/out/chunk-CC4OM6TZ.js +3 -0
- package/out/chunk-G24A42V6.js +2 -0
- package/out/chunk-GDPCLSOS.js +2 -0
- package/out/chunk-GO7FT4OD.js +1 -0
- package/out/chunk-I2MDGSQX.js +3 -0
- package/out/chunk-IYPY47MC.js +1 -0
- package/out/chunk-IZ7POWI3.js +18 -0
- package/out/chunk-JCIIBLKR.js +1 -1
- package/out/chunk-JKGQ3O7O.js +6 -0
- package/out/chunk-LE5ZWLG4.js +235 -0
- package/out/chunk-MSION3G4.js +36 -0
- package/out/chunk-NRPC74AM.js +1 -1
- package/out/chunk-OKRLLE5I.js +17 -0
- package/out/chunk-OOJM4CTU.js +1 -1
- package/out/chunk-PNHBZGDD.js +1 -1
- package/out/chunk-PXK7EU4V.js +1 -0
- package/out/chunk-QB4CBOX2.js +1 -0
- package/out/chunk-R3NZFXVR.js +1 -0
- package/out/chunk-R5O6FAW4.js +1 -1
- package/out/chunk-S6GIXWQW.js +52 -0
- package/out/chunk-SXV2T5C4.js +80 -0
- package/out/chunk-TUII34K2.js +1 -1
- package/out/chunk-V3KWNNMY.js +1 -0
- package/out/chunk-VFWMQ3LG.js +2 -0
- package/out/chunk-VH4XMZIW.js +2 -0
- package/out/chunk-WFYLMF6Z.js +10 -0
- package/out/chunk-WQ74ZBZF.js +7 -0
- package/out/client-managed-import.js +3 -3
- package/out/client-managed.js +31 -35
- package/out/client-sync.js +11 -11
- package/out/compare.js +35 -0
- package/out/dialogs.js +51 -0
- package/out/github-issue-authorized.html +1 -1
- package/out/github-issue-authorized.js +1 -1
- package/out/graph.js +17 -17
- package/out/index.html +30 -34
- package/out/prism.js +14 -14
- package/out/scan.js +2 -0
- package/out/terminal.js +294 -293
- package/out/view.css +1 -1
- package/out/view.js +16 -107
- package/package.json +53 -6
- package/risk/actions/findings.js +161 -0
- package/risk/actions/resolve.js +219 -0
- package/risk/actions/scripts/commands.js +182 -0
- package/risk/actions/scripts/grade.js +113 -0
- package/risk/actions/scripts/packages.js +123 -0
- package/risk/actions/scripts/shell.js +169 -0
- package/risk/actions/uses.js +76 -0
- package/risk/actions/workflow.js +110 -0
- package/risk/files/hosts.js +6 -6
- package/risk/files/readability.js +23 -17
- package/risk/files/runs-code.js +18 -6
- package/risk/files/script.js +7 -3
- package/risk/files/stamps.js +8 -7
- package/risk/index.d.ts +71 -1
- package/risk/index.js +6 -2
- package/risk/npm/assess.js +1 -1
- package/risk/npm/compare.js +34 -10
- package/risk/npm/files.js +413 -2
- package/risk/npm/tarball.js +56 -73
- package/server-e2e/app.ts +5 -4
- package/server-e2e/http.ts +5 -2
- package/server-managed/agent-merges.ts +198 -0
- package/server-managed/app-agents.ts +30 -0
- package/server-managed/avatar-store.ts +1 -0
- package/server-managed/bundle-cache.ts +7 -1
- package/server-managed/combined.ts +3 -2
- package/server-managed/commit-coauthors.ts +83 -0
- package/server-managed/commit-lockfiles.ts +72 -0
- package/server-managed/config.ts +6 -0
- package/server-managed/db-methods.ts +66 -19
- package/server-managed/db-neon.ts +89 -21
- package/server-managed/db-schema.ts +13 -2
- package/server-managed/db.ts +9 -1
- package/server-managed/dependabot-access.ts +60 -0
- package/server-managed/dependabot-alerts.ts +185 -0
- package/server-managed/dependency-review-comments.ts +97 -0
- package/server-managed/dependency-reviews.ts +78 -18
- package/server-managed/github-accounts.ts +33 -0
- package/server-managed/github-actions.ts +71 -0
- package/server-managed/github-app.ts +33 -13
- package/server-managed/github-errors.ts +2 -0
- package/server-managed/github-issue-links.ts +11 -5
- package/server-managed/github-link-oauth.ts +69 -0
- package/server-managed/github-links.ts +204 -0
- package/server-managed/github-oauth.ts +5 -2
- package/server-managed/github-pulls.ts +2 -2
- package/server-managed/github-requests.ts +39 -0
- package/server-managed/github-users.ts +30 -0
- package/server-managed/http-response.ts +10 -2
- package/server-managed/http.ts +1251 -97
- package/server-managed/index.ts +13 -8
- package/server-managed/kept-briefly.ts +37 -0
- package/server-managed/locked-packages.ts +37 -16
- package/server-managed/lockfile-scope.ts +49 -0
- package/server-managed/npm-delta-worker.js +23 -0
- package/server-managed/npm-delta.ts +178 -0
- package/server-managed/npm-insights.ts +20 -11
- package/server-managed/npm-kept.ts +83 -6
- package/server-managed/npm-loads.ts +114 -37
- package/server-managed/npm-packages.ts +110 -64
- package/server-managed/npm-risk.ts +4 -1
- package/server-managed/pretty-print.ts +67 -23
- package/server-managed/pull-comment-reviews.ts +161 -0
- package/server-managed/pull-dependencies.ts +300 -0
- package/server-managed/pull-dependency-reviews.ts +318 -0
- package/server-managed/pull-reviews.ts +205 -0
- package/server-managed/queue.ts +16 -0
- package/server-managed/release-commits.ts +84 -0
- package/server-managed/rename-diff.ts +22 -13
- package/server-managed/report-sources.ts +1 -1
- package/server-managed/report-store.ts +42 -9
- package/server-managed/repository-actions.ts +218 -0
- package/server-managed/repository-agents.ts +220 -0
- package/server-managed/repository-browser.ts +166 -37
- package/server-managed/repository-changes.ts +284 -0
- package/server-managed/repository-code.ts +52 -0
- package/server-managed/repository-dependency-reviews.ts +157 -0
- package/server-managed/repository-history.ts +461 -0
- package/server-managed/repository-issues.ts +181 -0
- package/server-managed/repository-pulse.ts +439 -0
- package/server-managed/repository-risk-audit.ts +13 -0
- package/server-managed/repository-risk-read.ts +170 -0
- package/server-managed/repository-risk.ts +133 -118
- package/server-managed/reviewed-dependencies.ts +149 -0
- package/server-managed/session.ts +27 -9
- package/server-managed/sql.ts +6 -3
- package/server-managed/storage-stores.ts +5 -0
- package/server-managed/storage.ts +4 -2
- package/server-managed/team-app.ts +19 -3
- package/server-managed/team-reports.ts +24 -12
- package/server-managed/upstream-cache.ts +12 -0
- package/server-managed/workspace-shares.ts +4 -1
- package/server.ts +25 -5
- package/out/chunk-2ABLKCOY.js +0 -46
- package/out/chunk-2KBF5TZ7.js +0 -2
- package/out/chunk-35VE6CDH.js +0 -2
- package/out/chunk-3BZ7JERB.js +0 -1
- package/out/chunk-4XCDFGDP.js +0 -10
- package/out/chunk-5LSXOLUS.js +0 -1
- package/out/chunk-5RCM2J63.js +0 -1
- package/out/chunk-7B6HB4D7.js +0 -1
- package/out/chunk-AJ4GTATZ.js +0 -3
- package/out/chunk-CH4UN6WK.js +0 -225
- package/out/chunk-CMQA4DM6.js +0 -1
- package/out/chunk-CVVJAXVY.js +0 -2
- package/out/chunk-DIJJNTRH.js +0 -10
- package/out/chunk-EDKLBQQN.js +0 -17
- package/out/chunk-F47DXCEV.js +0 -33
- package/out/chunk-FK3DZEKL.js +0 -1
- package/out/chunk-G6AJWENO.js +0 -1
- package/out/chunk-GJ4IUCNS.js +0 -1
- package/out/chunk-GNXOKIGP.js +0 -80
- package/out/chunk-GZ4MS3TE.js +0 -13
- package/out/chunk-GZWM7UQM.js +0 -2
- package/out/chunk-IU3CCINR.js +0 -3
- package/out/chunk-K3X5EJBQ.js +0 -2
- package/out/chunk-KEX2ATEW.js +0 -2
- package/out/chunk-KYCNJVB7.js +0 -1
- package/out/chunk-LPCTJYNA.js +0 -7
- package/out/chunk-O4RJY5TP.js +0 -2
- package/out/chunk-OD4LPN3H.js +0 -1
- package/out/chunk-QWDWTBM7.js +0 -1
- package/out/chunk-QYWKC557.js +0 -1
- package/out/chunk-R75XOKUP.js +0 -1
- package/out/chunk-SWTLADW5.js +0 -1
- package/out/chunk-T7OKH4VW.js +0 -1
- package/out/chunk-TZ5KB2Y5.js +0 -10
- package/out/chunk-UNTRGE26.js +0 -2
- package/out/chunk-UTR2LVME.js +0 -2
- package/out/chunk-UYAXVRVL.js +0 -1
- package/out/chunk-V3ME6FI5.js +0 -2
- package/out/chunk-V5O7M2YT.js +0 -1
- package/out/chunk-VIHGO77Y.js +0 -1
- package/out/chunk-W4J3MGLB.js +0 -1
- package/out/chunk-WGG7KQUH.js +0 -1
- package/out/chunk-XYFXXB2G.js +0 -10
- package/out/chunk-ZESLQCTF.js +0 -6
package/out/client-sync.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
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-LPCTJYNA.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
|
|
3
|
-
`))}async function
|
|
4
|
-
`,
|
|
5
|
-
`,
|
|
6
|
-
${
|
|
7
|
-
${r}`)
|
|
1
|
+
import{a as e,b as t,c as n,d as r,e as i,f as a,g as o,p as s,u as c,v as l}from"./chunk-WQ74ZBZF.js";import{a as u,b as d,d as f,e as p,f as m,g as h,h as g,i as _}from"./chunk-7C7DWL7I.js";import{a as v,b as y}from"./chunk-PNHBZGDD.js";import{a as b,c as x}from"./chunk-TUII34K2.js";import"./chunk-OOJM4CTU.js";function S(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}var C=e=>e?`"${e}" `:``;function w(e,t=``){if(typeof e!=`boolean`)throw TypeError(C(t)+`expected boolean, got type=`+typeof e);return e}function T(e,t=``){if(typeof e!=`number`)throw TypeError(C(t)+`expected number, got `+typeof e);if(!Number.isSafeInteger(e)||e<0)throw RangeError(C(t)+`expected integer >= 0, got `+e);return e}function E(e,t,n=``){if(S(e)&&(t===void 0||e.length===t))return e;t!==void 0&&T(t,`length`);let r=S(e),i=t===void 0?``:` of length ${t}`,a=r?`length=${e.length}`:`type=${typeof e}`,o=C(n)+`expected Uint8Array`+i+`, got `+a;throw r?RangeError(o):TypeError(o)}var D=(e,t)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(t===`object`?`expected valid options object`:`"${t}" expected object, got type=${typeof e}`)};function O(e,t=!0){if(e.destroyed)throw Error(`hash was destroyed`);if(t&&e.finished)throw Error(`digest() was already called`)}function k(e,t){E(e,void 0,`output`);let n=t.outputLen;if(!(e.length>=n))throw RangeError(`"output" expected length >= `+n)}function A(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function j(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function M(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var N=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function P(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function F(e){for(let t=0;t<e.length;t++)e[t]=P(e[t]);return e}var I=N?e=>e:F;function L(e,t){return!e.byteLength||!t.byteLength?!1:e.buffer===t.buffer&&e.byteOffset<t.byteOffset+t.byteLength&&t.byteOffset<e.byteOffset+e.byteLength}function R(e,t){if(L(e,t)&&e.byteOffset<t.byteOffset)throw Error(`complex overlap of input and output is not supported`)}function z(e,t){return D(e,`defaults`),D(t,`opts`),Object.assign(e,t)}function ee(e,t){if(e=E(e),t=E(t),e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function te(e,t,n){let r=t,i=n||(()=>[]),a=(e,t)=>r(t,...i(e)).update(e).digest(),o=r(new Uint8Array(e),...i(new Uint8Array));return a.outputLen=o.outputLen,a.blockLen=o.blockLen,a.create=(e,...t)=>r(e,...t),a}var ne=(e,t)=>{function n(n,...r){if(E(n,void 0,`key`),e.nonceLength!==void 0){let t=r[0];E(t,e.varSizeNonce?void 0:e.nonceLength,`nonce`)}let i=e.tagLength,a=e.nonceLength===void 0?0:1;if(!e.withAAD){for(let e=a;e<r.length;e++)if(S(r[e]))throw Error(`AAD not supported`)}e.withAAD&&r[a]!==void 0&&E(r[a],void 0,`AAD`);let o=t(n,...r),s=(e,t)=>{if(t!==void 0){if(e!==2)throw Error(`cipher output not supported`);E(t,void 0,`output`)}},c=!1;return{encrypt(e,t){if(c)throw Error(`cannot encrypt() twice with same key + nonce`);return c=!0,E(e,void 0,`data`),s(o.encrypt.length,t),o.encrypt(e,t)},decrypt(e,t){if(E(e,void 0,`data`),i&&e.length<i)throw Error(`"ciphertext" expected length >= tagLength=`+i);return s(o.decrypt.length,t),o.decrypt(e,t)}}}return Object.assign(n,e),n};function B(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(E(t,e,`output`),n&&!ie(t))throw Error(`invalid output, must be aligned`);return t}function re(e,t,n){T(e),T(t),w(n);let r=new Uint8Array(16),i=M(r);return i.setBigUint64(0,BigInt(t),n),i.setBigUint64(8,BigInt(e),n),r}function ie(e){return e.byteOffset%4==0}function ae(e){return Uint8Array.from(E(e))}var oe=e=>Uint8Array.from(e.split(``),e=>e.charCodeAt(0)),se=I(A(oe(`expand 16-byte k`))),ce=I(A(oe(`expand 32-byte k`)));function V(e,t){return e<<t|e>>>32-t}var le=64,ue=16,de=2**32-1,fe=Uint32Array.of();function pe(e,t,n,r,i,a,o,s){let c=i.length,l=new Uint8Array(le),u=A(l),d=N&&ie(i)&&ie(a),f=d?A(i):fe,p=d?A(a):fe;if(!N){for(let d=0;d<c;o++){if(e(t,n,r,u,o,s),I(u),o>=de)throw Error(`arx: counter overflow`);let f=Math.min(le,c-d);for(let e=0,t;e<f;e++)t=d+e,a[t]=i[t]^l[e];d+=f}return}for(let m=0;m<c;o++){if(e(t,n,r,u,o,s),o>=de)throw Error(`arx: counter overflow`);let h=Math.min(le,c-m);if(d&&h===le){let e=m/4;if(m%4!=0)throw Error(`arx: invalid block position`);for(let t=0,n;t<ue;t++)n=e+t,p[n]=f[n]^u[t];m+=le;continue}for(let e=0,t;e<h;e++)t=m+e,a[t]=i[t]^l[e];m+=h}}function me(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:i,counterRight:a,rounds:o}=z({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!=`function`)throw Error(`core must be a function`);return T(i),T(o),w(a),w(n),(t,s,c,l,u=0)=>{E(t,void 0,`key`),E(s,void 0,`nonce`),E(c,void 0,`data`);let d=c.length,f=l!==void 0;if(l=B(d,l,!1),f&&R(c,l),T(u),u<0||u>=de)throw Error(`arx: counter overflow`);let p=[],m=t.length,h,g;if(m===32)p.push(h=ae(t)),g=ce;else if(m===16&&n)h=new Uint8Array(32),h.set(t),h.set(t,16),g=se,p.push(h);else throw E(t,32,`arx key`),Error(`invalid key size`);(!N||!ie(s))&&p.push(s=ae(s));let _=A(h);if(r){if(s.length!==24)throw Error(`arx: extended nonce must be 24 bytes`);let e=s.subarray(0,16);if(N)r(g,_,A(e),_);else{let t=I(Uint32Array.from(g));r(t,_,A(e),_),j(t),I(_)}s=s.subarray(16)}else N||I(_);let v=16-i;if(v!==s.length)throw Error(`arx: nonce must be ${v} or 16 bytes`);if(v!==12){let e=new Uint8Array(12);e.set(s,a?0:12-s.length),s=e,p.push(s)}let y=I(A(s));try{return pe(e,g,_,y,c,l,u,o),l}finally{j(...p)}}}function H(e,t){return e[t++]&255|(e[t++]&255)<<8}var he=class{blockLen=16;outputLen=16;buffer=new Uint8Array(16);r=new Uint16Array(10);h=new Uint16Array(10);pad=new Uint16Array(8);pos=0;finished=!1;destroyed=!1;constructor(e){e=ae(E(e,32,`key`));let t=H(e,0),n=H(e,2),r=H(e,4),i=H(e,6),a=H(e,8),o=H(e,10),s=H(e,12),c=H(e,14);this.r[0]=t&8191,this.r[1]=(t>>>13|n<<3)&8191,this.r[2]=(n>>>10|r<<6)&7939,this.r[3]=(r>>>7|i<<9)&8191,this.r[4]=(i>>>4|a<<12)&255,this.r[5]=a>>>1&8190,this.r[6]=(a>>>14|o<<2)&8191,this.r[7]=(o>>>11|s<<5)&8065,this.r[8]=(s>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=H(e,16+2*t)}process(e,t,n=!1){let r=n?0:2048,{h:i,r:a}=this,o=a[0],s=a[1],c=a[2],l=a[3],u=a[4],d=a[5],f=a[6],p=a[7],m=a[8],h=a[9],g=H(e,t+0),_=H(e,t+2),v=H(e,t+4),y=H(e,t+6),b=H(e,t+8),x=H(e,t+10),S=H(e,t+12),C=H(e,t+14),w=i[0]+(g&8191),T=i[1]+((g>>>13|_<<3)&8191),E=i[2]+((_>>>10|v<<6)&8191),D=i[3]+((v>>>7|y<<9)&8191),O=i[4]+((y>>>4|b<<12)&8191),k=i[5]+(b>>>1&8191),A=i[6]+((b>>>14|x<<2)&8191),j=i[7]+((x>>>11|S<<5)&8191),M=i[8]+((S>>>8|C<<8)&8191),N=i[9]+(C>>>5|r),P=0,F=P+w*o+5*h*T+5*m*E+5*p*D+5*f*O;P=F>>>13,F&=8191,F+=5*d*k+5*u*A+5*l*j+5*c*M+5*s*N,P+=F>>>13,F&=8191;let I=P+w*s+T*o+5*h*E+5*m*D+5*p*O;P=I>>>13,I&=8191,I+=5*f*k+5*d*A+5*u*j+5*l*M+5*c*N,P+=I>>>13,I&=8191;let L=P+w*c+T*s+E*o+5*h*D+5*m*O;P=L>>>13,L&=8191,L+=5*p*k+5*f*A+5*d*j+5*u*M+5*l*N,P+=L>>>13,L&=8191;let R=P+w*l+T*c+E*s+D*o+5*h*O;P=R>>>13,R&=8191,R+=5*m*k+5*p*A+5*f*j+5*d*M+5*u*N,P+=R>>>13,R&=8191;let z=P+w*u+T*l+E*c+D*s+O*o;P=z>>>13,z&=8191,z+=5*h*k+5*m*A+5*p*j+5*f*M+5*d*N,P+=z>>>13,z&=8191;let ee=P+w*d+T*u+E*l+D*c+O*s;P=ee>>>13,ee&=8191,ee+=k*o+5*h*A+5*m*j+5*p*M+5*f*N,P+=ee>>>13,ee&=8191;let te=P+w*f+T*d+E*u+D*l+O*c;P=te>>>13,te&=8191,te+=k*s+A*o+5*h*j+5*m*M+5*p*N,P+=te>>>13,te&=8191;let ne=P+w*p+T*f+E*d+D*u+O*l;P=ne>>>13,ne&=8191,ne+=k*c+A*s+j*o+5*h*M+5*m*N,P+=ne>>>13,ne&=8191;let B=P+w*m+T*p+E*f+D*d+O*u;P=B>>>13,B&=8191,B+=k*l+A*c+j*s+M*o+5*h*N,P+=B>>>13,B&=8191;let re=P+w*h+T*m+E*p+D*f+O*d;P=re>>>13,re&=8191,re+=k*u+A*l+j*c+M*s+N*o,P+=re>>>13,re&=8191,P=(P<<2)+P|0,P=P+F|0,F=P&8191,P>>>=13,I+=P,i[0]=F,i[1]=I,i[2]=L,i[3]=R,i[4]=z,i[5]=ee,i[6]=te,i[7]=ne,i[8]=B,i[9]=re}finalize(){let{h:e,pad:t}=this,n=new Uint16Array(10),r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=r*5,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let i=(r^1)-1;for(let e=0;e<10;e++)n[e]&=i;i=~i;for(let t=0;t<10;t++)e[t]=e[t]&i|n[t];e[0]=(e[0]|e[1]<<13)&65535,e[1]=(e[1]>>>3|e[2]<<10)&65535,e[2]=(e[2]>>>6|e[3]<<7)&65535,e[3]=(e[3]>>>9|e[4]<<4)&65535,e[4]=(e[4]>>>12|e[5]<<1|e[6]<<14)&65535,e[5]=(e[6]>>>2|e[7]<<11)&65535,e[6]=(e[7]>>>5|e[8]<<8)&65535,e[7]=(e[8]>>>8|e[9]<<5)&65535;let a=e[0]+t[0];e[0]=a&65535;for(let n=1;n<8;n++)a=(e[n]+t[n]|0)+(a>>>16)|0,e[n]=a&65535;j(n)}update(e){O(this),E(e),e=ae(e);let{buffer:t,blockLen:n}=this,r=e.length;for(let i=0;i<r;){let a=Math.min(n-this.pos,r-i);if(a===n){for(;n<=r-i;i+=n)this.process(e,i);continue}t.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===n&&(this.process(t,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,j(this.h,this.r,this.buffer,this.pad)}digestInto(e){O(this),k(e,this),this.finished=!0;let{buffer:t,h:n}=this,{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let i=0;for(let t=0;t<8;t++)e[i++]=n[t]>>>0,e[i++]=n[t]>>>8}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}},ge=te(32,e=>new he(e));function _e(e,t,n,r,i,a=20){let o=e[0],s=e[1],c=e[2],l=e[3],u=t[0],d=t[1],f=t[2],p=t[3],m=t[4],h=t[5],g=t[6],_=t[7],v=i,y=n[0],b=n[1],x=n[2],S=o,C=s,w=c,T=l,E=u,D=d,O=f,k=p,A=m,j=h,M=g,N=_,P=v,F=y,I=b,L=x;for(let e=0;e<a;e+=2)S=S+E|0,P=V(P^S,16),A=A+P|0,E=V(E^A,12),S=S+E|0,P=V(P^S,8),A=A+P|0,E=V(E^A,7),C=C+D|0,F=V(F^C,16),j=j+F|0,D=V(D^j,12),C=C+D|0,F=V(F^C,8),j=j+F|0,D=V(D^j,7),w=w+O|0,I=V(I^w,16),M=M+I|0,O=V(O^M,12),w=w+O|0,I=V(I^w,8),M=M+I|0,O=V(O^M,7),T=T+k|0,L=V(L^T,16),N=N+L|0,k=V(k^N,12),T=T+k|0,L=V(L^T,8),N=N+L|0,k=V(k^N,7),S=S+D|0,L=V(L^S,16),M=M+L|0,D=V(D^M,12),S=S+D|0,L=V(L^S,8),M=M+L|0,D=V(D^M,7),C=C+O|0,P=V(P^C,16),N=N+P|0,O=V(O^N,12),C=C+O|0,P=V(P^C,8),N=N+P|0,O=V(O^N,7),w=w+k|0,F=V(F^w,16),A=A+F|0,k=V(k^A,12),w=w+k|0,F=V(F^w,8),A=A+F|0,k=V(k^A,7),T=T+E|0,I=V(I^T,16),j=j+I|0,E=V(E^j,12),T=T+E|0,I=V(I^T,8),j=j+I|0,E=V(E^j,7);let R=0;r[R++]=o+S|0,r[R++]=s+C|0,r[R++]=c+w|0,r[R++]=l+T|0,r[R++]=u+E|0,r[R++]=d+D|0,r[R++]=f+O|0,r[R++]=p+k|0,r[R++]=m+A|0,r[R++]=h+j|0,r[R++]=g+M|0,r[R++]=_+N|0,r[R++]=v+P|0,r[R++]=y+F|0,r[R++]=b+I|0,r[R++]=x+L|0}var ve=me(_e,{counterRight:!1,counterLength:4,allowShortKeys:!1}),ye=new Uint8Array(16),be=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(ye.subarray(n))},xe=new Uint8Array(32);function Se(e,t,n,r,i){i!==void 0&&E(i,void 0,`AAD`);let a=e(t,n,xe),o=re(r.length,i?i.length:0,!0),s=ge.create(a);i&&be(s,i),be(s,r),s.update(o);let c=s.digest();return j(a,o),c}var Ce=ne({blockSize:64,nonceLength:12,tagLength:16,withAAD:!0},(e=>(t,n,r)=>({encrypt(i,a){let o=i.length;a=B(o+16,a,!1),a.set(i);let s=a.subarray(0,-16);e(t,n,s,s,1);let c=Se(e,t,n,s,r);return a.set(c,o),j(c),a},decrypt(i,a){a=B(i.length-16,a,!1);let o=i.subarray(0,-16),s=i.subarray(-16),c=Se(e,t,n,o,r);if(!ee(s,c))throw j(c),Error(`invalid tag`);return a.set(i.subarray(0,-16)),e(t,n,a,a,1),j(c),a}}))(ve)),we=`deepview-triage-sync.v1.content-key`,Te=`deepview-triage-sync.v1.sign-key`,Ee=`deepview-triage-sync.v1.save`,De=`deepview-triage-sync.v1.subscribe`,Oe=12,ke=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),Ae=null;function je(){return Ae||(Ae=(async()=>{try{return await crypto.subtle.importKey(`raw`,new Uint8Array(32),{name:`ChaCha20-Poly1305`},!1,[`encrypt`,`decrypt`]),!0}catch{return!1}})(),Ae)}async function Me(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await crypto.subtle.importKey(`raw`,n,`HKDF`,!1,[`deriveBits`]),i=await crypto.subtle.deriveBits({name:`HKDF`,hash:`SHA-256`,salt:new Uint8Array,info:b(t)},r,256);return new Uint8Array(i)}async function Ne(e){return await Me(e,we)}async function Pe(e,t){let n=await Me(e,`${Te}|${t}`),r=new Uint8Array(ke.length+32);r.set(ke,0),r.set(n,ke.length);let i=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!0,[`sign`]),a=await crypto.subtle.exportKey(`jwk`,i),o=a.x;if(delete a.d,o==null)throw Error(`Ed25519 JWK export returned no public key`);let s=Uint8Array.fromBase64(o,{alphabet:`base64url`}),c=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!1,[`sign`]);return n.fill(0),r.fill(0),{privateKey:c,publicKey:s,publicKeyB64:o}}function Fe({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:i}){return b([Ee,e,t==null?``:String(t),n===!0?`1`:``,r,i].join(`
|
|
2
|
+
`))}async function Ie(e,t){let n=await crypto.subtle.sign({name:`Ed25519`},e,t);return new Uint8Array(n).toBase64({alphabet:`base64url`,omitPadding:!0})}async function Le(e,t){return await Ie(e,Fe(t))}async function Re(e){let t=Fe(e),n=await crypto.subtle.digest(`SHA-256`,t);return new Uint8Array(n).toBase64({alphabet:`base64url`,omitPadding:!0})}function ze(e,t,n){return b([De,e,t==null?``:String(t),n].join(`
|
|
3
|
+
`))}async function Be(e,t,n,r){return await Ie(e,ze(t,n,r))}async function Ve(e,t,n){try{let r=await crypto.subtle.importKey(`raw`,e,{name:`Ed25519`},!1,[`verify`]),i=Uint8Array.fromBase64(n,{alphabet:`base64url`}),a=Fe(t);return await crypto.subtle.verify({name:`Ed25519`},r,i,a)}catch{return!1}}function He(){let e=new Uint8Array(Oe);return crypto.getRandomValues(e),e}function Ue(e,t){return b(`${e}|${t==null?``:String(t)}`)}async function We(e,t,n){let r=He();if(await je()){let i=await crypto.subtle.importKey(`raw`,e,{name:`ChaCha20-Poly1305`},!1,[`encrypt`]);return{nonce:r,ciphertext:new Uint8Array(await crypto.subtle.encrypt({name:`ChaCha20-Poly1305`,iv:r,additionalData:n},i,t))}}return{nonce:r,ciphertext:Ce(e,r,n).encrypt(t)}}async function Ge(e,t,n,r){if(await je()){let i=await crypto.subtle.importKey(`raw`,e,{name:`ChaCha20-Poly1305`},!1,[`decrypt`]);return new Uint8Array(await crypto.subtle.decrypt({name:`ChaCha20-Poly1305`,iv:t,additionalData:r},i,n))}return Ce(e,t,r).decrypt(n)}var Ke=64;function qe(e,t){return e<=t?t:2**(32-Math.clz32(e-1))}async function Je(e){let t=b(JSON.stringify(e)),n=await v(t);if(n.length>1073741820)throw Error(`payload too large`);let r=qe(4+n.length,Ke),i=new Uint8Array(r);return new DataView(i.buffer,i.byteOffset,i.byteLength).setUint32(0,n.length,!1),i.set(n,4),i}var Ye=67108864;async function Xe(e){if(e.length<4)throw Error(`plaintext too short`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(0,!1);if(t+4>e.length)throw Error(`length prefix exceeds buffer`);let n=e.subarray(4,4+t),r=await y(n,{maxBytes:Ye});return JSON.parse(x(r))}async function Ze(e,t,n){let{nonce:r,ciphertext:i}=await We(e,await Je(t),n);return{nonce:r.toBase64(),ciphertext:i.toBase64()}}async function Qe(e,t,n,r){return Xe(await Ge(e,Uint8Array.fromBase64(t),Uint8Array.fromBase64(n),r))}var $e=`deepview-objstore.v1.content`,et=`deepview-objstore.v1.tag`,tt=`objstore-tag
|
|
4
|
+
`,nt=`objstore-bundle-tag
|
|
5
|
+
`,rt=12,it=16;async function at(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await ot(n,$e,32),i=await ot(n,et,32);n.fill(0);let{privateKey:a,publicKeyB64:o}=await Pe(e,t);return{signingKey:a,contentKey:r,tagKey:i,workspaceTag:o}}async function ot(e,t,n){let r=await crypto.subtle.importKey(`raw`,e,`HKDF`,!1,[`deriveBits`]),i=await crypto.subtle.deriveBits({name:`HKDF`,hash:`SHA-256`,salt:new Uint8Array,info:b(t)},r,n*8);return new Uint8Array(i)}async function U(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,b(tt+t))).toBase64({alphabet:`base64url`,omitPadding:!0})}async function st(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,b(nt+t))).toBase64({alphabet:`base64url`,omitPadding:!0})}function ct(e,t,n,r,i){let a=b(t);if(a.length>65535)throw Error(`fileName too long: ${a.length} bytes (max 65535)`);let o=new Uint8Array(2+a.length+n.length);new DataView(o.buffer).setUint16(0,a.length,!1),o.set(a,2),o.set(n,2+a.length);let s=new Uint8Array(rt);crypto.getRandomValues(s);let c=Ce(e,s,b(`${r}
|
|
6
|
+
${i}`)).encrypt(o),l=new Uint8Array(rt+c.length);return l.set(s,0),l.set(c,rt),l}function lt(e,t){return rt+2+b(e).length+t+it}function ut(e,t){let n=b(e);if(n.length>65535)throw 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 dt(e){if(e.length<2)throw Error(`bundle wrapped content truncated: ${e.length} bytes`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1);if(2+t>e.length)throw Error(`bundle wrapped nameLen ${t} overflows ${e.length}`);return{name:new TextDecoder(`utf-8`,{fatal:!0}).decode(e.subarray(2,2+t)),content:new Uint8Array(e.subarray(2+t))}}function ft(e,t,n,r){if(t.length<rt+16)throw Error(`objstore payload too short: ${t.length} bytes`);let i=t.subarray(0,rt),a=t.subarray(rt),o=Ce(e,i,b(`${n}
|
|
7
|
+
${r}`)).decrypt(a);if(o.length<2)throw Error(`objstore plaintext truncated: ${o.length} bytes`);let s=new DataView(o.buffer,o.byteOffset,o.byteLength).getUint16(0,!1);if(2+s>o.length)throw Error(`objstore plaintext nameLen ${s} overflows ${o.length}`);let c=new TextDecoder(`utf-8`,{fatal:!0}).decode(o.subarray(2,2+s)),l=o.subarray(2+s);return{fileName:c,content:new Uint8Array(l)}}var pt=null,mt=[];function ht(e){if(pt===e)return;if(pt!==null)throw Error(`SyncHost: a different host is already installed`);pt=e;let t=mt.splice(0);for(let n of t)try{n(e)}catch(e){console.warn(`SyncHost install listener:`,e)}}function gt(){if(pt===null)throw Error(`SyncHost: not installed — call installSyncHost(host) during app boot`);return pt}function _t(e){if(pt!==null){try{e(pt)}catch(e){console.warn(`SyncHost install listener:`,e)}return}mt.push(e)}var vt=`deepview.sync.password`,yt=null;function bt(){return yt}function xt(){let e=gt().getSecureItem(vt);yt=typeof e==`string`&&e.length>0?e:null}async function St(e){yt=e;let t=gt();e==null?await t.removeSecureItem(vt):await t.setSecureItem(vt,e)}function Ct(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 Error(`sse-transport: unsupported URL scheme: ${e}`);let r=n.indexOf(`?`);return r>=0&&(n=n.slice(0,r)),`${t}${n}`}function wt(e){return`${Ct(e)}/sse`}function Tt(e){return`${Ct(e)}/save`}var Et=100,Dt=5e3,Ot=75e3,kt=class{buf=``;parse(e){this.buf+=e;let t=[],n;for(;(n=this.buf.indexOf(`
|
|
8
8
|
|
|
9
|
-
`))>=0;){let
|
|
10
|
-
`))if(!
|
|
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&<){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&>(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&>(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};
|
|
9
|
+
`))>=0;){let e=this.buf.slice(0,n);this.buf=this.buf.slice(n+2);let r=``,i=[];for(let t of e.split(`
|
|
10
|
+
`))if(!t.startsWith(`:`)){if(t.startsWith(`event:`)){r=t.slice(6).trim();continue}if(t.startsWith(`data:`)){i.push(t.slice(5).replace(/^ /u,``));continue}}i.length!==0&&t.push({event:r,data:i.join(`
|
|
11
|
+
`)})}return t}},At=class e extends EventTarget{static CONNECTING=0;static OPEN=1;static CLOSING=2;static CLOSED=3;CONNECTING=e.CONNECTING;OPEN=e.OPEN;CLOSING=e.CLOSING;CLOSED=e.CLOSED;readyState=e.CONNECTING;baseUrl;sessionId=null;cachedPassword=null;outbound=[];flushTimer=null;inFlightPost=null;activeReaders=new Set;fetchAbort=new AbortController;postSeq=0;lastDispatchedSeq=0;downstreamWatchdog=null;constructor(e){super(),this.baseUrl=wt(e),this.scheduleFlush(!0)}send(t){if(this.readyState===e.CLOSED)throw Error(`sse-transport: send on closed transport`);let n;try{n=JSON.parse(t)}catch(e){throw Error(`sse-transport: send received non-JSON payload: ${e.message}`,{cause:e})}if(n.type===`authenticate`&&typeof n.password==`string`){this.cachedPassword=n.password,this.scheduleFlush();return}this.outbound.push(n),this.scheduleFlush()}close(){this.shutdown()}scheduleFlush(t=!1){if(this.readyState===e.CLOSED)return;if(this.flushTimer!=null){if(t)clearTimeout(this.flushTimer),this.flushTimer=null;else return}let n=t?0:Et;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},n)}armDownstreamWatchdog(){this.readyState!==e.CLOSED&&(this.downstreamWatchdog!=null&&clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=setTimeout(()=>{this.downstreamWatchdog=null,this.readyState!==e.CLOSED&&(console.warn(`sse-transport: no downstream activity within the liveness window; reconnecting`),this.shutdown())},Ot),this.downstreamWatchdog.unref?.())}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let e=new Promise(e=>{setTimeout(e,Dt)});await Promise.race([this.inFlightPost.catch(()=>{}),e])}if(this.readyState===e.CLOSED)return;let t=this.outbound;this.outbound=[];let n={};this.sessionId!=null&&(n.id=this.sessionId),this.cachedPassword!=null&&(n.password=this.cachedPassword),t.length>0&&(n.frames=t);let r=this.baseUrl,i=++this.postSeq;this.armDownstreamWatchdog();let a=(async()=>{let t;try{t=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n),credentials:`same-origin`,signal:this.fetchAbort.signal})}catch(t){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST failed:`,t),this.shutdown();return}if(!t.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${t.status} ${t.statusText}; closing`),this.shutdown();return}let a=t.body;if(!a){this.shutdown();return}this.consumeStream(a,i)})();this.inFlightPost=a,a.finally(()=>{this.inFlightPost===a&&(this.inFlightPost=null)})}async consumeStream(t,n){let r=t.getReader();this.activeReaders.add(r);let i=new kt,a=new TextDecoder,o=!1;try{for(;;){let{value:t,done:s}=await r.read();if(s){o=!0;break}if(this.readyState===e.CLOSED)return;n===this.postSeq&&this.armDownstreamWatchdog();let c=i.parse(a.decode(t,{stream:!0}));for(let e of c)this.dispatchOrderedEvent(e,n)}if(this.readyState!==e.CLOSED){let e=a.decode();if(e.length>0)for(let t of i.parse(e))this.dispatchOrderedEvent(t,n)}o&&this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: live downstream closed without a close frame; reconnecting`),this.shutdown())}catch(t){this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: stream read failed:`,t),this.shutdown())}finally{this.activeReaders.delete(r);try{r.releaseLock()}catch{}}}dispatchOrderedEvent(t,n){if(this.readyState!==e.CLOSED){if(n<this.lastDispatchedSeq){this.shutdown();return}this.lastDispatchedSeq=n,this.dispatchEvent_(t)}}dispatchEvent_(t){if(t.event===`session`){if(this.readyState===e.CLOSED)return;this.sessionId=t.data,this.readyState===e.CONNECTING&&(this.readyState=e.OPEN,this.dispatchEvent(new Event(`open`)));return}if(t.event===`close`){let e,n;try{let r=JSON.parse(t.data);typeof r.code==`number`&&(e=r.code),typeof r.reason==`string`&&(n=r.reason)}catch{}this.shutdown(e,n);return}if(t.event===``||t.event===`message`){if(this.readyState!==e.OPEN)return;this.dispatchEvent(new MessageEvent(`message`,{data:t.data}))}}shutdown(t,n){if(this.readyState===e.CLOSED)return;this.readyState=e.CLOSING,this.flushTimer!=null&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.downstreamWatchdog!=null&&(clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=null);try{this.fetchAbort.abort()}catch{}for(let e of this.activeReaders)try{e.cancel().catch(()=>{})}catch{}this.activeReaders.clear(),this.readyState=e.CLOSED;let r=new Event(`close`);t!=null&&(r.code=t),n!=null&&(r.reason=n),this.dispatchEvent(r)}},jt=1e3,Mt=3e4,Nt=3e4,Pt=`session restarted`;function Ft(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,i=null,a=!1,o=null,s=0,c=!1,l=!1,u=null,d=jt,f=null,p=null,m=null,h=null,g=!1,_=null,v=new Set;function y(){u&&=(clearTimeout(u),null)}function b(){f&&=(clearTimeout(f),null)}function x(){y(),!c&&(l||s!==0&&t&&(u=setTimeout(()=>{u=null,N()},Math.round(d*(.5+Math.random()*.5))),d=Math.min(d*2,Mt)))}function S(){C(),!(n<=0)&&(a||(p=setInterval(()=>{!i||i.readyState!==i.OPEN||m||(k({type:`ping`}),m=setTimeout(()=>{m=null,console.warn(`socket-transport: heartbeat timeout; closing socket`);try{i?.close()}catch{}},r))},n)))}function C(){p&&=(clearInterval(p),null),m&&=(clearTimeout(m),null)}function w(e){for(let t of v)try{t.onDisconnected(e)}catch(e){console.warn(`socket-transport: consumer.onDisconnected threw:`,e)}}function T(e){for(let t of v)try{t.onConnected(e)}catch(e){console.warn(`socket-transport: consumer.onConnected threw:`,e)}}function E(e){for(let t of v)try{t.onMessage(e)}catch(e){console.warn(`socket-transport: consumer.onMessage threw:`,e)}}function D(e){let t;try{let n=typeof e.data==`string`?e.data:new TextDecoder().decode(e.data);t=JSON.parse(n)}catch(e){console.warn(`socket-transport: dropping malformed wire frame:`,e);return}if(t&&typeof t==`object`){if(t.type===`pong`){m&&=(clearTimeout(m),null);return}if(t.type===`challenge`){if(typeof t.nonce!=`string`)return;o!=null&&o!==t.nonce&&w(Pt),o=t.nonce,T(o);return}if(t.type===`authenticated`){O(!0),E(t);return}if(t.type===`unauthorized`&&t.kind===`auth-failed`){O(!1);return}E(t)}}function O(e){if(!_)return;let t=_;_=null,t(e)}function k(e){if(!i||i.readyState!==i.OPEN)return!1;try{return i.send(JSON.stringify(e)),!0}catch(e){return console.warn(`socket-transport: send failed:`,e),!1}}function A(e){return new Promise(t=>{_=t,k({type:`authenticate`,password:e})||(_=null,t(!1))})}function j(){if(h)return h;if(!i||i.readyState!==i.OPEN)return Promise.resolve(!1);let t=i,n=(async()=>{await Promise.resolve();try{let n=bt();if(n!=null&&!g){g=!0;let e=await A(n);if(i!==t)return!1;if(e)return!0;try{await St(null)}catch(e){console.warn(`socket-transport: failed to clear cached auth password:`,e)}}let r=!0;for(;;){if(i!==t||!i||i.readyState!==i.OPEN||!e.authResolver)return!1;let n;try{n=await e.authResolver({retry:!r})}catch(e){return console.warn(`socket-transport: authentication resolver threw:`,e),!1}if(i!==t||(r=!1,n==null||n===``))return!1;let a=await A(n);if(i!==t)return!1;if(a){try{await St(n)}catch(e){console.warn(`socket-transport: failed to cache auth password:`,e)}return!0}}}finally{h=null}})();return h=n,n}function M(e){if(b(),!i)return;let t=i;i=null,o=null,g=!1,O(!1),C(),w(e);try{t.close()}catch{}}function N(){c||l||i||s!==0&&t&&P(!1)}function P(e){if(c||l||s===0||!t)return;let n;try{n=e?new At(t):new WebSocket(t)}catch(t){if(!e){console.warn(`socket-transport: WebSocket constructor failed; trying SSE fallback:`,t),P(!0);return}console.warn(`socket-transport: SSE constructor failed:`,t),x();return}i=n,a=e,o=null,g=!1;let r=!1;n.addEventListener(`open`,()=>{i===n&&(r=!0,b(),f=setTimeout(()=>{f=null,i===n&&(d=jt)},Nt),f.unref?.(),S())}),n.addEventListener(`message`,e=>{i===n&&D(e)}),n.addEventListener(`close`,t=>{if(i===n){if(b(),i=null,o=null,g=!1,O(!1),C(),!r&&!e&&!c&&s>0){if(typeof fetch>`u`){w(`socket closed`),x();return}console.warn(`socket-transport: WebSocket failed to open; falling back to SSE`),P(!0);return}t?.code===1001&&(d=jt),w(`socket closed`),!c&&s>0&&x()}}),n.addEventListener(`error`,()=>{})}function F(){if(c)return{release(){}};s+=1,s===1&&!i&&N();let e=!1;return{release(){e||(e=!0,!c&&(--s,s===0&&(y(),d=jt,M(`released`))))}}}function I(e){e!==t&&(y(),d=jt,t=e,i&&M(`serverUrl changed`),s>0&&t&&N())}function L(e){v.add(e);let t=!1;return{remove(){t||(t=!0,v.delete(e))}}}function R(){c||(c=!0,y(),M(`transport closed`),v.clear(),s=0)}function z(e){let{pingMs:t,pongMs:i}=e;typeof t==`number`&&t>=0&&(n=t),typeof i==`number`&&i>0&&(r=i),p&&S()}function ee(){g=!1}function te(e){e!==l&&(l=e,e?(y(),M(`protocol-locked`)):s>0&&t&&N())}return{acquire:F,setServerUrl:I,addConsumer:L,send:k,getNonce:()=>o,getSocket:()=>i,isSse:()=>i!=null&&a,runAuthFlow:j,close:R,setProtocolLocked:te,setHeartbeatTimings:z,resetCachedReplayGuard:ee}}var It=64,Lt=5,Rt=6,zt=25,Bt=500;function Vt(e,t){if(!/^\/api\/objstore\/[\w-]+\/[\w-]+$/u.test(e))throw TypeError(`objstore: urlPath rejected (unexpected shape): ${JSON.stringify(e)}`);let n=new URL(t).origin,r=new URL(e,n);if(r.origin!==n)throw TypeError(`objstore: urlPath origin mismatch \u2014 expected ${n}, got ${r.origin}`);return r.href}function Ht(s){let c=s.requestTimeoutMs??1e4,l=new URL(s.httpOrigin).origin,u=s.transport===void 0,d=s.transport??Ft(s.authResolver===void 0?{serverUrl:s.serverUrl}:{serverUrl:s.serverUrl,authResolver:s.authResolver}),f=!1,p=new Map,m=new Map,h=[],g=[];function _(e,t,n,r){let i=e.seenVersions.get(t);(!i||i.incarnation!==n||r>i.version)&&e.seenVersions.set(t,{incarnation:n,version:r})}function v(e){e.connectedPromise=new Promise((t,n)=>{e.resolveConnected=t,e.rejectConnected=n}),e.connectedPromise.catch(()=>{})}function y(e){e.listedPromise=new Promise((t,n)=>{e.resolveListed=t,e.rejectListed=n}),e.listedPromise.catch(()=>{})}function b(e,t){let n=new Map(e.inventory),r=e.inventorySeeded;e.inventorySeeded=!0,e.inventory.clear();for(let r of t){let t=e.inventory.get(r.resourceTag)??n.get(r.resourceTag),i=t?.incarnation===r.incarnation&&t.version>=r.version?t:{version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};e.inventory.set(r.resourceTag,i),_(e,r.resourceTag,i.incarnation,i.version)}if(e.resolveListed(),r){for(let[t,r]of n){let n=e.inventory.get(t);if(n?.incarnation!==r.incarnation){n||e.seenVersions.delete(t);for(let n of e.deletedHandlers)try{n({resourceTag:t,version:r.version})}catch{}}}for(let[t,r]of e.inventory){let i=n.get(t);if(i?.version===r.version&&i.incarnation===r.incarnation)continue;let a={resourceTag:t,version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};for(let t of e.putHandlers)try{t(a)}catch{}}}}function x(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)Gt(n)&&t.push(Kt(n));return t}function S(e){let t;return new Promise((n,r)=>{t=setTimeout(()=>r(Error(`objstore: inventory not seeded (no subscribe ack) after ${c}ms`)),c),e.listedPromise.then(n,r)}).finally(()=>clearTimeout(t))}function C(e){for(let t=0;t<h.length;t++)if(e(h[t]))return Promise.resolve(h.splice(t,1)[0]);return new Promise((t,n)=>{let r={predicate:e,resolve:()=>{},reject:e=>{clearTimeout(i);let t=g.indexOf(r);t>=0&&g.splice(t,1),n(e)}},i=setTimeout(()=>r.reject(Error(`objstore: response timeout after ${c}ms`)),c);r.resolve=e=>{clearTimeout(i),t(e)},g.push(r)})}function w(e){if(!d.send(e))throw Error(`objstore: socket not open`)}function T(e){for(let t of g.splice(0))try{t.reject(Error(`objstore: ${e}`))}catch{}}function E(e){if(e.type===`workspace-subscribed`&&typeof e.workspaceTag==`string`){let t=p.get(e.workspaceTag);t&&Array.isArray(e.resources)&&b(t,x(e.resources));return}if(e.type===`objstore-put`&&typeof e.workspaceTag==`string`&&Gt(e)){let t=p.get(e.workspaceTag);if(!t)return;let n=Kt(e),r=t.inventory.get(n.resourceTag);if(r?.incarnation===n.incarnation&&r.version>n.version)return;_(t,n.resourceTag,n.incarnation,n.version),t.inventory.set(n.resourceTag,{version:n.version,incarnation:n.incarnation,contentLength:n.contentLength});let i={resourceTag:n.resourceTag,version:n.version,incarnation:n.incarnation,contentLength:n.contentLength};for(let e of t.putHandlers)try{e(i)}catch{}return}if(e.type===`objstore-deleted`&&typeof e.workspaceTag==`string`&&typeof e.resourceTag==`string`&&typeof e.version==`number`){let t=p.get(e.workspaceTag);if(!t)return;let n=e.resourceTag,r=e.version,i=e.incarnation;if(i!==void 0){if(typeof i!=`string`||i.length===0)return;let e=t.inventory.get(n)??t.seenVersions.get(n);if(e&&(i!==e.incarnation||e.version>r))return}t.seenVersions.delete(n),t.inventory.delete(n);let a={resourceTag:n,version:r};for(let e of t.deletedHandlers)try{e(a)}catch{}return}if(e.type!==`workspace-state`&&e.type!==`workspace-save-ack`&&e.type!==`workspace-save-error`&&e.type!==`workspace-subscribed`&&e.type!==`authenticated`&&e.type!==`server-info`){for(let t=0;t<g.length;t++)if(g[t].predicate(e)){let n=g[t];g.splice(t,1),n.resolve(e);return}if(h.push(e),h.length>It){let e=h.splice(0,h.length-It),t=[...new Set(e.map(e=>e.type??`<no-type>`))].slice(0,4);console.warn(`objstore: dropping ${e.length} unmatched frame(s) over MAX_QUEUE_SIZE=${It} (types: ${t.join(`, `)})`)}}}function D(){for(let e of p.values())e.closed||e.connected||(e.connected=!0,e.resolveConnected())}function O(e){T(e);for(let e of p.values())e.closed||e.connected&&(e.connected=!1,v(e))}let k=d.addConsumer({onMessage:E,onConnected:D,onDisconnected:O}),A=e=>Vt(e,l),j=(e,t)=>A(`/api/objstore/${e}/${t}`);async function M(t,n,r){let i=d.getNonce();if(!i)throw Error(`objstore: socket not open`);let a=await e(t.signingKey,r,i),o,s=!1;for(;w({type:`objstore-put-begin`,...r,signature:a}),o=await C(e=>e.workspaceTag===t.workspaceTag&&e.resourceTag===n&&(e.type===`objstore-put-token`||e.type===`objstore-put-error`||e.type===`objstore-conflict`||e.type===`unauthorized`&&e.kind===`gated`)),!(o.type!==`unauthorized`||s||(s=!0,!await d.runAuthFlow())););if(o.type===`unauthorized`)return{kind:`unauthorized`};if(o.type===`objstore-put-error`){if(o.reason===`workspace-full`)return{kind:`workspace-full`};throw Error(`objstore: put-error reason='${String(o.reason)}'`)}if(o.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(o.current)?Kt(o.current):null};if(typeof o.urlPath!=`string`||typeof o.token!=`string`)throw TypeError(`objstore: malformed put-token (missing urlPath/token)`);return{kind:`token`,urlPath:o.urlPath,token:o.token}}async function N(e,t,n,r){let a=Date.now(),o=await i(e.signingKey,n,a),s=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`put`,ts:a,signature:o,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation,expectedLength:n.expectedLength,contentHash:r})});if(s.status===401)return{kind:`unauthorized`};if(s.status===403)return{kind:`workspace-full`};if(s.status===409)return{kind:`conflict`,current:await Ut(s)};if(!s.ok){let e=``;try{e=await s.text()}catch{}throw Error(`objstore: REST put-begin failed ${s.status} ${e.slice(0,200)}`)}let c;try{c=await s.json()}catch{throw TypeError(`objstore: put-mint JSON parse failed`)}if(!c||typeof c!=`object`||typeof c.urlPath!=`string`||typeof c.token!=`string`)throw TypeError(`objstore: malformed put-mint (missing urlPath/token)`);return{kind:`token`,urlPath:c.urlPath,token:c.token}}async function P(e,t){let n=`objstore: ${Pt}`;for(let r=0;;r++)try{return await t()}catch(t){if(r<Lt&&!e.closed&&t instanceof Error&&t.message===n)continue;throw t}}function F(e,t){return P(e,()=>I(e,t))}async function I(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n=await o(t.bytes),r={workspaceTag:e.workspaceTag,resourceTag:t.resourceTag,prevVersion:t.prev?.version??null,prevIncarnation:t.prev?.incarnation??null,expectedLength:t.bytes.byteLength,contentHash:n},i;if(d.isSse()?(i=await N(e,t.resourceTag,r,n),i.kind===`unauthorized`&&(i=await M(e,t.resourceTag,r))):i=await M(e,t.resourceTag,r),i.kind===`unauthorized`)return{ok:!1,reason:`unauthorized`};if(i.kind===`workspace-full`)return{ok:!1,reason:`workspace-full`};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};let a=await globalThis.fetch(A(i.urlPath),{method:`PUT`,headers:{authorization:`Bearer ${i.token}`,"content-type":`application/octet-stream`},body:t.bytes});if(!a.ok){if(a.status===409||a.status===410)return{ok:!1,reason:`conflict`,current:a.status===409?await Ut(a):null};let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST PUT failed ${a.status} ${e.slice(0,200)}`)}let s;try{s=await a.json()}catch{throw TypeError(`objstore: PUT ack JSON parse failed`)}if(!s||typeof s!=`object`||!Wt(s.version)||typeof s.incarnation!=`string`||typeof s.contentHash!=`string`||!Wt(s.contentLength))throw TypeError(`objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)`);let c=s;if(c.contentHash!==n||c.contentLength!==t.bytes.byteLength)throw Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${c.contentHash.slice(0,16)}\u2026 length=${c.contentLength}, client signed ${n.slice(0,16)}\u2026 length=${t.bytes.byteLength}`);return{ok:!0,meta:c}}async function L(e,t){let r=d.getNonce();if(!r)throw Error(`objstore: socket not open`);let i=await n(e.signingKey,e.workspaceTag,t,r);w({type:`objstore-fetch`,workspaceTag:e.workspaceTag,resourceTag:t,signature:i});let a=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t&&(n.type===`objstore-fetch-token`||n.type===`objstore-fetch-not-found`));if(a.type===`objstore-fetch-not-found`)return{kind:`not-found`};if(typeof a.urlPath!=`string`||typeof a.token!=`string`||!Gt(a))throw TypeError(`objstore: malformed fetch-token (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:a.urlPath,token:a.token,meta:Kt(a)}}async function R(e,t){let n=Date.now(),i=await r(e.signingKey,e.workspaceTag,t,n),a=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`fetch`,ts:n,signature:i})});if(a.status===404)return{kind:`not-found`};if(a.status===401)return{kind:`unauthorized`};if(!a.ok){let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST fetch-mint failed ${a.status} ${e.slice(0,200)}`)}let o;try{o=await a.json()}catch{throw TypeError(`objstore: fetch-mint JSON parse failed`)}if(!o||typeof o!=`object`||typeof o.urlPath!=`string`||typeof o.token!=`string`||!Gt(o))throw TypeError(`objstore: malformed fetch-mint (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:o.urlPath,token:o.token,meta:Kt(o)}}async function z(e,t){for(let n=0;n<Rt;n++){let r=await P(e,()=>ee(e,t));if(r.kind===`ok`)return r.value;if(r.kind===`not-found`)return null;if(n+1<Rt){let e=Math.min(Bt,zt*2**n);await new Promise(t=>{setTimeout(t,e)})}}return null}async function ee(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n;if(d.isSse()?(n=await R(e,t),n.kind===`unauthorized`&&(n=await L(e,t))):n=await L(e,t),n.kind===`not-found`)return{kind:`not-found`};if(n.kind===`unauthorized`)throw Error(`objstore: fetch-mint unauthorized`);let r=n.meta,i=await globalThis.fetch(A(n.urlPath),{method:`GET`,headers:{authorization:`Bearer ${n.token}`}});if(!i.ok){if(i.status===404||i.status===503)return{kind:`retry`};let e=``;try{e=await i.text()}catch{}throw Error(`objstore: REST GET failed ${i.status} ${e.slice(0,200)}`)}let a=new Uint8Array(await i.arrayBuffer()),s=await o(a);if(s!==r.contentHash)throw Error(`objstore: contentHash mismatch \u2014 expected ${r.contentHash.slice(0,16)}\u2026, got ${s.slice(0,16)}\u2026`);return{kind:`ok`,value:{bytes:a,meta:r}}}async function te(e,n){let r=d.getNonce();if(!r)throw Error(`objstore: socket not open`);let i=await t(e.signingKey,n,r);w({type:`objstore-delete`,...n,signature:i});let a=await C(t=>t.workspaceTag===e.workspaceTag&&t.resourceTag===n.resourceTag&&(t.type===`objstore-deleted-ack`||t.type===`objstore-delete-error`||t.type===`objstore-conflict`));if(a.type===`objstore-deleted-ack`){if(typeof a.deletedVersion!=`number`)throw TypeError(`objstore: malformed deleted-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:a.deletedVersion}}if(a.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(a.current)?Kt(a.current):null};if(a.reason===`not-found`)return{kind:`not-found`};throw Error(`objstore: delete-error reason='${String(a.reason)}'`)}async function ne(e,t,n){let r=Date.now(),i=await a(e.signingKey,n,r),o=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`delete`,ts:r,signature:i,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation})});if(o.status===401)return{kind:`unauthorized`};if(o.status===404)return{kind:`not-found`};if(o.status===409)return{kind:`conflict`,current:await Ut(o)};if(!o.ok){let e=``;try{e=await o.text()}catch{}throw Error(`objstore: REST delete failed ${o.status} ${e.slice(0,200)}`)}let s;try{s=await o.json()}catch{throw TypeError(`objstore: delete-ack JSON parse failed`)}if(!s||typeof s!=`object`||typeof s.deletedVersion!=`number`)throw TypeError(`objstore: malformed delete-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:s.deletedVersion}}function B(e,t,n){return P(e,()=>re(e,t,n))}async function re(e,t,n){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let r={workspaceTag:e.workspaceTag,resourceTag:t,prevVersion:n?.version??null,prevIncarnation:n?.incarnation??null},i;if(d.isSse()?(i=await ne(e,t,r),i.kind===`unauthorized`&&(i=await te(e,r))):i=await te(e,r),i.kind===`ok`)return{ok:!0,deletedVersion:i.deletedVersion};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};if(i.kind===`not-found`)return{ok:!1,reason:`not-found`};throw Error(`objstore: delete unauthorized`)}function ie(e,t,n,r){let i=e.seenVersions.get(t);if(i&&i.incarnation===n&&r<i.version)throw Error(`objstore: version-rollback rejected \u2014 fetched v${r} for an incarnation we've already seen at v${i.version}`)}async function ae(e,t){if(f)throw Error(`objstore: client closed`);if(!t||typeof t.workspaceId!=`string`)throw Error(`objstore: openWorkspace requires a WorkspaceSubscription (triageSync.ensureSubscription) — the client must not open a session for a tag with no backing sync subscribe`);let n=e.workspaceTag;if(t.workspaceTag!=null&&t.workspaceTag!==n)throw Error(`objstore: openWorkspace — WorkspaceSubscription is for a different workspace than these keys`);if(p.has(n))throw Error(`objstore: workspace ${n.slice(0,8)}\u2026 is already open on this client`);let r={workspaceTag:n,signingKey:e.signingKey,contentKey:new Uint8Array(e.contentKey),tagKey:new Uint8Array(e.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,inventorySeeded:!1,connected:!1,closed:!1};v(r),y(r),p.set(n,r);let i=r;(async()=>{let e;try{e=await t.resources}catch{return}!i.closed&&!i.inventorySeeded&&b(i,x(e))})();let a=d.acquire();m.set(n,a),d.getNonce()&&(i.connected=!0,i.resolveConnected());let o=null;try{await new Promise((e,t)=>{o=setTimeout(()=>{t(Error(`objstore: connect timeout after ${c}ms`))},c),i.connectedPromise.then(()=>e(),e=>t(e))})}catch(e){o&&clearTimeout(o),p.delete(n),m.delete(n),i.closed=!0;try{i.contentKey.fill(0)}catch{}try{i.tagKey.fill(0)}catch{}throw a.release(),e}o&&clearTimeout(o);async function s(e,t,n){let r=await F(i,{resourceTag:e,bytes:t,prev:n});return r.ok?(n??i.seenVersions.delete(e),_(i,e,r.meta.incarnation,r.meta.version),i.inventory.set(e,{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}),{ok:!0,meta:{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}}):r.reason===`workspace-full`?{ok:!1,reason:`workspace-full`}:r.reason===`unauthorized`?{ok:!1,reason:`unauthorized`}:(r.current&&_(i,e,r.current.incarnation,r.current.version),{ok:!1,reason:`conflict`,current:r.current})}async function l(e){let t=await U(i.tagKey,e.fileName);return await s(t,ct(i.contentKey,e.fileName,e.content,n,t),e.prev)}async function u(e){let t=await U(i.tagKey,e),r=await z(i,t);if(!r)return null;ie(i,t,r.meta.incarnation,r.meta.version);let{fileName:a,content:o}=ft(i.contentKey,r.bytes,n,t);if(a!==e)throw Error(`objstore: fileName-binding mismatch \u2014 requested '${e}', payload encoded '${a}'`);return _(i,t,r.meta.incarnation,r.meta.version),{content:o,version:r.meta.version,incarnation:r.meta.incarnation}}async function h(e){let t=await z(i,e);if(!t)return null;ie(i,e,t.meta.incarnation,t.meta.version);let{fileName:r,content:a}=ft(i.contentKey,t.bytes,n,e);if(await U(i.tagKey,r)===e)return _(i,e,t.meta.incarnation,t.meta.version),{kind:`report`,fileName:r,content:a,version:t.meta.version,incarnation:t.meta.incarnation};if(await st(i.tagKey,r)===e){let{name:n,content:o}=dt(a);return _(i,e,t.meta.incarnation,t.meta.version),{kind:`bundle`,integrity:r,name:n,content:o,version:t.meta.version,incarnation:t.meta.incarnation}}throw Error(`objstore: fetchByTag — decrypted name does not derive back to the requested resourceTag under either the report or bundle tag scheme (relay or workspace member produced a non-round-trippable tag-name pair)`)}async function g(e,t){let n=await B(i,e,t);return n.ok?(i.seenVersions.delete(e),i.inventory.delete(e),n):n.reason===`not-found`?{ok:!1,reason:`not-found`}:(n.current&&_(i,e,n.current.incarnation,n.current.version),{ok:!1,reason:`conflict`,current:n.current})}async function C(e,t){return await g(await U(i.tagKey,e),t)}async function w(){if(await S(i),i.closed)throw Error(`objstore: session closed`);return[...i.inventory.entries()].map(([e,t])=>({resourceTag:e,version:t.version,incarnation:t.incarnation,contentLength:t.contentLength}))}async function T(e){let t=await st(i.tagKey,e.integrity),r=ut(e.name,e.content);return await s(t,ct(i.contentKey,e.integrity,r,n,t),e.prev)}async function E(e){let t=await st(i.tagKey,e),r=await z(i,t);if(!r)return null;ie(i,t,r.meta.incarnation,r.meta.version);let{fileName:a,content:o}=ft(i.contentKey,r.bytes,n,t);if(a!==e)throw Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${e}', payload encoded '${a}'`);let{name:s,content:c}=dt(o);return _(i,t,r.meta.incarnation,r.meta.version),{name:s,content:c,version:r.meta.version,incarnation:r.meta.incarnation}}async function D(e,t){return await g(await st(i.tagKey,e),t)}return{put:l,fetch:u,fetchByTag:h,delete:C,list:w,putBundle:T,fetchBundle:E,deleteBundle:D,onPut(e){return i.putHandlers.add(e),()=>{i.putHandlers.delete(e)}},onDeleted(e){return i.deletedHandlers.add(e),()=>{i.deletedHandlers.delete(e)}},close(){if(i.closed)return;i.closed=!0,p.delete(n);try{i.contentKey.fill(0)}catch{}try{i.tagKey.fill(0)}catch{}try{i.rejectConnected(Error(`objstore: session closed`))}catch{}try{i.rejectListed(Error(`objstore: session closed`))}catch{}let e=m.get(n);m.delete(n),e&&e.release()}}}function oe(){if(!f){f=!0;for(let e of p.values()){e.closed=!0;try{e.contentKey.fill(0)}catch{}try{e.tagKey.fill(0)}catch{}try{e.rejectConnected(Error(`objstore: client closed`))}catch{}try{e.rejectListed(Error(`objstore: client closed`))}catch{}}p.clear();for(let e of m.values())e.release();m.clear(),k.remove(),u&&d.close()}}return{openWorkspace:ae,close:oe}}async function Ut(e){try{let t=await e.json();if(Wt(t.currentVersion)&&typeof t.currentIncarnation==`string`)return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function Wt(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}function Gt(e){return!e||typeof e!=`object`?!1:typeof e.resourceTag==`string`&&Wt(e.version)&&typeof e.incarnation==`string`&&typeof e.contentHash==`string`&&Wt(e.contentLength)&&typeof e.signature==`string`}function Kt(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var qt=null;function Jt(e){qt=typeof e==`function`?e:null}var Yt=Ft({serverUrl:``,authResolver:e=>qt==null?Promise.resolve(null):qt(e)});function Xt(){return Yt}var Zt=new Set([`busy`]);function Qt(e){return typeof e?.color==`string`?e.color:``}function $t(e){return u(e??void 0)??``}function en(e){return typeof e?.comment==`string`?e.comment:``}function tn(e){return typeof e?.fix==`string`?e.fix:``}function nn(e){return e?.flagged===!0?`flagged`:e?.flagged===!1?`not flagged`:``}function rn(e,t,n,r){let i=[];for(let a of Object.keys(e)){let o=e[a],s=t[a],c=n[a],l=o??null,u=[{name:`color`,norm:Qt},{name:`triage`,norm:$t},{name:`comment`,norm:en},{name:`fix`,norm:tn},{name:`flagged`,norm:nn}];for(let{name:e,norm:t}of u){let n=t(s),o=t(l),u=t(c);(o!==n||r?.has(a))&&u!==n&&o!==u&&i.push({id:a,property:e,local:o,imported:u})}}return i}function an(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let i=new Set(n);for(let e of r)if(!i.has(e))return!1;return!0}function on(e,t){let n=e.triage??(e.deleted?`deleted`:``),r=t.triage??(t.deleted?`deleted`:``);return e.color===t.color&&n===r&&(e.comment??``)===(t.comment??``)&&(e.fix??``)===(t.fix??``)&&e.flagged===t.flagged&&an(e.ignoredReports,t.ignoredReports)&&an(e.scopedIgnoredReports,t.scopedIgnoredReports)}function sn(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!on(e[r]??{},t[r]??{}))return!1;return!0}function cn(e=[],t=[],n=[]){let r=new Set(e),i=new Set(t),a=new Set(n);for(let e of r)i.has(e)||a.delete(e);for(let e of i)r.has(e)||a.add(e);return[...a]}function ln(e,t,n,r){let i=Object.assign(Object.create(null),n);for(let a of new Set([...Object.keys(e),...Object.keys(t),...r??[]])){let o=r?.has(a),s=p(e[a])??{},c=p(t[a])??{},l={...p(n[a])};for(let e of[`color`,`comment`,`fix`,`flagged`])(s[e]!==c[e]||o)&&Object.assign(l,{[e]:c[e]});if(o||s.triage!==c.triage||!an(s.ignoredReports,c.ignoredReports)){let e=!o&&d(c)&&d(l),t=e?cn(s.ignoredReports,c.ignoredReports,l.ignoredReports):c.ignoredReports??[];(!e||s.triage!==c.triage)&&(c.triage===void 0?delete l.triage:l.triage=c.triage),t.length===0?delete l.ignoredReports:l.ignoredReports=t}l.scopedIgnoredReports=[...new Set([...c.scopedIgnoredReports??[],...l.scopedIgnoredReports??[]])];let u=p(l);u?i[a]=u:delete i[a]}return i}function un(e,t){let n=Object.assign(Object.create(null),e);for(let[e,r]of Object.entries(t))r===null?delete n[e]:r!==void 0&&(n[e]=r);return n}function dn(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of r)on(e[i]??{},t[i]??{})||(n[i]=t[i]??null);return n}function fn(e){for(let t in e)return!1;return!0}function pn(e,t){let n=Object.assign(Object.create(null),e),r=gt().state,i=t instanceof Set?t:new Set(t);for(let e of i){let t=p(r.triage.get(e));t?n[e]=t:delete n[e]}return n}function mn(e,t){let n=gt().state,r=[];for(let i of t){let t=e[i];if(!t||typeof t!=`object`)continue;let a=n.triage.get(i);if(t.color){let e=a?.color;e===void 0?m(n.triage,i,{color:t.color}):e!==t.color&&r.push({id:i,property:`color`,local:e,imported:t.color})}let o=u(t);if(o){let e=u(a);e===void 0?m(n.triage,i,{triage:o}):e!==o&&r.push({id:i,property:`triage`,local:e,imported:o})}if(t.comment){let e=a?.comment;e===void 0?m(n.triage,i,{comment:t.comment}):e!==t.comment&&r.push({id:i,property:`comment`,local:e,imported:t.comment})}if(t.fix){let e=a?.fix;e===void 0?m(n.triage,i,{fix:t.fix}):e!==t.fix&&r.push({id:i,property:`fix`,local:e,imported:t.fix})}if(typeof t.flagged==`boolean`){let e=a?.flagged;e===void 0?m(n.triage,i,{flagged:t.flagged}):e!==t.flagged&&r.push({id:i,property:`flagged`,local:e?`flagged`:`not flagged`,imported:t.flagged?`flagged`:`not flagged`})}if(d(t)&&d(a)&&Array.isArray(t.ignoredReports))for(let e of t.ignoredReports)typeof e==`string`&&((a?.ignoredReports?.length??0)>0&&!a?.ignoredReports?.includes(e)||g(n.triage,i,e,!0,f(t,e)))}return r}function hn(e,t){let n=gt().state;for(let r of e)t[`${r.id}:${r.property}`]===`imported`&&gn(r.id,r.property)===r.local&&(r.property===`color`?m(n.triage,r.id,{color:r.imported}):r.property===`comment`?m(n.triage,r.id,{comment:r.imported}):r.property===`fix`?m(n.triage,r.id,{fix:r.imported}):r.property===`triage`?r.imported===`inprogress`||r.imported===`fixed`||r.imported===`invalid`||r.imported===`deleted`||r.imported===`ignored`?m(n.triage,r.id,{triage:r.imported,...r.imported===`ignored`?{}:{ignoredReports:void 0}}):m(n.triage,r.id,{triage:void 0}):r.property===`flagged`&&m(n.triage,r.id,{flagged:r.imported===`flagged`||r.imported!==`not flagged`&&void 0}))}function gn(e,t){let n=gt().state.triage.get(e);return t===`color`?n?.color??``:t===`triage`?u(n)??``:t===`comment`?n?.comment??``:t===`fix`?n?.fix??``:t===`flagged`?n?.flagged===!0?`flagged`:n?.flagged===!1?`not flagged`:``:``}function _n(e,t){let n=gt().state,r=t instanceof Set?t:new Set(t);for(let t of r){let r=e[t],i=d(r)?r?.ignoredReports:void 0;h(n.triage,t,{...r,ignoredReports:i})}}var vn=`deepview.sync.sessions`,yn=vn,bn=1,xn=!1,Sn=new Set;function Cn(){return xn}function wn(e){if(xn!==e){xn=e,console.warn(e?`triage-sync: can't persist the sessions blob — either it's an unrecognised future version (writes skipped to avoid clobbering a newer build's data) or the write itself failed (storage full / vault locked). Your in-memory triage state still works this session but will not persist across reload. Free up storage and/or clear localStorage[deepview.sync.sessions]; the badge clears on the next successful save.`:`triage-sync: persistence recovered; persisted-sessions blob is now writable.`);for(let t of Sn)try{t(e)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}}function Tn(e){let t=t=>e(t);return Sn.add(t),queueMicrotask(()=>{if(Sn.has(t))try{t(xn)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}),()=>Sn.delete(t)}function En(){try{let e=gt().getSecureItem(vn);if(!e)return{kind:`empty`};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{kind:`empty`};let n=t;return n.version===bn&&n.sessions&&typeof n.sessions==`object`&&!Array.isArray(n.sessions)?{kind:`v1`,map:n.sessions}:n.version===bn?{kind:`empty`}:`version`in n?{kind:`unknown-version`}:{kind:`legacy`,map:n}}catch{return{kind:`empty`}}}function Dn(){let e=En();return e.kind===`v1`||e.kind===`legacy`?e.map:{}}async function On(e){try{return await gt().setSecureItem(vn,JSON.stringify({version:bn,sessions:e})),!0}catch(e){return console.warn(`Triage sync: could not persist session state:`,e),!1}}function kn(e,t){if(!t)return null;let n=Dn()[e];return!n||n.serverUrl!==t?null:{baseRevision:typeof n.baseRevision==`string`?n.baseRevision:null,...n.hasBase===!0?{hasBase:!0}:{},baseState:n.baseState&&typeof n.baseState==`object`?Object.assign(Object.create(null),n.baseState):Object.create(null),savesSinceKeyframe:typeof n.savesSinceKeyframe==`number`?n.savesSinceKeyframe:0}}async function An(e){await navigator.locks.request(yn,async()=>{let t=En();if(t.kind===`unknown-version`){wn(!0);return}let n=t.kind===`v1`||t.kind===`legacy`?t.map:{};await e(n)!==!1&&wn(!await On(n))})}function jn(e=null){An(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(gt().listWorkspaces().map(e=>e.id)),i=!1;for(let a of n){let n=t[a];(!r.has(a)||e!=null&&n?.serverUrl!==e)&&(delete t[a],i=!0)}return i?void 0:!1}).catch(e=>{console.warn(`Triage sync: prunePersistedSessions lock failed:`,e)})}function Mn(e){return An(t=>{if(!(e in t))return!1;delete t[e]})}var Nn=!1,Pn=new Set;function Fn(){return Nn}function In(e){if(Nn!==e){Nn=e,e&&console.warn(`triage-sync: the sync relay appears to sit behind an authentication proxy (e.g. Cloudflare Access) and this session is no longer authorised — reconnects are being redirected to the proxy login. Reload the page to sign in again.`);for(let t of Pn)try{t(e)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}}function Ln(e){let t=t=>e(t);return Pn.add(t),queueMicrotask(()=>{if(Pn.has(t))try{t(Nn)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}),()=>Pn.delete(t)}async function Rn(e){if(typeof fetch>`u`||!e)return!1;let t;try{t=wt(e)}catch{return!1}let n;try{n=await fetch(t,{method:`GET`,redirect:`manual`,credentials:`same-origin`,cache:`no-store`})}catch{return!1}return n.type===`opaqueredirect`}var zn,Bn,Vn,Hn,Un,Wn=`deepview.triageSyncUrl`,Gn=`deepview.sync.userEnabled`,Kn=/^\d+$/u,qn=()=>{},Jn=null,W=``,Yn=!0,Xn=!1,G=Xt(),Zn=null,Qn=100,$n=5,er=2e3;function tr(){return Yn&&!Xn&&!!W&&nr()}function nr(){try{return Bn().length>0}catch{return!1}}var rr=new Set,ir=new Set,ar=null;function or(e){let t=s(e);if(t!=null){ar=t;for(let e of ir)try{e(t)}catch(e){console.warn(`Triage sync: onServerInfo listener failed:`,e)}}}function sr(){if(!tr())return`off`;for(let e of q.values())if(e.error)return`error`;let e=G.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return`offline`;for(let e of q.values())if(!e.subscribeAcked)return`connecting`;return`online`}var cr=`off`;function K(){let e=sr();if(e!==cr){cr=e,vr(e);for(let t of rr)try{t(e)}catch(e){console.warn(`Triage sync status listener:`,e)}}}var lr=6e3,ur=3e4,dr=null,fr=!1,pr=0;function mr(e){return e===`offline`||e===`connecting`}function hr(){pr+=1,dr!=null&&(clearTimeout(dr),dr=null)}function gr(e){hr(),dr=setTimeout(()=>{dr=null,_r()},e),dr.unref?.()}async function _r(){if(fr||!tr()||!mr(sr()))return;let e=pr;fr=!0;let t=!1;try{t=await Rn(W)}catch{t=!1}finally{fr=!1}if(pr===e){if(!tr()||!mr(sr())){In(!1);return}if(t){In(!0);return}gr(ur)}}function vr(e){mr(e)?dr==null&&!fr&&!Fn()&&gr(lr):(hr(),In(!1))}var yr=0,q=new Map;function br(e){for(let t of q.values())if(t.workspaceTag===e)return t;return null}function J(e){return q.get(e.workspaceId)===e}function xr(e){e.busyRetryTimer??(e.busyRetryTimer=setTimeout(()=>{e.busyRetryTimer=null,J(e)&&(e.error||e.pending||!e.pendingSave||(e.pendingSave=!1,Y(e)))},er),e.busyRetryTimer.unref?.())}function Sr(e){e.busyRetryTimer!=null&&(clearTimeout(e.busyRetryTimer),e.busyRetryTimer=null)}function Cr(e){if(e.appliedRevisions.clear(),Sr(e),e.key){try{e.key.fill(0)}catch{}e.key=null}if(e.signingKey=null,e.verifyingKey=null,e.objstoreResourceWaiters.length>0){let t=e.objstoreResourceWaiters.splice(0);for(let e of t)try{e([])}catch{}}}function wr(e){let t=new Set,n=Bn().find(t=>t.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let e of zn.reports)if(r.has(e.fileName))for(let n of e.groups)for(let e of n){let n=e.id??String(e._id);Kn.test(n)||t.add(n)}return t}function Tr(e){let t=wr(e.workspaceId),n=[];for(let r of t)e.ids.has(r)||n.push(r);let r=[];return n.length>0&&(r=mn(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function Er(){let e=En();e.kind===`unknown-version`?wn(!0):(e.kind===`v1`||e.kind===`legacy`)&&wn(!1),xt(),G.resetCachedReplayGuard()}function Dr(e){if(!e||!W)return;let t=W,n=e.generation,r={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState,...e.baseRevision===null&&e.hasBase?{hasBase:!0}:{}};An(i=>{if(!J(e)||e.generation!==n||W!==t)return!1;i[e.workspaceId]=r}).catch(e=>{console.warn(`Triage sync: persistSession lock failed:`,e)})}function Or(e){let t=Bn().find(t=>t.id===e.workspaceId);if(!t){e.error=`workspace no longer exists`,K();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,i]=await Promise.all([Ne(t.privateKey),Pe(t.privateKey,e.workspaceId)]);if(q.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=i.privateKey,e.verifyingKey=i.publicKey,e.workspaceTag=i.publicKeyB64,G.getSocket()?.readyState!==WebSocket.OPEN){qr();return}Mr(e),Y(e),K()}catch(t){console.warn(`Triage sync: key derivation failed:`,t),q.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${t instanceof Error?t.message:String(t)}`,K())}})()}function kr(e){return G.send(e)}function Ar(e,t){if(!G.isSse()){kr(t);return}let n=e.generation,r=e.pending,i=()=>J(e)&&e.generation===n&&e.pending===r;jr(t,i).then(e=>(e&&i()&&kr(t),null)).catch(()=>{i()&&kr(t)})}async function jr(e,t){if(!W)return!0;let n;try{n=Tt(W)}catch{return!0}let r;try{r=await globalThis.fetch(n,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:AbortSignal.timeout(3e4)})}catch{return!0}if(!t())return!1;let i=e.workspaceTag,a=e.base??null;if(r.status===401)return!0;if(r.ok){let e=null;try{e=await r.json()}catch{return!0}return t()?!e||typeof e.id!=`string`||(Wr({type:`workspace-save-ack`,workspaceTag:i,base:a,id:e.id},t),!1):!1}if(r.status===409){let e=null;try{e=await r.json()}catch{return!0}return t()?(Wr({type:`workspace-state`,workspaceTag:i,revisions:e&&Array.isArray(e.revisions)?e.revisions:[]},t),Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`stale-base`},t),!1):!1}return r.status!==413||(Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`too-large`},t),!1)}function Mr(e,t=!1){if(!J(e)||!tr())return;let n=G.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=G.getNonce();if(r==null)return;let i=e.baseRevision,a=n,o=e.signingKey,s=e.workspaceTag,c=e.generation;(async()=>{try{let t=await Be(o,s,i,r);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s||G.getSocket()!==a||G.getNonce()!==r)return;e.subscribed=!0,kr({type:`workspace-subscribe`,workspaceTag:s,from:i,signature:t})}catch(e){console.warn(`Triage sync: subscribe sign failed:`,e)}})()}function Y(e){if(!J(e)||!tr()||e.error)return;if(e.pending||e.encrypting||e.receiving){e.pendingSave=!0;return}if(!e.key||!e.signingKey||!e.workspaceTag){e.pendingSave=!0;return}Tr(e),e.localState=pn(e.baseState,e.ids);let t=G.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=Qn,r=dn(n?Object.create(null):e.baseState,e.localState);if(fn(r)&&!n)return;let i=e.baseRevision,a=e.key,o=e.signingKey,s=e.workspaceTag,c=e.generation;e.encrypting=!0,(async()=>{try{let t=Ue(s,i),{nonce:l,ciphertext:u}=await Ze(a,r,t),d={publicKeyB64:s,base:i,keyframe:n,nonceB64:l,ciphertextB64:u},f=await Le(o,d),p=await Re(d);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s)return;if(e.baseRevision!==i||e.receiving){e.pendingSave=!0;return}e.pending={base:i,id:p,changeset:r,keyframe:n},e.pendingSave=!1;let m={type:`workspace-save`,workspaceTag:s,base:i,nonce:l,ciphertext:u,signature:f};n&&(m.keyframe=!0),Ar(e,m),e.consecutiveFailures=0,e.error&&(e.error=null,K())}catch(t){console.warn(`Triage sync: encrypt/sign failed:`,t),J(e)&&e.generation===c&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=$n&&(e.error=`encrypt/sign failed: ${t instanceof Error?t.message:String(t)}`,K()))}finally{J(e)&&e.generation===c&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&!e.receiving&&(e.pendingSave=!1,Y(e)))}})()}async function Nr(e,t,n,r){for(let i of t){if(!i||typeof i!=`object`||typeof i.id==`string`&&(i.id===e.baseRevision||e.appliedRevisions.has(i.id)||r.has(i.id)))continue;let t=e.baseRevision,a=i.keyframe===!0;if(!(t==null?i.base==null||a:i.base===t))return console.warn(`Triage sync: chain base mismatch (expected ${t}, got ${i.base})`),!1;if(typeof i.signature!=`string`||typeof i.nonce!=`string`||typeof i.ciphertext!=`string`||typeof i.id!=`string`)return console.warn(`Triage sync: revision missing signature/nonce/ciphertext/id; resyncing`),e.savesSinceKeyframe=Qn,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let o=typeof i.base==`string`?i.base:null,s={publicKeyB64:e.workspaceTag,base:o,keyframe:a,nonceB64:i.nonce,ciphertextB64:i.ciphertext},c=await Ve(e.verifyingKey,s,i.signature);if(!n())return!1;if(!c)return console.warn(`Triage sync: revision signature did not verify; resyncing`),e.savesSinceKeyframe=Qn,!1;let l=await Re(s);if(!n())return!1;if(i.id!==l)return console.warn(`Triage sync: revision id does not match content hash; resyncing`),e.savesSinceKeyframe=Qn,!1;let u;try{let t=Ue(e.workspaceTag,o);u=await Qe(e.key,i.nonce,i.ciphertext,t)}catch(t){return console.warn(`Triage sync: decrypt failed; resyncing`,t),e.savesSinceKeyframe=Qn,!1}if(!n())return!1;e.baseState=un(a?Object.create(null):e.baseState,u??{}),e.baseRevision=i.id,e.appliedRevisions.add(i.id),e.pending?.id===i.id&&(e.pending=null),e.savesSinceKeyframe=a?0:Math.min((e.savesSinceKeyframe??0)+1,Qn)}return!0}async function Pr(e,t,n=[],r=null){if(!J(e))return;let i=e.generation;e.localState=un(e.baseState,t),yr++;try{_n(e.localState,e.ids),r&&n.length>0&&(hn(n.filter(({id:t})=>e.ids.has(t)),r),e.localState=pn(e.baseState,e.ids)),Dr(e),await Vn()}finally{yr--}if(J(e)&&e.generation===i){e.localState=pn(e.baseState,e.ids),qn();for(let t of q.values())t!==e&&Y(t)}}function Fr(e){return Tr(e),e.localState=pn(e.baseState,e.ids),dn(e.baseState,e.localState)}async function Ir(e,t){let n=e.generation;if(e.pending&&t.base===e.pending.base&&typeof t.id==`string`&&t.id===e.pending.id){Fr(e);let r=e.localState;if(e.baseState=un(e.pending.keyframe?Object.create(null):e.baseState,e.pending.changeset),e.baseRevision=t.id,e.hasBase=!0,e.appliedRevisions.add(t.id),e.savesSinceKeyframe=e.pending.keyframe?0:Math.min((e.savesSinceKeyframe??0)+1,Qn),e.pending=null,e.staleResetAttempted=!1,await Pr(e,dn(e.baseState,r)),!J(e)||e.generation!==n)return;(e.pendingSave||!sn(e.localState,e.baseState))&&(e.pendingSave=!1,Y(e));return}if(e.pending){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: ack mismatch (pending ${e.pending.base}/${e.pending.id.slice(0,8)}, ack ${t.base}/${n})`);return}if(t.id!==e.baseRevision){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${n}\u2026; pending was already cleared`),e.pendingSave=!0,Y(e)}}async function Lr(e,t){if(!Array.isArray(t)||!e.key)return;if(t.length===0){e.resyncAttempted&&(e.resyncAttempted=!1,e.pending||(e.pendingSave=!1,Y(e)));return}let n=e.generation,r=e.workspaceTag,i=()=>J(e)&&e.generation===n&&e.workspaceTag===r;e.receiving=!0;try{Fr(e);let n=e.baseState,r=e.pending,a=e.baseRevision,o={...e,appliedRevisions:new Set},s=await Nr(o,t,i,e.appliedRevisions);if(!i())return;if(o.baseRevision!==a){let t=r&&o.pending===null?un(r.keyframe?Object.create(null):n,r.changeset):n;Fr(e);let s=dn(t,e.localState),c=a===null&&!(r&&o.pending===null)?new Set([...Object.keys(t),...e.hasBase?e.ids:[]]):void 0;if(c)for(let t of c)s[t]=e.localState[t]??null;let l=rn(s,t,o.baseState,c).filter(({id:t})=>e.ids.has(t)),u=null;if(l.length>0&&Jn){try{u=await Jn(l,o.baseState,`chain`)??null}catch(e){console.warn(`Triage sync: chain-conflict resolver failed:`,e)}if(!i())return}Fr(e);let d=ln(t,e.localState,o.baseState,c);e.baseRevision=o.baseRevision,e.hasBase=!0;for(let t of o.appliedRevisions)e.appliedRevisions.add(t);if(e.baseState=o.baseState,e.savesSinceKeyframe=o.savesSinceKeyframe,e.pending&&(e.pendingSave=!0),e.pending=null,await Pr(e,dn(e.baseState,d),l,u),!i())return}else e.savesSinceKeyframe=o.savesSinceKeyframe;if(!s){if(e.pendingSave=!1,!e.resyncAttempted){e.resyncAttempted=!0,Mr(e,!0);return}console.warn(`Triage sync: catch-up also broke continuity; full state push`),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Qn,e.pending=null,e.resyncAttempted=!1,e.pendingSave=!0,Dr(e),qn();return}e.resyncAttempted=!1,e.staleResetAttempted=!1,sn(e.localState,e.baseState)||(e.pendingSave=!0)}finally{i()&&(e.receiving=!1,e.pendingSave&&!e.pending&&!e.error&&(e.pendingSave=!1,Y(e)))}}async function Rr(e){if(e.type===`server-info`){or(e);return}if(e.type===`authenticated`){for(let e of q.values())Mr(e),Y(e);return}if(e.type===`unauthorized`){if(e.kind===`gated`){if(typeof e.workspaceTag==`string`){let t=br(e.workspaceTag);t&&typeof e.resourceTag!=`string`&&zr(t,e)}G.runAuthFlow().catch(e=>{console.warn(`Triage sync: auth flow failed:`,e)})}return}if(typeof e.workspaceTag!=`string`)return;let t=br(e.workspaceTag);if(t){if(e.type===`workspace-save-ack`)await Ir(t,e);else if(e.type===`workspace-state`)await Lr(t,e.revisions);else if(e.type===`workspace-save-error`)Vr(t,e);else if(e.type===`workspace-subscribed`){if(t.subscribeAcked=!0,Array.isArray(e.resources)){let n=e.resources,r=t.objstoreResourceWaiters.splice(0);for(let e of r)try{e(n)}catch{}}K()}}}function zr(e,t){e.pending&&(typeof t.base!=`string`&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var Br=/^[\w-]+$/u;function Vr(e,t){if(!e.pending||typeof t.base!=`string`&&t.base!==null||t.base!==e.pending.base)return;let n=t.reason,r=typeof n==`string`&&n.length>0&&n.length<=64&&Br.test(n)?n:`rejected`;if(e.pending=null,Zt.has(r)){e.pendingSave=!0,xr(e);return}if(r===`stale-base`&&!e.staleResetAttempted){e.staleResetAttempted=!0,console.warn(`Triage sync: stale-base catch-up did not apply (server chain gone or rebuilt past our base); full state push`),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Qn,e.pendingSave=!1,e.resyncAttempted=!1,Dr(e),qn(),Y(e);return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,K()}var Hr=Promise.resolve(),Ur=0;function Wr(e,t=()=>!0){let n=Ur,r=typeof e.workspaceTag==`string`?br(e.workspaceTag):null;if(typeof e.workspaceTag==`string`&&!r)return;let i=r?.generation;Hr=Hr.then(()=>{if(t()&&Ur===n&&(!r||J(r)&&r.generation===i))return Rr(e)}).catch(e=>{console.warn(`Triage sync handler error:`,e)})}function Gr(e){for(let e of q.values())e.pending=null,e.pendingSave=!1,Mr(e),Y(e);K()}function Kr(e){Ur++,Hr=Promise.resolve();for(let e of q.values())e.generation++,e.encrypting=!1,e.receiving=!1,e.pending=null,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,e.pendingSave=!0,Sr(e);K()}G.addConsumer({onMessage:Wr,onConnected:Gr,onDisconnected:Kr});function qr(){tr()?Zn||=G.acquire():Zn&&=(Zn.release(),null)}function Jr(e){qn=typeof e==`function`?e:()=>{}}function Yr(e){Jn=typeof e==`function`?e:null}function Xr(e){Jt(e)}function Zr(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&Or(e)}function Qr(e){e.generation++,e.receiving=!1,e.pending=null,e.pendingSave=!1,e.encrypting=!1,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,Sr(e)}var $r={setServerUrl(e){let t=(e??``).trim();if(t===W)return;let n=W;Ur++,Hr=Promise.resolve(),W=t,hr(),In(!1),t&&jn(t),n&&t&&n!==t&&St(null).catch(e=>{console.warn(`Triage sync: failed to drop cached auth password on server change:`,e)}),G.setServerUrl(t);for(let e of q.values()){Qr(e);let n=t?kn(e.workspaceId,t):null;e.baseRevision=n?.baseRevision??null,e.appliedRevisions.clear(),e.baseState=n?.baseState??Object.create(null),e.hasBase=n?.hasBase===!0||e.baseRevision!==null||Object.keys(e.baseState).length>0,e.savesSinceKeyframe=n?.savesSinceKeyframe??0,e.localState=pn(e.baseState,e.ids),Zr(e)}qr(),K()},setEnabled(e){let t=!!e;if(t!==Yn){if(Yn=t,Un(Gn,t?`1`:`0`).catch(e=>{console.warn(`Triage sync: could not persist user-enabled:`,e)}),tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},isEnabled(){return Yn},setForcedOff(e){let t=!!e;if(t!==Xn){if(Xn=t,tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},getServerUrl(){return W},get connected(){return G.getSocket()?.readyState===WebSocket.OPEN},get status(){return sr()},onStatusChange(e){return rr.add(e),()=>rr.delete(e)},onServerInfo(e){if(ir.add(e),ar!=null)try{e(ar)}catch{}return()=>ir.delete(e)},setProtocolLocked(e){G.setProtocolLocked(e)},notify(){if(!(yr>0))for(let e of q.values())Y(e)},ensureSubscription(e){let t=q.has(e);$r.openSession(e);let n=q.get(e);if(!n)return null;let r=new Promise(e=>{n.objstoreResourceWaiters.push(e)});return t&&Mr(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||q.has(e)||!Bn().find(t=>t.id===e))return;let t=wr(e),n=kn(e,W),r=n?.baseState??Object.create(null);mn(r,t);let i={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:t,baseRevision:n?.baseRevision??null,appliedRevisions:new Set,baseState:r,hasBase:n?.hasBase===!0||n?.baseRevision!=null||Object.keys(r).length>0,savesSinceKeyframe:n?.savesSinceKeyframe??0,localState:pn(r,t),pending:null,pendingSave:!1,key:null,encrypting:!1,receiving:!1,generation:0,subscribed:!1,subscribeAcked:!1,resyncAttempted:!1,staleResetAttempted:!1,consecutiveFailures:0,error:null,busyRetryTimer:null,objstoreResourceWaiters:[]};q.set(e,i),Or(i),qr(),K()},closeSession(e){if(e==null){for(let e of q.values())Cr(e);q.clear()}else{let t=q.get(e);t&&Cr(t),q.delete(e)}K()},refreshSession(e){let t=q.get(e);if(!t){console.debug(`triage-sync: refreshSession bail — no session for`,e,`(caller must openSession first)`);return}ei(t)},sessionInfo(e){let t=q.get(e);return t?{workspaceId:t.workspaceId,workspaceTag:t.workspaceTag,baseRevision:t.baseRevision,pending:t.pending&&{base:t.pending.base,keyframe:t.pending.keyframe},pendingSave:t.pendingSave,keyReady:t.key!==null,encrypting:t.encrypting,tracked:t.ids.size,savesSinceKeyframe:t.savesSinceKeyframe??0,error:t.error??null}:null},get openSessions(){return[...q.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...q.keys()]:[e],n=!1;for(let e of t){let t=q.get(e);!t||!t.error||(t.error=null,t.consecutiveFailures=0,n=!0,!t.key||!t.signingKey?Or(t):G.getSocket()?.readyState===WebSocket.OPEN&&(Mr(t),Y(t)))}n&&K()},get persistenceDegraded(){return Cn()},onPersistenceDegraded(e){return Tn(e)},get proxyAuthRequired(){return Fn()},onProxyAuthRequired(e){return Ln(e)}};_t(e=>{zn=e.state,Bn=e.listWorkspaces,Vn=e.saveTriage,Hn=e.getSecureItem,Un=e.setSecureItem,e.onSecureStorageHydrated(Er);try{localStorage.removeItem(Wn),Hn(Gn)===`0`&&(Yn=!1),qr()}catch{}e.onWorkspaceDeleted(e=>{let t=q.get(e);t&&Sr(t);let n=q.delete(e);Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)}),qr(),n&&K()}),e.onWorkspacePrivateKeyChanged(e=>{let t=q.get(e);if(!t){Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)});return}t.signingKey=null,t.key=null,t.verifyingKey=null,t.workspaceTag=null,Qr(t),t.keyDerivationGen=(t.keyDerivationGen??0)+1,(async()=>{await Mn(e),q.delete(e),$r.openSession(e),K()})().catch(t=>{console.warn(`Triage sync: privateKey rotation IIFE failed:`,t),q.delete(e),K()})}),e.onReportMembershipChanged(e=>{$r.openSession(e);let t=q.get(e);t&&ei(t)}),jn()});function ei(e){let t=e.generation,{conflicts:n,hydrated:r}=Tr(e);(async()=>{if(n.length===0){r?await Vn():Y(e);return}let i=null;if(Jn)try{i=await Jn(n,e.baseState,`attach`)}catch(e){console.warn(`Triage sync: hydration conflict resolver failed:`,e)}!J(e)||e.generation!==t||(i&&hn(n.filter(({id:t})=>e.ids.has(t)),i),await Vn())})().catch(e=>{console.warn(`Triage sync: refreshAndPropagate failed:`,e)})}var ti,ni,ri,ii,ai,oi,si,ci,li,ui,di,fi,X=new Map,pi=2e3,mi={setTimeout:(e,t)=>setTimeout(e,t)},hi=new Map,gi=new Set;function Z(e,t){try{let n={names:Object.fromEntries(t.remoteNameByTag),bundles:Object.fromEntries(t.remoteBundleByTag),bundleNames:Object.fromEntries(t.remoteBundleNameByIntegrity),baselines:Object.fromEntries(t.baselines),localVersions:Object.fromEntries([...t.baselines].filter(([,e])=>e.synced).map(([e,t])=>[e,t.version]))};localStorage.setItem(c(e),JSON.stringify(n))}catch(t){console.warn(`objstore-presence: cache persist failed for ${e}:`,t)}}function _i(e){try{localStorage.removeItem(c(e))}catch{}}var vi=null;function yi(e){return vi||=Ht({serverUrl:``,httpOrigin:e,transport:Xt()}),vi}var bi=new Set,xi=new Set;function Q(){for(let e of gi)try{e()}catch{}}function Si(e){if(e==null)return``;if(e instanceof Error&&e.message)return`: ${e.message}`;if(typeof e==`string`&&e)return`: ${e}`;if(typeof e==`object`&&typeof e.message==`string`&&e.message)return`: ${e.message}`;try{return`: ${String(e)}`}catch{return``}}var Ci=256;function wi(e){return typeof e==`string`?e.length<=Ci?e:e.slice(0,Ci):``}function Ti(e){try{let t=new URL(e);return t.protocol=t.protocol===`wss:`?`https:`:`http:`,t.pathname=`/`,t.search=``,t.hash=``,t.origin}catch{return null}}function Ei(e){if(X.has(e))return;let t=ti().find(t=>t.id===e);if(!t)return;let n=$r.ensureSubscription(e);if(!n)return;let r={workspaceId:e,session:null,keys:null,remoteTags:new Set,fileTags:new Map,bundleTags:new Map,remoteNameByTag:new Map,remoteBundleByTag:new Map,remoteBundleNameByIntegrity:new Map,remoteMeta:new Map,baselines:new Map,localChanged:new Set,selfWrites:new Map,selfWriteNotices:new Map,tagLocks:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};X.set(e,r),r.ready=(async()=>{if(r.keys=await at(t.privateKey,t.id),r.disposed)return;let a=new Map;for(let e of t.reports??[]){let t=await U(r.keys.tagKey,e);r.fileTags.set(e,t),a.set(t,e)}if(r.disposed)return;let o=new Map;for(let e of t.bundles??[]){let t=await st(r.keys.tagKey,e);r.bundleTags.set(e,t),o.set(t,e)}if(r.disposed)return;try{let e=await si();if(r.disposed)return;for(let t of e)r.bundleTags.has(t.integrity)&&r.remoteBundleNameByIntegrity.set(t.integrity,t.name)}catch(t){console.warn(`objstore-presence: listBundles failed during ${e} open:`,t)}Q();let s=$r.getServerUrl();if(!s)return;let c=Ti(s);if(c)try{let t=await yi(c).openWorkspace(r.keys,n);if(r.disposed){try{t.close()}catch{}return}r.session=t,i();let s=await t.list();if(r.disposed)return;for(let e of s)r.remoteTags.add(e.resourceTag),Hi(r,e.resourceTag,e.version,e.incarnation);let u=l(e),d=!1;if(u)for(let[e,t]of Object.entries(u.baselines))(r.remoteTags.has(e)||a.has(e))&&r.baselines.set(e,t);for(let e of r.remoteTags){let t=a.get(e);t!==void 0&&!r.remoteNameByTag.has(e)&&(r.remoteNameByTag.set(e,t),d=!0);let n=o.get(e);if(n!==void 0&&!r.remoteBundleByTag.has(e)&&(r.remoteBundleByTag.set(e,n),d=!0),u){let t=u.names[e];typeof t==`string`&&!r.remoteNameByTag.has(e)&&!r.remoteBundleByTag.has(e)&&(r.remoteNameByTag.set(e,t),r.fileTags.set(t,e),d=!0);let n=u.bundles[e];if(typeof n==`string`&&!r.remoteBundleByTag.has(e)&&!r.remoteNameByTag.has(e)){r.remoteBundleByTag.set(e,n),r.bundleTags.set(n,e);let t=u.bundleNames[n];typeof t==`string`&&!r.remoteBundleNameByIntegrity.has(n)&&r.remoteBundleNameByIntegrity.set(n,t),d=!0}}}(d||u)&&Z(e,r),Q(),ia(r);for(let e of r.remoteTags)Ui(r.baselines.get(e),r.remoteMeta.get(e))&&ca(r,e).catch(()=>{});Qi(r).catch(()=>{})}catch(e){r.err=e}})();function i(){let t=r.session;t.onPut(({resourceTag:e,version:t,incarnation:n})=>{let i=r.remoteMeta.get(e),a=r.remoteTags.has(e)&&i!==void 0&&(i.incarnation!==n||t>i.version);if(r.remoteTags.add(e),Hi(r,e,t,n),Q(),a){ca(r,e).catch(()=>{});return}ia(r)}),t.onDeleted(({resourceTag:t})=>{r.remoteTags.delete(t),r.remoteMeta.delete(t);let n=r.remoteNameByTag.get(t);r.remoteNameByTag.delete(t);let i=ti().find(t=>t.id===e),a=i?.reports??[],o=i?.bundles??[];n&&!a.includes(n)&&r.fileTags.delete(n);let s=r.remoteBundleByTag.get(t);r.remoteBundleByTag.delete(t),s&&(r.remoteBundleNameByIntegrity.delete(s),o.includes(s)||r.bundleTags.delete(s)),Z(e,r),Q()})}r.ready.catch(()=>{})}function Di(e){let t=X.get(e);if(t){t.disposed=!0;try{t.session?.close()}catch{}if(t.keys){try{t.keys.contentKey.fill(0)}catch{}try{t.keys.tagKey.fill(0)}catch{}t.keys=null}X.delete(e),Q()}}_t(e=>{ti=e.listWorkspaces,ni=e.addReportToWorkspace,ri=e.addBundleToWorkspace,ii=e.analyzeContent,ai=e.setCount,oi=e.gunzipBytes,si=e.listBundles,ci=e.listFiles,li=e.readBundle,ui=e.readFileBytes,di=e.saveBundle,fi=e.saveFileBytes,e.onFileMutated?.((e,t)=>{for(let n of X.values()){let r=n.fileTags.get(e);if(r!==void 0){if(t===`delete`){n.localChanged.delete(r)&&Q();continue}if(n.selfWrites.has(e)){n.selfWriteNotices.set(e,(n.selfWriteNotices.get(e)??0)+1);continue}hi.has(e)||Xi(n,r,e)}}}),e.onReportMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.reports??[])t.fileTags.has(r)||Ai(e,r).catch(()=>{})}),e.onBundleMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.bundles??[])t.bundleTags.has(r)||Mi(e,r).catch(()=>{})}),e.onWorkspaceDeleted(e=>{Di(e),_i(e)}),e.onWorkspacePrivateKeyChanged(e=>{X.has(e)&&(Di(e),_i(e),Ei(e))})});function Oi(){return Array.from(X.keys())}function ki(e,t){let n=X.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function Ai(e,t){let n=X.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await U(n.keys.tagKey,t)),n.disposed||Q()))}function ji(e,t){let n=X.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function Mi(e,t){let n=X.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await st(n.keys.tagKey,t)),n.disposed||Q()))}function Ni(e){return gi.add(e),()=>gi.delete(e)}function Pi(e){return bi.add(e),()=>bi.delete(e)}function Fi(e){return xi.add(e),()=>xi.delete(e)}function Ii(e){hi.set(e,(hi.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let n=hi.get(e)-1;if(n>0){hi.set(e,n);return}hi.delete(e);for(let t of X.values()){let n=t.fileTags.get(e);n!==void 0&&Zi(t,n,e).catch(()=>{})}}}function Li(e){let t=X.get(e);return t?(ti().find(t=>t.id===e)?.reports??[]).filter(e=>{let n=t.fileTags.get(e);return n!==void 0&&Ji(t,n)}):[]}function Ri(e){let t=X.get(e);return t?t.remoteTags.size:0}async function zi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function Bi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function Vi(e,t){let n=X.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}function Hi(e,t,n,r){let i=e.remoteMeta.get(t);i&&i.incarnation===r&&i.version>=n||e.remoteMeta.set(t,{version:n,incarnation:r})}function Ui(e,t){return!e||!t?!1:e.incarnation===null?t.version!==e.version:e.incarnation!==t.incarnation||t.version>e.version}function Wi(e,t){let n=e.baselines.get(t);return!!n&&n.incarnation!==null}function Gi(e,t){return!!e&&e.synced&&e.incarnation===t.incarnation&&e.version===t.version}function $(e,t,n,r,i=null){let a=Ji(e,t);e.baselines.set(t,{version:n.version,incarnation:n.incarnation,synced:r,hash:r?i:null}),e.localChanged.delete(t),!e.disposed&&Ji(e,t)!==a&&Q()}function Ki(e,t){return!!e&&e.synced&&!!e.hash&&!!t&&e.hash!==t}function qi(e,t){return!!e&&!e.synced||Ki(e,t)}function Ji(e,t){if(!e.remoteTags.has(t))return!1;if(e.localChanged.has(t))return!0;let n=e.baselines.get(t);return!!n&&!n.synced}async function Yi(e,t,n){e.selfWrites.set(t,(e.selfWrites.get(t)??0)+1);try{await fi(t,n),e.selfWriteNotices.set(t,(e.selfWriteNotices.get(t)??0)-1)}finally{let n=e.selfWrites.get(t)-1;if(n>0)e.selfWrites.set(t,n);else{e.selfWrites.delete(t);let n=e.selfWriteNotices.get(t)??0;e.selfWriteNotices.delete(t);let r=e.fileTags.get(t);n>0&&r!==void 0&&!e.disposed&&Xi(e,r,t)}}}function Xi(e,t,n){mi.setTimeout(()=>Zi(e,t,n).catch(()=>{}),pi)}function Zi(e,t,n){return $i(e,t,async()=>{if(hi.has(n))return;let r=e.baselines.get(t);if(e.disposed||!r?.synced||!r.hash)return;let i;try{i=await ui(n)}catch{return}let a=await o(i);if(e.disposed||e.baselines.get(t)!==r)return;let s=r.hash!==a;s!==e.localChanged.has(t)&&(s?e.localChanged.add(t):e.localChanged.delete(t),Q())})}async function Qi(e){let t=ti().find(t=>t.id===e.workspaceId);for(let n of t?.reports??[]){if(e.disposed)return;let t=e.fileTags.get(n);if(t!==void 0&&e.baselines.get(t)?.hash)try{await Zi(e,t,n)}catch{}}}function $i(e,t,n){let r=(e.tagLocks.get(t)??Promise.resolve()).then(()=>n()),i=r.catch(()=>{}).finally(()=>{e.tagLocks.get(t)===i&&e.tagLocks.delete(t)});return e.tagLocks.set(t,i),r}function ea(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}async function ta(e,t){let n;try{n=await ui(e)}catch{return{same:null,hash:null}}let r=await o(n);if(ea(n,t))return{same:!0,hash:r};try{let[e,i]=await Promise.all([oi(n),oi(t)]);return{same:ea(e,i),hash:r}}catch{return{same:!1,hash:r}}}async function na(e,t,n,r){let i;try{i=x(await oi(n.content))}catch(e){throw Error(`gunzip/decode of "${n.fileName}" failed (likely forged peer payload)`,{cause:e})}if(!r())return!1;let a=ii(i);if(!a.recognized)throw Error(`cloud copy of "${n.fileName}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);if(await Yi(e,n.fileName,n.content),e.disposed)return!1;ai(n.fileName,a.count,a.source),$(e,t,n,!0,await o(n.content)),Z(e.workspaceId,e);for(let t of bi)try{t(e.workspaceId,n.fileName)}catch{}return!0}async function ra(e,t,n,r,{keepLocalChanges:i=!0}={}){let{same:a,hash:o}=await ta(n.fileName,n.content);return r()?a?($(e,t,n,!0,o),Z(e.workspaceId,e),!1):i&&a===!1&&qi(e.baselines.get(t),o)?($(e,t,n,!1),Z(e.workspaceId,e),!1):await na(e,t,n,r):!1}async function ia(e){if(!e.session||e.disposed)return;let t=ti().find(t=>t.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),i=new Set;try{i=new Set(await ci())}catch(t){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,t)}if(e.disposed||!e.session)return;let a=[];for(let t of e.remoteTags){let o=e.remoteNameByTag.get(t);if(o!==void 0&&n.has(o)&&i.has(o)&&Wi(e,t))continue;if(e.remoteBundleByTag.has(t)){let n=e.remoteBundleByTag.get(t);if(e.remoteBundleNameByIntegrity.has(n)&&r.has(n))continue}let s=e.inFlight.get(t);if(!s){let n=e.remoteMeta.get(t),r=()=>e.disposed||!e.remoteTags.has(t)||e.remoteMeta.get(t)===n?null:ia(e).then(()=>null,()=>null);s=e.session.fetchByTag(t).then(async n=>(e.inFlight.delete(t),e.disposed?null:n?e.remoteTags.has(t)?n.kind===`bundle`?(e.remoteBundleByTag.set(t,n.integrity),e.bundleTags.set(n.integrity,t),n.name&&e.remoteBundleNameByIntegrity.set(n.integrity,n.name),await la(e,t,n.integrity,n.name,n.content),null):(e.remoteNameByTag.set(t,n.fileName),e.fileTags.set(n.fileName,t),await aa(e,t,n),null):null:r()),()=>(e.inFlight.delete(t),r())),e.inFlight.set(t,s)}a.push(s)}a.length!==0&&(await Promise.all(a),!e.disposed&&(Z(e.workspaceId,e),Q()))}async function aa(e,t,n){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{await oa(e,t,n),!e.disposed&&e.remoteTags.has(t)&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t).catch(()=>{})})}async function oa(e,t,n){let r=n.fileName,i=n.content;if(e.disposed||!e.remoteTags.has(t))return;let a=ti().find(t=>t.id===e.workspaceId),s=!!(a&&Array.isArray(a.reports)&&a.reports.includes(r)),c;try{let n=await ci();if(e.disposed||!e.remoteTags.has(t))return;c=n.includes(r)}catch(e){console.warn(`auto-download: listFiles failed before saving "${r}":`,e);return}if(c){if(s){await sa(e,t,n);return}if(e.disposed||!e.remoteTags.has(t))return;try{await ni(r,e.workspaceId)}catch(t){console.warn(`auto-download: attaching local "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(e.disposed)return;if(!e.baselines.has(t)){let{same:a,hash:o}=await ta(r,i);if(e.disposed)return;a!==null&&($(e,t,n,a,o),Z(e.workspaceId,e))}for(let t of bi)try{t(e.workspaceId,r)}catch{}return}let l;try{l=x(await oi(i))}catch(e){console.warn(`auto-download: gunzip/decode of "${r}" failed (likely forged peer payload):`,e);return}if(e.disposed||!e.remoteTags.has(t))return;let u=ii(l);if(u.recognized){try{if(await Yi(e,r,i),e.disposed||!e.remoteTags.has(t)||(ai(r,u.count,u.source),$(e,t,n,!0,await o(i)),!e.remoteTags.has(t)))return;await ni(r,e.workspaceId),Z(e.workspaceId,e)}catch(t){console.warn(`auto-download: persisting "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of bi)try{t(e.workspaceId,r)}catch{}}}async function sa(e,t,n){let r=()=>!e.disposed&&e.remoteTags.has(t),{same:i,hash:a}=await ta(n.fileName,n.content);if(!r()||i===null)return;let o=e.baselines.get(t);if(i){(!Gi(o,n)||o.hash!==a)&&($(e,t,n,!0,a),Z(e.workspaceId,e));return}if(Ui(o,n)&&!qi(o,a)){try{await na(e,t,n,r)}catch(e){console.warn(`auto-download: ${e.message}`,e)}return}if(!o||o.incarnation===null||Ui(o,n)){$(e,t,n,!1),Z(e.workspaceId,e);return}Ki(o,a)&&!e.localChanged.has(t)&&(e.localChanged.add(t),Q())}async function ca(e,t,n=0){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{let r=()=>!e.disposed&&e.remoteTags.has(t);if(!r())return;let i=e.baselines.get(t);if(i?.synced&&!Ui(i,e.remoteMeta.get(t)))return;let a;try{a=await e.session.fetchByTag(t)}catch(t){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,t);return}if(a&&r()&&a.kind!==`bundle`){e.remoteNameByTag.set(t,a.fileName),e.fileTags.set(a.fileName,t);try{await ra(e,t,a,r)}catch(e){console.warn(`replace-refetch: ${e.message}`,e);return}n<2&&r()&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t,n+1).catch(()=>{})}})}async function la(e,t,n,r,i){if(e.disposed||!e.remoteTags.has(t))return;let a;try{a=await si()}catch(e){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,e);return}if(e.disposed||!e.remoteTags.has(t))return;if(a.some(e=>e.integrity===n)){try{await ri(n,e.workspaceId)}catch(e){console.warn(`auto-download: attach pre-existing bundle failed:`,e);return}if(e.disposed)return;let t=a.find(e=>e.integrity===n)?.name??``;for(let r of xi)try{r(e.workspaceId,n,t)}catch{}return}let o=await _(i);if(e.disposed||!e.remoteTags.has(t))return;if(o!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${o}) \u2014 refusing to save`);return}let s=wi(r&&r.length>0?r:`bundle-${n.slice(7,15)}`);try{if(await di(s,i),e.disposed||!e.remoteTags.has(t))return;await ri(n,e.workspaceId)}catch(t){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of xi)try{t(e.workspaceId,n,s)}catch{}}async function ua(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw Error(`Objstore session is not connected${Si(e.err)}`)}async function da(e){let t=await e(null);return!t.ok&&t.reason===`conflict`&&t.current&&(t=await e(t.current)),t}async function fa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);return await ua(n),n.session.fetch(t)}async function pa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let r=n.fileTags.get(t)??await U(n.keys.tagKey,t),i=await $i(n,r,async()=>{let i=await n.session.fetch(t);if(!i)return{ok:!1,reason:`not found in remote`};let a;try{a=x(await oi(i.content))}catch{return{ok:!1,reason:`remote payload is not gzipped UTF-8`}}let s=ii(a);return s.recognized?(await Yi(n,t,i.content),ai(t,s.count,s.source),n.disposed||(n.fileTags.set(t,r),$(n,r,i,!0,await o(i.content)),Z(e,n)),{ok:!0}):{ok:!1,reason:`remote payload is not a recognized report format`}});return i.ok&&await ni(t,e),i}async function ma(e,t,n){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.fileTags.get(t)??await U(r.keys.tagKey,t);return await $i(r,i,async()=>{let e=await da(e=>r.session.put({fileName:t,content:n,prev:e}));if(e.ok)try{await ha(r,t,i,e.meta,n)}catch{}return e})}async function ha(e,t,n,r,i){let a=await o(i);e.disposed||(e.fileTags.set(t,n),$(e,n,r,!0,a),Z(e.workspaceId,e),Ui(e.baselines.get(n),e.remoteMeta.get(n))&&ca(e,n).catch(()=>{}))}async function ga(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.fileTags.has(t)||n.fileTags.set(t,await U(n.keys.tagKey,t));let r=n.fileTags.get(t);return await $i(n,r,async()=>{let e=await da(e=>n.session.delete(t,e));return e.ok&&(n.remoteTags.delete(r),n.remoteNameByTag.delete(r),n.remoteMeta.delete(r),n.baselines.delete(r),Q()),e})}finally{n&&Di(e)}}async function _a(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await li(t),i=(await si()).find(e=>e.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await da(e=>n.session.putBundle({integrity:t,name:i,content:r,prev:e}))}async function va(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:`not-found`};if(await _(r.content)!==t)return{ok:!1,reason:`integrity-mismatch`};let i=wi(r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`);await di(i,r.content);for(let n of xi)try{n(e,t,i)}catch{}return{ok:!0,integrity:t,name:i}}async function ya(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.bundleTags.has(t)||n.bundleTags.set(t,await st(n.keys.tagKey,t));let r=n.bundleTags.get(t),i=await da(e=>n.session.deleteBundle(t,e));return i.ok&&(n.remoteTags.delete(r),n.remoteBundleByTag.delete(r),Q()),i}finally{n&&Di(e)}}async function ba(e,{onList:t,onItem:n}={}){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.keys.tagKey,a=new Set,o=r.session.onDeleted(e=>{a.add(e.resourceTag)});try{let o=await xa(r,e),s=await Pa(),c=await Fa(),l=new Map;for(let e of s)l.set(await U(i,e),e);let u=new Map;for(let e of c)u.set(await st(i,e.integrity),e.integrity);let d=o.map(e=>{let t=l.get(e.resourceTag),n=u.get(e.resourceTag);return{resourceTag:e.resourceTag,kind:Aa(r,e.resourceTag,t,n),label:ja(r,e.resourceTag,t,n),contentLength:e.contentLength,reportName:t,bundleIntegrity:n,identifier:t??n,status:`checking`}});if(typeof t==`function`)try{t(d.map(Ma))}catch{}let f={good:0,updated:0,uploaded:0,differs:0,reuploaded:0,failed:0,"check-failed":0,missing:0};for(let t of d)if(t.status=await Ca(r,e,t,a),f[t.status]+=1,typeof n==`function`)try{n(Ma(t))}catch{}return{items:d.map(Ma),counts:f}}finally{o()}}async function xa(e,t){try{let e=$r.ensureSubscription(t);if(e){let t=await Na(e.resources,1e4);if(Array.isArray(t))return Sa(t)}}catch(e){console.warn(`objstore-recovery: fresh DB listing for ${t} failed; using cached inventory:`,e)}try{return(await e.session.list()).map(e=>({resourceTag:e.resourceTag,contentLength:e.contentLength}))}catch{return[]}}function Sa(e){let t=[];for(let n of e)!n||typeof n!=`object`||typeof n.resourceTag==`string`&&t.push({resourceTag:n.resourceTag,contentLength:Number.isSafeInteger(n.contentLength)?n.contentLength:null});return t}async function Ca(e,t,n,r){let i;try{i=await e.session.fetchByTag(n.resourceTag)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}return i?i.kind===`report`?(n.kind=`report`,n.label=i.fileName,n.identifier=i.fileName,await wa(e,t,n,i,r)):(n.kind=`bundle`,n.label=i.name??n.label,n.bundleIntegrity=i.integrity,n.identifier=i.integrity,`good`):r.has(n.resourceTag)?`missing`:n.reportName===void 0?n.bundleIntegrity===void 0?`missing`:await ka(t,n,r):await Oa(t,n,r)}async function wa(e,t,n,r,i){let a=ti().find(e=>e.id===t);if(!a||!Array.isArray(a.reports)||!a.reports.includes(r.fileName))return`good`;let o=n.resourceTag,s=()=>!e.disposed&&!i.has(o);return await $i(e,o,async()=>{let i=r;if(Ta(e,o,i)){let t;try{t=await e.session.fetchByTag(o)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}if(!t||!s())return`missing`;if(t.kind!==`report`)return`good`;i=t}let{same:a,hash:c}=await ta(i.fileName,i.content);if(!s())return`missing`;let l=e.baselines.get(o);if(a)return(!Gi(l,i)||l.hash!==c)&&($(e,o,i,!0,c),Z(t,e)),`good`;if(a===!1&&Gi(l,i)){let t=await Ea(e,o,i.fileName,i,s);return n.detail=t.detail,t.status}if(a===null||Ui(l,i)&&!qi(l,c))try{return await na(e,o,i,s)?`updated`:`missing`}catch(e){return n.detail=`updating your copy failed: ${e?.message??String(e)}`,console.warn(`objstore-recovery: updating the local copy of "${i.fileName}" failed:`,e),`failed`}return $(e,o,i,!1),Z(t,e),n.compared={version:i.version,incarnation:i.incarnation},`differs`})}function Ta(e,t,n){return[e.baselines.get(t),e.remoteMeta.get(t)].some(e=>e&&e.incarnation===n.incarnation&&e.version>n.version)}async function Ea(e,t,n,r,i){try{let a=await ui(n);if(!i())return{status:`missing`};let s=await e.session.put({fileName:n,content:a,prev:{version:r.version,incarnation:r.incarnation}});return s.ok?($(e,t,s.meta,!0,await o(a)),Z(e.workspaceId,e),{status:`uploaded`}):{status:`failed`,detail:s.reason===`conflict`?`the cloud copy changed since it was compared — re-check again`:`upload rejected: ${s.reason??`unknown`}`}}catch(e){return console.warn(`objstore-recovery: uploading the local copy of "${n}" failed:`,e),{status:`failed`,detail:`upload error: ${e?.message??String(e)}`}}}async function Da(e,t,n,r){if(n!==`cloud`&&n!==`local`)throw TypeError(`resolveReportDifference: keep must be 'cloud' or 'local', got ${String(n)}`);if(n===`local`&&(!r||!Number.isSafeInteger(r.version)||typeof r.incarnation!=`string`))throw TypeError(`resolveReportDifference: keeping the local copy needs the compared cloud state ({ version, incarnation })`);let i=X.get(e);if(!i)throw Error(`Workspace ${e} is not open`);if(await ua(i),!i.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let a=i.fileTags.get(t)??await U(i.keys.tagKey,t),o=()=>!i.disposed;return await $i(i,a,async()=>{if(n===`local`)return await Ea(i,a,t,r,o);try{let e=await i.session.fetch(t);if(!e)return{status:`missing`,detail:`the report is no longer in the cloud`};let n={fileName:t,content:e.content,version:e.version,incarnation:e.incarnation};return{status:await ra(i,a,n,o,{keepLocalChanges:!1})?`updated`:`good`}}catch(e){return console.warn(`objstore-recovery: replacing the local copy of "${t}" with the cloud copy failed:`,e),{status:`failed`,detail:`updating your copy failed: ${e?.message??String(e)}`}}})}async function Oa(e,t,n){let r;try{r=await ui(t.reportName)}catch{return`missing`}if(t.contentLength==null||lt(t.reportName,r.length)!==t.contentLength||n.has(t.resourceTag))return`missing`;try{let n=await ma(e,t.reportName,r);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: re-upload of "${t.reportName}" failed:`,e),`failed`}}async function ka(e,t,n){try{await li(t.bundleIntegrity)}catch{return`missing`}if(n.has(t.resourceTag))return`missing`;try{let n=await _a(e,t.bundleIntegrity);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: bundle re-upload of "${t.bundleIntegrity}" failed:`,e),`failed`}}function Aa(e,t,n,r){return n===void 0?r!==void 0||e.remoteBundleByTag.has(t)?`bundle`:e.remoteNameByTag.has(t)?`report`:`unknown`:`report`}function ja(e,t,n,r){if(n!==void 0)return n;if(r!==void 0)return e.remoteBundleNameByIntegrity.get(r)??r;let i=e.remoteNameByTag.get(t);if(i!==void 0)return i;let a=e.remoteBundleByTag.get(t);return a===void 0?`${t.slice(0,10)}\u2026`:e.remoteBundleNameByIntegrity.get(a)??a}function Ma(e){let t={resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier,detail:e.detail};return e.compared&&(t.compared=e.compared),t}function Na(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let i=new Promise((e,r)=>{n=setTimeout(()=>r(Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,i]).finally(()=>clearTimeout(n))}async function Pa(){try{return await ci()}catch(e){return console.warn(`objstore-recovery: listFiles failed; treating as no local reports:`,e),[]}}async function Fa(){try{return await si()}catch(e){return console.warn(`objstore-recovery: listBundles failed; treating as no local bundles:`,e),[]}}export{Di as closeWorkspace,ya as deleteBundleFromRemote,ga as deleteFromRemote,Li as differingReports,Bi as discoverRemoteBundleIntegrities,zi as discoverRemoteFileNames,pa as downloadFileFromRemote,va as fetchBundleFromRemote,fa as fetchFile,Ii as holdLocalChangeChecks,ht as installSyncHost,ji as isBundleInRemote,ki as isInRemote,Pi as onAutoDownloaded,Fi as onBundleAutoDownloaded,Ni as onChange,Ei as openWorkspace,Oi as openWorkspaceIds,_a as putBundleToRemote,ma as putFile,ba as recheckRemoteStorage,Vi as remoteBundleName,Ri as remoteCount,Da as resolveReportDifference,Xr as setAuthenticationResolver,Yr as setHydrationConflictResolver,Jr as setRedraw,$r as triageSync};
|
|
12
12
|
/*! Bundled license information:
|
|
13
13
|
|
|
14
14
|
@noble/ciphers/utils.js:
|
|
15
|
-
|
|
15
|
+
(*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) *)
|
|
16
16
|
*/
|