@3sln/trove 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/package.json +1 -1
  2. package/packages/core/src/collections/index.js +146 -1
  3. package/packages/core/src/encryption/envelope.js +483 -0
  4. package/packages/core/src/encryption/exposure.js +101 -0
  5. package/packages/core/src/encryption/keys.js +88 -0
  6. package/packages/core/src/encryption/policy.js +112 -0
  7. package/packages/core/src/encryption/rotation.js +432 -0
  8. package/packages/core/src/index.js +17 -1
  9. package/packages/core/src/links.js +85 -0
  10. package/packages/core/src/metadata/memory.js +3 -1
  11. package/packages/core/src/metadata/sqlite.js +27 -7
  12. package/packages/core/src/scan.js +35 -1
  13. package/packages/core/src/storage/cost.js +228 -0
  14. package/packages/core/src/uploads.js +302 -19
  15. package/packages/core/src/vfs.js +161 -10
  16. package/packages/server/src/adapters/staticAssets.js +14 -5
  17. package/packages/server/src/engine/index.js +1 -1
  18. package/packages/server/src/engine/providers/core.js +21 -2
  19. package/packages/server/src/index.js +45 -2
  20. package/packages/server/src/routes.js +62 -1
  21. package/packages/web/dist/assets/main-jg5vmp8f.js +356 -0
  22. package/packages/web/dist/assets/main-jg5vmp8f.js.map +118 -0
  23. package/packages/web/dist/assets/styles-e5gk19rn.css +1 -0
  24. package/packages/web/dist/index.html +9 -3
  25. package/packages/web/dist/sw.js +1 -1
  26. package/packages/web/src/bl/actions.js +1471 -138
  27. package/packages/web/src/bl/commands.js +103 -284
  28. package/packages/web/src/bl/context.js +69 -0
  29. package/packages/web/src/bl/index.js +136 -40
  30. package/packages/web/src/bl/intern.js +129 -0
  31. package/packages/web/src/bl/launcher.js +251 -0
  32. package/packages/web/src/bl/links.js +1 -1
  33. package/packages/web/src/bl/match.js +71 -0
  34. package/packages/web/src/bl/mentions.js +39 -0
  35. package/packages/web/src/bl/offline.js +0 -4
  36. package/packages/web/src/bl/openers.js +65 -33
  37. package/packages/web/src/bl/pluginInstall.js +42 -21
  38. package/packages/web/src/bl/queries.js +669 -0
  39. package/packages/web/src/bl/services.js +141 -145
  40. package/packages/web/src/bl/social.js +3 -1
  41. package/packages/web/src/bl/state.js +144 -0
  42. package/packages/web/src/bl/status.js +96 -0
  43. package/packages/web/src/bl/trust.js +109 -0
  44. package/packages/web/src/bl/viewState.js +60 -0
  45. package/packages/web/src/bl/views.js +64 -0
  46. package/packages/web/src/bl/watchQuery.js +73 -0
  47. package/packages/web/src/platform/api.js +63 -11
  48. package/packages/web/src/platform/commands.js +49 -9
  49. package/packages/web/src/platform/context.js +146 -51
  50. package/packages/web/src/platform/index.js +27 -20
  51. package/packages/web/src/platform/navigation.js +34 -4
  52. package/packages/web/src/platform/pickers.js +46 -0
  53. package/packages/web/src/platform/pluginHost.js +43 -10
  54. package/packages/web/src/platform/pluginRpc.js +6 -2
  55. package/packages/web/src/platform/spatialNav.js +0 -2
  56. package/packages/web/src/platform/viewport.js +1 -6
  57. package/packages/web/src/platform/voiceSearch.js +1 -3
  58. package/packages/web/src/platform/whenclause.js +22 -3
  59. package/packages/web/src/styles.css +77 -4
  60. package/packages/web/src/ui/activate.js +22 -0
  61. package/packages/web/src/ui/components/activityBar.js +7 -3
  62. package/packages/web/src/ui/components/activityPanel.js +10 -11
  63. package/packages/web/src/ui/components/adminView.js +191 -0
  64. package/packages/web/src/ui/components/collectionGate.js +4 -3
  65. package/packages/web/src/ui/components/commandPalette.js +24 -55
  66. package/packages/web/src/ui/components/editorArea.js +16 -13
  67. package/packages/web/src/ui/components/launcher.js +39 -225
  68. package/packages/web/src/ui/components/openers/index.js +7 -4
  69. package/packages/web/src/ui/components/openers/markdown.js +5 -3
  70. package/packages/web/src/ui/components/overlays.js +169 -43
  71. package/packages/web/src/ui/components/phoneChrome.js +35 -33
  72. package/packages/web/src/ui/components/pluginReview.js +62 -23
  73. package/packages/web/src/ui/components/pluginsView.js +30 -28
  74. package/packages/web/src/ui/components/settingsView.js +151 -58
  75. package/packages/web/src/ui/components/social.js +42 -62
  76. package/packages/web/src/ui/components/statusBar.js +30 -74
  77. package/packages/web/src/ui/components/views/grid.js +3 -2
  78. package/packages/web/src/ui/components/views/index.js +7 -62
  79. package/packages/web/src/ui/components/views/list.js +3 -2
  80. package/packages/web/src/ui/components/views/parts.js +15 -4
  81. package/packages/web/src/ui/compositions/workbench.js +166 -58
  82. package/packages/web/src/ui/region.js +53 -0
  83. package/packages/web/src/workbench.js +17 -15
  84. package/packages/web/dist/assets/main-f0f2tfhp.js +0 -356
  85. package/packages/web/dist/assets/main-f0f2tfhp.js.map +0 -104
  86. package/packages/web/dist/assets/styles-d3cyysgp.css +0 -1
  87. package/packages/web/src/platform/overlay.js +0 -81
  88. package/packages/web/src/platform/workbench.js +0 -156
@@ -0,0 +1,356 @@
1
+ import{a as BH,c as EG,d as CH}from"./chunk-4xqbzebh.js";var gB={};EG(gB,{wbr:()=>I1,video:()=>N1,vdom:()=>N0,ul:()=>dG,u:()=>W1,track:()=>V1,tr:()=>p1,title:()=>ZG,time:()=>D1,thead:()=>m1,th:()=>u1,tfoot:()=>f1,textarea:()=>B6,template:()=>Y6,td:()=>v1,tbody:()=>b1,table:()=>h1,svg:()=>T1,sup:()=>Z1,summary:()=>K6,sub:()=>$1,style:()=>IG,strong:()=>H1,special:()=>GG,span:()=>G1,source:()=>S1,small:()=>X1,slot:()=>E6,settings:()=>$G,select:()=>Q6,section:()=>xG,script:()=>UG,schedule:()=>L6,samp:()=>L1,s:()=>Y1,reconcile:()=>HG,q:()=>E1,progress:()=>A6,pre:()=>cG,portal:()=>_1,picture:()=>j1,param:()=>O1,p:()=>lG,output:()=>e1,option:()=>t1,optgroup:()=>r1,ol:()=>pG,object:()=>P1,noscript:()=>FG,nav:()=>wG,meter:()=>i1,meta:()=>DG,math:()=>w1,mark:()=>K1,map:()=>R1,main:()=>TG,link:()=>WG,li:()=>mG,legend:()=>s1,label:()=>o1,kbd:()=>J1,ins:()=>C1,input:()=>n1,img:()=>M1,iframe:()=>z1,i:()=>B1,html:()=>MC,hr:()=>uG,header:()=>qG,h6:()=>SG,h5:()=>_G,h4:()=>jG,h3:()=>OG,h2:()=>PG,h1:()=>zG,h:()=>LG,form:()=>a1,footer:()=>NG,flush:()=>X6,figure:()=>fG,figcaption:()=>vG,fieldset:()=>d1,embed:()=>q1,em:()=>Q1,dt:()=>bG,dodo:()=>fE,dl:()=>hG,div:()=>yG,dialog:()=>J6,dfn:()=>A1,details:()=>C6,del:()=>eG,dd:()=>gG,datalist:()=>c1,data:()=>tG,colgroup:()=>y1,col:()=>g1,code:()=>rG,clear:()=>G6,cite:()=>iG,caption:()=>k1,canvas:()=>x1,button:()=>l1,br:()=>sG,blockquote:()=>kG,b:()=>oG,audio:()=>F1,aside:()=>VG,article:()=>RG,area:()=>U1,alias:()=>XG,address:()=>MG,abbr:()=>nG,a:()=>aG});var pQ=Symbol("ELEMENT_NODE"),FC=Symbol("ALIAS_NODE"),XB=Symbol("SPECIAL_NODE"),kB=Symbol("OPAQUE_NODE"),_A=Symbol("NODE_STATE");var iX=new Set(["__proto__","constructor","prototype"]),hE=(A,Q)=>Object.prototype.hasOwnProperty.call(A,Q);function rX(A,Q){return typeof Q==="string"&&A.toLowerCase()===Q.toLowerCase()}class GB{constructor(A,Q,B){this.type=A,this.tag=Q,this.args=B}key(A){return this.k=A,this}on(A){return this.hooks=A,this}opaque(){if(this.type!==pQ)throw Error(".opaque() can only be used on element nodes (h).");return this.type=kB,this}}function tX(A,Q){if(A===Q)return!1;if(A&&Q&&typeof A==="object"&&typeof Q==="object"){if(A.constructor!==Q.constructor)return!0;if(Array.isArray(A)){if(A.length!==Q.length)return!0;for(let B=0;B<A.length;B++)if(A[B]!==Q[B])return!0;return!1}if(A.constructor===Object){let B=Object.keys(A);if(B.length!==Object.keys(Q).length)return!0;for(let C of B)if(!hE(Q,C)||A[C]!==Q[C])return!0;return!1}}return!0}function eX(A){return Array.isArray(A)||A!=null&&typeof A[Symbol.iterator]==="function"&&typeof A!=="string"}function AG(A){return(...Q)=>new GB(FC,A,Q)}function QG(A){return(...Q)=>new GB(XB,A,Q)}function BG(A,Q){if(A.namespaceURI==="http://www.w3.org/1999/xhtml")switch(Q){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML"}return A.namespaceURI??A.host?.namespaceURI??"http://www.w3.org/1999/xhtml"}function bE(A){return{originalProps:Object.create(null),newVdom:A}}function V0(A,Q,B){let C=A.ownerDocument.createElementNS(BG(A,Q),Q);return C[_A]=bE(B),C}var vE=new WeakMap;function CG(A){let Q=[],B=A;while(B)if(Q.push(B),B.parentElement)B=B.parentElement;else B=B.getRootNode()?.host;return Q}function yE(A,Q){for(let B of Q)A.add(B)}function JG(A,Q){let B=Q??A?.defaultView??globalThis;return B.Node?.prototype??B.Element?.prototype}function KG(A){let Q=new Set;return A.addEventListener("focusin",(B)=>{Q.clear(),yE(Q,B.composedPath())}),A.addEventListener("focusout",(B)=>{if(!B.relatedTarget)Q.clear()}),yE(Q,CG(A.activeElement)),vE.set(A,Q),Q}var N0=(A)=>{let Q=A?.shouldUpdate??tX,B=A?.isMap??(($)=>$?.constructor===Object),C=A?.mapIter??(($)=>Object.entries($)),J=A?.mapGet??(($,W)=>$[W]),K=A?.mapMerge??((...$)=>Object.assign({},...$)),E=A?.newMap??(($)=>({...$})),Y=A?.mapPut??(($,W,D)=>{return $[W]=D,$}),L=A?.isSeq??eX,X=A?.seqIter??(($)=>$),H=A?.convertName??(($)=>$),G=A?.convertTagName??H,Z=A?.convertPropName??H,M=A?.convertStyleName??H,I=A?.convertDataName??H,F=A?.convertClassName??H,V=A?.convertHookName??H,g=A?.listenerKey??"listener",u=A?.captureKey??"capture",j=A?.passiveKey??"passive",T=E({});function c($){if($==null)return[][Symbol.iterator]();if(typeof $[Symbol.iterator]==="function")return $[Symbol.iterator]();if(typeof $.next==="function")return $;return[$][Symbol.iterator]()}function y($,W,D,P,x){if($==null)return;for(let S in $)if(hE($,S))W(S,$[S],D,P,x)}function b($,W,D,P,x){if($==null)return;let S=c(C($)),n;while(!(n=S.next()).done){let GA=n.value;W(GA[0],GA[1],D,P,x)}}let q=A?.mapEach??(A?.mapIter?b:y);function k($){return $===null||$===void 0||$===!1}function AA($,W,D){let P=c(X(W)),x;while(!(x=P.next()).done){let S=x.value;if(D&&k(S))continue;if(!L(S))$.push(S);else AA($,S,D)}}function QA($,W){let D=[];return AA(D,$,W),D}let BA=A?.flattenSeq??QA;function AQ($,W){let D=[];for(let P=W;P<$.length;P++){let x=$[P];if(k(x))continue;if(!L(x))D.push(x);else AA(D,x,!0)}return D}function IA($){return k($)?"":String($)}function UA($,W,...D){if(!B(W)){if(W!==null&&W!==void 0)D.unshift(W);W=T}return new GB(pQ,G($),[W,...D])}function LA($,W,D){D.setProperty(M($),W)}function e($,W,D,P){if(J(P,$)!==void 0)return;D.removeProperty(M($))}function DA($,W,D){let P=$.style;q(D,LA,P),q(W,e,P,D)}function XA($,W,D){D.setAttribute(Z($),W)}function uQ($,W,D,P){if(J(P,$)!==void 0)return;D.removeAttribute(Z($))}function qA($,W,D){q(D,XA,$),q(W,uQ,$,D)}function oA($,W,D){D.dataset[I($)]=W}function zA($,W,D,P){if(J(P,$)!==void 0)return;delete D.dataset[I($)]}function FA($,W,D){q(D,oA,$),q(W,zA,$,D)}function t($,W,D){let P=new Set;for(let x of BA(W,!0)){let S=F(x);if(S)P.add(S)}for(let x of BA(D,!0)){let S=F(x);if(!S)continue;P.delete(S),$.classList.add(S)}for(let x of P)$.classList.remove(x)}function fA($,W,D,P){if(iX.has(D)){console.error(`Refusing to assign unsafe prop name '${D}' to a DOM node.`);return}let x=W.originalProps;if(!(D in x))x[D]=$[D];$[D]=P===void 0?x[D]:P}function NQ($,W,D){let P=W.originalProps;if(D in P)$[D]=P[D],delete P[D]}function qQ($,W,D,P,x){let S=Z($),n=J(P,$);if(Object.is(W,n))return;switch(S){case"$styling":{if(!B(W))throw Error("invalid value for styling prop");DA(D,n??T,W??T);break}case"$classes":{if(!L(W))throw Error("invalid value for classes prop");t(D,n??[],W??[]);break}case"$attrs":{if(!B(W))throw Error("invalid value for attrs prop");qA(D,n??T,W??T);break}case"$dataset":{if(!B(W))throw Error("invalid value for dataset prop");FA(D,n??T,W??T);break}default:{if(x)fA(D,D[_A],S,W);else if(W===void 0)D.removeAttribute(S);else D.setAttribute(S,W);break}}}function KB($,W,D,P,x){if(J(P,$)!==void 0)return;let S=Z($);switch(S){case"$styling":DA(D,W??T,T);break;case"$classes":t(D,W??[],[]);break;case"$attrs":qA(D,W??T,T);break;case"$dataset":FA(D,W??T,T);break;default:{if(x)NQ(D,D[_A],S);else D.removeAttribute(S);break}}}function zQ($,W){let D=$[_A],P=$.namespaceURI==="http://www.w3.org/1999/xhtml",x=D.vdom?.args[0]??T;q(W,qQ,$,x,P),q(x,KB,$,W,P)}function PQ($,W,D){if(typeof D==="function")$.addEventListener(W,D);else if(D!=null)$.addEventListener(W,J(D,g),{capture:!!J(D,u),passive:!!J(D,j)})}function OQ($,W,D){if(typeof D==="function")$.removeEventListener(W,D);else if(D!=null)$.removeEventListener(W,J(D,g),!!J(D,u))}function jQ($,W,D){let P=V($);if(P[0]==="$")return;PQ(D,P,W)}function wB($,W,D,P){let x=V($);if(x[0]==="$")return;let S=J(P,$);if(W===S)return;OQ(D,x,S),PQ(D,x,W)}function mX($,W,D,P){let x=V($);if(x[0]==="$"||J(P,$)!==void 0)return;OQ(D,x,W)}function TE($,W){let D=$[_A],P=W??T;if(!D.vdom){q(P,jQ,$);return}let x=D.vdom.hooks??T;q(P,wB,$,x),q(x,mX,$,P)}function R0($){let W=$[_A],D=W.newVdom,P=W.vdom,x=D.args;switch(D.type){case pQ:{zQ($,x[0]),xB($,AQ(x,1));break}case kB:{zQ($,x[0]);break}case FC:{let S=D.tag.apply($,D.args);if(k(S))xB($,[]);else if(L(S))xB($,BA(S,!0));else xB($,[S]);break}case XB:{try{D.tag.update?.($,D.args,P?.args)}catch(S){console.error(S)}break}}if(D.hooks||P?.hooks)TE($,D.hooks??T);try{D.hooks?.$update?.($,D,P)}catch(S){console.error(S)}W.vdom=D,delete W.newVdom}function pX($,W){if(typeof W!=="object"||W===null)return $.ownerDocument.createTextNode(IA(W));let D;switch(W.type){case pQ:case kB:D=V0($,W.tag,W);break;case FC:D=V0($,"udom-alias",W),D.style.display="contents";break;case XB:D=V0($,"udom-special",W),D.style.display="contents";break;default:throw Error("Invalid VDOM node")}return D}function wE($){if($.children)for(let W of $.children)UC(W)}function UC($){let W=$[_A];if(!W)return;let{vdom:D}=W;if(!D){delete $[_A];return}if(D.hooks)TE($,T);if(D.type===pQ||D.type===kB)zQ($,T);if(D.type===pQ||D.type===FC)wE($);delete $[_A];try{if(D.type===XB)D.tag.detach?.($);D.hooks?.$detach?.($)}catch(P){console.error(P)}}function lX($,W){let D=$[_A];if(Q(D.vdom.args,W.args)||Q(D.vdom.hooks,W.hooks))D.newVdom=W;return $}function cX($){let W=new Map,D={nodes:[],cursor:0};for(let P of $.childNodes){if(P.nodeType===3){D.nodes.push(P);continue}let x=P[_A],S=x?.vdom;if(S===void 0){if(x?.newVdom)throw Error("Attempt to reconcile against a target while already working on a reconciliation against that same target, this is not allowed");continue}let n=W.get(S.tag);if(!n)n={nodesForKey:null,nodesWithoutKey:{nodes:[],cursor:0}},W.set(S.tag,n);if(S.k!==void 0){if(!n.nodesForKey)n.nodesForKey=new Map;let GA=n.nodesForKey.get(S.k);if(GA)GA.nodes.push(P);else n.nodesForKey.set(S.k,{nodes:[P],cursor:0})}else n.nodesWithoutKey.nodes.push(P)}return{byTag:W,textNodes:D}}function xE($){if(!$||$.cursor>=$.nodes.length)return;return $.nodes[$.cursor++]}function dX($,W,D,P){let x=$.firstChild;for(let S=0;S<W.length;S++){let n=W[S];if(n===x){x=x.nextSibling;continue}(P&&n.isConnected?P:D).call($,n,x)}}function aX($,W,D,P){let x=W[P],S=x;for(let GA=P-1;GA>=0;GA--){let LQ=W[GA];if(LQ!==S.previousSibling)D.call($,LQ,S);S=LQ}let n=x.nextSibling;for(let GA=P+1;GA<W.length;GA++){let LQ=W[GA];if(LQ===n)n=n.nextSibling;else D.call($,LQ,n)}}function nX($,W){for(let D=0;D<$.length;D++)if(W.has($[D]))return D;return-1}function oX($){let W=$[_A];if(!W?.newVdom)return;if(!W.vdom)try{if(W.newVdom.hooks?.$attach?.($),W.newVdom.type===XB)W.newVdom.tag.attach?.($)}catch(D){console.error(D)}R0($)}function xB($,W){let D=$.firstChild?new Set($.childNodes):null,{byTag:P,textNodes:x}=cX($),S=[];for(let MA of W){let mQ;if(MA instanceof GB){let YB=P.get(MA.tag),LB=YB?xE(MA.k!==void 0?YB.nodesForKey?.get(MA.k):YB.nodesWithoutKey):void 0;mQ=LB?lX(LB,MA):pX($,MA)}else{let YB=xE(x),LB=IA(MA);if(YB){if(mQ=YB,mQ.nodeValue!==LB)mQ.nodeValue=LB}else mQ=$.ownerDocument.createTextNode(LB)}D?.delete(mQ),S.push(mQ)}if(D)for(let MA of D)UC(MA),$.removeChild(MA);if(S.length===0)return;let n=$.ownerDocument,GA=JG(n,A?.window),LQ=GA.insertBefore,kE=typeof GA.moveBefore==="function"?GA.moveBefore:null,gE=$.isConnected,EB=-1;if(gE&&!kE){let MA=vE.get(n)??KG(n);if(EB=nX(S,MA),EB!==-1&&S[EB].parentNode!==$)EB=-1}if(EB===-1)dX($,S,LQ,gE?kE:null);else aX($,S,LQ,EB);for(let MA=0;MA<S.length;MA++)oX(S[MA])}function sX($,W){let D=$[_A];if(W===null||W===void 0){if(D)UC($);else wE($);$.replaceChildren();return}if(L(W)){xB($,BA(W,!0));return}if(W instanceof GB){if(D){if(D.vdom.type===W.type&&D.vdom.tag===W.tag){if(Q(D.vdom.args,W.args)||Q(D.vdom.hooks,W.hooks))D.newVdom=W,R0($);return}UC($)}switch(W.type){case pQ:case kB:if(!rX($.nodeName,G(W.tag)))throw Error("incompatible target for vdom");break}$[_A]=bE(W);try{if(W.hooks?.$attach?.($),W.type===XB)W.tag.attach?.($)}catch(P){console.error(P)}R0($);return}throw Error("invalid vdom")}return{h:UA,alias:AG,special:QG,reconcile:sX,settings:{shouldUpdate:Q,isMap:B,mapIter:C,mapEach:q,mapGet:J,mapMerge:K,newMap:E,mapPut:Y,isSeq:L,flattenSeq:BA,seqIter:X,convertTagName:G,convertPropName:Z,convertStyleName:M,convertDataName:I,convertClassName:F,convertHookName:V,convertName:H,listenerKey:g,captureKey:u,passiveKey:j}}};function MC({h:A}){return{title:(...Q)=>A("title",...Q),meta:(Q)=>A("meta",Q),link:(Q)=>A("link",Q),style:(...Q)=>A("style",...Q),script:(...Q)=>A("script",...Q),noscript:(...Q)=>A("noscript",...Q),address:(...Q)=>A("address",...Q),article:(...Q)=>A("article",...Q),aside:(...Q)=>A("aside",...Q),footer:(...Q)=>A("footer",...Q),header:(...Q)=>A("header",...Q),h1:(...Q)=>A("h1",...Q),h2:(...Q)=>A("h2",...Q),h3:(...Q)=>A("h3",...Q),h4:(...Q)=>A("h4",...Q),h5:(...Q)=>A("h5",...Q),h6:(...Q)=>A("h6",...Q),main:(...Q)=>A("main",...Q),nav:(...Q)=>A("nav",...Q),section:(...Q)=>A("section",...Q),blockquote:(...Q)=>A("blockquote",...Q),dd:(...Q)=>A("dd",...Q),div:(...Q)=>A("div",...Q),dl:(...Q)=>A("dl",...Q),dt:(...Q)=>A("dt",...Q),figcaption:(...Q)=>A("figcaption",...Q),figure:(...Q)=>A("figure",...Q),hr:()=>A("hr"),li:(...Q)=>A("li",...Q),ol:(...Q)=>A("ol",...Q),p:(...Q)=>A("p",...Q),pre:(...Q)=>A("pre",...Q),ul:(...Q)=>A("ul",...Q),a:(...Q)=>A("a",...Q),abbr:(...Q)=>A("abbr",...Q),b:(...Q)=>A("b",...Q),br:()=>A("br"),cite:(...Q)=>A("cite",...Q),code:(...Q)=>A("code",...Q),data:(...Q)=>A("data",...Q),del:(...Q)=>A("del",...Q),dfn:(...Q)=>A("dfn",...Q),em:(...Q)=>A("em",...Q),i:(...Q)=>A("i",...Q),ins:(...Q)=>A("ins",...Q),kbd:(...Q)=>A("kbd",...Q),mark:(...Q)=>A("mark",...Q),q:(...Q)=>A("q",...Q),s:(...Q)=>A("s",...Q),samp:(...Q)=>A("samp",...Q),small:(...Q)=>A("small",...Q),span:(...Q)=>A("span",...Q),strong:(...Q)=>A("strong",...Q),sub:(...Q)=>A("sub",...Q),sup:(...Q)=>A("sup",...Q),time:(...Q)=>A("time",...Q),u:(...Q)=>A("u",...Q),wbr:()=>A("wbr"),area:(Q)=>A("area",Q),audio:(...Q)=>A("audio",...Q),img:(Q)=>A("img",Q),map:(...Q)=>A("map",...Q),track:(Q)=>A("track",Q),video:(...Q)=>A("video",...Q),embed:(Q)=>A("embed",Q),iframe:(...Q)=>A("iframe",...Q),object:(...Q)=>A("object",...Q),param:(Q)=>A("param",Q),picture:(...Q)=>A("picture",...Q),portal:(...Q)=>A("portal",...Q),source:(Q)=>A("source",Q),svg:(...Q)=>A("svg",...Q),math:(...Q)=>A("math",...Q),canvas:(...Q)=>A("canvas",...Q),caption:(...Q)=>A("caption",...Q),col:(Q)=>A("col",Q),colgroup:(...Q)=>A("colgroup",...Q),table:(...Q)=>A("table",...Q),tbody:(...Q)=>A("tbody",...Q),td:(...Q)=>A("td",...Q),tfoot:(...Q)=>A("tfoot",...Q),th:(...Q)=>A("th",...Q),thead:(...Q)=>A("thead",...Q),tr:(...Q)=>A("tr",...Q),button:(...Q)=>A("button",...Q),datalist:(...Q)=>A("datalist",...Q),fieldset:(...Q)=>A("fieldset",...Q),form:(...Q)=>A("form",...Q),input:(Q)=>A("input",Q),label:(...Q)=>A("label",...Q),legend:(...Q)=>A("legend",...Q),meter:(...Q)=>A("meter",...Q),optgroup:(...Q)=>A("optgroup",...Q),option:(...Q)=>A("option",...Q),output:(...Q)=>A("output",...Q),progress:(...Q)=>A("progress",...Q),select:(...Q)=>A("select",...Q),textarea:(...Q)=>A("textarea",...Q),details:(...Q)=>A("details",...Q),dialog:(...Q)=>A("dialog",...Q),summary:(...Q)=>A("summary",...Q),slot:(...Q)=>A("slot",...Q),template:(...Q)=>A("template",...Q)}}function q0({window:A}={}){let Q=!1,B=0,C=[];function J(){return A??globalThis}function K(M){let I=J().requestAnimationFrame;return typeof I==="function"?I.call(J(),M):setTimeout(M,16)}function E(M){let I=J().cancelAnimationFrame;if(typeof I==="function")I.call(J(),M);else clearTimeout(M)}function Y(){return J().performance?.now()??Date.now()}function L(M){for(let I of M)try{I()}catch(F){console.error("Error in scheduled function:",F)}}function X(){let M=Y();B=0;while(C.length>0){let I=C.splice(0,100);if(L(I),Y()-M>10&&C.length>0){B=K(X);return}}Q=!1}function H(M,{signal:I}={}){if(I?.aborted)return;let F=M;if(I)F=()=>{if(!I.aborted)M()};if(C.push(F),!Q)Q=!0,B=K(X)}function G(){if(B)E(B),B=0;Q=!0;while(C.length>0){let M=C;C=[],L(M)}Q=!1}function Z(){if(B)E(B);C=[],Q=!1,B=0}return{schedule:H,flush:G,clear:Z}}function fE(A){let Q=N0(A),B=MC(Q),C=A?.scheduler??q0(A);return{...Q,...B,...C}}var YG=fE();var{h:LG,alias:XG,special:GG,reconcile:HG,settings:$G,title:ZG,meta:DG,link:WG,style:IG,script:UG,noscript:FG,address:MG,article:RG,aside:VG,footer:NG,header:qG,h1:zG,h2:PG,h3:OG,h4:jG,h5:_G,h6:SG,main:TG,nav:wG,section:xG,blockquote:kG,dd:gG,div:yG,dl:hG,dt:bG,figcaption:vG,figure:fG,hr:uG,li:mG,ol:pG,p:lG,pre:cG,ul:dG,a:aG,abbr:nG,b:oG,br:sG,cite:iG,code:rG,data:tG,del:eG,dfn:A1,em:Q1,i:B1,ins:C1,kbd:J1,mark:K1,q:E1,s:Y1,samp:L1,small:X1,span:G1,strong:H1,sub:$1,sup:Z1,time:D1,u:W1,wbr:I1,area:U1,audio:F1,img:M1,map:R1,track:V1,video:N1,embed:q1,iframe:z1,object:P1,param:O1,picture:j1,portal:_1,source:S1,svg:T1,math:w1,canvas:x1,caption:k1,col:g1,colgroup:y1,table:h1,tbody:b1,td:v1,tfoot:f1,th:u1,thead:m1,tr:p1,button:l1,datalist:c1,fieldset:d1,form:a1,input:n1,label:o1,legend:s1,meter:i1,optgroup:r1,option:t1,output:e1,progress:A6,select:Q6,textarea:B6,details:C6,dialog:J6,summary:K6,slot:E6,template:Y6,schedule:L6,flush:X6,clear:G6}=YG;function H6(A,{signal:Q}={}){queueMicrotask(()=>{if(!Q?.aborted)A()})}function $6(A){return(Q)=>A("pre",{$styling:{"background-color":"#fdd",color:"#330",padding:"1em","white-space":"pre-wrap"}},A("strong",null,`Error: ${Q?.message??String(Q)}`),`
2
+
3
+ `,Q?.stack??"")}function uE(A){return A!=null&&typeof A.special==="function"&&typeof A.reconcile==="function"}function z0(A){let Q=uE(A)?{dodo:A}:A,B=Q?.dodo;if(!uE(B))throw Error("a dodo instance must be provided in settings, e.g. reactive({dodo})");return{schedule:typeof B.schedule==="function"?B.schedule:H6,renderError:$6(B.h),...Q,dodo:B,...B.settings}}var sA=Symbol("dodo.reactive.PENDING"),RA=Symbol("dodo.reactive.NOTHING");function cQ(A){return A!=null&&typeof A.onDirty==="function"&&typeof A.getValue==="function"}function HB(A){return cQ(A)?A.getValue():A}function Z6(A){if(typeof A==="function")return A;if(A&&typeof A.unsubscribe==="function")return()=>A.unsubscribe();return()=>{}}function P0(){let A=new Set;return{listeners:A,notify(){for(let Q of Array.from(A))try{Q()}catch(B){console.error("Error in dodo cell listener:",B)}}}}function RC(A,Q){let{listeners:B,notify:C}=P0(),J=null;return{onDirty(K){if(B.add(K),B.size===1)try{J=Z6(A(C))}catch(Y){throw B.delete(K),Y}let E=!1;return()=>{if(E)return;if(E=!0,B.delete(K),B.size===0&&J){let Y=J;J=null,Y()}}},getValue(){return Q()}}}function d(A){let Q=A,{listeners:B,notify:C}=P0();return{onDirty(J){return B.add(J),()=>B.delete(J)},getValue(){return Q},setValue(J){if(Object.is(J,Q))return;Q=J,C()},update(J){this.setValue(J(Q))}}}function O0(A){return{onDirty(){return()=>{}},getValue(){return A}}}function r(A,Q){let B=Array.isArray(A)?A:[A],{listeners:C,notify:J}=P0(),K=null,E=RA,Y=()=>{E=RA,J()},L=()=>{let X=Array(B.length);for(let H=0;H<B.length;H++){let G=HB(B[H]);if(G===sA)return sA;X[H]=G}return Q(...X)};return{onDirty(X){if(C.add(X),C.size===1)E=RA,K=B.map((G)=>cQ(G)?G.onDirty(Y):null);let H=!1;return()=>{if(H)return;if(H=!0,C.delete(X),C.size===0&&K){for(let G of K)G?.();K=null,E=RA}}},getValue(){if(E===RA||!K)E=L();return E}}}function VC(A,Q){return r([A],Q)}function NC(A,{initial:Q=sA}={}){return D6(A,{initial:Q},(B,C)=>B.subscribe({next:C.next,error:C.error,complete:C.complete}))}function D6(A,{initial:Q},B){let C=Q,J=RA;return RC((E)=>{return B(A,{next(L){C=L,J=RA,E()},error(L){J=L,E()},complete(){}})},()=>{if(J!==RA)throw J;return C})}function mE(A){return{subscribe(Q){let B=typeof Q==="function"?{next:Q}:Q??{},C=()=>{let K;try{K=HB(A)}catch(E){B.error?.(E);return}if(K!==sA)B.next?.(K)},J=cQ(A)?A.onDirty(C):()=>{};return C(),{unsubscribe:J}}}}function _Q(A,Q){let B=()=>{let J;try{J=HB(A)}catch(K){console.error("Error reading cell in effect:",K);return}if(J===sA)return;Q(J)},C=cQ(A)?A.onDirty(B):()=>{};return B(),C}var lQ=Symbol("dodo.reactive.watch");function qC(A){let Q=z0(A),{dodo:B,schedule:C,renderError:J}=Q,{special:K,reconcile:E}=B,Y=Q.mapGet??((G,Z)=>G[Z]),L=(G,Z)=>G==null?void 0:Y(G,Z),X=Q.shouldUpdate??((G,Z)=>G!==Z);return{watch:K({attach(G){G[lQ]={source:RA,builder:null,placeholder:void 0,errorBuilder:void 0,unsubscribe:null,abortController:null,renderScheduled:!1,lastValue:RA,lastBuilder:RA}},update(G,[Z,M,I]){let F=G[lQ];if(!F)return;if(F.builder=M,F.placeholder=L(I,"placeholder"),F.errorBuilder=L(I,"error"),F.source!==Z){if(F.unsubscribe?.(),F.unsubscribe=null,F.abortController?.abort(),F.abortController=new AbortController,F.source=Z,F.lastValue=RA,cQ(Z))try{F.unsubscribe=Z.onDirty(()=>this.invalidate(G))}catch(V){this.renderError(G,V);return}}this.render(G)},invalidate(G){let Z=G[lQ];if(!Z||Z.renderScheduled)return;Z.renderScheduled=!0,C(()=>this.render(G),{signal:Z.abortController?.signal})},render(G){let Z=G[lQ];if(!Z)return;Z.renderScheduled=!1;let M;try{M=HB(Z.source===RA?void 0:Z.source)}catch(I){this.renderError(G,I);return}if(Z.builder===Z.lastBuilder&&Z.lastValue!==RA&&!X(Z.lastValue,M))return;Z.lastValue=M,Z.lastBuilder=Z.builder;try{if(M===sA)E(G,Z.placeholder?[Z.placeholder()]:[]);else E(G,[Z.builder(M)])}catch(I){this.renderError(G,I)}},renderError(G,Z){let M=G[lQ];if(!M)return;M.lastValue=RA,M.lastBuilder=RA,console.error("Error in watched cell:",Z);try{E(G,[(M.errorBuilder??J)(Z)])}catch(I){console.error("Error rendering the error view:",I)}},detach(G){let Z=G[lQ];if(!Z)return;Z.unsubscribe?.(),Z.abortController?.abort(),delete G[lQ],E(G,null)}})}}var{watch:XQ}=qC({dodo:gB});var w=gB;function W6(A){let Q={status:"idle"};return RC((B)=>{if(Q.status==="idle")Q={status:"running"},Promise.resolve().then(A).then((C)=>{Q={status:"done",value:C},B()},(C)=>{Q={status:"failed",error:C},B()});return()=>{}},()=>{if(Q.status==="failed")throw Q.error;return Q.status==="done"?Q.value:sA})}var pE={watch:XQ,cell:d,derive:r,constant:O0,mapCell:VC,connectable:RC,fromObservable:NC,fromAsync:W6,toObservable:mE,effect:_Q,isCell:cQ,readCell:HB,PENDING:sA};var f=Object.freeze({NOT_FOUND:"not_found",ALREADY_EXISTS:"already_exists",INVALID:"invalid",CONFLICT:"conflict",UNAUTHORIZED:"unauthorized",FORBIDDEN:"forbidden",UNSUPPORTED:"unsupported",QUOTA:"quota",TOO_LARGE:"too_large",BAD_RANGE:"bad_range",TRANSIENT:"transient",TIMEOUT:"timeout",ABORTED:"aborted",INTERNAL:"internal"}),I6=new Set([f.TRANSIENT,f.TIMEOUT,f.QUOTA]),U6={[f.NOT_FOUND]:404,[f.ALREADY_EXISTS]:409,[f.INVALID]:400,[f.CONFLICT]:412,[f.UNAUTHORIZED]:401,[f.FORBIDDEN]:403,[f.UNSUPPORTED]:501,[f.QUOTA]:429,[f.TOO_LARGE]:413,[f.BAD_RANGE]:416,[f.TRANSIENT]:503,[f.TIMEOUT]:504,[f.ABORTED]:499,[f.INTERNAL]:500};class N extends Error{constructor(A,Q,B={}){super(Q,B.cause!==void 0?{cause:B.cause}:void 0);if(this.name="TroveError",this.code=A||f.INTERNAL,this.retryable=B.retryable??I6.has(this.code),this.details=B.details??null,this.status=U6[this.code]??500,this.code===f.QUOTA&&!this.retryable)this.status=507}toJSON(){return{error:{code:this.code,message:this.message,retryable:this.retryable,...this.details?{details:this.details}:{}}}}static notFound(A,Q){return new N(f.NOT_FOUND,A?`${A} not found`:"Not found",Q)}static alreadyExists(A,Q){return new N(f.ALREADY_EXISTS,`${A} already exists`,Q)}static invalid(A,Q){return new N(f.INVALID,A,Q)}static conflict(A,Q){return new N(f.CONFLICT,A,Q)}static unsupported(A,Q){return new N(f.UNSUPPORTED,A,Q)}static transient(A,Q){return new N(f.TRANSIENT,A,{retryable:!0,...Q})}static timeout(A,Q){return new N(f.TIMEOUT,A,{retryable:!0,...Q})}static aborted(A="Operation aborted",Q){return new N(f.ABORTED,A,{retryable:!1,...Q})}static unauthorized(A="Unauthorized",Q){return new N(f.UNAUTHORIZED,A,Q)}static tooLarge(A="Too large",Q){return new N(f.TOO_LARGE,A,{retryable:!1,...Q})}static badRange(A="Range not satisfiable",Q){return new N(f.BAD_RANGE,A,{retryable:!1,...Q})}static forbidden(A="Forbidden",Q){return new N(f.FORBIDDEN,A,Q)}static internal(A="Internal error",Q){return new N(f.INTERNAL,A,Q)}}function yB(A,Q="Unexpected error"){if(A instanceof N)return A;if(A?.name==="AbortError"||A?.code==="ABORT_ERR")return N.aborted(A.message||"Operation aborted",{cause:A});if(new Set(["ECONNRESET","ECONNREFUSED","ETIMEDOUT","EAI_AGAIN","EPIPE","ENOTFOUND","UND_ERR_SOCKET"]).has(A?.code)||A instanceof TypeError&&/fetch|network/i.test(A.message||""))return N.transient(A.message||"Network error",{cause:A});switch(A?.code){case"ENOENT":return N.notFound(null,{cause:A});case"EEXIST":return N.alreadyExists("Path",{cause:A});case"EACCES":case"EPERM":return new N(f.FORBIDDEN,"Permission denied",{cause:A});case"ENOSPC":return new N(f.QUOTA,"The storage volume is full — free some space and try again",{cause:A,retryable:!1});case"EDQUOT":return new N(f.QUOTA,"The storage quota for this volume has been reached",{cause:A,retryable:!1});case"EFBIG":return new N(f.QUOTA,"That file is larger than this filesystem can store",{cause:A,retryable:!1})}return N.internal(A?.message||Q,{cause:A})}function lE(A){if(A instanceof N)return A.retryable;return yB(A).retryable}function cE(A=""){let Q=(globalThis.crypto?.randomUUID?.()??F6()).replace(/-/g,"");return A?`${A}_${Q}`:Q}function F6(){let A="";for(let Q=0;Q<32;Q++)A+=Math.floor(Math.random()*16).toString(16);return A}function dE(A){let Q=String(A||"").lastIndexOf(".");return Q>0?String(A).slice(Q).toLowerCase():""}function zC(A,Q){if(!A||!Q)return!1;if(typeof A.match==="function")try{if(A.match(Q))return!0}catch{}let B=dE(Q.name||"");if(B&&(A.ext||[]).some((K)=>(K.startsWith(".")?K:"."+K).toLowerCase()===B))return!0;let C=Q.contentType||"";return(A.mime||A.contentType||[]).some((K)=>K.endsWith("/*")?C.startsWith(K.slice(0,-1)):C===K)}var $B="trove+contrib:",aE="core",M6=/^(?:core|[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+)$/,R6=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function V6(A){return typeof A==="string"&&M6.test(A)}function PC(A){return typeof A==="string"&&R6.test(A)}function QQ(A){return OC(A),`${A.domain}/${A.name}`}function SQ(A,Q){if(!PC(Q))throw N.invalid(`Invalid contribution name "${Q}"`);return`${$B}${QQ(A)}/${Q}`}var N6="workbench";function nE(A){return`${$B}${aE}/${N6}/${A}`}function TQ(A){if(typeof A!=="string"||!A.startsWith($B))return null;let Q=A.slice($B.length),B=Q.indexOf("/"),C=Q.indexOf("/",B+1);if(B<0||C<0)return null;let J=Q.slice(0,B),K=Q.slice(B+1,C),E=Q.slice(C+1);if(!J||!K||!E)return null;return{domain:J,plugin:K,name:E,pluginId:`${J}/${K}`}}function oE(A,Q){let B=TQ(Q);return!!B&&B.pluginId===`${A.domain}/${A.name}`}function OC(A){if(!V6(A?.domain))throw N.invalid(`Plugin manifest needs a valid "domain" (got ${JSON.stringify(A?.domain)})`);if(!PC(A?.name))throw N.invalid(`Plugin manifest needs a valid "name" (got ${JSON.stringify(A?.name)})`);if(A.domain===aE)throw N.invalid('The "core" domain is reserved for built-in contributions')}var iE={command:{normalize:(A)=>({title:A.title||null,category:A.category||null,icon:A.icon||null,when:A.when||null,palette:A.palette!==!1,offline:!!A.offline})},opener:{needsEntry:!0,normalize:(A)=>({title:A.title||null,match:sE(A.match),priority:A.priority??50,when:A.when||null,offline:!!A.offline,dock:A.dock||null})},indexer:{needsEntry:!0,normalize:(A)=>({title:A.title||null,match:sE(A.match)})},statusItem:{normalize:(A)=>{let Q=A.slot==="left"?"left":"right",B=A.render||"html";if(B!=="html")throw N.invalid(`statusItem "render" must be "html" (got ${JSON.stringify(B)})`);return{slot:Q,render:B,order:A.order??0,when:A.when||null,offline:!!A.offline,command:A.command||null}}},register:{normalize:(A)=>({default:A.default??null,description:A.description||null})},keymap:{normalize:(A)=>{if(!A.path||typeof A.path!=="string")throw N.invalid('keymap contribution needs a "path" to a JSON file in the package');return{path:A.path}}}},j0=Object.keys(iE);function GQ(A){let Q=A?.contributes;if(Q==null)return[];if(typeof Q!=="object"||Array.isArray(Q))throw N.invalid('manifest "contributes" must be a map of name -> contribution');let B=[];for(let[C,J]of Object.entries(Q)){if(!J||typeof J!=="object")throw N.invalid(`Contribution "${C}" must be an object`);if(!PC(C))throw N.invalid(`Invalid contribution name "${C}"`);let K=iE[J.type];if(!K)throw N.invalid(`Contribution "${C}" has unknown type ${JSON.stringify(J.type)} (expected one of ${j0.join(", ")})`);let E=J.entry||A.entry;if(K.needsEntry&&!E)throw N.invalid(`Contribution "${C}" (${J.type}) needs an "entry" module`);B.push({name:C,uri:SQ(A,C),pluginId:QQ(A),type:J.type,...K.normalize(J),...K.needsEntry?{entry:E}:{}})}return B}function q6(A,Q){return GQ(A).filter((B)=>B.type===Q)}function _0(A){return q6(A,"indexer").map((Q)=>({id:Q.uri,name:Q.name,title:Q.title||Q.name,match:Q.match,entry:Q.entry}))}function rE(A){let Q;try{Q=JSON.parse(A)}catch(C){throw N.invalid("Keymap file is not valid JSON",{cause:C})}let B=Array.isArray(Q)?Q:Array.isArray(Q?.bindings)?Q.bindings:null;if(!B)throw N.invalid("Keymap file must be a JSON array of bindings");return B.filter((C)=>C&&typeof C.key==="string"&&typeof C.command==="string").map((C)=>({key:C.key,command:C.command,when:typeof C.when==="string"?C.when:null,args:Array.isArray(C.args)?C.args:void 0}))}function sE(A){if(!A||typeof A!=="object"||Array.isArray(A))return{};let Q=(K)=>K==null?void 0:(Array.isArray(K)?K:[K]).filter((E)=>typeof E==="string"),B={},C=Q(A.ext),J=Q(A.mime??A.contentType);if(C)B.ext=C;if(J)B.mime=J;if(typeof A.match==="function")B.match=A.match;return B}var z6=[...j0,"view"];function jC(A){return String(A).startsWith($B)?A:nE(A)}class S0{constructor(){this.items=new Map,this.cell=d([]),this.byType=new Map}#A(){this.cell.setValue([...this.items.values()])}register(A,Q){let B=Q?.type;if(!z6.includes(B))throw Error(`Unknown contribution type "${B}" for ${A}`);let C=jC(A),J=TQ(C);if(!J)throw Error(`Not a contribution URI: ${C}`);let K=Q.pluginId??(J.domain==="core"?null:J.pluginId),E={...Q,uri:C,type:B,id:J.domain==="core"?J.name:C,name:J.name,pluginId:K};return this.items.set(C,E),this.#A(),()=>this.unregister(C)}update(A,Q){let B=jC(A),C=this.items.get(B);if(!C)return!1;return this.items.set(B,{...C,...Q}),this.#A(),!0}unregister(A){if(this.items.delete(jC(A)))this.#A()}unregisterPlugin(A){let Q=!1;for(let[B,C]of this.items)if(C.pluginId===A)this.items.delete(B),Q=!0;if(Q)this.#A()}get(A){return A?this.items.get(jC(A))||null:null}all(){return[...this.items.values()]}ofType(A){return this.all().filter((Q)=>Q.type===A)}ofPlugin(A,Q){return this.all().filter((B)=>B.pluginId===A&&(!Q||B.type===Q))}observe(){return this.cell}observeType(A){let Q=this.byType.get(A);if(!Q)Q=r([this.cell],(B)=>B.filter((C)=>C.type===A)),this.byType.set(A,Q);return Q}openersFor(A){return this.ofType("opener").filter((Q)=>zC(Q.match,A)).sort((Q,B)=>(B.priority??0)-(Q.priority??0))}openerFor(A,Q,B){return this.openersFor(A).find((C)=>(!C.when||Q(C.when))&&(!B||B(C)))||null}keybindings(){return this.ofType("keymap").flatMap((A)=>(A.bindings||[]).map((Q)=>({...Q,keymap:A.uri,pluginId:A.pluginId})))}}var T0=new Map;function w0(A){if(!A)return()=>!0;if(T0.has(A))return T0.get(A);let Q;try{let B=new eE(A);Q=B.parseExpression(),Q.keys=Object.freeze([...B.keys])}catch(B){console.warn(`Invalid when clause: "${A}" — ${B.message}`),Q=()=>!1,Q.keys=Object.freeze([])}return T0.set(A,Q),Q}function tE(A,Q){return w0(A)(Q||{})}var _C=/\s*(=~|==|!=|>=|<=|&&|\|\||[()!<>]|trove\+contrib:[A-Za-z0-9_./-]+|\/(?:\\.|[^/])*\/[a-z]*|'(?:\\.|[^'])*'|"(?:\\.|[^"])*"|[A-Za-z0-9_.:-]+)/y;class eE{constructor(A){this.src=A,this.tokens=this.#A(A),this.pos=0,this.keys=new Set}#A(A){let Q=[],B=0;_C.lastIndex=0;while(B<A.length){_C.lastIndex=B;let C=_C.exec(A);if(!C||C.index==null){if(!A.slice(B).trim())break;throw Error(`Unexpected "${A.slice(B)}"`)}Q.push(C[1]),B=_C.lastIndex}return Q}#Q(){return this.tokens[this.pos]}#B(){return this.tokens[this.pos++]}#C(A){if(this.#Q()!==A)throw Error(`Expected "${A}"`);this.pos++}parseExpression(){let A=this.#J();if(this.pos!==this.tokens.length)throw Error(`Trailing "${this.#Q()}"`);return A}#J(){let A=this.#K();while(this.#Q()==="||"){this.#B();let Q=this.#K(),B=A;A=(C)=>B(C)||Q(C)}return A}#K(){let A=this.#E();while(this.#Q()==="&&"){this.#B();let Q=this.#E(),B=A;A=(C)=>B(C)&&Q(C)}return A}#E(){if(this.#Q()==="!"){this.#B();let A=this.#E();return(Q)=>!A(Q)}return this.#Y()}#Y(){let A=this.#L(),Q=this.#Q();if(["==","!=",">=","<=",">","<","=~"].includes(Q)){if(this.#B(),Q==="=~"){let C=this.#B(),J=P6(C);return(K)=>J.test(String(A(K)??""))}let B=this.#L();return(C)=>j6(Q,A(C),B(C))}return(B)=>O6(A(B))}#L(){let A=this.#B();if(A===void 0)throw Error("Unexpected end");if(A==="("){let Q=this.#J();return this.#C(")"),Q}if(A==="true")return()=>!0;if(A==="false")return()=>!1;if(/^-?\d+(\.\d+)?$/.test(A)){let Q=Number(A);return()=>Q}if(A[0]==="'"||A[0]==='"'){let Q=A.slice(1,-1).replace(/\\(.)/g,"$1");return()=>Q}return this.keys.add(A),(Q)=>Q[A]}}function P6(A){let Q=/^\/((?:\\.|[^/])*)\/([a-z]*)$/.exec(A);if(!Q)throw Error(`Bad regex ${A}`);return new RegExp(Q[1],Q[2])}function O6(A){return!(A===void 0||A===null||A===!1||A===""||A===0)}function j6(A,Q,B){switch(A){case"==":return Q==B;case"!=":return Q!=B;case">":return Q>B;case"<":return Q<B;case">=":return Q>=B;case"<=":return Q<=B}return!1}var _6=(A)=>({onDirty:()=>()=>{},getValue:()=>A});class x0{#A=new Map;#Q=new Map;#B=new Map;#C=d({});constructor(A={}){let Q={platform:A8(),isMac:/mac/i.test(A8()),...A};for(let[B,C]of Object.entries(Q))this.register(B,_6(C))}register(A,Q){if(this.#A.has(A))throw Error(`Context key "${A}" already has an owner`);return this.#A.set(A,Q),this.#Q.set(A,Q.onDirty(()=>this.#J(A))),this.#J(A),()=>this.unregister(A)}unregister(A){let Q=this.#Q.get(A);if(!Q)return;Q(),this.#Q.delete(A),this.#A.delete(A),this.#J(A)}cellFor(A){let Q=this.#B.get(A);if(!Q){let B=new Set;Q={listeners:B,onDirty:(C)=>{return B.add(C),()=>B.delete(C)},getValue:()=>this.#A.get(A)?.getValue()},this.#B.set(A,Q)}return Q}watch(A){let Q=w0(A),B=Q.keys??[];return r(B.map((C)=>this.cellFor(C)),(...C)=>{let J={};for(let K=0;K<B.length;K++)J[B[K]]=C[K];return Q(J)})}#J(A){this.#K();let Q=this.#B.get(A);if(Q)for(let B of[...Q.listeners])B()}own(A,Q=void 0){let B=d(Q),C=this.register(A,B);return{set:(J)=>B.setValue(J),dispose:C}}#K(){let A={};for(let[Q,B]of this.#A)A[Q]=B.getValue();this.#C.setValue(A)}snapshot(){return this.#C.getValue()}get(A){return this.#A.get(A)?.getValue()}has(A){return this.#A.has(A)}observe(){return this.#C}evaluate(A){return tE(A,this.snapshot())}}function A8(){return typeof navigator<"u"?navigator.platform||navigator.userAgent||"":""}class k0{constructor(A,Q,B){this.contributions=A,this.context=Q,this.notifications=B,this.handlers=new Map,this.dispatch=()=>{throw Error("CommandService has no dispatcher yet — see createApp")}}register(A,Q){let B=typeof A==="string"?{id:A,actions:Q}:A;if(B.actions)this.handlers.set(B.id,B.actions);let C=this.contributions.register(B.id,{type:"command",title:B.title??B.id,category:B.category,icon:B.icon,when:B.when,palette:B.palette??!0,pluginId:B.pluginId,offline:B.offline});return()=>{this.handlers.delete(B.id),C()}}has(A){return this.handlers.has(A)}isEnabled(A){let Q=this.contributions.get(A);if(Q?.when&&!this.context.evaluate(Q.when))return!1;return this.isAvailable(Q)}isAvailable(A){if(!A)return!0;return this.availability?this.availability(A):!0}async execute(A,...Q){let B=this.handlers.get(A);if(!B){this.notifications.error(`Command not found: ${A}`);return}let C=this.contributions.get(A);if(!this.isAvailable(C)){this.notifications.warn(`“${C?.title||A}” isn’t available${this.availability?" offline":""} right now.`);return}if(!this.isEnabled(A))return;try{let J=B(...Q);if(!J)return;for(let K of[].concat(J))if((await this.dispatch(K).next(["complete","error","abort"]))?.type!=="complete")break}catch(J){throw console.error(`Command ${A} failed`,J),this.notifications.error(J?.message||`Command failed: ${A}`),J}}paletteCommands(){return this.contributions.ofType("command").filter((A)=>A.palette!==!1&&(!A.when||this.context.evaluate(A.when))).sort((A,Q)=>(A.category||"").localeCompare(Q.category||"")||A.title.localeCompare(Q.title))}}function g0(A){let Q=A.trim().toLowerCase().split("+").map((K)=>K.trim()),B=new Set,C="";for(let K of Q)if(["ctrl","control"].includes(K))B.add("ctrl");else if(["cmd","meta","super","win"].includes(K))B.add("meta");else if(K==="alt"||K==="option")B.add("alt");else if(K==="shift")B.add("shift");else if(["ctrlcmd","mod"].includes(K))B.add(Q8()?"meta":"ctrl");else C=K;return[...["ctrl","meta","alt","shift"].filter((K)=>B.has(K)),C].filter(Boolean).join("+")}function y0(A){let Q=[];if(A.ctrlKey)Q.push("ctrl");if(A.metaKey)Q.push("meta");if(A.altKey)Q.push("alt");if(A.shiftKey)Q.push("shift");let B=A.key.toLowerCase();return B={" ":"space",escape:"escape",enter:"enter",arrowup:"up",arrowdown:"down",arrowleft:"left",arrowright:"right"}[B]||B,[...Q.filter((J)=>B!==J),B].join("+")}class ZB{constructor(A,Q,B,C=null){this.contributions=A,this.commands=Q,this.context=B,this.settings=C,this.chordPrefix=null,this.chordTimer=null,this._onKeyDown=this.#B.bind(this)}install(A=window){return A.addEventListener("keydown",this._onKeyDown),()=>A.removeEventListener("keydown",this._onKeyDown)}overrides(){return this.settings?.get("keybindings.overrides")||{}}static bindingId(A){return`${A.command}\x00${g0(A.defaultKey||A.key)}`}rebind(A,Q){if(!this.settings)return;let B=typeof A==="string"?this.#A(A):ZB.bindingId(A);if(!B)return;let C={...this.overrides()};if(Q)C[B]=Q;else delete C[B];this.settings.set("keybindings.overrides",C)}#A(A){let Q=this.contributions.keybindings().find((B)=>B?.command===A&&B.key);return Q?ZB.bindingId({...Q,defaultKey:Q.key}):null}resolved(){let A=this.overrides();return this.contributions.keybindings().filter((Q)=>Q?.key&&Q.command).map((Q)=>{let B=g0(Q.key),C=ZB.bindingId({command:Q.command,defaultKey:B});return{...Q,defaultKey:B,bindingId:C,key:g0(A[C]||Q.key)}})}#Q(A){let Q=this.context.snapshot(),B=this.resolved();for(let C=B.length-1;C>=0;C--){let J=B[C];if(J.key!==A)continue;if(J.when&&!this.context.evaluate(J.when))continue;return J}return null}#B(A){if(A.defaultPrevented)return;let Q=y0(A),B=A.ctrlKey||A.metaKey||A.altKey;if(S6(A.target)&&!B&&A.key!=="Escape"){this.#C();return}let J=this.chordPrefix?`${this.chordPrefix} ${Q}`:Q,K=this.#Q(J);if(K){A.preventDefault(),this.#C(),this.commands.execute(K.command,...K.args||[]);return}if(!this.chordPrefix&&this.resolved().some((E)=>E.key.startsWith(Q+" "))){A.preventDefault(),this.chordPrefix=Q,this.chordTimer=setTimeout(()=>this.#C(),1500);return}this.#C()}#C(){if(this.chordPrefix=null,this.chordTimer)clearTimeout(this.chordTimer);this.chordTimer=null}labelFor(A){let Q=this.resolved().find((B)=>B.command===A);return Q?h0(Q.key):null}}function S6(A){if(!A)return!1;let Q=A.tagName;return Q==="INPUT"||Q==="TEXTAREA"||Q==="SELECT"||A.isContentEditable}function Q8(){return typeof navigator<"u"&&/mac/i.test(navigator.platform||navigator.userAgent||"")}function h0(A){let Q=Q8(),B=Q?{ctrl:"⌃",meta:"⌘",alt:"⌥",shift:"⇧",enter:"↵",escape:"esc",up:"↑",down:"↓",left:"←",right:"→",space:"␣"}:{ctrl:"Ctrl",meta:"Win",alt:"Alt",shift:"Shift",enter:"Enter",escape:"Esc",up:"↑",down:"↓",left:"←",right:"→",space:"Space"};return A.split(" ").map((C)=>C.split("+").map((J)=>B[J]||(J.length===1?J.toUpperCase():J[0].toUpperCase()+J.slice(1))).join(Q?"":"+")).join(" ")}var C8="trove.settings";class b0{constructor(){this.schema=new Map,this.values=T6(),this.cell=d(this.effective())}register(A){for(let Q of[].concat(A))this.schema.set(Q.key,Q);return this.cell.setValue(this.effective()),()=>{for(let Q of[].concat(A))this.schema.delete(Q.key);this.cell.setValue(this.effective())}}get(A){if(A in this.values)return this.values[A];return this.schema.get(A)?.default}set(A,Q){let B=this.schema.get(A);if(B&&Q===B.default)delete this.values[A];else this.values[A]=Q;B8(this.values),this.cell.setValue(this.effective())}reset(A){delete this.values[A],B8(this.values),this.cell.setValue(this.effective())}effective(){let A={};for(let[Q,B]of this.schema)A[Q]=Q in this.values?this.values[Q]:B.default;for(let[Q,B]of Object.entries(this.values))if(!(Q in A))A[Q]=B;return A}observe(){return this.cell}grouped(){let A=new Map;for(let Q of[...this.schema.values()].sort((B,C)=>(B.order??0)-(C.order??0))){if(Q.hidden)continue;let B=Q.category||"General";if(!A.has(B))A.set(B,[]);A.get(B).push({...Q,value:this.get(Q.key)})}return[...A.entries()].map(([Q,B])=>({category:Q,items:B}))}scopedFor(A){let Q=`${A}.`;return{register:(B)=>this.register([].concat(B).map((C)=>({...C,key:Q+C.key,category:C.category||A}))),get:(B)=>this.get(Q+B),set:(B,C)=>this.set(Q+B,C)}}}function T6(){try{return JSON.parse(localStorage.getItem(C8))||{}}catch{return{}}}function B8(A){try{localStorage.setItem(C8,JSON.stringify(A))}catch{}}var w6=0;class v0{constructor(){this.items=[],this.cell=d([])}observe(){return this.cell}#A(A,Q,B={}){let C={id:++w6,level:A,message:Q,actions:B.actions||null,createdAt:Date.now(),sticky:B.sticky||A==="error"};if(this.items=[...this.items,C],this.cell.setValue(this.items),!C.sticky)setTimeout(()=>this.dismiss(C.id),B.timeout??4000);return C.id}info(A,Q){return this.#A("info",A,Q)}success(A,Q){return this.#A("success",A,Q)}warn(A,Q){return this.#A("warn",A,Q)}error(A,Q){return this.#A("error",A,Q)}update(A,Q){this.items=this.items.map((B)=>B.id===A?{...B,...Q}:B),this.cell.setValue(this.items)}dismiss(A){this.items=this.items.filter((Q)=>Q.id!==A),this.cell.setValue(this.items)}}var x6={retries:4,minDelayMs:250,maxDelayMs:8000,factor:2,jitter:!0};function k6(A,Q){return new Promise((B,C)=>{if(Q?.aborted)return C(N.aborted());let J=(Y)=>(L)=>{clearTimeout(K),Q?.removeEventListener("abort",E),Y(L)},K=setTimeout(()=>J(B)(),A),E=()=>J(C)(N.aborted());Q?.addEventListener("abort",E,{once:!0})})}async function DB(A,Q={}){let B={...x6,...Q},C=B.shouldRetry??lE,J=0;for(;;){if(B.signal?.aborted)throw N.aborted();try{return await A(J)}catch(K){let E=yB(K);if(!(J<B.retries&&C(E)&&E.code!=="aborted"))throw E;let L=Math.min(B.maxDelayMs,B.minDelayMs*B.factor**J),X=B.jitter?Math.random()*L:L;B.onRetry?.({attempt:J+1,delayMs:X,error:E}),await k6(X,B.signal),J++}}}class f0{constructor({baseUrl:A="",fetch:Q=globalThis.fetch.bind(globalThis),token:B=null}={}){this.baseUrl=A.replace(/\/$/,""),this._fetch=Q,this._token=B}token(){return(typeof this._token==="function"?this._token():this._token)||null}authHeaders(){let A=this.token();return A?{authorization:`Bearer ${A}`}:{}}async request(A,Q,{body:B,query:C,signal:J,raw:K}={}){let E=this.baseUrl+Q+(C?"?"+new URLSearchParams(C):"");return DB(async()=>{let Y=await this._fetch(E,{method:A,headers:{...this.authHeaders(),...B?{"content-type":"application/json"}:{}},body:B?JSON.stringify(B):void 0,signal:J});if(Y.status===429||Y.status>=500){if(!K){let H;try{let G=await Y.text();H=(G?JSON.parse(G):null)?.error}catch{}if(H&&H.retryable===!1)throw new N(H.code,H.message,{retryable:!1,details:H.details});throw N.transient(H?.message||`Server ${Y.status}`)}throw N.transient(`Server ${Y.status}`)}if(K)return Y;let L=await Y.text(),X=L?JSON.parse(L):null;if(!Y.ok){let H=X?.error||{code:"internal",message:`Request failed (${Y.status})`};throw new N(H.code,H.message,{retryable:H.retryable,details:H.details})}return X},{signal:J,retries:3})}capabilities(){return this.request("GET","/api/capabilities")}async reachable(A=4000){try{let Q=AbortSignal.timeout?AbortSignal.timeout(A):void 0;return(await this._fetch(this.baseUrl+"/api/capabilities",{method:"GET",signal:Q,headers:this.authHeaders()})).ok}catch{return!1}}list(A,Q={}){return this.request("GET",`${this.#A(A)}/items`,{query:Q})}stat(A,{collection:Q,...B}={}){let C=String(A).startsWith("trove:")?"uri":"id",J=Q?`${this.#A(Q)}/items/resolve`:"/api/items/resolve";return this.request("GET",J,{query:{[C]:A,...B}})}#A(A){if(!A)throw Error("This call is scoped to a collection — pass one");return`/api/collections/${encodeURIComponent(A)}`}backlinks(A,Q={}){return this.request("GET","/api/items/backlinks",{query:{id:A,...Q}})}rename(A,Q){return this.request("POST","/api/items/rename",{body:{id:A,newName:Q}})}remove(A){return this.request("POST","/api/items/delete",{body:{id:A}})}trash(A){return this.request("GET",`${this.#A(A)}/trash`)}restore(A){return this.request("POST","/api/trash/restore",{body:{id:A}})}purgeTrash({id:A,collection:Q}={}){return A?this.request("POST","/api/trash/purge",{body:{id:A}}):this.request("POST",`${this.#A(Q)}/trash/purge`)}search(A,{collection:Q,...B}={}){let C=Q?`${this.#A(Q)}/search`:"/api/search";return this.request("GET",C,{query:{q:A,...B}})}query(A,{collection:Q,...B}={}){let C=Q?`${this.#A(Q)}/query`:"/api/query";return this.request("POST",C,{body:{q:A,...B}})}tagSearch(A,Q,{collection:B,...C}={}){let J=B?`${this.#A(B)}/tags/search`:"/api/tags/search";return this.request("POST",J,{body:{filters:A,q:Q,...C}})}indexers(){return this.request("GET","/api/indexers")}tasks(){return this.request("GET","/api/tasks")}cancelTask(A){return this.request("POST",`/api/tasks/${encodeURIComponent(A)}/cancel`)}dismissTask(A){return this.request("DELETE",`/api/tasks/${encodeURIComponent(A)}`)}issues(){return this.request("GET","/api/issues")}retryIssue(A){return this.request("POST",`/api/issues/${encodeURIComponent(A)}/retry`)}dismissIssue(A){return this.request("DELETE",`/api/issues/${encodeURIComponent(A)}`)}reindex(){return this.request("POST","/api/reindex")}scanCollection(A){return this.request("POST",`/api/collections/${encodeURIComponent(A)}/scan`)}checkStorage(){return this.request("POST","/api/diagnostics/storage")}async installPlugin(A,Q){let B=Q&&Q.length?"?grants="+encodeURIComponent(Q.join(",")):"",C=await this._fetch(this.baseUrl+"/api/plugins/install"+B,{method:"POST",body:A,headers:this.authHeaders()}),J=await C.json().catch(()=>null);if(!C.ok){let K=J?.error||{code:"internal",message:`Install failed (${C.status})`};throw new N(K.code,K.message,{details:K.details})}return J.install}installedPlugins(){return this.request("GET","/api/plugins/installed")}async pluginPackage(A){let Q=await this._fetch(`${this.baseUrl}/api/plugins/${encodeURIComponent(A)}/package`,{headers:this.authHeaders()});if(!Q.ok)throw new N("not_found",`Package for "${A}" not found`);return new Uint8Array(await Q.arrayBuffer())}uninstallPluginServer(A){return this.request("DELETE",`/api/plugins/${encodeURIComponent(A)}/install`)}pushIndex(A,Q,B){return this.request("POST",`/api/index/${encodeURIComponent(A)}`,{body:{nodeId:Q,...B}})}me(){return this.request("GET","/api/me")}collections(){return this.request("GET","/api/collections")}createCollection(A){return this.request("POST","/api/collections",{body:A})}updateCollection(A,Q){return this.request("PATCH",`/api/collections/${encodeURIComponent(A)}`,{body:Q})}rotationEstimate(A){return this.request("GET",`/api/collections/${encodeURIComponent(A)}/rotate/estimate`)}rotationState(A){return this.request("GET",`/api/collections/${encodeURIComponent(A)}/rotate`)}beginRotation(A){return this.request("POST",`/api/collections/${encodeURIComponent(A)}/rotate`)}cancelRotation(A){return this.request("DELETE",`/api/collections/${encodeURIComponent(A)}/rotate`)}sidecar(A){return this.request("GET",`/api/items/${encodeURIComponent(A)}/sidecar`)}addComment(A,{body:Q,parentId:B,mentions:C}={}){return this.request("POST",`/api/items/${encodeURIComponent(A)}/comments`,{body:{body:Q,parentId:B,mentions:C}})}editComment(A,Q,B){return this.request("POST",`/api/items/${encodeURIComponent(A)}/comments/${encodeURIComponent(Q)}/edit`,{body:{body:B}})}deleteComment(A,Q){return this.request("DELETE",`/api/items/${encodeURIComponent(A)}/comments/${encodeURIComponent(Q)}`)}reactComment(A,Q,B,C){return this.request("POST",`/api/items/${encodeURIComponent(A)}/comments/${encodeURIComponent(Q)}/react`,{body:{emoji:B,on:C}})}setTag(A,Q,B){return this.request("POST",`/api/items/${encodeURIComponent(A)}/tags`,{body:{name:Q,value:B}})}removeTag(A,Q){return this.request("DELETE",`/api/items/${encodeURIComponent(A)}/tags/${encodeURIComponent(Q)}`)}notifications(){return this.request("GET","/api/notifications")}markNotificationsRead(A){return this.request("POST","/api/notifications/read",{body:{ids:A}})}vapidKey(){return this.request("GET","/api/push/vapid")}apiKeys(){return this.request("GET","/api/keys")}mintApiKey({name:A,scopes:Q,expiresAt:B=null}){return this.request("POST","/api/keys",{body:{name:A,scopes:Q,expiresAt:B}})}revokeApiKey(A){return this.request("DELETE",`/api/keys/${encodeURIComponent(A)}`)}subscribePush(A){return this.request("POST","/api/push/subscribe",{body:{subscription:A}})}downloadUrl(A,{attachment:Q}={}){return`${this.baseUrl}/api/items/download?id=${encodeURIComponent(A)}${Q?"&disposition=attachment":""}`}mintUrls(A,Q="media"){return this.request("POST","/api/items/urls",{body:{ids:A,op:Q}})}async download(A,Q,{attachment:B=!0}={}){let C=this.downloadUrl(A,{attachment:B});if(!this.token())return{url:C,streamed:!0};let J=await this._fetch(C,{headers:this.authHeaders()});if(!J.ok)throw new N("internal",`Download failed (${J.status})`);return{url:URL.createObjectURL(await J.blob()),streamed:!1,revoke:!0}}async readBytes(A,{signal:Q}={}){let B=await this._fetch(this.downloadUrl(A),{signal:Q,headers:this.authHeaders()});if(!B.ok)throw new N("internal",`Download failed (${B.status})`);return new Uint8Array(await B.arrayBuffer())}async readText(A,Q){return new TextDecoder().decode(await this.readBytes(A,Q))}async readTextCapped(A,{maxBytes:Q=524288,size:B=null,signal:C}={}){let J=B==null||B>Q,K=await this._fetch(this.downloadUrl(A),{signal:C,headers:{...this.authHeaders(),...J?{range:`bytes=0-${Q-1}`}:{}}});if(K.status===416)return{text:"",truncated:!1,total:0};if(!K.ok&&K.status!==206)throw new N("internal",`Download failed (${K.status})`);let E=new Uint8Array(await K.arrayBuffer()),Y=Number(/\/(\d+)$/.exec(K.headers.get("content-range")||"")?.[1])||null,L=E.length>=Q&&(Y==null||Y>E.length),X=new TextDecoder("utf-8",{fatal:!1}).decode(E);if(L){let H=X.lastIndexOf(`
4
+ `);if(H>0)X=X.slice(0,H)}return{text:X,truncated:L,total:Y}}async upload(A,Q){let B=Q.name||A.name||"untitled",C=A.size,J=(y)=>DB(y,{signal:Q.signal,retries:4,onRetry:({attempt:b,delayMs:q,error:k})=>Q.onRetry?.({attempt:b,delayMs:q,message:k.message})}),K=await J(()=>this.request("POST",`${this.#A(Q.collection)}/uploads`,{body:{name:B,size:C,contentType:A.type||void 0},signal:Q.signal}));if(K.uploadId)Q.onStart?.(K.uploadId);let E=new J8(C,Q.onProgress),Y=K.transfer||{},L=K.endpoints?.complete||`/api/uploads/${K.uploadId}/complete`;if(K.strategy==="single"){let y=A;return await J(()=>SC(Y.url||K.url,y,{headers:Y.requiredHeaders,signal:Q.signal,onProgress:(q)=>E.set("single",q)})),(await J(()=>this.request("POST",L,{body:{},signal:Q.signal}))).node}if(K.strategy==="direct-single"){let y=A;return await J(()=>SC(this.baseUrl+this.#Q(K,1),y,{headers:{...this.authHeaders(),...Y.authHeaders},signal:Q.signal,onProgress:(q)=>E.set(1,q)})),(await J(()=>this.request("POST",L,{body:{},signal:Q.signal}))).node}let X=K.partSize,H=K.partCount??Math.ceil(C/X),G=new Set;try{let y=K.endpoints?.status||`/api/uploads/${K.uploadId}/status`,b=await this.request("GET",y,{signal:Q.signal});G=new Set(b.received||[])}catch{}let Z=[],M=[];for(let y=1;y<=H;y++){let b=(y-1)*X,q=A.slice(b,Math.min(b+X,C));M.push({n:y,blob:q})}let I=Array(H),F=Math.min(Q.concurrency??4,M.length),V=0,g=new AbortController,u=()=>g.abort();if(Q.signal)if(Q.signal.aborted)g.abort();else Q.signal.addEventListener("abort",u,{once:!0});let j=async()=>{while(V<M.length){if(g.signal.aborted)return;let{n:y,blob:b}=M[V++];if(G.has(y)){E.set(y,b.size);continue}let q=await DB(()=>this.#B(K,y,b,{signal:g.signal,onProgress:(k)=>E.set(y,k)}),{signal:g.signal,retries:4,onRetry:({attempt:k,delayMs:AA,error:QA})=>Q.onRetry?.({attempt:k,delayMs:AA,part:y,message:QA.message})});I[y-1]={partNumber:y,etag:q}}};try{await Promise.all(Array.from({length:F},j))}catch(y){throw g.abort(),y}finally{Q.signal?.removeEventListener("abort",u)}let T=I.filter(Boolean);return(await J(()=>this.request("POST",L,{body:{parts:T},signal:Q.signal}))).node}#Q(A,Q){return(A.transfer?.partUrl||`/api/uploads/${A.uploadId}/parts/{partNumber}`).replace("{partNumber}",String(Q))}async#B(A,Q,B,{signal:C,onProgress:J}){let K=A.transfer||{};if(A.strategy==="presign"){let L=(K.parts||A.parts)?.find((Z)=>Z.partNumber===Q)?.url;if(!L){let Z=A.endpoints?.sign||`/api/uploads/${A.uploadId}/parts/{partNumber}/sign`;L=(await this.request("POST",Z.replace("{partNumber}",String(Q)),{signal:C})).url}let H=(await SC(L,B,{signal:C,onProgress:J,wantEtag:!0})).etag,G=A.endpoints?.report||`/api/uploads/${A.uploadId}/parts/{partNumber}/report`;return await this.request("POST",G.replace("{partNumber}",String(Q)),{body:{etag:H},signal:C}),H}return(await SC(this.baseUrl+this.#Q(A,Q),B,{headers:{...this.authHeaders(),...K.authHeaders},signal:C,onProgress:J,wantJson:!0})).json?.etag}async abortUpload(A){return this.request("DELETE",`/api/uploads/${A}`)}}class J8{constructor(A,Q){this.total=A,this.cb=Q,this.parts=new Map}set(A,Q){let B=this.parts.get(A)||0;if(Q<B)return;if(this.parts.set(A,Q),!this.cb)return;let C=0;for(let K of this.parts.values())C+=K;let J=Math.min(C,this.total);this.cb({loaded:J,total:this.total,ratio:this.total?J/this.total:1})}}function SC(A,Q,{signal:B,onProgress:C,wantEtag:J,wantJson:K,headers:E}={}){return new Promise((Y,L)=>{let X=new XMLHttpRequest;X.open("PUT",A,!0);for(let[H,G]of Object.entries(E||{}))try{X.setRequestHeader(H,G)}catch{}if(B){if(B.aborted)return X.abort(),L(N.aborted());B.addEventListener("abort",()=>X.abort(),{once:!0})}X.upload.onprogress=(H)=>C?.(H.loaded),X.onload=()=>{if(X.status>=200&&X.status<300){let H={status:X.status};if(J)H.etag=X.getResponseHeader("ETag")||X.getResponseHeader("etag");if(K)try{H.json=JSON.parse(X.responseText)}catch{}Y(H)}else if(X.status===429||X.status>=500)L(N.transient(`Upload part failed (${X.status})`));else L(new N("internal",`Upload failed (${X.status})`))},X.onerror=()=>L(N.transient("Network error during upload")),X.onabort=()=>L(N.aborted()),X.send(Q)})}var CA=Uint8Array,wA=Uint16Array,i0=Int32Array,TC=new CA([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),wC=new CA([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),c0=new CA([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),H8=function(A,Q){var B=new wA(31);for(var C=0;C<31;++C)B[C]=Q+=1<<A[C-1];var J=new i0(B[30]);for(var C=1;C<30;++C)for(var K=B[C];K<B[C+1];++K)J[K]=K-B[C]<<5|C;return{b:B,r:J}},$8=H8(TC,2),Z8=$8.b,d0=$8.r;Z8[28]=258,d0[258]=28;var D8=H8(wC,0),g6=D8.b,K8=D8.r,a0=new wA(32768);for(v=0;v<32768;++v)BQ=(v&43690)>>1|(v&21845)<<1,BQ=(BQ&52428)>>2|(BQ&13107)<<2,BQ=(BQ&61680)>>4|(BQ&3855)<<4,a0[v]=((BQ&65280)>>8|(BQ&255)<<8)>>1;var BQ,v,JQ=function(A,Q,B){var C=A.length,J=0,K=new wA(Q);for(;J<C;++J)if(A[J])++K[A[J]-1];var E=new wA(Q);for(J=1;J<Q;++J)E[J]=E[J-1]+K[J-1]<<1;var Y;if(B){Y=new wA(1<<Q);var L=15-Q;for(J=0;J<C;++J)if(A[J]){var X=J<<4|A[J],H=Q-A[J],G=E[A[J]-1]++<<H;for(var Z=G|(1<<H)-1;G<=Z;++G)Y[a0[G]>>L]=X}}else{Y=new wA(C);for(J=0;J<C;++J)if(A[J])Y[J]=a0[E[A[J]-1]++]>>15-A[J]}return Y},wQ=new CA(288);for(v=0;v<144;++v)wQ[v]=8;var v;for(v=144;v<256;++v)wQ[v]=9;var v;for(v=256;v<280;++v)wQ[v]=7;var v;for(v=280;v<288;++v)wQ[v]=8;var v,vB=new CA(32);for(v=0;v<32;++v)vB[v]=5;var v,y6=JQ(wQ,9,0),h6=JQ(wQ,9,1),b6=JQ(vB,5,0),v6=JQ(vB,5,1),u0=function(A){var Q=A[0];for(var B=1;B<A.length;++B)if(A[B]>Q)Q=A[B];return Q},iA=function(A,Q,B){var C=Q/8|0;return(A[C]|A[C+1]<<8)>>(Q&7)&B},m0=function(A,Q){var B=Q/8|0;return(A[B]|A[B+1]<<8|A[B+2]<<16)>>(Q&7)},r0=function(A){return(A+7)/8|0},fB=function(A,Q,B){if(Q==null||Q<0)Q=0;if(B==null||B>A.length)B=A.length;return new CA(A.subarray(Q,B))};var f6=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],VA=function(A,Q,B){var C=Error(Q||f6[A]);if(C.code=A,Error.captureStackTrace)Error.captureStackTrace(C,VA);if(!B)throw C;return C},u6=function(A,Q,B,C){var J=A.length,K=C?C.length:0;if(!J||Q.f&&!Q.l)return B||new CA(0);var E=!B,Y=E||Q.i!=2,L=Q.i;if(E)B=new CA(J*3);var X=function(PQ){var OQ=B.length;if(PQ>OQ){var jQ=new CA(Math.max(OQ*2,PQ));jQ.set(B),B=jQ}},H=Q.f||0,G=Q.p||0,Z=Q.b||0,M=Q.l,I=Q.d,F=Q.m,V=Q.n,g=J*8;do{if(!M){H=iA(A,G,1);var u=iA(A,G+1,3);if(G+=3,!u){var j=r0(G)+4,T=A[j-4]|A[j-3]<<8,c=j+T;if(c>J){if(L)VA(0);break}if(Y)X(Z+T);B.set(A.subarray(j,c),Z),Q.b=Z+=T,Q.p=G=c*8,Q.f=H;continue}else if(u==1)M=h6,I=v6,F=9,V=5;else if(u==2){var y=iA(A,G,31)+257,b=iA(A,G+10,15)+4,q=y+iA(A,G+5,31)+1;G+=14;var k=new CA(q),AA=new CA(19);for(var QA=0;QA<b;++QA)AA[c0[QA]]=iA(A,G+QA*3,7);G+=b*3;var BA=u0(AA),AQ=(1<<BA)-1,IA=JQ(AA,BA,1);for(var QA=0;QA<q;){var UA=IA[iA(A,G,AQ)];G+=UA&15;var j=UA>>4;if(j<16)k[QA++]=j;else{var LA=0,e=0;if(j==16)e=3+iA(A,G,3),G+=2,LA=k[QA-1];else if(j==17)e=3+iA(A,G,7),G+=3;else if(j==18)e=11+iA(A,G,127),G+=7;while(e--)k[QA++]=LA}}var DA=k.subarray(0,y),XA=k.subarray(y);F=u0(DA),V=u0(XA),M=JQ(DA,F,1),I=JQ(XA,V,1)}else VA(1);if(G>g){if(L)VA(0);break}}if(Y)X(Z+131072);var uQ=(1<<F)-1,qA=(1<<V)-1,oA=G;for(;;oA=G){var LA=M[m0(A,G)&uQ],zA=LA>>4;if(G+=LA&15,G>g){if(L)VA(0);break}if(!LA)VA(2);if(zA<256)B[Z++]=zA;else if(zA==256){oA=G,M=null;break}else{var FA=zA-254;if(zA>264){var QA=zA-257,t=TC[QA];FA=iA(A,G,(1<<t)-1)+Z8[QA],G+=t}var fA=I[m0(A,G)&qA],NQ=fA>>4;if(!fA)VA(3);G+=fA&15;var XA=g6[NQ];if(NQ>3){var t=wC[NQ];XA+=m0(A,G)&(1<<t)-1,G+=t}if(G>g){if(L)VA(0);break}if(Y)X(Z+131072);var qQ=Z+FA;if(Z<XA){var KB=K-XA,zQ=Math.min(XA,qQ);if(KB+Z<0)VA(3);for(;Z<zQ;++Z)B[Z]=C[KB+Z]}for(;Z<qQ;++Z)B[Z]=B[Z-XA]}}if(Q.l=M,Q.p=oA,Q.b=Z,Q.f=H,M)H=1,Q.m=F,Q.d=I,Q.n=V}while(!H);return Z!=B.length&&E?fB(B,0,Z):B.subarray(0,Z)},HQ=function(A,Q,B){B<<=Q&7;var C=Q/8|0;A[C]|=B,A[C+1]|=B>>8},hB=function(A,Q,B){B<<=Q&7;var C=Q/8|0;A[C]|=B,A[C+1]|=B>>8,A[C+2]|=B>>16},p0=function(A,Q){var B=[];for(var C=0;C<A.length;++C)if(A[C])B.push({s:C,f:A[C]});var J=B.length,K=B.slice();if(!J)return{t:I8,l:0};if(J==1){var E=new CA(B[0].s+1);return E[B[0].s]=1,{t:E,l:1}}B.sort(function(c,y){return c.f-y.f}),B.push({s:-1,f:25001});var Y=B[0],L=B[1],X=0,H=1,G=2;B[0]={s:-1,f:Y.f+L.f,l:Y,r:L};while(H!=J-1)Y=B[B[X].f<B[G].f?X++:G++],L=B[X!=H&&B[X].f<B[G].f?X++:G++],B[H++]={s:-1,f:Y.f+L.f,l:Y,r:L};var Z=K[0].s;for(var C=1;C<J;++C)if(K[C].s>Z)Z=K[C].s;var M=new wA(Z+1),I=n0(B[H-1],M,0);if(I>Q){var C=0,F=0,V=I-Q,g=1<<V;K.sort(function(y,b){return M[b.s]-M[y.s]||y.f-b.f});for(;C<J;++C){var u=K[C].s;if(M[u]>Q)F+=g-(1<<I-M[u]),M[u]=Q;else break}F>>=V;while(F>0){var j=K[C].s;if(M[j]<Q)F-=1<<Q-M[j]++-1;else++C}for(;C>=0&&F;--C){var T=K[C].s;if(M[T]==Q)--M[T],++F}I=Q}return{t:new CA(M),l:I}},n0=function(A,Q,B){return A.s==-1?Math.max(n0(A.l,Q,B+1),n0(A.r,Q,B+1)):Q[A.s]=B},E8=function(A){var Q=A.length;while(Q&&!A[--Q]);var B=new wA(++Q),C=0,J=A[0],K=1,E=function(L){B[C++]=L};for(var Y=1;Y<=Q;++Y)if(A[Y]==J&&Y!=Q)++K;else{if(!J&&K>2){for(;K>138;K-=138)E(32754);if(K>2)E(K>10?K-11<<5|28690:K-3<<5|12305),K=0}else if(K>3){E(J),--K;for(;K>6;K-=6)E(8304);if(K>2)E(K-3<<5|8208),K=0}while(K--)E(J);K=1,J=A[Y]}return{c:B.subarray(0,C),n:Q}},bB=function(A,Q){var B=0;for(var C=0;C<Q.length;++C)B+=A[C]*Q[C];return B},W8=function(A,Q,B){var C=B.length,J=r0(Q+2);A[J]=C&255,A[J+1]=C>>8,A[J+2]=A[J]^255,A[J+3]=A[J+1]^255;for(var K=0;K<C;++K)A[J+K+4]=B[K];return(J+4+C)*8},Y8=function(A,Q,B,C,J,K,E,Y,L,X,H){HQ(Q,H++,B),++J[256];var G=p0(J,15),Z=G.t,M=G.l,I=p0(K,15),F=I.t,V=I.l,g=E8(Z),u=g.c,j=g.n,T=E8(F),c=T.c,y=T.n,b=new wA(19);for(var q=0;q<u.length;++q)++b[u[q]&31];for(var q=0;q<c.length;++q)++b[c[q]&31];var k=p0(b,7),AA=k.t,QA=k.l,BA=19;for(;BA>4&&!AA[c0[BA-1]];--BA);var AQ=X+5<<3,IA=bB(J,wQ)+bB(K,vB)+E,UA=bB(J,Z)+bB(K,F)+E+14+3*BA+bB(b,AA)+2*b[16]+3*b[17]+7*b[18];if(L>=0&&AQ<=IA&&AQ<=UA)return W8(Q,H,A.subarray(L,L+X));var LA,e,DA,XA;if(HQ(Q,H,1+(UA<IA)),H+=2,UA<IA){LA=JQ(Z,M,0),e=Z,DA=JQ(F,V,0),XA=F;var uQ=JQ(AA,QA,0);HQ(Q,H,j-257),HQ(Q,H+5,y-1),HQ(Q,H+10,BA-4),H+=14;for(var q=0;q<BA;++q)HQ(Q,H+3*q,AA[c0[q]]);H+=3*BA;var qA=[u,c];for(var oA=0;oA<2;++oA){var zA=qA[oA];for(var q=0;q<zA.length;++q){var FA=zA[q]&31;if(HQ(Q,H,uQ[FA]),H+=AA[FA],FA>15)HQ(Q,H,zA[q]>>5&127),H+=zA[q]>>12}}}else LA=y6,e=wQ,DA=b6,XA=vB;for(var q=0;q<Y;++q){var t=C[q];if(t>255){var FA=t>>18&31;if(hB(Q,H,LA[FA+257]),H+=e[FA+257],FA>7)HQ(Q,H,t>>23&31),H+=TC[FA];var fA=t&31;if(hB(Q,H,DA[fA]),H+=XA[fA],fA>3)hB(Q,H,t>>5&8191),H+=wC[fA]}else hB(Q,H,LA[t]),H+=e[t]}return hB(Q,H,LA[256]),H+e[256]},m6=new i0([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),I8=new CA(0),p6=function(A,Q,B,C,J,K){var E=K.z||A.length,Y=new CA(C+E+5*(1+Math.ceil(E/7000))+J),L=Y.subarray(C,Y.length-J),X=K.l,H=(K.r||0)&7;if(Q){if(H)L[0]=K.r>>3;var G=m6[Q-1],Z=G>>13,M=G&8191,I=(1<<B)-1,F=K.p||new wA(32768),V=K.h||new wA(I+1),g=Math.ceil(B/3),u=2*g,j=function(wB){return(A[wB]^A[wB+1]<<g^A[wB+2]<<u)&I},T=new i0(25000),c=new wA(288),y=new wA(32),b=0,q=0,k=K.i||0,AA=0,QA=K.w||0,BA=0;for(;k+2<E;++k){var AQ=j(k),IA=k&32767,UA=V[AQ];if(F[IA]=UA,V[AQ]=IA,QA<=k){var LA=E-k;if((b>7000||AA>24576)&&(LA>423||!X)){H=Y8(A,L,0,T,c,y,q,AA,BA,k-BA,H),AA=b=q=0,BA=k;for(var e=0;e<286;++e)c[e]=0;for(var e=0;e<30;++e)y[e]=0}var DA=2,XA=0,uQ=M,qA=IA-UA&32767;if(LA>2&&AQ==j(k-qA)){var oA=Math.min(Z,LA)-1,zA=Math.min(32767,k),FA=Math.min(258,LA);while(qA<=zA&&--uQ&&IA!=UA){if(A[k+DA]==A[k+DA-qA]){var t=0;for(;t<FA&&A[k+t]==A[k+t-qA];++t);if(t>DA){if(DA=t,XA=qA,t>oA)break;var fA=Math.min(qA,t-2),NQ=0;for(var e=0;e<fA;++e){var qQ=k-qA+e&32767,KB=F[qQ],zQ=qQ-KB&32767;if(zQ>NQ)NQ=zQ,UA=qQ}}}IA=UA,UA=F[IA],qA+=IA-UA&32767}}if(XA){T[AA++]=268435456|d0[DA]<<18|K8[XA];var PQ=d0[DA]&31,OQ=K8[XA]&31;q+=TC[PQ]+wC[OQ],++c[257+PQ],++y[OQ],QA=k+DA,++b}else T[AA++]=A[k],++c[A[k]]}}for(k=Math.max(k,QA);k<E;++k)T[AA++]=A[k],++c[A[k]];if(H=Y8(A,L,X,T,c,y,q,AA,BA,k-BA,H),!X)K.r=H&7|L[H/8|0]<<3,H-=7,K.h=V,K.p=F,K.i=k,K.w=QA}else{for(var k=K.w||0;k<E+X;k+=65535){var jQ=k+65535;if(jQ>=E)L[H/8|0]=X,jQ=E;H=W8(L,H+1,A.subarray(k,jQ))}K.i=E}return fB(Y,0,C+r0(H)+J)},l6=function(){var A=new Int32Array(256);for(var Q=0;Q<256;++Q){var B=Q,C=9;while(--C)B=(B&1&&-306674912)^B>>>1;A[Q]=B}return A}(),c6=function(){var A=-1;return{p:function(Q){var B=A;for(var C=0;C<Q.length;++C)B=l6[B&255^Q[C]]^B>>>8;A=B},d:function(){return~A}}};var d6=function(A,Q,B,C,J){if(!J){if(J={l:1},Q.dictionary){var K=Q.dictionary.subarray(-32768),E=new CA(K.length+A.length);E.set(K),E.set(A,K.length),A=E,J.w=K.length}}return p6(A,Q.level==null?6:Q.level,Q.mem==null?J.l?Math.ceil(Math.max(8,Math.min(13,Math.log(A.length)))*1.5):20:12+Q.mem,B,C,J)},U8=function(A,Q){var B={};for(var C in A)B[C]=A[C];for(var C in Q)B[C]=Q[C];return B};var CQ=function(A,Q){return A[Q]|A[Q+1]<<8},uA=function(A,Q){return(A[Q]|A[Q+1]<<8|A[Q+2]<<16|A[Q+3]<<24)>>>0},l0=function(A,Q){return uA(A,Q)+uA(A,Q+4)*4294967296},WA=function(A,Q,B){for(;B;++Q)A[Q]=B,B>>>=8};function a6(A,Q){return d6(A,Q||{},0,0)}function n6(A,Q){return u6(A,{i:2},Q&&Q.out,Q&&Q.dictionary)}var F8=function(A,Q,B,C){for(var J in A){var K=A[J],E=Q+J,Y=C;if(Array.isArray(K))Y=U8(C,K[1]),K=K[0];if(ArrayBuffer.isView(K))B[E]=[K,Y];else B[E+="/"]=[new CA(0),Y],F8(K,E,B,C)}},L8=typeof TextEncoder<"u"&&new TextEncoder,o0=typeof TextDecoder<"u"&&new TextDecoder,o6=0;try{o0.decode(I8,{stream:!0}),o6=1}catch(A){}var s6=function(A){for(var Q="",B=0;;){var C=A[B++],J=(C>127)+(C>223)+(C>239);if(B+J>A.length)return{s:Q,r:fB(A,B-1)};if(!J)Q+=String.fromCharCode(C);else if(J==3)C=((C&15)<<18|(A[B++]&63)<<12|(A[B++]&63)<<6|A[B++]&63)-65536,Q+=String.fromCharCode(55296|C>>10,56320|C&1023);else if(J&1)Q+=String.fromCharCode((C&31)<<6|A[B++]&63);else Q+=String.fromCharCode((C&15)<<12|(A[B++]&63)<<6|A[B++]&63)}};function X8(A,Q){if(Q){var B=new CA(A.length);for(var C=0;C<A.length;++C)B[C]=A.charCodeAt(C);return B}if(L8)return L8.encode(A);var J=A.length,K=new CA(A.length+(A.length>>1)),E=0,Y=function(H){K[E++]=H};for(var C=0;C<J;++C){if(E+5>K.length){var L=new CA(E+8+(J-C<<1));L.set(K),K=L}var X=A.charCodeAt(C);if(X<128||Q)Y(X);else if(X<2048)Y(192|X>>6),Y(128|X&63);else if(X>55295&&X<57344)X=65536+(X&1047552)|A.charCodeAt(++C)&1023,Y(240|X>>18),Y(128|X>>12&63),Y(128|X>>6&63),Y(128|X&63);else Y(224|X>>12),Y(128|X>>6&63),Y(128|X&63)}return fB(K,0,E)}function i6(A,Q){if(Q){var B="";for(var C=0;C<A.length;C+=16384)B+=String.fromCharCode.apply(null,A.subarray(C,C+16384));return B}else if(o0)return o0.decode(A);else{var J=s6(A),K=J.s,B=J.r;if(B.length)VA(8);return K}}var r6=function(A,Q){return Q+30+CQ(A,Q+26)+CQ(A,Q+28)},t6=function(A,Q,B){var C=CQ(A,Q+28),J=CQ(A,Q+30),K=i6(A.subarray(Q+46,Q+46+C),!(CQ(A,Q+8)&2048)),E=Q+46+C,Y=e6(A,E,J,B,uA(A,Q+20),uA(A,Q+24),uA(A,Q+42)),L=Y[0],X=Y[1],H=Y[2];return[CQ(A,Q+10),L,X,K,E+J+CQ(A,Q+32),H]},e6=function(A,Q,B,C,J,K,E){var Y=J==4294967295,L=K==4294967295,X=E==4294967295,H=Q+B,G=Y+L+X;if(C&&G){for(;Q+4<H;Q+=4+CQ(A,Q+2))if(CQ(A,Q)==1)return[Y?l0(A,Q+4+8*L):J,L?l0(A,Q+4):K,X?l0(A,Q+4+8*(L+Y)):E,1];if(C<2)VA(13)}return[J,K,E,0]},s0=function(A){var Q=0;if(A)for(var B in A){var C=A[B].length;if(C>65535)VA(9);Q+=C+4}return Q},G8=function(A,Q,B,C,J,K,E,Y){var L=C.length,X=B.extra,H=Y&&Y.length,G=s0(X);if(WA(A,Q,E!=null?33639248:67324752),Q+=4,E!=null)A[Q++]=20,A[Q++]=B.os;A[Q]=20,Q+=2,A[Q++]=B.flag<<1|(K<0&&8),A[Q++]=J&&8,A[Q++]=B.compression&255,A[Q++]=B.compression>>8;var Z=new Date(B.mtime==null?Date.now():B.mtime),M=Z.getFullYear()-1980;if(M<0||M>119)VA(10);if(WA(A,Q,M<<25|Z.getMonth()+1<<21|Z.getDate()<<16|Z.getHours()<<11|Z.getMinutes()<<5|Z.getSeconds()>>1),Q+=4,K!=-1)WA(A,Q,B.crc),WA(A,Q+4,K<0?-K-2:K),WA(A,Q+8,B.size);if(WA(A,Q+12,L),WA(A,Q+14,G),Q+=16,E!=null)WA(A,Q,H),WA(A,Q+6,B.attrs),WA(A,Q+10,E),Q+=14;if(A.set(C,Q),Q+=L,G)for(var I in X){var F=X[I],V=F.length;WA(A,Q,+I),WA(A,Q+2,V),A.set(F,Q+4),Q+=4+V}if(H)A.set(Y,Q),Q+=H;return Q},AH=function(A,Q,B,C,J){WA(A,Q,101010256),WA(A,Q+8,B),WA(A,Q+10,B),WA(A,Q+12,C),WA(A,Q+16,J)};function M8(A,Q){if(!Q)Q={};var B={},C=[];F8(A,"",B,Q);var J=0,K=0;for(var E in B){var Y=B[E],L=Y[0],X=Y[1],H=X.level==0?0:8,G=X8(E),Z=G.length,M=X.comment,I=M&&X8(M),F=I&&I.length,V=s0(X.extra);if(Z>65535)VA(11);var g=H?a6(L,X):L,u=g.length,j=c6();j.p(L),C.push(U8(X,{size:L.length,crc:j.d(),c:g,f:G,m:I,u:Z!=E.length||I&&M.length!=F,o:J,compression:H})),J+=30+Z+V+u,K+=76+2*(Z+V)+(F||0)+u}var T=new CA(K+22),c=J,y=K-J;for(var b=0;b<C.length;++b){var G=C[b];G8(T,G.o,G,G.f,G.u,G.c.length);var q=30+G.f.length+s0(G.extra);T.set(G.c,G.o+q),G8(T,J,G,G.f,G.u,G.c.length,G.o,G.m),J+=16+q+(G.m?G.m.length:0)}return AH(T,J,C.length,y,c),T}function R8(A,Q){var B={},C=A.length-22;for(;uA(A,C)!=101010256;--C)if(!C||A.length-C>65558)VA(13);var J=CQ(A,C+8);if(!J)return{};var K=uA(A,C+16),E=uA(A,C-20)==117853008;if(E){var Y=uA(A,C-12);if(E=uA(A,Y)==101075792,E)J=uA(A,Y+32),K=uA(A,Y+48)}var L=Q&&Q.filter;for(var X=0;X<J;++X){var H=t6(A,K,E),G=H[0],Z=H[1],M=H[2],I=H[3],F=H[4],V=H[5],g=r6(A,V);if(K=F,!L||L({name:I,size:Z,originalSize:M,compression:G}))if(!G)B[I]=fB(A,g,g+Z);else if(G==8)B[I]=n6(A.subarray(g,g+Z),{out:new CA(M)});else VA(14,"unknown compression type "+G)}return B}function QH(){return new Promise((A,Q)=>{let B=indexedDB.open("trove-plugins",1);B.onupgradeneeded=()=>{let C=B.result;if(!C.objectStoreNames.contains("installs"))C.createObjectStore("installs",{keyPath:"id"})},B.onsuccess=()=>A(B.result),B.onerror=()=>Q(B.error)})}function xC(A,Q,B){return new Promise((C,J)=>{let K=A.transaction("installs",Q),E=K.objectStore("installs"),Y;Promise.resolve(B(E)).then((L)=>Y=L),K.oncomplete=()=>C(Y),K.onerror=()=>J(K.error)})}var V8=(A)=>new Promise((Q,B)=>{A.onsuccess=()=>Q(A.result),A.onerror=()=>B(A.error)});class t0{constructor(){this._db=null}async#A(){return this._db??=await QH()}async save(A){let Q=await this.#A();return await xC(Q,"readwrite",(B)=>B.put(A)),A}async get(A){let Q=await this.#A();return xC(Q,"readonly",(B)=>V8(B.get(A)))}async list(){let A=await this.#A();return xC(A,"readonly",(Q)=>V8(Q.getAll()))}async remove(A){let Q=await this.#A();await xC(Q,"readwrite",(B)=>B.delete(A))}async patch(A,Q){let B=await this.get(A);if(!B)return null;let C={...B,...Q};return await this.save(C),C}}var kC=null;function JH(){if(!kC)kC=import("./chunk-h05bxfbs.js").then((m)=>BH(m.default,1)).then((A)=>(A.default||A)({locateFile:()=>"/sql-wasm.wasm"})).catch((A)=>{throw kC=null,A});return kC}var KH="trove-plugin-clientdb",gC="dbs";function EH(){return new Promise((A,Q)=>{let B=indexedDB.open(KH,1);B.onupgradeneeded=()=>{let C=B.result;if(!C.objectStoreNames.contains(gC))C.createObjectStore(gC)},B.onsuccess=()=>A(B.result),B.onerror=()=>Q(B.error)})}function e0(A,Q){return EH().then((B)=>new Promise((C,J)=>{let K=B.transaction(gC,A),E;Promise.resolve(Q(K.objectStore(gC))).then((Y)=>E=Y),K.oncomplete=()=>{B.close(),C(E)},K.onerror=()=>{B.close(),J(K.error)}}))}var YH=(A)=>new Promise((Q,B)=>{A.onsuccess=()=>Q(A.result),A.onerror=()=>B(A.error)}),LH=(A)=>e0("readonly",(Q)=>YH(Q.get(A))),XH=(A,Q)=>e0("readwrite",(B)=>B.put(Q,A)),GH=(A)=>e0("readwrite",(Q)=>Q.delete(A));class N8{constructor(A,Q){this.key=A,this.db=Q,this._saveTimer=null}#A(){clearTimeout(this._saveTimer),this._saveTimer=setTimeout(()=>{this.flush().catch((A)=>{console.error(`persisting plugin storage "${this.key}" failed`,A),this.onError?.(A,this.key)})},150)}async flush(){clearTimeout(this._saveTimer),this._saveTimer=null,await XH(this.key,this.db.export())}async exec(A){return this.db.exec(A),this.#A(),{ok:!0}}async run(A,...Q){return this.db.run(A,Q),this.#A(),{ok:!0}}async get(A,...Q){let B=this.db.prepare(A);try{return B.bind(Q),B.step()?B.getAsObject():null}finally{B.free()}}async all(A,...Q){let B=this.db.prepare(A),C=[];try{B.bind(Q);while(B.step())C.push(B.getAsObject())}finally{B.free()}return C}async batch(A=[]){this.db.run("BEGIN");try{for(let{sql:Q,params:B=[]}of A)this.db.run(Q,B);this.db.run("COMMIT")}catch(Q){try{this.db.run("ROLLBACK")}catch{}throw Q}return this.#A(),{ok:!0}}close(){clearTimeout(this._saveTimer),this.db.close()}}class AJ{constructor({onError:A}={}){this._pool=new Map,this.onError=A||null}async obtain(A){let Q=this._pool.get(A);if(!Q){let B=await JH(),C=await LH(A);Q=new N8(A,new B.Database(C||void 0)),Q.onError=this.onError,this._pool.set(A,Q)}return Q}async drop(A){let Q=this._pool.get(A);if(Q)Q.close(),this._pool.delete(A);await GH(A)}}var q8=new TextEncoder;function QJ(A){let Q=atob(A.replace(/-/g,"+").replace(/_/g,"/")),B=new Uint8Array(Q.length);for(let C=0;C<Q.length;C++)B[C]=Q.charCodeAt(C);return B}function z8(A){let Q=new Uint8Array(A),B="";for(let C=0;C<Q.length;C++)B+=Q[C].toString(16).padStart(2,"0");return B}async function P8(A){return new Uint8Array(await crypto.subtle.digest("SHA-256",A))}function HH(A){let Q={...A};return delete Q.signature,JSON.stringify(BJ(Q))}function BJ(A){if(Array.isArray(A))return A.map(BJ);if(A&&typeof A==="object"){let Q={};for(let B of Object.keys(A).sort())Q[B]=BJ(A[B]);return Q}return A}async function $H(A){let Q=[...A.keys()].filter((E)=>E!=="manifest.json").sort(),B=[];for(let E of Q){let Y=A.get(E),L=q8.encode(E),X=new Uint8Array(4);new DataView(X.buffer).setUint32(0,Y.length),B.push(L,new Uint8Array([0]),X,Y)}let C=B.reduce((E,Y)=>E+Y.length,0),J=new Uint8Array(C),K=0;for(let E of B)J.set(E,K),K+=E.length;return z8(await P8(J))}async function ZH(A){return z8(await P8(QJ(A)))}async function DH({manifest:A,files:Q}){if(!A.signature||!A.publicKey)return{signed:!1,valid:!1};let B=await $H(Q);if(A.contentHash&&A.contentHash!==B)return{signed:!0,valid:!1,reason:"File contents do not match the manifest hash"};try{let C=await crypto.subtle.importKey("spki",QJ(A.publicKey),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);if(!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},C,QJ(A.signature),q8.encode(HH(A))))return{signed:!0,valid:!1,reason:"Signature does not verify"};return{signed:!0,valid:!0,fingerprint:await ZH(A.publicKey)}}catch(C){return{signed:!0,valid:!1,reason:"Bad key/signature: "+C.message}}}function WH(A,Q,B){let C=(E)=>(E||"").toLowerCase().replace(/:/g,""),J=C(Q),K=[B.name,`${B.domain}/${B.name}`];for(let E of A?.keys||[]){if(C(E.fingerprint)!==J)continue;if((E.plugins||[]).some((Y)=>Y==="*"||K.includes(Y)))return!0}return!1}async function O8({manifest:A,files:Q},B){let C=await DH({manifest:A,files:Q});if(!C.signed)return{status:"unverified",reason:"Package is not signed"};if(!C.valid)return{status:"invalid",reason:C.reason||"Invalid signature — the package may have been tampered with"};let J=null;try{J=await B(A.domain)}catch{}if(J&&WH(J,C.fingerprint,A))return{status:"verified",domain:A.domain,fingerprint:C.fingerprint};return{status:"signed",domain:A.domain,fingerprint:C.fingerprint,reason:J?"Domain does not list this key":"Could not reach the domain"}}function CJ(A){let Q=/^([a-z][a-z0-9+.-]*:\/\/)\*\.(.+)$/i.exec(A),B=!!Q,C;try{C=new URL(B?Q[1]+Q[2]:A)}catch{throw Error(`Invalid network endpoint "${A}" (must be an absolute http(s) URL)`)}if(C.protocol!=="http:"&&C.protocol!=="https:")throw Error(`Network endpoint "${A}" must use http or https`);let J=C.hostname.toLowerCase();if(!J)throw Error(`Network endpoint "${A}" has no host`);return{scheme:C.protocol,host:J,wildcard:B,port:C.port,pathPrefix:C.pathname||"/",raw:A}}function j8(A){let Q=[];for(let B of A||[])try{Q.push(CJ(B))}catch{}return Q}function IH(A,Q){let B;try{B=new URL(Q)}catch{return!1}if(B.protocol!==A.scheme)return!1;let C=B.hostname.toLowerCase();if(A.wildcard){if(C!==A.host&&!C.endsWith("."+A.host))return!1}else if(C!==A.host)return!1;if(B.port!==A.port)return!1;return B.pathname.startsWith(A.pathPrefix)}function yC(A,Q){return j8(A).some((B)=>IH(B,Q))}function hC(A){return j8(A).map((Q)=>({scheme:Q.scheme.replace(":",""),host:(Q.wildcard?"*.":"")+Q.host+(Q.port?":"+Q.port:""),path:Q.pathPrefix==="/"?"":Q.pathPrefix,raw:Q.raw}))}var UH={files:"Read your files, folders, and search index (via the host).",storage:"Keep its own SQLite database(s) — on the server and/or on this device.",ui:"Show a popup panel and toasts.",commands:"Add commands to the palette, and run the specific host commands it lists.",opener:"Preview/open file types.",indexer:"Add searchable content to your files.",network:"Connect to the internet — only the endpoints it declares (shown below).",media:"Show playback controls on your lock screen and notifications while it plays media.",dock:"Keep its viewer in a small floating window when you navigate away."},JJ=new Set;function _8(A){let Q=EJ(A,"storage");if(!Q)return{plugin:!1,domain:!1};if(Q===!0||typeof Q==="object"&&!("plugin"in Q)&&!("domain"in Q))return{plugin:!0,domain:!1};return{plugin:!!Q.plugin,domain:!!Q.domain}}function FH(A){return UH[A]||A}function S8(A){let Q=A&&A.capabilities,B={};if(Array.isArray(Q)){for(let C of Q)if(C)B[C]={}}else if(Q&&typeof Q==="object")for(let[C,J]of Object.entries(Q)){if(J===!1||J==null)continue;B[C]=J===!0?{}:J}return B}function KJ(A){return Object.keys(S8(A))}function EJ(A,Q){let B=S8(A);return Object.prototype.hasOwnProperty.call(B,Q)?B[Q]:null}function dQ(A){let Q=EJ(A,"network");if(Q){if(Array.isArray(Q))return Q;if(Array.isArray(Q.endpoints))return Q.endpoints;if(Array.isArray(Q.prefixes))return Q.prefixes}if(Array.isArray(A.network))return A.network;return[]}function mA(A){let Q=A?.displayName??A?.name;return typeof Q==="string"&&Q.trim()?Q:"Plugin"}function T8(A){let Q=EJ(A,"commands");if(!Q)return[];if(Array.isArray(Q))return Q.filter(Boolean);if(Array.isArray(Q.execute))return Q.execute.filter(Boolean);return[]}function bC(A,Q,B){if(!Q)return!1;if(TQ(Q)&&oE(A,Q))return!0;return T8(A).includes(Q)}function aQ(A){let Q;try{Q=R8(A instanceof Uint8Array?A:new Uint8Array(A))}catch(K){throw Error("Not a valid zip archive: "+K.message)}let B=new Map;for(let[K,E]of Object.entries(Q))if(!K.endsWith("/"))B.set(K.replace(/^\.?\//,""),E);let C=B.get("manifest.json");if(!C)throw Error("Package is missing manifest.json");let J;try{J=JSON.parse(new TextDecoder().decode(C))}catch(K){throw Error("manifest.json is not valid JSON: "+K.message)}return MH(J,B),{manifest:J,files:B,raw:A}}function MH(A,Q){let B=(C,J)=>{if(!C)throw Error(J)};if(OC(A),B(A.entry,"manifest.entry (path to the plugin script) is required"),B(Q.has(A.entry),`entry "${A.entry}" is not in the package`),A.capabilities!=null)B(Array.isArray(A.capabilities)||typeof A.capabilities==="object","capabilities must be an object of { capability: options } (or an array of ids)");if(A.icon)B(Q.has(A.icon),`icon "${A.icon}" is not in the package`);for(let C of GQ(A)){if(C.entry)B(Q.has(C.entry),`contribution "${C.name}" points at "${C.entry}", which is not in the package`);if(C.type==="keymap")B(Q.has(C.path),`keymap "${C.name}" points at "${C.path}", which is not in the package`)}for(let C of dQ(A))CJ(C)}async function w8(A,Q=globalThis.fetch.bind(globalThis)){let B;try{B=await Q(A)}catch(J){throw Error("Could not fetch the plugin: "+J.message)}if(!B.ok)throw Error(`Could not fetch the plugin (HTTP ${B.status})`);let C=new Uint8Array(await B.arrayBuffer());return aQ(C)}function x8(A,Q){let B=A.manifest,C=GQ(B).map((E)=>({kind:E.type,name:E.name,uri:E.uri,title:E.title||E.name,detail:E.type==="opener"||E.type==="indexer"?RH(E.match):E.type==="statusItem"?`${E.slot} of the status bar${E.command?` — runs ${E.command}`:""}`:E.type==="keymap"?E.path:"",offline:!!E.offline})),J=Q?.status==="verified",K=_8(B);return{id:QQ(B),name:mA(B),version:B.version||"0.0.0",description:B.description||"",author:B.author||"Unknown",domain:B.domain,capabilities:KJ(B).map((E)=>({id:E,description:FH(E),adminOnly:JJ.has(E)})),contributions:C,settings:(B.settings||[]).map((E)=>({key:E.key,title:E.title||E.key,type:E.type,secret:!!E.secret})),network:hC(dQ(B)),commands:T8(B),storage:K.plugin||K.domain?{plugin:K.plugin,domain:K.domain,domainBlocked:K.domain&&!J}:null,fileCount:A.files.size,sizeBytes:[...A.files.values()].reduce((E,Y)=>E+Y.length,0),trust:Q}}function YJ(A,Q){let B=_8(A);return{plugin:B.plugin,domain:B.domain&&Q?.status==="verified"}}function RH(A){if(!A)return"";let Q=[];if(A.ext?.length)Q.push(A.ext.join(", "));if(A.mime?.length)Q.push(A.mime.join(", "));return Q.join(" · ")}class LJ{constructor(){this.owner=null}#A(){return typeof navigator<"u"?navigator.mediaSession:null}apply(A,Q,B={}){let C=this.#A();if(!C)return{ok:!1};if(A&&Q!=="clear")this.owner=A,A.mediaOwner=!0;try{if(Q==="metadata")C.metadata=typeof MediaMetadata<"u"?new MediaMetadata({title:B.title||"",artist:B.artist||"",album:B.album||"",artwork:B.artwork||[]}):C.metadata;else if(Q==="playbackState")C.playbackState=B.state||"none";else if(Q==="position"&&C.setPositionState)C.setPositionState({duration:B.duration||0,position:B.position||0,playbackRate:B.playbackRate||1});else if(Q==="action"){if(C.setActionHandler?.(B.action,B.on?()=>A?.channel?.emit("media:action",{action:B.action}):null),A)A.mediaActions||=new Set,B.on?A.mediaActions.add(B.action):A.mediaActions.delete(B.action)}else if(Q==="clear"){if(A&&this.owner&&this.owner!==A)return{ok:!0};this.releaseActions(A),C.metadata=null,C.playbackState="none",this.owner=null}}catch{}return{ok:!0}}releaseActions(A){let Q=this.#A();if(!Q||!A?.mediaActions)return;for(let B of A.mediaActions)try{Q.setActionHandler?.(B,null)}catch{}A.mediaActions.clear()}releaseFrame(A){if(this.owner===A)this.owner=null,this.apply(A,"clear",{});this.releaseActions(A)}}class XJ{constructor({destroyFrame:A,openFile:Q,onChange:B}={}){this.destroyFrame=A,this.openFile=Q,this.onChange=B||(()=>{}),this.docked=null,this.el=null}place(A,Q,B,C=""){this.stopPlace(A);let J=A.iframe;J.style.cssText=`position:fixed;border:0;visibility:visible;display:block;background:transparent;z-index:${B};margin:0;padding:0;border-radius:${C};`;let K=()=>{let L=Q.getBoundingClientRect(),X=L.width>0&&L.height>0&&document.contains(Q);J.style.left=`${L.left}px`,J.style.top=`${L.top}px`,J.style.width=`${L.width}px`,J.style.height=`${L.height}px`,J.style.visibility=X?"visible":"hidden"};K();let E=typeof ResizeObserver<"u"?new ResizeObserver(K):null;if(E?.observe(Q),document.body)E?.observe(document.body);let Y=typeof IntersectionObserver<"u"?new IntersectionObserver(K,{threshold:[0,1]}):null;Y?.observe(Q),window.addEventListener("scroll",K,!0),window.addEventListener("resize",K),A.place={target:Q,stop:()=>{E?.disconnect(),Y?.disconnect(),window.removeEventListener("scroll",K,!0),window.removeEventListener("resize",K)}}}stopPlace(A){if(A.place)A.place.stop(),A.place=null}hide(A){this.stopPlace(A),A.iframe.style.cssText="position:fixed;left:0;top:0;width:0;height:0;border:0;visibility:hidden;"}releaseFrame(A){if(this.stopPlace(A),this.docked===A)this.docked=null,this.#A()}#A(){if(this.el)this.el.style.display="none"}dock(A){if(this.docked&&this.docked!==A)this.closeDock(this.docked);let Q=A.dock?.minSize||{width:300,height:90},B=this.#Q();B.style.width=`${k8(Q.width,200,480)}px`,B.style.height=`${k8(Q.height,56,360)+26}px`,B.querySelector(".vd-title").textContent=A.node?.name||(A.record.manifest.displayName||A.record.manifest.name),B.style.display="flex",this.place(A,B.querySelector(".vd-body"),61,"0 0 11px 11px"),this.docked=A,A.channel?.emit("dock:state",{docked:!0}),this.onChange()}undock(A){if(this.#A(),this.docked===A)this.docked=null;A.channel?.emit("dock:state",{docked:!1})}closeDock(A){if(this.#A(),this.docked===A)this.docked=null;A.channel?.emit("dock:state",{docked:!1,closed:!0}),this.destroyFrame?.(A),this.onChange()}#Q(){if(this.el)return this.el;let A=document.createElement("div");return A.className="viewer-dock",A.innerHTML='<div class="vd-bar"><span class="vd-title"></span><button class="vd-expand" title="Reopen">↗</button><button class="vd-close" title="Close">✕</button></div><div class="vd-body"></div>',A.querySelector(".vd-expand").addEventListener("click",()=>{let Q=this.docked;if(Q?.node)this.openFile?.(Q.node,Q.openerId)}),A.querySelector(".vd-close").addEventListener("click",()=>{if(this.docked)this.closeDock(this.docked)}),document.body.appendChild(A),this.el=A,A}}function k8(A,Q,B){return Math.max(Q,Math.min(B,A||Q))}function xA(A){console.error(A)}var WB="The provider has been disposed";class m{static deps=[];async obtain(A={}){throw Error("obtain() not implemented")}release(A,Q={}){}async flush(){}static fromSingleton(A,{dispose:Q,deps:B=[]}={}){return class extends m{static deps=B;#A;#Q=!1;constructor(J={}){super();this.#A=J}async obtain(){return A}release(){}async dispose(){if(this.#Q)return;if(this.#Q=!0,typeof Q==="function")await Q(A,this.#A)}}}static fromPool(A,Q,{size:B=1,deps:C=[]}={}){if(!Number.isInteger(B)||B<1)throw RangeError("fromPool() requires an integer size of at least 1");return class extends m{static deps=C;#A;#Q=[];#B=new Set;#C=[];#J=0;#K=!1;constructor(K={}){super();this.#A=K}async#E(K){try{await Q(K,this.#A)}catch(E){xA(E)}}#Y(){while(this.#C.length>0){if(this.#Q.length>0){let E=this.#Q.shift();this.#B.add(E),this.#C.shift().resolve(E);continue}if(this.#J>=B)return;let K=this.#C.shift();this.#J++,Promise.resolve().then(()=>A(this.#A)).then((E)=>{if(this.#K){this.#J--,this.#E(E),K.reject(Error(WB));return}this.#B.add(E),K.resolve(E)},(E)=>{this.#J--,K.reject(E),this.#Y()})}}async obtain(){if(this.#K)throw Error(WB);let K=Promise.withResolvers();return this.#C.push(K),this.#Y(),await K.promise}release(K){if(!this.#B.delete(K))return;if(this.#K){this.#J--,this.#E(K);return}this.#Q.push(K),this.#Y()}async dispose(){if(this.#K)return;this.#K=!0;let K=this.#C.splice(0);for(let{reject:Y}of K)Y(Error(WB));let E=this.#Q.splice(0);this.#J-=E.length,await Promise.all(E.map((Y)=>this.#E(Y)))}}}static fromLazySingleton(A,Q,{deps:B=[]}={}){return class extends m{static deps=B;#A;#Q=null;#B=null;#C=!1;constructor(J={}){super();this.#A=J}async obtain(){if(this.#C)throw Error(WB);this.#Q??=Promise.resolve().then(()=>A(this.#A));try{return this.#B=await this.#Q,this.#B}catch(J){throw this.#Q=null,this.#B=null,J}}release(){}async dispose(){if(this.#C)return;if(this.#C=!0,!this.#Q||typeof Q!=="function")return;let J=this.#B??await this.#Q.catch(()=>null);if(J!=null)await Q(J,this.#A)}}}static fromRefCounted(A,Q,{deps:B=[]}={}){return class extends m{static deps=B;#A;#Q=0;#B=null;#C=null;#J=null;#K=!1;constructor(J={}){super();this.#A=J}async obtain(){if(this.#K)throw Error(WB);this.#Q++;while(this.#J)await this.#J;if(this.#K)throw this.#Q--,Error(WB);if(!this.#B)this.#B=Promise.resolve().then(()=>A(this.#A));try{return this.#C=await this.#B,this.#C}catch(J){if(this.#Q--,this.#Q<=0)this.#Q=0,this.#B=null,this.#C=null;throw J}}async release(){if(this.#Q<=0)return;if(this.#Q--,this.#Q>0)return;let J=this.#C,K=this.#B;if(this.#C=null,this.#B=null,!K)return;this.#J=(async()=>{try{let E=J??await K.catch(()=>null);if(E!=null)await Q(E,this.#A)}catch(E){xA(E)}finally{this.#J=null}})(),await this.#J}async dispose(){if(this.#K=!0,this.#Q>0)this.#Q=1,await this.release();while(this.#J)await this.#J}}}}class GJ{#A;#Q=!1;constructor(A,Q){this.resources=A,this.#A=Q}get released(){return this.#Q}async release(){if(this.#Q)return;this.#Q=!0;for(let{name:A,provider:Q,options:B}of this.#A)try{await Q.release(this.resources[A],B)}catch(C){xA(C)}this.#A=[]}}class xQ{#A=new Map;#Q=new WeakMap;#B;#C=!1;constructor({providers:A,feed:Q}={}){if(this.#B=Q??new EventTarget,!A)return;let B=(C,J)=>{if(this.#A.has(C))return this.#A.get(C);let K=A[C];if(!K)throw Error(`Dependency not found: ${C}`);let E=[...J,C];if(J.includes(C))throw Error(`Cyclic dependency detected: ${E.join(" -> ")}`);let Y={};for(let X of K.deps??[])Y[X]=B(X,E);let L=new K(Y,{engineFeed:this.#B,container:this});return this.#A.set(C,L),L};for(let C of Object.keys(A))B(C,[])}get feed(){return this.#B}get disposed(){return this.#C}has(A){return this.#A.has(A)}get(A){let Q=this.#A.get(A);if(!Q)throw Error(`Dependency not found: ${A}`);return Q}resolve(A){if(!A)return{};let Q=this.#Q.get(A);if(Q)return Q;let B={};if(Array.isArray(A))for(let C of A)B[C]={provider:this.get(C),options:void 0};else for(let C of Object.keys(A))B[C]={provider:this.get(C),options:A[C]};return this.#Q.set(A,B),B}resolveAll(...A){let Q=A.filter(Boolean);if(Q.length===1)return this.resolve(Q[0]);return Object.assign({},...Q.map((B)=>this.resolve(B)))}async lease(...A){if(this.#C)throw Error("The container has been disposed");let Q=this.resolveAll(...A),B={},C=[];try{for(let[J,{provider:K,options:E}]of Object.entries(Q))B[J]=await K.obtain(E),C.push({name:J,provider:K,options:E})}catch(J){throw await new GJ(B,C).release(),J}return new GJ(B,C)}async use(A,Q){let B=await this.lease(A);try{return await Q(B.resources)}finally{await B.release()}}async dispose(){if(this.#C)return;this.#C=!0;let A=[...this.#A.values()].reverse();for(let Q of A)try{await Q.flush?.()}catch(B){xA(B)}for(let Q of A)try{await Q.dispose?.()}catch(B){xA(B)}}}var VH=typeof ErrorEvent==="function"?ErrorEvent:class extends Event{constructor(Q,{error:B,message:C=""}={}){super(Q);this.error=B,this.message=C}};function NH(A){return A&&typeof A.message==="string"?A.message:String(A)}class h8 extends Event{constructor({reason:A,error:Q=null}={}){super("abort");this.reason=A,this.error=Q}}var g8=["complete","error","abort"];function qH(){return typeof DOMException==="function"?new DOMException("The dispatch was aborted","AbortError"):Object.assign(Error("The dispatch was aborted"),{name:"AbortError"})}class O{execute(){throw Error("execute() not implemented")}}class HJ extends EventTarget{#A=new AbortController;#Q;#B=null;constructor(){super();for(let A of g8)this.addEventListener(A,(Q)=>{this.#B??={type:A,event:Q}},{once:!0})}get signal(){return this.#A.signal}get settled(){return this.#B?.type??null}get reason(){return this.#Q}abort(A){if(this.#A.signal.aborted)return;this.#Q=A??qH(),this.#A.abort(this.#Q)}next(A,{signal:Q}={}){let B=new Set(Array.isArray(A)?A:[A]);if(B.size===0)throw TypeError("next() requires at least one event name");let C=B.has("abort");return new Promise((J,K)=>{if(Q?.aborted){K(Q.reason);return}if(this.#A.signal.aborted&&!C&&!this.#B){K(this.#Q);return}if(this.#B){this.#C(J,K,this.#B,B);return}let E=new AbortController,Y={signal:E.signal},L=(X)=>(H)=>{E.abort(),X(H)};for(let X of B)this.addEventListener(X,L(J),Y);for(let X of g8){if(B.has(X))continue;this.addEventListener(X,(H)=>L(K)(y8(X,H,B)),Y)}if(!C)this.#A.signal.addEventListener("abort",()=>L(K)(this.#Q),Y);Q?.addEventListener("abort",()=>L(K)(Q.reason),Y)})}#C(A,Q,B,C){if(C.has(B.type))A(B.event);else Q(y8(B.type,B.event,C))}}function y8(A,Q,B){if(A==="error")return Q.error;if(A==="abort")return Q.reason;return zH(B)}function zH(A){return Error(`The dispatch completed without emitting ${[...A].map((Q)=>`'${Q}'`).join(" or ")}`)}class vC{#A;#Q;constructor({container:A,interceptors:Q}={}){this.#A=A??new xQ,this.#Q=Q?[...Q]:[]}get container(){return this.#A}get feed(){return this.#A.feed}dispatch(A){if(!(A instanceof O))throw TypeError("dispatch() requires an instance of Action");let Q=this.#A,B=this.#Q,C=Q.feed,J=new HJ;return setTimeout(async()=>{let K=[],E={},Y=null,L=(X)=>{if(X!==void 0)E=X};try{for(let H of B){if(K.push(H),!H.enter)continue;L(await Q.use(H.deps,(G)=>H.enter(G,{dispatchFeed:J,engineFeed:C,signal:J.signal,state:E,action:A})))}let X=await Q.lease(A.constructor.deps,A.deps);try{await A.execute(X.resources,{dispatchFeed:J,engineFeed:C,signal:J.signal,state:E})}finally{await X.release()}}catch(X){Y=X}finally{for(let X=K.length-1;X>=0;X--){let H=K[X],G=J.signal.aborted;try{if(G&&H.abort)L(await Q.use(H.deps,(Z)=>H.abort(Z,{dispatchFeed:J,engineFeed:C,signal:J.signal,action:A,state:E,reason:J.reason,error:Y})));else if(Y&&H.error){let Z={dispatchFeed:J,engineFeed:C,signal:J.signal,action:A,state:E,error:Y,handled:()=>{Y=null}};L(await Q.use(H.deps,(M)=>H.error(M,Z)))}else if(!Y&&H.leave)L(await Q.use(H.deps,(Z)=>H.leave(Z,{dispatchFeed:J,engineFeed:C,signal:J.signal,state:E,action:A})))}catch(Z){Y=Z}}if(J.signal.aborted)J.dispatchEvent(new h8({reason:J.reason,error:Y}));else if(Y)J.dispatchEvent(new VH("error",{error:Y,message:NH(Y)}));else J.dispatchEvent(new Event("complete"))}}),J}}class $Q{boot(){throw Error("boot() not implemented, and no fetch() to fall back to")}kill(){}}class b8{#A;#Q;#B=null;#C=null;#J=!1;#K=null;#E=Promise.withResolvers();#Y=!1;#L=void 0;#X=!1;#G=void 0;#$=void 0;observers=new Set;constructor(A,Q){this.#A=A,this.#Q=Q,this.notify=this.notify.bind(this)}get hasValue(){return this.#Y}get currentValue(){return this.#L}get received(){return this.#E.promise}get bootFeed(){return this.#G}get killFeed(){return this.#$}#D(A,Q){let B=this.#A._dispatch(A);return B.addEventListener("error",(C)=>{xA(Error(`${this.#Q.constructor.name} ${Q} (${A.constructor.name}) failed`,{cause:C.error}))},{once:!0}),B}notify(A){if(this.#X)return;if(this.#L=A,!this.#Y)this.#Y=!0,this.#E.resolve(!0);for(let Q of[...this.observers])try{Q.next?.(A)}catch(B){xA(B)}}boot(){if(this.#C)return this.#C;return this.#C=(async()=>{try{if(this.#Q.bootAction)this.#G=this.#D(this.#Q.bootAction,"bootAction");this.#B=await this.#A._container.lease(this.#Q.constructor.deps,this.#Q.deps);let A={notify:this.notify,engineFeed:this.#A._container.feed,bootFeed:this.#G};if(this.#Q.boot===$Q.prototype.boot){if(typeof this.#Q.fetch!=="function")throw Error(`${this.#Q.constructor.name} implements neither boot() nor fetch()`);this.notify(await this.#Q.fetch(this.#B.resources,A)),await this.#Z()}else await this.#Q.boot(this.#B.resources,A)}catch(A){xA(A),await this.#Z(A)}finally{this.#J=!0}})(),this.#C}kill(){if(this.#K)return this.#K;return this.#K=this.#J?this.#H():Promise.resolve(this.#C).then(()=>this.#H()),this.#K}async#H(){if(this.#X)return;try{if(this.#Q.killAction)this.#$=this.#D(this.#Q.killAction,"killAction");if(this.#Q.kill)await this.#Q.kill(this.#B?.resources??{},{bootFeed:this.#G,killFeed:this.#$,engineFeed:this.#A._container.feed,notify:this.notify})}catch(A){xA(A)}finally{await this.#Z()}}async#Z(A){if(this.#X)return;this.#X=!0,this.#A._evict(this.#Q,this);let Q=[...this.observers];this.observers.clear();for(let C of Q)try{if(A!==void 0&&C.error)C.error(A);else C.complete?.()}catch(J){xA(J)}if(!this.#Y)this.#E.resolve(!1);let B=this.#B;if(this.#B=null,B)await B.release()}}class fC{#A;#Q;#B;#C=!1;constructor({container:A,dispatcher:Q,createControllerMap:B}={}){this.#A=A??new xQ,this.#Q=Q??null,this.#B=B?.()??new Map}get container(){return this.#A}get feed(){return this.#A.feed}get _container(){return this.#A}_dispatch(A){if(!this.#Q)throw Error("A query declared a bootAction/killAction but no dispatcher was given to QueryStore");return this.#Q.dispatch(A)}_evict(A,Q){if(this.#B.get(A)===Q)this.#B.delete(A)}#J(A){return[A.constructor.deps,A.deps]}query(A){if(!(A instanceof $Q))throw TypeError("query() requires an instance of Query");return{subscribe:(Q)=>{if(this.#C)throw Error("The query store has been disposed");let B=typeof Q==="function"?{next:Q}:Q||{},C=this.#B.get(A);if(C){if(C.observers.add(B),C.hasValue)try{B.next?.(C.currentValue)}catch(K){xA(K)}}else C=new b8(this,A),this.#B.set(A,C),C.observers.add(B),C.boot();let J=!1;return{get closed(){return J},unsubscribe:()=>{if(J)return;if(J=!0,C.observers.delete(B),C.observers.size===0)this._evict(A,C),C.kill()}}},peek:async()=>{let Q=this.#B.get(A);if(Q&&await Q.received)return Q.currentValue;if(typeof A.fetch!=="function")throw TypeError(`${A.constructor.name} is not active and does not implement fetch()`);let B=await this.#A.lease(...this.#J(A));try{return await A.fetch(B.resources,{engineFeed:this.#A.feed,bootFeed:Q?.bootFeed,killFeed:Q?.killFeed})}finally{await B.release()}}}}async dispose(){if(this.#C)return;this.#C=!0;for(let A of[...this.#B.values?.()??[]])await A.kill()}}class uC{#A;#Q;#B;#C=!1;constructor({providers:A,interceptors:Q,hooks:B,container:C,dispatcher:J,queries:K}={}){this.#A=C??new xQ({providers:A}),this.#Q=J??new vC({container:this.#A,interceptors:Q}),this.#B=K??new fC({container:this.#A,dispatcher:this.#Q,createControllerMap:B?.createQueryControllersMap})}get container(){return this.#A}get dispatcher(){return this.#Q}get queries(){return this.#B}get feed(){return this.#A.feed}dispatch(A){return this.#Q.dispatch(A)}query(A){return this.#B.query(A)}async dispose(){if(this.#C)return;this.#C=!0,await this.#B.dispose(),await this.#A.dispose()}}function mC(A,Q,B,C){let J=A?.[Q];return J&&J.ref===B?J:{ref:B,...C}}var uB="promptValue";function v8(A,Q){let B=A?.[uB];return B&&B.ref===Q?B.value:Q?.value??""}function f8(A){let Q=mB(A);if(Q.status==="invalid")return{status:Q.status,allowed:!1,requiresAcknowledgement:!1,headline:"This package has been altered",detail:`${Q.explanation}. It was signed, and the signature does not match its contents — so it is not what its author published. Trove will not install it.`};if(Q.status==="unverified")return{status:Q.status,allowed:!0,requiresAcknowledgement:!0,headline:"Unsigned — for development only",detail:"Nobody has signed this package, so there is no way to tell who wrote it or whether it has been altered since. Install it only if you built it yourself or you trust wherever you got it from."};if(Q.status==="signed")return{status:Q.status,allowed:!0,requiresAcknowledgement:!1,headline:"Signed, but the domain does not vouch for the key",detail:`${Q.explanation}. The signature is real; what is unproven is that ${Q.domain||"the publisher"} authorised it.`};return{status:Q.status,allowed:!0,requiresAcknowledgement:!1,headline:null,detail:null}}function mB(A){let Q=A||{};switch(Q.status){case"verified":return{status:"verified",tone:"verified",icon:"check",domain:Q.domain||null,explanation:Q.domain?`Signed by a key published at ${Q.domain}`:"Signed by a key the publishing domain vouches for",severity:0};case"signed":return{status:"signed",tone:"signed",icon:"info",domain:Q.domain||null,explanation:Q.reason||"Signed, but the domain does not vouch for the key",severity:1};case"invalid":return{status:"invalid",tone:"invalid",icon:"warn",domain:Q.domain||null,explanation:Q.reason||"The signature did not verify — this package may have been altered",severity:3};default:return{status:"unverified",tone:"unverified",icon:"warn",domain:Q.domain||null,explanation:Q.reason||"This plugin is not signed",severity:2}}}async function u8(A,Q){try{let B=new Uint8Array(await Q.arrayBuffer());await p8(A,aQ(B))}catch(B){A.notifications.error(`Couldn't read the plugin: ${B.message}`)}}async function m8(A,Q){try{let B=await w8(Q,(C,J)=>fetch(C,J));await p8(A,B)}catch(B){A.notifications.error(`Couldn't fetch the plugin: ${B.message}`)}}async function p8(A,Q){let B=mA(Q.manifest);if(A.plugins.plugins.has(QQ(Q.manifest))){A.notifications.warn(`“${B}” is already installed.`);return}let C={status:"unverified"};try{C=await A.plugins.assessTrust(Q)}catch{}let J=f8(C);if(!J.allowed){A.notifications.error(`“${B}” was not installed. ${J.detail}`,{sticky:!0});return}let K=x8(Q,C);A.overlay.set({dialog:{kind:"plugin-review",summary:K,policy:J,isAdmin:!!A.social.state.admin,onInstall:async(E)=>{A.overlay.set({dialog:null}),A.workbench.set({activity:"plugins",sidebarVisible:!0});let Y=A.notifications.info(`Installing “${B}”…`,{sticky:!0});try{await A.plugins.install(Q,{grants:E,trust:C}),A.notifications.dismiss(Y),A.notifications.success(`Installed “${B}”`)}catch(L){A.notifications.dismiss(Y),A.notifications.error(`Install failed: ${L.message}`)}}}})}function PH(A,Q=null){return{...A?.meta||{},...Q||A?.tags||{}}}function OH(A,Q){if(Q.present)return A!=null&&A!==!1&&A!=="";if(A==null)return!1;let B=Number(A),C=Number(Q.value),J=A!==""&&A!==!0&&A!==!1&&Q.value!==""&&Q.value!=null&&!Number.isNaN(B)&&!Number.isNaN(C),K=J?B:String(A).toLowerCase(),E=J?C:String(Q.value).toLowerCase();switch(Q.op){case"!=":return K!==E;case"<":return K<E;case"<=":return K<=E;case">":return K>E;case">=":return K>=E;default:return K===E}}function l8(A,Q,B=null){let C=PH(A,B);return(Q||[]).every((J)=>OH(C[J.key],J))}var jH=/#([\w.-]+)(?::(<=|>=|!=|=|<|>)?("[^"]*"|[^#\s]+)?)?/g;function pB(A){let Q=[],B=A;for(let C of A.matchAll(jH)){let[,J,K,E]=C,Y=E&&E.startsWith('"')?E.slice(1,-1):E;Q.push(Y==null||Y===""?{key:J,present:!0}:{key:J,op:K||"=",value:Y,present:!1}),B=B.replace(C[0]," ")}return{text:B.replace(/\s+/g," ").trim(),filters:Q}}function c8(A,Q){if(!Q||!Q.length)return!0;return l8(A,Q)}function pC(A){return A.present?`#${A.key}`:`#${A.key}:${A.op}${A.value}`}function lB(A){let Q=(A?.name||"").toLowerCase();return Q.includes(".")?Q.slice(Q.lastIndexOf(".")):""}var d8=[{kind:"audio",icon:"file-audio",mime:["audio/"],ext:[".mp3",".flac",".wav",".opus",".ogg",".m4a",".m4b"]},{kind:"image",icon:"file-image",mime:["image/"],ext:[".png",".jpg",".jpeg",".gif",".webp",".svg",".avif"]},{kind:"video",icon:"file-video",mime:["video/"],ext:[".mp4",".webm",".mkv",".mov"]},{kind:"text",icon:"file-text",mime:["text/","application/json"],ext:[".txt",".md",".markdown",".json",".js",".mjs",".ts",".jsx",".tsx",".css",".html",".xml",".yaml",".yml",".toml",".ini",".log",".csv",".py",".rb",".go",".rs",".sh",".c",".h",".cpp",".java"]}];function _H(A,Q,B){if(A.ext.includes(Q))return!0;return A.mime.some((C)=>C.endsWith("/")?B.startsWith(C):B===C)}function a8(A){let Q=lB(A),B=A?.contentType||"";for(let C of d8)if(_H(C,Q,B))return C.kind;return"file"}var SH={...Object.fromEntries(d8.map((A)=>[A.kind,A.icon])),file:"file"};function ZQ(A){return SH[a8(A)]||"file"}function n8(A){return a8(A)==="text"}var IB="openers.associations";function $J(A,Q){return{id:A.id,title:A.title??A.name??A.id,match:A.match??null,priority:A.priority??0,pluginId:A.pluginId??null,source:A.pluginId?Q?.plugins?.get(A.pluginId)?.manifest?.displayName||A.pluginId:"Built-in"}}function o8(A,Q){return(A||[]).filter((B)=>zC(B.match,Q))}function s8(A){return lB(A)||A?.contentType||""}function i8(A){let Q=lB(A);if(Q)return`${Q} files`;let B=A?.contentType||"";return B?`${B} files`:"this file type"}function r8(A,Q){return A.contributions.openersFor(Q).filter((B)=>(!B.when||A.context.evaluate(B.when))&&A.plugins.isAvailable(B)).sort((B,C)=>(C.priority??0)-(B.priority??0)).map((B)=>$J(B,A.plugins))}function t8(A,Q){let B=A.settings.get(IB)||{},C=lB(Q),J=Q?.contentType||"",K=J.includes("/")?`${J.slice(0,J.indexOf("/")+1)}*`:"";return C&&B[C]||J&&B[J]||K&&B[K]||null}function e8(A,Q,B){let C={...A||{}};if(B)C[Q]=B;else delete C[Q];return C}var ZJ="trove:",AY=255;var QY=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function lC(A){if(typeof A!=="string"||!A.toLowerCase().startsWith(ZJ))return null;let Q;try{Q=new URL(A)}catch{return null}let B=Q.pathname,C=B.indexOf("/"),J=C<0?B:B.slice(0,C);if(!QY.test(J))return null;let K=Q.searchParams.get("id"),E=Q.searchParams.get("name"),Y="";if(C>=0)try{Y=decodeURIComponent(B.slice(C+1))}catch{return null}if(K!=null&&(E!=null||Y))return null;let L=K!=null?"id":"name",X=K!=null?K:E!=null?E:Y;if(!X||X.length>AY)return null;return{collection:J,by:L,value:X}}function cB(A,Q="name"){let B=A?.collectionId||"default";if(Q==="id"){if(!A?.id)throw N.invalid("trove: link by id needs a node id");return`${ZJ}${B}?id=${encodeURIComponent(A.id)}`}if(!A?.name)throw N.invalid("trove: link by name needs a node name");return`${ZJ}${B}?name=${encodeURIComponent(A.name)}`}var TH="/c";function BY(A,Q="",B="name"){if(!A?.collectionId)throw N.invalid("An item needs a collection to be linked to");let C=B==="id"?`id:${A.id}`:encodeURIComponent(A.name);if(!C||B==="id"&&!A.id)throw N.invalid("Nothing to link to");let J=`${TH}/${encodeURIComponent(A.collectionId)}/i/${C}`;return Q?`${String(Q).replace(/\/$/,"")}${J}`:J}function CY(A){let Q;try{Q=A.startsWith("/")?A:new URL(A).pathname}catch{return null}let B=/^\/c\/([^/]+)\/i\/(.+)$/.exec(Q);if(!B)return null;let C,J;try{C=decodeURIComponent(B[1]),J=decodeURIComponent(B[2])}catch{return null}if(!QY.test(C))return null;let K=J.startsWith("id:"),E=K?J.slice(3):J;if(!E||E.length>AY)return null;return{collection:C,by:K?"id":"name",value:E}}function dB(A){let Q=A?.selection||[],B=A?.selectionNodes;if(B?.length)return B.filter((C)=>Q.includes(C.id));return(A?.items||[]).filter((C)=>Q.includes(C.id))}class DJ{constructor(A=null){this.state={items:[]},this.cell=d(this.state),this._controllers=new Map,this.activity=A,this._tasks=new Map,this._retries=new Map}observe(){return this.cell}#A(){this.cell.setValue(this.state)}start(A,Q,B,C,{retry:J=null}={}){if(this._controllers.set(A,C),J)this._retries.set(A,J);this.state={items:[...this.state.items,{id:A,name:Q,direction:"up",ratio:0,loaded:0,total:B,status:"active",error:null,retryable:!!J}]},this.#A(),this.#Q(A,Q,B)}#Q(A,Q,B){let C=this.activity?.start({kind:"transfer",title:`Uploading ${Q}`,total:B||null,unit:"bytes",onCancel:()=>this.cancel(A)});if(C)this._tasks.set(A,C)}retry(A){let Q=this._retries.get(A);if(!Q)return null;let B=this.state.items.find((C)=>C.id===A);if(!B||B.status==="active")return null;return Q()}restart(A,Q){this._controllers.set(A,Q);let B=this.state.items.find((C)=>C.id===A);this.state={items:this.state.items.map((C)=>C.id===A?{...C,status:"active",error:null,ratio:0,loaded:0}:C)},this.#A(),this.#Q(A,B?.name||"file",B?.total||null)}progress(A,{loaded:Q,total:B,ratio:C}){this.state={items:this.state.items.map((J)=>J.id===A?{...J,loaded:Q,total:B,ratio:C}:J)},this.#A(),this._tasks.get(A)?.progress({done:Q,total:B||null})}finish(A,Q="done",B=null){this.state={items:this.state.items.map((J)=>J.id===A?{...J,status:Q,error:B,ratio:Q==="done"?1:J.ratio}:J)},this._controllers.delete(A),this.#A();let C=this._tasks.get(A);if(C){if(Q==="done")C.succeed();else if(Q==="cancelled")C.cancel();else C.fail(B||Error("Upload failed"));this._tasks.delete(A)}if(Q==="done")setTimeout(()=>this.dismiss(A),4000)}cancel(A){this._controllers.get(A)?.abort(),this.finish(A,"cancelled")}dismiss(A){this.state={items:this.state.items.filter((Q)=>Q.id!==A)},this._retries.delete(A),this.#A()}clearDone(){let A=this.state.items.filter((B)=>B.status==="active"),Q=new Set(A.map((B)=>B.id));for(let B of[...this._retries.keys()])if(!Q.has(B))this._retries.delete(B);this.state={items:A},this.#A()}}function cC(A){let Q=A?.draft?.caps||{},B=Object.entries(Q).filter(([,C])=>C.length).map(([C,J])=>({collectionId:C,capabilities:J}));return B.length?B:null}function dC(A,Q,B){let C=A?.collectionId,J=(A?.collections||[]).map((K)=>({label:K.name||K.id,icon:K.id===C?"check":"files",actions:[Q(K.id)]}));if(A?.canCreateCollection){if(J.length)J.push({sep:!0});J.push({label:"New collection…",icon:"plus",actions:[B()]})}return J}function JY(A,Q){let B=document.createElement("input");B.type="file",Q(B),B.style.display="none",document.body.appendChild(B);let C=()=>{B.remove(),window.removeEventListener("focus",J)},J=()=>setTimeout(()=>{if(!B.files.length)C()},300);B.addEventListener("change",()=>{A(B.files),C()},{once:!0}),window.addEventListener("focus",J),B.click()}function KY(A){JY((Q)=>A(Q),(Q)=>{Q.multiple=!0})}function EY(A){JY((Q)=>A(Q[0]),(Q)=>{Q.accept=".zip,application/zip"})}function YY(A,Q){let B=document.createElement("a");B.href=A,B.download=Q||"",document.body.appendChild(B),B.click(),B.remove()}function nQ(A={}){let Q=d(A);return{observe:()=>Q,get:()=>Q.getValue(),set:(B)=>Q.setValue({...Q.getValue(),...B}),replace:(B)=>Q.setValue(B)}}var LY=(A)=>nQ({items:[],loading:!1,error:null,selection:[],sort:A.get("explorer.sort"),order:A.get("explorer.sortOrder"),collectionId:null,collections:[],canCreateCollection:!1,gate:null,stats:null,usage:null,nextCursor:null,loadingMore:!1,trash:null}),XY=()=>nQ({query:"",mode:"hybrid",results:[],loading:!1,error:null,ran:!1,paletteFiles:[],paletteQuery:"",paletteLoading:!1,paletteError:null}),GY=()=>nQ({keys:[],loading:!1,loaded:!1,error:null,minted:null,busy:null,draft:null}),HY=()=>nQ({}),$Y=()=>nQ({palette:null,dialog:null,contextMenu:null,pluginPanel:null}),ZY=()=>nQ({activity:"home",sidebarVisible:!0,launch:{query:"",index:0},searchModal:!1,sheet:null,infoPanel:!1});function WJ(A,Q,B){return(A+Q+B)%B}var DY=()=>nQ({collectionId:null,rotation:null,estimate:null,loading:!1,error:null,busy:!1});class kA extends O{static deps=["api","explorer","notifications","settings"];constructor(A){super();this.collectionId=A}async execute(A){let{api:Q,explorer:B,notifications:C,settings:J}=A,K=this.collectionId||B.get().collectionId;if(!K){B.set({loading:!1,gate:"choose"});return}let E=K!==B.get().collectionId;B.set({loading:!0,error:null,collectionId:K,...E?{trash:null}:{}});try{let Y=J.get("explorer.sort"),L=J.get("explorer.sortOrder"),X=await Q.list(K,{sort:Y,order:L});B.set({items:X.items,loading:!1,selection:[],sort:Y,order:L,collectionId:X.collectionId||K,stats:X.stats||null,usage:X.usage||null,nextCursor:X.nextCursor||null}),J.set?.("explorer.lastCollection",K),B.set({gate:null})}catch(Y){B.set({loading:!1,error:Y.message}),C.error(`Couldn't load this collection: ${Y.message}`)}}}class aB extends O{static deps=["api","explorer"];async execute(A){try{let Q=await A.api.collections(),B=Q.collections||[];return A.explorer.set({collections:B,canCreateCollection:!!Q.canCreate}),B}catch{return[]}}}class aC extends O{static deps=["api","engine","explorer","notifications","settings"];async execute(A){let Q=CY(typeof location<"u"?location.pathname:"");if(Q)return this.#A(A,Q);let B=[],C=!1;try{let E=await A.api.collections();B=E.collections||[],C=!!E.canCreate,A.explorer.set({collections:B,canCreateCollection:C})}catch(E){A.explorer.set({loading:!1,error:`Couldn't load your collections: ${E.message}`});return}let J=B.map((E)=>E.id),K=A.settings.get("explorer.lastCollection");if(!J.length){A.explorer.set({loading:!1,items:[],collections:[],gate:C?"create":null,error:C?null:"You do not have access to any collections yet. Ask an administrator to grant you one."});return}if(!K||!J.includes(K)){A.explorer.set({loading:!1,items:[],gate:"choose",error:null});return}return A.explorer.set({gate:null}),A.engine.dispatch(new kA(K))}async#A(A,Q){let{api:B,engine:C,explorer:J,notifications:K}=A;if(typeof history<"u")history.replaceState(null,"","/");let E=[];try{let L=await B.collections();E=L.collections||[],J.set({collections:E,canCreateCollection:!!L.canCreate})}catch(L){J.set({loading:!1,error:`Couldn’t load your collections: ${L.message}`});return}if(!E.some((L)=>L.id===Q.collection)){J.set({loading:!1,items:[],gate:null,error:`This link points at a collection you do not have access to (“${Q.collection}”). Ask whoever shared it to grant you access.`});return}J.set({gate:null}),await C.dispatch(new kA(Q.collection));let Y;try{Y=(Q.by==="id"?await B.stat(Q.value):await B.stat(Q.value,{collection:Q.collection}))?.node||null}catch{Y=null}if(!Y?.id){K.warn(Q.by==="name"?`“${Q.value}” is not in this collection any more — it may have been renamed or removed.`:"That item no longer exists.");return}C.dispatch(new pA(Y,{reset:!0}))}}class z extends O{static deps=["commands"];constructor(A,...Q){super();this.id=A,this.args=Q}async execute({commands:A}){return A.execute(this.id,...this.args)}}class IJ extends O{static deps=["notifications","plugins"];constructor(A){super();this.pluginId=A}async execute(A){try{await A.plugins.uninstall(this.pluginId)}catch(Q){A.notifications.error(`Couldn’t uninstall: ${Q.message}`)}}}class WY extends O{static deps=["api","engine","notifications"];constructor(A){super();this.record=A}async execute(A){try{let Q=await A.api.createCollection(this.record);A.notifications.success(`Created collection “${Q.collection.name}”`),await A.engine.dispatch(new aB),A.engine.dispatch(new kA(Q.collection.id))}catch(Q){A.notifications.error(`Couldn’t create collection: ${Q.message}`)}}}class UJ extends O{static deps=["api","explorer","notifications"];async execute(A){let{api:Q,explorer:B,notifications:C}=A,J=B.get().nextCursor;if(!J||B.get().loadingMore)return;B.set({loadingMore:!0});try{let K=await Q.list(B.get().collectionId,{sort:B.get().sort,order:B.get().order,cursor:J});B.set({items:[...B.get().items,...K.items],nextCursor:K.nextCursor||null,loadingMore:!1})}catch(K){B.set({loadingMore:!1}),C.error(`Couldn't load more: ${K.message}`)}}}class nB extends O{static deps=["engine","explorer"];async execute(A){return A.engine.dispatch(new kA(A.explorer.get().collectionId))}}class oQ extends O{static deps=["api","engine","explorer","notifications"];constructor(A="list",Q=null){super();this.op=A,this.id=Q}async execute(A){let{api:Q,explorer:B,notifications:C}=A,J=B.get().collectionId;if(this.op==="hide"){B.set({trash:null});return}try{if(this.op==="restore"){let{node:E}=await Q.restore(this.id);C.success(`Restored “${E.name}”`)}else if(this.op==="purge")await Q.purgeTrash({id:this.id});else if(this.op==="empty"){let{purged:E}=await Q.purgeTrash({collection:J});C.success(`Deleted ${E} item${E===1?"":"s"} for good`)}let{items:K}=await Q.trash(J);if(B.set({trash:K}),this.op!=="list")await A.engine.dispatch(new kA(J))}catch(K){C.error(`Trash: ${K.message}`)}}}class IY extends O{static deps=["api","engine","navigation","notifications"];constructor(A){super();this.ids=A}async execute(A){try{for(let Q of this.ids)await A.api.remove(Q);A.notifications.info(`Deleted ${this.ids.length} item${this.ids.length>1?"s":""}`);for(let Q of this.ids)A.navigation.forget(Q)}catch(Q){A.notifications.error(`Couldn’t delete: ${Q.message}`)}A.engine.dispatch(new nB)}}class UY extends O{static deps=["api","engine","navigation","notifications"];constructor(A,Q){super();this.id=A,this.newName=Q}async execute(A){try{let Q=await A.api.rename(this.id,this.newName);A.navigation.updateTabNode(Q.node),A.engine.dispatch(new nB)}catch(Q){A.notifications.error(`Couldn’t rename: ${Q.message}`)}}}class pA extends O{static deps=["context","contributions","engine","plugins","settings"];constructor(A,Q={}){super();this.node=A,this.opts=Q}async execute(A){if(!this.node)return;let Q=(J)=>A.engine.dispatch(new IQ(this.node,J,{reset:!!this.opts.reset}));if(this.opts.openerId)return Q(this.opts.openerId);let B=r8(A,this.node),C=t8(A,this.node);if(C&&B.some((J)=>J.id===C))return Q(C);if(B.length>1)return A.engine.dispatch(new dA({kind:"opener-chooser",node:this.node,openers:B,reset:!!this.opts.reset}));Q(B[0]?.id||"core.fallback")}}class oB extends O{static deps=["api","engine","explorer","notifications","settings","transfers"];constructor(A,Q){super();this.files=A,this.collectionId=Q}async execute(A){let Q=this.collectionId||A.explorer.get().collectionId;if(!Q){A.notifications.error("Open a collection before uploading");return}let B=A.settings.get("uploads.concurrency"),C=[...this.files].map((J)=>this.#A(A,J,Q,B));await Promise.allSettled(C),A.engine.dispatch(new kA(Q))}async#A(A,Q,B,C,J=null){let{api:K,notifications:E,transfers:Y}=A,L=J||cE("xfer"),X=new AbortController;if(J)Y.restart(L,X);else Y.start(L,Q.name,Q.size,X,{retry:()=>this.#A(A,Q,B,C,L)});let H=null;try{let G=await K.upload(Q,{collection:B,concurrency:C,signal:X.signal,onStart:(Z)=>{H=Z},onProgress:(Z)=>Y.progress(L,Z)});if(Y.finish(L,"done"),G?.name&&G.name!==Q.name)E.info(`"${Q.name}" already existed — saved as "${G.name}".`)}catch(G){if(H)K.abortUpload(H).catch(()=>{});if(G.code==="aborted")Y.finish(L,"cancelled");else Y.finish(L,"error",G.message),E.error(`Upload failed: ${Q.name} — ${G.message}. Retry it from the transfers tray.`)}}}class UB extends O{static deps=["api","explorer","offline","search"];constructor(A,Q){super();this.filters=A||[],this.text=Q||""}async execute(A){let{api:Q,search:B}=A;if(!this.filters.length){B.set({results:[],ran:!1,filtered:!1});return}if(B.set({query:this.text,loading:!0,error:null,filtered:!0}),A.offline&&!A.offline.state.online){let C=(A.explorer.get().items||[]).filter((J)=>c8(J,this.filters));B.set({results:C.map((J)=>({node:J})),loading:!1,ran:!0,filtered:!0,offline:!0});return}try{let C=await Q.tagSearch(this.filters,this.text.trim()||void 0,{limit:100});B.set({results:(C.items||[]).map((J)=>({node:J})),loading:!1,ran:!0,filtered:!0,offline:!1})}catch(C){B.set({loading:!1,error:C.message,ran:!0,filtered:!0})}}}class FJ extends O{static deps=["api","overlay","search"];constructor(A){super();this.query=A}async execute(A){let{api:Q,overlay:B,search:C}=A;if(B.get().palette?.mode!=="files")return;let J=(this.query||"").trim();if(!J){C.set({paletteFiles:[],paletteQuery:"",paletteError:null,paletteLoading:!1});return}C.set({paletteQuery:J,paletteLoading:!0,paletteError:null});try{let K=await Q.search(J,{mode:"keyword",limit:30});if(C.get().paletteQuery!==J)return;C.set({paletteFiles:K.results||[],paletteLoading:!1})}catch(K){if(C.get().paletteQuery!==J)return;C.set({paletteFiles:[],paletteLoading:!1,paletteError:K?.message||"Search failed"})}}}class DQ extends O{static deps=["api","contributions","offline","search","settings"];constructor(A,Q){super();this.query=A,this.mode=Q}async execute(A){let{api:Q,contributions:B,search:C,settings:J}=A,K=this.query.trim();if(!K){C.set({query:"",results:[],ran:!1,error:null,resolved:null});return}let E=this.mode||J.get("search.mode");C.set({query:this.query,mode:E,loading:!0,error:null,resolved:null});let Y=A.offline;if(Y&&!Y.state.online){try{let L=await Y.searchOffline(K,{limit:40});C.set({results:L,loading:!1,ran:!0,offline:!0,resolved:null})}catch(L){C.set({results:[],loading:!1,ran:!0,offline:!0,error:L.message})}return}try{let L=B.ofType("view").map((H)=>({id:H.id,title:H.title||H.id})),X=await Q.query(K,{mode:E,limit:40,views:L});C.set({results:X.results,resolved:X.resolved||null,loading:!1,ran:!0,offline:!1})}catch(L){if(Y){let X=await Y.searchOffline(K,{limit:40});C.set({results:X,loading:!1,ran:!0,offline:!0,error:X.length?null:L.message})}else C.set({loading:!1,error:L.message,ran:!0})}}}class MJ extends O{static deps=["api","apiKeys"];async execute(A){A.apiKeys.set({loading:!0,error:null});try{let Q=await A.api.apiKeys();A.apiKeys.set({keys:Q.keys||[],loading:!1,loaded:!0,error:null})}catch(Q){A.apiKeys.set({loading:!1,loaded:!0,error:Q?.message||"Could not load API keys"})}}}class FY extends O{static deps=["api","apiKeys","notifications"];constructor(A){super();this.spec=A}async execute(A){A.apiKeys.set({busy:"mint",error:null});try{let{key:Q,secret:B}=await A.api.mintApiKey(this.spec);A.apiKeys.set({minted:{key:Q,secret:B},busy:null});let C=await A.api.apiKeys().catch(()=>null);if(C)A.apiKeys.set({keys:C.keys||[]});return Q}catch(Q){return A.apiKeys.set({busy:null,error:Q?.message||"Could not create the key"}),A.notifications.error(Q?.message||"Could not create the key"),null}}}class RJ extends O{static deps=["api","apiKeys","notifications"];constructor(A){super();this.id=A}async execute(A){A.apiKeys.set({busy:this.id,error:null});try{await A.api.revokeApiKey(this.id);let Q=await A.api.apiKeys().catch(()=>null);A.apiKeys.set({busy:null,...Q?{keys:Q.keys||[]}:{}}),A.notifications.success("Key revoked")}catch(Q){A.apiKeys.set({busy:null}),A.notifications.error(Q?.message||"Could not revoke the key")}}}class VJ extends O{static deps=["keybindings"];constructor(A,Q){super();this.bindingId=A,this.key=Q}async execute({keybindings:A}){let Q=A.resolved().find((B)=>B.bindingId===this.bindingId);if(!Q)return;A.rebind(Q,this.key)}}class rA extends O{static deps=["notifications"];constructor(A,Q="Copied"){super();this.text=A,this.label=Q}async execute({notifications:A}){try{await navigator.clipboard.writeText(this.text),A.success(this.label)}catch{A.info(this.text,{sticky:!0})}}}class NJ extends O{static deps=["notifications"];constructor(A){super();this.id=A}async execute({notifications:A}){A.dismiss(this.id)}}class WQ extends O{static deps=["workbench"];async execute({workbench:A}){this.apply(A)}}class gA extends O{static deps=["overlay"];async execute({overlay:A}){this.apply(A)}}class MY extends O{static deps=["navigation"];async execute({navigation:A}){this.apply(A)}}class PA extends gA{apply(A){A.set({dialog:null})}}class sB extends gA{constructor(A){super();this.patch=A}apply(A){let Q=A.get().dialog;if(Q)A.set({dialog:{...Q,...this.patch}})}}class FB extends gA{apply(A){A.set({contextMenu:null})}}class iB extends gA{apply(A){A.set({palette:null})}}class qJ extends gA{constructor(A){super();this.query=A}apply(A){let Q=A.get().palette;if(Q)A.set({palette:{...Q,query:this.query,index:0}})}}class zJ extends gA{constructor(A){super();this.index=A}apply(A){let Q=A.get().palette;if(Q)A.set({palette:{...Q,index:this.index}})}}class nC extends gA{constructor(A,Q){super();this.delta=A,this.count=Q}apply(A){let Q=A.get().palette;if(!Q||!this.count)return;A.set({palette:{...Q,index:WJ(Q.index,this.delta,this.count)}})}}class PJ extends WQ{apply(A){A.set({searchModal:!0,launch:{query:"",index:0}})}}class MB extends WQ{apply(A){A.set({searchModal:!1})}}class sQ extends WQ{constructor(A){super();this.query=A}apply(A){A.set({launch:{query:this.query,index:0}})}}class OJ extends WQ{constructor(A){super();this.index=A}apply(A){A.set({launch:{...A.get().launch,index:this.index}})}}class oC extends WQ{constructor(A){super();this.which=A}apply(A){A.set({sheet:A.get().sheet===this.which?null:this.which})}}class lA extends WQ{apply(A){A.set({sheet:null})}}class rB extends WQ{constructor(A){super();this.open=A}apply(A){A.set({infoPanel:this.open??!A.get().infoPanel})}}class tB extends gA{constructor(A){super();this.pluginId=A}apply(A){A.set({pluginPanel:this.pluginId})}}class jJ extends gA{apply(A){A.set({pluginPanel:null})}}class IQ extends O{static deps=["navigation","workbench"];constructor(A,Q,B={}){super();this.node=A,this.openerId=Q,this.opts=B}async execute({navigation:A,workbench:Q}){Q.set({activity:"home",searchModal:!1}),A.openFile(this.node,this.openerId,this.opts)}}class RB extends O{static deps=["activity"];async execute(A){this.apply(A.activity)}}class cA extends RB{constructor(A){super();this.which=A}apply(A){A.togglePanel(this.which)}}class _J extends RB{constructor(A){super();this.id=A}apply(A){A.cancel(this.id)}}class SJ extends RB{constructor(A){super();this.id=A}apply(A){A.dismiss(this.id)}}class TJ extends RB{constructor(A){super();this.id=A}apply(A){A.retryIssue(this.id)}}class wJ extends RB{constructor(A){super();this.id=A}apply(A){A.dismissIssue(this.id)}}class eB extends O{static deps=["transfers"];async execute(A){this.apply(A.transfers)}}class AC extends eB{constructor(A){super();this.id=A}apply(A){A.cancel(this.id)}}class xJ extends eB{constructor(A){super();this.id=A}apply(A){A.retry(this.id)}}class kJ extends eB{constructor(A){super();this.id=A}apply(A){A.dismiss(this.id)}}class gJ extends eB{apply(A){A.clearDone()}}class KQ extends O{static deps=["social"];async execute(A){return this.apply(A.social)}}class UQ extends KQ{constructor(A){super();this.open=A}apply(A){A.toggleInbox(this.open)}}class QC extends KQ{apply(A){return A.enablePush()}}class sC extends KQ{constructor(A){super();this.body=A}apply(A){return A.comment(this.body)}}class yJ extends KQ{constructor(A){super();this.commentId=A}apply(A){return A.deleteComment(this.commentId)}}class hJ extends KQ{constructor(A,Q){super();this.commentId=A,this.emoji=Q}apply(A){return A.react(this.commentId,this.emoji)}}class iC extends KQ{constructor(A){super();this.target=A}apply(A){A.setReplyTo(this.target)}}class bJ extends KQ{constructor(A,Q){super();this.name=A,this.value=Q}apply(A){A.addTag(this.name,this.value)}}class vJ extends KQ{constructor(A){super();this.name=A}apply(A){A.removeTag(this.name)}}class BC extends KQ{constructor(A){super();this.nodeId=A}apply(A){A.loadSidecar(this.nodeId)}}class fJ extends O{static deps=["apiKeys"];async execute(A){this.apply(A.apiKeys)}}class rC extends fJ{constructor(A){super();this.patch=A}apply(A){let Q=A.get().draft;if(Q)A.set({draft:{...Q,...this.patch}})}}class uJ extends fJ{constructor(A,Q){super();this.collectionId=A,this.capability=Q}apply(A){let Q=A.get().draft;if(!Q)return;let B={...Q.caps},C=new Set(B[this.collectionId]||[]);if(C.has(this.capability))C.delete(this.capability);else C.add(this.capability);if(C.size)B[this.collectionId]=[...C];else delete B[this.collectionId];A.set({draft:{...Q,caps:B}})}}class mJ extends O{static deps=["explorer","workbench"];constructor(A,Q){super();this.delta=A,this.nodes=Q}async execute({workbench:A,explorer:Q}){let B=this.nodes.length;if(!B)return;let C=WJ(A.get().launch.index,this.delta,B);A.set({launch:{...A.get().launch,index:C}}),RY(Q,this.nodes[C])}}class pJ extends O{static deps=["explorer","workbench"];constructor(A,Q){super();this.index=A,this.node=Q}async execute({workbench:A,explorer:Q}){A.set({launch:{...A.get().launch,index:this.index}}),RY(Q,this.node)}}function RY(A,Q){let B=Q?.id?[Q.id]:[],C=A.get().selection;if(B.length===C.length&&B.every((J,K)=>J===C[K]))return;A.set({selection:B,selectionNodes:Q?[Q]:null})}class iQ extends O{static deps=["viewState"];constructor(A,Q){super();this.key=A,this.value=Q}async execute({viewState:A}){A.set({[this.key]:this.value})}}class kQ extends gA{constructor(A,Q,B){super();this.x=A,this.y=Q,this.items=B}apply(A){A.set({contextMenu:{x:this.x,y:this.y,items:this.items}})}}class dA extends gA{constructor(A){super();this.dialog=A}apply(A){A.set({dialog:this.dialog})}}class gQ extends O{static deps=["settings"];constructor(A,Q){super();this.key=A,this.value=Q}async execute({settings:A}){A.set(this.key,this.value)}}class CC extends O{static deps=["settings"];constructor(A,Q){super();this.typeKey=A,this.openerId=Q}async execute({settings:A}){if(!this.typeKey)return;A.set(IB,e8(A.get(IB),this.typeKey,this.openerId))}}class lJ extends MY{apply(A){A.back()}}class yQ extends O{static deps=["navigation","workbench"];async execute({navigation:A,workbench:Q}){Q.set({activity:"home",searchModal:!1}),A.reset()}}class cJ extends O{static deps=["plugins"];constructor(A){super();this.pluginId=A}async execute({plugins:A}){return A.refresh(this.pluginId)}}class dJ extends O{static deps=["plugins"];constructor(A,Q,B){super();this.pluginId=A,this.key=Q,this.value=B}async execute({plugins:A}){return A.setSecret(this.pluginId,this.key,this.value)}}class aJ extends O{static deps=["api","context","contributions","engine","explorer","notifications","plugins","settings","workbench"];constructor(A){super();this.nodeId=A}async execute(A){let Q;try{({node:Q}=await A.api.stat(this.nodeId))}catch(B){A.notifications.warn(B?.status===403||B?.code==="forbidden"?"You no longer have access to that item.":"That item no longer exists.");return}await new pA(Q).execute(A),A.workbench.set({infoPanel:!0})}}class nJ extends O{static deps=["overlay","viewState"];async execute(A){let B=(A.viewState.get()[uB]?.value??"").trim();if(A.overlay.set({dialog:null}),B)await this.withValue(B,A)}}class VY extends nJ{static deps=["engine","overlay","viewState"];constructor(A){super();this.node=A}async withValue(A,{engine:Q}){if(A!==this.node.name)await Q.dispatch(new UY(this.node.id,A))}}class oJ extends nJ{static deps=["notifications","overlay","plugins","social","viewState","workbench"];async withValue(A,Q){await m8(Q,A)}}class sJ extends O{static deps=["engine","overlay"];constructor(A){super();this.record=A}async execute({engine:A,overlay:Q}){if(Q.set({dialog:null}),this.record)await A.dispatch(new WY(this.record))}}class iJ extends O{static deps=["viewState"];constructor(A,Q,B,C={}){super();this.key=A,this.ref=Q,this.patch=B,this.fallback=C}async execute({viewState:A}){let Q=A.get()[this.key],B=Q&&Q.ref===this.ref?Q.form:this.fallback;A.set({[this.key]:{ref:this.ref,form:{...B,...this.patch}}})}}function JC({explorer:A,navigation:Q,notifications:B},C=null){let J=C||dB(A.get())[0]||Q.activeTab()?.node;if(!J)B.info("Pick a file first — highlight one in the list, or open it.");return J}class tC extends gA{constructor(A="commands",Q=""){super();this.mode=A,this.query=Q}apply(A){A.set({palette:{mode:this.mode,query:this.query,index:0}})}}class KC extends WQ{constructor(A){super();this.activity=A}apply(A){A.set({activity:this.activity,sidebarVisible:!0})}}class rJ extends O{static deps=["activity","navigation","overlay","workbench"];async execute({activity:A,navigation:Q,overlay:B,workbench:C}){let J=B.get(),K=C.get();if(J.contextMenu)return B.set({contextMenu:null});if(J.dialog)return B.set({dialog:null});if(K.sheet)return C.set({sheet:null});if(K.searchModal)return C.set({searchModal:!1});if(J.palette)return B.set({palette:null});if(J.pluginPanel)return B.set({pluginPanel:null});if(A.state?.open)return A.togglePanel(!1);if(Q.state.stack.length>1)Q.back()}}class tJ extends O{static deps=["engine","voice"];async execute({engine:A,voice:Q}){await Q.run({onText:(B,{final:C})=>{if(!B)return;if(A.dispatch(new sQ(B)),C)A.dispatch(new DQ(B))}})}}class eJ extends O{static deps=["activity"];async execute({activity:A}){return A.rebuildIndex().catch(()=>{})}}class AK extends O{static deps=["activity","explorer","notifications"];async execute({activity:A,explorer:Q,notifications:B}){let C=Q.get().collectionId;if(!C)return B.info("Open a collection first — a scan is per collection.");return A.scanCollection(C).catch(()=>{})}}class QK extends O{static deps=["activity"];async execute({activity:A}){return A.checkStorage().catch(()=>{})}}class BK extends O{static deps=["engine","explorer"];async execute({engine:A,explorer:Q}){let B=Q.get().collectionId;KY((C)=>C.length&&A.dispatch(new oB(C,B)))}}class eC extends O{static deps=["engine","explorer","navigation","notifications"];constructor(A="trove",Q=null){super();this.kind=A,this.node=Q}async execute(A){let Q=JC(A,this.node);if(!Q)return;return A.engine.dispatch(this.kind==="share"?new rA(BY(Q,location.origin),"Link copied — anyone with access to this collection can open it"):new rA(cB(Q),`Copied ${cB(Q)}`))}}class CK extends O{static deps=["engine","explorer","navigation","notifications"];constructor(A=null){super();this.node=A}async execute(A){let Q=JC(A,this.node);if(!Q)return;A.engine.dispatch(new dA({kind:"prompt",title:"Rename",label:"New name",value:Q.name,confirmLabel:"Rename",confirmActions:[new VY(Q)]}))}}class JK extends O{static deps=["engine","explorer","navigation","notifications","settings"];async execute(A){let Q=dB(A.explorer.get()),B=Q.length?null:A.navigation.activeTab()?.node;if(B)Q.push(B);if(!Q.length){A.notifications.info("Pick a file first — highlight one in the list, or open it.");return}let C=new IY(Q.map((J)=>J.id));if(!A.settings.get("explorer.confirmDelete"))return A.engine.dispatch(C);A.engine.dispatch(new dA({kind:"confirm",title:`Move ${Q.length} item${Q.length>1?"s":""} to the trash?`,body:Q.length===1?`"${Q[0].name}" leaves the drive but is kept, and can be restored from the trash.`:"They leave the drive but are kept, and can be restored from the trash.",confirmLabel:"Move to trash",confirmActions:[C]}))}}class KK extends O{static deps=["engine"];async execute({engine:A}){A.dispatch(new oQ("list")),A.dispatch(new yQ)}}class EK extends O{static deps=["engine","explorer","navigation","notifications"];constructor(A=null){super();this.node=A}async execute(A){let Q=JC(A,this.node);if(Q)return A.engine.dispatch(new pA(Q))}}class YK extends O{static deps=["api","explorer","navigation","notifications"];constructor(A=null){super();this.node=A}async execute(A){let Q=JC(A,this.node);if(!Q?.id)return;try{let{url:B,revoke:C}=await A.api.download(Q.id,Q.name);if(YY(B,Q.name),C)setTimeout(()=>URL.revokeObjectURL(B),60000)}catch(B){A.notifications.error(`Couldn't download ${Q.name}: ${B.message}`)}}}class A0 extends O{static deps=["explorer","navigation","notifications","offline"];constructor(A=null,Q=!0){super();this.node=A,this.pinned=Q}async execute(A){let Q=JC(A,this.node);if(!Q?.id)return;return this.pinned?A.offline.pin(Q):A.offline.unpin(Q.id)}}class Q0 extends O{static deps=["apiKeys"];async execute({apiKeys:A}){this.apply(A)}}class LK extends Q0{apply(A){A.set({draft:{name:"",expiresInDays:"",caps:{}},error:null})}}class XK extends Q0{apply(A){A.set({draft:null})}}class GK extends Q0{apply(A){if(A.get().minted)A.set({minted:null})}}class HK extends O{static deps=["apiKeys","engine"];async execute({apiKeys:A,engine:Q}){let B=A.get().draft,C=cC(A.get());if(!B?.name?.trim()||!C)return;let J=Number(B.expiresInDays),K=B.expiresInDays!==""&&Number.isFinite(J)&&J>0?Date.now()+J*86400000:null;return A.set({draft:null}),Q.dispatch(new FY({name:B.name.trim(),scopes:C,expiresAt:K}))}}class $K extends O{static deps=["engine","explorer","notifications"];constructor(A=null){super();this.collectionId=A}async execute({engine:A,explorer:Q,notifications:B}){if(this.collectionId){A.dispatch(new kA(this.collectionId)),A.dispatch(new yQ);return}let C=dC(Q.get(),(K)=>new z("collections.switch",K),()=>new z("collections.create"));if(!C.length)return B.info("This drive has one collection.");let J=typeof window>"u"?800:window.innerWidth;A.dispatch(new kQ(Math.max(12,Math.round(J/2)-110),120,C))}}class ZK extends O{static deps=["navigation","notifications","workbench"];async execute({navigation:A,notifications:Q,workbench:B}){if(!A.activeTab()){Q.info("Open a file to see its details and conversation.");return}B.set({infoPanel:!B.get().infoPanel})}}class DK extends O{static deps=["notifications","plugins","social","workbench"];async execute(A){EY((Q)=>Q&&u8(A,Q))}}class WK extends O{static deps=["plugins"];constructor(A,Q,B=[]){super();this.pluginId=A,this.name=Q,this.args=B}async execute({plugins:A}){return A.invokeCommand(this.pluginId,this.name,this.args)}}class IK extends O{static deps=["social"];constructor(A){super();this.nodeId=A}async execute({social:A}){if(A.state.sidecar?.nodeId===this.nodeId)A.loadSidecar(null)}}class VB extends O{static deps=["api","explorer","notifications","rotation"];async execute({api:A,explorer:Q,notifications:B,rotation:C}){let J=Q.get().collectionId;if(!J)return;C.set({collectionId:J,loading:!0,error:null});try{let[K,E]=await Promise.all([A.rotationState(J),A.rotationEstimate(J).catch(()=>null)]);C.set({rotation:K?.rotation??null,estimate:E??null,loading:!1})}catch(K){if(C.set({loading:!1,error:K?.message||"Could not read the rotation state"}),K?.status!==403)B.error?.(K?.message||"Could not read the rotation state")}}}class UK extends O{static deps=["api","engine","explorer","notifications","rotation"];async execute({api:A,engine:Q,explorer:B,notifications:C,rotation:J}){let K=B.get().collectionId;if(!K)return;J.set({busy:!0});try{let E=await A.beginRotation(K);J.set({rotation:E?.rotation??null,busy:!1}),await Q.dispatch(new aB),C.info("Key rotation started. It runs in the background and survives a reload.")}catch(E){J.set({busy:!1}),C.error(E?.message||"Could not start the rotation")}return Q.dispatch(new VB)}}class FK extends O{static deps=["api","engine","explorer","notifications","rotation"];async execute({api:A,engine:Q,explorer:B,notifications:C,rotation:J}){let K=B.get().collectionId;if(!K)return;J.set({busy:!0});try{await A.cancelRotation(K),C.info("Rotation stopped. Files already moved stay on the new key.")}catch(E){C.error(E?.message||"Could not stop the rotation")}return J.set({busy:!1}),Q.dispatch(new VB)}}class MK{constructor(A,Q={}){if(this.port=A,this.onCall=Q.onCall,this.onEvent=Q.onEvent,this.targetOrigin=Q.targetOrigin,this.seq=0,this.pending=new Map,this._listener=(B)=>this._receive(B.data,B),typeof A.addEventListener==="function")A.addEventListener("message",this._listener);else A.onmessage=this._listener;A.start?.()}_post(A,Q){if(this.targetOrigin)this.port.postMessage(A,this.targetOrigin,Q);else this.port.postMessage(A,Q)}call(A,Q,{timeout:B=30000,transfer:C}={}){let J=++this.seq;return new Promise((K,E)=>{let Y=B?setTimeout(()=>{this.pending.delete(J),E(Error(`RPC timeout: ${A}`))},B):null;this.pending.set(J,{resolve:K,reject:E,timer:Y}),this._post({__trove:"req",id:J,method:A,params:Q},C)})}emit(A,Q,B){this._post({__trove:"event",method:A,params:Q},B)}async _receive(A,Q){if(!A||A.__trove==null)return;if(A.__trove==="res"){let B=this.pending.get(A.id);if(!B)return;if(this.pending.delete(A.id),B.timer)clearTimeout(B.timer);if(A.error)B.reject(Object.assign(Error(A.error.message),A.error));else B.resolve(A.result);return}if(A.__trove==="event"){try{await this.onEvent?.(A.method,A.params,Q)}catch(B){console.error("rpc event handler error",B)}return}if(A.__trove==="req"){let B,C;try{B=await this.onCall?.(A.method,A.params,Q)}catch(J){C={message:J?.message||String(J),code:J?.code||"error"}}this._post({__trove:"res",id:A.id,result:B,error:C})}}dispose(){if(typeof this.port.removeEventListener==="function")this.port.removeEventListener("message",this._listener);for(let A of this.pending.values()){if(A.timer)clearTimeout(A.timer);A.reject(Error("RPC channel disposed"))}this.pending.clear(),this.port.close?.()}}var RK=`// Injectable browser build of the Trove plugin SDK — a single self-contained IIFE
5
+ // with NO imports, so the host can inline it into a sandboxed iframe's srcdoc
6
+ // alongside the plugin's entry script. The iframe runs on an opaque origin
7
+ // (sandbox="allow-scripts", no allow-same-origin), so it can't fetch its own
8
+ // package files; instead it reaches everything — resources, files, settings,
9
+ // storage — through the host over a transferred MessagePort. Package resources
10
+ // are handed back as raw bytes (or iframe-local blob: URLs), never host URLs, so
11
+ // the plugin only ever holds opaque handles.
12
+ //
13
+ // Plugins use it as: trove.activate(async (ctx) => { ... })
14
+ (function () {
15
+ 'use strict';
16
+ // Wire-protocol version this SDK speaks. MUST equal PROTOCOL_VERSION in
17
+ // protocol.js — this file is injected as text and cannot import it, so
18
+ // protocol.test.js asserts the two stay in step.
19
+ const SDK_PROTOCOL_VERSION = '1.0';
20
+ let port = null, manifest = null, capabilities = [], storageScopes = {}, online = true, seq = 0, role = 'primary';
21
+ const pending = new Map();
22
+ const commandHandlers = new Map();
23
+ const openerHandlers = new Map();
24
+ let onConnectivity = null, onDeactivate = null, onSettingsChange = null, onDock = null;
25
+ const mediaHandlers = {}; // action -> handler, for OS media-session controls
26
+
27
+ const now = () => { try { return Date.now(); } catch { return 0; } };
28
+
29
+ // The HOST times its own calls out; this side did not, and \`pending\` was never
30
+ // rejected — not on a dropped reply, not on port close. A plugin awaiting one hung
31
+ // forever with no way to find out, and the entry leaked with it.
32
+ const CALL_TIMEOUT_MS = 30_000;
33
+
34
+ function call(method, params, transfer) {
35
+ const id = ++seq;
36
+ return new Promise((resolve, reject) => {
37
+ const timer = setTimeout(() => {
38
+ pending.delete(id);
39
+ reject(new Error(\`Timed out waiting for the host to answer "\${method}"\`));
40
+ }, CALL_TIMEOUT_MS);
41
+ if (timer && timer.unref) timer.unref();
42
+ pending.set(id, { resolve, reject, timer });
43
+ port.postMessage({ __trove: 'req', id, method, params }, transfer || []);
44
+ });
45
+ }
46
+ const emit = (method, params) => port.postMessage({ __trove: 'event', method, params });
47
+
48
+ // What this frame reports about itself on every heartbeat. Contributions are the
49
+ // host's own manifest reading — all the plugin can usefully say is which of its
50
+ // declared contributions it actually bound a handler to, plus whether it thinks
51
+ // it's online.
52
+ function buildManifest() {
53
+ return {
54
+ domain: manifest && manifest.domain, name: manifest && manifest.name,
55
+ online, role, ts: now(),
56
+ handlers: [...commandHandlers.keys()],
57
+ };
58
+ }
59
+ const announce = () => port && emit('manifest', buildManifest());
60
+
61
+ function onPort(e) {
62
+ const m = e.data;
63
+ if (!m || m.__trove == null) return;
64
+ if (m.__trove === 'res') {
65
+ const p = pending.get(m.id);
66
+ if (!p) return;
67
+ clearTimeout(p.timer);
68
+ pending.delete(m.id);
69
+ m.error ? p.reject(Object.assign(new Error(m.error.message), m.error)) : p.resolve(m.result);
70
+ } else if (m.__trove === 'req') {
71
+ Promise.resolve().then(() => dispatch(m.method, m.params))
72
+ .then((result) => port.postMessage({ __trove: 'res', id: m.id, result }))
73
+ .catch((err) => port.postMessage({ __trove: 'res', id: m.id, error: { message: err.message } }));
74
+ } else if (m.__trove === 'event') {
75
+ dispatchEvent(m.method, m.params);
76
+ }
77
+ }
78
+
79
+ function dispatch(method, params) {
80
+ if (method === 'command:execute') {
81
+ const h = commandHandlers.get(params.id);
82
+ // Throw, like \`opener:open\` two lines down. Resolving \`undefined\` for an id with
83
+ // no handler told the host the command had RUN when nothing had.
84
+ if (!h) throw new Error(\`No handler registered for command "\${params.id}"\`);
85
+ return h(...(params.args || []));
86
+ }
87
+ if (method === 'opener:open') {
88
+ // An opener frame boots at that opener's entry module and runs exactly one
89
+ // opener, so an unkeyed onOpen(fn) handler is the normal case.
90
+ const f = openerHandlers.get(params.openerId) || openerHandlers.get('*');
91
+ if (!f) throw new Error('no opener ' + params.openerId);
92
+ return f(params.file, params.context);
93
+ }
94
+ if (method === 'manifest') return buildManifest();
95
+ throw new Error('Unknown host call ' + method);
96
+ }
97
+ async function dispatchEvent(method, params) {
98
+ if (method === 'deactivate') return onDeactivate && onDeactivate();
99
+ if (method === 'connectivity') { online = !!params.online; try { onConnectivity && (await onConnectivity({ online })); } catch (e) { console.error(e); } announce(); }
100
+ if (method === 'settings:changed') { try { onSettingsChange && onSettingsChange(params.key, params.value); } catch (e) { console.error(e); } }
101
+ // The OS/host fired a media transport control (play/pause/next/seek…).
102
+ if (method === 'media:action') { try { mediaHandlers[params.action] && mediaHandlers[params.action](params); } catch (e) { console.error(e); } }
103
+ // The host docked or undocked this viewer (see ctx.dock).
104
+ if (method === 'dock:state') { try { onDock && onDock(params); } catch (e) { console.error(e); } }
105
+ }
106
+
107
+ function requireCap(cap) { if (!capabilities.includes(cap)) throw new Error('Plugin lacks capability "' + cap + '"'); }
108
+
109
+ // Storage: one async SQL handle (mirrors the host SqliteDatabase interface) per
110
+ // scope+side, over RPC. Only granted scopes are exposed on ctx.storage.
111
+ function sqlHandle(scope, side) {
112
+ var send = function (op, extra) { return call('storage:sql', Object.assign({ scope: scope, side: side, op: op }, extra)); };
113
+ return {
114
+ exec: function (sql) { return send('exec', { sql: sql }); },
115
+ run: function (sql) { return send('run', { sql: sql, params: [].slice.call(arguments, 1) }); },
116
+ get: function (sql) { return send('get', { sql: sql, params: [].slice.call(arguments, 1) }); },
117
+ all: function (sql) { return send('all', { sql: sql, params: [].slice.call(arguments, 1) }); },
118
+ batch: function (statements) { return send('batch', { statements: statements }); },
119
+ };
120
+ }
121
+ function scopeHandle(scope) {
122
+ return { server: sqlHandle(scope, 'server'), client: sqlHandle(scope, 'client') };
123
+ }
124
+ function makeStorage() {
125
+ var s = {};
126
+ if (storageScopes.plugin) s.plugin = scopeHandle('plugin');
127
+ if (storageScopes.domain) s.domain = scopeHandle('domain');
128
+ return s;
129
+ }
130
+
131
+ function hasHeader(h, name) { name = name.toLowerCase(); for (var k in h) if (k.toLowerCase() === name) return true; return false; }
132
+ // Wrap the host's brokered-fetch result in a minimal Response-like object.
133
+ function makeResponse(r) {
134
+ var bytes = new Uint8Array(r.bytes || new ArrayBuffer(0));
135
+ var decode = function () { return new TextDecoder().decode(bytes); };
136
+ return {
137
+ ok: r.ok, status: r.status, statusText: r.statusText, url: r.url, headers: r.headers || {},
138
+ arrayBuffer: function () { return Promise.resolve(bytes.slice().buffer); },
139
+ bytes: function () { return Promise.resolve(bytes); },
140
+ text: function () { return Promise.resolve(decode()); },
141
+ json: function () { return Promise.resolve(JSON.parse(decode())); },
142
+ };
143
+ }
144
+
145
+ function makeContext() {
146
+ return {
147
+ manifest, capabilities,
148
+ // Which instance this is: 'primary' is the plugin's single background frame
149
+ // (register commands/indexers, do one-time setup here); 'viewer' is a
150
+ // per-open frame hosting an opener for one file (drive media/dock from here).
151
+ role,
152
+ get online() { return online; },
153
+ // Contributions are DECLARED IN THE MANIFEST (openers, indexers, commands,
154
+ // statusItems, keybindings). The host registers them before this code runs, so
155
+ // a plugin never registers anything at runtime — it only supplies the behaviour
156
+ // for what it declared, addressed by id.
157
+ commands: {
158
+ /** Implement a command this plugin's manifest declares, by its short name. */
159
+ handle(name, handler) { commandHandlers.set(name, handler); return this; },
160
+ /**
161
+ * Run a command. Its OWN commands by short name; anyone else's by full address
162
+ * (a built-in like 'explorer.download', or a \`trove+contrib:\` URI) — and only
163
+ * if the manifest's \`commands\` capability lists it.
164
+ */
165
+ execute(id) { const a = [].slice.call(arguments, 1); return call('command:execute', { id, args: a }); },
166
+ },
167
+ /** Implement the opener this frame was booted for (its entry module). The id is
168
+ * optional — an opener frame runs exactly one opener. */
169
+ onOpen(idOrHandler, maybeHandler) {
170
+ const [id, handler] = typeof idOrHandler === 'function' ? ['*', idOrHandler] : [idOrHandler, maybeHandler];
171
+ openerHandlers.set(id, handler);
172
+ return this;
173
+ },
174
+ // NOTE: there is no onIndex(). Indexers run on the SERVER (in its isolate
175
+ // runtime), not in this sandbox — indexing has to happen once per upload for the
176
+ // drive, not in whichever tab is open. An indexer's entry module is plain ESM
177
+ // exporting \`index(node, ctx)\`; it doesn't use this SDK at all. What a plugin can
178
+ // do from here is PUSH contributions for a node via ctx.files.index (the
179
+ // \`indexer\` capability).
180
+ // Package resources — opaque handles. read() copies bytes into the iframe;
181
+ // url() wraps them in an iframe-local blob: URL.
182
+ resources: {
183
+ list() { return call('resources:list', {}); },
184
+ async read(path) { const r = await call('resources:read', { path }); return new Uint8Array(r.bytes); },
185
+ async text(path) { return new TextDecoder().decode(await this.read(path)); },
186
+ async url(path, type) {
187
+ const bytes = await this.read(path);
188
+ return URL.createObjectURL(new Blob([bytes], { type: type || 'application/octet-stream' }));
189
+ },
190
+ },
191
+ ui: {
192
+ toast: (text, opts) => emit('ui:toast', Object.assign({ text }, opts)),
193
+ showPanel: () => call('ui:showPanel', {}),
194
+ setBadge: (text) => emit('ui:badge', { text }),
195
+ /**
196
+ * Drive a status-bar slot this plugin's manifest declares. \`html\` is sanitized
197
+ * by the host down to a small inline-formatting allowlist before it renders.
198
+ * ctx.ui.status('sync').set('<b>3</b> queued')
199
+ * ctx.ui.status('sync').hide()
200
+ */
201
+ status(name) {
202
+ return {
203
+ set: (html, opts) => call('ui:status', Object.assign({ name, html, visible: true }, opts || {})),
204
+ show: () => call('ui:status', { name, visible: true }),
205
+ hide: () => call('ui:status', { name, visible: false }),
206
+ };
207
+ },
208
+ },
209
+ /**
210
+ * Registers — context value slots this plugin's manifest declares, which
211
+ * when-clauses (its own keymap's, its commands') read by contribution URI.
212
+ * ctx.registers.set('busy', true)
213
+ */
214
+ registers: {
215
+ set: (name, value) => call('context:setRegister', { name, value }),
216
+ },
217
+ // Media session — surfaces this viewer's playback to the OS (lock-screen /
218
+ // notification transport controls, so phones can play/pause/seek). The host
219
+ // owns navigator.mediaSession; action handlers are called back over RPC.
220
+ media: {
221
+ setMetadata: (m) => (requireCap('media'), call('media:metadata', m || {})),
222
+ setPlaybackState: (state) => (requireCap('media'), call('media:playbackState', { state })),
223
+ setPositionState: (p) => (requireCap('media'), call('media:position', p || {})),
224
+ setActionHandler: (action, handler) => { requireCap('media'); if (handler) mediaHandlers[action] = handler; else delete mediaHandlers[action]; return call('media:action', { action, on: !!handler }); },
225
+ clear: () => call('media:clear', {}),
226
+ },
227
+ // Dock — register this viewer to persist as a small floating frame when the
228
+ // user navigates away (a docked video = picture-in-picture; docked audio = a
229
+ // mini transport). Enable while playing/active, disable otherwise. \`minSize\`/
230
+ // \`maxSize\` are {width,height} constraints. onDock is notified on (un)dock.
231
+ dock: {
232
+ enable: (opts) => (requireCap('dock'), call('dock:enable', opts || {})),
233
+ disable: () => (requireCap('dock'), call('dock:disable', {})),
234
+ close: () => call('dock:close', {}),
235
+ onChange: (fn) => { onDock = fn; },
236
+ },
237
+ // Network — there is no direct fetch in the sandbox; the host performs the
238
+ // request, but ONLY to endpoints declared in the manifest's \`network\` list
239
+ // (and only with the "network" capability). Returns a Response-like object.
240
+ net: {
241
+ fetch(url, opts) {
242
+ requireCap('network');
243
+ opts = opts || {};
244
+ var body = opts.body;
245
+ var headers = Object.assign({}, opts.headers);
246
+ if (body && typeof body === 'object' && !(body instanceof ArrayBuffer) && !(body instanceof Uint8Array)) {
247
+ body = JSON.stringify(body);
248
+ if (!hasHeader(headers, 'content-type')) headers['Content-Type'] = 'application/json';
249
+ }
250
+ // \`.buffer\` ignores byteOffset/byteLength, so any view produced by \`subarray\` or
251
+ // \`slice\` — or a view into a pooled buffer — sent the WHOLE backing store: the wrong
252
+ // payload, and an out-of-band leak of whatever else was in it.
253
+ if (ArrayBuffer.isView(body)) {
254
+ body = body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength);
255
+ }
256
+ return call('net:fetch', { url: String(url), method: opts.method || 'GET', headers: headers, body: body })
257
+ .then(makeResponse);
258
+ },
259
+ },
260
+ files: {
261
+ read: (id, opts) => (requireCap('files'), call('files:read', Object.assign({ id }, opts))),
262
+ list: (pathOrId, opts) => (requireCap('files'), call('files:list', Object.assign({ pathOrId }, opts))),
263
+ stat: (id) => (requireCap('files'), call('files:stat', { id })),
264
+ downloadUrl: (id) => (requireCap('files'), call('files:downloadUrl', { id })),
265
+ // index(indexerId, nodeId, contribution) where contribution is
266
+ // { semanticTexts?, tags?, metadata? }. Legacy (indexerId, nodeId, documents[], facet)
267
+ // is still accepted when the 3rd arg is an array of documents.
268
+ index: (indexerId, nodeId, contribution, facet) => {
269
+ requireCap('indexer');
270
+ var payload = Array.isArray(contribution) ? { documents: contribution, facet: facet } : (contribution || {});
271
+ return call('files:index', Object.assign({ indexerId: indexerId, nodeId: nodeId }, payload));
272
+ },
273
+ },
274
+ // Persistent storage: an isolated SQLite database per granted scope. \`plugin\`
275
+ // is private to this plugin; \`domain\` (verified packages only) is shared with
276
+ // the vendor's other plugins. Each scope exposes a \`.server\` handle (and, from
277
+ // Stage 3, an on-device \`.client\` handle) with the same async SQL surface.
278
+ storage: makeStorage(),
279
+ // The plugin's own settings (declared in the manifest). getSecret reads a
280
+ // secret-typed value the host stores separately.
281
+ settings: {
282
+ get: (key) => call('settings:get', { key }),
283
+ getSecret: (key) => call('settings:getSecret', { key }),
284
+ set: (key, value) => call('settings:set', { key, value }),
285
+ onChange: (fn) => { onSettingsChange = fn; },
286
+ },
287
+ onConnectivity: (fn) => { onConnectivity = fn; },
288
+ announce,
289
+ onDeactivate: (fn) => { onDeactivate = fn; },
290
+ };
291
+ }
292
+
293
+ async function activate(setup) {
294
+ await new Promise((resolve) => {
295
+ function onInit(e) {
296
+ if (!e.data || e.data.__trove !== 'init') return;
297
+ window.removeEventListener('message', onInit);
298
+ manifest = e.data.manifest; capabilities = e.data.capabilities || []; storageScopes = e.data.storage || {}; online = e.data.online != null ? e.data.online : true; role = e.data.role || 'primary';
299
+ port = e.ports[0];
300
+ port.onmessage = onPort;
301
+ resolve();
302
+ }
303
+ window.addEventListener('message', onInit);
304
+ parent.postMessage({ __trove: 'ready', protocolVersion: SDK_PROTOCOL_VERSION }, '*');
305
+ });
306
+ const ctx = makeContext();
307
+ try {
308
+ await setup(ctx);
309
+ await call('activated', { ok: true });
310
+ announce();
311
+ } catch (err) {
312
+ await call('activated', { ok: false, error: err && err.message });
313
+ throw err;
314
+ }
315
+ return ctx;
316
+ }
317
+
318
+ globalThis.trove = { activate };
319
+ })();
320
+ `;var VK="1.0";function NY(A){return String(A||"").split(".")[0]||"0"}function qY(A){if(!A)return!0;return NY(A)===NY("1.0")}var zY;(function(A){A[A.Static=1]="Static",A[A.Dynamic=2]="Dynamic",A[A.ImportMeta=3]="ImportMeta",A[A.StaticSourcePhase=4]="StaticSourcePhase",A[A.DynamicSourcePhase=5]="DynamicSourcePhase",A[A.StaticDeferPhase=6]="StaticDeferPhase",A[A.DynamicDeferPhase=7]="DynamicDeferPhase"})(zY||(zY={}));var xH=new Uint8Array(new Uint16Array([1]).buffer)[0]===1;function NK(A,Q="@"){if(!o)return qK.then(()=>NK(A));let B=A.length+1,C=(o.__heap_base.value||o.__heap_base)+4*B-o.memory.buffer.byteLength;C>0&&o.memory.grow(Math.ceil(C/65536));let J=o.sa(B-1);if((xH?gH:kH)(A,new Uint16Array(o.memory.buffer,J,B)),!o.parse())throw Object.assign(Error(`Parse error ${Q}:${A.slice(0,o.e()).split(`
321
+ `).length}:${o.e()-A.lastIndexOf(`
322
+ `,o.e()-1)}`),{idx:o.e()});let K=[],E=[];for(;o.ri();){let L=o.is(),X=o.ie(),H=o.it(),G=o.ai(),Z=o.id(),M=o.ss(),I=o.se(),F;o.ip()&&(F=Y(A.slice(Z===-1?L-1:L,Z===-1?X+1:X))),K.push({n:F,t:H,s:L,e:X,ss:M,se:I,d:Z,a:G})}for(;o.re();){let L=o.es(),X=o.ee(),H=o.els(),G=o.ele(),Z=A.slice(L,X),M=Z[0],I=H<0?void 0:A.slice(H,G),F=I?I[0]:"";E.push({s:L,e:X,ls:H,le:G,n:M==='"'||M==="'"?Y(Z):Z,ln:F==='"'||F==="'"?Y(I):I})}function Y(L){try{return(0,eval)(L)}catch(X){}}return[K,E,!!o.f(),!!o.ms()]}function kH(A,Q){let B=A.length,C=0;for(;C<B;){let J=A.charCodeAt(C);Q[C++]=(255&J)<<8|J>>>8}}function gH(A,Q){let B=A.length,C=0;for(;C<B;)Q[C]=A.charCodeAt(C++)}var o,yH=()=>{return A="AGFzbQEAAAABKwhgAX8Bf2AEf39/fwBgAAF/YAAAYAF/AGADf39/AX9gAn9/AX9gA39/fwADMTAAAQECAgICAgICAgICAgICAgICAgIAAwMDBAQAAAUAAAAAAAMDAwAGAAAABwAGAgUEBQFwAQEBBQMBAAEGDwJ/AUHA8gALfwBBwPIACwd6FQZtZW1vcnkCAAJzYQAAAWUAAwJpcwAEAmllAAUCc3MABgJzZQAHAml0AAgCYWkACQJpZAAKAmlwAAsCZXMADAJlZQANA2VscwAOA2VsZQAPAnJpABACcmUAEQFmABICbXMAEwVwYXJzZQAUC19faGVhcF9iYXNlAwEKzkQwaAEBf0EAIAA2AoAKQQAoAtwJIgEgAEEBdGoiAEEAOwEAQQAgAEECaiIANgKECkEAIAA2AogKQQBBADYC4AlBAEEANgLwCUEAQQA2AugJQQBBADYC5AlBAEEANgL4CUEAQQA2AuwJIAEL0wEBA39BACgC8AkhBEEAQQAoAogKIgU2AvAJQQAgBDYC9AlBACAFQSRqNgKICiAEQSBqQeAJIAQbIAU2AgBBACgC1AkhBEEAKALQCSEGIAUgATYCACAFIAA2AgggBSACIAJBAmpBACAGIANGIgAbIAQgA0YiBBs2AgwgBSADNgIUIAVBADYCECAFIAI2AgQgBUEANgIgIAVBA0EBQQIgABsgBBs2AhwgBUEAKALQCSADRiICOgAYAkACQCACDQBBACgC1AkgA0cNAQtBAEEBOgCMCgsLXgEBf0EAKAL4CSIEQRBqQeQJIAQbQQAoAogKIgQ2AgBBACAENgL4CUEAIARBFGo2AogKQQBBAToAjAogBEEANgIQIAQgAzYCDCAEIAI2AgggBCABNgIEIAQgADYCAAsIAEEAKAKQCgsVAEEAKALoCSgCAEEAKALcCWtBAXULHgEBf0EAKALoCSgCBCIAQQAoAtwJa0EBdUF/IAAbCxUAQQAoAugJKAIIQQAoAtwJa0EBdQseAQF/QQAoAugJKAIMIgBBACgC3AlrQQF1QX8gABsLCwBBACgC6AkoAhwLHgEBf0EAKALoCSgCECIAQQAoAtwJa0EBdUF/IAAbCzsBAX8CQEEAKALoCSgCFCIAQQAoAtAJRw0AQX8PCwJAIABBACgC1AlHDQBBfg8LIABBACgC3AlrQQF1CwsAQQAoAugJLQAYCxUAQQAoAuwJKAIAQQAoAtwJa0EBdQsVAEEAKALsCSgCBEEAKALcCWtBAXULHgEBf0EAKALsCSgCCCIAQQAoAtwJa0EBdUF/IAAbCx4BAX9BACgC7AkoAgwiAEEAKALcCWtBAXVBfyAAGwslAQF/QQBBACgC6AkiAEEgakHgCSAAGygCACIANgLoCSAAQQBHCyUBAX9BAEEAKALsCSIAQRBqQeQJIAAbKAIAIgA2AuwJIABBAEcLCABBAC0AlAoLCABBAC0AjAoL3Q0BBX8jAEGA0ABrIgAkAEEAQQE6AJQKQQBBACgC2Ak2ApwKQQBBACgC3AlBfmoiATYCsApBACABQQAoAoAKQQF0aiICNgK0CkEAQQA6AIwKQQBBADsBlgpBAEEAOwGYCkEAQQA6AKAKQQBBADYCkApBAEEAOgD8CUEAIABBgBBqNgKkCkEAIAA2AqgKQQBBADoArAoCQAJAAkACQANAQQAgAUECaiIDNgKwCiABIAJPDQECQCADLwEAIgJBd2pBBUkNAAJAAkACQAJAAkAgAkGbf2oOBQEICAgCAAsgAkEgRg0EIAJBL0YNAyACQTtGDQIMBwtBAC8BmAoNASADEBVFDQEgAUEEakGCCEEKEC8NARAWQQAtAJQKDQFBAEEAKAKwCiIBNgKcCgwHCyADEBVFDQAgAUEEakGMCEEKEC8NABAXC0EAQQAoArAKNgKcCgwBCwJAIAEvAQQiA0EqRg0AIANBL0cNBBAYDAELQQEQGQtBACgCtAohAkEAKAKwCiEBDAALC0EAIQIgAyEBQQAtAPwJDQIMAQtBACABNgKwCkEAQQA6AJQKCwNAQQAgAUECaiIDNgKwCgJAAkACQAJAAkACQAJAIAFBACgCtApPDQAgAy8BACICQXdqQQVJDQYCQAJAAkACQAJAAkACQAJAAkACQCACQWBqDgoQDwYPDw8PBQECAAsCQAJAAkACQCACQaB/ag4KCxISAxIBEhISAgALIAJBhX9qDgMFEQYJC0EALwGYCg0QIAMQFUUNECABQQRqQYIIQQoQLw0QEBYMEAsgAxAVRQ0PIAFBBGpBjAhBChAvDQ8QFwwPCyADEBVFDQ4gASkABELsgISDsI7AOVINDiABLwEMIgNBd2oiAUEXSw0MQQEgAXRBn4CABHFFDQwMDQtBAEEALwGYCiIBQQFqOwGYCkEAKAKkCiABQQN0aiIBQQE2AgAgAUEAKAKcCjYCBAwNC0EALwGYCiIDRQ0JQQAgA0F/aiIDOwGYCkEALwGWCiICRQ0MQQAoAqQKIANB//8DcUEDdGooAgBBBUcNDAJAIAJBAnRBACgCqApqQXxqKAIAIgMoAgQNACADQQAoApwKQQJqNgIEC0EAIAJBf2o7AZYKIAMgAUEEajYCDAwMCwJAQQAoApwKIgEvAQBBKUcNAEEAKALwCSIDRQ0AIAMoAgQgAUcNAEEAQQAoAvQJIgM2AvAJAkAgA0UNACADQQA2AiAMAQtBAEEANgLgCQtBAEEALwGYCiIDQQFqOwGYCkEAKAKkCiADQQN0aiIDQQZBAkEALQCsChs2AgAgAyABNgIEQQBBADoArAoMCwtBAC8BmAoiAUUNB0EAIAFBf2oiATsBmApBACgCpAogAUH//wNxQQN0aigCAEEERg0EDAoLQScQGgwJC0EiEBoMCAsgAkEvRw0HAkACQCABLwEEIgFBKkYNACABQS9HDQEQGAwKC0EBEBkMCQsCQAJAAkACQEEAKAKcCiIBLwEAIgMQG0UNAAJAAkAgA0FVag4EAAkBAwkLIAFBfmovAQBBK0YNAwwICyABQX5qLwEAQS1GDQIMBwsgA0EpRw0BQQAoAqQKQQAvAZgKIgJBA3RqKAIEEBxFDQIMBgsgAUF+ai8BAEFQakH//wNxQQpPDQULQQAvAZgKIQILAkACQCACQf//A3EiAkUNACADQeYARw0AQQAoAqQKIAJBf2pBA3RqIgQoAgBBAUcNACABQX5qLwEAQe8ARw0BIAQoAgRBlghBAxAdRQ0BDAULIANB/QBHDQBBACgCpAogAkEDdGoiAigCBBAeDQQgAigCAEEGRg0ECyABEB8NAyADRQ0DIANBL0ZBAC0AoApBAEdxDQMCQEEAKAL4CSICRQ0AIAEgAigCAEkNACABIAIoAgRNDQQLIAFBfmohAUEAKALcCSECAkADQCABQQJqIgQgAk0NAUEAIAE2ApwKIAEvAQAhAyABQX5qIgQhASADECBFDQALIARBAmohBAsCQCADQf//A3EQIUUNACAEQX5qIQECQANAIAFBAmoiAyACTQ0BQQAgATYCnAogAS8BACEDIAFBfmoiBCEBIAMQIQ0ACyAEQQJqIQMLIAMQIg0EC0EAQQE6AKAKDAcLQQAoAqQKQQAvAZgKIgFBA3QiA2pBACgCnAo2AgRBACABQQFqOwGYCkEAKAKkCiADakEDNgIACxAjDAULQQAtAPwJQQAvAZYKQQAvAZgKcnJFIQIMBwsQJEEAQQA6AKAKDAMLECVBACECDAULIANBoAFHDQELQQBBAToArAoLQQBBACgCsAo2ApwKC0EAKAKwCiEBDAALCyAAQYDQAGokACACCxoAAkBBACgC3AkgAEcNAEEBDwsgAEF+ahAmC/4KAQZ/QQBBACgCsAoiAEEMaiIBNgKwCkEAKAL4CSECQQEQKSEDAkACQAJAAkACQAJAAkACQAJAQQAoArAKIgQgAUcNACADEChFDQELAkACQAJAAkACQAJAAkAgA0EqRg0AIANB+wBHDQFBACAEQQJqNgKwCkEBECkhA0EAKAKwCiEEA0ACQAJAIANB//8DcSIDQSJGDQAgA0EnRg0AIAMQLBpBACgCsAohAwwBCyADEBpBAEEAKAKwCkECaiIDNgKwCgtBARApGgJAIAQgAxAtIgNBLEcNAEEAQQAoArAKQQJqNgKwCkEBECkhAwsgA0H9AEYNA0EAKAKwCiIFIARGDQ8gBSEEIAVBACgCtApNDQAMDwsLQQAgBEECajYCsApBARApGkEAKAKwCiIDIAMQLRoMAgtBAEEAOgCUCgJAAkACQAJAAkACQCADQZ9/ag4MAgsEAQsDCwsLCwsFAAsgA0H2AEYNBAwKC0EAIARBDmoiAzYCsAoCQAJAAkBBARApQZ9/ag4GABICEhIBEgtBACgCsAoiBSkAAkLzgOSD4I3AMVINESAFLwEKECFFDRFBACAFQQpqNgKwCkEAECkaC0EAKAKwCiIFQQJqQbIIQQ4QLw0QIAUvARAiAkF3aiIBQRdLDQ1BASABdEGfgIAEcUUNDQwOC0EAKAKwCiIFKQACQuyAhIOwjsA5Ug0PIAUvAQoiAkF3aiIBQRdNDQYMCgtBACAEQQpqNgKwCkEAECkaQQAoArAKIQQLQQAgBEEQajYCsAoCQEEBECkiBEEqRw0AQQBBACgCsApBAmo2ArAKQQEQKSEEC0EAKAKwCiEDIAQQLBogA0EAKAKwCiIEIAMgBBACQQBBACgCsApBfmo2ArAKDwsCQCAEKQACQuyAhIOwjsA5Ug0AIAQvAQoQIEUNAEEAIARBCmo2ArAKQQEQKSEEQQAoArAKIQMgBBAsGiADQQAoArAKIgQgAyAEEAJBAEEAKAKwCkF+ajYCsAoPC0EAIARBBGoiBDYCsAoLQQAgBEEGajYCsApBAEEAOgCUCkEBECkhBEEAKAKwCiEDIAQQLCEEQQAoArAKIQIgBEHf/wNxIgFB2wBHDQNBACACQQJqNgKwCkEBECkhBUEAKAKwCiEDQQAhBAwEC0EAQQE6AIwKQQBBACgCsApBAmo2ArAKC0EBECkhBEEAKAKwCiEDAkAgBEHmAEcNACADQQJqQawIQQYQLw0AQQAgA0EIajYCsAogAEEBEClBABArIAJBEGpB5AkgAhshAwNAIAMoAgAiA0UNBSADQgA3AgggA0EQaiEDDAALC0EAIANBfmo2ArAKDAMLQQEgAXRBn4CABHFFDQMMBAtBASEECwNAAkACQCAEDgIAAQELIAVB//8DcRAsGkEBIQQMAQsCQAJAQQAoArAKIgQgA0YNACADIAQgAyAEEAJBARApIQQCQCABQdsARw0AIARBIHJB/QBGDQQLQQAoArAKIQMCQCAEQSxHDQBBACADQQJqNgKwCkEBECkhBUEAKAKwCiEDIAVBIHJB+wBHDQILQQAgA0F+ajYCsAoLIAFB2wBHDQJBACACQX5qNgKwCg8LQQAhBAwACwsPCyACQaABRg0AIAJB+wBHDQQLQQAgBUEKajYCsApBARApIgVB+wBGDQMMAgsCQCACQVhqDgMBAwEACyACQaABRw0CC0EAIAVBEGo2ArAKAkBBARApIgVBKkcNAEEAQQAoArAKQQJqNgKwCkEBECkhBQsgBUEoRg0BC0EAKAKwCiEBIAUQLBpBACgCsAoiBSABTQ0AIAQgAyABIAUQAkEAQQAoArAKQX5qNgKwCg8LIAQgA0EAQQAQAkEAIARBDGo2ArAKDwsQJQuFDAEKf0EAQQAoArAKIgBBDGoiATYCsApBARApIQJBACgCsAohAwJAAkACQAJAAkACQAJAAkAgAkEuRw0AQQAgA0ECajYCsAoCQEEBECkiAkHkAEYNAAJAIAJB8wBGDQAgAkHtAEcNB0EAKAKwCiICQQJqQZwIQQYQLw0HAkBBACgCnAoiAxAqDQAgAy8BAEEuRg0ICyAAIAAgAkEIakEAKALUCRABDwtBACgCsAoiAkECakGiCEEKEC8NBgJAQQAoApwKIgMQKg0AIAMvAQBBLkYNBwtBACEEQQAgAkEMajYCsApBASEFQQUhBkEBECkhAkEAIQdBASEIDAILQQAoArAKIgIpAAJC5YCYg9CMgDlSDQUCQEEAKAKcCiIDECoNACADLwEAQS5GDQYLQQAhBEEAIAJBCmo2ArAKQQIhCEEHIQZBASEHQQEQKSECQQEhBQwBCwJAAkACQAJAIAJB8wBHDQAgAyABTQ0AIANBAmpBoghBChAvDQACQCADLwEMIgRBd2oiB0EXSw0AQQEgB3RBn4CABHENAgsgBEGgAUYNAQtBACEHQQchBkEBIQQgAkHkAEYNAQwCC0EAIQRBACADQQxqIgI2ArAKQQEhBUEBECkhCQJAQQAoArAKIgYgAkYNAEHmACECAkAgCUHmAEYNAEEFIQZBACEHQQEhCCAJIQIMBAtBACEHQQEhCCAGQQJqQawIQQYQLw0EIAYvAQgQIEUNBAtBACEHQQAgAzYCsApBByEGQQEhBEEAIQVBACEIIAkhAgwCCyADIABBCmpNDQBBACEIQeQAIQICQCADKQACQuWAmIPQjIA5Ug0AAkACQCADLwEKIgRBd2oiB0EXSw0AQQEgB3RBn4CABHENAQtBACEIIARBoAFHDQELQQAhBUEAIANBCmo2ArAKQSohAkEBIQdBAiEIQQEQKSIJQSpGDQRBACADNgKwCkEBIQRBACEHQQAhCCAJIQIMAgsgAyEGQQAhBwwCC0EAIQVBACEICwJAIAJBKEcNAEEAKAKkCkEALwGYCiICQQN0aiIDQQAoArAKNgIEQQAgAkEBajsBmAogA0EFNgIAQQAoApwKLwEAQS5GDQRBAEEAKAKwCiIDQQJqNgKwCkEBECkhAiAAQQAoArAKQQAgAxABAkACQCAFDQBBACgC8AkhAQwBC0EAKALwCSIBIAY2AhwLQQBBAC8BlgoiA0EBajsBlgpBACgCqAogA0ECdGogATYCAAJAIAJBIkYNACACQSdGDQBBAEEAKAKwCkF+ajYCsAoPCyACEBpBAEEAKAKwCkECaiICNgKwCgJAAkACQEEBEClBV2oOBAECAgACC0EAQQAoArAKQQJqNgKwCkEBECkaQQAoAvAJIgMgAjYCBCADQQE6ABggA0EAKAKwCiICNgIQQQAgAkF+ajYCsAoPC0EAKALwCSIDIAI2AgQgA0EBOgAYQQBBAC8BmApBf2o7AZgKIANBACgCsApBAmo2AgxBAEEALwGWCkF/ajsBlgoPC0EAQQAoArAKQX5qNgKwCg8LAkAgBEEBcyACQfsAR3INAEEAKAKwCiECQQAvAZgKDQUDQAJAAkACQCACQQAoArQKTw0AQQEQKSICQSJGDQEgAkEnRg0BIAJB/QBHDQJBAEEAKAKwCkECajYCsAoLQQEQKSEDQQAoArAKIQICQCADQeYARw0AIAJBAmpBrAhBBhAvDQcLQQAgAkEIajYCsAoCQEEBECkiAkEiRg0AIAJBJ0cNBwsgACACQQAQKw8LIAIQGgtBAEEAKAKwCkECaiICNgKwCgwACwsCQAJAIAJBWWoOBAMBAQMACyACQSJGDQILQQAoArAKIQYLIAYgAUcNAEEAIABBCmo2ArAKDwsgAkEqRyAHcQ0DQQAvAZgKQf//A3ENA0EAKAKwCiECQQAoArQKIQEDQCACIAFPDQECQAJAIAIvAQAiA0EnRg0AIANBIkcNAQsgACADIAgQKw8LQQAgAkECaiICNgKwCgwACwsQJQsPC0EAIAJBfmo2ArAKDwtBAEEAKAKwCkF+ajYCsAoLRwEDf0EAKAKwCkECaiEAQQAoArQKIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqDgQBAAABAAsLQQAgAjYCsAoLmAEBA39BAEEAKAKwCiIBQQJqNgKwCiABQQZqIQFBACgCtAohAgNAAkACQAJAIAFBfGogAk8NACABQX5qLwEAIQMCQAJAIAANACADQSpGDQEgA0F2ag4EAgQEAgQLIANBKkcNAwsgAS8BAEEvRw0CQQAgAUF+ajYCsAoMAQsgAUF+aiEBC0EAIAE2ArAKDwsgAUECaiEBDAALC4gBAQR/QQAoArAKIQFBACgCtAohAgJAAkADQCABIgNBAmohASADIAJPDQEgAS8BACIEIABGDQICQCAEQdwARg0AIARBdmoOBAIBAQIBCyADQQRqIQEgAy8BBEENRw0AIANBBmogASADLwEGQQpGGyEBDAALC0EAIAE2ArAKECUPC0EAIAE2ArAKC2wBAX8CQAJAIABBX2oiAUEFSw0AQQEgAXRBMXENAQsgAEFGakH//wNxQQZJDQAgAEEpRyAAQVhqQf//A3FBB0lxDQACQCAAQaV/ag4EAQAAAQALIABB/QBHIABBhX9qQf//A3FBBElxDwtBAQsuAQF/QQEhAQJAIABBpglBBRAdDQAgAEGWCEEDEB0NACAAQbAJQQIQHSEBCyABC0YBA39BACEDAkAgACACQQF0IgJrIgRBAmoiAEEAKALcCSIFSQ0AIAAgASACEC8NAAJAIAAgBUcNAEEBDwsgBBAmIQMLIAMLgwEBAn9BASEBAkACQAJAAkACQAJAIAAvAQAiAkFFag4EBQQEAQALAkAgAkGbf2oOBAMEBAIACyACQSlGDQQgAkH5AEcNAyAAQX5qQbwJQQYQHQ8LIABBfmovAQBBPUYPCyAAQX5qQbQJQQQQHQ8LIABBfmpByAlBAxAdDwtBACEBCyABC7QDAQJ/QQAhAQJAAkACQAJAAkACQAJAAkACQAJAIAAvAQBBnH9qDhQAAQIJCQkJAwkJBAUJCQYJBwkJCAkLAkACQCAAQX5qLwEAQZd/ag4EAAoKAQoLIABBfGpByghBAhAdDwsgAEF8akHOCEEDEB0PCwJAAkACQCAAQX5qLwEAQY1/ag4DAAECCgsCQCAAQXxqLwEAIgJB4QBGDQAgAkHsAEcNCiAAQXpqQeUAECcPCyAAQXpqQeMAECcPCyAAQXxqQdQIQQQQHQ8LIABBfGpB3AhBBhAdDwsgAEF+ai8BAEHvAEcNBiAAQXxqLwEAQeUARw0GAkAgAEF6ai8BACICQfAARg0AIAJB4wBHDQcgAEF4akHoCEEGEB0PCyAAQXhqQfQIQQIQHQ8LIABBfmpB+AhBBBAdDwtBASEBIABBfmoiAEHpABAnDQQgAEGACUEFEB0PCyAAQX5qQeQAECcPCyAAQX5qQYoJQQcQHQ8LIABBfmpBmAlBBBAdDwsCQCAAQX5qLwEAIgJB7wBGDQAgAkHlAEcNASAAQXxqQe4AECcPCyAAQXxqQaAJQQMQHSEBCyABCzQBAX9BASEBAkAgAEF3akH//wNxQQVJDQAgAEGAAXJBoAFGDQAgAEEuRyAAEChxIQELIAELMAEBfwJAAkAgAEF3aiIBQRdLDQBBASABdEGNgIAEcQ0BCyAAQaABRg0AQQAPC0EBC04BAn9BACEBAkACQCAALwEAIgJB5QBGDQAgAkHrAEcNASAAQX5qQfgIQQQQHQ8LIABBfmovAQBB9QBHDQAgAEF8akHcCEEGEB0hAQsgAQveAQEEf0EAKAKwCiEAQQAoArQKIQECQAJAAkADQCAAIgJBAmohACACIAFPDQECQAJAAkAgAC8BACIDQaR/ag4FAgMDAwEACyADQSRHDQIgAi8BBEH7AEcNAkEAIAJBBGoiADYCsApBAEEALwGYCiICQQFqOwGYCkEAKAKkCiACQQN0aiICQQQ2AgAgAiAANgIEDwtBACAANgKwCkEAQQAvAZgKQX9qIgA7AZgKQQAoAqQKIABB//8DcUEDdGooAgBBA0cNAwwECyACQQRqIQAMAAsLQQAgADYCsAoLECULC3ABAn8CQAJAA0BBAEEAKAKwCiIAQQJqIgE2ArAKIABBACgCtApPDQECQAJAAkAgAS8BACIBQaV/ag4CAQIACwJAIAFBdmoOBAQDAwQACyABQS9HDQIMBAsQLhoMAQtBACAAQQRqNgKwCgwACwsQJQsLNQEBf0EAQQE6APwJQQAoArAKIQBBAEEAKAK0CkECajYCsApBACAAQQAoAtwJa0EBdTYCkAoLQwECf0EBIQECQCAALwEAIgJBd2pB//8DcUEFSQ0AIAJBgAFyQaABRg0AQQAhASACEChFDQAgAkEuRyAAECpyDwsgAQs9AQJ/QQAhAgJAQQAoAtwJIgMgAEsNACAALwEAIAFHDQACQCADIABHDQBBAQ8LIABBfmovAQAQICECCyACC2gBAn9BASEBAkACQCAAQV9qIgJBBUsNAEEBIAJ0QTFxDQELIABB+P8DcUEoRg0AIABBRmpB//8DcUEGSQ0AAkAgAEGlf2oiAkEDSw0AIAJBAUcNAQsgAEGFf2pB//8DcUEESSEBCyABC5wBAQN/QQAoArAKIQECQANAAkACQCABLwEAIgJBL0cNAAJAIAEvAQIiAUEqRg0AIAFBL0cNBBAYDAILIAAQGQwBCwJAAkAgAEUNACACQXdqIgFBF0sNAUEBIAF0QZ+AgARxRQ0BDAILIAIQIUUNAwwBCyACQaABRw0CC0EAQQAoArAKIgNBAmoiATYCsAogA0EAKAK0CkkNAAsLIAILMQEBf0EAIQECQCAALwEAQS5HDQAgAEF+ai8BAEEuRw0AIABBfGovAQBBLkYhAQsgAQumBAEBfwJAIAFBIkYNACABQSdGDQAQJQ8LQQAoArAKIQMgARAaIAAgA0ECakEAKAKwCkEAKALQCRABAkAgAkEBSA0AQQAoAvAJQQRBBiACQQFGGzYCHAtBAEEAKAKwCkECajYCsAoCQAJAAkACQEEAECkiAUHhAEYNACABQfcARg0BQQAoArAKIQEMAgtBACgCsAoiAUECakHACEEKEC8NAUEGIQIMAgtBACgCsAoiAS8BAkHpAEcNACABLwEEQfQARw0AQQQhAiABLwEGQegARg0BC0EAIAFBfmo2ArAKDwtBACABIAJBAXRqNgKwCgJAQQEQKUH7AEYNAEEAIAE2ArAKDwtBACgCsAoiACECA0BBACACQQJqNgKwCgJAAkACQEEBECkiAkEiRg0AIAJBJ0cNAUEnEBpBAEEAKAKwCkECajYCsApBARApIQIMAgtBIhAaQQBBACgCsApBAmo2ArAKQQEQKSECDAELIAIQLCECCwJAIAJBOkYNAEEAIAE2ArAKDwtBAEEAKAKwCkECajYCsAoCQEEBECkiAkEiRg0AIAJBJ0YNAEEAIAE2ArAKDwsgAhAaQQBBACgCsApBAmo2ArAKAkACQEEBECkiAkEsRg0AIAJB/QBGDQFBACABNgKwCg8LQQBBACgCsApBAmo2ArAKQQEQKUH9AEYNAEEAKAKwCiECDAELC0EAKALwCSIBIAA2AhAgAUEAKAKwCkECajYCDAttAQJ/AkACQANAAkAgAEH//wNxIgFBd2oiAkEXSw0AQQEgAnRBn4CABHENAgsgAUGgAUYNASAAIQIgARAoDQJBACECQQBBACgCsAoiAEECajYCsAogAC8BAiIADQAMAgsLIAAhAgsgAkH//wNxC6sBAQR/AkACQEEAKAKwCiICLwEAIgNB4QBGDQAgASEEIAAhBQwBC0EAIAJBBGo2ArAKQQEQKSECQQAoArAKIQUCQAJAIAJBIkYNACACQSdGDQAgAhAsGkEAKAKwCiEEDAELIAIQGkEAQQAoArAKQQJqIgQ2ArAKC0EBECkhA0EAKAKwCiECCwJAIAIgBUYNACAFIARBACAAIAAgAUYiAhtBACABIAIbEAILIAMLcgEEf0EAKAKwCiEAQQAoArQKIQECQAJAA0AgAEECaiECIAAgAU8NAQJAAkAgAi8BACIDQaR/ag4CAQQACyACIQAgA0F2ag4EAgEBAgELIABBBGohAAwACwtBACACNgKwChAlQQAPC0EAIAI2ArAKQd0AC0kBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASABQQFqIQEgAEEBaiEAIAJBf2oiAg0ADAILCyAEIAVrIQMLIAMLC+wBAgBBgAgLzgEAAHgAcABvAHIAdABtAHAAbwByAHQAZgBvAHIAZQB0AGEAbwB1AHIAYwBlAHIAbwBtAHUAbgBjAHQAaQBvAG4AcwBzAGUAcgB0AHYAbwB5AGkAZQBkAGUAbABlAGMAbwBuAHQAaQBuAGkAbgBzAHQAYQBuAHQAeQBiAHIAZQBhAHIAZQB0AHUAcgBkAGUAYgB1AGcAZwBlAGEAdwBhAGkAdABoAHIAdwBoAGkAbABlAGkAZgBjAGEAdABjAGYAaQBuAGEAbABsAGUAbABzAABB0AkLEAEAAAACAAAAAAQAAEA5AAA=",typeof Buffer<"u"?Buffer.from(A,"base64"):Uint8Array.from(atob(A),(Q)=>Q.charCodeAt(0));var A},qK=WebAssembly.compile(yH()).then(WebAssembly.instantiate).then(({exports:A})=>{o=A});var hH=/\.m?js$/i;function B0(A){return/^src\//i.test(A)&&hH.test(A)}function PY(A){return B0(A.entry||"")}function bH(A){let Q=A.lastIndexOf("/");return(Q<0?"":A.slice(0,Q)).split("/").filter(Boolean)}function vH(A,Q){let B=bH(A);for(let C of Q.split("/"))if(C===""||C===".")continue;else if(C==="..")B.pop();else B.push(C);return B.join("/")}async function OY(A){await qK;let Q={};for(let[K,E]of A.files)if(B0(K))Q[K]=new TextDecoder().decode(E);let B=(K)=>Object.prototype.hasOwnProperty.call(Q,K),C=(K,E)=>{let Y=vH(K,E);if(B(Y))return Y;if(B(Y+".js"))return Y+".js";if(B(Y+".mjs"))return Y+".mjs";if(B(Y+"/index.js"))return Y+"/index.js";return Y},J={};for(let[K,E]of Object.entries(Q))J[K]=fH(E,K,C);return{modules:J,entry:A.manifest.entry}}function fH(A,Q,B){let[C]=NK(A),J="",K=0;for(let E of C){if(E.n==null)continue;if(E.n[0]!==".")continue;let Y="trove:/"+B(Q,E.n),L=E.d===-1?Y:JSON.stringify(Y);J+=A.slice(K,E.s)+L,K=E.e}return J+A.slice(K)}var uH=15000;class zK{constructor({media:A,dock:Q}={}){this.media=A,this.dock=Q}async spawn(A,Q,B){let C=document.createElement("iframe");C.style.cssText=mH,C.setAttribute("sandbox","allow-scripts allow-forms"),C.setAttribute("referrerpolicy","no-referrer");let J=B?.entry;if(J)A._entrySrcdoc||={},A._entrySrcdoc[J]||=await jY({...A.manifest,entry:J},A.files),C.srcdoc=A._entrySrcdoc[J];else A._srcdoc||=await jY(A.manifest,A.files),C.srcdoc=A._srcdoc;let K={role:Q,iframe:C,channel:null,record:A,place:null,dock:null,mediaActions:null};document.body.appendChild(C);try{await this.#A(A,K,B)}catch(E){try{K.channel?.dispose()}catch{}throw C.remove(),E}return K}#A(A,Q,{onCall:B,onEvent:C,online:J}){return new Promise((K,E)=>{let{iframe:Y}=Q,L=A.manifest,X=!1,H=0,G=()=>{if(window.removeEventListener("message",M),H)clearTimeout(H)},Z=(I)=>{if(X)return;X=!0,G(),E(Error(I))},M=(I)=>{if(I.source!==Y.contentWindow)return;if(I.data?.__trove==="boot-error")return Z(I.data.error||"Plugin failed to load its modules");if(I.data?.__trove!=="ready")return;if(!qY(I.data.protocolVersion))return Z(`Plugin speaks protocol ${I.data.protocolVersion}, this host speaks ${VK}`);window.removeEventListener("message",M);let F=new MessageChannel;Q.channel=new MK(F.port1,{onCall:(V,g)=>B(A,V,g,Q),onEvent:(V,g)=>C(A,V,g,Q)}),Q.resolveActivated=(V)=>{if(X)return;if(X=!0,H)clearTimeout(H);K(V)},Q.rejectActivated=(V)=>{if(X)return;if(X=!0,H)clearTimeout(H);E(V)},Y.contentWindow.postMessage({__trove:"init",manifest:L,capabilities:A.grants,storage:A.storage,online:J,role:Q.role,protocolVersion:VK},"*",[F.port2])};H=setTimeout(()=>Z("Plugin handshake timed out"),uH),window.addEventListener("message",M),Y.addEventListener("error",()=>Z("Failed to load plugin iframe"))})}destroy(A){if(!A)return;this.dock?.releaseFrame(A),this.media?.releaseFrame(A);try{A.channel?.emit("deactivate")}catch{}try{A.channel?.dispose()}catch{}A.iframe.remove(),A.record?.frames?.delete(A)}}var mH="position:fixed;left:0;top:0;width:0;height:0;border:0;visibility:hidden;",pH=["default-src 'none'","script-src 'unsafe-inline' 'unsafe-eval' blob:","style-src 'unsafe-inline'","img-src blob: data:","media-src blob: data:","font-src 'none'","connect-src 'none'","base-uri 'none'","form-action 'none'"].join("; "),SY=`<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="${pH}"></head><body>`;async function jY(A,Q){if(PY(A))return lH(await OY({manifest:A,files:Q}));let B=new TextDecoder().decode(Q.get(A.entry)??new Uint8Array);return`${SY}
323
+ <script>${RK}</script>
324
+ <script>${B}</script>
325
+ </body></html>`}function _Y(A){return JSON.stringify(A).replace(/</g,"\\u003c").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function lH(A){let Q=_Y("trove:/"+A.entry);return`${SY}
326
+ <script>${RK}</script>
327
+ <script id="__trove_src" type="application/json">${_Y(A.modules)}</script>
328
+ <script>
329
+ (function () {
330
+ var src = JSON.parse(document.getElementById('__trove_src').textContent);
331
+ var imports = {};
332
+ for (var p in src) imports['trove:/' + p] = URL.createObjectURL(new Blob([src[p] + '\\n//# sourceURL=trove:/' + p], { type: 'text/javascript' }));
333
+ imports['trove'] = URL.createObjectURL(new Blob(['export const activate = globalThis.trove.activate;\\nexport default globalThis.trove;'], { type: 'text/javascript' }));
334
+ var im = document.createElement('script');
335
+ im.type = 'importmap';
336
+ im.textContent = JSON.stringify({ imports: imports });
337
+ document.head.appendChild(im);
338
+ import(${Q}).catch(function (e) {
339
+ try { parent.postMessage({ __trove: 'boot-error', error: String((e && e.message) || e) }, '*'); } catch (_) {}
340
+ });
341
+ })();
342
+ </script>
343
+ </body></html>`}var cH=/\b(ATTACH|DETACH|VACUUM|PRAGMA)\b/i;function dH(A){let Q="",B=0;while(B<A.length){let C=A[B];if(C==="-"&&A[B+1]==="-"){let J=A.indexOf(`
344
+ `,B);B=J<0?A.length:J;continue}if(C==="/"&&A[B+1]==="*"){let J=A.indexOf("*/",B+2);B=J<0?A.length:J+2,Q+=" ";continue}if(C==="'"||C==='"'||C==="`"){let J=C;B++;while(B<A.length){if(A[B]===J){if(A[B+1]===J){B+=2;continue}B++;break}B++}Q+=" ";continue}if(C==="["){let J=A.indexOf("]",B);B=J<0?A.length:J+1,Q+=" ";continue}Q+=C,B++}return Q}function PK(A){if(typeof A!=="string"||!A)throw N.invalid("SQL statement is required");if(cH.test(dH(A)))throw N.invalid("ATTACH, DETACH, VACUUM and PRAGMA are not permitted in plugin storage")}var aH=26214400;async function nH(A,Q){let B=Number(A.headers.get("content-length")||0);if(B&&B>Q)throw Error("Response too large");let C=A.body?.getReader?.();if(!C){let L=await A.arrayBuffer();if(L.byteLength>Q)throw Error("Response too large");return L}let J=[],K=0;for(;;){let{done:L,value:X}=await C.read();if(L)break;if(K+=X.byteLength,K>Q)throw await C.cancel().catch(()=>{}),Error("Response too large");J.push(X)}let E=new Uint8Array(K),Y=0;for(let L of J)E.set(L,Y),Y+=L.byteLength;return E.buffer}class OK{constructor({platform:A,clientDb:Q,media:B,dock:C,onChange:J}={}){this.platform=A,this.clientDb=Q,this.media=B,this.dock=C,this.onChange=J||(()=>{})}async hostCall(A,Q,B,C){let J=(E)=>{if(!A.grants.includes(E))throw Error(`Capability "${E}" not granted`)},K=A.id;switch(Q){case"activated":{let E=C||A.frame;if(clearTimeout(E?._timer),B.ok)E?.resolveActivated?.(E);else E?.rejectActivated?.(Error(B.error||"activate() failed"));return{ok:!0}}case"command:execute":{let E=this.#A(A,B.id);if(!bC(A.manifest,E))throw Error(`Command "${B.id}" is not in this plugin's declared commands`);return{ok:!0,result:await this.platform.commands.execute(E,...B.args||[])??null}}case"ui:status":{J("ui");let E=this.#Q(A,B.name,"statusItem");return this.platform.contributions.update(E.uri,{...B.html!==void 0?{html:String(B.html??"")}:{},...B.tooltip!==void 0?{tooltip:String(B.tooltip??"")}:{},...B.visible!==void 0?{visible:!!B.visible}:{visible:!0}}),{ok:!0}}case"context:setRegister":{let E=this.#Q(A,B.name,"register"),Y=A.registers?.get(E.uri);if(!Y)throw Error(`Register "${B.name}" is not available`);return Y(B.value),{ok:!0}}case"resources:list":return[...A.files.keys()].filter(wY);case"resources:read":{if(!wY(B.path))throw Error(`No such resource ${B.path}`);let E=A.files.get(B.path);if(!E)throw Error(`No such resource ${B.path}`);return{bytes:E.slice().buffer}}case"files:read":return J("files"),{text:await this.platform.api.readText(B.id)};case"files:list":return J("files"),this.platform.api.list(B.collection||B.pathOrId,{sort:B.sort,order:B.order,limit:B.limit,cursor:B.cursor});case"files:stat":return J("files"),this.platform.api.stat(B.id);case"files:downloadUrl":return J("files"),{url:this.platform.api.downloadUrl(B.id)};case"files:index":{J("indexer");let E=TQ(B.indexerId)?B.indexerId:SQ(A.manifest,B.indexerId||"default");return this.platform.api.pushIndex(E,B.nodeId,{semanticTexts:B.semanticTexts,tags:B.tags,metadata:B.metadata,documents:B.documents,facet:B.facet})}case"net:fetch":return J("network"),this.#C(A,B);case"storage:sql":return J("storage"),this.#J(A,B);case"settings:get":return this.platform.settings.get(`${K}.${B.key}`);case"settings:getSecret":return A.secrets?.[B.key]??null;case"settings:set":return this.platform.settings.set(`${K}.${B.key}`,B.value),{ok:!0};case"ui:showPanel":return J("ui"),A.hasUi=!0,this.platform.openPluginPanel(K),this.onChange(),{ok:!0};case"media:metadata":{J("media");let E=(B.artwork||[]).filter((Y)=>this.#B(A,Y?.src));return this.media.apply(C,"metadata",{...B,artwork:E})}case"media:playbackState":return J("media"),this.media.apply(C,"playbackState",B);case"media:position":return J("media"),this.media.apply(C,"position",B);case"media:action":return J("media"),this.media.apply(C,"action",B);case"media:clear":return this.media.apply(C,"clear",B);case"dock:enable":if(J("dock"),C)C.dock={enabled:!0,minSize:B.minSize,maxSize:B.maxSize,dismissed:!1};return{ok:!0};case"dock:disable":if(J("dock"),C?.dock)C.dock.enabled=!1;if(C&&this.dock.docked===C)this.dock.closeDock(C);return{ok:!0};case"dock:close":if(C)this.dock.closeDock(C);return{ok:!0};default:throw Error(`Unknown host method ${Q}`)}}hostEvent(A,Q,B,C){switch(Q){case"manifest":if(C&&C.role!=="primary")break;A.live=B,A.responsive=!0,this.onChange();break;case"ui:toast":this.platform.notifications[B.level||"info"](`${mA(A.manifest)}: ${B.text}`);break;case"ui:badge":A.badge=B.text,this.onChange();break}}#A(A,Q){if(!Q||TQ(Q))return Q;let B=this.platform.contributions.get(SQ(A.manifest,Q));return B?.type==="command"?B.uri:Q}#Q(A,Q,B){let C=Q?this.platform.contributions.get(SQ(A.manifest,Q)):null;if(!C||C.pluginId!==A.id||C.type!==B)throw Error(`"${Q}" is not a ${B} declared by this plugin`);return C}#B(A,Q){if(!Q)return!1;if(/^(blob:|data:image\/)/i.test(Q))return!0;return yC(dQ(A.manifest),Q)}async#C(A,{url:Q,method:B="GET",headers:C,body:J}){let K=dQ(A.manifest);if(TY(Q,this.platform.api?.baseUrl))throw Error("Blocked: a plugin may not call the drive's own API through the network broker");if(!yC(K,Q))throw Error(`Blocked: "${Q}" is not one of this plugin's declared network endpoints`);let E={method:B,credentials:"omit",redirect:"follow",headers:sH(C)};if(J!=null&&B!=="GET"&&B!=="HEAD")E.body=J instanceof ArrayBuffer?new Uint8Array(J):J;let Y=await fetch(Q,E);if(Y.url&&Y.url!==Q){if(TY(Y.url,this.platform.api?.baseUrl))throw Error("Blocked: request redirected onto the drive's own API");if(!yC(K,Y.url))throw Error(`Blocked: request redirected off this plugin's declared endpoints (${Y.url})`)}let L=await nH(Y,aH),X={};return Y.headers.forEach((H,G)=>{X[G]=H}),{ok:Y.ok,status:Y.status,statusText:Y.statusText,url:Y.url,headers:X,bytes:L}}async#J(A,{scope:Q="plugin",side:B="server",op:C,sql:J,params:K=[],statements:E}){if(!A.storage?.[Q])throw Error(`Storage scope "${Q}" not granted${Q==="domain"?" (needs a verified domain)":""}`);if(B==="client"){if(C==="batch")for(let G of Array.isArray(E)?E:[])PK(G?.sql);else PK(J);let X=Q==="domain"?`dom:${A.manifest.domain}`:`plg:${A.id}`,H=await this.clientDb.obtain(X);return iH(H,C,J,K,E)}let Y={scope:Q,op:C,sql:J,params:K,statements:E,domain:Q==="domain"?A.manifest.domain:void 0};return(await this.platform.api.request("POST",`/api/plugins/${encodeURIComponent(A.id)}/sql`,{body:Y})).result}}function TY(A,Q){try{let B=new URL(Q||"",globalThis.location?.href||"http://localhost/");return new URL(A,B).origin===B.origin}catch{return!1}}function wY(A){return A!=="manifest.json"&&!B0(A)}var oH=new Set(["host","cookie","cookie2","set-cookie","origin","referer","content-length","connection"]);function sH(A){let Q={};for(let[B,C]of Object.entries(A||{}))if(!oH.has(String(B).toLowerCase()))Q[B]=C;return Q}function iH(A,Q,B,C=[],J){switch(Q){case"exec":return A.exec(B);case"run":return A.run(B,...C);case"get":return A.get(B,...C);case"all":return A.all(B,...C);case"batch":return A.batch(J);default:throw Error(`Unknown storage op "${Q}"`)}}var xY=["files","storage","ui","commands","indexer","opener","network","media","dock"];class jK{constructor(A,{heartbeatMs:Q=20000}={}){this.platform=A,this.plugins=new Map,this.registry=new t0,this.clientDb=new AJ({onError:(B,C)=>this.platform.notifications.error(`A plugin's on-device data couldn't be saved (${C}): ${B.message}`)}),this.online=typeof navigator<"u"?navigator.onLine:!0,this.heartbeatMs=Q,this._heartbeat=null,this._probing=!1,this.cell=A.reactive.cell([]),this.media=new LJ,this.dock=new XJ({destroyFrame:(B)=>this.frames.destroy(B),openFile:(B,C)=>this.platform.dispatch?.(new IQ(B,C)),onChange:()=>this.#A()}),this.frames=new zK({media:this.media,dock:this.dock}),this.rpc=new OK({platform:A,clientDb:this.clientDb,media:this.media,dock:this.dock,onChange:()=>this.#A()})}observe(){return this.cell}#A(){this.cell.setValue(this.list())}#Q(A,Q,B){return this.frames.spawn(A,Q,{onCall:(C,J,K,E)=>this.rpc.hostCall(C,J,K,E),onEvent:(C,J,K,E)=>this.rpc.hostEvent(C,J,K,E),online:this.online,entry:B})}#B(A){let Q=A.id,B=this.platform.contributions,C=(K)=>A.disposers.push(K),J=mA(A.manifest);for(let K of GQ(A.manifest)){let E={...K,pluginId:Q};switch(K.type){case"opener":if(A.grants.includes("opener"))C(B.register(K.uri,E));break;case"command":C(this.platform.commands.register({id:K.uri,title:K.title||`${J}: ${K.name}`,category:K.category||J,icon:K.icon,when:K.when,offline:K.offline,palette:K.palette,pluginId:Q,actions:(...Y)=>new WK(Q,K.name,Y)}));break;case"statusItem":{let Y=K.command?this.#J(A,K.command,J,`status item “${K.name}”`):null;C(B.register(K.uri,{...E,command:Y,html:"",visible:!1}));break}case"register":{C(B.register(K.uri,E));let Y=this.platform.context.own(K.uri,K.default);A.registers.set(K.uri,Y.set),C(()=>{A.registers.delete(K.uri),Y.dispose()});break}case"keymap":{let Y=A.files.get(K.path);if(!Y){this.platform.notifications.warn(`Plugin "${J}": keymap file "${K.path}" is not in the package.`);break}try{let L=this.#C(A,rE(new TextDecoder().decode(Y)),J);C(B.register(K.uri,{...E,bindings:L}))}catch(L){this.platform.notifications.warn(`Plugin "${J}": ${L.message}`)}break}case"indexer":break}}}#C(A,Q,B){let C=[];for(let J of Q){let K=this.#J(A,J.command,B,`shortcut ${J.key}`);if(K)C.push({...J,command:K})}return C}#J(A,Q,B,C){let J=SQ(A.manifest,Q);if(GQ(A.manifest).some((E)=>E.uri===J&&E.type==="command"))return J;if(!bC(A.manifest,Q))return this.platform.notifications.warn(`Plugin "${B}": ${C} runs "${Q}", which it isn't allowed to run — ignored.`),null;return Q}list(){return[...this.plugins.values()].map((A)=>({id:A.id,name:mA(A.manifest),version:A.manifest.version,status:A.status,capabilities:A.grants,error:A.error||null,hasUi:A.hasUi,badge:A.badge||null,trust:A.trust||null,settingsSchema:A.manifest.settings||[],endpoints:hC(dQ(A.manifest)),responsive:!!A.responsive,manifest:A.live||null,features:this.#K(A)}))}#K(A){let Q;try{Q=GQ(A.manifest)}catch{return[]}return Q.map((B)=>({kind:B.type,id:B.uri,name:B.name,title:B.title||B.name,offline:!!B.offline,available:this.#E(A,B)}))}#E(A,Q){if(A.status!=="active"||!A.responsive)return!1;return this.online||!!Q.offline}isAvailable(A){if(!A?.pluginId)return!0;let Q=this.plugins.get(A.pluginId);if(!Q)return!1;return this.#E(Q,A)}canGrant(A,Q){return!JJ.has(A)||!!Q}async install(A,{grants:Q,trust:B}={}){let C=QQ(A.manifest),J=KJ(A.manifest),K=(Q||J).filter((X)=>xY.includes(X)&&J.includes(X)),E=eH(A.manifest,K)?"account":"device";if(E==="account"){if(!A.raw)throw Error("Package bytes unavailable for a server install");await this.platform.api.installPlugin(A.raw,K)}let Y=K.includes("storage")?YJ(A.manifest,B):{plugin:!1,domain:!1},L={id:C,manifest:A.manifest,files:Object.fromEntries([...A.files.entries()]),grants:K,storage:Y,trust:B||null,scope:E,settings:{},secrets:{},installedAt:Date.now()};return await this.registry.save(L),this.#L(L),await this.#X(L),this.plugins.get(C)}async restore(){let A=[];try{A=await this.registry.list()}catch{}for(let Q of A)try{this.#L(Q),this.#X(Q).catch((B)=>console.error("restore plugin failed",Q.id,B))}catch(B){console.error("skipping corrupt plugin record",Q?.id,B),this.platform.notifications.warn(`Couldn't restore plugin "${Q?.manifest?mA(Q.manifest):Q?.id||"unknown"}" — its saved data looks corrupt.`)}this.#Y(A).catch(()=>{})}async#Y(A){let Q;try{Q=(await this.platform.api.installedPlugins()).plugins||[]}catch{return}let B=new Set(Q.map((Y)=>Y.pluginId)),C=new Set(A.map((Y)=>Y.id)),J=0,K=0,E=0;for(let Y of A){if(Y.scope!=="account"||B.has(Y.id))continue;try{await this.platform.api.installPlugin(M8(tH(Y.files)),Y.grants||[])}catch(L){console.error("re-upload plugin failed",Y.id,L),J++}}for(let Y of Q){if(C.has(Y.pluginId))continue;try{let L=aQ(await this.platform.api.pluginPackage(Y.pluginId)),X=Y.grants||[],H={id:Y.pluginId,manifest:L.manifest,files:Object.fromEntries([...L.files.entries()]),grants:X,storage:X.includes("storage")?{plugin:!0,domain:!!Y.sharedStorage}:{plugin:!1,domain:!1},trust:null,scope:"account",settings:{},secrets:{},installedAt:Y.createdAt||Date.now()};await this.registry.save(H),this.#L(H),await this.#X(H),K++}catch(L){console.error("sync plugin failed",Y.pluginId,L),E++}}if(K)this.platform.notifications.info(`Synced ${K} account plugin${K>1?"s":""} from the server.`);if(J||E){let Y=[];if(E)Y.push(`${E} couldn't be downloaded`);if(J)Y.push(`${J} couldn't be uploaded`);this.platform.notifications.warn(`Some account plugins didn't sync: ${Y.join(", ")}.`)}}#L(A){let Q=(A.manifest.settings||[]).filter((B)=>!B.secret);if(Q.length)A._settingsDispose=this.platform.settings.scopedFor(A.id).register(Q.map((B)=>({...B,category:mA(A.manifest)})))}async#X(A){if(this.plugins.get(A.id)?.status==="active")return;let Q={...A,iframe:null,status:"loading",error:null,disposers:[],channel:null,registers:new Map,hasUi:!1,responsive:!1,frame:null,frames:new Set,storage:A.storage||(A.grants?.includes("storage")?YJ(A.manifest,A.trust):{plugin:!1,domain:!1}),files:rH(A.files)};this.plugins.set(A.id,Q);try{this.#B(Q)}catch(B){console.error("registering contributions failed",A.id,B)}this.#A();try{let B=await this.#Q(Q,"primary");if(this.plugins.get(A.id)!==Q)return this.frames.destroy(B),Q;Q.frame=B,Q.iframe=B.iframe,Q.channel=B.channel,Q.status="active",Q.responsive=!0,this.#H(Q).then(()=>this.#A()),this.#G()}catch(B){Q.status="error",Q.error=B?.message||String(B),this.platform.notifications.error(`Plugin "${mA(A.manifest)}" failed to load: ${Q.error}`)}return this.#A(),Q}async setSecret(A,Q,B){let C=await this.registry.get(A);if(!C)return;C.secrets={...C.secrets,[Q]:B},await this.registry.save(C);let J=this.plugins.get(A);if(J)J.secrets=C.secrets;J?.channel?.emit("settings:changed",{key:Q,value:"••••"})}async getSecret(A,Q){return(await this.registry.get(A))?.secrets?.[Q]??""}#G(){if(this._heartbeat||!this.heartbeatMs)return;if(this._heartbeat=setInterval(()=>this.#D(),this.heartbeatMs),this._heartbeat?.unref)this._heartbeat.unref()}#$(){if(this._heartbeat)clearInterval(this._heartbeat);this._heartbeat=null}async#D(){if(this._probing)return;this._probing=!0;try{let A=!1;for(let Q of this.plugins.values())if(Q.status==="active")A=await this.#H(Q)||A;if(A)this.#A()}finally{this._probing=!1}}invokeCommand(A,Q,B=[]){return this.plugins.get(A)?.channel?.call("command:execute",{id:Q,args:B})}setHeartbeat(A){if(this.heartbeatMs=A,this.#$(),A&&[...this.plugins.values()].some((Q)=>Q.status==="active"))this.#G()}async#H(A){if(A.status!=="active"||!A.channel)return!1;let Q={responsive:A.responsive,sig:kY(A.live)};try{A.live=await A.channel.call("manifest",{},{timeout:4000}),A.responsive=!0}catch{A.responsive=!1}return Q.responsive!==A.responsive||Q.sig!==kY(A.live)}async setOnline(A){if(this.online===A)return;this.online=A,await Promise.all([...this.plugins.values()].filter((Q)=>Q.status==="active").map(async(Q)=>{try{Q.channel?.emit("connectivity",{online:A})}catch{}for(let B of Q.frames||[])try{B.channel?.emit("connectivity",{online:A})}catch{}await this.#H(Q)})),this.#A()}async refresh(A){let Q=this.plugins.get(A);if(Q)await this.#H(Q),this.#A()}mountPanel(A,Q,{width:B=380,height:C=480}={}){let J=this.plugins.get(A);if(!J?.frame)return null;return Q.style.width=`${B}px`,Q.style.height=`${C}px`,this.dock.place(J.frame,Q,50),J.hasUi=!0,()=>this.dock.hide(J.frame)}mountViewer(A,Q,B,C,J={}){let K=this.plugins.get(A);if(!K)return J.onError?.("Plugin is not available"),null;let E=this.dock.docked;if(E&&E.record===K&&E.node?.id===B.id&&E.openerId===C)return this.dock.undock(E),this.dock.place(E,Q,3),J.onReady?.(),()=>this.#Z(E);let Y=this.platform.contributions.get(C),L={cancelled:!1,frame:null};return this.#Q(K,"viewer",Y?.entry).then(async(X)=>{if(L.cancelled){this.frames.destroy(X);return}L.frame=X,X.node=B,X.openerId=C,K.frames.add(X),this.dock.place(X,Q,3);try{if(await X.channel?.call("opener:open",{openerId:C,file:B,context:{}}),!L.cancelled)J.onReady?.()}catch(H){if(!L.cancelled)J.onError?.(H?.message||"Failed to open")}}).catch((X)=>{if(console.error("viewer frame failed to load",X),!L.cancelled)J.onError?.(X?.message||"This viewer failed to load")}),K.hasUi=!0,()=>{if(L.cancelled=!0,L.frame)this.#Z(L.frame)}}#Z(A){if(A.dock?.enabled&&!A.dock.dismissed)this.dock.dock(A);else this.frames.destroy(A)}async uninstall(A,{wipeData:Q=!0}={}){let B=this.plugins.get(A),C=B?.manifest?mA(B.manifest):A,J=B?.scope==="account"||(await this.registry.get(A).catch(()=>null))?.scope==="account";if(Q&&J)try{await this.platform.api.uninstallPluginServer(A)}catch(Y){this.platform.notifications.error(`Couldn't uninstall "${C}" from the server: ${Y.message}. It's still installed.`);return}if(B){try{B.channel?.emit("deactivate")}catch{}for(let Y of B.disposers)try{Y()}catch{}B._settingsDispose?.();for(let Y of[...B.frames||[]])this.frames.destroy(Y);if(B.frame)this.dock.stopPlace(B.frame),this.media.releaseActions(B.frame);B.channel?.dispose(),B.iframe?.remove(),this.plugins.delete(A)}let K=[];if(Q){if(!J)await this.platform.api.request("DELETE",`/api/plugins/${encodeURIComponent(A)}/data`).catch(()=>K.push("server-side data"));await this.clientDb.drop(`plg:${A}`).catch(()=>K.push("on-device data"))}let E=!1;try{await this.registry.remove(A)}catch(Y){E=!0,console.error("removing the persisted plugin record failed",A,Y)}if(![...this.plugins.values()].some((Y)=>Y.status==="active"))this.#$();if(this.#A(),E)this.platform.notifications.error(`Removed "${C}", but its saved record couldn't be deleted — it may come back when you reload.`);else if(K.length)this.platform.notifications.warn(`Uninstalled "${C}", but couldn't clear its ${K.join(" and ")}.`)}fetchAssetlinks=async(A)=>{return(await this.platform.api.request("GET","/api/plugins/assetlinks",{query:{domain:A}}))?.assetlinks||null};assessTrust(A){return O8(A,this.fetchAssetlinks)}}function rH(A){let Q=new Map;for(let[B,C]of Object.entries(A))Q.set(B,C instanceof Uint8Array?C:new Uint8Array(C));return Q}function tH(A){let Q={};for(let[B,C]of Object.entries(A||{}))Q[B]=C instanceof Uint8Array?C:new Uint8Array(C);return Q}function eH(A,Q){if(Q.includes("storage"))return!0;return _0(A).length>0}function kY(A){if(!A)return"";return`${A.online?1:0}|${[...A.handlers||[]].sort().join(",")}`}var gY=["auto","desktop","phone","tv"],A$=720,Q$=1100,B$=/\b(smart-?tv|smarttv|appletv|googletv|android\s*tv|hbbtv|netcast|web0s|webos|tizen|viera|bravia|aquos|crkey|nettv|dtv|philipstv|roku|aft[a-z]{1,3})\b/i;function C$(A="",Q=0){if(!A)return!1;return B$.test(A)&&Q>=Q$}class _K{constructor({window:A=globalThis,settings:Q=null}={}){this.window=A,this.settings=Q,this.urlOverride=E$(A),this.state=this.#Q(),this.cell=d(this.state),this._onResize=()=>this.refresh()}observe(){return this.cell}install(){if(this.window.addEventListener?.("resize",this._onResize),this.window.addEventListener?.("orientationchange",this._onResize),this.settings)_Q(this.settings.observe(),()=>this.refresh());return this.#A(this.state),this}dispose(){this.window.removeEventListener?.("resize",this._onResize),this.window.removeEventListener?.("orientationchange",this._onResize)}refresh(){let A=this.#Q();if(A.mode===this.state.mode&&A.width===this.state.width&&A.height===this.state.height&&A.coarse===this.state.coarse)return;this.state=A,this.#A(A),this.cell.setValue(A)}#A(A){let Q=this.window.document?.documentElement;if(Q)Q.dataset.layout=A.mode}#Q(){let A=this.window,Q=A.innerWidth||1280,B=A.innerHeight||800,C=K$(A,"(pointer: coarse)"),J=A.navigator?.userAgent||"",K=this.urlOverride||this.settings?.get?.("workbench.layout")||"auto";return{mode:K!=="auto"&&gY.includes(K)?K:J$({width:Q,coarse:C,ua:J}),width:Q,height:B,coarse:C,forced:K!=="auto"}}}function J$({width:A,coarse:Q,ua:B}){if(C$(B,A))return"tv";if(A<=A$)return"phone";return"desktop"}function K$(A,Q){try{return!!A.matchMedia?.(Q)?.matches}catch{return!1}}function E$(A){try{let Q=new URL(A.location.href).searchParams.get("ui");return Q&&gY.includes(Q)?Q:null}catch{return null}}var bY='a[href], button:not([disabled]), input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"])',vY=".launch-item, .grid-tile, .sheet-row, .inbox-item, .plugin-card, .act-task, .act-issue, .chapter",Y$=`${bY}, ${vY}`,L$=new Set(["BrowserBack","GoBack","Backspace"]),X$=new Set([10009,461]),G$={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"},H$=new Set(["A","BUTTON","INPUT","SELECT","TEXTAREA"]);class SK{constructor({workbench:A,viewport:Q,window:B=globalThis}){this.viewport=Q,this.window=B,this.active=!1,this._onKey=(C)=>this.handleKey(C),this._observer=null,this._pending=0,this._bootstrapped=!1}install(){if(this.viewport)_Q(this.viewport.observe(),(A)=>this.setActive(A.mode==="tv"));return this.setActive(this.viewport?.state?.mode==="tv"),this}setActive(A){if(A===this.active)return;if(this.active=A,A)this.window.addEventListener?.("keydown",this._onKey),this.#A(),this.prime(),this.window.setTimeout?.(()=>this.prime(),60);else this.window.removeEventListener?.("keydown",this._onKey),this._observer?.disconnect(),this._observer=null,this._bootstrapped=!1}prime(){this.candidates(),this.focusFirst()}#A(){let A=this.window.MutationObserver;if(!A||this._observer)return;this._observer=new A(()=>{if(this._pending)return;this._pending=this.window.requestAnimationFrame?.(()=>{if(this._pending=0,this.active)this.prime()})||0}),this._observer.observe(this.window.document.body,{childList:!0,subtree:!0})}handleKey(A){if(!this.active||A.defaultPrevented||A.altKey||A.ctrlKey||A.metaKey)return;let Q=this.window.document,B=Q.activeElement;if(L$.has(A.key)||X$.has(A.keyCode)){if(A.key==="Backspace"&&yY(B)&&(B.value??"").length>0)return;A.preventDefault(),this.goBack();return}let C=G$[A.key];if(!C){if(A.key==="Enter"&&B&&!H$.has(B.tagName)&&B.matches(vY))A.preventDefault(),B.click();return}if((C==="left"||C==="right")&&yY(B)&&!$$(B,C))return;let J=B&&B!==Q.body?B:null,K=this.find(C,J);if(!K)return;A.preventDefault(),hY(K)}goBack(){if(this.workbench?.closeOverlays())return;this.window.history?.back?.()}candidates(){let A=this.window.document,Q=[];for(let B of A.querySelectorAll(Y$)){if(B.getAttribute?.("aria-hidden")==="true"||B.hasAttribute?.("disabled"))continue;let C=B.getBoundingClientRect();if(C.width<2||C.height<2)continue;if(C.bottom<0||C.top>this.window.innerHeight||C.right<0||C.left>this.window.innerWidth)continue;if(!B.matches(bY)&&!B.hasAttribute("tabindex"))B.setAttribute("tabindex","0");Q.push({el:B,rect:C})}return Q}find(A,Q){let B=this.candidates();if(!B.length)return null;let C=Q&&Q.getBoundingClientRect&&Q.getBoundingClientRect().width?Q.getBoundingClientRect():null;if(!C)return B[0].el;let J=null,K=1/0;for(let{el:E,rect:Y}of B){if(E===Q)continue;let L=Z$(C,Y,A);if(L==null||L>=K)continue;K=L,J=E}return J}focusFirst(){if(this._bootstrapped)return;let A=this.window.document;if(A?.activeElement&&A.activeElement!==A.body)return;let Q=this.candidates();if(!Q.length)return;let B=Q.find((C)=>C.el.classList?.contains("launch-input"))||Q[0];hY(B.el),this._bootstrapped=!0}}function $$(A,Q){let{selectionStart:B,selectionEnd:C}=A;if(B==null||C==null)return!0;if(B!==C)return!1;return Q==="left"?B===0:C>=(A.value??"").length}function yY(A){if(!A)return!1;let Q=A.tagName;if(Q==="TEXTAREA")return!0;if(A.isContentEditable)return!0;if(Q!=="INPUT")return!1;return!["checkbox","radio","button","submit","range","file"].includes(A.type)}function hY(A){A.focus?.({preventScroll:!0}),A.scrollIntoView?.({block:"nearest",inline:"nearest"})}function Z$(A,Q,B){let C=B==="up"||B==="down",[J,K]=C?B==="down"?[A.bottom,Q.top]:[A.top,Q.bottom]:B==="right"?[A.right,Q.left]:[A.left,Q.right],Y=B==="down"||B==="right"?K-J:J-K;if(Y<-2)return null;let[L,X,H,G]=C?[A.left,A.right,Q.left,Q.right]:[A.top,A.bottom,Q.top,Q.bottom],Z=Math.max(0,Math.max(L,H)-Math.min(X,G)),M=Math.abs((L+X)/2-(H+G)/2);return Math.max(0,Y)+Z*3+M*0.2}function EC(){if(typeof window>"u")return null;return window.SpeechRecognition||window.webkitSpeechRecognition||null}function C0(){let A=EC();return!!A&&typeof A.available==="function"}var TK=(A)=>({langs:[A],processLocally:!0});async function fY(A=navigator.language||"en-US"){if(!C0())return"unavailable";try{return await EC().available(TK(A))}catch{return"unavailable"}}async function uY(A=navigator.language||"en-US"){if(typeof EC()?.install!=="function")return!1;try{return await EC().install(TK(A))}catch{return!1}}function mY({lang:A=navigator.language||"en-US",onText:Q,onEnd:B,onError:C}={}){if(!C0())throw Error("On-device speech recognition is not available here");let J=new(EC());J.lang=A,J.interimResults=!0,J.continuous=!1,J.options=TK(A),J.processLocally=!0;let K=!1;J.onresult=(E)=>{let Y="",L=!1;for(let X=E.resultIndex;X<E.results.length;X++)if(Y+=E.results[X][0].transcript,E.results[X].isFinal)L=!0;Q?.(Y.trim(),{final:L})},J.onerror=(E)=>{if(E.error==="no-speech"||E.error==="aborted")return;C?.(Error(E.error||"Speech recognition failed"))},J.onend=()=>{if(!K)K=!0,B?.()};try{J.start()}catch(E){K=!0,C?.(E),B?.()}return{stop(){if(K)return;K=!0;try{J.stop()}catch{}B?.()}}}class wK{constructor({notifications:A,settings:Q}={}){this.notifications=A,this.settings=Q,this.session=null,this.state={supported:C0(),status:"unknown",listening:!1},this.cell=d(this.state)}observe(){return this.cell}#A(A){this.state={...this.state,...A},this.cell.setValue(this.state)}async refresh(){if(!this.state.supported)return"unavailable";let A=await fY(this.#Q());return this.#A({status:A}),A}#Q(){return this.settings?.get?.("search.voiceLanguage")||navigator.language||"en-US"}canListen(){return this.state.supported&&(this.state.status==="available"||this.state.status==="downloadable")}async run({onText:A}={}){if(this.openSearchSurface(),await this.focusInput(),!this.state.supported)return{listening:!1,reason:"unsupported"};let Q=this.state.status==="unknown"?await this.refresh():this.state.status;if(Q==="downloadable"){this.notifications?.info("Downloading the on-device voice model — this happens once.");let B=await uY(this.#Q());if(this.#A({status:B?"available":"unavailable"}),!B)return{listening:!1,reason:"install-failed"}}else if(Q!=="available")return{listening:!1,reason:Q};return this.toggle({onText:A})}toggle({onText:A}={}){if(this.session)return this.stop(),{listening:!1};try{return this.session=mY({lang:this.#Q(),onText:A,onEnd:()=>{this.session=null,this.#A({listening:!1})},onError:(Q)=>{if(this.session=null,this.#A({listening:!1}),!/not-allowed|service-not-allowed|denied/i.test(Q.message))this.notifications?.warn(`Couldn't listen: ${Q.message}`)}}),this.#A({listening:!0}),{listening:!0}}catch(Q){return this.notifications?.warn(`Couldn't listen: ${Q.message}`),{listening:!1,reason:"error"}}}stop(){this.session?.stop(),this.session=null,this.#A({listening:!1})}openSearchSurface(){let A=this.workbench;if(!A)return;if(A.state.activity==="home"&&!A.nav?.state?.activeTabId)A.closeSearchModal?.();else A.openSearchModal()}focusInput({tries:A=12}={}){return new Promise((Q)=>{let B=A,C=()=>{let J=document.querySelector(".search-modal .launch-input")||document.querySelector(".launch-input");if(J){J.focus();try{J.setSelectionRange(J.value.length,J.value.length)}catch{}Q(document.activeElement===J);return}if(--B<=0){Q(!1);return}requestAnimationFrame(C)};C()})}}class xK{constructor({api:A,settings:Q=null}){this.api=A,this.settings=Q,this.cache=new Map,this._queue=new Map,this._timer=null}get needed(){let A=this.settings?.get("media.signedUrls");if(A==="always")return!0;if(A==="never")return!1;return!!this.api.token?.()}cacheKey(A){return this.api.downloadUrl(A)}async url(A,{op:Q="media"}={}){if(!this.needed)return{url:this.api.downloadUrl(A,{attachment:Q==="download"}),expiresAt:1/0};let B=`${Q}:${A}`,C=this.cache.get(B);if(C&&this.#A(C))return C;return this.#Q(A,Q)}invalidate(A,Q="media"){if(A==null)this.cache.clear();else this.cache.delete(`${Q}:${A}`)}#A(A){if(A.expiresAt===1/0)return!0;let Q=A.expiresAt-A.mintedAt;return Date.now()<A.mintedAt+Q*0.8}#Q(A,Q){if(!this._queue.has(Q))this._queue.set(Q,new Map);let B=this._queue.get(Q),C=B.get(A);if(C)return C.promise;let J,K,E=new Promise((Y,L)=>{J=Y,K=L});if(B.set(A,{resolve:J,reject:K,promise:E}),B.size>=200)this.#B();else if(!this._timer)this._timer=setTimeout(()=>this.#B(),20);return E}async#B(){clearTimeout(this._timer),this._timer=null;let A=this._queue;this._queue=new Map;for(let[Q,B]of A){let C=[...B.keys()];try{let J=await this.api.mintUrls(C,Q),K=Date.now();for(let[E,Y]of B){let L=J.urls?.[E];if(L){let X={url:L.url,expiresAt:L.expiresAt,mintedAt:K};this.cache.set(`${Q}:${E}`,X),Y.resolve(X)}else Y.reject(Error(J.failed?.[E]==="not_found"?"That file is gone":"You cannot open that file"))}}catch(J){for(let K of B.values())K.reject(J)}}}}function D$(){try{return localStorage.getItem("trove.token")||null}catch{return null}}function pY({baseUrl:A=""}={}){let Q=new S0,B=new x0,C=new v0,J=new k0(Q,B,C),K=new b0,E=new ZB(Q,J,B,K),Y=new f0({baseUrl:A,token:()=>D$()}),L=new _K({settings:K}),X=new SK({viewport:L}),H=new wK({notifications:C,settings:K}),G={reactive:pE,contributions:Q,context:B,commands:J,keybindings:E,settings:K,notifications:C,api:Y,viewport:L,spatialNav:X,voice:H,openPluginPanel:null};return G.mediaUrls=new xK({api:G.api,settings:K}),G.plugins=new jK(G),J.availability=(Z)=>G.plugins.isAvailable(Z),W$(G),L.refresh(),G}function W$(A){A.settings.register([{key:"workbench.theme",type:"enum",enum:["dark","light","midnight"],enumLabels:["Dark","Light","Midnight"],default:"dark",title:"Color theme",category:"Appearance",order:1},{key:"workbench.density",type:"enum",enum:["comfortable","compact"],default:"comfortable",title:"List density",category:"Appearance",order:2},{key:"workbench.layout",type:"enum",enum:["auto","desktop","phone","tv"],enumLabels:["Automatic","Desktop","Phone","TV / remote"],default:"auto",title:"Layout",description:"Automatic follows the screen size. Choose TV for d-pad remote navigation.",category:"Appearance",order:3},{key:"explorer.sort",type:"enum",enum:["name","size","updatedAt"],enumLabels:["Name","Size","Modified"],default:"name",title:"Sort files by",category:"Explorer",order:1},{key:"explorer.sortOrder",type:"enum",enum:["asc","desc"],default:"asc",title:"Sort order",category:"Explorer",order:2},{key:"explorer.confirmDelete",type:"boolean",default:!0,title:"Confirm before deleting",category:"Explorer",order:3},{key:"search.mode",type:"enum",enum:["hybrid","semantic","keyword"],default:"hybrid",title:"Search mode",description:"Hybrid blends semantic meaning with keyword matches.",category:"Search",order:1},{key:"uploads.concurrency",type:"number",minimum:1,maximum:8,default:4,title:"Parallel upload parts",category:"Transfers",order:1},{key:"openers.associations",type:"object",hidden:!0,title:"Default viewers",default:{".md":"core.markdown",".markdown":"core.markdown"}},{key:"explorer.view",type:"string",hidden:!0,title:"Results view"},{key:"media.signedUrls",type:"enum",enum:["auto","always","never"],default:"auto",hidden:!0,title:"Signed media URLs"}]),A.contributions.register("keymap.default",{type:"keymap",bindings:[{key:"mod+shift+p",command:"workbench.showCommandPalette"},{key:"mod+p",command:"workbench.quickOpen"},{key:"mod+shift+f",command:"workbench.view.home"},{key:"mod+shift+e",command:"workbench.view.home"},{key:"mod+,",command:"workbench.openSettings"},{key:"mod+shift+l",command:"explorer.copyLink"},{key:"mod+u",command:"explorer.upload"},{key:"delete",command:"explorer.delete",when:"view.active == 'home' && explorer.hasSelection"},{key:"escape",command:"workbench.closeOverlays"},{key:"f5",command:"explorer.refresh"},{key:"mod+shift+i",command:"workbench.toggleInfoPanel"},{key:"mod+shift+v",command:"search.voice"},{key:"browsersearch",command:"search.voice"}]})}function lY(A,{workbench:Q,overlay:B,navigation:C,explorer:J}){let K=Q.observe(),E=C.observe(),Y=B.observe(),L=J.observe(),X={"view.active":r([K],(G)=>G.activity),"sidebar.visible":r([K],(G)=>G.sidebarVisible),"searchModal.open":r([K],(G)=>!!G.searchModal),"sheet.open":r([K],(G)=>G.sheet||""),"infoPanel.open":r([K],(G)=>!!G.infoPanel),"palette.open":r([Y],(G)=>!!G.palette),"editor.open":r([E],(G)=>!!G.activeFile),"editor.openerId":r([E],(G)=>G.stack?.at(-1)?.openerId||""),"editor.contentType":r([E],(G)=>G.activeFile?.contentType||""),"explorer.collectionId":r([L],(G)=>G.collectionId??null),"explorer.hasSelection":r([L],(G)=>(G.selection?.length||0)>0)},H=Object.entries(X).map(([G,Z])=>A.register(G,Z));return()=>H.forEach((G)=>G())}function cY(A,Q){let B=Q.observe(),C=[A.register("viewport.mode",r([B],(J)=>J.mode)),A.register("viewport.phone",r([B],(J)=>J.mode==="phone")),A.register("viewport.tv",r([B],(J)=>J.mode==="tv"))];return()=>C.forEach((J)=>J())}var dY="trove.recents",I$=12;class gK{constructor(){this.state={stack:[{kind:"search"}],activeTabId:null,activeFile:null,recents:U$()},this.cell=d(this.state)}observe(){return this.cell}#A(A){this.state={...this.state,...A},this.cell.setValue(this.state)}#Q(){return this.state.stack[this.state.stack.length-1]}activeTab(){let A=this.#Q();return A?.kind==="file"?A:null}#B(A,{history:Q=!0}={}){let B=A[A.length-1],C=B&&B.kind==="file"?B:null;if(this.#A({stack:A,activeTabId:C?C.id:null,activeFile:C?C.node:null}),Q)this.#C()}reset(){this.#B([{kind:"search"}])}openFile(A,Q,{reset:B=!1}={}){let C={kind:"file",id:A.id,node:A,openerId:Q},J;if(B)J=[{kind:"search"},C];else{let K=this.state.stack.findIndex((E)=>E.kind==="file"&&E.id===A.id);if(K>=0)J=this.state.stack.slice(0,K+1),J[K]=C;else J=[...this.state.stack,C]}this.#J(A),this.#B(J)}back(){if(this.state.stack.length<=1)return;try{history.back()}catch{this.pop()}}pop(){if(this.state.stack.length>1)this.#B(this.state.stack.slice(0,-1),{history:!1})}forget(A){let Q=this.state.recents.filter((C)=>C.id!==A);if(Q.length!==this.state.recents.length)this.#A({recents:Q}),kK(Q);let B=this.state.stack.filter((C)=>!(C.kind==="file"&&C.id===A));this.#B(B.length?B:[{kind:"search"}],{history:!1})}updateTabNode(A){let Q=this.state.recents.map((C)=>C.id===A.id?{...C,name:A.name,contentType:A.contentType||C.contentType}:C);if(Q.some((C,J)=>C!==this.state.recents[J]))this.#A({recents:Q}),kK(Q);let B=this.state.stack.map((C)=>C.kind==="file"&&C.id===A.id?{...C,node:A}:C);this.#B(B,{history:!1})}#C(A=!1){let Q=this.#Q(),B=Q?.node,C={troveDepth:this.state.stack.length,node:B?{id:B.id,name:B.name,contentType:B.contentType,collectionId:B.collectionId}:null,openerId:Q?.openerId||null};try{(A?history.replaceState:history.pushState).call(history,C,"")}catch{}}onPopState(A){let Q=A?.state||{},B=Q.troveDepth||1;if(B<=this.state.stack.length)this.#B(this.state.stack.slice(0,B),{history:!1});else if(Q.node)this.#B([...this.state.stack,{kind:"file",id:Q.node.id,node:Q.node,openerId:Q.openerId}],{history:!1})}#J(A){if(!A)return;let B=[{id:A.id,name:A.name,contentType:A.contentType||"",collectionId:A.collectionId},...this.state.recents.filter((C)=>C.id!==A.id)].slice(0,I$);this.#A({recents:B}),kK(B)}}function U$(){try{return JSON.parse(localStorage.getItem(dY))||[]}catch{return[]}}function kK(A){try{localStorage.setItem(dY,JSON.stringify(A))}catch{}}class yK{constructor(A,Q=null){this.offline=Q,this.platform=A,this.api=A.api,this.state={me:null,notifications:{items:[],unread:0},inboxOpen:!1,pushSupported:"serviceWorker"in navigator&&"PushManager"in window,pushEnabled:!1,sidecar:null,backlinks:null,posting:!1,replyTo:null},this.cell=d(this.state),this._pollTimer=null}observe(){return this.cell}#A(A){this.state={...this.state,...A},this.cell.setValue(this.state)}async init(){try{let A=await this.api.me();this.#A({me:A.principal,admin:!!A.admin})}catch{}if(await this.refreshNotifications(),this._pollTimer=setInterval(()=>this.refreshNotifications(),45000),this._pollTimer.unref)this._pollTimer.unref();this.#B(),window.addEventListener("focus",()=>this.refreshNotifications()),navigator.serviceWorker?.addEventListener?.("message",(A)=>{if(A.data?.type==="trove-push")this.refreshNotifications()})}async refreshNotifications(){try{let A=await this.api.notifications();this.#A({notifications:A})}catch{}}toggleInbox(A){let Q=A??!this.state.inboxOpen;if(this.#A({inboxOpen:Q}),Q&&this.state.notifications.unread)this.markAllRead()}async markAllRead(){try{await this.api.markNotificationsRead(),this.#A({notifications:{...this.state.notifications,unread:0,items:this.state.notifications.items.map((A)=>({...A,read:!0}))}})}catch{}}async loadSidecar(A){if(!A)return this.#A({sidecar:null,backlinks:null});this.#A({sidecar:{nodeId:A,loading:!0,tags:[],comments:[],subscribers:[]}}),this.loadBacklinks(A);try{let Q=await this.api.sidecar(A);if(this.state.sidecar?.nodeId!==A)return;this.#A({sidecar:{...Q,loading:!1}})}catch(Q){if(this.state.sidecar?.nodeId!==A)return;this.#A({sidecar:{nodeId:A,loading:!1,error:Q.message,tags:[],comments:[]}})}}async loadBacklinks(A){if(!A)return this.#A({backlinks:null});this.#A({backlinks:{nodeId:A,items:[],loading:!0,error:null}});try{let Q=await this.api.backlinks(A);if(this.state.backlinks?.nodeId!==A)return;this.#A({backlinks:{nodeId:A,items:Q.items||[],loading:!1,error:null}})}catch(Q){if(this.state.backlinks?.nodeId!==A)return;this.#A({backlinks:{nodeId:A,items:[],loading:!1,error:Q.message}})}}async#Q(){if(this.state.sidecar?.nodeId)await this.loadSidecar(this.state.sidecar.nodeId)}setReplyTo(A){this.#A({replyTo:A})}async comment(A){let Q=this.state.sidecar?.nodeId;if(!Q||!A.trim())return;let B=this.state.replyTo?.id||null;if(this.offline&&!this.offline.state.online){await this.offline.queueOp({method:"POST",path:`/api/items/${encodeURIComponent(Q)}/comments`,body:{body:A,parentId:B}}),this.#A({replyTo:null}),this.platform.notifications.info("Offline — your comment will post when you reconnect.");return}this.#A({posting:!0});try{await this.api.addComment(Q,{body:A,parentId:B}),this.#A({replyTo:null}),await this.#Q()}catch(C){this.platform.notifications.error(`Couldn't post comment: ${C.message}`)}finally{this.#A({posting:!1})}}async deleteComment(A){let Q=this.state.sidecar?.nodeId;await this.api.deleteComment(Q,A).catch((B)=>this.platform.notifications.error(B.message)),await this.#Q()}async react(A,Q){let B=this.state.sidecar?.nodeId,J=!(aY(this.state.sidecar?.comments||[],A)?.reactions?.[Q]||[]).includes(this.state.me?.id);try{await this.api.reactComment(B,A,Q,J)}catch(K){this.platform.notifications.error(`Couldn't react: ${K.message}`)}await this.#Q()}async addTag(A,Q){let B=this.state.sidecar?.nodeId;if(!A.trim())return;if(this.offline&&!this.offline.state.online){await this.offline.queueOp({method:"POST",path:`/api/items/${encodeURIComponent(B)}/tags`,body:{name:A.trim(),value:Q}}),this.platform.notifications.info("Offline — tag will sync when you reconnect.");return}await this.api.setTag(B,A.trim(),Q).catch((C)=>this.platform.notifications.error(C.message)),await this.#Q()}async removeTag(A){let Q=this.state.sidecar?.nodeId;if(this.offline&&!this.offline.state.online){await this.offline.queueOp({method:"DELETE",path:`/api/items/${encodeURIComponent(Q)}/tags/${encodeURIComponent(A)}`}),this.platform.notifications.info("Offline — tag removal will sync when you reconnect.");return}try{await this.api.removeTag(Q,A)}catch(B){this.platform.notifications.error(`Couldn't remove tag: ${B.message}`)}await this.#Q()}async#B(){if(!this.state.pushSupported)return;try{let Q=await(await navigator.serviceWorker.getRegistration())?.pushManager?.getSubscription();this.#A({pushEnabled:!!Q})}catch{}}async enablePush(){if(!this.state.pushSupported){this.platform.notifications.warn("Push notifications are not supported in this browser.");return}try{let{publicKey:A}=await this.api.vapidKey();if(!A){this.platform.notifications.warn("This server has no VAPID key configured for web push.");return}let Q=await navigator.serviceWorker.register("/sw.js");if(await navigator.serviceWorker.ready,await Notification.requestPermission()!=="granted")return this.platform.notifications.info("Notifications permission was denied.");let C=await Q.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:F$(A)});await this.api.subscribePush(C.toJSON()),this.#A({pushEnabled:!0}),this.platform.notifications.success("Notifications enabled — you’ll be pinged when someone @mentions you.")}catch(A){this.platform.notifications.error(`Couldn't enable notifications: ${A.message}`)}}}function aY(A,Q){for(let B of A){if(B.id===Q)return B;let C=aY(B.replies||[],Q);if(C)return C}return null}function F$(A){let Q="=".repeat((4-A.length%4)%4),B=(A+Q).replace(/-/g,"+").replace(/_/g,"/"),C=atob(B),J=new Uint8Array(C.length);for(let K=0;K<C.length;K++)J[K]=C.charCodeAt(K);return J}class hK{get dimensions(){return 0}async embed(A){throw N.unsupported("embed not implemented")}async embedOne(A){return(await this.embed([A]))[0]}}var M$=new Set("a an the of to in on for and or is are be as at by with from this that it".split(" "));function R$(A){return String(A).toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter((Q)=>Q.length>1&&!M$.has(Q))}function V$(A){let Q=2166136261;for(let B=0;B<A.length;B++)Q^=A.charCodeAt(B),Q=Math.imul(Q,16777619);return Q>>>0}class bK extends hK{constructor({dimensions:A=256}={}){super();this._dim=A}get dimensions(){return this._dim}async embed(A){return A.map((Q)=>this.#A(Q))}#A(A){let Q=new Float64Array(this._dim),B=R$(A),C=[...B];for(let K=0;K<B.length-1;K++)C.push(B[K]+"_"+B[K+1]);for(let K of C){let E=V$(K),Y=E%this._dim,L=E>>31&1?-1:1;Q[Y]+=L}let J=0;for(let K=0;K<Q.length;K++)J+=Q[K]*Q[K];return J=Math.sqrt(J)||1,Array.from(Q,(K)=>K/J)}}class N$ extends hK{constructor(A){super();if(!A?.url||!A?.dimensions)throw N.invalid("HttpEmbedding requires url and dimensions");this.cfg=A}get dimensions(){return this.cfg.dimensions}async embed(A){let Q=this.cfg.batchSize??64,B=[];for(let C=0;C<A.length;C+=Q){let J=A.slice(C,C+Q);B.push(...await this.#A(J))}return B}async#A(A){return DB(async()=>{let Q;try{Q=await fetch(this.cfg.url,{method:"POST",headers:{"content-type":"application/json",...this.cfg.apiKey?{authorization:`Bearer ${this.cfg.apiKey}`}:{}},body:JSON.stringify({model:this.cfg.model,input:A})})}catch(J){throw yB(J)}if(Q.status===429||Q.status>=500)throw N.transient(`Embedding endpoint ${Q.status}`);if(!Q.ok)throw N.internal(`Embedding endpoint failed: ${Q.status}`);let B=await Q.json();return(B.data??B.embeddings??[]).map((J)=>J.embedding??J)})}}function nY(A,Q,B){let C=[],J=0;while(J<A.length){let K=Math.min(J+Q,A.length);if(K<A.length){let E=A.slice(J,K),Y=Math.max(E.lastIndexOf(`
345
+
346
+ `),E.lastIndexOf(". "),E.lastIndexOf(`
347
+ `));if(Y>Q*0.75)K=J+Y+1}if(C.push(A.slice(J,K).trim()),K>=A.length)break;J=K-B}return C.filter(Boolean)}var q$=new Set("a an the of to in on for and or is are be as at by with from this that it".split(" "));function vK(A){return String(A).toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter((Q)=>Q.length>1&&!q$.has(Q))}var z$="trove-offline",oY="trove-files-v1",fK=new bK({dimensions:256});class pK{constructor(A){this.platform=A,this.api=A.api,this.db=null,this.state={online:navigator.onLine,pins:[],queued:0,syncing:!1},this.cell=d(this.state)}observe(){return this.cell}#A(A){this.state={...this.state,...A},this.cell.setValue(this.state)}async init(){if(this.db=await P$(),await this.#C(),await this.#J(),window.addEventListener("online",()=>this.#Q()),window.addEventListener("offline",()=>this.#B()),this.state.online&&!await this.api.reachable())this.#A({online:!1});if(this.platform.plugins?.setOnline?.(this.state.online),this.state.online)this.flushQueue()}async#Q(){if(!await this.api.reachable()){this.#A({online:!1}),await this.platform.plugins?.setOnline?.(!1);return}this.#A({online:!0}),await this.platform.plugins?.setOnline?.(!0),await this.flushQueue()}async#B(){this.#A({online:!1}),await this.platform.plugins?.setOnline?.(!1)}async pin(A){if(!A?.id)return;try{if("caches"in window){let J=await caches.open(oY),K=this.platform.mediaUrls,E=K.cacheKey(A.id),{url:Y}=await K.url(A.id,{op:"download"}),L=await fetch(Y);if(!L.ok)throw Error(`Couldn't fetch the file (${L.status})`);await J.put(new Request(E),L)}let Q=[],B="";if(n8(A))try{B=await this.api.readText(A.id);let J=nY(B,1000,150),K=await fK.embed(J.length?J:[A.name]);Q=(J.length?J:[A.name]).map((E,Y)=>({text:E,vector:K[Y]}))}catch{}let C=(await fK.embed([A.name]))[0];await j$(this.db,"pins",A.id,{node:A,text:B,chunks:Q,nameVec:C,pinnedAt:Date.now()}),await this.#C(),this.platform.notifications.success(`“${A.name}” is available offline`)}catch(Q){this.platform.notifications.error(`Couldn't make available offline: ${Q.message}`)}}async unpin(A){if(this.state.pins.find((B)=>B.id===A)&&"caches"in window)await(await caches.open(oY)).delete(this.platform.mediaUrls.cacheKey(A),{ignoreVary:!0}).catch(()=>{});await uK(this.db,"pins",A),await this.#C()}async#C(){let A=await mK(this.db,"pins");this.#A({pins:A.map((Q)=>({id:Q.node.id,name:Q.node.name,contentType:Q.node.contentType,collectionId:Q.node.collectionId,pinnedAt:Q.pinnedAt}))})}async searchOffline(A,{limit:Q=40}={}){let B=await mK(this.db,"pins");if(!B.length)return[];let C=vK(A),J=(await fK.embed([A]))[0],K=[];for(let E of B){let Y=vK(`${E.node.name} ${E.text||""}`),L=T$(C,new Set(Y)),X=sY(J,E.nameVec);for(let G of E.chunks||[])X=Math.max(X,sY(J,G.vector));let H=0.6*X+0.4*L;if(H>0.02)K.push({nodeId:E.node.id,node:E.node,score:H,snippet:w$(E.text,C),indexerId:"offline"})}return K.sort((E,Y)=>Y.score-E.score).slice(0,Q)}async queueOp(A){await _$(this.db,"queue",{...A,at:Date.now()}),await this.#J()}async#J(){let A=await mK(this.db,"queue");this.#A({queued:A.length})}async flushQueue(){if(!this.state.online||this.state.syncing)return;this.#A({syncing:!0});let A=0,Q=0;try{let B=await S$(this.db,"queue");for(let{key:C,value:J}of B)try{await this.api.request(J.method,J.path,{body:J.body}),await uK(this.db,"queue",C),A++}catch(K){if(["transient","timeout","unauthorized","quota"].includes(K.code))break;await uK(this.db,"queue",C),Q++}}finally{if(await this.#J(),this.#A({syncing:!1}),Q)this.platform.notifications.warn(`${Q} offline change${Q>1?"s":""} couldn't be applied and ${Q>1?"were":"was"} discarded.`);if(A&&this.state.queued===0)this.platform.notifications.info(`${A} offline change${A>1?"s":""} synced.`)}}}function P$(){return new Promise((A,Q)=>{let B=indexedDB.open(z$,1);B.onupgradeneeded=()=>{let C=B.result;if(!C.objectStoreNames.contains("pins"))C.createObjectStore("pins");if(!C.objectStoreNames.contains("queue"))C.createObjectStore("queue",{autoIncrement:!0})},B.onsuccess=()=>A(B.result),B.onerror=()=>Q(B.error)})}function YC(A,Q,B,C){return new Promise((J,K)=>{let E=A.transaction(Q,B),Y=E.objectStore(Q),L;Promise.resolve(C(Y)).then((X)=>L=X),E.oncomplete=()=>J(L),E.onerror=()=>K(E.error)})}var O$=(A)=>new Promise((Q,B)=>{A.onsuccess=()=>Q(A.result),A.onerror=()=>B(A.error)}),j$=(A,Q,B,C)=>YC(A,Q,"readwrite",(J)=>J.put(C,B)),_$=(A,Q,B)=>YC(A,Q,"readwrite",(C)=>C.add(B)),uK=(A,Q,B)=>YC(A,Q,"readwrite",(C)=>C.delete(B)),mK=(A,Q)=>YC(A,Q,"readonly",(B)=>O$(B.getAll()));function S$(A,Q){return YC(A,Q,"readonly",(B)=>new Promise((C,J)=>{let K=[],E=B.openCursor();E.onsuccess=()=>{let Y=E.result;if(!Y)return C(K);K.push({key:Y.key,value:Y.value}),Y.continue()},E.onerror=()=>J(E.error)}))}function T$(A,Q){if(!A.length||!Q.size)return 0;let B=0;for(let C of A)if(Q.has(C))B++;return B/A.length}function sY(A,Q){if(!A||!Q)return 0;let B=0;for(let C=0;C<A.length;C++)B+=A[C]*Q[C];return B}function w$(A,Q){if(!A)return null;let B=A.toLowerCase(),C=-1;for(let K of Q){let E=B.indexOf(K);if(E>=0){C=E;break}}if(C<0)return A.slice(0,160).trim();let J=Math.max(0,C-60);return(J>0?"…":"")+A.slice(J,J+200).trim()+"…"}var x$=1000,k$=60000;class lK{constructor(A){this.platform=A,this.api=A.api,this.state={tasks:[],issues:[],issuesLoading:!1,tasksError:null,issuesError:null,open:!1},this.cell=d(this.state),this._local=new Map,this._server=[],this._timer=null,this._pollMs=null}observe(){return this.cell}#A(A){this.state={...this.state,...A},this.cell.setValue(this.state)}#Q(){this.#A({tasks:[...this._local.values(),...this._server]})}start(A={}){let Q=A.id||`local_${Math.random().toString(36).slice(2,10)}`,B={id:Q,source:"local",kind:A.kind||"general",title:A.title||"Working",detail:A.detail??null,status:"running",done:0,total:A.total??null,unit:A.unit||null,cancellable:!!A.onCancel,startedAt:Date.now(),endedAt:null,error:null};if(this._local.set(Q,B),this._cancels||=new Map,A.onCancel)this._cancels.set(Q,A.onCancel);this.#Q(),this.#J();let C=(J)=>{let K=this._local.get(Q);if(!K||K.status!=="running")return;this._local.set(Q,{...K,...J}),this.#Q()};return{id:Q,progress:(J={})=>C({done:J.done??this._local.get(Q)?.done??0,total:J.total===void 0?this._local.get(Q)?.total:J.total,unit:J.unit??this._local.get(Q)?.unit,detail:J.detail??this._local.get(Q)?.detail}),succeed:(J)=>{C({status:"done",endedAt:Date.now(),detail:J??this._local.get(Q)?.detail}),this.#B(Q)},fail:(J)=>{C({status:"failed",endedAt:Date.now(),error:J?.message||String(J||"failed")})},cancel:()=>{C({status:"cancelled",endedAt:Date.now()}),this.#B(Q)}}}#B(A,Q=5000){setTimeout(()=>{this._local.delete(A),this._cancels?.delete(A),this.#Q()},Q)}async cancel(A){if(this._local.get(A)){this._cancels?.get(A)?.();return}try{await this.api.cancelTask(A),await this.refreshTasks()}catch(B){this.#A({tasksError:B.message})}}dismiss(A){if(this._local.delete(A)){this.#Q();return}this.api.dismissTask(A).catch(()=>{}),this._server=this._server.filter((Q)=>Q.id!==A),this.#Q()}async init(){await this.refresh(),this.#J(),window.addEventListener("focus",()=>this.refresh())}async refresh(){await Promise.all([this.refreshTasks(),this.refreshIssues()])}async refreshTasks(){let A=this.running.length>0;try{let{tasks:Q}=await this.api.tasks();this._server=(Q||[]).map((B)=>({...B,source:"server"})),this.#A({tasksError:null}),this.#Q()}catch(Q){this._server=[],this.#A({tasksError:Q.message}),this.#Q()}if(A&&!this.running.length)this.refreshIssues();this.#J()}async refreshIssues(){this.#A({issuesLoading:!0});try{let{issues:A}=await this.api.issues();this.#A({issues:A||[],issuesLoading:!1,issuesError:null})}catch(A){this.#A({issuesLoading:!1,issuesError:A.message})}}async retryIssue(A){try{await this.api.retryIssue(A),await this.refreshTasks(),this.#C(),this.platform.notifications?.info?.("Retrying — watch its progress in Activity")}catch(Q){this.platform.notifications?.error?.(`Couldn't retry: ${Q.message}`)}}async dismissIssue(A){let Q=this.state.issues;this.#A({issues:Q.filter((B)=>B.id!==A)});try{await this.api.dismissIssue(A)}catch(B){this.#A({issues:Q}),this.platform.notifications?.error?.(`Couldn't dismiss: ${B.message}`)}}#C(){for(let A of[400,1500])setTimeout(()=>{this.refreshTasks(),this.refreshIssues()},A)?.unref?.()}async rebuildIndex(){try{let A=await this.api.reindex();if(await this.refreshTasks(),this.togglePanel(!0),A.alreadyRunning)this.platform.notifications?.info?.("A rebuild is already running");return A}catch(A){throw this.platform.notifications?.error?.(`Couldn't rebuild the index: ${A.message}`),A}}async scanCollection(A){try{let Q=await this.api.scanCollection(A);if(await this.refreshTasks(),this.togglePanel(!0),Q.alreadyRunning)this.platform.notifications?.info?.("A scan of this collection is already running");return this.#C(),Q}catch(Q){throw this.platform.notifications?.error?.(`Couldn't scan “${A}”: ${Q.message}`),Q}}async checkStorage(){try{let A=await this.api.checkStorage();await this.refresh(),this.togglePanel(!0);let Q=(A.results||[]).reduce((B,C)=>B+(C.findings?.length||0),0);if(Q)this.platform.notifications?.warn?.(`Found ${Q} storage problem${Q===1?"":"s"} — see Activity`);else if(!A.checked)this.platform.notifications?.info?.("There are no collections to check yet");else if(!A.corsChecked)this.platform.notifications?.info?.("Stores are reachable. Browser access was not checked — this drive has no public URL configured.");else this.platform.notifications?.success?.("Stores are reachable and allow browser access");return A}catch(A){throw this.platform.notifications?.error?.(`Couldn't check the stores: ${A.message}`),A}}togglePanel(A){if(this.#A({open:A??!this.state.open}),this.state.open)this.refresh()}get running(){return this.state.tasks.filter((A)=>A.status==="running")}#J(){let A=this.running.length?x$:k$;if(this._timer&&this._pollMs===A)return;clearTimeout(this._timer),this._pollMs=A,this._timer=setTimeout(()=>{this._timer=null,this.refreshTasks().then(()=>{if(!this.running.length)this.refreshIssues()})},A),this._timer?.unref?.()}dispose(){clearTimeout(this._timer),this._timer=null}}var NB="explorer.hasSelection || editor.open";function iY(A){let Q=(B,C,J,K={})=>A.platform.commands.register({id:B,title:C,actions:J,...K});Q("workbench.showCommandPalette","Show All Commands",()=>new tC("commands"),{category:"View",icon:"command"}),Q("workbench.quickOpen","Go to File…",()=>new tC("files"),{category:"File",icon:"search"}),Q("workbench.view.home","Go Home (search & browse)",()=>new yQ,{category:"View",icon:"search"}),Q("workbench.view.plugins","Show Plugins",()=>new KC("plugins"),{category:"View"}),Q("workbench.view.admin","Show Administration",()=>new KC("admin"),{category:"View",icon:"gear"}),Q("workbench.openSettings","Open Settings",()=>new KC("settings"),{category:"Preferences",icon:"gear"}),Q("workbench.closeOverlays","Close",()=>new rJ,{palette:!1}),Q("search.voice","Search by Voice",()=>new tJ,{category:"View",icon:"search"}),Q("workbench.showActivity","Show Activity (running work & problems)",()=>new cA(!0),{category:"View",icon:"refresh"}),Q("workbench.rebuildIndex","Rebuild Search Index",()=>new eJ,{category:"View",icon:"refresh"}),Q("workbench.scanCollection","Scan Collection for Outside Changes",()=>new AK,{category:"Explorer",icon:"refresh"}),Q("workbench.checkStorage","Check Storage Configuration",()=>new QK,{category:"View",icon:"plug"}),Q("explorer.refresh","Refresh",()=>new nB,{category:"Explorer",icon:"refresh"}),Q("explorer.loadMore","Show More Items",()=>new UJ,{palette:!1}),Q("explorer.upload","Upload Files…",()=>new BK,{category:"Explorer",icon:"upload"}),Q("explorer.copyShareLink","Copy Shareable Link",(B)=>new eC("share",B),{category:"Explorer",icon:"link",when:NB}),Q("explorer.copyLink","Copy Link to Item",(B)=>new eC("trove",B),{category:"Explorer",icon:"link",when:NB}),Q("explorer.rename","Rename",(B)=>new CK(B),{category:"Explorer",when:NB}),Q("explorer.delete","Delete",()=>new JK,{category:"Explorer",icon:"trash",when:NB}),Q("explorer.open","Open",(B)=>new EK(B),{palette:!1}),Q("explorer.download","Download",(B)=>new YK(B),{category:"Explorer",icon:"download",when:NB}),Q("explorer.showTrash","Show Trash",()=>new KK,{category:"Explorer",icon:"trash"}),Q("explorer.hideTrash","Hide Trash",()=>new oQ("hide"),{palette:!1}),Q("explorer.restore","Restore from Trash",(B)=>B?new oQ("restore",B):null,{palette:!1}),Q("explorer.purgeOne","Delete Forever",(B)=>B?new oQ("purge",B):null,{palette:!1}),Q("explorer.emptyTrash","Empty Trash",()=>new dA({kind:"confirm",title:"Empty the trash?",body:"Everything in the trash will be destroyed. This cannot be undone.",danger:!0,confirmLabel:"Delete forever",confirmActions:[new oQ("empty")]}),{category:"Explorer",icon:"trash"}),Q("keys.load","Load API Keys",()=>new MJ,{palette:!1}),Q("keys.new","New API Key",()=>new LK,{palette:!1}),Q("keys.cancel","Cancel API Key",()=>new XK,{palette:!1}),Q("keys.dismissMinted","Dismiss API Key",()=>new GK,{palette:!1}),Q("keys.revoke","Revoke API Key",(B)=>B?new RJ(B):null,{palette:!1}),Q("keys.mint","Create API Key",()=>new HK,{palette:!1}),Q("offline.pin","Make Available Offline",(B)=>new A0(B,!0),{category:"Offline",icon:"download",when:NB}),Q("offline.unpin","Remove from Offline",(B)=>new A0(B,!1),{palette:!1}),Q("collections.switch","Switch Collection…",(B)=>new $K(B),{category:"Collections",icon:"files"}),Q("collections.create","New Collection…",()=>new dA({kind:"collection",title:"New collection"}),{category:"Collections",icon:"files"}),Q("workbench.toggleInfoPanel","Toggle Details & Conversation",()=>new ZK,{category:"View",icon:"info"}),Q("notifications.show","Show Notifications",()=>new UQ(!0),{category:"View"}),Q("notifications.enablePush","Enable Push Notifications",()=>new QC,{category:"Notifications"}),Q("plugins.installFromUrl","Install Plugin from URL…",()=>new dA({kind:"prompt",title:"Install plugin from URL",label:"Plugin package (.zip) URL",placeholder:"https://example.com/plugin.zip",confirmLabel:"Fetch",confirmActions:[new oJ]}),{category:"Plugins",icon:"plug"}),Q("plugins.installFromFile","Install Plugin from File…",()=>new DK,{category:"Plugins",icon:"plug"})}function rY(A){let Q=LY(A.settings),B=XY(),C=GY(),J=DY(),K=new lK(A),E=HY(),Y=ZY(),L=$Y(),X=new gK,H=new DJ(K),G=new pK(A),Z=new yK(A,G),M={platform:A,explorer:Q,search:B,transfers:H,social:Z,offline:G,activity:K,apiKeys:C,rotation:J,workbench:Y,overlay:L,navigation:X,engine:null},I=new uC({providers:{appState:m.fromSingleton(new Map),explorer:m.fromSingleton(Q),search:m.fromSingleton(B),transfers:m.fromSingleton(H),social:m.fromSingleton(Z),offline:m.fromSingleton(G),activity:m.fromSingleton(K),apiKeys:m.fromSingleton(C),rotation:m.fromSingleton(J),viewState:m.fromSingleton(E),engine:m.fromLazySingleton(async()=>I,()=>{}),workbench:m.fromSingleton(Y),overlay:m.fromSingleton(L),navigation:m.fromSingleton(X),settings:m.fromSingleton(A.settings),notifications:m.fromSingleton(A.notifications),context:m.fromSingleton(A.context),commands:m.fromSingleton(A.commands),keybindings:m.fromSingleton(A.keybindings),contributions:m.fromSingleton(A.contributions),viewport:m.fromSingleton(A.viewport),voice:m.fromSingleton(A.voice),api:m.fromSingleton(A.api),capabilities:m.fromLazySingleton(async()=>{let F=d(null);return A.api.capabilities().then((V)=>F.setValue(V),()=>{}),F},()=>{}),mediaUrls:m.fromSingleton(A.mediaUrls),plugins:m.fromSingleton(A.plugins)}});return M.engine=I,A.commands.dispatch=(F)=>I.dispatch(F),A.dispatch=(F)=>I.dispatch(F),A.openPluginPanel=(F)=>I.dispatch(new tB(F)),iY(M),lY(A.context,{workbench:Y,overlay:L,navigation:X,explorer:Q}),cY(A.context,A.viewport),Z.init(),G.init(),K.init(),I.dispatch(new aB),{engine:I,app:M}}var tY=new WeakMap;function i(A,Q){let B=tY.get(A);if(!B)B=new WeakMap,tY.set(A,B);let C=B.get(Q);if(!C){let J="initial"in Q?Q.initial:sA;C=NC(A.query(Q),{initial:J}),B.set(Q,C)}return C}function NA(A,Q,B,C){let J=Object.keys(Q),K=J.map((Y)=>i(A,Q[Y])),E=r(K,(...Y)=>Object.fromEntries(J.map((L,X)=>[L,Y[X]])));return w.alias(()=>XQ(E,B,C))}var g$=new FinalizationRegistry(({table:A,key:Q})=>{if(A.get(Q)&&!A.get(Q).deref())A.delete(Q)});function cK(A,Q){let B=typeof A;if(A===null||B==="string"||B==="number"||B==="boolean")return;if(B!=="object")throw TypeError(`Query argument ${Q} is a ${B}, which cannot be part of a sharing key. Pass an id and let the query look the thing up, or give queryOf a key function.`);if(Array.isArray(A))return A.forEach((J,K)=>cK(J,`${Q}[${K}]`));let C=Object.getPrototypeOf(A);if(C===Object.prototype||C===null)return Object.entries(A).forEach(([J,K])=>cK(K,`${Q}.${J}`));throw TypeError(`Query argument ${Q} is a ${A.constructor?.name??"non-plain object"}, which cannot be part of a sharing key. Pass an id and let the query look the thing up, or give queryOf a key function.`)}function dK(A){if(A===null||typeof A!=="object")return JSON.stringify(A)??"null";if(Array.isArray(A))return`[${A.map(dK).join(",")}]`;return`{${Object.keys(A).sort().map((Q)=>`${JSON.stringify(Q)}:${dK(A[Q])}`).join(",")}}`}function y$(...A){return A.forEach((Q,B)=>cK(Q,`#${B}`)),A.map(dK).join("|")}function qB(A,Q=y$){let B=new Map;return function(...J){if(this!==void 0&&this!==A)throw TypeError(`${this?.name??"A subclass"}.of() would build a ${A.name}, because \`of\` captures the class it was declared on. Give ${this?.name??"the subclass"} its own \`static of = queryOf(...)\`, or call it on `+A.name+" directly.");let K=Q(...J),E=B.get(K)?.deref();if(E)return E;let Y=new A(...J);return B.set(K,new WeakRef(Y)),g$.register(Y,{table:B,key:K}),Y}}function h$(A,Q){if(!Q)return 1;let B=0,C=0;for(let K of Q){let E=A.indexOf(K,C);if(E<0)return 0;B+=E===C?3:1,C=E+1}let J=A.indexOf(Q);if(J>=0)B+=100-Math.min(50,J);return B}function aK(A,Q,B=60){let C=(Q||"").trim().toLowerCase(),J=A||[];if(!C)return J.slice(0,B);let K=[];for(let E of J){let Y=h$(`${E.category||""} ${E.title}`.toLowerCase(),C);if(Y>0)K.push([Y,E])}return K.sort((E,Y)=>Y[0]-E[0]||String(E[1].title).localeCompare(String(Y[1].title))).slice(0,B).map(([,E])=>E)}function eY({ex:A={},tr:Q={},act:B={},off:C={}}={}){let J=A.items||[],K=B.tasks||[];return{collectionId:A.collectionId??null,collectionLabel:b$(A),totalItems:A.stats?.items??J.length,totalKnown:A.stats?.items!=null,totalBytes:A.stats?.bytes??J.reduce((E,Y)=>E+(Y.size||0),0),shown:J.length,partial:!!A.nextCursor,usage:A.usage??null,usageLevel:v$(A.usage),uploading:(Q.items||[]).filter((E)=>E.status==="active"),running:K.filter((E)=>E.status==="running"),issues:B.issues||[],off:{online:!0,pins:[],queued:0,syncing:!1,...C}}}function b$(A){if(!A?.collectionId)return"no collection";return(A.collections||[]).find((B)=>B.id===A.collectionId)?.name||A.collectionId}function v$(A){if(!A?.total)return"";let Q=A.available/A.total;return Q<0.05?"critical":Q<0.1?"low":""}function AL(A){let Q=A||{};if(!Q.off?.online)return{kind:"offline",label:"Offline"};if(Q.issues?.length)return{kind:"issues",label:`${Q.issues.length} need${Q.issues.length===1?"s":""} attention`,count:Q.issues.length};if(Q.running?.length||Q.uploading?.length||Q.off?.syncing)return{kind:"working",label:"Working…",count:(Q.running?.length||0)+(Q.uploading?.length||0)};if(Q.usageLevel)return{kind:"lowSpace",label:"Low on space"};return{kind:"idle",label:"Status"}}function nK(A){let Q=A||"";return Q.startsWith("!")?"command":Q.includes("#")?"filter":"search"}var f$=(A)=>{let Q=A?.contentType||"";if(Q.startsWith("image/"))return"file-image";if(Q.startsWith("audio/"))return"file-audio";if(Q.startsWith("video/"))return"file-video";return"file-text"};function u$(A,{pinned:Q=!1,keys:B={}}={}){let C=(J)=>B[J]||void 0;return[{label:"Open",icon:"file-text",actions:[new z("explorer.open",A)]},{label:"Download",icon:"download",actions:[new z("explorer.download",A)]},{label:"Copy shareable link",icon:"link",actions:[new z("explorer.copyShareLink")]},{label:"Copy trove: link",icon:"link",kbd:C("explorer.copyLink"),actions:[new z("explorer.copyLink")]},{sep:!0},{label:"Rename…",actions:[new z("explorer.rename")]},Q?{label:"Remove from offline",icon:"close",actions:[new z("offline.unpin",A)]}:{label:"Make available offline",icon:"download",actions:[new z("offline.pin",A)]},{sep:!0},{label:"Move to trash",icon:"trash",danger:!0,kbd:C("explorer.delete"),actions:[new z("explorer.delete")]}]}function m$(A){return[{label:"Restore",icon:"refresh",actions:[new z("explorer.restore",A.id)]},{sep:!0},{label:"Delete forever",icon:"trash",danger:!0,actions:[new z("explorer.purgeOne",A.id)]}]}function p$(A,{modal:Q,pinnedIds:B,keys:C}){return{icon:f$(A),title:A.name,detail:A.contentType||"",node:A,actions:[new pA(A,{reset:!!Q}),...Q?[new MB]:[]],menu:()=>u$(A,{pinned:B.has(A.id),keys:C})}}function QL(A,Q=!1){let{ex:B={},se:C={},nav:J={},query:K="",commandMatches:E=[],pinnedIds:Y=new Set,keys:L={}}=A,X=nK(K),H=(q)=>p$(q,{modal:Q,pinnedIds:Y,keys:L}),G=Q?[new MB]:[];if(X==="command")return[{id:"commands",title:"Commands",items:E.map((q)=>({icon:"command",title:q.title,detail:q.category,badge:"command",actions:[new z(q.id),...G]})),empty:"No matching commands."}];let{text:Z,filters:M}=pB(K),I=(C.results||[]).map((q)=>q.node),F=C.error,V=(q)=>F?[{icon:"refresh",label:"Retry",title:"Retry",actions:q}]:[];if(M.length){let q=M.map(pC).join(" ")+(Z.trim()?` · "${Z.trim()}"`:"");return[{id:"filtered",title:C.loading?"Filtering…":F?"Filter failed":"Filtered",verbatim:C.loading||F?null:q,controls:V([new UB(M,Z)]),items:I.map(H),empty:C.loading?"Filtering…":F?`Couldn’t filter: ${F}`:"No files match those filters."}]}if(Z.trim())return[{id:"results",title:C.loading?"Searching…":F?"Search failed":"Results",controls:V([new DQ(K)]),items:I.map(H),empty:C.loading?"Searching…":F?`Couldn’t search: ${F}`:"No files match."}];let g=[],u=(J.recents||[]).map(H);if(u.length)g.push({id:"recent",title:"Recent",items:u});let j=(B.items||[]).length,T=B.stats?.items??null,c=T??j,y=T!=null?T.toLocaleString():`${j.toLocaleString()}+`,b=(B.items||[]).map(H);if(B.nextCursor)b.push({icon:"refresh",title:B.loadingMore?"Loading…":T!=null?`Show more (${(T-j).toLocaleString()} more)`:"Show more",detail:"or search to jump straight to something",actions:[new z("explorer.loadMore")]});if(B.trash)g.push({id:"trash",title:B.trash.length?`Trash · ${B.trash.length} item${B.trash.length===1?"":"s"}`:"Trash",controls:[...B.trash.length?[{icon:"trash",label:"Empty trash",title:"Destroy everything in the trash",actions:[new z("explorer.emptyTrash")]}]:[],{icon:"close",label:"Close",title:"Hide the trash",actions:[new z("explorer.hideTrash")]}],items:(B.trash||[]).map((q)=>({icon:"trash",title:q.name,detail:`deleted ${new Date(q.deletedAt).toLocaleString()} — restore`,actions:[new z("explorer.restore",q.id)],menu:()=>m$(q)})),empty:"The trash is empty."});return g.push({id:"all",title:B.nextCursor?`All items · showing ${j.toLocaleString()} of ${y}`:"All items",controls:Q?[]:[{icon:"upload",label:"Upload",title:"Upload files to this collection",actions:[new z("explorer.upload")]}],items:b,empty:B.loading?"Loading…":B.error?`Couldn’t load this collection: ${B.error}`:"Nothing here yet — upload a file to get started."}),g}function BL({eligible:A=!1,caps:Q=null}={}){if(!A)return null;let B=Q?.searchPrompt;if(!B?.hint&&!B?.examples?.length)return null;return{hint:B.hint||null,examples:(B.examples||[]).map((C)=>{let{text:J,filters:K}=pB(C.query);return{query:C.query,label:C.label||null,actions:[new sQ(C.query),K.length?new UB(K,J):new DQ(J)]}})}}var CL="explorer.view";function JL({views:A=[],saved:Q=null}={},B=[],C=null){if(!A.length)return null;let J=Q&&A.find((Y)=>Y.id===Q);if(J)return J;let K=C&&A.find((Y)=>Y.id===C);if(K)return K;let E=B.map((Y)=>Y.node).filter(Boolean);if(E.length>=3){let Y=(X)=>X.match&&Object.keys(X.match).length&&E.filter((H)=>l$(X,H)).length/E.length>0.6,L=A.find(Y);if(L)return L}return A[0]}function l$(A,Q){let B=Q.contentType||"",C=(Q.name||"").toLowerCase(),J=C.includes(".")?C.slice(C.lastIndexOf(".")):"";if((A.match.ext||[]).includes(J))return!0;return(A.match.mime||[]).some((K)=>K.endsWith("/*")?B.startsWith(K.slice(0,-1)):B===K)}class JA extends $Q{static deps=[];constructor(A,Q,B){super();this.dep=A,this.cellOf=Q,this.project=B}get deps(){return[this.dep,"appState"]}boot(A,{notify:Q}){let B=this.cellOf(A[this.dep]);if(!B){Q(null);return}let C=A[this.dep],J=()=>this.project?this.project(B.getValue(),C):B.getValue();Q(J()),oK(A,this,B.onDirty(()=>Q(J())))}kill(A){sK(A,this)}}function oK(A,Q,B){A.appState.set(Q,B)}function sK(A,Q){let B=A.appState?.get(Q);if(Array.isArray(B))B.forEach((C)=>C());else B?.();A.appState?.delete(Q)}var LC=new JA("explorer",(A)=>A.observe(),(A)=>({...A,selectedNodes:dB(A),collectionMenu:dC(A,(Q)=>new z("collections.switch",Q),()=>new z("collections.create"))})),iK=new JA("search",(A)=>A.observe()),rK=new JA("transfers",(A)=>A.observe()),J0=new JA("activity",(A)=>A.observe()),XC=new JA("social",(A)=>A.observe()),K0=new JA("offline",(A)=>A.observe(),(A)=>({...A,pinnedIds:new Set((A?.pins||[]).map((Q)=>Q.id))})),KL=(A)=>tK.of(A);class tK extends $Q{static deps=["rotation","appState","engine"];static of=qB(tK);constructor(A){super();this.collectionId=A,this.bootAction=new VB}boot(A,{notify:Q}){let B=A.rotation.observe();Q(B.getValue());let C=B.onDirty(()=>Q(B.getValue())),J=setInterval(()=>{if(A.rotation.get().rotation?.status==="running")A.engine.dispatch(new VB)},2500);oK(A,this,[C,()=>clearInterval(J)])}kill(A){sK(A,this)}}var EL=new JA("apiKeys",(A)=>A.observe(),(A)=>({...A,draftScopes:cC(A)})),E0=new JA("workbench",(A)=>A.observe()),eK=new JA("navigation",(A)=>A.observe()),AE=new JA("overlay",(A)=>A.observe()),YL=new JA("notifications",(A)=>A.observe()),Y0=new JA("settings",(A)=>A.observe()),LL=new JA("settings",(A)=>A.observe(),(A,Q)=>Q.grouped()),XL=new JA("context",(A)=>A.observe()),GL=new JA("viewport",(A)=>A.observe()),HL=new JA("voice",(A)=>A.observe(),(A,Q)=>({...A,canListen:!!Q.canListen?.()})),L0=new JA("plugins",(A)=>A?.observe?.()),X0=new JA("viewState",(A)=>A.observe());class $L extends JA{static of=qB($L);constructor(A){super("contributions",(Q)=>Q.observeType(A));this.type=A}}class tA extends $Q{static deps=[];constructor(A,Q,B){super();this.deps=[...A,"appState"],this.sources=Q,this.project=B}boot(A,{notify:Q}){let B=()=>Q(this.project(A));B(),oK(A,this,this.sources(A).filter(Boolean).map((C)=>C.onDirty(B)))}kill(A){sK(A,this)}}var FQ=["contributions","context","plugins","settings","commands","keybindings"],MQ=(A)=>[A.contributions.observe(),A.context.observe(),A.plugins?.observe?.(),A.settings.observe()],oU=new tA(FQ,MQ,QE);function QE(A){return A.commands.paletteCommands().map((Q)=>({id:Q.id,title:Q.title??Q.id,category:Q.category??null,icon:Q.icon??null,keybinding:A.keybindings.labelFor(Q.id),available:A.commands.isAvailable(Q),enabled:A.commands.isEnabled(Q.id)}))}var c$=[...FQ,"overlay","workbench"],d$=(A)=>[...MQ(A),A.workbench.observe(),A.overlay.observe()],ZL=new tA(c$,d$,(A)=>aK(QE(A),A.overlay.get().palette?.query||"")),DL=new tA(FQ,MQ,(A)=>{return A.contributions.ofType("statusItem").filter((Q)=>Q.visible!==!1&&Q.html).filter((Q)=>!Q.when||A.context.evaluate(Q.when)).filter((Q)=>A.plugins?.isAvailable?.(Q)??!0).sort((Q,B)=>(Q.order??0)-(B.order??0)||String(Q.name).localeCompare(String(B.name))).map((Q)=>({id:Q.id,slot:Q.slot==="left"?"left":"right",html:Q.html,tooltip:Q.tooltip??null,command:Q.command??null}))}),WL=new tA(FQ,MQ,(A)=>{let Q=A.keybindings.resolved(),B=A.keybindings.overrides(),C=new Map;for(let J of Q)C.set(J.key,(C.get(J.key)||0)+1);return Q.map((J)=>({bindingId:J.bindingId,command:J.command,title:A.contributions.get(J.command)?.title??J.command,key:J.key,label:h0(J.key),custom:!!B[J.bindingId],clash:C.get(J.key)>1}))}),BE=(A=!1)=>CE.of(!!A),a$=[...FQ,"explorer","search","workbench","navigation","offline","capabilities"];class CE extends tA{static of=qB(CE);constructor(A){super(a$,(Q)=>[...MQ(Q),Q.explorer.observe(),Q.search.observe(),Q.workbench.observe(),Q.navigation.observe(),Q.offline.observe(),Q.capabilities],(Q)=>{let B=Q.workbench.get(),C=Q.offline.observe().getValue()||{},J={ex:Q.explorer.observe().getValue()||{},se:Q.search.observe().getValue()||{},nav:Q.navigation.observe().getValue()||{},query:B.launch.query||"",commandMatches:aK(QE(Q),(B.launch.query||"").slice(1)),pinnedIds:new Set((C.pins||[]).map((Y)=>Y.id)),keys:qL(Q)},K=QL(J,this.modal),E=nK(J.query);return{groups:K,mode:E,view:JL(ML(Q),K.flatMap((Y)=>Y.items),E==="search"?J.se.resolved?.view??null:null),help:BL({eligible:E!=="command"&&!!J.se.ran&&!J.se.loading&&!J.se.error&&!(J.se.results||[]).length,caps:Q.capabilities.getValue()})}});this.modal=A}}var IL=new tA(["explorer","transfers","activity","offline"],(A)=>[A.explorer.observe(),A.transfers.observe(),A.activity.observe(),A.offline.observe()],(A)=>{let Q=eY({ex:A.explorer.observe().getValue(),tr:A.transfers.observe().getValue(),act:A.activity.observe().getValue(),off:A.offline.observe().getValue()});return{...Q,condition:AL(Q)}}),UL=new tA(FQ,MQ,(A)=>A.contributions.ofType("opener").filter((Q)=>!Q.when||A.context.evaluate(Q.when)).filter((Q)=>A.plugins?.isAvailable?.(Q)??!0).sort((Q,B)=>(B.priority??0)-(Q.priority??0)).map((Q)=>$J(Q,A.plugins))),FL=new tA(FQ,MQ,ML);function ML(A){return{views:A.contributions.ofType("view").filter((Q)=>!Q.when||A.context.evaluate(Q.when)).sort((Q,B)=>(B.priority??0)-(Q.priority??0)).map((Q)=>({id:Q.id,title:Q.title??Q.name??Q.id,icon:Q.icon??null,match:Q.match??null,render:Q.render,move:Q.move})),saved:A.settings.get("explorer.view")||null}}var RL=new tA(FQ,MQ,(A)=>{let Q=A.settings.get(IB)||{};return Object.entries(Q).map(([B,C])=>{let J=A.contributions.get(C);return{typeKey:B,openerId:C,openerTitle:J?.title||C,missing:!J}})}),VL=(A)=>JE.of(A);class JE extends JA{static of=qB(JE);constructor(A){super("social",(Q)=>Q.observe(),(Q)=>Q?.sidecar??null);this.nodeId=A,this.bootAction=new BC(A),this.killAction=new IK(A)}}class zB extends $Q{static deps=["api"];static of=qB(zB);constructor(A,Q,B){super();this.nodeId=A,this.maxBytes=Q,this.size=B}async boot({api:A},{notify:Q}){Q(await A.readTextCapped(this.nodeId,{maxBytes:this.maxBytes,size:this.size}))}kill(){}}var NL=new tA(FQ,MQ,qL);function qL(A){return Object.fromEntries(A.keybindings.resolved().map((Q)=>[Q.command,A.keybindings.labelFor(Q.command)]).filter(([,Q])=>Q))}var GC=new JA("capabilities",(A)=>A);var{svg:n$,h:o$}=w,KE={link:[{d:"M10 13a5 5 0 0 0 7.07 0l3-3A5 5 0 0 0 13 3l-1.5 1.5"},{d:"M14 11a5 5 0 0 0-7.07 0l-3 3A5 5 0 0 0 11 21l1.5-1.5"}],file:[{d:"M6 3h8l5 5v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"},{d:"M14 3v5h5"}],"file-text":[{d:"M6 3h8l5 5v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"},{d:"M14 3v5h5M9 13h6M9 17h6M9 9h2"}],"file-image":[{d:"M6 3h8l5 5v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"},{d:"M14 3v5h5"},{d:"M8.5 15l2-2 3 3 2-1.5"},{d:"M10 12a1 1 0 1 0 0-.01"}],"file-audio":[{d:"M6 3h8l5 5v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"},{d:"M14 3v5h5M10 12v5M13 10v9"}],"file-video":[{d:"M6 3h8l5 5v13a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"},{d:"M14 3v5h5M10 12l4 2.5-4 2.5z"}],book:[{d:"M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2z"},{d:"M4 19a2 2 0 0 1 2-2h13"}],search:[{d:"M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14zM20 20l-3.5-3.5"}],mic:[{d:"M12 3a3 3 0 0 0-3 3v6a3 3 0 0 0 6 0V6a3 3 0 0 0-3-3z"},{d:"M5 11a7 7 0 0 0 14 0M12 18v3M9 21h6"}],command:[{d:"M8 6a2 2 0 1 0-2 2h12a2 2 0 1 0-2-2v12a2 2 0 1 0 2-2H6a2 2 0 1 0 2 2z"}],gear:[{d:"M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6z"},{d:"M19 12a7 7 0 0 0-.1-1.2l2-1.6-2-3.4-2.4 1a7 7 0 0 0-2-1.2L14 2h-4l-.5 2.6a7 7 0 0 0-2 1.2l-2.4-1-2 3.4 2 1.6A7 7 0 0 0 5 12a7 7 0 0 0 .1 1.2l-2 1.6 2 3.4 2.4-1a7 7 0 0 0 2 1.2L10 22h4l.5-2.6a7 7 0 0 0 2-1.2l2.4 1 2-3.4-2-1.6A7 7 0 0 0 19 12z"}],upload:[{d:"M12 16V4M7 9l5-5 5 5M4 20h16"}],download:[{d:"M12 4v12M7 11l5 5 5-5M4 20h16"}],trash:[{d:"M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13M10 11v6M14 11v6"}],refresh:[{d:"M20 11a8 8 0 1 0-.5 4M20 5v6h-6"}],"chevron-right":[{d:"M9 6l6 6-6 6"}],"chevron-left":[{d:"M15 6l-6 6 6 6"}],"chevron-down":[{d:"M6 9l6 6 6-6"}],close:[{d:"M6 6l12 12M18 6L6 18"}],tag:[{d:"M4 4h6.5a1 1 0 0 1 .7.3l8.5 8.5a1 1 0 0 1 0 1.4l-5.5 5.5a1 1 0 0 1-1.4 0L4.3 11.2a1 1 0 0 1-.3-.7V4z"},{d:"M8 8a0.6 0.6 0 1 0 0-.01"}],play:[{d:"M8 5v14l11-7z",fill:"currentColor",stroke:"none"}],pause:[{d:"M8 5h3v14H8zM13 5h3v14h-3z",fill:"currentColor",stroke:"none"}],"skip-back":[{d:"M11 6v12L3 12zM13 6l8 6-8 6zM21 6v12",fill:"none"}],"skip-forward":[{d:"M13 6v12l8-6zM3 6l8 6-8 6zM3 6v12"}],"back-30":[{d:"M11 8a7 7 0 1 0 7 7"},{d:"M11 4l-3 4 4 1"}],"fwd-30":[{d:"M13 8a7 7 0 1 1-7 7"},{d:"M13 4l3 4-4 1"}],plug:[{d:"M9 3v6M15 3v6M6 9h12v3a6 6 0 0 1-12 0zM12 18v3"}],bell:[{d:"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9z"},{d:"M13.73 21a2 2 0 0 1-3.46 0"}],files:[{d:"M4 4h9l3 3v3M8 8h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2z"}],dots:[{d:"M5 12h.01M12 12h.01M19 12h.01"}],check:[{d:"M5 12l5 5L20 6"}],plus:[{d:"M12 5v14M5 12h14"}],"arrow-up":[{d:"M12 19V5M6 11l6-6 6 6"}],star:[{d:"M12 3l2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1L3.2 9.5l6.1-.9z"}],info:[{d:"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zM12 11v5M12 8h.01"}],warn:[{d:"M12 3l9 16H3zM12 10v4M12 17h.01"}],x:[{d:"M6 6l12 12M18 6L6 18"}],list:[{d:"M8 6h12M8 12h12M8 18h12M4 6h.01M4 12h.01M4 18h.01"}],grid:[{d:"M4 4h7v7H4zM13 4h7v7h-7zM4 13h7v7H4zM13 13h7v7h-7z"}]};function U(A,{size:Q=18,strokeWidth:B=1.6,className:C}={}){let J=Object.hasOwn(KE,A)?KE[A]:KE.file;return n$({$attrs:{viewBox:"0 0 24 24",width:Q,height:Q,fill:"none",stroke:"currentColor","stroke-width":B,"stroke-linecap":"round","stroke-linejoin":"round",...C?{class:C}:{}}},...J.map((K)=>o$("path",{$attrs:s$(K)})))}function s$(A){let Q={d:A.d};if(A.fill)Q.fill=A.fill;if(A.stroke)Q.stroke=A.stroke;return Q}function KA(A){if(A==null||Number.isNaN(A))return"—";let Q=["B","KB","MB","GB","TB"],B=0,C=A;while(C>=1024&&B<Q.length-1)C/=1024,B++;return`${C>=100||B===0?Math.round(C):C.toFixed(1)} ${Q[B]}`}function EE(A){if(!A)return"";let Q=Date.now()-A,B=86400000;if(Q<60000)return"just now";if(Q<3600000)return`${Math.floor(Q/60000)}m ago`;if(Q<B)return`${Math.floor(Q/3600000)}h ago`;if(Q<7*B)return`${Math.floor(Q/B)}d ago`;return new Date(A).toLocaleDateString(void 0,{month:"short",day:"numeric",year:Q>330*B?"numeric":void 0})}var i$=/@\[([^\]]+)\]\(([^)]+)\)|(?:^|\s)@([a-zA-Z0-9._@-]{2,})/g;function PL(A){let Q=A||"",B=[],C=new RegExp(i$.source,"g"),J=0,K;while(K=C.exec(Q)){let E=!!K[3],Y=K.index+(E&&K[0].startsWith(" ")?1:0);if(Y>J)B.push({type:"text",value:Q.slice(J,Y)});B.push({type:"mention",name:K[1]||K[3],id:K[2]||null}),J=C.lastIndex}if(J<Q.length)B.push({type:"text",value:Q.slice(J)});return B}var{div:h,span:HA,button:SA,textarea:r$,input:t$,p:L3}=w,e$=["\uD83D\uDC4D","❤️","\uD83C\uDF89","\uD83D\uDC40","\uD83D\uDE80"];function OL(A){let Q=A.so.me;if(!Q||Q.anonymous)return null;let B=(Q.name||Q.id||"?")[0].toUpperCase();return h({className:"principal",title:Q.email||Q.name||Q.id},Q.picture?w.img({src:Q.picture,alt:"",className:"avatar-img"}):HA({className:"avatar-txt"},B))}function jL(A,Q){let B=A.so.notifications;return h({className:"bell-wrap"},SA({className:"iconbtn bell",title:"Notifications"},U("bell",{size:19}),B.unread?HA({className:"bell-badge"},String(B.unread>9?"9+":B.unread)):null).on({click:()=>Q.engine.dispatch(new UQ)}),A.so.inboxOpen?AZ(A,Q):null)}function AZ(A,Q){let B=A.so.notifications.items;return h({},h({className:"scrim",$styling:{background:"transparent","z-index":"54"}}).on({click:()=>Q.engine.dispatch(new UQ(!1))}),h({className:"inbox"},h({className:"inbox-head"},HA("Notifications"),A.so.pushSupported&&!A.so.pushEnabled?SA({className:"link"},"Enable push").on({click:()=>Q.engine.dispatch(new QC)}):A.so.pushEnabled?HA({className:"muted"},U("check",{size:13})):null),B.length?h({className:"inbox-items"},...B.slice(0,30).map((C)=>QZ(C,Q))):h({className:"inbox-empty"},U("info",{size:24}),HA("You’re all caught up."))))}function QZ(A,Q){let B=A.items?.[0];return h({className:`inbox-item ${A.read?"":"unread"}`},h({className:"ii-title"},A.title),B?.excerpt?h({className:"ii-excerpt"},"“"+B.excerpt+"”"):null,h({className:"ii-time"},EE(A.createdAt))).on({click:()=>{if(B?.nodeId)Q.engine.dispatch(new aJ(B.nodeId));Q.engine.dispatch(new UQ(!1))}})}function _L(A,Q){let B=A.nav,C=B.activeFile?{id:B.activeTabId,node:B.activeFile}:null;return h({className:"infopanel"},h({className:"ip-head"},U("info",{size:15}),HA("Details"),SA({className:"iconbtn",title:"Close"},U("close",{size:14})).on({click:()=>Q.engine.dispatch(new rB(!1))})),!C?h({className:"ip-empty"},HA("Open a file to see its tags and conversation.")):Q.watch(i(Q.engine,VL(C.node.id)),(J)=>h({className:"ip-body"},BZ(C.node,A,Q),CZ(C.node,A,Q),KZ(J,Q),EZ(A,J,Q))))}function BZ(A,Q,B){let C=Q.off?.pinnedIds?.has(A.id)??!1;return h({className:"ip-file"},h({className:"ip-name"},A.name),h({className:"ip-path"},A.contentType||""),SA({className:`btn small ${C?"on":""}`,$styling:{"margin-top":"10px"}},U(C?"check":"download",{size:14}),C?"Available offline":"Make available offline").on({click:()=>C?B.engine.dispatch(new z("offline.unpin",A)):B.engine.dispatch(new z("offline.pin",A))}))}function CZ(A,Q,B){let C=Q.so.backlinks,J=A.collectionId?cB(A):null,K=C&&C.nodeId===A.id?C:null;return h({className:"ip-section"},h({className:"ip-label"},"Links"),J?SA({className:"ip-uri",title:"Copy this item’s link"},U("link",{size:12}),HA(J)).on({click:()=>JZ(B,J)}):null,h({className:"ip-label",$styling:{"margin-top":"10px"}},"Linked from"),K?.loading?h({className:"ip-muted"},"Loading…"):K?.error?h({className:"ip-muted error"},`Couldn’t load links: ${K.error}`):K?.items?.length?h({className:"ip-backlinks"},...K.items.map((E)=>SA({className:"ip-backlink",title:E.name},U("file-text",{size:12}),HA(E.name)).on({click:()=>B.engine.dispatch(new pA(E))}))):h({className:"ip-muted"},"Nothing links here yet."))}function JZ(A,Q){A.engine.dispatch(new rA(Q,`Copied ${Q}`))}function KZ(A,Q){let B=A?.tags||[];return h({className:"ip-section"},h({className:"ip-label"},"Tags"),h({className:"tags"},...B.map((C)=>HA({className:"tag"},C.value?`${C.name}: ${C.value}`:C.name,SA({className:"tag-x"},U("close",{size:11})).on({click:()=>Q.engine.dispatch(new vJ(C.name))}))),t$({className:"tag-input",placeholder:"+ tag",value:""}).on({keydown:(C)=>{if(C.key==="Enter"&&C.target.value.trim()){let J=C.target.value.trim(),[K,...E]=J.split(":");Q.engine.dispatch(new bJ(K.trim(),E.join(":").trim()||void 0)),C.target.value=""}}})))}function EZ(A,Q,B){if(Q?.loading)return h({className:"ip-section"},h({className:"spinner"}));let C=Q?.comments||[],J=Q?.error?h({className:"conv-empty"},HA(`Couldn't load the conversation: ${Q.error}`),SA({className:"btn",$styling:{"margin-top":"8px"}},"Retry").on({click:()=>B.engine.dispatch(new BC(Q.nodeId))})):C.length?h({className:"thread"},...C.map((K)=>SL(K,A,B,0))):h({className:"conv-empty"},"No comments yet. Start the discussion — use @ to mention someone.");return h({className:"ip-section conv"},h({className:"ip-label"},`Conversation${Q?.commentCount?` · ${Q.commentCount}`:""}`),J,Q?.error?null:YZ(A,B))}function SL(A,Q,B,C){let J=Q.so.me,K=J&&A.author?.id===J.id;return h({className:"comment",$styling:C?{marginLeft:"18px"}:{}},h({className:"c-head"},HA({className:"c-avatar"},(A.author?.name||"?")[0].toUpperCase()),HA({className:"c-author"},A.author?.name||A.author?.id||"Someone"),HA({className:"c-time"},EE(A.createdAt),A.edited?" · edited":"")),A.deleted?h({className:"c-body deleted"},"comment deleted"):h({className:"c-body"},LZ(A.body)),!A.deleted?h({className:"c-actions"},...e$.map((E)=>{let Y=A.reactions?.[E]||[];return SA({className:`react ${Y.includes(J?.id)?"on":""}`},E,Y.length?HA({className:"rc"},String(Y.length)):null).on({click:()=>B.engine.dispatch(new hJ(A.id,E))})}),SA({className:"c-link"},"Reply").on({click:()=>B.engine.dispatch(new iC({id:A.id,author:A.author}))}),K?SA({className:"c-link danger"},"Delete").on({click:()=>B.engine.dispatch(new yJ(A.id))}):null):null,(A.replies||[]).length?h({className:"replies"},...A.replies.map((E)=>SL(E,Q,B,C+1))):null).key(A.id)}function YZ(A,Q){let B=A.so.me,C=A.so.replyTo;if(!B){if(!A.off?.online)return h({className:"conv-signin"},"You’re offline. Conversations come back when you reconnect.");return h({className:"conv-signin"},HA("You’re signed out, so you can read this conversation but not add to it."),SA({className:"c-link"},"Reload to sign in").on({click:()=>window.location.reload()}))}return h({className:"composer"},C?h({className:"replying"},`Replying to ${C.author?.name||"comment"}`,SA({className:"c-link"},"cancel").on({click:()=>Q.engine.dispatch(new iC(null))})):null,r$({className:"composer-input",placeholder:"Write a comment… @mention someone",rows:2,value:""}).on({keydown:(J)=>{if(J.key==="Enter"&&(J.metaKey||J.ctrlKey))Q.engine.dispatch(new sC(J.target.value)),J.target.value=""}}),h({className:"composer-actions"},HA({className:"muted"},"⌘/Ctrl + Enter"),SA({className:"btn primary",disabled:A.so.posting},"Comment").on({click:(J)=>{let K=J.target.closest(".composer").querySelector(".composer-input");Q.engine.dispatch(new sC(K.value)),K.value=""}})))}function LZ(A){return PL(A).map((Q)=>Q.type==="mention"?HA({className:"mention"},`@${Q.name}`):Q.value)}var{div:TL,button:YE,span:XZ,img:GZ}=w,HZ=[{id:"home",icon:"search",title:"Search & files",command:"workbench.view.home"},{id:"plugins",icon:"plug",title:"Plugins",command:"workbench.view.plugins"},{id:"admin",icon:"book",title:"Administration",command:"workbench.view.admin"}];function LE(A,Q){let B=A.wb.activity,C=A.plugins?.filter((J)=>J.status==="active").length||0;return TL({className:"activitybar"},YE({className:"brand-mark",title:"Trove — home"},GZ({src:"/icon.svg",alt:"Trove"})).on({click:()=>Q.engine.dispatch(new z("workbench.view.home"))}),...HZ.map((J)=>YE({className:`item ${B===J.id?"active":""}`,title:J.title},U(J.icon,{size:22}),J.id==="plugins"&&C?XZ({className:"badge"},String(C)):null).on({click:()=>Q.engine.dispatch(new z(J.command))})),TL({className:"spacer"}),jL(A,Q),YE({className:`item ${B==="settings"?"active":""}`,title:"Settings"},U("gear",{size:21})).on({click:()=>Q.engine.dispatch(new z("workbench.openSettings"))}),OL(A))}var $Z=new Set(["SPAN","B","STRONG","I","EM","CODE","SMALL","BR","S","U"]),ZZ=new Set(["class","title"]);function wL(A){let Q=document.createDocumentFragment();if(typeof A!=="string"||!A)return Q;let B=document.createElement("template");B.innerHTML=A.slice(0,4096);let C={nodes:200};for(let J of B.content.childNodes){let K=yL(J,C);if(K)Q.appendChild(K)}return Q}function xL(A){return(wL(A).textContent||"").trim()}function kL(A,Q){return[...wL(A).childNodes].map((B)=>gL(B,Q)).filter((B)=>B!=null)}function gL(A,Q){if(A.nodeType===Node.TEXT_NODE)return A.nodeValue;let B=Q[A.tagName.toLowerCase()];if(!B)return A.textContent;let C={};if(A.className)C.className=A.className;if(A.title)C.title=A.title;return B(C,...[...A.childNodes].map((J)=>gL(J,Q)).filter((J)=>J!=null))}function yL(A,Q){if(Q.nodes--<=0)return null;if(A.nodeType===Node.TEXT_NODE)return document.createTextNode(A.nodeValue);if(A.nodeType!==Node.ELEMENT_NODE)return null;if(!$Z.has(A.tagName))return null;let B=document.createElement(A.tagName.toLowerCase());for(let C of A.attributes){let J=C.name.toLowerCase();if(!ZZ.has(J))continue;B.setAttribute(J,C.value.slice(0,200))}for(let C of A.childNodes){let J=yL(C,Q);if(J)B.appendChild(J)}return B}var{div:rQ,button:tQ,span:$A}=w;function hL(A,Q){let B=kL(A.html,w);if(!B.length)return null;let C=A.tooltip?xL(A.tooltip):"";return A.command?tQ({className:"seg",title:C},...B).on({click:()=>Q.engine.dispatch(new z(A.command))}):$A({className:"seg",title:C},...B)}function DZ(A,Q){let B=A.act||{tasks:[],issues:[]},C=B.tasks.filter((E)=>E.status==="running"),J=()=>Q.engine.dispatch(new cA(!0)),K=[];if(C.length){let E=C[0],L=E.total!=null&&E.total>0?Math.round((E.done||0)/E.total*100):null;K.push(tQ({className:"seg sb-activity",title:C.map((X)=>X.title).join(`
348
+ `)},rQ({className:"spinner",$styling:{width:"11px",height:"11px"}}),$A(C.length>1?`${C.length} running`:`${E.title}${L==null?"":` ${L}%`}`)).on({click:J}))}if(B.issues.length)K.push(tQ({className:"seg sb-attention",title:B.issues.map((E)=>E.title).join(`
349
+ `)},U("info",{size:12}),$A(`${B.issues.length} need${B.issues.length===1?"s":""} attention`)).on({click:J}));return K}function XE({usage:A,usageLevel:Q=""}){if(!A?.total)return null;let B=Math.min(100,Math.round(A.used/A.total*100));return $A({className:`seg sb-usage ${Q}`,title:`${KA(A.used)} used of ${KA(A.total)} — ${KA(A.available)} free on this volume`},rQ({className:"usage-bar"},rQ({className:"usage-fill",$styling:{width:`${B}%`}})),$A(`${KA(A.available)} free`))}function GE(A,Q){let B=A.ex,C=B.items||[],J=A.facts,{totalItems:K,totalBytes:E}=J,Y=A.caps,L=J.uploading,X=A.statusItems||[],H=X.filter((M)=>M.slot==="left").map((M)=>hL(M,Q)),G=X.filter((M)=>M.slot!=="left").map((M)=>hL(M,Q)),Z=J.off;return rQ({className:"statusbar"},!Z.online?$A({className:"seg offline-badge",title:"You are offline — pinned files and cached data are available"},U("info",{size:12}),$A("Offline")):Z.syncing?$A({className:"seg",title:"Syncing offline changes"},rQ({className:"spinner",$styling:{width:"11px",height:"11px"}}),$A("Syncing…")):null,Z.queued?$A({className:"seg",title:"Changes waiting to sync"},`${Z.queued} queued`):null,Z.pins.length?tQ({className:"seg",title:`${Z.pins.length} file(s) available offline`},U("download",{size:12}),$A(`${Z.pins.length} offline`),U("chevron-down",{size:11})).on({click:(M)=>{let I=Z.pins.slice(0,12).flatMap((V)=>[{label:V.name,icon:"file-text",actions:[new z("explorer.open",V)]},{label:`Remove “${V.name}” from offline`,icon:"close",actions:[new z("offline.unpin",V)]},{sep:!0}]);if(Z.pins.length>12)I.push({label:`…and ${Z.pins.length-12} more`,actions:[]});let F=M.currentTarget.getBoundingClientRect();Q.engine.dispatch(new kQ(F.left,F.top-8-I.length*34,I))}}):null,tQ({className:"seg",title:"Switch collection"},U("files",{size:13}),$A(J.collectionLabel),(B.collections||[]).length>1||B.canCreateCollection?U("chevron-down",{size:11}):null).on({click:(M)=>{let I=B.collectionMenu||[];if(I.length>1||B.canCreateCollection){let F=M.currentTarget.getBoundingClientRect();Q.engine.dispatch(new kQ(F.left,F.top-8-I.length*34,I))}else Q.engine.dispatch(new z("workbench.view.home"))}}),L.length?tQ({className:"seg",title:"Active uploads — click to cancel"},rQ({className:"spinner",$styling:{width:"11px",height:"11px"}}),$A(`${L.length} uploading`)).on({click:(M)=>Q.engine.dispatch(new kQ(M.clientX,M.clientY,L.map((I)=>({label:`Cancel ${I.name} (${Math.round((I.ratio||0)*100)}%)`,icon:"close",danger:!0,actions:[new AC(I.id)]}))))}):$A({className:"seg",title:B.nextCursor?`Showing ${C.length} of ${J.totalKnown?K:"more"}`:""},`${K.toLocaleString()}${J.totalKnown||!J.partial?"":"+"} item${K===1?"":"s"}`),...H,rQ({className:"spacer"}),...DZ(A,Q),...G,$A({className:"seg",title:J.totalKnown||!J.partial?"Total size of this collection":`Size of the ${J.shown.toLocaleString()} items loaded so far — this server doesn’t report a collection total`},`${KA(E)}${J.totalKnown||!J.partial?"":"+"}`),XE(J),Y?$A({className:"seg",title:"Storage backend capabilities"},U(Y.storage?.presignDownload?"download":"files",{size:12}),$A(Y.storage?.presignDownload?"S3 direct":"proxied")):null,Y?.features?.semanticSearch?tQ({className:"seg",title:"Semantic search enabled"},U("star",{size:12}),$A("semantic")).on({click:()=>Q.engine.dispatch(new z("workbench.view.home"))}):null)}function aA(A,Q){for(let B of Q?.actions||[])A.engine.dispatch(B)}var{div:HE,span:bL,button:vL}=w;function G0(A,Q){let B=A.controls||[];return HE({className:"launch-h"},HE({className:"lh-title"},bL(A.title),A.verbatim?bL({className:"lh-verbatim"},A.verbatim):null),B.length?HE({className:"lh-actions"},...B.map((C)=>vL({className:"launch-up",title:C.title||C.label},C.icon?U(C.icon,{size:13}):null,C.label).on({click:()=>aA(Q,C)}))):null)}function H0(A,Q,B){if(!A.menu)return null;return vL({className:"launch-more",title:`Actions for ${A.title}`,$attrs:{"aria-label":`Actions for ${A.title}`}},U("dots",{size:14})).on({click:(C)=>{C.stopPropagation(),eQ(C.currentTarget,A,Q,null,B)}})}function eQ(A,Q,B,C,J){let K=A?.getBoundingClientRect?.(),E=C?.clientX??(K?K.right-8:0),Y=C?.clientY??(K?K.bottom:0),L=Q.menu();J?.(),B.engine.dispatch(new kQ(E,Y,L))}var{div:HC,span:$E}=w;function $0({groups:A,index:Q,handlers:B,ui:C}){let J=-1;return HC({className:"launch-view view-list"},...A.map((K)=>HC({className:"launch-group"},G0(K,C),K.items.length?HC({className:"launch-list"},...K.items.map((E)=>{let Y=++J;return WZ(E,Y===Q,{hover:()=>B.hover(Y),select:()=>B.select(Y)},C)})):HC({className:"launch-empty"},K.empty||"Nothing here."))))}function WZ(A,Q,{hover:B,select:C},J){return HC({className:`launch-item ${Q?"active":""}`},U(A.icon,{size:15}),$E({className:"name"},A.title),A.detail?$E({className:"launch-detail"},A.detail):null,A.badge?$E({className:"launch-kind"},A.badge):null,H0(A,J,C)).on({click:()=>aA(J,A),mouseenter:B,...A.menu?{contextmenu:(K)=>{K.preventDefault(),eQ(K.currentTarget,A,J,K,C)}}:{}})}function PB(A,Q,B,{op:C="media",onError:J}={}){let K=B.platform.mediaUrls,E=null,Y=!1,L=!1,X=()=>{clearTimeout(E),E=null},H=(I)=>{if(X(),!Number.isFinite(I))return;let F=Math.max(1000,(I-Date.now())*0.8);E=setTimeout(()=>G({resume:!0}),Math.min(F,2147483647))};async function G({resume:I}){if(Y)return;let F=IZ(A),V=F&&I?A.currentTime:0,g=F&&I?!A.paused&&!A.ended:!1,u;try{u=await K.url(Q.id,{op:C})}catch(j){if(!Y)J?.(j.message);return}if(Y)return;if(A.src=u.url,F){if(A.load(),V>0||g){let j=()=>{if(A.removeEventListener("loadedmetadata",j),V>0&&Number.isFinite(A.duration)&&A.duration>V)A.currentTime=V;if(g)A.play().catch(()=>{})};A.addEventListener("loadedmetadata",j)}}H(u.expiresAt)}let Z=()=>{L=!1};A.addEventListener("load",Z),A.addEventListener("loadeddata",Z);let M=()=>{if(Y)return;if(L){J?.(null);return}L=!0,K.invalidate(Q.id,C),G({resume:!0})};return A.addEventListener("error",M),G({resume:!1}),()=>{Y=!0,X(),A.removeEventListener("error",M),A.removeEventListener("load",Z),A.removeEventListener("loadeddata",Z)}}function IZ(A){return typeof A?.play==="function"&&typeof A?.load==="function"}var{div:AB,span:UZ,img:FZ}=w;function fL({groups:A,index:Q,handlers:B,ui:C}){let J=-1;return AB({className:"launch-view view-grid"},...A.map((K)=>AB({className:"launch-group"},G0(K,C),K.items.length?AB({className:"grid-list"},...K.items.map((E)=>{let Y=++J;return RZ(E,Y===Q,{hover:()=>B.hover(Y),select:()=>B.select(Y)},C)})):AB({className:"launch-empty"},K.empty||"Nothing here."))))}function uL({key:A,textual:Q}){if(A==="ArrowLeft")return Q?null:-1;if(A==="ArrowRight")return Q?null:1;let B=MZ();if(A==="ArrowUp")return-B;if(A==="ArrowDown")return B;return null}function MZ(){let A=document.querySelectorAll(".grid-list .grid-tile");if(A.length<2)return 1;let Q=A[0].offsetTop,B=0;for(let C of A){if(C.offsetTop!==Q)break;B++}return B||1}function RZ(A,Q,{hover:B,select:C},J){let K=A.node,E=(K?.contentType||"").startsWith("image/");return AB({className:`grid-tile ${Q?"active":""}`,title:A.detail?`${A.title} — ${A.detail}`:A.title},AB({className:"gt-media"},U(K?ZQ(K):A.icon,{size:26}),E?FZ({className:"gt-img",alt:"",loading:"lazy",decoding:"async"}).on({$attach:(Y)=>{Y._detachMedia=PB(Y,K,J,{onError:()=>{Y.style.display="none"}})},$detach:(Y)=>{Y._detachMedia?.(),Y._detachMedia=null}}).opaque():null,A.badge?UZ({className:"gt-badge"},A.badge):null,H0(A,J,C)),AB({className:"gt-name"},A.title)).on({click:()=>aA(J,A),mouseenter:B,...A.menu?{contextmenu:(Y)=>{Y.preventDefault(),eQ(Y.currentTarget,A,J,Y,C)}}:{}})}var{div:ZE,button:VZ,span:NZ}=w,qZ={"core.view.list":{title:"List",icon:"list",priority:50,render:$0},"core.view.grid":{title:"Grid",icon:"grid",priority:40,match:{mime:["image/*","video/*"]},render:fL,move:uL}};function mL(A){for(let[Q,B]of Object.entries(qZ))A.contributions.register(Q,{type:"view",...B})}function pL(A,Q,B){let C=A?.views||[];if(C.length<2)return null;return ZE({className:"view-switch"},...C.map((J)=>VZ({className:`vs-btn ${J.id===Q?.id?"on":""}`,title:`${J.title} view`,"aria-pressed":J.id===Q?.id?"true":"false"},U(J.icon||"list",{size:14})).on({click:()=>B.engine.dispatch(new gQ(CL,J.id))})))}function lL(A,Q,B){try{let C=A?.move?.({key:Q,...B});return Number.isFinite(C)&&C!==0?C:null}catch{return null}}function cL(A,Q){try{if(typeof A?.render==="function")return A.render(Q)}catch(B){return console.error(`view "${A?.id}" failed`,B),ZE({},ZE({className:"view-error"},U("warn",{size:13}),NZ(`The “${A?.title||A?.id}” view could not be drawn — showing the list instead.`)),$0(Q))}return $0(Q)}var{div:hQ,span:OB,input:zZ,button:DE}=w,PZ=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]);function OZ(A,{compact:Q=!1,modal:B=!1}={}){let C=A?.searchPrompt,J=(Q?C?.short||C?.placeholder:C?.placeholder)||(Q?"Search files":"Search files · # filter by tag");return Q||B?J:`${J} · ! run a command`}var Z0=null;function jZ(A,Q){clearTimeout(Z0),Z0=setTimeout(()=>A.engine.dispatch(new DQ(Q)),240)}function dL(A){A.engine.dispatch(new sQ("")),A.engine.dispatch(new DQ(""))}function _Z(A,Q,B){clearTimeout(Z0),Z0=setTimeout(()=>A.engine.dispatch(new UB(Q,B)),200)}function D0(A,Q,B={}){let C=!!B.modal,J=A.wb.launch.query,K=C?A.modalContent:A.content,{groups:E,mode:Y,view:L}=K,X=E.flatMap((j)=>j.items),H=X.length?Math.min(A.wb.launch.index,X.length-1):0,G=(j)=>{let T=j.target.value;if(Q.engine.dispatch(new sQ(T)),T.startsWith("!"))return;let{text:c,filters:y}=pB(T);if(y.length)_Z(Q,y,c);else jZ(Q,c)},Z=(j)=>Q.engine.dispatch(new OJ(j)),M=(j)=>Q.engine.dispatch(new pJ(j,X[j]?.node)),I=(j)=>Q.engine.dispatch(new mJ(j,X.map((T)=>T.node))),F=(j)=>{let T=PZ.has(j.key)?lL(L,j.key,{index:H,count:X.length,textual:J.length>0}):null;if(T!==null)j.preventDefault(),I(T);else if(j.key==="ArrowDown")j.preventDefault(),I(1);else if(j.key==="ArrowUp")j.preventDefault(),I(-1);else if(j.key==="Enter")j.preventDefault(),aA(Q,X[H]);else if(j.key==="Escape"&&J)j.preventDefault(),dL(Q);else if(j.key==="ContextMenu"||j.shiftKey&&j.key==="F10"){let c=X[H];if(c?.menu)j.preventDefault(),eQ(document.querySelector(".launch-item.active, .grid-tile.active"),c,Q)}},V=Y==="search"?A.se.resolved:null,g=V&&(V.source==="llm"||V.tagFilters&&V.tagFilters.length||(V.semanticText||"").trim()!==J.trim()),u=hQ({className:"launcher"},hQ({className:"launch-box"},U(Y==="command"?"command":Y==="filter"?"tag":"search",{size:18}),zZ({className:"launch-input",value:J,autofocus:!0,spellcheck:!1,placeholder:OZ(A.caps,{compact:A.vp?.mode==="phone",modal:C})}).on({input:G,keydown:F}),J?DE({className:"launch-clear",title:"Clear"},U("close",{size:14})).on({click:()=>dL(Q)}):null,A.voice?.canListen?DE({className:`launch-mic ${A.voice?.listening?"on":""}`,title:A.voice?.listening?"Stop listening":"Search by voice","aria-pressed":A.voice?.listening?"true":"false"},U("mic",{size:15})).on({click:()=>Q.engine.dispatch(new z("search.voice"))}):null,C?null:pL(A.views,L,Q)),g?SZ(V):null,hQ({className:"launch-body"},cL(L,{groups:E,index:H,handlers:{hover:Z,select:M},state:A,ui:Q}),TZ(K.help,Q)));return C?u:hQ({className:"editor"},u)}function SZ(A){return hQ({className:"launch-resolved"},OB({className:"rq-label"},A.source==="llm"?"Interpreted as":"Searching"),(A.semanticText||"").trim()?OB({className:"rq-text"},`“${A.semanticText.trim()}”`):null,...(A.tagFilters||[]).map((Q)=>OB({className:"rq-chip"},U("tag",{size:11}),pC(Q))))}function TZ(A,Q){if(!A)return null;return hQ({className:"launch-help"},A.hint?hQ({className:"lh-hint"},U("info",{size:13}),OB(A.hint)):null,A.examples.length?hQ({className:"lh-examples"},...A.examples.map((B)=>DE({className:"lh-example",title:B.label||"Try this search"},OB({className:"lh-q"},B.query),B.label?OB({className:"lh-label"},B.label):null).on({click:()=>aA(Q,B)}))):null)}var{div:R,h2:wZ,h3:QB,p:RQ,span:EA,select:xZ,option:kZ,input:jB,label:sL,button:yA,ul:L9,li:X9,code:gZ}=w;function WE(A,Q){let B=A.settingsGroups||new Map;return R({className:"editor"},R({className:"stage"},R({className:"settings"},wZ("Settings"),RQ({className:"sub"},"Preferences are stored in this browser. Plugins contribute their own settings here too."),...B.map((C)=>yZ(C,Q)),vZ(Q,A.caps),aZ(A,Q),uZ(A,Q),iZ(A.assoc,Q),rZ(Q))))}function yZ(A,Q){return R({className:"group"},QB(A.category),...A.items.map((B)=>hZ(B,Q)))}function hZ(A,Q){return R({className:"setting"},R({className:"info"},R({className:"t"},A.title||A.key),A.description?R({className:"d"},A.description):null),R({className:"control"},bZ(A,Q)))}function bZ(A,Q){let B=(C)=>Q.engine.dispatch(new gQ(A.key,C));if(A.type==="boolean")return sL({className:"switch"},jB({type:"checkbox",checked:!!A.value}).on({change:(C)=>B(C.target.checked)}),EA({className:"track"}));if(A.type==="enum")return xZ({className:"input"},...A.enum.map((C,J)=>kZ({value:C,selected:A.value===C},A.enumLabels&&A.enumLabels[J]||C))).on({change:(C)=>B(C.target.value)});if(A.type==="number"){let C=(J)=>{let K=Number(J.target.value);if(J.target.value===""||Number.isNaN(K)){J.target.value=A.value;return}if(A.minimum!=null)K=Math.max(A.minimum,K);if(A.maximum!=null)K=Math.min(A.maximum,K);J.target.value=K,B(K)};return jB({className:"input",type:"number",value:A.value,$attrs:{min:A.minimum??"",max:A.maximum??""}}).on({change:C})}return jB({className:"input",value:A.value??""}).on({change:(C)=>B(C.target.value)})}function vZ(A,Q){if(!Q)return null;let B=Q.mcp,C=Q.auth||{authorizationServers:[],source:"none"};if(!B?.enabled)return R({className:"group"},QB("AI agents (MCP)"),RQ({className:"sub"},"MCP is switched off on this server. Set TROVE_MCP=on to enable it."));let J=(Y)=>()=>A.engine.dispatch(new rA(Y)),K=C.authorizationServers||[],E=C.source==="jwt-issuer"?"from TROVE_JWT_ISSUER":C.source==="configured"?"from TROVE_AUTH_SERVER":null;return R({className:"group"},QB("AI agents (MCP)"),RQ({className:"sub"},"Point an AI assistant at this drive. It signs in as you and sees exactly the collections you can see."),R({className:"setting"},R({className:"info"},R({className:"t"},"Server URL"),R({className:"d"},"Paste this into your assistant’s MCP settings.")),R({className:"control mcp-url"},EA({className:"mono"},B.endpoint),yA({className:"btn small",title:"Copy"},U("link",{size:13})).on({click:J(B.endpoint)}))),R({className:"setting"},R({className:"info"},R({className:"t"},"Sign-in required"),R({className:"d"},B.requiresAuth?"Agents must present a token, the same one this browser uses.":"This drive is open, so agents connect without a token — exactly like the web app does.")),R({className:"control"},EA({className:"mono"},B.requiresAuth?"Yes":"No"))),B.needsAuthorizationServer?R({className:"mcp-warn"},U("warn",{size:15}),EA("This drive requires a token but no authorization server is set, so an agent has nowhere to sign in. Set TROVE_AUTH_SERVER (or TROVE_JWT_ISSUER) to the issuer URL of your identity provider and restart.")):null,R({className:"setting"},R({className:"info"},R({className:"t"},"Authorization server"),R({className:"d"},"Where clients are sent to sign in — for the whole drive, not just for agents. "+"Set with TROVE_AUTH_SERVER; defaults to TROVE_JWT_ISSUER when that is set.")),R({className:"control"},K.length?EA({className:"mono"},K.join(", ")+(E?` (${E})`:"")):EA({className:"mono muted"},"not set"))),R({className:"setting"},R({className:"info"},R({className:"t"},"Discovery document"),R({className:"d"},"What a client reads to find out how to authenticate (RFC 9728).")),R({className:"control mcp-url"},EA({className:"mono small"},C.metadataUrl))))}var fZ=[{id:"read",label:"Read",hint:"list and download"},{id:"write",label:"Write",hint:"upload and rename"},{id:"delete",label:"Delete",hint:"trash and purge"},{id:"admin",label:"Admin",hint:"includes all of the above"}],iL="*",aL=!1;function uZ(A,Q){let B=A.keys||{};if(!aL&&!B.loaded&&!B.loading)aL=!0,Q.engine.dispatch(new z("keys.load"));if(B.error&&!B.keys?.length)return null;if(!B.loaded)return null;let C=A.ex?.collections||[];return R({className:"group"},QB("API keys"),RQ({className:"sub"},"Give a script or a service access without giving it an account. A key carries capabilities and no identity, so anything it does is attributed to the key rather "+"than to a person — and it can only reach the collections you scope it to."),B.minted?mZ(B.minted,Q):null,B.draft?pZ(B,C,Q):null,!B.draft&&!B.minted?R({className:"keys-actions"},yA({className:"btn"},U("plus",{size:14}),"New key").on({click:()=>Q.engine.dispatch(new z("keys.new"))})):null,B.keys?.length?R({className:"keys-list"},...B.keys.map((J)=>lZ(J,B,C,Q))):R({className:"keys-empty"},"No keys yet."))}function mZ(A,Q){let B=()=>Q.engine.dispatch(new rA(A.secret,"Key copied"));return R({className:"key-minted"},R({className:"key-minted-head"},U("warn",{size:15}),EA(`“${A.key.name}” is ready — copy it now.`)),RQ({className:"key-minted-note"},"This is the only time it can be shown. It is stored as a hash, so it cannot be "+"recovered — if it is lost, revoke the key and make another."),R({className:"key-secret"},gZ({className:"mono"},A.secret),yA({className:"btn small",title:"Copy"},U("link",{size:13})).on({click:B})),R({className:"keys-actions"},yA({className:"btn"},"Done").on({click:()=>Q.engine.dispatch(new z("keys.dismissMinted"))})))}function pZ(A,Q,B){let{draft:C,draftScopes:J}=A,K=!!C.name.trim()&&!!J;return R({className:"key-form"},R({className:"setting"},R({className:"info"},R({className:"t"},"Name"),R({className:"d"},"What it is for. This is what the list shows, so make it recognisable.")),R({className:"control"},jB({className:"input",value:C.name,$attrs:{placeholder:"CI uploader"}}).on({input:(E)=>B.engine.dispatch(new rC({name:E.target.value}))}))),R({className:"setting"},R({className:"info"},R({className:"t"},"Expires after"),R({className:"d"},"Days from now. Leave blank and it never expires.")),R({className:"control"},jB({className:"input",type:"number",value:C.expiresInDays,$attrs:{min:"1",max:"3650",placeholder:"never"}}).on({input:(E)=>B.engine.dispatch(new rC({expiresInDays:E.target.value}))}))),R({className:"key-scopes"},R({className:"key-scopes-head"},R({className:"t"},"What it may do"),R({className:"d"},"Per collection. A key with nothing ticked grants nothing and cannot be created.")),nL({id:iL,name:"All collections",wildcard:!0},C,B),...Q.map((E)=>nL(E,C,B))),R({className:"keys-actions"},yA({className:"btn primary",$attrs:K?{}:{disabled:"true"}},A.busy==="mint"?"Creating…":"Create key").on({click:()=>K&&B.engine.dispatch(new z("keys.mint"))}),yA({className:"btn"},"Cancel").on({click:()=>B.engine.dispatch(new z("keys.cancel"))})))}function nL(A,Q,B){let C=new Set(Q.caps[A.id]||[]);return R({className:`key-scope ${A.wildcard?"wildcard":""}`},R({className:"key-scope-name"},U(A.wildcard?"grid":"files",{size:14}),EA(A.name||A.id)),R({className:"key-scope-caps"},...fZ.map((J)=>sL({className:`cap ${C.has(J.id)?"on":""}`,title:J.hint},jB({type:"checkbox",checked:C.has(J.id)}).on({change:()=>B.engine.dispatch(new uJ(A.id,J.id))}),EA(J.label)))))}function lZ(A,Q,B,C){let J=!!A.revokedAt,K=A.expiresAt!=null&&A.expiresAt<=Date.now(),E=J||K;return R({className:`key-row ${E?"dead":""}`},R({className:"key-row-main"},R({className:"key-row-name"},EA({className:"t"},A.name),J?EA({className:"key-tag"},"revoked"):K?EA({className:"key-tag"},"expired"):null),R({className:"key-row-scopes"},...cZ(A,B)),R({className:"key-row-meta"},dZ(A))),!E?yA({className:"btn small danger",$attrs:Q.busy===A.id?{disabled:"true"}:{}},Q.busy===A.id?"…":"Revoke").on({click:()=>C.engine.dispatch(new z("keys.revoke",A.id))}):null)}function cZ(A,Q){let B=(C)=>Q.find((J)=>J.id===C)?.name||C;return(A.scopes||[]).map((C)=>EA({className:"key-chip"},EA({className:"where"},C.collectionId===iL?"all collections":B(C.collectionId)),EA({className:"what"},C.capabilities.join(" · "))))}function dZ(A){let Q=(C)=>new Date(C).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}),B=[`created ${Q(A.createdAt)}`];if(A.createdBy)B.push(`by ${A.createdBy}`);if(B.push(A.lastUsedAt?`last used ${Q(A.lastUsedAt)}`:"never used"),A.expiresAt)B.push(`expires ${Q(A.expiresAt)}`);return B.join(" · ")}function aZ(A,Q){let B=A.ex?.collectionId,C=A.ex?.collections?.find((J)=>J.id===B)?.encryption;if(!C?.enabled)return null;return Q.watch(i(Q.engine,KL(B)),(J)=>nZ(C,J||{},Q))}function nZ(A,Q,B){let C=Q.rotation?.status==="running",J=Q.estimate;return R({className:"group"},QB("Encryption"),RQ({className:"sub"},"Files in this collection are sealed before they leave your browser. The drive holds the key."),R({className:"setting"},R({className:"info"},R({className:"t"},"Key fingerprint"),R({className:"d"},"Identifies the key this collection is on.")),R({className:"control"},yA({className:"btn small",title:"Copy"},w.h("code",A.fingerprint)).on({click:()=>B.engine.dispatch(new rA(A.fingerprint,"Fingerprint copied"))}))),R({className:"setting"},R({className:"info"},R({className:"t"},C?"Rotating the key":"Rotate the key"),R({className:"d"},C?`${Q.rotation.moved} moved${Q.rotation.failed?`, ${Q.rotation.failed} failed`:""} — this continues in the background.`:oZ(J))),R({className:"control"},C?yA({className:"btn small",disabled:!!Q.busy},"Stop").on({click:()=>B.engine.dispatch(new FK)}):yA({className:"btn small",disabled:!!Q.busy},"Rotate").on({click:()=>B.engine.dispatch(new UK)}))),C?null:R({},sZ(J),RQ({className:"sub"},"Every file is re-sealed under a new key and the old one is retired once nothing is left on it. Files stay readable throughout.")))}function oZ(A){if(!A)return"Re-seals every file under a fresh key.";return A.summary||"Re-seals every file under a fresh key."}function sZ(A){if(!A?.applicable||!(A.lines||[]).length)return null;return R({className:"rot-bill"},...A.lines.map((Q)=>R({className:"rb-line"},EA(Q.label||Q.name||""),EA({className:"mono"},Q.amount||Q.value||""))),A.total?R({className:"rb-line total"},EA("Estimated total"),EA({className:"mono"},A.total)):null,A.asOf?R({className:"rb-asof"},`Prices as of ${A.asOf}.`):null)}function iZ(A,Q){return R({className:"group"},QB("Default Openers"),A.length?R({},...A.map((B)=>R({className:"setting"},R({className:"info"},R({className:"t"},B.typeKey),R({className:"d"},B.missing?`${B.openerTitle} (no longer installed)`:`Opens with ${B.openerTitle}`)),R({className:"control"},yA({className:"iconbtn",title:"Forget this default"},U("close",{size:14})).on({click:()=>Q.engine.dispatch(new CC(B.typeKey,null))}))))):RQ({className:"sub",$styling:{margin:0}},"No default openers set yet. When a file type has more than one viewer, you can pick one and check “Always use this”."))}var rL="keybindingCapture",oL=null;function rZ(A){return oL??=NA(A.engine,{bindings:WL,view:X0},(Q)=>tZ(Q.bindings||[],A,Q.view?.[rL]??null)),oL()}function tZ(A,Q,B){let C=(E)=>Q.engine.dispatch(new iQ(rL,E)),J=()=>C(null),K=(E,Y)=>Q.engine.dispatch(new VJ(E,Y));return R({className:"group"},QB("Keyboard Shortcuts"),RQ({className:"sub"},"Click a shortcut to record a new one. Esc cancels; Backspace clears it."),...A.map((E)=>{let Y=B===E.bindingId;return R({className:"setting"},R({className:"info"},R({className:"t"},E.title),R({className:"d"},E.command)),R({className:"control"},E.clash&&!Y?EA({className:"kbd-clash",title:"Another command answers to this shortcut too — the one registered last wins"},U("warn",{size:12})):null,yA({className:`kbd-edit ${Y?"listening":""} ${E.clash?"clash":""}`,title:Y?"Press the new shortcut":"Click to rebind"},Y?EA("Press keys…"):w.h("kbd",E.label)).on({click:()=>C(Y?null:E.bindingId),blur:()=>{if(Y)J()},keydown:(L)=>{if(!Y)return;if(L.preventDefault(),L.stopPropagation(),L.key==="Escape")return J();if(L.key==="Backspace")return K(E.bindingId,null),J();if(["Control","Meta","Alt","Shift"].includes(L.key))return;K(E.bindingId,y0(L)),J()},$attach:(L)=>{if(Y)queueMicrotask(()=>L.focus())}}),E.custom?yA({className:"c-link",title:"Back to the default"},"reset").on({click:()=>{K(E.bindingId,null),C(null)}}):null))}))}var{div:eA,h2:tL,p:eL,button:UE,span:IE}=w;function FE(A,Q){let B=A.ex||{};return eA({className:"editor"},eA({className:"stage"},eA({className:"gate"},B.gate==="create"?eZ(Q):AD(B,Q))))}function eZ(A){return eA({className:"gate-card"},eA({className:"gate-icon"},U("files",{size:26})),tL("Make your first collection"),eL({className:"gate-sub"},"A collection is a backing store you own — a bucket, a directory, a mount. Files "+"live in one, and permissions are granted on one. Nothing can be uploaded until there is somewhere to put it."),eA({className:"gate-actions"},UE({className:"btn primary"},U("plus",{size:14}),"New collection").on({click:()=>A.engine.dispatch(new z("collections.create"))})))}function AD(A,Q){let B=A.collections||[];return eA({className:"gate-card"},eA({className:"gate-icon"},U("grid",{size:26})),tL(B.length===1?"Open your collection":"Choose a collection"),eL({className:"gate-sub"},B.length===1?"This is the one you have access to. Opening it will be remembered for next time.":"Files, search and uploads all belong to one collection. Your choice is remembered for next time, and you can switch from the status bar whenever you like."),eA({className:"gate-list"},...B.map((C)=>UE({className:"gate-choice"},eA({className:"gate-choice-main"},IE({className:"n"},C.name||C.id),IE({className:"d"},C.driver?`${C.driver}${C.description?` · ${C.description}`:""}`:C.description||"")),IE({className:"gate-caps"},(C.capabilities||[]).join(" · "))).on({click:()=>Q.engine.dispatch(new z("collections.switch",C.id))}))),A.canCreateCollection?eA({className:"gate-actions"},UE({className:"btn"},U("plus",{size:14}),"New collection").on({click:()=>Q.engine.dispatch(new z("collections.create"))})):null)}var{div:s,span:hA,p:QD,button:$C,h2:BD,input:ME,label:CD}=w;function RE(A,Q){let B=A.plugins||[];return s({className:"editor"},s({className:"stage"},s({className:"plugins"},BD("Plugins"),QD({className:"sub",$styling:{color:"var(--text-dim)",margin:"0 0 8px"}},"Plugins are sandboxed packages you install from a file or URL. They run in an isolated iframe and reach Trove only through a message channel, using the capabilities you granted."),s({className:"plugin-install"},$C({className:"btn primary"},U("upload",{size:15}),"Install from file…").on({click:()=>Q.engine.dispatch(new z("plugins.installFromFile"))}),$C({className:"btn"},U("plug",{size:15}),"Install from URL…").on({click:()=>Q.engine.dispatch(new z("plugins.installFromUrl"))})),B.length?s({$styling:{display:"flex","flex-direction":"column",gap:"12px","margin-top":"14px"}},...B.map((C)=>JD(C,A,Q))):s({className:"empty",$styling:{padding:"48px"}},U("plug",{size:30}),hA("No plugins installed yet.")))))}function JD(A,Q,B){let C=!A.responsive?"not responding":A.manifest?.online===!1?"offline":"connected",J=A.features||[];return s({className:"plugin-card"},s({className:"top"},s({className:"avatar"},(A.name||"?")[0].toUpperCase()),s({$styling:{flex:"1"}},s({className:"name"},A.name,A.version?hA({$styling:{color:"var(--text-faint)","font-weight":"400","margin-left":"6px"}},"v"+A.version):null),s({$styling:{"font-size":"11px",color:"var(--text-faint)"}},A.id)),YD(A.trust),hA({className:`status ${A.status}`},A.status)),A.error?s({className:"desc",$styling:{color:"var(--danger)"}},A.error):null,s({className:"caps"},...(A.capabilities||[]).map((K)=>hA({className:"cap"},K))),(A.endpoints||[]).length?s({className:"plugin-endpoints",$styling:{"font-size":"11px",color:"var(--text-faint)","margin-top":"2px"}},U("plug",{size:11})," Network: ",(A.endpoints||[]).map((K)=>K.host).join(", ")):null,A.status==="active"?s({className:"plugin-features"},s({className:"pf-head"},hA(`Features · ${C}`),hA({className:"muted"},`${J.filter((K)=>K.available).length}/${J.length} available`)),J.length?s({className:"pf-list"},...J.map(XD)):s({className:"muted",$styling:{"font-size":"12px"}},A.responsive?"No contributions announced.":"No manifest received — the plugin may not be running.")):null,(A.settingsSchema||[]).length?KD(A,B,Q):null,s({className:"actions"},A.hasUi?$C({className:"btn"},U("command",{size:14}),"Open panel").on({click:()=>B.engine.dispatch(new tB(A.id))}):null,$C({className:"btn"},U("refresh",{size:14}),"Refresh").on({click:()=>B.engine.dispatch(new cJ(A.id))}),$C({className:"btn danger"},"Uninstall").on({click:()=>B.engine.dispatch(new dA({kind:"confirm",title:`Uninstall ${A.name}?`,danger:!0,confirmLabel:"Uninstall",body:"The plugin and all data it stored will be removed.",confirmActions:[new IJ(A.id)]}))})))}function KD(A,Q,B){return s({className:"plugin-features"},s({className:"pf-head"},hA("Settings")),s({$styling:{display:"flex","flex-direction":"column",gap:"8px"}},...A.settingsSchema.map((C)=>ED(A,C,Q,B))))}function ED(A,Q,B,C){let J=`${A.id}.${Q.key}`,K=Q.secret?"":C.settings?.[J]??Q.default??"";return s({className:"setting",$styling:{padding:"6px 0"}},s({className:"info"},s({className:"t"},Q.title||Q.key),Q.description?s({className:"d"},Q.description):null),s({className:"control"},Q.secret?ME({className:"input",type:"password",placeholder:"Set secret…"}).on({change:(E)=>{if(E.target.value)B.engine.dispatch(new dJ(A.id,Q.key,E.target.value)),E.target.value="",E.target.placeholder="Saved ✓"}}):Q.type==="boolean"?CD({className:"switch"},ME({type:"checkbox",checked:!!K}).on({change:(E)=>B.engine.dispatch(new gQ(J,E.target.checked))}),hA({className:"track"})):ME({className:"input",value:K}).on({change:(E)=>B.engine.dispatch(new gQ(J,E.target.value))})))}function YD(A){if(!A)return null;let Q=mB(A),B=Q.status==="verified"?Q.domain:Q.status==="invalid"?"invalid signature":Q.status;return hA({className:`trust ${Q.tone}`,title:Q.explanation},U(Q.icon,{size:12}),B)}var LD={command:"command",opener:"file",indexer:"search",statusItem:"info"};function XD(A){return s({className:`pf-row ${A.available?"":"off"}`},U(LD[A.kind]||"command",{size:13}),hA({className:"pf-title"},A.title),hA({className:"pf-kind"},A.kind),A.offline?hA({className:"pf-badge offline-ok",title:"Works offline"},"offline ✓"):null,hA({className:`pf-dot ${A.available?"on":"no"}`,title:A.available?"Available now":"Unavailable now"}))}var{div:p,h2:GD,h3:I0,p:DC,span:W0,button:ZC}=w;function VE(A,Q){let B=A.caps;return p({className:"editor"},p({className:"stage"},p({className:"settings admin"},GD("Administration"),DC({className:"sub"},"How this drive is configured, and what it can do. Most of it is decided by the deployment rather than here."),HD(B,A,Q),$D(B,A,Q),ZD(B,A),DD(A,Q))))}function TA(A,Q,B){return p({className:"setting"},p({className:"info"},p({className:"t"},A),Q?p({className:"d"},Q):null),p({className:"control"},typeof B==="string"?W0({className:"mono"},B):B))}function HD(A,Q,B){let C=A?.auth||{},J=A?.principal||Q.so?.me||{},K=C.authorizationServers||[];return p({className:"group"},I0("Access"),DC({className:"sub"},"Who can reach this drive. Set by the deployment, not here."),TA("Signed in as",J.anonymous?"This drive does not require a sign-in.":J.email||J.id,J.anonymous?"anonymous":J.name||J.id||"—"),TA("Sign-in required","Whether a caller must present a token.",A?.mcp?.requiresAuth?"Yes":"No"),TA("Authorization server","Where clients are sent to sign in.",K.length?K.join(", "):"not set"),TA("API keys","Credentials for scripts and services, scoped per collection.",ZC({className:"btn small"},"In Settings").on({click:()=>B.engine.dispatch(new z("workbench.openSettings"))})))}function $D(A,Q,B){let C=A?.storage||{},J=A?.storageDrivers||[],K=Q.ex?.usage,E=(Y)=>W0({className:`mono ${Y?"":"muted"}`},Y?"yes":"no");return p({className:"group"},I0("Storage"),DC({className:"sub"},"The backing stores this deployment offers, and what they support."),TA("Drivers offered","What a new collection may be created on.",J.length?J.map((Y)=>Y.label||Y.key).join(", "):"none registered"),TA("Direct downloads","A presigned URL sends bytes from the store, not through the drive.",E(C.presignDownload)),TA("Direct uploads","A presigned PUT sends bytes to the store, not through the drive.",E(C.presignUpload)),TA("Multipart","Large files go up in parts, resumably.",E(C.multipart)),TA("Range requests","Seeking inside a file without fetching the whole thing.",E(C.range)),K?.total?TA("Space","Reported by the backing store.",`${KA(K.available)} free of ${KA(K.total)}`):TA("Space","This store does not report a total, which object stores generally cannot.","not reported"),p({className:"setting"},p({className:"info"},p({className:"t"},"Check the backing stores"),p({className:"d"},"Asks whether each store can actually be reached from here — the failure that makes every file open to a spinner.")),p({className:"control"},ZC({className:"btn small"},"Run check").on({click:()=>B.engine.dispatch(new z("workbench.checkStorage"))}))))}function ZD(A,Q){let B=A?.indexers||[],C=Q.plugins||[];return p({className:"group"},I0("Extensions"),DC({className:"sub"},"What reads and adds to this drive."),p({className:"setting"},p({className:"info"},p({className:"t"},"Indexers"),p({className:"d"},"They read file contents to make them searchable — including in an encrypted collection, since indexing happens on the drive’s side of the encryption.")),p({className:"control"},W0({className:"mono"},B.length?B.map((J)=>J.displayName||J.id).join(", "):"none"))),C.length?p({},...C.map((J)=>p({className:"setting"},p({className:"info"},p({className:"t"},J.manifest?.displayName||J.id),p({className:"d"},(J.grants||[]).length?`May: ${(J.grants||[]).join(", ")}`:"Granted nothing — it runs in its sandbox and can only draw.")),p({className:"control"},W0({className:`mono ${J.status==="active"?"":"muted"}`},J.status||"idle"))))):TA("Plugins","Installed by an administrator, from a signed package.","none installed"))}function DD(A,Q){let B=A.act||{tasks:[],issues:[]},C=(B.tasks||[]).filter((J)=>J.status==="running");return p({className:"group"},I0("Work"),DC({className:"sub"},"Background jobs and anything that needs attention."),TA("Running now","Scans, reindexes and rotations happening on the server.",C.length?`${C.length}`:"nothing running"),TA("Needs attention","Standing problems — they persist until fixed, unlike a toast.",B.issues?.length?`${B.issues.length}`:"none"),p({className:"setting stacked"},p({className:"info"},p({className:"t"},"Maintenance"),p({className:"d"},"A scan picks up files changed in the bucket by something other than Trove. A reindex rebuilds search from scratch.")),p({className:"control admin-actions"},ZC({className:"btn small"},"Activity panel").on({click:()=>Q.engine.dispatch(new z("workbench.showActivity"))}),ZC({className:"btn small"},"Scan").on({click:()=>Q.engine.dispatch(new z("workbench.scanCollection"))}),ZC({className:"btn small"},"Reindex").on({click:()=>Q.engine.dispatch(new z("workbench.rebuildIndex"))}))))}async function AX(A,Q,{from:B}={}){let C=lC(Q),J=A.platform.notifications;if(!C)return J.warn(`"${Q}" isn’t a valid Trove link.`),null;try{let K=await A.platform.api.stat(Q);if(!K?.node)throw Error("not found");return A.engine.dispatch(new pA(K.node)),K.node}catch(K){return J.warn(WD(C,K,B)),null}}function WD(A,Q,B){let C=B?.name?` (linked from "${B.name}")`:"";if(Q?.status===403||Q?.code==="forbidden")return`You don’t have access to that item in "${A.collection}"${C}.`;if(A.by==="name")return`Nothing named "${A.value}" in "${A.collection}"${C} — it may have been renamed or deleted.`;return`That item no longer exists in "${A.collection}"${C}.`}var{div:BB,span:qE,h1:ID,h2:UD,h3:FD,p:EX,ul:MD,ol:RD,li:VD,pre:ND,code:YX,a:QX,em:qD,strong:zD,blockquote:PD,hr:OD,br:jD}=w;function LX(A,Q){let B=VC(i(Q.engine,zB.of(A.id,NE,A.size)),(C)=>C.text);return w.alias(()=>Q.watch(B,(C)=>{try{return BB({className:"viewer markdown"},BB({className:"md"},...XX(C,A,Q)))}catch(J){return console.error("markdown render failed",J),BX(`This document couldn’t be displayed: ${J.message}`)}},{placeholder:()=>BB({className:"viewer"},BB({className:"loading"},BB({className:"spinner"}),qE("Loading…"))),error:(C)=>BX(C.message)}))()}function BX(A){return BB({className:"viewer"},BB({className:"fallback"},U("warn",{size:40}),qE(A)))}var NE=524288,_D=5000,SD=2000;function XX(A,Q,B){let C=String(A??""),J=C.length>NE,K=(J?C.slice(0,NE):C).split(/\r?\n/),E=[],Y=0;while(Y<K.length){if(E.length>=_D)return[...E,CX()];let L=K[Y],X=/^\s*(```+|~~~+)(.*)$/.exec(L);if(X){let F=X[1][0].repeat(3),V=[];Y++;while(Y<K.length&&!K[Y].trimStart().startsWith(F))V.push(K[Y++]);Y++,E.push(ND({className:"md-code"},YX(V.join(`
350
+ `))));continue}if(!L.trim()){Y++;continue}let H=/^(#{1,6})\s+(.*)$/.exec(L);if(H){let F=H[1].length,V=F===1?ID:F===2?UD:FD;E.push(V({className:`md-h md-h${F}`},...WC(H[2],Q,B))),Y++;continue}if(/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(L)){E.push(OD({className:"md-hr"})),Y++;continue}if(/^\s*>/.test(L)){let F=[];while(Y<K.length&&/^\s*>/.test(K[Y]))F.push(K[Y++].replace(/^\s*>\s?/,""));E.push(PD({className:"md-quote"},...XX(F.join(`
351
+ `),Q,B)));continue}let G=/^\s*([-*+]|\d+[.)])\s+/.exec(L);if(G){let F=/\d/.test(G[1]),V=[];while(Y<K.length){let g=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(K[Y]);if(!g||/\d/.test(g[1])!==F)break;V.push(VD({className:"md-li"},...WC(g[2],Q,B))),Y++}E.push((F?RD:MD)({className:"md-list"},...V));continue}let Z=[];while(Y<K.length&&K[Y].trim()&&!TD(K[Y]))Z.push(K[Y++]);let M=Z.join(`
352
+ `),I=[];M.split(`
353
+ `).forEach((F,V)=>{if(V)I.push(jD());I.push(...WC(F,Q,B))}),E.push(EX({className:"md-p"},...I))}return J?[...E,CX()]:E}function CX(){return EX({className:"md-truncated"},"This document is too large to display in full. Download it to read the rest.")}function TD(A){return/^(#{1,6}\s|\s*>|\s*([-*+]|\d+[.)])\s|\s*(```|~~~))/.test(A)||/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(A)}var wD=[{re:/`([^`]+)`/,node:(A)=>YX({className:"md-inline-code"},A[1])},{re:/\[([^\]]*)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/,node:(A,Q,B)=>KX(A[2],A[1]||A[2],Q,B)},{re:/(\*\*|__)(.+?)\1/,node:(A,Q,B,C)=>zD(...WC(A[2],Q,B,C+1))},{re:/(\*|_)(.+?)\1/,node:(A,Q,B,C)=>qD(...WC(A[2],Q,B,C+1))},{re:/(trove:[^\s<>"'`)\]}]+|https?:\/\/[^\s<>"'`)\]}]+)/,node:(A,Q,B)=>KX(JX(A[1]),JX(A[1]),Q,B)}];function WC(A,Q,B,C=0){if(!A)return[];if(C>12)return[A];let J=[],K=A;while(K){if(J.length>=SD){J.push(K);break}let E=null;for(let X of wD){let H=X.re.exec(K);if(H&&(E===null||H.index<E.m.index))E={m:H,rule:X}}if(!E){J.push(K);break}let{m:Y,rule:L}=E;if(Y.index)J.push(K.slice(0,Y.index));J.push(L.node(Y,Q,B,C)),K=K.slice(Y.index+Y[0].length)}return J}function JX(A){return A.replace(/[.,;:!?]+$/,"")}function KX(A,Q,B,C){if(lC(A))return QX({className:"md-link md-trove",href:"#",title:A},Q).on({click:(K)=>{K.preventDefault(),AX(C,A,{from:B})}});if(/^https?:\/\//i.test(A))return QX({className:"md-link",href:A,target:"_blank",rel:"noopener noreferrer",title:A},Q);return qE({className:"md-deadlink",title:`Unsupported link: ${A}`},Q)}var{div:OA,pre:xD,img:kD,span:CB,button:gD,video:yD,audio:hD}=w,bD={"core.audio":{title:"Audio Player",priority:20,match:{mime:["audio/*"],ext:[".mp3",".flac",".wav",".opus",".ogg",".m4a",".m4b"]},component:pD},"core.video":{title:"Video Player",priority:20,match:{mime:["video/*"],ext:[".mp4",".webm",".mkv",".mov"]},component:lD},"core.image":{title:"Image Viewer",priority:20,match:{mime:["image/*"],ext:[".png",".jpg",".jpeg",".gif",".webp",".svg",".avif"]},component:mD},"core.markdown":{title:"Markdown",priority:30,match:{ext:[".md",".markdown"],mime:["text/markdown"]},component:LX},"core.text":{title:"Text Viewer",priority:10,match:{mime:["text/*","application/json"],ext:[".txt",".md",".json",".js",".mjs",".ts",".jsx",".tsx",".css",".html",".xml",".yaml",".yml",".toml",".ini",".log",".csv",".py",".rb",".go",".rs",".sh",".c",".h",".cpp",".java"]},component:fD}};function GX(A){for(let[Q,B]of Object.entries(bD))A.contributions.register(Q,{type:"opener",...B})}function HX(A,Q,B){let C=B.platform.contributions.get(Q);if(C?.component)try{return C.component(A,B)}catch(J){return ZX(J.message)}if(C?.pluginId)return cD(C,A,B);return $X(A,B)}var vD=524288;function fD(A,Q){let B=i(Q.engine,zB.of(A.id,vD,A.size));return w.alias(()=>Q.watch(B,({text:C,truncated:J,total:K})=>OA({className:"viewer text"},xD(C),J?OA({className:"md-truncated"},`Showing the first ${Math.round(C.length/1024)} KB${K?` of ${(K/1048576).toFixed(1)} MB`:""}. `,CB("Download the file to read all of it.")):null),{placeholder:()=>OA({className:"viewer"},OA({className:"loading"},OA({className:"spinner"}),CB("Loading…"))),error:(C)=>ZX(C.message)}))()}var uD="This file couldn't be loaded — it may be missing or in an unsupported format.";function zE(A,Q,B){let C=d({error:null}),K=B((E)=>C.setValue({error:E||uD}));return w.alias(()=>XQ(C,(E)=>E.error?$X(A,Q,E.error):K))()}var PE=(A,Q,B,C)=>A.on({$attach:(J)=>{J._detachMedia=PB(J,Q,B,{onError:C})},$detach:(J)=>{J._detachMedia?.(),J._detachMedia=null}}).opaque();function mD(A,Q){return zE(A,Q,(B)=>OA({className:"viewer image"},PE(kD({alt:A.name}),A,Q,B)))}function pD(A,Q){return zE(A,Q,(B)=>OA({className:"viewer",$styling:{display:"grid","place-items":"center",gap:"16px",padding:"40px"}},U("file-audio",{size:48}),CB({$styling:{color:"var(--text-dim)"}},A.name),PE(hD({controls:!0,$styling:{width:"min(520px, 90%)"}}),A,Q,B)))}function lD(A,Q){return zE(A,Q,(B)=>OA({className:"viewer",$styling:{display:"grid","place-items":"center",background:"#000"}},PE(yD({controls:!0,$styling:{"max-width":"100%","max-height":"100%"}}),A,Q,B)))}function $X(A,Q,B){return OA({className:"viewer"},OA({className:"fallback"},U(B?"warn":"file",{size:44}),CB({$styling:{"font-weight":600}},A.name),CB(`${A.contentType||"Unknown type"} · ${KA(A.size)}`),CB({$styling:{color:"var(--text-faint)","max-width":"340px"}},B||"No preview available for this file type. Install a plugin that handles it, or download the file."),gD({className:"btn primary"},U("download",{size:15}),"Download").on({click:()=>Q.engine.dispatch(new z("explorer.download",A))})))}function cD(A,Q,B){return OA({className:"viewer plugin-viewer"},OA({className:"pv-status"}).on({$attach:(C)=>{C.innerHTML='<div class="loading"><div class="spinner"></div><span>Opening…</span></div>',C._ready=()=>{C.style.display="none"},C._error=(J)=>{C.style.display="grid",C.innerHTML="",C.appendChild(dD(J))}}}).opaque(),OA({className:"pv-host"}).on({$attach:(C)=>{let J=C.parentElement?.querySelector(".pv-status");C._detach=B.platform.plugins.mountViewer(A.pluginId,C,Q,A.id,{onReady:()=>J?._ready?.(),onError:(K)=>J?._error?.(K||"This viewer failed to load")})},$detach:(C)=>{C._detach?.(),C._detach=null}}).opaque())}function dD(A){let Q=document.createElement("div");Q.className="fallback";let B=document.createElement("span");return B.textContent=A||"Failed to open",Q.appendChild(B),Q}function ZX(A){return OA({className:"viewer"},OA({className:"fallback"},U("warn",{size:40}),CB(A||"Failed to open")))}var{div:SB,span:DX,button:_B}=w,U0=new Map;function F0(A,Q){let B=A.wb,C=A.nav.stack.filter((K)=>K.kind==="file");sD(C);let J=C[C.length-1];if(!J)return SB({className:"editor"});return SB({className:"editor"},aD(C,J,A,Q),SB({className:"stage"},oD(J,Q)))}function aD(A,Q,B,C){return SB({className:"viewer-nav"},_B({className:"vn-back",title:"Back (Esc)"},U("chevron-left",{size:16})).on({click:()=>C.engine.dispatch(new lJ)}),SB({className:"vn-trail"},_B({className:"vn-crumb"},U("search",{size:13}),DX("Search")).on({click:()=>C.engine.dispatch(new yQ)}),...A.map((J)=>_B({className:`vn-crumb ${J.id===Q.id?"active":""}`,title:J.node.name},U(ZQ(J.node),{size:13}),DX({className:"label"},J.node.name)).on({click:()=>C.engine.dispatch(new IQ(J.node,J.openerId))}))),SB({className:"vn-actions"},nD(Q,B,C),_B({className:"iconbtn",title:"Details & comments"},U("info",{size:15})).on({click:()=>C.engine.dispatch(new rB)}),_B({className:"iconbtn",title:"Close (Esc)"},U("close",{size:15})).on({click:()=>C.engine.dispatch(new yQ)})))}function nD(A,Q,B){let C=o8(Q.openers,A.node);if(C.length<=1)return null;return _B({className:"iconbtn",title:"Open with…"},U("dots",{size:15})).on({click:()=>B.engine.dispatch(new dA({kind:"opener-chooser",node:A.node,openers:C,current:A.openerId}))})}function oD(A,Q){let B=`${A.id}:${A.openerId}`,C=U0.get(B);if(!C)C=()=>HX(A.node,A.openerId,Q),U0.set(B,C);return w.alias(C)().key(A.id)}function sD(A){let Q=new Set(A.map((B)=>`${B.id}:${B.openerId}`));for(let B of U0.keys())if(!Q.has(B))U0.delete(B)}var{div:nA,input:iD,span:bQ}=w;function OE(A,Q){let B=A.overlay.palette;if(!B)return null;let C=B.mode==="files"?B.query.trim()?A.se.paletteFiles||[]:[]:A.matches||[],J=Math.min(B.index,Math.max(0,C.length-1)),K=(E)=>{if(!E)return;if(Q.engine.dispatch(new iB),B.mode==="files")Q.engine.dispatch(new pA(E.node));else Q.engine.dispatch(new z(E.id))};return nA({},nA({className:"scrim"}).on({click:()=>Q.engine.dispatch(new iB)}),nA({className:"palette"},nA({className:"search"},U(B.mode==="files"?"search":"command",{size:18}),iD({type:"text",value:B.query,autofocus:!0,placeholder:B.mode==="files"?"Search files by name…":"Type a command…"}).on({input:(E)=>Q4(Q,E.target.value),keydown:(E)=>A4(E,Q,C,J,K),$attach:(E)=>{if(queueMicrotask(()=>E.focus()),E.value!==B.query)E.value=B.query}})),nA({className:"results"},C.length?C.map((E,Y)=>{let L=()=>Q.engine.dispatch(new zJ(Y));return B.mode==="files"?eD(E,Y===J,K,L):tD(E,Y===J,Q,K,L)}):rD(B,A))))}function rD(A,Q){if(A.mode!=="files")return nA({className:"none"},"No matching commands");if(Q.se.paletteError)return nA({className:"none error"},U("warn",{size:14}),` ${Q.se.paletteError}`);if(Q.se.paletteLoading)return nA({className:"none"},nA({className:"spinner"})," Searching…");return nA({className:"none"},A.query.trim()?"No files found":"Type to search files by name")}function tD(A,Q,B,C,J){return nA({className:`opt ${Q?"active":""} ${A.available?"":"unavailable"}`},bQ({className:"ico"},U(A.icon||"command",{size:16})),A.category?bQ({className:"cat"},A.category+" ›"):null,bQ({className:"title"},A.title),!A.available?bQ({className:"offline-tag"},"offline"):null,A.keybinding?bQ({className:"kbd"},w.h("kbd",A.keybinding)):null).on({click:()=>C(A),mouseenter:J})}function eD(A,Q,B,C){return nA({className:`opt ${Q?"active":""}`},bQ({className:"ico"},U(ZQ(A.node),{size:16})),bQ({className:"title"},A.node.name),bQ({className:"sub"},A.node.contentType||"")).on({click:()=>B(A),mouseenter:C})}function A4(A,Q,B,C,J){if(A.key==="ArrowDown")A.preventDefault(),Q.engine.dispatch(new nC(1,B.length));else if(A.key==="ArrowUp")A.preventDefault(),Q.engine.dispatch(new nC(-1,B.length));else if(A.key==="Enter")A.preventDefault(),J(B[C]);else if(A.key==="Escape")A.preventDefault(),Q.engine.dispatch(new iB)}var WX=null;function Q4(A,Q){A.engine.dispatch(new qJ(Q)),clearTimeout(WX),WX=setTimeout(()=>A.engine.dispatch(new FJ(Q)),200)}var{div:a,span:YA,button:IX,h3:E7,p:B4,label:MX,input:RX}=w,UX="pluginReview";function VX(A,Q,B){let C=A.summary,J=mC(B,UX,A,{grants:C.capabilities.filter((X)=>!X.adminOnly||A.isAdmin).map((X)=>X.id),acknowledged:!1}),K=A.policy||{requiresAcknowledgement:!1},E=K.requiresAcknowledgement&&!J.acknowledged,Y=(X)=>Q.engine.dispatch(new iQ(UX,{...J,...X})),L=(X)=>Y({grants:J.grants.includes(X)?J.grants.filter((H)=>H!==X):[...J.grants,X]});return a({},a({className:"scrim"}).on({click:()=>Q.engine.dispatch(new PA)}),a({className:"dialog review",$styling:{width:"min(560px, 96vw)"}},J4(C),a({className:"review-body"},C.description?B4({className:"review-desc"},C.description):null,TB("Capabilities it requests",C.capabilities.length?a({className:"cap-list"},...C.capabilities.map((X)=>E4(X,A.isAdmin,J.grants.includes(X.id),()=>L(X.id)))):$4("None — this plugin only runs in its sandbox.")),(C.network||[]).length?TB("Network access",a({className:"contrib-list"},...C.network.map(X4))):null,(C.commands||[]).length?TB("Commands it can run",a({className:"contrib-list"},...C.commands.map((X)=>L4(X,Q)))):null,C.storage?TB("Storage",G4(C.storage)):null,C.contributions.length?TB("What it adds",a({className:"contrib-list"},...C.contributions.map(Y4))):null,C.settings.length?TB("Settings",a({className:"contrib-list"},...C.settings.map(H4))):null,a({className:"review-meta"},`${C.fileCount} files · ${KA(C.sizeBytes)} · id ${C.id}`)),K.headline?C4(K,J,Y):null,a({className:"row-actions"},IX({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new PA)}),IX({className:`btn primary ${E?"disabled":""}`,disabled:E},U("plug",{size:15}),"Install").on({click:()=>!E&&A.onInstall([...J.grants])}))))}function C4(A,Q,B){return a({className:`review-warning ${A.status}`},a({className:"rw-head"},U("warn",{size:15}),YA(A.headline)),a({className:"rw-detail"},A.detail),A.requiresAcknowledgement?MX({className:"rw-ack"},RX({type:"checkbox",checked:!!Q.acknowledged}).on({change:(C)=>B({acknowledged:!!C.target.checked})}),YA("I know this package is unsigned and I trust where it came from")):null)}function J4(A){let Q=A.trust||{status:"unverified"};return a({className:"review-head"},a({className:"avatar"},(A.name||"?")[0].toUpperCase()),a({className:"rh-main"},a({className:"rh-name"},A.name,YA({className:"rh-ver"},"v"+A.version)),a({className:"rh-author"},"by "+A.author)),K4(Q))}function K4(A){let Q=mB(A),B=Q.status==="verified"&&Q.domain?`Verified · ${Q.domain}`:Q.status==="invalid"?"Invalid signature":Q.status==="signed"?"Signed":"Unverified";return YA({className:`trust ${Q.tone}`,title:Q.explanation},U(Q.icon,{size:13}),B)}function E4(A,Q,B,C){let J=A.adminOnly&&!Q;return MX({className:`cap-row ${J?"blocked":""}`},RX({type:"checkbox",checked:B&&!J,disabled:J}).on({change:()=>!J&&C()}),a({className:"cap-info"},a({className:"cap-name"},A.id,A.adminOnly?YA({className:"pf-badge",$styling:{color:"var(--warn)","margin-left":"6px"}},"admin only"):null),a({className:"cap-desc"},A.description+(J?" — requires an administrator":""))))}function Y4(A){let Q={command:"command",opener:"file",indexer:"search",statusItem:"info",register:"info",keymap:"command"}[A.kind]||"command";return a({className:"contrib-row"},U(Q,{size:13}),YA({className:"cr-title"},A.title),A.detail?YA({className:"cr-detail"},A.detail):null,A.offline?YA({className:"pf-badge offline-ok"},"offline"):null,YA({className:"pf-kind"},A.kind))}function L4(A,Q){let B=Q?.platform?.contributions?.get?.(A),C=B?.pluginId?"plugin":B?"built-in":"not installed";return a({className:`contrib-row ${B?"":"blocked"}`},U("command",{size:13}),YA({className:"cr-title"},B?.title||A),YA({className:"cr-detail"},A),YA({className:"pf-kind"},C))}function X4(A){return a({className:"contrib-row"},U("plug",{size:13}),YA({className:"cr-title"},A.host),A.path?YA({className:"cr-detail"},A.path):null,YA({className:"pf-kind"},A.scheme))}function G4(A){let Q=[];if(A.plugin)Q.push(FX("Private database","A SQLite store just for this plugin (server + this device).",!1));if(A.domain)Q.push(FX("Shared database","Shared with other plugins from its domain (SQLite).",A.domainBlocked));return a({className:"contrib-list"},...Q)}function FX(A,Q,B){return a({className:`contrib-row ${B?"blocked":""}`},U("plug",{size:13}),YA({className:"cr-title"},A),YA({className:"cr-detail"},B?Q+" — needs a verified domain":Q),B?YA({className:"pf-badge",$styling:{color:"var(--warn)"}},"unavailable"):null)}function H4(A){return a({className:"contrib-row"},U("gear",{size:13}),YA({className:"cr-title"},A.title),A.secret?YA({className:"pf-badge",$styling:{color:"var(--warn)"}},"secret"):YA({className:"pf-kind"},A.type))}function TB(A,Q){return a({className:"review-section"},a({className:"rs-title"},A),Q)}function $4(A){return a({className:"muted",$styling:{"font-size":"12.5px"}},A)}var{div:_,span:bA,button:vA,input:vQ,h3:jE,p:I7,select:qX,option:M0,label:fQ,textarea:U7}=w;function zX(A,Q){let B=A.overlay.dialog;if(!B)return null;if(B.kind==="collection")return D4(B,Q,A.caps,A.view);if(B.kind==="plugin-review")return VX(B,Q,A.view);if(B.kind==="opener-chooser")return Z4(B,Q);let C=v8(A.view,B),J=()=>{if(B.kind==="confirm")Q.engine.dispatch(new PA);aA(Q,{actions:B.confirmActions})};return _({},_({className:"scrim"}).on({click:()=>Q.engine.dispatch(new PA)}),_({className:"dialog"},jE(B.title),B.body?_({className:"body"},B.body):null,B.kind==="prompt"?_({className:"field"},B.label?bA({$styling:{"font-size":"12px",color:"var(--text-dim)"}},B.label):null,vQ({className:"input",value:C,placeholder:B.placeholder||"",autofocus:!0}).on({input:(K)=>Q.engine.dispatch(new iQ(uB,{ref:B,value:K.target.value})),keydown:(K)=>{if(K.key==="Enter")J();if(K.key==="Escape")Q.engine.dispatch(new PA)},$attach:(K)=>queueMicrotask(()=>{K.focus(),K.select()})})):null,_({className:"row-actions"},vA({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new PA)}),vA({className:`btn ${B.danger?"danger":"primary"}`},B.confirmLabel||"OK").on({click:J}))))}function Z4(A,Q){let B=A.openerId||A.current||A.openers[0]?.id,C=!!A.remember,J=()=>{if(C&&B)Q.engine.dispatch(new CC(s8(A.node),B));Q.engine.dispatch(new PA),Q.engine.dispatch(new IQ(A.node,B,{reset:!!A.reset}))};return _({},_({className:"scrim"}).on({click:()=>Q.engine.dispatch(new PA)}),_({className:"dialog opener-chooser"},jE(`Open “${A.node.name}” with…`),_({className:"opener-list"},...A.openers.map((K)=>fQ({className:`opener-opt ${K.id===B?"sel":""}`},vQ({type:"radio",name:"opener-choice",checked:K.id===B}).on({change:()=>Q.engine.dispatch(new sB({openerId:K.id}))}),U(K.icon||ZQ(A.node),{size:18}),_({className:"oo-main"},bA({className:"oo-title"},K.title||K.id),bA({className:"oo-src"},K.source))).on({click:()=>Q.engine.dispatch(new sB({openerId:K.id}))}))),fQ({className:"opener-remember"},vQ({type:"checkbox",checked:C}).on({change:(K)=>Q.engine.dispatch(new sB({remember:K.target.checked}))}),bA(`Always use this for ${i8(A.node)}`)),_({className:"row-actions"},vA({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new PA)}),vA({className:"btn primary"},"Open").on({click:J}))))}var NX="collectionDialog";function D4(A,Q,B,C){let J=B?.storageDrivers||[],K={name:"",description:"",driver:J[0]?.key||"",encrypt:!1,encryptWhat:"all",encryptList:""},E=mC(C,NX,A,{form:K}),Y=E.form,L=J.find((I)=>I.key===Y.driver)||J[0],X=(I)=>(F)=>{let V=F.target.type==="checkbox"?F.target.checked:F.target.value;Q.engine.dispatch(new iJ(NX,E.ref,{[I]:V},K))},H=()=>{let I={driver:Y.driver};for(let F of L?.fields||[]){let V=Y[F.name];if(V!==void 0&&V!=="")I[F.name]=F.type==="number"?Number(V):V}Q.engine.dispatch(new sJ({name:Y.name,description:Y.description,store:I,encryption:W4(Y)}))},G=(I,F,V="")=>_({className:"field",$styling:{"margin-bottom":"10px"}},fQ(I),vQ({className:"input",placeholder:V}).on({input:X(F)})),Z=Y.encrypt&&Y.encryptWhat!=="all"&&!PX(Y.encryptList).length?Y.encryptWhat==="extensions"?"Name at least one extension, or choose every file.":"Name at least one media type, or choose every file.":null,M=!!Y.name.trim()&&!!Y.driver&&!Z&&(L?.fields||[]).every((I)=>!I.required||String(Y[I.name]??"").trim());return _({},_({className:"scrim"}).on({click:()=>Q.engine.dispatch(new PA)}),_({className:"dialog",$styling:{width:"min(480px, 94vw)"}},jE("New collection"),_({className:"body"},"A collection is a backing store you own. Configure where its files live."),G("Name","name","Team Vault"),J.length?_({className:"field",$styling:{"margin-bottom":"10px"}},fQ("Backing store"),qX({className:"input"},...J.map((I)=>M0({value:I.key,selected:Y.driver===I.key},I.label))).on({change:X("driver")})):_({className:"body"},"This server has no storage drivers registered, so a collection cannot be created."),L?U4(L,Y,X):null,I4(Y,X,B,Z),_({className:"row-actions"},vA({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new PA)}),vA({className:"btn primary",$attrs:M?{}:{disabled:"true"}},"Create collection").on({click:()=>M&&H()}))))}function W4(A){if(!A.encrypt)return null;let Q=PX(A.encryptList);return{enabled:!0,rules:A.encryptWhat==="all"?{all:!0}:A.encryptWhat==="extensions"?{extensions:Q}:{mimeTypes:Q}}}function PX(A){return String(A||"").split(/[\s,]+/).map((Q)=>Q.trim()).filter(Boolean)}function I4(A,Q,B,C){let J=(B?.indexers||[]).filter((K)=>K.readsContent!==!1);return _({className:"field enc-section",$styling:{"margin-bottom":"10px"}},fQ({className:"enc-toggle"},vQ({type:"checkbox",checked:!!A.encrypt}).on({change:Q("encrypt")}),bA("Encrypt files in this collection")),!A.encrypt?_({className:"enc-hint"},"Files are stored exactly as uploaded."):_({className:"enc-body"},_({className:"field"},fQ("What to encrypt"),qX({className:"input"},M0({value:"all",selected:A.encryptWhat==="all"},"Every file"),M0({value:"extensions",selected:A.encryptWhat==="extensions"},"Only these extensions"),M0({value:"mimeTypes",selected:A.encryptWhat==="mimeTypes"},"Only these media types")).on({change:Q("encryptWhat")})),A.encryptWhat!=="all"?_({className:"field"},vQ({className:"input",value:A.encryptList,placeholder:A.encryptWhat==="extensions"?".pdf, .docx, .key":"image, application/pdf"}).on({input:Q("encryptList")}),_({className:"enc-hint"},A.encryptWhat==="extensions"?"Separated by commas. The leading dot is optional.":"Separated by commas. “image” covers every image type.")):null,C?_({className:"enc-problem"},U("warn",{size:13}),bA(C)):null,_({className:"enc-scope"},_({className:"es-title"},"What this does"),_({className:"es-line"},"Files are sealed in your browser before they are uploaded, so the storage provider only ever holds ciphertext."),_({className:"es-title"},"What it does not do"),_({className:"es-line"},"It is not end-to-end. The drive holds the key and decrypts for anything that reads through it — previews, downloads, and search indexing."),J.length?_({className:"es-line"},`These read file contents in the clear: ${J.map((K)=>K.title||K.id).join(", ")}.`):null,_({className:"es-line note"},"This applies to files uploaded from now on. Turning it off later does not decrypt anything already sealed."))))}function U4(A,Q,B){if(!A.fields.length)return _({className:"body",$styling:{"font-size":"12px"}},A.description||"This store needs no configuration.");return _({},A.description?_({className:"body",$styling:{"font-size":"12px","margin-bottom":"10px"}},A.description):null,...A.fields.map((C)=>C.type==="boolean"?_({className:"field",$styling:{"margin-bottom":"10px"}},fQ({},vQ({type:"checkbox"}).on({change:B(C.name)}),` ${C.label}`),C.help?_({className:"body",$styling:{"font-size":"11.5px"}},C.help):null):_({className:"field",$styling:{"margin-bottom":"10px"}},fQ(C.label+(C.required?"":" (optional)")),vQ({className:"input",placeholder:C.placeholder,autocomplete:"off",type:C.type==="password"||C.secret?"password":C.type==="number"?"number":"text"}).on({input:B(C.name)}),C.help?_({className:"body",$styling:{"font-size":"11.5px"}},C.help):null)))}function OX(A,Q){let B=A.overlay.contextMenu;if(!B||!B.items?.length)return null;let C=Math.min(B.items.length*34+20,window.innerHeight-24),J=Math.max(8,Math.min(B.x,window.innerWidth-220)),K=Math.max(8,Math.min(B.y,window.innerHeight-C));return _({},_({className:"scrim",$styling:{background:"transparent"}}).on({click:()=>Q.engine.dispatch(new FB),contextmenu:(E)=>{E.preventDefault(),Q.engine.dispatch(new FB)}}),_({className:"menu",$styling:{left:J+"px",top:K+"px"}},...B.items.map((E,Y)=>E.sep?_({className:"sep"}):vA({className:`mi ${E.danger?"danger":""}`,autofocus:Y===0},E.icon?U(E.icon,{size:15}):null,bA(E.label),E.kbd?bA({className:"kbd"},E.kbd):null).on({click:()=>{Q.engine.dispatch(new FB),aA(Q,E)},keydown:(L)=>{if(L.key==="Escape")L.preventDefault(),Q.engine.dispatch(new FB)},$attach:(L)=>{if(Y===0)queueMicrotask(()=>L.focus())}}))))}function jX(A,Q){let B=A.notif||[];if(!B.length)return null;return _({className:"toasts"},...B.slice(-5).map((C)=>_({className:`toast ${C.level}`},_({className:"bar"}),_({className:"msg"},C.message),vA({className:"x"},U("close",{size:14})).on({click:()=>Q.engine.dispatch(new NJ(C.id))})).key(C.id)))}function _X(A,Q){let B=A.tr.items;if(!B.length)return null;return _({className:"tray"},_({className:"head"},U("upload",{size:14}),bA({$styling:{"margin-left":"6px"}},"Transfers"),_({className:"actions"},vA({className:"iconbtn",title:"Clear finished"},U("check",{size:14})).on({click:()=>Q.engine.dispatch(new gJ)}))),_({className:"items"},...B.map((C)=>_({className:`xfer ${C.status}`},_({className:"top"},U(C.status==="error"?"warn":C.status==="done"?"check":"upload",{size:14}),bA({className:"name"},C.name),C.status==="active"?vA({className:"iconbtn",title:"Cancel"},U("close",{size:13})).on({click:()=>Q.engine.dispatch(new AC(C.id))}):bA({className:"pct"},C.status==="done"?KA(C.total):C.status)),C.status==="active"?_({className:"progress"},_({$styling:{width:`${Math.round(C.ratio*100)}%`}})):C.error?_({$styling:{"font-size":"11px",color:"var(--danger)","margin-top":"4px"}},C.error):null,C.status==="active"?_({className:"pct",$styling:{"margin-top":"4px"}},`${KA(C.loaded)} / ${KA(C.total)}`):null,(C.status==="error"||C.status==="cancelled")&&C.retryable?_({className:"xfer-actions"},vA({className:"btn small"},U("refresh",{size:12}),bA("Retry")).on({click:()=>Q.engine.dispatch(new xJ(C.id))}),vA({className:"btn small ghost"},"Dismiss").on({click:()=>Q.engine.dispatch(new kJ(C.id))})):null).key(C.id))))}function SX(A,Q){let B=A.overlay.pluginPanel;if(!B)return null;let C=(A.plugins||[]).find((J)=>J.id===B);return _({className:"plugin-panel",$styling:{width:"380px"}},_({className:"head"},U("plug",{size:14}),bA(C?.name||B),vA({className:"iconbtn x"},U("close",{size:14})).on({click:()=>Q.engine.dispatch(new jJ)})),_({className:"host"}).on({$attach:(J)=>{J._detach=Q.platform.plugins.mountPanel(B,J,{width:380,height:460})},$detach:(J)=>J._detach?.()}))}var{div:l,button:VQ,span:IC,h3:F4,p:TX,pre:M4}=w,R4={running:"refresh",done:"check",failed:"close",cancelled:"close"};function V4(A,Q){Q.engine.dispatch(new rA(A))}function wX(A){if(A.total==null)return null;return A.unit==="bytes"?`${KA(A.done||0)} of ${KA(A.total)}`:`${A.done||0} of ${A.total}${A.unit?` ${A.unit}`:""}`}function xX(A,Q){let B=A.status==="running",C=B&&A.total!=null&&A.total>0,J=C?Math.min(100,Math.round((A.done||0)/A.total*100)):0;return l({className:`act-task act-${A.status}`,"data-task-id":A.id},l({className:"act-row"},B?l({className:"spinner",$styling:{width:"12px",height:"12px"}}):U(R4[A.status]||"info",{size:13}),l({className:"act-body"},l({className:"act-title"},A.title),A.detail?l({className:"act-detail"},A.detail):null,A.error?l({className:"act-error"},A.error):null),B&&A.cancellable?VQ({className:"act-action",title:"Cancel"},U("close",{size:12})).on({click:()=>Q.engine.dispatch(new _J(A.id))}):!B?VQ({className:"act-action",title:"Dismiss"},U("close",{size:12})).on({click:()=>Q.engine.dispatch(new SJ(A.id))}):null),B?l({className:`act-bar ${C?"":"indeterminate"}`},l({className:"act-fill",$styling:C?{width:`${J}%`}:{}})):null,B&&wX(A)?l({className:"act-amount"},wX(A)):null)}function N4(A,Q){let B=new Date(A.firstAt||A.lastAt).toLocaleString();return l({className:`act-issue act-sev-${A.severity||"error"}`,"data-issue-id":A.id},l({className:"act-row"},U(A.severity==="warning"?"info":"close",{size:13}),l({className:"act-body"},l({className:"act-title"},A.title),A.detail?l({className:"act-detail"},A.detail):null,A.remedy?M4({className:"act-remedy"},A.remedy):null,l({className:"act-meta"},A.count>1?`${A.count} times, since ${B}`:`since ${B}`))),l({className:"act-actions"},A.remedy?VQ({className:"btn small ghost"},"Copy fix").on({click:()=>V4(A.remedy,Q)}):null,A.retryable?VQ({className:"btn small act-retry"},U("refresh",{size:12}),IC("Retry")).on({click:()=>Q.engine.dispatch(new TJ(A.id))}):null,VQ({className:"btn small ghost act-dismiss"},"Dismiss").on({click:()=>Q.engine.dispatch(new wJ(A.id))})))}function _E(A,Q){let B=A.act||{tasks:[],issues:[]};if(!B.open)return null;let C=B.tasks.filter((K)=>K.status==="running"),J=B.tasks.filter((K)=>K.status!=="running");return l({className:"activity-panel"},l({className:"act-head"},F4("Activity"),VQ({className:"act-action",title:"Close"},U("close",{size:13})).on({click:()=>Q.engine.dispatch(new cA(!1))})),B.tasksError||B.issuesError?l({className:"act-offline"},U("info",{size:12}),IC(`Couldn't reach the server — this list may be out of date (${B.issuesError||B.tasksError})`)):null,l({className:"act-section"},l({className:"act-section-title"},"Running"),C.length?l(...C.map((K)=>xX(K,Q))):TX({className:"act-empty"},"Nothing running.")),B.issues.length?l({className:"act-section"},l({className:"act-section-title"},`Needs attention (${B.issues.length})`),l(...B.issues.map((K)=>N4(K,Q)))):l({className:"act-section"},l({className:"act-section-title"},"Needs attention"),TX({className:"act-empty"},B.issuesError?"Could not load the list of problems.":B.issuesLoading?"Checking…":"No standing problems.")),J.length?l({className:"act-section"},l({className:"act-section-title"},"Recently finished"),l(...J.map((K)=>xX(K,Q)))):null,l({className:"act-foot act-actions"},VQ({className:"btn small ghost act-rebuild"},U("refresh",{size:12}),IC("Rebuild search index")).on({click:()=>Q.engine.dispatch(new z("workbench.rebuildIndex"))}),VQ({className:"btn small ghost act-scan"},U("refresh",{size:12}),IC("Scan for outside changes")).on({click:()=>Q.engine.dispatch(new z("workbench.scanCollection"))}),VQ({className:"btn small ghost act-storage"},U("plug",{size:12}),IC("Check storage")).on({click:()=>Q.engine.dispatch(new z("workbench.checkStorage"))})))}var{div:ZA,button:JB,span:EQ,img:yX}=w,kX=[{id:"home",icon:"search",label:"Files",command:"workbench.view.home"},{id:"upload",icon:"upload",label:"Upload",command:"explorer.upload"},{id:"plugins",icon:"plug",label:"Plugins",command:"workbench.view.plugins"}],gX={offline:{icon:"info",tone:"warn"},issues:{icon:"warn",tone:"danger"},working:{spinner:!0,tone:""},lowSpace:{icon:"info",tone:"warn"},idle:{icon:"info",tone:""}};function hX(A,Q){let B=A.facts,C=B.condition,J={...gX[C.kind]||gX.idle,label:C.label,badge:C.kind==="issues"?C.count:0},K=A.wb.activity==="settings"?"Settings":A.wb.activity==="plugins"?"Plugins":B.collectionLabel;return ZA({className:"phonebar top"},JB({className:"pb-brand",title:"Trove — home"},yX({src:"/icon.svg",alt:"Trove"})).on({click:()=>Q.engine.dispatch(new z("workbench.view.home"))}),ZA({className:"pb-title"},K),JB({className:`pb-status ${J.tone}`,title:J.label,$attrs:{"aria-label":J.label}},J.spinner?ZA({className:"spinner",$styling:{width:"15px",height:"15px"}}):U(J.icon,{size:18}),J.badge?EQ({className:"pb-badge"},String(J.badge>9?"9+":J.badge)):null).on({click:()=>Q.engine.dispatch(new oC("status"))}))}function bX(A,Q){let B=A.wb.activity,C=A.wb.sheet,J=A.so.notifications.unread;return ZA({className:"phonebar bottom"},...kX.map((K)=>JB({className:`pb-tab ${!C&&B===K.id?"active":""}`,$attrs:{"aria-label":K.label}},U(K.icon,{size:21}),EQ({className:"pb-label"},K.label)).on({click:()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new z(K.command))}})),JB({className:`pb-tab ${C==="more"||!C&&!kX.some((K)=>K.id===B)?"active":""}`,$attrs:{"aria-label":"More"}},U("dots",{size:21}),J?EQ({className:"pb-badge"},String(J>9?"9+":J)):null,EQ({className:"pb-label"},"More")).on({click:()=>Q.engine.dispatch(new oC("more"))}))}function jA({icon:A,label:Q,value:B,danger:C,onClick:J}){let K=[U(A,{size:18}),EQ({className:"sr-label"},Q),B!=null?EQ({className:"sr-value"},B):null,J?U("chevron-right",{size:16,className:"sr-go"}):null];return J?JB({className:`sheet-row ${C?"danger":""}`},...K).on({click:J}):ZA({className:"sheet-row static"},...K)}function vX(A,Q){let B=A.wb.sheet;if(!B)return null;return ZA({className:"sheet-wrap"},ZA({className:"scrim"}).on({click:()=>Q.engine.dispatch(new lA)}),ZA({className:"sheet"},ZA({className:"sheet-grip"}).on({click:()=>Q.engine.dispatch(new lA)}),B==="status"?q4(A,Q):z4(A,Q)))}function q4(A,Q){let B=A.facts,C=(J)=>()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new z(J))};return ZA({className:"sheet-body"},ZA({className:"sheet-title"},B.collectionLabel),B.issues.length?jA({icon:"warn",danger:!0,label:`${B.issues.length} need${B.issues.length===1?"s":""} attention`,onClick:()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new cA(!0))}}):null,B.running.length||B.uploading.length?jA({icon:"refresh",label:`${B.running.length+B.uploading.length} running`,onClick:()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new cA(!0))}}):null,!B.off.online?jA({icon:"info",label:"Offline",value:`${B.off.pins.length} pinned`}):null,B.off.queued?jA({icon:"upload",label:"Waiting to sync",value:String(B.off.queued)}):null,jA({icon:"files",label:"Items",value:B.partial?`${B.shown.toLocaleString()} of ${B.totalKnown?B.totalItems.toLocaleString():"more"}`:B.totalItems.toLocaleString()}),jA({icon:"file",label:"Size",value:`${KA(B.totalBytes)}${B.totalKnown||!B.partial?"":"+"}`}),B.usage?.total?ZA({className:"sheet-row static usage"},U("download",{size:18}),EQ({className:"sr-label"},"Free space"),XE(B)):null,A.caps?jA({icon:A.caps.storage?.presignDownload?"download":"files",label:"Transfers",value:A.caps.storage?.presignDownload?"Direct to storage":"Through the server"}):null,A.caps?.features?.semanticSearch?jA({icon:"star",label:"Search",value:"Semantic + keyword"}):null,ZA({className:"sheet-actions"},JB({className:"btn small ghost"},U("refresh",{size:13}),EQ("Scan for changes")).on({click:C("workbench.scanCollection")}),JB({className:"btn small ghost"},U("refresh",{size:13}),EQ("Activity")).on({click:()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new cA(!0))}})))}function z4(A,Q){let B=(K)=>()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new z(K))},C=A.so.me,J=A.so.notifications.unread;return ZA({className:"sheet-body"},C&&!C.anonymous?ZA({className:"sheet-me"},C.picture?yX({src:C.picture,alt:"",className:"avatar-img"}):EQ({className:"avatar-txt"},(C.name||C.id||"?")[0].toUpperCase()),ZA({},ZA({className:"sm-name"},C.name||C.id),C.email?ZA({className:"sm-sub"},C.email):null)):null,jA({icon:"bell",label:J?`Notifications (${J})`:"Notifications",onClick:()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new UQ(!0))}}),jA({icon:"refresh",label:"Activity & problems",onClick:()=>{Q.engine.dispatch(new lA),Q.engine.dispatch(new cA(!0))}}),jA({icon:"info",label:"Details & conversation",onClick:B("workbench.toggleInfoPanel")}),jA({icon:"trash",label:"Trash",onClick:B("explorer.showTrash")}),jA({icon:"refresh",label:"Refresh",onClick:B("explorer.refresh")}),jA({icon:"command",label:"All commands",onClick:B("workbench.showCommandPalette")}),jA({icon:"gear",label:"Settings",onClick:B("workbench.openSettings")}))}var{alias:P4,div:YQ}=w;function SE({engine:A,platform:Q}){let B={engine:A,platform:Q,watch:XQ},C=r([i(A,E0),i(A,AE),i(A,eK),i(A,LC),i(A,iK),i(A,XL),i(A,Y0),i(A,K0),i(A,GL),i(A,HL),i(A,X0),i(A,GC),i(A,NL),i(A,BE(!1)),i(A,BE(!0)),i(A,FL),i(A,UL)],(E,Y,L,X,H,G,Z,M,I,F,V,g,u,j,T,c,y)=>({wb:E,overlay:Y,nav:L,ex:X,se:H,ctx:G,settings:Z,off:M,vp:I,voice:F,view:V,caps:g,commandKeys:u,content:j,modalContent:T,views:c,openers:y})),J={ex:LC,tr:rK,act:J0,off:K0,so:XC,wb:E0,statusItems:DL,caps:GC,facts:IL},K={statusBar:NA(A,J,(E)=>GE(E,B),{placeholder:()=>YQ({className:"statusbar"})}),phoneTopBar:NA(A,J,(E)=>hX(E,B),{placeholder:()=>YQ({className:"phonebar top"})}),phoneBottomBar:NA(A,J,(E)=>bX(E,B),{placeholder:()=>YQ({className:"phonebar bottom"})}),phoneSheet:NA(A,J,(E)=>vX(E,B)),transferTray:NA(A,{tr:rK},(E)=>_X(E,B)),toasts:NA(A,{notif:YL},(E)=>jX(E,B)),activityPanel:NA(A,{act:J0},(E)=>_E(E,B)),settingsView:NA(A,{settings:Y0,settingsGroups:LL,keys:EL,caps:GC,ex:LC,assoc:RL},(E)=>WE(E,B)),pluginsView:NA(A,{plugins:L0,settings:Y0},(E)=>RE(E,B)),adminView:NA(A,{caps:GC,ex:LC,plugins:L0,act:J0,so:XC},(E)=>VE(E,B)),infoPanel:NA(A,{so:XC,off:K0,nav:eK},(E)=>_L(E,B)),activityBar:NA(A,{wb:E0,plugins:L0,so:XC},(E)=>LE(E,B)),commandPalette:NA(A,{overlay:AE,se:iK,matches:ZL},(E)=>OE(E,B))};return P4(()=>XQ(C,(E)=>O4(E,B,K)))}function O4(A,Q,B){let C=A.vp?.mode||"desktop",J=C==="phone";return YQ({className:`shell ${C} ${A.settings["workbench.density"]==="compact"?"compact":""}`},J?B.phoneTopBar():null,YQ({className:"body"},J?null:B.activityBar(),j4(A,Q,B)),J?B.phoneBottomBar():B.statusBar(),J?B.phoneSheet():null,_4(A,Q),B.commandPalette(),zX(A,Q),OX(A,Q),SX(A,Q),B.toasts(),B.transferTray(),B.activityPanel())}function j4(A,Q,B){if(A.ex?.gate&&A.wb.activity!=="settings")return FE(A,Q);switch(A.wb.activity){case"settings":return B.settingsView();case"plugins":return B.pluginsView();case"admin":return B.adminView();default:{if(!A.nav.activeTabId)return D0(A,Q);if(!A.wb.infoPanel)return F0(A,Q);return A.vp?.mode==="phone"?B.infoPanel():YQ({className:"editor-split"},F0(A,Q),B.infoPanel())}}}function _4(A,Q){if(!A.wb.searchModal)return YQ();return YQ({className:"search-modal"},YQ({className:"scrim"}).on({click:()=>Q.engine.dispatch(new MB)}),YQ({className:"search-modal-panel"},D0(A,Q,{modal:!0})))}function uX({root:A=document.querySelector(".workbench"),baseUrl:Q="",openers:B=[],views:C=[],settings:J=[],serviceWorker:K=!0}={}){let E=pY({baseUrl:Q}),{engine:Y,app:L}=rY(E);if(GX(E),mL(E),fX(E,"opener",B),fX(E,"view",C),J.length)E.settings.register(J);E.plugins.restore();let X=SE({engine:Y,platform:E});w.reconcile(A,[X()]);let H=()=>{document.documentElement.dataset.theme=E.settings.get("workbench.theme")||"dark"};if(H(),_Q(E.settings.observe(),()=>H()),E.viewport.install(),E.voice.refresh().catch(()=>{}),E.spatialNav.install(),E.keybindings.install(window),window.addEventListener("popstate",(G)=>L.navigation.onPopState(G)),S4(Y),K&&"serviceWorker"in navigator)window.addEventListener("load",()=>navigator.serviceWorker.register("/sw.js").catch(()=>{}));return T4(Y,L),(async()=>{try{}catch(G){E.notifications.error(`Cannot reach the Trove server: ${G.message}`)}Y.dispatch(new aC)})(),window.__trove={platform:E,engine:Y,app:L,test:{parsePackage:aQ,assessTrust:(G)=>E.plugins.assessTrust(G),install:(G,Z)=>E.plugins.install(G,Z),NavigateAction:kA,attachMedia:PB}},{platform:E,engine:Y,app:L}}function fX(A,Q,B){for(let C of B){if(!C?.id)throw Error(`A ${Q} passed to createWorkbench needs an "id"`);let{id:J,...K}=C;A.contributions.register(J,{type:Q,...K})}}function S4(A){let Q=0;window.addEventListener("keydown",(B)=>{if(B.key==="Shift"&&!B.repeat){let C=Date.now();if(C-Q<400)A.dispatch(new PJ),Q=0;else Q=C}else if(B.key!=="Shift")Q=0})}function T4(A,Q){let B=0;window.addEventListener("dragenter",(C)=>{if(!C.dataTransfer?.types.includes("Files"))return;B++,document.body.classList.add("dragging-file")}),window.addEventListener("dragover",(C)=>{if(C.dataTransfer?.types.includes("Files"))C.preventDefault()}),window.addEventListener("dragleave",()=>{if(--B<=0)B=0,document.body.classList.remove("dragging-file")}),window.addEventListener("drop",(C)=>{if(!C.dataTransfer?.files?.length)return;C.preventDefault(),B=0,document.body.classList.remove("dragging-file"),A.dispatch(new oB(C.dataTransfer.files))})}uX();
354
+
355
+ //# debugId=EBBC87CA5F602D4E64756E2164756E21
356
+ //# sourceMappingURL=main-jg5vmp8f.js.map