@3sln/trove 0.0.11 → 0.0.13

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 (90) hide show
  1. package/README.md +13 -1
  2. package/package.json +2 -1
  3. package/packages/core/src/collections/index.js +71 -10
  4. package/packages/core/src/encryption/keys.js +4 -3
  5. package/packages/core/src/encryption/policy.js +14 -7
  6. package/packages/core/src/encryption/rotation.js +46 -12
  7. package/packages/core/src/errors.js +8 -0
  8. package/packages/core/src/index.js +8 -2
  9. package/packages/core/src/indexers/contribution.js +18 -17
  10. package/packages/core/src/indexing.js +8 -4
  11. package/packages/core/src/issues.js +8 -0
  12. package/packages/core/src/links.js +21 -9
  13. package/packages/core/src/metadata/interface.js +22 -0
  14. package/packages/core/src/metadata/memory.js +15 -0
  15. package/packages/core/src/metadata/sqlite.js +23 -1
  16. package/packages/core/src/plugins/contributions.js +13 -0
  17. package/packages/core/src/rateLimit.js +253 -0
  18. package/packages/core/src/scan.js +44 -16
  19. package/packages/core/src/sidecar/document.js +18 -14
  20. package/packages/core/src/sidecar/index.js +9 -10
  21. package/packages/core/src/sidecar/manager.js +10 -15
  22. package/packages/core/src/uploads.js +40 -15
  23. package/packages/core/src/vfs.js +59 -34
  24. package/packages/plugin-sdk/src/browser.js +155 -0
  25. package/packages/plugin-sdk/src/protocol.js +13 -1
  26. package/packages/server/src/access/externalEvaluation.js +17 -0
  27. package/packages/server/src/adapters/bun.js +1 -2
  28. package/packages/server/src/adapters/node.js +1 -2
  29. package/packages/server/src/engine/index.js +1 -1
  30. package/packages/server/src/engine/providers/access.js +17 -34
  31. package/packages/server/src/engine/providers/core.js +112 -14
  32. package/packages/server/src/index.js +160 -105
  33. package/packages/server/src/mcp/index.js +7 -12
  34. package/packages/server/src/mcp/tools.js +24 -29
  35. package/packages/server/src/router.js +31 -8
  36. package/packages/server/src/routes.js +74 -113
  37. package/packages/server/src/scope.js +78 -0
  38. package/packages/web/dist/assets/main-828yzsr7.js +511 -0
  39. package/packages/web/dist/assets/main-828yzsr7.js.map +120 -0
  40. package/packages/web/dist/index.html +1 -1
  41. package/packages/web/dist/sw.js +1 -1
  42. package/packages/web/src/bl/actions.js +226 -104
  43. package/packages/web/src/bl/activity.js +32 -82
  44. package/packages/web/src/bl/index.js +23 -11
  45. package/packages/web/src/bl/launcher.js +2 -9
  46. package/packages/web/src/bl/links.js +31 -18
  47. package/packages/web/src/bl/offline.js +24 -10
  48. package/packages/web/src/bl/pluginInstall.js +29 -26
  49. package/packages/web/src/bl/queries.js +76 -68
  50. package/packages/web/src/bl/services.js +22 -14
  51. package/packages/web/src/bl/social.js +39 -25
  52. package/packages/web/src/bl/state.js +22 -4
  53. package/packages/web/src/bl/viewState.js +9 -0
  54. package/packages/web/src/bl/watchQuery.js +1 -8
  55. package/packages/web/src/dispatch.js +26 -0
  56. package/packages/web/src/platform/api.js +32 -0
  57. package/packages/web/src/platform/commands.js +14 -15
  58. package/packages/web/src/platform/context.js +3 -58
  59. package/packages/web/src/platform/contributions.js +1 -35
  60. package/packages/web/src/platform/fileChunks.js +281 -0
  61. package/packages/web/src/platform/index.js +8 -9
  62. package/packages/web/src/platform/mediaUrls.js +10 -0
  63. package/packages/web/src/platform/navigation.js +35 -21
  64. package/packages/web/src/platform/pickers.js +39 -19
  65. package/packages/web/src/platform/pluginHost.js +4 -1
  66. package/packages/web/src/platform/pluginRpc.js +47 -2
  67. package/packages/web/src/platform/spatialNav.js +1 -1
  68. package/packages/web/src/platform/viewport.js +14 -6
  69. package/packages/web/src/platform/voiceSearch.js +17 -9
  70. package/packages/web/src/platform/whenclause.js +9 -19
  71. package/packages/web/src/runtime.js +2 -37
  72. package/packages/web/src/ui/activate.js +18 -2
  73. package/packages/web/src/ui/components/activityPanel.js +1 -1
  74. package/packages/web/src/ui/components/adminView.js +4 -7
  75. package/packages/web/src/ui/components/editorArea.js +10 -1
  76. package/packages/web/src/ui/components/launcher.js +29 -13
  77. package/packages/web/src/ui/components/openers/index.js +17 -22
  78. package/packages/web/src/ui/components/openers/markdown.js +2 -2
  79. package/packages/web/src/ui/components/overlays.js +31 -5
  80. package/packages/web/src/ui/components/pluginReview.js +7 -4
  81. package/packages/web/src/ui/components/pluginsView.js +1 -1
  82. package/packages/web/src/ui/components/settingsView.js +30 -27
  83. package/packages/web/src/ui/components/statusBar.js +8 -6
  84. package/packages/web/src/ui/components/views/grid.js +2 -2
  85. package/packages/web/src/ui/components/views/parts.js +1 -1
  86. package/packages/web/src/ui/compositions/workbench.js +20 -6
  87. package/packages/web/src/ui/sanitize.js +0 -5
  88. package/packages/web/src/workbench.js +37 -19
  89. package/packages/web/dist/assets/main-c9dnnnc6.js +0 -356
  90. package/packages/web/dist/assets/main-c9dnnnc6.js.map +0 -118
@@ -1,356 +0,0 @@
1
- import{a as GH,c as D1,d as HH}from"./chunk-4xqbzebh.js";var bB={};D1(bB,{wbr:()=>z6,video:()=>T6,vdom:()=>P0,ul:()=>e1,u:()=>q6,track:()=>S6,tr:()=>i6,title:()=>V1,time:()=>N6,thead:()=>o6,th:()=>s6,tfoot:()=>n6,textarea:()=>GG,template:()=>WG,td:()=>a6,tbody:()=>d6,table:()=>c6,svg:()=>v6,sup:()=>V6,summary:()=>ZG,sub:()=>R6,style:()=>z1,strong:()=>M6,special:()=>F1,span:()=>F6,source:()=>b6,small:()=>I6,slot:()=>DG,settings:()=>R1,select:()=>LG,section:()=>u1,script:()=>P1,schedule:()=>UG,samp:()=>U6,s:()=>W6,reconcile:()=>M1,q:()=>D6,progress:()=>XG,pre:()=>t1,portal:()=>h6,picture:()=>y6,param:()=>g6,p:()=>r1,output:()=>YG,option:()=>EG,optgroup:()=>KG,ol:()=>i1,object:()=>x6,noscript:()=>O1,nav:()=>f1,meter:()=>JG,meta:()=>N1,math:()=>f6,mark:()=>Z6,map:()=>_6,main:()=>v1,link:()=>q1,li:()=>o1,legend:()=>CG,label:()=>BG,kbd:()=>$6,ins:()=>H6,input:()=>QG,img:()=>j6,iframe:()=>k6,i:()=>G6,html:()=>NC,hr:()=>s1,header:()=>w1,h6:()=>b1,h5:()=>h1,h4:()=>y1,h3:()=>g1,h2:()=>x1,h1:()=>k1,h:()=>U1,form:()=>AG,footer:()=>T1,flush:()=>IG,figure:()=>n1,figcaption:()=>a1,fieldset:()=>e6,embed:()=>w6,em:()=>L6,dt:()=>d1,dodo:()=>cE,dl:()=>c1,div:()=>l1,dialog:()=>$G,dfn:()=>X6,details:()=>HG,del:()=>Y6,dd:()=>p1,datalist:()=>t6,data:()=>E6,colgroup:()=>l6,col:()=>p6,code:()=>K6,clear:()=>FG,cite:()=>J6,caption:()=>m6,canvas:()=>u6,button:()=>r6,br:()=>C6,blockquote:()=>m1,b:()=>B6,audio:()=>O6,aside:()=>S1,article:()=>_1,area:()=>P6,alias:()=>I1,address:()=>j1,abbr:()=>Q6,a:()=>A6});var dQ=Symbol("ELEMENT_NODE"),VC=Symbol("ALIAS_NODE"),$B=Symbol("SPECIAL_NODE"),hB=Symbol("OPAQUE_NODE"),SA=Symbol("NODE_STATE");var J1=new Set(["__proto__","constructor","prototype"]),mE=(A,Q)=>Object.prototype.hasOwnProperty.call(A,Q);function K1(A,Q){return typeof Q==="string"&&A.toLowerCase()===Q.toLowerCase()}class ZB{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!==dQ)throw Error(".opaque() can only be used on element nodes (h).");return this.type=hB,this}}function E1(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(!mE(Q,C)||A[C]!==Q[C])return!0;return!1}}return!0}function Y1(A){return Array.isArray(A)||A!=null&&typeof A[Symbol.iterator]==="function"&&typeof A!=="string"}function X1(A){return(...Q)=>new ZB(VC,A,Q)}function L1(A){return(...Q)=>new ZB($B,A,Q)}function G1(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 pE(A){return{originalProps:Object.create(null),newVdom:A}}function z0(A,Q,B){let C=A.ownerDocument.createElementNS(G1(A,Q),Q);return C[SA]=pE(B),C}var lE=new WeakMap;function H1(A){let Q=[],B=A;while(B)if(Q.push(B),B.parentElement)B=B.parentElement;else B=B.getRootNode()?.host;return Q}function uE(A,Q){for(let B of Q)A.add(B)}function $1(A,Q){let B=Q??A?.defaultView??globalThis;return B.Node?.prototype??B.Element?.prototype}function Z1(A){let Q=new Set;return A.addEventListener("focusin",(B)=>{Q.clear(),uE(Q,B.composedPath())}),A.addEventListener("focusout",(B)=>{if(!B.relatedTarget)Q.clear()}),uE(Q,H1(A.activeElement)),lE.set(A,Q),Q}var P0=(A)=>{let Q=A?.shouldUpdate??E1,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,$}),X=A?.isSeq??Y1,L=A?.seqIter??(($)=>$),G=A?.convertName??(($)=>$),H=A?.convertTagName??G,Z=A?.convertPropName??G,F=A?.convertStyleName??G,U=A?.convertDataName??G,M=A?.convertClassName??G,V=A?.convertHookName??G,x=A?.listenerKey??"listener",m=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 h($,W,D,P,k){if($==null)return;for(let S in $)if(mE($,S))W(S,$[S],D,P,k)}function v($,W,D,P,k){if($==null)return;let S=c(C($)),n;while(!(n=S.next()).done){let GA=n.value;W(GA[0],GA[1],D,P,k)}}let z=A?.mapEach??(A?.mapIter?v:h);function g($){return $===null||$===void 0||$===!1}function AA($,W,D){let P=c(L(W)),k;while(!(k=P.next()).done){let S=k.value;if(D&&g(S))continue;if(!X(S))$.push(S);else AA($,S,D)}}function QA($,W){let D=[];return AA(D,$,W),D}let BA=A?.flattenSeq??QA;function BQ($,W){let D=[];for(let P=W;P<$.length;P++){let k=$[P];if(g(k))continue;if(!X(k))D.push(k);else AA(D,k,!0)}return D}function UA($){return g($)?"":String($)}function IA($,W,...D){if(!B(W)){if(W!==null&&W!==void 0)D.unshift(W);W=T}return new ZB(dQ,H($),[W,...D])}function XA($,W,D){D.setProperty(F($),W)}function e($,W,D,P){if(J(P,$)!==void 0)return;D.removeProperty(F($))}function DA($,W,D){let P=$.style;z(D,XA,P),z(W,e,P,D)}function LA($,W,D){D.setAttribute(Z($),W)}function lQ($,W,D,P){if(J(P,$)!==void 0)return;D.removeAttribute(Z($))}function zA($,W,D){z(D,LA,$),z(W,lQ,$,D)}function oA($,W,D){D.dataset[U($)]=W}function PA($,W,D,P){if(J(P,$)!==void 0)return;delete D.dataset[U($)]}function FA($,W,D){z(D,oA,$),z(W,PA,$,D)}function t($,W,D){let P=new Set;for(let k of BA(W,!0)){let S=M(k);if(S)P.add(S)}for(let k of BA(D,!0)){let S=M(k);if(!S)continue;P.delete(S),$.classList.add(S)}for(let k of P)$.classList.remove(k)}function uA($,W,D,P){if(J1.has(D)){console.error(`Refusing to assign unsafe prop name '${D}' to a DOM node.`);return}let k=W.originalProps;if(!(D in k))k[D]=$[D];$[D]=P===void 0?k[D]:P}function zQ($,W,D){let P=W.originalProps;if(D in P)$[D]=P[D],delete P[D]}function PQ($,W,D,P,k){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(!X(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");zA(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(k)uA(D,D[SA],S,W);else if(W===void 0)D.removeAttribute(S);else D.setAttribute(S,W);break}}}function XB($,W,D,P,k){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":zA(D,W??T,T);break;case"$dataset":FA(D,W??T,T);break;default:{if(k)zQ(D,D[SA],S);else D.removeAttribute(S);break}}}function OQ($,W){let D=$[SA],P=$.namespaceURI==="http://www.w3.org/1999/xhtml",k=D.vdom?.args[0]??T;z(W,PQ,$,k,P),z(k,XB,$,W,P)}function jQ($,W,D){if(typeof D==="function")$.addEventListener(W,D);else if(D!=null)$.addEventListener(W,J(D,x),{capture:!!J(D,m),passive:!!J(D,j)})}function _Q($,W,D){if(typeof D==="function")$.removeEventListener(W,D);else if(D!=null)$.removeEventListener(W,J(D,x),!!J(D,m))}function SQ($,W,D){let P=V($);if(P[0]==="$")return;jQ(D,P,W)}function gB($,W,D,P){let k=V($);if(k[0]==="$")return;let S=J(P,$);if(W===S)return;_Q(D,k,S),jQ(D,k,W)}function oL($,W,D,P){let k=V($);if(k[0]==="$"||J(P,$)!==void 0)return;_Q(D,k,W)}function yE($,W){let D=$[SA],P=W??T;if(!D.vdom){z(P,SQ,$);return}let k=D.vdom.hooks??T;z(P,gB,$,k),z(k,oL,$,P)}function q0($){let W=$[SA],D=W.newVdom,P=W.vdom,k=D.args;switch(D.type){case dQ:{OQ($,k[0]),yB($,BQ(k,1));break}case hB:{OQ($,k[0]);break}case VC:{let S=D.tag.apply($,D.args);if(g(S))yB($,[]);else if(X(S))yB($,BA(S,!0));else yB($,[S]);break}case $B:{try{D.tag.update?.($,D.args,P?.args)}catch(S){console.error(S)}break}}if(D.hooks||P?.hooks)yE($,D.hooks??T);try{D.hooks?.$update?.($,D,P)}catch(S){console.error(S)}W.vdom=D,delete W.newVdom}function iL($,W){if(typeof W!=="object"||W===null)return $.ownerDocument.createTextNode(UA(W));let D;switch(W.type){case dQ:case hB:D=z0($,W.tag,W);break;case VC:D=z0($,"udom-alias",W),D.style.display="contents";break;case $B:D=z0($,"udom-special",W),D.style.display="contents";break;default:throw Error("Invalid VDOM node")}return D}function hE($){if($.children)for(let W of $.children)RC(W)}function RC($){let W=$[SA];if(!W)return;let{vdom:D}=W;if(!D){delete $[SA];return}if(D.hooks)yE($,T);if(D.type===dQ||D.type===hB)OQ($,T);if(D.type===dQ||D.type===VC)hE($);delete $[SA];try{if(D.type===$B)D.tag.detach?.($);D.hooks?.$detach?.($)}catch(P){console.error(P)}}function rL($,W){let D=$[SA];if(Q(D.vdom.args,W.args)||Q(D.vdom.hooks,W.hooks))D.newVdom=W;return $}function tL($){let W=new Map,D={nodes:[],cursor:0};for(let P of $.childNodes){if(P.nodeType===3){D.nodes.push(P);continue}let k=P[SA],S=k?.vdom;if(S===void 0){if(k?.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 bE($){if(!$||$.cursor>=$.nodes.length)return;return $.nodes[$.cursor++]}function eL($,W,D,P){let k=$.firstChild;for(let S=0;S<W.length;S++){let n=W[S];if(n===k){k=k.nextSibling;continue}(P&&n.isConnected?P:D).call($,n,k)}}function A1($,W,D,P){let k=W[P],S=k;for(let GA=P-1;GA>=0;GA--){let $Q=W[GA];if($Q!==S.previousSibling)D.call($,$Q,S);S=$Q}let n=k.nextSibling;for(let GA=P+1;GA<W.length;GA++){let $Q=W[GA];if($Q===n)n=n.nextSibling;else D.call($,$Q,n)}}function Q1($,W){for(let D=0;D<$.length;D++)if(W.has($[D]))return D;return-1}function B1($){let W=$[SA];if(!W?.newVdom)return;if(!W.vdom)try{if(W.newVdom.hooks?.$attach?.($),W.newVdom.type===$B)W.newVdom.tag.attach?.($)}catch(D){console.error(D)}q0($)}function yB($,W){let D=$.firstChild?new Set($.childNodes):null,{byTag:P,textNodes:k}=tL($),S=[];for(let MA of W){let cQ;if(MA instanceof ZB){let GB=P.get(MA.tag),HB=GB?bE(MA.k!==void 0?GB.nodesForKey?.get(MA.k):GB.nodesWithoutKey):void 0;cQ=HB?rL(HB,MA):iL($,MA)}else{let GB=bE(k),HB=UA(MA);if(GB){if(cQ=GB,cQ.nodeValue!==HB)cQ.nodeValue=HB}else cQ=$.ownerDocument.createTextNode(HB)}D?.delete(cQ),S.push(cQ)}if(D)for(let MA of D)RC(MA),$.removeChild(MA);if(S.length===0)return;let n=$.ownerDocument,GA=$1(n,A?.window),$Q=GA.insertBefore,vE=typeof GA.moveBefore==="function"?GA.moveBefore:null,fE=$.isConnected,LB=-1;if(fE&&!vE){let MA=lE.get(n)??Z1(n);if(LB=Q1(S,MA),LB!==-1&&S[LB].parentNode!==$)LB=-1}if(LB===-1)eL($,S,$Q,fE?vE:null);else A1($,S,$Q,LB);for(let MA=0;MA<S.length;MA++)B1(S[MA])}function C1($,W){let D=$[SA];if(W===null||W===void 0){if(D)RC($);else hE($);$.replaceChildren();return}if(X(W)){yB($,BA(W,!0));return}if(W instanceof ZB){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,q0($);return}RC($)}switch(W.type){case dQ:case hB:if(!K1($.nodeName,H(W.tag)))throw Error("incompatible target for vdom");break}$[SA]=pE(W);try{if(W.hooks?.$attach?.($),W.type===$B)W.tag.attach?.($)}catch(P){console.error(P)}q0($);return}throw Error("invalid vdom")}return{h:IA,alias:X1,special:L1,reconcile:C1,settings:{shouldUpdate:Q,isMap:B,mapIter:C,mapEach:z,mapGet:J,mapMerge:K,newMap:E,mapPut:Y,isSeq:X,flattenSeq:BA,seqIter:L,convertTagName:H,convertPropName:Z,convertStyleName:F,convertDataName:U,convertClassName:M,convertHookName:V,convertName:G,listenerKey:x,captureKey:m,passiveKey:j}}};function NC({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 O0({window:A}={}){let Q=!1,B=0,C=[];function J(){return A??globalThis}function K(F){let U=J().requestAnimationFrame;return typeof U==="function"?U.call(J(),F):setTimeout(F,16)}function E(F){let U=J().cancelAnimationFrame;if(typeof U==="function")U.call(J(),F);else clearTimeout(F)}function Y(){return J().performance?.now()??Date.now()}function X(F){for(let U of F)try{U()}catch(M){console.error("Error in scheduled function:",M)}}function L(){let F=Y();B=0;while(C.length>0){let U=C.splice(0,100);if(X(U),Y()-F>10&&C.length>0){B=K(L);return}}Q=!1}function G(F,{signal:U}={}){if(U?.aborted)return;let M=F;if(U)M=()=>{if(!U.aborted)F()};if(C.push(M),!Q)Q=!0,B=K(L)}function H(){if(B)E(B),B=0;Q=!0;while(C.length>0){let F=C;C=[],X(F)}Q=!1}function Z(){if(B)E(B);C=[],Q=!1,B=0}return{schedule:G,flush:H,clear:Z}}function cE(A){let Q=P0(A),B=NC(Q),C=A?.scheduler??O0(A);return{...Q,...B,...C}}var W1=cE();var{h:U1,alias:I1,special:F1,reconcile:M1,settings:R1,title:V1,meta:N1,link:q1,style:z1,script:P1,noscript:O1,address:j1,article:_1,aside:S1,footer:T1,header:w1,h1:k1,h2:x1,h3:g1,h4:y1,h5:h1,h6:b1,main:v1,nav:f1,section:u1,blockquote:m1,dd:p1,div:l1,dl:c1,dt:d1,figcaption:a1,figure:n1,hr:s1,li:o1,ol:i1,p:r1,pre:t1,ul:e1,a:A6,abbr:Q6,b:B6,br:C6,cite:J6,code:K6,data:E6,del:Y6,dfn:X6,em:L6,i:G6,ins:H6,kbd:$6,mark:Z6,q:D6,s:W6,samp:U6,small:I6,span:F6,strong:M6,sub:R6,sup:V6,time:N6,u:q6,wbr:z6,area:P6,audio:O6,img:j6,map:_6,track:S6,video:T6,embed:w6,iframe:k6,object:x6,param:g6,picture:y6,portal:h6,source:b6,svg:v6,math:f6,canvas:u6,caption:m6,col:p6,colgroup:l6,table:c6,tbody:d6,td:a6,tfoot:n6,th:s6,thead:o6,tr:i6,button:r6,datalist:t6,fieldset:e6,form:AG,input:QG,label:BG,legend:CG,meter:JG,optgroup:KG,option:EG,output:YG,progress:XG,select:LG,textarea:GG,details:HG,dialog:$G,summary:ZG,slot:DG,template:WG,schedule:UG,flush:IG,clear:FG}=W1;function MG(A,{signal:Q}={}){queueMicrotask(()=>{if(!Q?.aborted)A()})}function RG(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 dE(A){return A!=null&&typeof A.special==="function"&&typeof A.reconcile==="function"}function j0(A){let Q=dE(A)?{dodo:A}:A,B=Q?.dodo;if(!dE(B))throw Error("a dodo instance must be provided in settings, e.g. reactive({dodo})");return{schedule:typeof B.schedule==="function"?B.schedule:MG,renderError:RG(B.h),...Q,dodo:B,...B.settings}}var iA=Symbol("dodo.reactive.PENDING"),RA=Symbol("dodo.reactive.NOTHING");function nQ(A){return A!=null&&typeof A.onDirty==="function"&&typeof A.getValue==="function"}function DB(A){return nQ(A)?A.getValue():A}function VG(A){if(typeof A==="function")return A;if(A&&typeof A.unsubscribe==="function")return()=>A.unsubscribe();return()=>{}}function _0(){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 qC(A,Q){let{listeners:B,notify:C}=_0(),J=null;return{onDirty(K){if(B.add(K),B.size===1)try{J=VG(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}=_0();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 S0(A){return{onDirty(){return()=>{}},getValue(){return A}}}function r(A,Q){let B=Array.isArray(A)?A:[A],{listeners:C,notify:J}=_0(),K=null,E=RA,Y=()=>{E=RA,J()},X=()=>{let L=Array(B.length);for(let G=0;G<B.length;G++){let H=DB(B[G]);if(H===iA)return iA;L[G]=H}return Q(...L)};return{onDirty(L){if(C.add(L),C.size===1)E=RA,K=B.map((H)=>nQ(H)?H.onDirty(Y):null);let G=!1;return()=>{if(G)return;if(G=!0,C.delete(L),C.size===0&&K){for(let H of K)H?.();K=null,E=RA}}},getValue(){if(E===RA||!K)E=X();return E}}}function zC(A,Q){return r([A],Q)}function PC(A,{initial:Q=iA}={}){return NG(A,{initial:Q},(B,C)=>B.subscribe({next:C.next,error:C.error,complete:C.complete}))}function NG(A,{initial:Q},B){let C=Q,J=RA;return qC((E)=>{return B(A,{next(X){C=X,J=RA,E()},error(X){J=X,E()},complete(){}})},()=>{if(J!==RA)throw J;return C})}function aE(A){return{subscribe(Q){let B=typeof Q==="function"?{next:Q}:Q??{},C=()=>{let K;try{K=DB(A)}catch(E){B.error?.(E);return}if(K!==iA)B.next?.(K)},J=nQ(A)?A.onDirty(C):()=>{};return C(),{unsubscribe:J}}}}function TQ(A,Q){let B=()=>{let J;try{J=DB(A)}catch(K){console.error("Error reading cell in effect:",K);return}if(J===iA)return;Q(J)},C=nQ(A)?A.onDirty(B):()=>{};return B(),C}var aQ=Symbol("dodo.reactive.watch");function OC(A){let Q=j0(A),{dodo:B,schedule:C,renderError:J}=Q,{special:K,reconcile:E}=B,Y=Q.mapGet??((H,Z)=>H[Z]),X=(H,Z)=>H==null?void 0:Y(H,Z),L=Q.shouldUpdate??((H,Z)=>H!==Z);return{watch:K({attach(H){H[aQ]={source:RA,builder:null,placeholder:void 0,errorBuilder:void 0,unsubscribe:null,abortController:null,renderScheduled:!1,lastValue:RA,lastBuilder:RA}},update(H,[Z,F,U]){let M=H[aQ];if(!M)return;if(M.builder=F,M.placeholder=X(U,"placeholder"),M.errorBuilder=X(U,"error"),M.source!==Z){if(M.unsubscribe?.(),M.unsubscribe=null,M.abortController?.abort(),M.abortController=new AbortController,M.source=Z,M.lastValue=RA,nQ(Z))try{M.unsubscribe=Z.onDirty(()=>this.invalidate(H))}catch(V){this.renderError(H,V);return}}this.render(H)},invalidate(H){let Z=H[aQ];if(!Z||Z.renderScheduled)return;Z.renderScheduled=!0,C(()=>this.render(H),{signal:Z.abortController?.signal})},render(H){let Z=H[aQ];if(!Z)return;Z.renderScheduled=!1;let F;try{F=DB(Z.source===RA?void 0:Z.source)}catch(U){this.renderError(H,U);return}if(Z.builder===Z.lastBuilder&&Z.lastValue!==RA&&!L(Z.lastValue,F))return;Z.lastValue=F,Z.lastBuilder=Z.builder;try{if(F===iA)E(H,Z.placeholder?[Z.placeholder()]:[]);else E(H,[Z.builder(F)])}catch(U){this.renderError(H,U)}},renderError(H,Z){let F=H[aQ];if(!F)return;F.lastValue=RA,F.lastBuilder=RA,console.error("Error in watched cell:",Z);try{E(H,[(F.errorBuilder??J)(Z)])}catch(U){console.error("Error rendering the error view:",U)}},detach(H){let Z=H[aQ];if(!Z)return;Z.unsubscribe?.(),Z.abortController?.abort(),delete H[aQ],E(H,null)}})}}var{watch:ZQ}=OC({dodo:bB});var w=bB;function qG(A){let Q={status:"idle"};return qC((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:iA})}var nE={watch:ZQ,cell:d,derive:r,constant:S0,mapCell:zC,connectable:qC,fromObservable:PC,fromAsync:qG,toObservable:aE,effect:TQ,isCell:nQ,readCell:DB,PENDING:iA};var u=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"}),zG=new Set([u.TRANSIENT,u.TIMEOUT,u.QUOTA]),PG={[u.NOT_FOUND]:404,[u.ALREADY_EXISTS]:409,[u.INVALID]:400,[u.CONFLICT]:412,[u.UNAUTHORIZED]:401,[u.FORBIDDEN]:403,[u.UNSUPPORTED]:501,[u.QUOTA]:429,[u.TOO_LARGE]:413,[u.BAD_RANGE]:416,[u.TRANSIENT]:503,[u.TIMEOUT]:504,[u.ABORTED]:499,[u.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||u.INTERNAL,this.retryable=B.retryable??zG.has(this.code),this.details=B.details??null,this.status=PG[this.code]??500,this.code===u.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(u.NOT_FOUND,A?`${A} not found`:"Not found",Q)}static alreadyExists(A,Q){return new N(u.ALREADY_EXISTS,`${A} already exists`,Q)}static invalid(A,Q){return new N(u.INVALID,A,Q)}static conflict(A,Q){return new N(u.CONFLICT,A,Q)}static unsupported(A,Q){return new N(u.UNSUPPORTED,A,Q)}static transient(A,Q){return new N(u.TRANSIENT,A,{retryable:!0,...Q})}static timeout(A,Q){return new N(u.TIMEOUT,A,{retryable:!0,...Q})}static aborted(A="Operation aborted",Q){return new N(u.ABORTED,A,{retryable:!1,...Q})}static unauthorized(A="Unauthorized",Q){return new N(u.UNAUTHORIZED,A,Q)}static tooLarge(A="Too large",Q){return new N(u.TOO_LARGE,A,{retryable:!1,...Q})}static badRange(A="Range not satisfiable",Q){return new N(u.BAD_RANGE,A,{retryable:!1,...Q})}static forbidden(A="Forbidden",Q){return new N(u.FORBIDDEN,A,Q)}static internal(A="Internal error",Q){return new N(u.INTERNAL,A,Q)}}function vB(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(u.FORBIDDEN,"Permission denied",{cause:A});case"ENOSPC":return new N(u.QUOTA,"The storage volume is full — free some space and try again",{cause:A,retryable:!1});case"EDQUOT":return new N(u.QUOTA,"The storage quota for this volume has been reached",{cause:A,retryable:!1});case"EFBIG":return new N(u.QUOTA,"That file is larger than this filesystem can store",{cause:A,retryable:!1})}return N.internal(A?.message||Q,{cause:A})}function sE(A){if(A instanceof N)return A.retryable;return vB(A).retryable}function oE(A=""){let Q=(globalThis.crypto?.randomUUID?.()??OG()).replace(/-/g,"");return A?`${A}_${Q}`:Q}function OG(){let A="";for(let Q=0;Q<32;Q++)A+=Math.floor(Math.random()*16).toString(16);return A}function iE(A){let Q=String(A||"").lastIndexOf(".");return Q>0?String(A).slice(Q).toLowerCase():""}function jC(A,Q){if(!A||!Q)return!1;if(typeof A.match==="function")try{if(A.match(Q))return!0}catch{}let B=iE(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 WB="trove+contrib:",rE="core",jG=/^(?:core|[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+)$/,_G=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function SG(A){return typeof A==="string"&&jG.test(A)}function _C(A){return typeof A==="string"&&_G.test(A)}function CQ(A){return SC(A),`${A.domain}/${A.name}`}function wQ(A,Q){if(!_C(Q))throw N.invalid(`Invalid contribution name "${Q}"`);return`${WB}${CQ(A)}/${Q}`}var TG="workbench";function tE(A){return`${WB}${rE}/${TG}/${A}`}function kQ(A){if(typeof A!=="string"||!A.startsWith(WB))return null;let Q=A.slice(WB.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 eE(A,Q){let B=kQ(Q);return!!B&&B.pluginId===`${A.domain}/${A.name}`}function SC(A){if(!SG(A?.domain))throw N.invalid(`Plugin manifest needs a valid "domain" (got ${JSON.stringify(A?.domain)})`);if(!_C(A?.name))throw N.invalid(`Plugin manifest needs a valid "name" (got ${JSON.stringify(A?.name)})`);if(A.domain===rE)throw N.invalid('The "core" domain is reserved for built-in contributions')}var Q8={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:A8(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:A8(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}}}},T0=Object.keys(Q8);function DQ(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(!_C(C))throw N.invalid(`Invalid contribution name "${C}"`);let K=Q8[J.type];if(!K)throw N.invalid(`Contribution "${C}" has unknown type ${JSON.stringify(J.type)} (expected one of ${T0.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:wQ(A,C),pluginId:CQ(A),type:J.type,...K.normalize(J),...K.needsEntry?{entry:E}:{}})}return B}function wG(A,Q){return DQ(A).filter((B)=>B.type===Q)}function w0(A){return wG(A,"indexer").map((Q)=>({id:Q.uri,name:Q.name,title:Q.title||Q.name,match:Q.match,entry:Q.entry}))}function B8(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 A8(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 kG=[...T0,"view"];function TC(A){return String(A).startsWith(WB)?A:tE(A)}class k0{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(!kG.includes(B))throw Error(`Unknown contribution type "${B}" for ${A}`);let C=TC(A),J=kQ(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=TC(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(TC(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(TC(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)=>jC(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 x0=new Map;function g0(A){if(!A)return()=>!0;if(x0.has(A))return x0.get(A);let Q;try{let B=new J8(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 x0.set(A,Q),Q}function C8(A,Q){return g0(A)(Q||{})}var wC=/\s*(=~|==|!=|>=|<=|&&|\|\||[()!<>]|trove\+contrib:[A-Za-z0-9_./-]+|\/(?:\\.|[^/])*\/[a-z]*|'(?:\\.|[^'])*'|"(?:\\.|[^"])*"|[A-Za-z0-9_.:-]+)/y;class J8{constructor(A){this.src=A,this.tokens=this.#A(A),this.pos=0,this.keys=new Set}#A(A){let Q=[],B=0;wC.lastIndex=0;while(B<A.length){wC.lastIndex=B;let C=wC.exec(A);if(!C||C.index==null){if(!A.slice(B).trim())break;throw Error(`Unexpected "${A.slice(B)}"`)}Q.push(C[1]),B=wC.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.#X(),Q=this.#Q();if(["==","!=",">=","<=",">","<","=~"].includes(Q)){if(this.#B(),Q==="=~"){let C=this.#B(),J=xG(C);return(K)=>J.test(String(A(K)??""))}let B=this.#X();return(C)=>yG(Q,A(C),B(C))}return(B)=>gG(A(B))}#X(){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 xG(A){let Q=/^\/((?:\\.|[^/])*)\/([a-z]*)$/.exec(A);if(!Q)throw Error(`Bad regex ${A}`);return new RegExp(Q[1],Q[2])}function gG(A){return!(A===void 0||A===null||A===!1||A===""||A===0)}function yG(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 hG=(A)=>({onDirty:()=>()=>{},getValue:()=>A});class y0{#A=new Map;#Q=new Map;#B=new Map;#C=d({});constructor(A={}){let Q={platform:K8(),isMac:/mac/i.test(K8()),...A};for(let[B,C]of Object.entries(Q))this.register(B,hG(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=g0(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 C8(A,this.snapshot())}}function K8(){return typeof navigator<"u"?navigator.platform||navigator.userAgent||"":""}class h0{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 b0(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(E8()?"meta":"ctrl");else C=K;return[...["ctrl","meta","alt","shift"].filter((K)=>B.has(K)),C].filter(Boolean).join("+")}function v0(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 UB{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${b0(A.defaultKey||A.key)}`}rebind(A,Q){if(!this.settings)return;let B=typeof A==="string"?this.#A(A):UB.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?UB.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=b0(Q.key),C=UB.bindingId({command:Q.command,defaultKey:B});return{...Q,defaultKey:B,bindingId:C,key:b0(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=v0(A),B=A.ctrlKey||A.metaKey||A.altKey;if(bG(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?f0(Q.key):null}}function bG(A){if(!A)return!1;let Q=A.tagName;return Q==="INPUT"||Q==="TEXTAREA"||Q==="SELECT"||A.isContentEditable}function E8(){return typeof navigator<"u"&&/mac/i.test(navigator.platform||navigator.userAgent||"")}function f0(A){let Q=E8(),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 X8="trove.settings";class u0{constructor(){this.schema=new Map,this.values=vG(),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;Y8(this.values),this.cell.setValue(this.effective())}reset(A){delete this.values[A],Y8(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 vG(){try{return JSON.parse(localStorage.getItem(X8))||{}}catch{return{}}}function Y8(A){try{localStorage.setItem(X8,JSON.stringify(A))}catch{}}var fG=0;class m0{constructor(){this.items=[],this.cell=d([])}observe(){return this.cell}#A(A,Q,B={}){let C={id:++fG,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 uG={retries:4,minDelayMs:250,maxDelayMs:8000,factor:2,jitter:!0};function mG(A,Q){return new Promise((B,C)=>{if(Q?.aborted)return C(N.aborted());let J=(Y)=>(X)=>{clearTimeout(K),Q?.removeEventListener("abort",E),Y(X)},K=setTimeout(()=>J(B)(),A),E=()=>J(C)(N.aborted());Q?.addEventListener("abort",E,{once:!0})})}async function IB(A,Q={}){let B={...uG,...Q},C=B.shouldRetry??sE,J=0;for(;;){if(B.signal?.aborted)throw N.aborted();try{return await A(J)}catch(K){let E=vB(K);if(!(J<B.retries&&C(E)&&E.code!=="aborted"))throw E;let X=Math.min(B.maxDelayMs,B.minDelayMs*B.factor**J),L=B.jitter?Math.random()*X:X;B.onRetry?.({attempt:J+1,delayMs:L,error:E}),await mG(L,B.signal),J++}}}class p0{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 IB(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 G;try{let H=await Y.text();G=(H?JSON.parse(H):null)?.error}catch{}if(G&&G.retryable===!1)throw new N(G.code,G.message,{retryable:!1,details:G.details});throw N.transient(G?.message||`Server ${Y.status}`)}throw N.transient(`Server ${Y.status}`)}if(K)return Y;let X=await Y.text(),L=X?JSON.parse(X):null;if(!Y.ok){let G=L?.error||{code:"internal",message:`Request failed (${Y.status})`};throw new N(G.code,G.message,{retryable:G.retryable,details:G.details})}return L},{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`)}collectionGrants(A){return this.request("GET",`/api/collections/${encodeURIComponent(A)}/grants`)}setCollectionGrant(A,Q){return this.request("POST",`/api/collections/${encodeURIComponent(A)}/grants`,{body:Q})}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,X=E.length>=Q&&(Y==null||Y>E.length),L=new TextDecoder("utf-8",{fatal:!1}).decode(E);if(X){let G=L.lastIndexOf(`
4
- `);if(G>0)L=L.slice(0,G)}return{text:L,truncated:X,total:Y}}async upload(A,Q){let B=Q.name||A.name||"untitled",C=A.size,J=(h)=>IB(h,{signal:Q.signal,retries:4,onRetry:({attempt:v,delayMs:z,error:g})=>Q.onRetry?.({attempt:v,delayMs:z,message:g.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 L8(C,Q.onProgress),Y=K.transfer||{},X=K.endpoints?.complete||`/api/uploads/${K.uploadId}/complete`;if(K.strategy==="single"){let h=A;return await J(()=>kC(Y.url||K.url,h,{headers:Y.requiredHeaders,signal:Q.signal,onProgress:(z)=>E.set("single",z)})),(await J(()=>this.request("POST",X,{body:{},signal:Q.signal}))).node}if(K.strategy==="direct-single"){let h=A;return await J(()=>kC(this.baseUrl+this.#Q(K,1),h,{headers:{...this.authHeaders(),...Y.authHeaders},signal:Q.signal,onProgress:(z)=>E.set(1,z)})),(await J(()=>this.request("POST",X,{body:{},signal:Q.signal}))).node}let L=K.partSize,G=K.partCount??Math.ceil(C/L),H=new Set;try{let h=K.endpoints?.status||`/api/uploads/${K.uploadId}/status`,v=await this.request("GET",h,{signal:Q.signal});H=new Set(v.received||[])}catch{}let Z=[],F=[];for(let h=1;h<=G;h++){let v=(h-1)*L,z=A.slice(v,Math.min(v+L,C));F.push({n:h,blob:z})}let U=Array(G),M=Math.min(Q.concurrency??4,F.length),V=0,x=new AbortController,m=()=>x.abort();if(Q.signal)if(Q.signal.aborted)x.abort();else Q.signal.addEventListener("abort",m,{once:!0});let j=async()=>{while(V<F.length){if(x.signal.aborted)return;let{n:h,blob:v}=F[V++];if(H.has(h)){E.set(h,v.size);continue}let z=await IB(()=>this.#B(K,h,v,{signal:x.signal,onProgress:(g)=>E.set(h,g)}),{signal:x.signal,retries:4,onRetry:({attempt:g,delayMs:AA,error:QA})=>Q.onRetry?.({attempt:g,delayMs:AA,part:h,message:QA.message})});U[h-1]={partNumber:h,etag:z}}};try{await Promise.all(Array.from({length:M},j))}catch(h){throw x.abort(),h}finally{Q.signal?.removeEventListener("abort",m)}let T=U.filter(Boolean);return(await J(()=>this.request("POST",X,{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 X=(K.parts||A.parts)?.find((Z)=>Z.partNumber===Q)?.url;if(!X){let Z=A.endpoints?.sign||`/api/uploads/${A.uploadId}/parts/{partNumber}/sign`;X=(await this.request("POST",Z.replace("{partNumber}",String(Q)),{signal:C})).url}let G=(await kC(X,B,{signal:C,onProgress:J,wantEtag:!0})).etag,H=A.endpoints?.report||`/api/uploads/${A.uploadId}/parts/{partNumber}/report`;return await this.request("POST",H.replace("{partNumber}",String(Q)),{body:{etag:G},signal:C}),G}return(await kC(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 L8{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 kC(A,Q,{signal:B,onProgress:C,wantEtag:J,wantJson:K,headers:E}={}){return new Promise((Y,X)=>{let L=new XMLHttpRequest;L.open("PUT",A,!0);for(let[G,H]of Object.entries(E||{}))try{L.setRequestHeader(G,H)}catch{}if(B){if(B.aborted)return L.abort(),X(N.aborted());B.addEventListener("abort",()=>L.abort(),{once:!0})}L.upload.onprogress=(G)=>C?.(G.loaded),L.onload=()=>{if(L.status>=200&&L.status<300){let G={status:L.status};if(J)G.etag=L.getResponseHeader("ETag")||L.getResponseHeader("etag");if(K)try{G.json=JSON.parse(L.responseText)}catch{}Y(G)}else if(L.status===429||L.status>=500)X(N.transient(`Upload part failed (${L.status})`));else X(new N("internal",`Upload failed (${L.status})`))},L.onerror=()=>X(N.transient("Network error during upload")),L.onabort=()=>X(N.aborted()),L.send(Q)})}var CA=Uint8Array,wA=Uint16Array,e0=Int32Array,xC=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]),gC=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]),n0=new CA([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),U8=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 e0(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}},I8=U8(xC,2),F8=I8.b,s0=I8.r;F8[28]=258,s0[258]=28;var M8=U8(gC,0),pG=M8.b,G8=M8.r,o0=new wA(32768);for(f=0;f<32768;++f)JQ=(f&43690)>>1|(f&21845)<<1,JQ=(JQ&52428)>>2|(JQ&13107)<<2,JQ=(JQ&61680)>>4|(JQ&3855)<<4,o0[f]=((JQ&65280)>>8|(JQ&255)<<8)>>1;var JQ,f,EQ=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 X=15-Q;for(J=0;J<C;++J)if(A[J]){var L=J<<4|A[J],G=Q-A[J],H=E[A[J]-1]++<<G;for(var Z=H|(1<<G)-1;H<=Z;++H)Y[o0[H]>>X]=L}}else{Y=new wA(C);for(J=0;J<C;++J)if(A[J])Y[J]=o0[E[A[J]-1]++]>>15-A[J]}return Y},xQ=new CA(288);for(f=0;f<144;++f)xQ[f]=8;var f;for(f=144;f<256;++f)xQ[f]=9;var f;for(f=256;f<280;++f)xQ[f]=7;var f;for(f=280;f<288;++f)xQ[f]=8;var f,mB=new CA(32);for(f=0;f<32;++f)mB[f]=5;var f,lG=EQ(xQ,9,0),cG=EQ(xQ,9,1),dG=EQ(mB,5,0),aG=EQ(mB,5,1),l0=function(A){var Q=A[0];for(var B=1;B<A.length;++B)if(A[B]>Q)Q=A[B];return Q},rA=function(A,Q,B){var C=Q/8|0;return(A[C]|A[C+1]<<8)>>(Q&7)&B},c0=function(A,Q){var B=Q/8|0;return(A[B]|A[B+1]<<8|A[B+2]<<16)>>(Q&7)},AJ=function(A){return(A+7)/8|0},pB=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 nG=["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||nG[A]);if(C.code=A,Error.captureStackTrace)Error.captureStackTrace(C,VA);if(!B)throw C;return C},sG=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,X=Q.i;if(E)B=new CA(J*3);var L=function(jQ){var _Q=B.length;if(jQ>_Q){var SQ=new CA(Math.max(_Q*2,jQ));SQ.set(B),B=SQ}},G=Q.f||0,H=Q.p||0,Z=Q.b||0,F=Q.l,U=Q.d,M=Q.m,V=Q.n,x=J*8;do{if(!F){G=rA(A,H,1);var m=rA(A,H+1,3);if(H+=3,!m){var j=AJ(H)+4,T=A[j-4]|A[j-3]<<8,c=j+T;if(c>J){if(X)VA(0);break}if(Y)L(Z+T);B.set(A.subarray(j,c),Z),Q.b=Z+=T,Q.p=H=c*8,Q.f=G;continue}else if(m==1)F=cG,U=aG,M=9,V=5;else if(m==2){var h=rA(A,H,31)+257,v=rA(A,H+10,15)+4,z=h+rA(A,H+5,31)+1;H+=14;var g=new CA(z),AA=new CA(19);for(var QA=0;QA<v;++QA)AA[n0[QA]]=rA(A,H+QA*3,7);H+=v*3;var BA=l0(AA),BQ=(1<<BA)-1,UA=EQ(AA,BA,1);for(var QA=0;QA<z;){var IA=UA[rA(A,H,BQ)];H+=IA&15;var j=IA>>4;if(j<16)g[QA++]=j;else{var XA=0,e=0;if(j==16)e=3+rA(A,H,3),H+=2,XA=g[QA-1];else if(j==17)e=3+rA(A,H,7),H+=3;else if(j==18)e=11+rA(A,H,127),H+=7;while(e--)g[QA++]=XA}}var DA=g.subarray(0,h),LA=g.subarray(h);M=l0(DA),V=l0(LA),F=EQ(DA,M,1),U=EQ(LA,V,1)}else VA(1);if(H>x){if(X)VA(0);break}}if(Y)L(Z+131072);var lQ=(1<<M)-1,zA=(1<<V)-1,oA=H;for(;;oA=H){var XA=F[c0(A,H)&lQ],PA=XA>>4;if(H+=XA&15,H>x){if(X)VA(0);break}if(!XA)VA(2);if(PA<256)B[Z++]=PA;else if(PA==256){oA=H,F=null;break}else{var FA=PA-254;if(PA>264){var QA=PA-257,t=xC[QA];FA=rA(A,H,(1<<t)-1)+F8[QA],H+=t}var uA=U[c0(A,H)&zA],zQ=uA>>4;if(!uA)VA(3);H+=uA&15;var LA=pG[zQ];if(zQ>3){var t=gC[zQ];LA+=c0(A,H)&(1<<t)-1,H+=t}if(H>x){if(X)VA(0);break}if(Y)L(Z+131072);var PQ=Z+FA;if(Z<LA){var XB=K-LA,OQ=Math.min(LA,PQ);if(XB+Z<0)VA(3);for(;Z<OQ;++Z)B[Z]=C[XB+Z]}for(;Z<PQ;++Z)B[Z]=B[Z-LA]}}if(Q.l=F,Q.p=oA,Q.b=Z,Q.f=G,F)G=1,Q.m=M,Q.d=U,Q.n=V}while(!G);return Z!=B.length&&E?pB(B,0,Z):B.subarray(0,Z)},WQ=function(A,Q,B){B<<=Q&7;var C=Q/8|0;A[C]|=B,A[C+1]|=B>>8},fB=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},d0=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:V8,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,h){return c.f-h.f}),B.push({s:-1,f:25001});var Y=B[0],X=B[1],L=0,G=1,H=2;B[0]={s:-1,f:Y.f+X.f,l:Y,r:X};while(G!=J-1)Y=B[B[L].f<B[H].f?L++:H++],X=B[L!=G&&B[L].f<B[H].f?L++:H++],B[G++]={s:-1,f:Y.f+X.f,l:Y,r:X};var Z=K[0].s;for(var C=1;C<J;++C)if(K[C].s>Z)Z=K[C].s;var F=new wA(Z+1),U=i0(B[G-1],F,0);if(U>Q){var C=0,M=0,V=U-Q,x=1<<V;K.sort(function(h,v){return F[v.s]-F[h.s]||h.f-v.f});for(;C<J;++C){var m=K[C].s;if(F[m]>Q)M+=x-(1<<U-F[m]),F[m]=Q;else break}M>>=V;while(M>0){var j=K[C].s;if(F[j]<Q)M-=1<<Q-F[j]++-1;else++C}for(;C>=0&&M;--C){var T=K[C].s;if(F[T]==Q)--F[T],++M}U=Q}return{t:new CA(F),l:U}},i0=function(A,Q,B){return A.s==-1?Math.max(i0(A.l,Q,B+1),i0(A.r,Q,B+1)):Q[A.s]=B},H8=function(A){var Q=A.length;while(Q&&!A[--Q]);var B=new wA(++Q),C=0,J=A[0],K=1,E=function(X){B[C++]=X};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}},uB=function(A,Q){var B=0;for(var C=0;C<Q.length;++C)B+=A[C]*Q[C];return B},R8=function(A,Q,B){var C=B.length,J=AJ(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},$8=function(A,Q,B,C,J,K,E,Y,X,L,G){WQ(Q,G++,B),++J[256];var H=d0(J,15),Z=H.t,F=H.l,U=d0(K,15),M=U.t,V=U.l,x=H8(Z),m=x.c,j=x.n,T=H8(M),c=T.c,h=T.n,v=new wA(19);for(var z=0;z<m.length;++z)++v[m[z]&31];for(var z=0;z<c.length;++z)++v[c[z]&31];var g=d0(v,7),AA=g.t,QA=g.l,BA=19;for(;BA>4&&!AA[n0[BA-1]];--BA);var BQ=L+5<<3,UA=uB(J,xQ)+uB(K,mB)+E,IA=uB(J,Z)+uB(K,M)+E+14+3*BA+uB(v,AA)+2*v[16]+3*v[17]+7*v[18];if(X>=0&&BQ<=UA&&BQ<=IA)return R8(Q,G,A.subarray(X,X+L));var XA,e,DA,LA;if(WQ(Q,G,1+(IA<UA)),G+=2,IA<UA){XA=EQ(Z,F,0),e=Z,DA=EQ(M,V,0),LA=M;var lQ=EQ(AA,QA,0);WQ(Q,G,j-257),WQ(Q,G+5,h-1),WQ(Q,G+10,BA-4),G+=14;for(var z=0;z<BA;++z)WQ(Q,G+3*z,AA[n0[z]]);G+=3*BA;var zA=[m,c];for(var oA=0;oA<2;++oA){var PA=zA[oA];for(var z=0;z<PA.length;++z){var FA=PA[z]&31;if(WQ(Q,G,lQ[FA]),G+=AA[FA],FA>15)WQ(Q,G,PA[z]>>5&127),G+=PA[z]>>12}}}else XA=lG,e=xQ,DA=dG,LA=mB;for(var z=0;z<Y;++z){var t=C[z];if(t>255){var FA=t>>18&31;if(fB(Q,G,XA[FA+257]),G+=e[FA+257],FA>7)WQ(Q,G,t>>23&31),G+=xC[FA];var uA=t&31;if(fB(Q,G,DA[uA]),G+=LA[uA],uA>3)fB(Q,G,t>>5&8191),G+=gC[uA]}else fB(Q,G,XA[t]),G+=e[t]}return fB(Q,G,XA[256]),G+e[256]},oG=new e0([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),V8=new CA(0),iG=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),X=Y.subarray(C,Y.length-J),L=K.l,G=(K.r||0)&7;if(Q){if(G)X[0]=K.r>>3;var H=oG[Q-1],Z=H>>13,F=H&8191,U=(1<<B)-1,M=K.p||new wA(32768),V=K.h||new wA(U+1),x=Math.ceil(B/3),m=2*x,j=function(gB){return(A[gB]^A[gB+1]<<x^A[gB+2]<<m)&U},T=new e0(25000),c=new wA(288),h=new wA(32),v=0,z=0,g=K.i||0,AA=0,QA=K.w||0,BA=0;for(;g+2<E;++g){var BQ=j(g),UA=g&32767,IA=V[BQ];if(M[UA]=IA,V[BQ]=UA,QA<=g){var XA=E-g;if((v>7000||AA>24576)&&(XA>423||!L)){G=$8(A,X,0,T,c,h,z,AA,BA,g-BA,G),AA=v=z=0,BA=g;for(var e=0;e<286;++e)c[e]=0;for(var e=0;e<30;++e)h[e]=0}var DA=2,LA=0,lQ=F,zA=UA-IA&32767;if(XA>2&&BQ==j(g-zA)){var oA=Math.min(Z,XA)-1,PA=Math.min(32767,g),FA=Math.min(258,XA);while(zA<=PA&&--lQ&&UA!=IA){if(A[g+DA]==A[g+DA-zA]){var t=0;for(;t<FA&&A[g+t]==A[g+t-zA];++t);if(t>DA){if(DA=t,LA=zA,t>oA)break;var uA=Math.min(zA,t-2),zQ=0;for(var e=0;e<uA;++e){var PQ=g-zA+e&32767,XB=M[PQ],OQ=PQ-XB&32767;if(OQ>zQ)zQ=OQ,IA=PQ}}}UA=IA,IA=M[UA],zA+=UA-IA&32767}}if(LA){T[AA++]=268435456|s0[DA]<<18|G8[LA];var jQ=s0[DA]&31,_Q=G8[LA]&31;z+=xC[jQ]+gC[_Q],++c[257+jQ],++h[_Q],QA=g+DA,++v}else T[AA++]=A[g],++c[A[g]]}}for(g=Math.max(g,QA);g<E;++g)T[AA++]=A[g],++c[A[g]];if(G=$8(A,X,L,T,c,h,z,AA,BA,g-BA,G),!L)K.r=G&7|X[G/8|0]<<3,G-=7,K.h=V,K.p=M,K.i=g,K.w=QA}else{for(var g=K.w||0;g<E+L;g+=65535){var SQ=g+65535;if(SQ>=E)X[G/8|0]=L,SQ=E;G=R8(X,G+1,A.subarray(g,SQ))}K.i=E}return pB(Y,0,C+AJ(G)+J)},rG=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}(),tG=function(){var A=-1;return{p:function(Q){var B=A;for(var C=0;C<Q.length;++C)B=rG[B&255^Q[C]]^B>>>8;A=B},d:function(){return~A}}};var eG=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 iG(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)},N8=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 KQ=function(A,Q){return A[Q]|A[Q+1]<<8},mA=function(A,Q){return(A[Q]|A[Q+1]<<8|A[Q+2]<<16|A[Q+3]<<24)>>>0},a0=function(A,Q){return mA(A,Q)+mA(A,Q+4)*4294967296},WA=function(A,Q,B){for(;B;++Q)A[Q]=B,B>>>=8};function AH(A,Q){return eG(A,Q||{},0,0)}function QH(A,Q){return sG(A,{i:2},Q&&Q.out,Q&&Q.dictionary)}var q8=function(A,Q,B,C){for(var J in A){var K=A[J],E=Q+J,Y=C;if(Array.isArray(K))Y=N8(C,K[1]),K=K[0];if(ArrayBuffer.isView(K))B[E]=[K,Y];else B[E+="/"]=[new CA(0),Y],q8(K,E,B,C)}},Z8=typeof TextEncoder<"u"&&new TextEncoder,r0=typeof TextDecoder<"u"&&new TextDecoder,BH=0;try{r0.decode(V8,{stream:!0}),BH=1}catch(A){}var CH=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:pB(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 D8(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(Z8)return Z8.encode(A);var J=A.length,K=new CA(A.length+(A.length>>1)),E=0,Y=function(G){K[E++]=G};for(var C=0;C<J;++C){if(E+5>K.length){var X=new CA(E+8+(J-C<<1));X.set(K),K=X}var L=A.charCodeAt(C);if(L<128||Q)Y(L);else if(L<2048)Y(192|L>>6),Y(128|L&63);else if(L>55295&&L<57344)L=65536+(L&1047552)|A.charCodeAt(++C)&1023,Y(240|L>>18),Y(128|L>>12&63),Y(128|L>>6&63),Y(128|L&63);else Y(224|L>>12),Y(128|L>>6&63),Y(128|L&63)}return pB(K,0,E)}function JH(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(r0)return r0.decode(A);else{var J=CH(A),K=J.s,B=J.r;if(B.length)VA(8);return K}}var KH=function(A,Q){return Q+30+KQ(A,Q+26)+KQ(A,Q+28)},EH=function(A,Q,B){var C=KQ(A,Q+28),J=KQ(A,Q+30),K=JH(A.subarray(Q+46,Q+46+C),!(KQ(A,Q+8)&2048)),E=Q+46+C,Y=YH(A,E,J,B,mA(A,Q+20),mA(A,Q+24),mA(A,Q+42)),X=Y[0],L=Y[1],G=Y[2];return[KQ(A,Q+10),X,L,K,E+J+KQ(A,Q+32),G]},YH=function(A,Q,B,C,J,K,E){var Y=J==4294967295,X=K==4294967295,L=E==4294967295,G=Q+B,H=Y+X+L;if(C&&H){for(;Q+4<G;Q+=4+KQ(A,Q+2))if(KQ(A,Q)==1)return[Y?a0(A,Q+4+8*X):J,X?a0(A,Q+4):K,L?a0(A,Q+4+8*(X+Y)):E,1];if(C<2)VA(13)}return[J,K,E,0]},t0=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},W8=function(A,Q,B,C,J,K,E,Y){var X=C.length,L=B.extra,G=Y&&Y.length,H=t0(L);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),F=Z.getFullYear()-1980;if(F<0||F>119)VA(10);if(WA(A,Q,F<<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,X),WA(A,Q+14,H),Q+=16,E!=null)WA(A,Q,G),WA(A,Q+6,B.attrs),WA(A,Q+10,E),Q+=14;if(A.set(C,Q),Q+=X,H)for(var U in L){var M=L[U],V=M.length;WA(A,Q,+U),WA(A,Q+2,V),A.set(M,Q+4),Q+=4+V}if(G)A.set(Y,Q),Q+=G;return Q},XH=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 z8(A,Q){if(!Q)Q={};var B={},C=[];q8(A,"",B,Q);var J=0,K=0;for(var E in B){var Y=B[E],X=Y[0],L=Y[1],G=L.level==0?0:8,H=D8(E),Z=H.length,F=L.comment,U=F&&D8(F),M=U&&U.length,V=t0(L.extra);if(Z>65535)VA(11);var x=G?AH(X,L):X,m=x.length,j=tG();j.p(X),C.push(N8(L,{size:X.length,crc:j.d(),c:x,f:H,m:U,u:Z!=E.length||U&&F.length!=M,o:J,compression:G})),J+=30+Z+V+m,K+=76+2*(Z+V)+(M||0)+m}var T=new CA(K+22),c=J,h=K-J;for(var v=0;v<C.length;++v){var H=C[v];W8(T,H.o,H,H.f,H.u,H.c.length);var z=30+H.f.length+t0(H.extra);T.set(H.c,H.o+z),W8(T,J,H,H.f,H.u,H.c.length,H.o,H.m),J+=16+z+(H.m?H.m.length:0)}return XH(T,J,C.length,h,c),T}function P8(A,Q){var B={},C=A.length-22;for(;mA(A,C)!=101010256;--C)if(!C||A.length-C>65558)VA(13);var J=KQ(A,C+8);if(!J)return{};var K=mA(A,C+16),E=mA(A,C-20)==117853008;if(E){var Y=mA(A,C-12);if(E=mA(A,Y)==101075792,E)J=mA(A,Y+32),K=mA(A,Y+48)}var X=Q&&Q.filter;for(var L=0;L<J;++L){var G=EH(A,K,E),H=G[0],Z=G[1],F=G[2],U=G[3],M=G[4],V=G[5],x=KH(A,V);if(K=M,!X||X({name:U,size:Z,originalSize:F,compression:H}))if(!H)B[U]=pB(A,x,x+Z);else if(H==8)B[U]=QH(A.subarray(x,x+Z),{out:new CA(F)});else VA(14,"unknown compression type "+H)}return B}function LH(){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 yC(A,Q,B){return new Promise((C,J)=>{let K=A.transaction("installs",Q),E=K.objectStore("installs"),Y;Promise.resolve(B(E)).then((X)=>Y=X),K.oncomplete=()=>C(Y),K.onerror=()=>J(K.error)})}var O8=(A)=>new Promise((Q,B)=>{A.onsuccess=()=>Q(A.result),A.onerror=()=>B(A.error)});class QJ{constructor(){this._db=null}async#A(){return this._db??=await LH()}async save(A){let Q=await this.#A();return await yC(Q,"readwrite",(B)=>B.put(A)),A}async get(A){let Q=await this.#A();return yC(Q,"readonly",(B)=>O8(B.get(A)))}async list(){let A=await this.#A();return yC(A,"readonly",(Q)=>O8(Q.getAll()))}async remove(A){let Q=await this.#A();await yC(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 hC=null;function $H(){if(!hC)hC=import("./chunk-h05bxfbs.js").then((m)=>GH(m.default,1)).then((A)=>(A.default||A)({locateFile:()=>"/sql-wasm.wasm"})).catch((A)=>{throw hC=null,A});return hC}var ZH="trove-plugin-clientdb",bC="dbs";function DH(){return new Promise((A,Q)=>{let B=indexedDB.open(ZH,1);B.onupgradeneeded=()=>{let C=B.result;if(!C.objectStoreNames.contains(bC))C.createObjectStore(bC)},B.onsuccess=()=>A(B.result),B.onerror=()=>Q(B.error)})}function BJ(A,Q){return DH().then((B)=>new Promise((C,J)=>{let K=B.transaction(bC,A),E;Promise.resolve(Q(K.objectStore(bC))).then((Y)=>E=Y),K.oncomplete=()=>{B.close(),C(E)},K.onerror=()=>{B.close(),J(K.error)}}))}var WH=(A)=>new Promise((Q,B)=>{A.onsuccess=()=>Q(A.result),A.onerror=()=>B(A.error)}),UH=(A)=>BJ("readonly",(Q)=>WH(Q.get(A))),IH=(A,Q)=>BJ("readwrite",(B)=>B.put(Q,A)),FH=(A)=>BJ("readwrite",(Q)=>Q.delete(A));class j8{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 IH(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 CJ{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 $H(),C=await UH(A);Q=new j8(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 FH(A)}}var _8=new TextEncoder;function JJ(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 S8(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 T8(A){return new Uint8Array(await crypto.subtle.digest("SHA-256",A))}function MH(A){let Q={...A};return delete Q.signature,JSON.stringify(KJ(Q))}function KJ(A){if(Array.isArray(A))return A.map(KJ);if(A&&typeof A==="object"){let Q={};for(let B of Object.keys(A).sort())Q[B]=KJ(A[B]);return Q}return A}async function RH(A){let Q=[...A.keys()].filter((E)=>E!=="manifest.json").sort(),B=[];for(let E of Q){let Y=A.get(E),X=_8.encode(E),L=new Uint8Array(4);new DataView(L.buffer).setUint32(0,Y.length),B.push(X,new Uint8Array([0]),L,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 S8(await T8(J))}async function VH(A){return S8(await T8(JJ(A)))}async function NH({manifest:A,files:Q}){if(!A.signature||!A.publicKey)return{signed:!1,valid:!1};let B=await RH(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",JJ(A.publicKey),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);if(!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},C,JJ(A.signature),_8.encode(MH(A))))return{signed:!0,valid:!1,reason:"Signature does not verify"};return{signed:!0,valid:!0,fingerprint:await VH(A.publicKey)}}catch(C){return{signed:!0,valid:!1,reason:"Bad key/signature: "+C.message}}}function qH(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 w8({manifest:A,files:Q},B){let C=await NH({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&&qH(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 EJ(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 k8(A){let Q=[];for(let B of A||[])try{Q.push(EJ(B))}catch{}return Q}function zH(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 vC(A,Q){return k8(A).some((B)=>zH(B,Q))}function fC(A){return k8(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 PH={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."},YJ=new Set;function x8(A){let Q=LJ(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 OH(A){return PH[A]||A}function g8(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 XJ(A){return Object.keys(g8(A))}function LJ(A,Q){let B=g8(A);return Object.prototype.hasOwnProperty.call(B,Q)?B[Q]:null}function sQ(A){let Q=LJ(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 pA(A){let Q=A?.displayName??A?.name;return typeof Q==="string"&&Q.trim()?Q:"Plugin"}function y8(A){let Q=LJ(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 uC(A,Q,B){if(!Q)return!1;if(kQ(Q)&&eE(A,Q))return!0;return y8(A).includes(Q)}function oQ(A){let Q;try{Q=P8(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 jH(J,B),{manifest:J,files:B,raw:A}}function jH(A,Q){let B=(C,J)=>{if(!C)throw Error(J)};if(SC(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 DQ(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 sQ(A))EJ(C)}async function h8(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 oQ(C)}function b8(A,Q){let B=A.manifest,C=DQ(B).map((E)=>({kind:E.type,name:E.name,uri:E.uri,title:E.title||E.name,detail:E.type==="opener"||E.type==="indexer"?_H(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=x8(B);return{id:CQ(B),name:pA(B),version:B.version||"0.0.0",description:B.description||"",author:B.author||"Unknown",domain:B.domain,capabilities:XJ(B).map((E)=>({id:E,description:OH(E),adminOnly:YJ.has(E)})),contributions:C,settings:(B.settings||[]).map((E)=>({key:E.key,title:E.title||E.key,type:E.type,secret:!!E.secret})),network:fC(sQ(B)),commands:y8(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 GJ(A,Q){let B=x8(A);return{plugin:B.plugin,domain:B.domain&&Q?.status==="verified"}}function _H(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 HJ{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 $J{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 X=Q.getBoundingClientRect(),L=X.width>0&&X.height>0&&document.contains(Q);J.style.left=`${X.left}px`,J.style.top=`${X.top}px`,J.style.width=`${X.width}px`,J.style.height=`${X.height}px`,J.style.visibility=L?"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=`${v8(Q.width,200,480)}px`,B.style.height=`${v8(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 v8(A,Q,B){return Math.max(Q,Math.min(B,A||Q))}function kA(A){console.error(A)}var FB="The provider has been disposed";class p{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 p{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 p{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){kA(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(FB));return}this.#B.add(E),K.resolve(E)},(E)=>{this.#J--,K.reject(E),this.#Y()})}}async obtain(){if(this.#K)throw Error(FB);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(FB));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 p{static deps=B;#A;#Q=null;#B=null;#C=!1;constructor(J={}){super();this.#A=J}async obtain(){if(this.#C)throw Error(FB);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 p{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(FB);this.#Q++;while(this.#J)await this.#J;if(this.#K)throw this.#Q--,Error(FB);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){kA(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 ZJ{#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){kA(C)}this.#A=[]}}class gQ{#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 L of K.deps??[])Y[L]=B(L,E);let X=new K(Y,{engineFeed:this.#B,container:this});return this.#A.set(C,X),X};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 ZJ(B,C).release(),J}return new ZJ(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){kA(B)}for(let Q of A)try{await Q.dispose?.()}catch(B){kA(B)}}}var SH=typeof ErrorEvent==="function"?ErrorEvent:class extends Event{constructor(Q,{error:B,message:C=""}={}){super(Q);this.error=B,this.message=C}};function TH(A){return A&&typeof A.message==="string"?A.message:String(A)}class m8 extends Event{constructor({reason:A,error:Q=null}={}){super("abort");this.reason=A,this.error=Q}}var f8=["complete","error","abort"];function wH(){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 DJ extends EventTarget{#A=new AbortController;#Q;#B=null;constructor(){super();for(let A of f8)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??wH(),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},X=(L)=>(G)=>{E.abort(),L(G)};for(let L of B)this.addEventListener(L,X(J),Y);for(let L of f8){if(B.has(L))continue;this.addEventListener(L,(G)=>X(K)(u8(L,G,B)),Y)}if(!C)this.#A.signal.addEventListener("abort",()=>X(K)(this.#Q),Y);Q?.addEventListener("abort",()=>X(K)(Q.reason),Y)})}#C(A,Q,B,C){if(C.has(B.type))A(B.event);else Q(u8(B.type,B.event,C))}}function u8(A,Q,B){if(A==="error")return Q.error;if(A==="abort")return Q.reason;return kH(B)}function kH(A){return Error(`The dispatch completed without emitting ${[...A].map((Q)=>`'${Q}'`).join(" or ")}`)}class mC{#A;#Q;constructor({container:A,interceptors:Q}={}){this.#A=A??new gQ,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 DJ;return setTimeout(async()=>{let K=[],E={},Y=null,X=(L)=>{if(L!==void 0)E=L};try{for(let G of B){if(K.push(G),!G.enter)continue;X(await Q.use(G.deps,(H)=>G.enter(H,{dispatchFeed:J,engineFeed:C,signal:J.signal,state:E,action:A})))}let L=await Q.lease(A.constructor.deps,A.deps);try{await A.execute(L.resources,{dispatchFeed:J,engineFeed:C,signal:J.signal,state:E})}finally{await L.release()}}catch(L){Y=L}finally{for(let L=K.length-1;L>=0;L--){let G=K[L],H=J.signal.aborted;try{if(H&&G.abort)X(await Q.use(G.deps,(Z)=>G.abort(Z,{dispatchFeed:J,engineFeed:C,signal:J.signal,action:A,state:E,reason:J.reason,error:Y})));else if(Y&&G.error){let Z={dispatchFeed:J,engineFeed:C,signal:J.signal,action:A,state:E,error:Y,handled:()=>{Y=null}};X(await Q.use(G.deps,(F)=>G.error(F,Z)))}else if(!Y&&G.leave)X(await Q.use(G.deps,(Z)=>G.leave(Z,{dispatchFeed:J,engineFeed:C,signal:J.signal,state:E,action:A})))}catch(Z){Y=Z}}if(J.signal.aborted)J.dispatchEvent(new m8({reason:J.reason,error:Y}));else if(Y)J.dispatchEvent(new SH("error",{error:Y,message:TH(Y)}));else J.dispatchEvent(new Event("complete"))}}),J}}class YQ{boot(){throw Error("boot() not implemented, and no fetch() to fall back to")}kill(){}}class p8{#A;#Q;#B=null;#C=null;#J=!1;#K=null;#E=Promise.withResolvers();#Y=!1;#X=void 0;#L=!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.#X}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)=>{kA(Error(`${this.#Q.constructor.name} ${Q} (${A.constructor.name}) failed`,{cause:C.error}))},{once:!0}),B}notify(A){if(this.#L)return;if(this.#X=A,!this.#Y)this.#Y=!0,this.#E.resolve(!0);for(let Q of[...this.observers])try{Q.next?.(A)}catch(B){kA(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===YQ.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){kA(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.#L)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){kA(A)}finally{await this.#Z()}}async#Z(A){if(this.#L)return;this.#L=!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){kA(J)}if(!this.#Y)this.#E.resolve(!1);let B=this.#B;if(this.#B=null,B)await B.release()}}class pC{#A;#Q;#B;#C=!1;constructor({container:A,dispatcher:Q,createControllerMap:B}={}){this.#A=A??new gQ,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 YQ))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){kA(K)}}else C=new p8(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 lC{#A;#Q;#B;#C=!1;constructor({providers:A,interceptors:Q,hooks:B,container:C,dispatcher:J,queries:K}={}){this.#A=C??new gQ({providers:A}),this.#Q=J??new mC({container:this.#A,interceptors:Q}),this.#B=K??new pC({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 cC(A,Q,B,C){let J=A?.[Q];return J&&J.ref===B?J:{ref:B,...C}}var lB="promptValue";function l8(A,Q){let B=A?.[lB];return B&&B.ref===Q?B.value:Q?.value??""}function c8(A){let Q=cB(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 cB(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 d8(A,Q){try{let B=new Uint8Array(await Q.arrayBuffer());await n8(A,oQ(B))}catch(B){A.notifications.error(`Couldn't read the plugin: ${B.message}`)}}async function a8(A,Q){try{let B=await h8(Q,(C,J)=>fetch(C,J));await n8(A,B)}catch(B){A.notifications.error(`Couldn't fetch the plugin: ${B.message}`)}}async function n8(A,Q){let B=pA(Q.manifest);if(A.plugins.plugins.has(CQ(Q.manifest))){A.notifications.warn(`“${B}” is already installed.`);return}let C={status:"unverified"};try{C=await A.plugins.assessTrust(Q)}catch{}let J=c8(C);if(!J.allowed){A.notifications.error(`“${B}” was not installed. ${J.detail}`,{sticky:!0});return}let K=b8(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(X){A.notifications.dismiss(Y),A.notifications.error(`Install failed: ${X.message}`)}}}})}function xH(A,Q=null){return{...A?.meta||{},...Q||A?.tags||{}}}function gH(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 s8(A,Q,B=null){let C=xH(A,B);return(Q||[]).every((J)=>gH(C[J.key],J))}var yH=/#([\w.-]+)(?::(<=|>=|!=|=|<|>)?("[^"]*"|[^#\s]+)?)?/g;function dB(A){let Q=[],B=A;for(let C of A.matchAll(yH)){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 o8(A,Q){if(!Q||!Q.length)return!0;return s8(A,Q)}function dC(A){return A.present?`#${A.key}`:`#${A.key}:${A.op}${A.value}`}function aB(A){let Q=(A?.name||"").toLowerCase();return Q.includes(".")?Q.slice(Q.lastIndexOf(".")):""}var i8=[{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 hH(A,Q,B){if(A.ext.includes(Q))return!0;return A.mime.some((C)=>C.endsWith("/")?B.startsWith(C):B===C)}function r8(A){let Q=aB(A),B=A?.contentType||"";for(let C of i8)if(hH(C,Q,B))return C.kind;return"file"}var bH={...Object.fromEntries(i8.map((A)=>[A.kind,A.icon])),file:"file"};function UQ(A){return bH[r8(A)]||"file"}function t8(A){return r8(A)==="text"}var MB="openers.associations";function WJ(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 e8(A,Q){return(A||[]).filter((B)=>jC(B.match,Q))}function AY(A){return aB(A)||A?.contentType||""}function QY(A){let Q=aB(A);if(Q)return`${Q} files`;let B=A?.contentType||"";return B?`${B} files`:"this file type"}function BY(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)=>WJ(B,A.plugins))}function CY(A,Q){let B=A.settings.get(MB)||{},C=aB(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 JY(A,Q,B){let C={...A||{}};if(B)C[Q]=B;else delete C[Q];return C}var UJ="trove:",KY=255;var EY=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function aC(A){if(typeof A!=="string"||!A.toLowerCase().startsWith(UJ))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(!EY.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 X=K!=null?"id":"name",L=K!=null?K:E!=null?E:Y;if(!L||L.length>KY)return null;return{collection:J,by:X,value:L}}function nB(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`${UJ}${B}?id=${encodeURIComponent(A.id)}`}if(!A?.name)throw N.invalid("trove: link by name needs a node name");return`${UJ}${B}?name=${encodeURIComponent(A.name)}`}var vH="/c";function YY(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=`${vH}/${encodeURIComponent(A.collectionId)}/i/${C}`;return Q?`${String(Q).replace(/\/$/,"")}${J}`:J}function XY(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(!EY.test(C))return null;let K=J.startsWith("id:"),E=K?J.slice(3):J;if(!E||E.length>KY)return null;return{collection:C,by:K?"id":"name",value:E}}function sB(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 IJ{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 nC(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 LY(A,{open:Q,scan:B,rotate:C,create:J,access:K}){let E=A?.collectionId;return{rows:(A?.collections||[]).map((X)=>({id:X.id,name:X.name||X.id,driver:X.driver||"unknown",system:!!X.system,current:X.id===E,fingerprint:X.encryption?.fingerprint||null,encrypted:!!X.encryption,capabilities:X.capabilities||[],actions:{open:[Q(X.id)],scan:[Q(X.id),B()],rotate:X.encryption?[Q(X.id),C()]:null,access:X.capabilities?.includes("admin")?[K(X.id)]:null}})),canCreate:!!A?.canCreateCollection,create:[J()]}}function sC(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 GY(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 HY(A){GY((Q)=>A(Q),(Q)=>{Q.multiple=!0})}function $Y(A){GY((Q)=>A(Q[0]),(Q)=>{Q.accept=".zip,application/zip"})}function ZY(A,Q){let B=document.createElement("a");B.href=A,B.download=Q||"",document.body.appendChild(B),B.click(),B.remove()}function yQ(A={}){let Q=d(A);return{observe:()=>Q,get:()=>Q.getValue(),set:(B)=>Q.setValue({...Q.getValue(),...B}),replace:(B)=>Q.setValue(B)}}var DY=(A)=>yQ({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}),WY=()=>yQ({query:"",mode:"hybrid",results:[],loading:!1,error:null,ran:!1,paletteFiles:[],paletteQuery:"",paletteLoading:!1,paletteError:null}),UY=()=>yQ({keys:[],loading:!1,loaded:!1,error:null,minted:null,busy:null,draft:null}),IY=()=>yQ({}),FY=()=>yQ({palette:null,dialog:null,contextMenu:null,pluginPanel:null}),MY=()=>yQ({activity:"home",sidebarVisible:!0,launch:{query:"",index:0},aclFor:null,searchModal:!1,sheet:null,infoPanel:!1});function FJ(A,Q,B){return(A+Q+B)%B}var RY=()=>yQ({collectionId:null,grants:[],admins:[],loading:!1,error:null,busy:!1}),VY=()=>yQ({collectionId:null,rotation:null,estimate:null,loading:!1,error:null,busy:!1});class xA 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"),X=J.get("explorer.sortOrder"),L=await Q.list(K,{sort:Y,order:X});B.set({items:L.items,loading:!1,selection:[],sort:Y,order:X,collectionId:L.collectionId||K,stats:L.stats||null,usage:L.usage||null,nextCursor:L.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 oB 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 oC extends O{static deps=["api","engine","explorer","notifications","settings"];async execute(A){let Q=XY(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 xA(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 X=await B.collections();E=X.collections||[],J.set({collections:E,canCreateCollection:!!X.canCreate})}catch(X){J.set({loading:!1,error:`Couldn’t load your collections: ${X.message}`});return}if(!E.some((X)=>X.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 xA(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 lA(Y,{reset:!0}))}}class q 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 MJ 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 NY 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 oB),A.engine.dispatch(new xA(Q.collection.id))}catch(Q){A.notifications.error(`Couldn’t create collection: ${Q.message}`)}}}class RJ 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 iB extends O{static deps=["engine","explorer"];async execute(A){return A.engine.dispatch(new xA(A.explorer.get().collectionId))}}class iQ 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 xA(J))}catch(K){C.error(`Trash: ${K.message}`)}}}class qY 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 iB)}}class zY 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 iB)}catch(Q){A.notifications.error(`Couldn’t rename: ${Q.message}`)}}}class lA 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 FQ(this.node,J,{reset:!!this.opts.reset}));if(this.opts.openerId)return Q(this.opts.openerId);let B=BY(A,this.node),C=CY(A,this.node);if(C&&B.some((J)=>J.id===C))return Q(C);if(B.length>1)return A.engine.dispatch(new aA({kind:"opener-chooser",node:this.node,openers:B,reset:!!this.opts.reset}));Q(B[0]?.id||"core.fallback")}}class rB 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 xA(Q))}async#A(A,Q,B,C,J=null){let{api:K,notifications:E,transfers:Y}=A,X=J||oE("xfer"),L=new AbortController;if(J)Y.restart(X,L);else Y.start(X,Q.name,Q.size,L,{retry:()=>this.#A(A,Q,B,C,X)});let G=null;try{let H=await K.upload(Q,{collection:B,concurrency:C,signal:L.signal,onStart:(Z)=>{G=Z},onProgress:(Z)=>Y.progress(X,Z)});if(Y.finish(X,"done"),H?.name&&H.name!==Q.name)E.info(`"${Q.name}" already existed — saved as "${H.name}".`)}catch(H){if(G)K.abortUpload(G).catch(()=>{});if(H.code==="aborted")Y.finish(X,"cancelled");else Y.finish(X,"error",H.message),E.error(`Upload failed: ${Q.name} — ${H.message}. Retry it from the transfers tray.`)}}}class RB 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)=>o8(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 VJ 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 IQ 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 X=await Y.searchOffline(K,{limit:40});C.set({results:X,loading:!1,ran:!0,offline:!0,resolved:null})}catch(X){C.set({results:[],loading:!1,ran:!0,offline:!0,error:X.message})}return}try{let X=B.ofType("view").map((G)=>({id:G.id,title:G.title||G.id})),L=await Q.query(K,{mode:E,limit:40,views:X});C.set({results:L.results,resolved:L.resolved||null,loading:!1,ran:!0,offline:!1})}catch(X){if(Y){let L=await Y.searchOffline(K,{limit:40});C.set({results:L,loading:!1,ran:!0,offline:!0,error:L.length?null:X.message})}else C.set({loading:!1,error:X.message,ran:!0})}}}class NJ 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 PY 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 qJ 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 zJ 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 tA 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 PJ extends O{static deps=["notifications"];constructor(A){super();this.id=A}async execute({notifications:A}){A.dismiss(this.id)}}class XQ 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 OY extends O{static deps=["navigation"];async execute({navigation:A}){this.apply(A)}}class OA extends gA{apply(A){A.set({dialog:null})}}class tB extends gA{constructor(A){super();this.patch=A}apply(A){let Q=A.get().dialog;if(Q)A.set({dialog:{...Q,...this.patch}})}}class VB extends gA{apply(A){A.set({contextMenu:null})}}class eB extends gA{apply(A){A.set({palette:null})}}class OJ 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 jJ 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 iC 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:FJ(Q.index,this.delta,this.count)}})}}class _J extends XQ{apply(A){A.set({searchModal:!0,launch:{query:"",index:0}})}}class NB extends XQ{apply(A){A.set({searchModal:!1})}}class SJ extends XQ{constructor(A){super();this.collectionId=A}apply(A){A.set({aclFor:A.get().aclFor===this.collectionId?null:this.collectionId})}}class rQ extends XQ{constructor(A){super();this.query=A}apply(A){A.set({launch:{query:this.query,index:0}})}}class TJ extends XQ{constructor(A){super();this.index=A}apply(A){A.set({launch:{...A.get().launch,index:this.index}})}}class rC extends XQ{constructor(A){super();this.which=A}apply(A){A.set({sheet:A.get().sheet===this.which?null:this.which})}}class cA extends XQ{apply(A){A.set({sheet:null})}}class AC extends XQ{constructor(A){super();this.open=A}apply(A){A.set({infoPanel:this.open??!A.get().infoPanel})}}class QC extends gA{constructor(A){super();this.pluginId=A}apply(A){A.set({pluginPanel:this.pluginId})}}class wJ extends gA{apply(A){A.set({pluginPanel:null})}}class FQ 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 qB extends O{static deps=["activity"];async execute(A){this.apply(A.activity)}}class dA extends qB{constructor(A){super();this.which=A}apply(A){A.togglePanel(this.which)}}class kJ extends qB{constructor(A){super();this.id=A}apply(A){A.cancel(this.id)}}class xJ extends qB{constructor(A){super();this.id=A}apply(A){A.dismiss(this.id)}}class gJ extends qB{constructor(A){super();this.id=A}apply(A){A.retryIssue(this.id)}}class yJ extends qB{constructor(A){super();this.id=A}apply(A){A.dismissIssue(this.id)}}class BC extends O{static deps=["transfers"];async execute(A){this.apply(A.transfers)}}class CC extends BC{constructor(A){super();this.id=A}apply(A){A.cancel(this.id)}}class hJ extends BC{constructor(A){super();this.id=A}apply(A){A.retry(this.id)}}class bJ extends BC{constructor(A){super();this.id=A}apply(A){A.dismiss(this.id)}}class vJ extends BC{apply(A){A.clearDone()}}class LQ extends O{static deps=["social"];async execute(A){return this.apply(A.social)}}class MQ extends LQ{constructor(A){super();this.open=A}apply(A){A.toggleInbox(this.open)}}class JC extends LQ{apply(A){return A.enablePush()}}class tC extends LQ{constructor(A){super();this.body=A}apply(A){return A.comment(this.body)}}class fJ extends LQ{constructor(A){super();this.commentId=A}apply(A){return A.deleteComment(this.commentId)}}class uJ extends LQ{constructor(A,Q){super();this.commentId=A,this.emoji=Q}apply(A){return A.react(this.commentId,this.emoji)}}class eC extends LQ{constructor(A){super();this.target=A}apply(A){A.setReplyTo(this.target)}}class mJ extends LQ{constructor(A,Q){super();this.name=A,this.value=Q}apply(A){A.addTag(this.name,this.value)}}class pJ extends LQ{constructor(A){super();this.name=A}apply(A){A.removeTag(this.name)}}class KC extends LQ{constructor(A){super();this.nodeId=A}apply(A){A.loadSidecar(this.nodeId)}}class lJ extends O{static deps=["apiKeys"];async execute(A){this.apply(A.apiKeys)}}class A0 extends lJ{constructor(A){super();this.patch=A}apply(A){let Q=A.get().draft;if(Q)A.set({draft:{...Q,...this.patch}})}}class cJ extends lJ{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 dJ 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=FJ(A.get().launch.index,this.delta,B);A.set({launch:{...A.get().launch,index:C}}),jY(Q,this.nodes[C])}}class aJ 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}}),jY(Q,this.node)}}function jY(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 tQ 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 hQ 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 aA extends gA{constructor(A){super();this.dialog=A}apply(A){A.set({dialog:this.dialog})}}class bQ 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 EC 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(MB,JY(A.get(MB),this.typeKey,this.openerId))}}class nJ extends OY{apply(A){A.back()}}class vQ extends O{static deps=["navigation","workbench"];async execute({navigation:A,workbench:Q}){Q.set({activity:"home",searchModal:!1}),A.reset()}}class sJ extends O{static deps=["plugins"];constructor(A){super();this.pluginId=A}async execute({plugins:A}){return A.refresh(this.pluginId)}}class oJ 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 iJ 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 lA(Q).execute(A),A.workbench.set({infoPanel:!0})}}class rJ extends O{static deps=["overlay","viewState"];async execute(A){let B=(A.viewState.get()[lB]?.value??"").trim();if(A.overlay.set({dialog:null}),B)await this.withValue(B,A)}}class _Y extends rJ{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 zY(this.node.id,A))}}class tJ extends rJ{static deps=["notifications","overlay","plugins","social","viewState","workbench"];async withValue(A,Q){await a8(Q,A)}}class eJ 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 NY(this.record))}}class AK 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 YC({explorer:A,navigation:Q,notifications:B},C=null){let J=C||sB(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 Q0 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 XC extends XQ{constructor(A){super();this.activity=A}apply(A){A.set({activity:this.activity,sidebarVisible:!0})}}class QK 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 BK 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 rQ(B)),C)A.dispatch(new IQ(B))}})}}class CK extends O{static deps=["activity"];async execute({activity:A}){return A.rebuildIndex().catch(()=>{})}}class JK 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 KK extends O{static deps=["activity"];async execute({activity:A}){return A.checkStorage().catch(()=>{})}}class EK extends O{static deps=["engine","explorer"];async execute({engine:A,explorer:Q}){let B=Q.get().collectionId;HY((C)=>C.length&&A.dispatch(new rB(C,B)))}}class B0 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=YC(A,this.node);if(!Q)return;return A.engine.dispatch(this.kind==="share"?new tA(YY(Q,location.origin),"Link copied — anyone with access to this collection can open it"):new tA(nB(Q),`Copied ${nB(Q)}`))}}class YK extends O{static deps=["engine","explorer","navigation","notifications"];constructor(A=null){super();this.node=A}async execute(A){let Q=YC(A,this.node);if(!Q)return;A.engine.dispatch(new aA({kind:"prompt",title:"Rename",label:"New name",value:Q.name,confirmLabel:"Rename",confirmActions:[new _Y(Q)]}))}}class XK extends O{static deps=["engine","explorer","navigation","notifications","settings"];async execute(A){let Q=sB(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 qY(Q.map((J)=>J.id));if(!A.settings.get("explorer.confirmDelete"))return A.engine.dispatch(C);A.engine.dispatch(new aA({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 LK extends O{static deps=["engine"];async execute({engine:A}){A.dispatch(new iQ("list")),A.dispatch(new vQ)}}class GK extends O{static deps=["engine","explorer","navigation","notifications"];constructor(A=null){super();this.node=A}async execute(A){let Q=YC(A,this.node);if(Q)return A.engine.dispatch(new lA(Q))}}class HK extends O{static deps=["api","explorer","navigation","notifications"];constructor(A=null){super();this.node=A}async execute(A){let Q=YC(A,this.node);if(!Q?.id)return;try{let{url:B,revoke:C}=await A.api.download(Q.id,Q.name);if(ZY(B,Q.name),C)setTimeout(()=>URL.revokeObjectURL(B),60000)}catch(B){A.notifications.error(`Couldn't download ${Q.name}: ${B.message}`)}}}class C0 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=YC(A,this.node);if(!Q?.id)return;return this.pinned?A.offline.pin(Q):A.offline.unpin(Q.id)}}class J0 extends O{static deps=["apiKeys"];async execute({apiKeys:A}){this.apply(A)}}class $K extends J0{apply(A){A.set({draft:{name:"",expiresInDays:"",caps:{}},error:null})}}class ZK extends J0{apply(A){A.set({draft:null})}}class DK extends J0{apply(A){if(A.get().minted)A.set({minted:null})}}class WK extends O{static deps=["apiKeys","engine"];async execute({apiKeys:A,engine:Q}){let B=A.get().draft,C=nC(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 PY({name:B.name.trim(),scopes:C,expiresAt:K}))}}class UK 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 xA(this.collectionId)),A.dispatch(new vQ);return}let C=sC(Q.get(),(K)=>new q("collections.switch",K),()=>new q("collections.create"));if(!C.length)return B.info("This drive has one collection.");let J=typeof window>"u"?800:window.innerWidth;A.dispatch(new hQ(Math.max(12,Math.round(J/2)-110),120,C))}}class IK 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 FK extends O{static deps=["notifications","plugins","social","workbench"];async execute(A){$Y((Q)=>Q&&d8(A,Q))}}class MK 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 RK 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 K0 extends O{static deps=["acl","api","notifications"];constructor(A){super();this.collectionId=A}async execute({acl:A,api:Q,notifications:B}){let C=this.collectionId;if(!C)return;A.set({collectionId:C,loading:!0,error:null});try{let J=await Q.collectionGrants(C);A.set({grants:J?.grants||[],admins:J?.admins||[],loading:!1})}catch(J){if(A.set({loading:!1,error:J?.message||"Could not read the access list"}),J?.status!==403)B.error?.(J?.message||"Could not read the access list")}}}class VK extends O{static deps=["acl","api","engine","notifications"];constructor(A,Q){super();this.collectionId=A,this.grant=Q}async execute({acl:A,api:Q,engine:B,notifications:C}){A.set({busy:!0});try{await Q.setCollectionGrant(this.collectionId,this.grant);let J=this.grant.type==="anyone"?"everyone":this.grant.subject;C.success?.(this.grant.capabilities?.length?`Access for ${J} updated`:`Access for ${J} removed`)}catch(J){C.error?.(J?.message||"Could not change access")}finally{A.set({busy:!1}),await B.dispatch(new K0(this.collectionId)).next(["complete","error","abort"])}}}class zB 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 NK 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 oB),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 zB)}}class qK 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 zB)}}class zK{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 PK=`// 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 OK="1.0";function SY(A){return String(A||"").split(".")[0]||"0"}function TY(A){if(!A)return!0;return SY(A)===SY("1.0")}var wY;(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"})(wY||(wY={}));var uH=new Uint8Array(new Uint16Array([1]).buffer)[0]===1;function jK(A,Q="@"){if(!o)return _K.then(()=>jK(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((uH?pH:mH)(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 X=o.is(),L=o.ie(),G=o.it(),H=o.ai(),Z=o.id(),F=o.ss(),U=o.se(),M;o.ip()&&(M=Y(A.slice(Z===-1?X-1:X,Z===-1?L+1:L))),K.push({n:M,t:G,s:X,e:L,ss:F,se:U,d:Z,a:H})}for(;o.re();){let X=o.es(),L=o.ee(),G=o.els(),H=o.ele(),Z=A.slice(X,L),F=Z[0],U=G<0?void 0:A.slice(G,H),M=U?U[0]:"";E.push({s:X,e:L,ls:G,le:H,n:F==='"'||F==="'"?Y(Z):Z,ln:M==='"'||M==="'"?Y(U):U})}function Y(X){try{return(0,eval)(X)}catch(L){}}return[K,E,!!o.f(),!!o.ms()]}function mH(A,Q){let B=A.length,C=0;for(;C<B;){let J=A.charCodeAt(C);Q[C++]=(255&J)<<8|J>>>8}}function pH(A,Q){let B=A.length,C=0;for(;C<B;)Q[C]=A.charCodeAt(C++)}var o,lH=()=>{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},_K=WebAssembly.compile(lH()).then(WebAssembly.instantiate).then(({exports:A})=>{o=A});var cH=/\.m?js$/i;function E0(A){return/^src\//i.test(A)&&cH.test(A)}function kY(A){return E0(A.entry||"")}function dH(A){let Q=A.lastIndexOf("/");return(Q<0?"":A.slice(0,Q)).split("/").filter(Boolean)}function aH(A,Q){let B=dH(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 xY(A){await _K;let Q={};for(let[K,E]of A.files)if(E0(K))Q[K]=new TextDecoder().decode(E);let B=(K)=>Object.prototype.hasOwnProperty.call(Q,K),C=(K,E)=>{let Y=aH(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]=nH(E,K,C);return{modules:J,entry:A.manifest.entry}}function nH(A,Q,B){let[C]=jK(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),X=E.d===-1?Y:JSON.stringify(Y);J+=A.slice(K,E.s)+X,K=E.e}return J+A.slice(K)}var sH=15000;class SK{constructor({media:A,dock:Q}={}){this.media=A,this.dock=Q}async spawn(A,Q,B){let C=document.createElement("iframe");C.style.cssText=oH,C.setAttribute("sandbox","allow-scripts allow-forms"),C.setAttribute("referrerpolicy","no-referrer");let J=B?.entry;if(J)A._entrySrcdoc||={},A._entrySrcdoc[J]||=await gY({...A.manifest,entry:J},A.files),C.srcdoc=A._entrySrcdoc[J];else A._srcdoc||=await gY(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,X=A.manifest,L=!1,G=0,H=()=>{if(window.removeEventListener("message",F),G)clearTimeout(G)},Z=(U)=>{if(L)return;L=!0,H(),E(Error(U))},F=(U)=>{if(U.source!==Y.contentWindow)return;if(U.data?.__trove==="boot-error")return Z(U.data.error||"Plugin failed to load its modules");if(U.data?.__trove!=="ready")return;if(!TY(U.data.protocolVersion))return Z(`Plugin speaks protocol ${U.data.protocolVersion}, this host speaks ${OK}`);window.removeEventListener("message",F);let M=new MessageChannel;Q.channel=new zK(M.port1,{onCall:(V,x)=>B(A,V,x,Q),onEvent:(V,x)=>C(A,V,x,Q)}),Q.resolveActivated=(V)=>{if(L)return;if(L=!0,G)clearTimeout(G);K(V)},Q.rejectActivated=(V)=>{if(L)return;if(L=!0,G)clearTimeout(G);E(V)},Y.contentWindow.postMessage({__trove:"init",manifest:X,capabilities:A.grants,storage:A.storage,online:J,role:Q.role,protocolVersion:OK},"*",[M.port2])};G=setTimeout(()=>Z("Plugin handshake timed out"),sH),window.addEventListener("message",F),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 oH="position:fixed;left:0;top:0;width:0;height:0;border:0;visibility:hidden;",iH=["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("; "),hY=`<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="${iH}"></head><body>`;async function gY(A,Q){if(kY(A))return rH(await xY({manifest:A,files:Q}));let B=new TextDecoder().decode(Q.get(A.entry)??new Uint8Array);return`${hY}
323
- <script>${PK}</script>
324
- <script>${B}</script>
325
- </body></html>`}function yY(A){return JSON.stringify(A).replace(/</g,"\\u003c").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function rH(A){let Q=yY("trove:/"+A.entry);return`${hY}
326
- <script>${PK}</script>
327
- <script id="__trove_src" type="application/json">${yY(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 tH=/\b(ATTACH|DETACH|VACUUM|PRAGMA)\b/i;function eH(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 TK(A){if(typeof A!=="string"||!A)throw N.invalid("SQL statement is required");if(tH.test(eH(A)))throw N.invalid("ATTACH, DETACH, VACUUM and PRAGMA are not permitted in plugin storage")}var A$=26214400;async function Q$(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 X=await A.arrayBuffer();if(X.byteLength>Q)throw Error("Response too large");return X}let J=[],K=0;for(;;){let{done:X,value:L}=await C.read();if(X)break;if(K+=L.byteLength,K>Q)throw await C.cancel().catch(()=>{}),Error("Response too large");J.push(L)}let E=new Uint8Array(K),Y=0;for(let X of J)E.set(X,Y),Y+=X.byteLength;return E.buffer}class wK{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(!uC(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(vY);case"resources:read":{if(!vY(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=kQ(B.indexerId)?B.indexerId:wQ(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"](`${pA(A.manifest)}: ${B.text}`);break;case"ui:badge":A.badge=B.text,this.onChange();break}}#A(A,Q){if(!Q||kQ(Q))return Q;let B=this.platform.contributions.get(wQ(A.manifest,Q));return B?.type==="command"?B.uri:Q}#Q(A,Q,B){let C=Q?this.platform.contributions.get(wQ(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 vC(sQ(A.manifest),Q)}async#C(A,{url:Q,method:B="GET",headers:C,body:J}){let K=sQ(A.manifest);if(bY(Q,this.platform.api?.baseUrl))throw Error("Blocked: a plugin may not call the drive's own API through the network broker");if(!vC(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:C$(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(bY(Y.url,this.platform.api?.baseUrl))throw Error("Blocked: request redirected onto the drive's own API");if(!vC(K,Y.url))throw Error(`Blocked: request redirected off this plugin's declared endpoints (${Y.url})`)}let X=await Q$(Y,A$),L={};return Y.headers.forEach((G,H)=>{L[H]=G}),{ok:Y.ok,status:Y.status,statusText:Y.statusText,url:Y.url,headers:L,bytes:X}}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 H of Array.isArray(E)?E:[])TK(H?.sql);else TK(J);let L=Q==="domain"?`dom:${A.manifest.domain}`:`plg:${A.id}`,G=await this.clientDb.obtain(L);return J$(G,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 bY(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 vY(A){return A!=="manifest.json"&&!E0(A)}var B$=new Set(["host","cookie","cookie2","set-cookie","origin","referer","content-length","connection"]);function C$(A){let Q={};for(let[B,C]of Object.entries(A||{}))if(!B$.has(String(B).toLowerCase()))Q[B]=C;return Q}function J$(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 fY=["files","storage","ui","commands","indexer","opener","network","media","dock"];class kK{constructor(A,{heartbeatMs:Q=20000}={}){this.platform=A,this.plugins=new Map,this.registry=new QJ,this.clientDb=new CJ({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 HJ,this.dock=new $J({destroyFrame:(B)=>this.frames.destroy(B),openFile:(B,C)=>this.platform.dispatch?.(new FQ(B,C)),onChange:()=>this.#A()}),this.frames=new SK({media:this.media,dock:this.dock}),this.rpc=new wK({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=pA(A.manifest);for(let K of DQ(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 MK(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 X=this.#C(A,B8(new TextDecoder().decode(Y)),J);C(B.register(K.uri,{...E,bindings:X}))}catch(X){this.platform.notifications.warn(`Plugin "${J}": ${X.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=wQ(A.manifest,Q);if(DQ(A.manifest).some((E)=>E.uri===J&&E.type==="command"))return J;if(!uC(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:pA(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:fC(sQ(A.manifest)),responsive:!!A.responsive,manifest:A.live||null,features:this.#K(A)}))}#K(A){let Q;try{Q=DQ(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!YJ.has(A)||!!Q}async install(A,{grants:Q,trust:B}={}){let C=CQ(A.manifest),J=XJ(A.manifest),K=(Q||J).filter((L)=>fY.includes(L)&&J.includes(L)),E=Y$(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")?GJ(A.manifest,B):{plugin:!1,domain:!1},X={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(X),this.#X(X),await this.#L(X),this.plugins.get(C)}async restore(){let A=[];try{A=await this.registry.list()}catch{}for(let Q of A)try{this.#X(Q),this.#L(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?pA(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(z8(E$(Y.files)),Y.grants||[])}catch(X){console.error("re-upload plugin failed",Y.id,X),J++}}for(let Y of Q){if(C.has(Y.pluginId))continue;try{let X=oQ(await this.platform.api.pluginPackage(Y.pluginId)),L=Y.grants||[],G={id:Y.pluginId,manifest:X.manifest,files:Object.fromEntries([...X.files.entries()]),grants:L,storage:L.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(G),this.#X(G),await this.#L(G),K++}catch(X){console.error("sync plugin failed",Y.pluginId,X),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(", ")}.`)}}#X(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:pA(A.manifest)})))}async#L(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")?GJ(A.manifest,A.trust):{plugin:!1,domain:!1}),files:K$(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 "${pA(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:uY(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!==uY(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),X={cancelled:!1,frame:null};return this.#Q(K,"viewer",Y?.entry).then(async(L)=>{if(X.cancelled){this.frames.destroy(L);return}X.frame=L,L.node=B,L.openerId=C,K.frames.add(L),this.dock.place(L,Q,3);try{if(await L.channel?.call("opener:open",{openerId:C,file:B,context:{}}),!X.cancelled)J.onReady?.()}catch(G){if(!X.cancelled)J.onError?.(G?.message||"Failed to open")}}).catch((L)=>{if(console.error("viewer frame failed to load",L),!X.cancelled)J.onError?.(L?.message||"This viewer failed to load")}),K.hasUi=!0,()=>{if(X.cancelled=!0,X.frame)this.#Z(X.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?pA(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 w8(A,this.fetchAssetlinks)}}function K$(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 E$(A){let Q={};for(let[B,C]of Object.entries(A||{}))Q[B]=C instanceof Uint8Array?C:new Uint8Array(C);return Q}function Y$(A,Q){if(Q.includes("storage"))return!0;return w0(A).length>0}function uY(A){if(!A)return"";return`${A.online?1:0}|${[...A.handlers||[]].sort().join(",")}`}var mY=["auto","desktop","phone","tv"],X$=720,L$=1100,G$=/\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 H$(A="",Q=0){if(!A)return!1;return G$.test(A)&&Q>=L$}class xK{constructor({window:A=globalThis,settings:Q=null}={}){this.window=A,this.settings=Q,this.urlOverride=D$(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)TQ(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=Z$(A,"(pointer: coarse)"),J=A.navigator?.userAgent||"",K=this.urlOverride||this.settings?.get?.("workbench.layout")||"auto";return{mode:K!=="auto"&&mY.includes(K)?K:$$({width:Q,coarse:C,ua:J}),width:Q,height:B,coarse:C,forced:K!=="auto"}}}function $$({width:A,coarse:Q,ua:B}){if(H$(B,A))return"tv";if(A<=X$)return"phone";return"desktop"}function Z$(A,Q){try{return!!A.matchMedia?.(Q)?.matches}catch{return!1}}function D$(A){try{let Q=new URL(A.location.href).searchParams.get("ui");return Q&&mY.includes(Q)?Q:null}catch{return null}}var cY='a[href], button:not([disabled]), input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"])',dY=".launch-item, .grid-tile, .sheet-row, .inbox-item, .plugin-card, .act-task, .act-issue, .chapter",W$=`${cY}, ${dY}`,U$=new Set(["BrowserBack","GoBack","Backspace"]),I$=new Set([10009,461]),F$={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"},M$=new Set(["A","BUTTON","INPUT","SELECT","TEXTAREA"]);class gK{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)TQ(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(U$.has(A.key)||I$.has(A.keyCode)){if(A.key==="Backspace"&&pY(B)&&(B.value??"").length>0)return;A.preventDefault(),this.goBack();return}let C=F$[A.key];if(!C){if(A.key==="Enter"&&B&&!M$.has(B.tagName)&&B.matches(dY))A.preventDefault(),B.click();return}if((C==="left"||C==="right")&&pY(B)&&!R$(B,C))return;let J=B&&B!==Q.body?B:null,K=this.find(C,J);if(!K)return;A.preventDefault(),lY(K)}goBack(){if(this.workbench?.closeOverlays())return;this.window.history?.back?.()}candidates(){let A=this.window.document,Q=[];for(let B of A.querySelectorAll(W$)){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(cY)&&!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 X=V$(C,Y,A);if(X==null||X>=K)continue;K=X,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];lY(B.el),this._bootstrapped=!0}}function R$(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 pY(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 lY(A){A.focus?.({preventScroll:!0}),A.scrollIntoView?.({block:"nearest",inline:"nearest"})}function V$(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[X,L,G,H]=C?[A.left,A.right,Q.left,Q.right]:[A.top,A.bottom,Q.top,Q.bottom],Z=Math.max(0,Math.max(X,G)-Math.min(L,H)),F=Math.abs((X+L)/2-(G+H)/2);return Math.max(0,Y)+Z*3+F*0.2}function LC(){if(typeof window>"u")return null;return window.SpeechRecognition||window.webkitSpeechRecognition||null}function Y0(){let A=LC();return!!A&&typeof A.available==="function"}var yK=(A)=>({langs:[A],processLocally:!0});async function aY(A=navigator.language||"en-US"){if(!Y0())return"unavailable";try{return await LC().available(yK(A))}catch{return"unavailable"}}async function nY(A=navigator.language||"en-US"){if(typeof LC()?.install!=="function")return!1;try{return await LC().install(yK(A))}catch{return!1}}function sY({lang:A=navigator.language||"en-US",onText:Q,onEnd:B,onError:C}={}){if(!Y0())throw Error("On-device speech recognition is not available here");let J=new(LC());J.lang=A,J.interimResults=!0,J.continuous=!1,J.options=yK(A),J.processLocally=!0;let K=!1;J.onresult=(E)=>{let Y="",X=!1;for(let L=E.resultIndex;L<E.results.length;L++)if(Y+=E.results[L][0].transcript,E.results[L].isFinal)X=!0;Q?.(Y.trim(),{final:X})},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 hK{constructor({notifications:A,settings:Q}={}){this.notifications=A,this.settings=Q,this.session=null,this.state={supported:Y0(),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 aY(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 nY(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=sY({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 bK{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,X)=>{J=Y,K=X});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 X=J.urls?.[E];if(X){let L={url:X.url,expiresAt:X.expiresAt,mintedAt:K};this.cache.set(`${Q}:${E}`,L),Y.resolve(L)}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 N$(){try{return localStorage.getItem("trove.token")||null}catch{return null}}function oY({baseUrl:A=""}={}){let Q=new k0,B=new y0,C=new m0,J=new h0(Q,B,C),K=new u0,E=new UB(Q,J,B,K),Y=new p0({baseUrl:A,token:()=>N$()}),X=new xK({settings:K}),L=new gK({viewport:X}),G=new hK({notifications:C,settings:K}),H={reactive:nE,contributions:Q,context:B,commands:J,keybindings:E,settings:K,notifications:C,api:Y,viewport:X,spatialNav:L,voice:G,openPluginPanel:null};return H.mediaUrls=new bK({api:H.api,settings:K}),H.plugins=new kK(H),J.availability=(Z)=>H.plugins.isAvailable(Z),q$(H),X.refresh(),H}function q$(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 iY(A,{workbench:Q,overlay:B,navigation:C,explorer:J}){let K=Q.observe(),E=C.observe(),Y=B.observe(),X=J.observe(),L={"view.active":r([K],(H)=>H.activity),"sidebar.visible":r([K],(H)=>H.sidebarVisible),"searchModal.open":r([K],(H)=>!!H.searchModal),"sheet.open":r([K],(H)=>H.sheet||""),"infoPanel.open":r([K],(H)=>!!H.infoPanel),"palette.open":r([Y],(H)=>!!H.palette),"editor.open":r([E],(H)=>!!H.activeFile),"editor.openerId":r([E],(H)=>H.stack?.at(-1)?.openerId||""),"editor.contentType":r([E],(H)=>H.activeFile?.contentType||""),"explorer.collectionId":r([X],(H)=>H.collectionId??null),"explorer.hasSelection":r([X],(H)=>(H.selection?.length||0)>0)},G=Object.entries(L).map(([H,Z])=>A.register(H,Z));return()=>G.forEach((H)=>H())}function rY(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 tY="trove.recents",z$=12;class fK{constructor(){this.state={stack:[{kind:"search"}],activeTabId:null,activeFile:null,recents:P$()},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}),vK(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}),vK(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,z$);this.#A({recents:B}),vK(B)}}function P$(){try{return JSON.parse(localStorage.getItem(tY))||[]}catch{return[]}}function vK(A){try{localStorage.setItem(tY,JSON.stringify(A))}catch{}}class uK{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=!(eY(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:O$(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 eY(A,Q){for(let B of A){if(B.id===Q)return B;let C=eY(B.replies||[],Q);if(C)return C}return null}function O$(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 mK{get dimensions(){return 0}async embed(A){throw N.unsupported("embed not implemented")}async embedOne(A){return(await this.embed([A]))[0]}}var j$=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 _$(A){return String(A).toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter((Q)=>Q.length>1&&!j$.has(Q))}function S$(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 pK extends mK{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=_$(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=S$(K),Y=E%this._dim,X=E>>31&1?-1:1;Q[Y]+=X}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 T$ extends mK{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 IB(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 vB(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 AX(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 w$=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 lK(A){return String(A).toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter((Q)=>Q.length>1&&!w$.has(Q))}var k$="trove-offline",QX="trove-files-v1",cK=new pK({dimensions:256});class nK{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 x$(),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(QX),K=this.platform.mediaUrls,E=K.cacheKey(A.id),{url:Y}=await K.url(A.id,{op:"download"}),X=await fetch(Y);if(!X.ok)throw Error(`Couldn't fetch the file (${X.status})`);await J.put(new Request(E),X)}let Q=[],B="";if(t8(A))try{B=await this.api.readText(A.id);let J=AX(B,1000,150),K=await cK.embed(J.length?J:[A.name]);Q=(J.length?J:[A.name]).map((E,Y)=>({text:E,vector:K[Y]}))}catch{}let C=(await cK.embed([A.name]))[0];await y$(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(QX)).delete(this.platform.mediaUrls.cacheKey(A),{ignoreVary:!0}).catch(()=>{});await dK(this.db,"pins",A),await this.#C()}async#C(){let A=await aK(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 aK(this.db,"pins");if(!B.length)return[];let C=lK(A),J=(await cK.embed([A]))[0],K=[];for(let E of B){let Y=lK(`${E.node.name} ${E.text||""}`),X=v$(C,new Set(Y)),L=BX(J,E.nameVec);for(let H of E.chunks||[])L=Math.max(L,BX(J,H.vector));let G=0.6*L+0.4*X;if(G>0.02)K.push({nodeId:E.node.id,node:E.node,score:G,snippet:f$(E.text,C),indexerId:"offline"})}return K.sort((E,Y)=>Y.score-E.score).slice(0,Q)}async queueOp(A){await h$(this.db,"queue",{...A,at:Date.now()}),await this.#J()}async#J(){let A=await aK(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 b$(this.db,"queue");for(let{key:C,value:J}of B)try{await this.api.request(J.method,J.path,{body:J.body}),await dK(this.db,"queue",C),A++}catch(K){if(["transient","timeout","unauthorized","quota"].includes(K.code))break;await dK(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 x$(){return new Promise((A,Q)=>{let B=indexedDB.open(k$,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 GC(A,Q,B,C){return new Promise((J,K)=>{let E=A.transaction(Q,B),Y=E.objectStore(Q),X;Promise.resolve(C(Y)).then((L)=>X=L),E.oncomplete=()=>J(X),E.onerror=()=>K(E.error)})}var g$=(A)=>new Promise((Q,B)=>{A.onsuccess=()=>Q(A.result),A.onerror=()=>B(A.error)}),y$=(A,Q,B,C)=>GC(A,Q,"readwrite",(J)=>J.put(C,B)),h$=(A,Q,B)=>GC(A,Q,"readwrite",(C)=>C.add(B)),dK=(A,Q,B)=>GC(A,Q,"readwrite",(C)=>C.delete(B)),aK=(A,Q)=>GC(A,Q,"readonly",(B)=>g$(B.getAll()));function b$(A,Q){return GC(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 v$(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 BX(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 f$(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 u$=1000,m$=60000;class sK{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?u$:m$;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 PB="explorer.hasSelection || editor.open";function CX(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 Q0("commands"),{category:"View",icon:"command"}),Q("workbench.quickOpen","Go to File…",()=>new Q0("files"),{category:"File",icon:"search"}),Q("workbench.view.home","Go Home (search & browse)",()=>new vQ,{category:"View",icon:"search"}),Q("workbench.view.plugins","Show Plugins",()=>new XC("plugins"),{category:"View"}),Q("workbench.view.admin","Show Administration",()=>new XC("admin"),{category:"View",icon:"gear"}),Q("workbench.openSettings","Open Settings",()=>new XC("settings"),{category:"Preferences",icon:"gear"}),Q("workbench.closeOverlays","Close",()=>new QK,{palette:!1}),Q("search.voice","Search by Voice",()=>new BK,{category:"View",icon:"search"}),Q("workbench.showActivity","Show Activity (running work & problems)",()=>new dA(!0),{category:"View",icon:"refresh"}),Q("workbench.rebuildIndex","Rebuild Search Index",()=>new CK,{category:"View",icon:"refresh"}),Q("workbench.scanCollection","Scan Collection for Outside Changes",()=>new JK,{category:"Explorer",icon:"refresh"}),Q("workbench.checkStorage","Check Storage Configuration",()=>new KK,{category:"View",icon:"plug"}),Q("explorer.refresh","Refresh",()=>new iB,{category:"Explorer",icon:"refresh"}),Q("explorer.loadMore","Show More Items",()=>new RJ,{palette:!1}),Q("explorer.upload","Upload Files…",()=>new EK,{category:"Explorer",icon:"upload"}),Q("explorer.copyShareLink","Copy Shareable Link",(B)=>new B0("share",B),{category:"Explorer",icon:"link",when:PB}),Q("explorer.copyLink","Copy Link to Item",(B)=>new B0("trove",B),{category:"Explorer",icon:"link",when:PB}),Q("explorer.rename","Rename",(B)=>new YK(B),{category:"Explorer",when:PB}),Q("explorer.delete","Delete",()=>new XK,{category:"Explorer",icon:"trash",when:PB}),Q("explorer.open","Open",(B)=>new GK(B),{palette:!1}),Q("explorer.download","Download",(B)=>new HK(B),{category:"Explorer",icon:"download",when:PB}),Q("explorer.showTrash","Show Trash",()=>new LK,{category:"Explorer",icon:"trash"}),Q("explorer.hideTrash","Hide Trash",()=>new iQ("hide"),{palette:!1}),Q("explorer.restore","Restore from Trash",(B)=>B?new iQ("restore",B):null,{palette:!1}),Q("explorer.purgeOne","Delete Forever",(B)=>B?new iQ("purge",B):null,{palette:!1}),Q("explorer.emptyTrash","Empty Trash",()=>new aA({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 iQ("empty")]}),{category:"Explorer",icon:"trash"}),Q("keys.load","Load API Keys",()=>new NJ,{palette:!1}),Q("keys.new","New API Key",()=>new $K,{palette:!1}),Q("keys.cancel","Cancel API Key",()=>new ZK,{palette:!1}),Q("keys.dismissMinted","Dismiss API Key",()=>new DK,{palette:!1}),Q("keys.revoke","Revoke API Key",(B)=>B?new qJ(B):null,{palette:!1}),Q("keys.mint","Create API Key",()=>new WK,{palette:!1}),Q("offline.pin","Make Available Offline",(B)=>new C0(B,!0),{category:"Offline",icon:"download",when:PB}),Q("offline.unpin","Remove from Offline",(B)=>new C0(B,!1),{palette:!1}),Q("collections.switch","Switch Collection…",(B)=>new UK(B),{category:"Collections",icon:"files"}),Q("collections.create","New Collection…",()=>new aA({kind:"collection",title:"New collection"}),{category:"Collections",icon:"files"}),Q("workbench.toggleInfoPanel","Toggle Details & Conversation",()=>new IK,{category:"View",icon:"info"}),Q("notifications.show","Show Notifications",()=>new MQ(!0),{category:"View"}),Q("notifications.enablePush","Enable Push Notifications",()=>new JC,{category:"Notifications"}),Q("plugins.installFromUrl","Install Plugin from URL…",()=>new aA({kind:"prompt",title:"Install plugin from URL",label:"Plugin package (.zip) URL",placeholder:"https://example.com/plugin.zip",confirmLabel:"Fetch",confirmActions:[new tJ]}),{category:"Plugins",icon:"plug"}),Q("plugins.installFromFile","Install Plugin from File…",()=>new FK,{category:"Plugins",icon:"plug"})}function JX(A){let Q=DY(A.settings),B=WY(),C=UY(),J=VY(),K=RY(),E=new sK(A),Y=IY(),X=MY(),L=FY(),G=new fK,H=new IJ(E),Z=new nK(A),F=new uK(A,Z),U={platform:A,explorer:Q,search:B,transfers:H,social:F,offline:Z,activity:E,apiKeys:C,rotation:J,workbench:X,overlay:L,navigation:G,engine:null},M=new lC({providers:{appState:p.fromSingleton(new Map),explorer:p.fromSingleton(Q),search:p.fromSingleton(B),transfers:p.fromSingleton(H),social:p.fromSingleton(F),offline:p.fromSingleton(Z),activity:p.fromSingleton(E),apiKeys:p.fromSingleton(C),rotation:p.fromSingleton(J),acl:p.fromSingleton(K),viewState:p.fromSingleton(Y),engine:p.fromLazySingleton(async()=>M,()=>{}),workbench:p.fromSingleton(X),overlay:p.fromSingleton(L),navigation:p.fromSingleton(G),settings:p.fromSingleton(A.settings),notifications:p.fromSingleton(A.notifications),context:p.fromSingleton(A.context),commands:p.fromSingleton(A.commands),keybindings:p.fromSingleton(A.keybindings),contributions:p.fromSingleton(A.contributions),viewport:p.fromSingleton(A.viewport),voice:p.fromSingleton(A.voice),api:p.fromSingleton(A.api),capabilities:p.fromLazySingleton(async()=>{let V=d(null);return A.api.capabilities().then((x)=>V.setValue(x),()=>{}),V},()=>{}),mediaUrls:p.fromSingleton(A.mediaUrls),plugins:p.fromSingleton(A.plugins)}});return U.engine=M,A.commands.dispatch=(V)=>M.dispatch(V),A.dispatch=(V)=>M.dispatch(V),A.openPluginPanel=(V)=>M.dispatch(new QC(V)),CX(U),iY(A.context,{workbench:X,overlay:L,navigation:G,explorer:Q}),rY(A.context,A.viewport),F.init(),Z.init(),E.init(),M.dispatch(new oB),{engine:M,app:U}}var KX=new WeakMap;function s(A,Q){let B=KX.get(A);if(!B)B=new WeakMap,KX.set(A,B);let C=B.get(Q);if(!C){let J="initial"in Q?Q.initial:iA;C=PC(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)=>s(A,Q[Y])),E=r(K,(...Y)=>Object.fromEntries(J.map((X,L)=>[X,Y[L]])));return w.alias(()=>ZQ(E,B,C))}var p$=new FinalizationRegistry(({table:A,key:Q})=>{if(A.get(Q)&&!A.get(Q).deref())A.delete(Q)});function oK(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)=>oK(J,`${Q}[${K}]`));let C=Object.getPrototypeOf(A);if(C===Object.prototype||C===null)return Object.entries(A).forEach(([J,K])=>oK(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 iK(A){if(A===null||typeof A!=="object")return JSON.stringify(A)??"null";if(Array.isArray(A))return`[${A.map(iK).join(",")}]`;return`{${Object.keys(A).sort().map((Q)=>`${JSON.stringify(Q)}:${iK(A[Q])}`).join(",")}}`}function l$(...A){return A.forEach((Q,B)=>oK(Q,`#${B}`)),A.map(iK).join("|")}function eQ(A,Q=l$){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)),p$.register(Y,{table:B,key:K}),Y}}function c$(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 rK(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=c$(`${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 EX({ex:A={},tr:Q={},act:B={},off:C={}}={}){let J=A.items||[],K=B.tasks||[];return{collectionId:A.collectionId??null,collectionLabel:d$(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:a$(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 d$(A){if(!A?.collectionId)return"no collection";return(A.collections||[]).find((B)=>B.id===A.collectionId)?.name||A.collectionId}function a$(A){if(!A?.total)return"";let Q=A.available/A.total;return Q<0.05?"critical":Q<0.1?"low":""}function YX(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 tK(A){let Q=A||"";return Q.startsWith("!")?"command":Q.includes("#")?"filter":"search"}var n$=(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 s$(A,{pinned:Q=!1,keys:B={}}={}){let C=(J)=>B[J]||void 0;return[{label:"Open",icon:"file-text",actions:[new q("explorer.open",A)]},{label:"Download",icon:"download",actions:[new q("explorer.download",A)]},{label:"Copy shareable link",icon:"link",actions:[new q("explorer.copyShareLink")]},{label:"Copy trove: link",icon:"link",kbd:C("explorer.copyLink"),actions:[new q("explorer.copyLink")]},{sep:!0},{label:"Rename…",actions:[new q("explorer.rename")]},Q?{label:"Remove from offline",icon:"close",actions:[new q("offline.unpin",A)]}:{label:"Make available offline",icon:"download",actions:[new q("offline.pin",A)]},{sep:!0},{label:"Move to trash",icon:"trash",danger:!0,kbd:C("explorer.delete"),actions:[new q("explorer.delete")]}]}function o$(A){return[{label:"Restore",icon:"refresh",actions:[new q("explorer.restore",A.id)]},{sep:!0},{label:"Delete forever",icon:"trash",danger:!0,actions:[new q("explorer.purgeOne",A.id)]}]}function i$(A,{modal:Q,pinnedIds:B,keys:C}){return{icon:n$(A),title:A.name,detail:A.contentType||"",node:A,actions:[new lA(A,{reset:!!Q}),...Q?[new NB]:[]],menu:()=>s$(A,{pinned:B.has(A.id),keys:C})}}function XX(A,Q=!1){let{ex:B={},se:C={},nav:J={},query:K="",commandMatches:E=[],pinnedIds:Y=new Set,keys:X={}}=A,L=tK(K),G=(z)=>i$(z,{modal:Q,pinnedIds:Y,keys:X}),H=Q?[new NB]:[];if(L==="command")return[{id:"commands",title:"Commands",items:E.map((z)=>({icon:"command",title:z.title,detail:z.category,badge:"command",actions:[new q(z.id),...H]})),empty:"No matching commands."}];let{text:Z,filters:F}=dB(K),U=(C.results||[]).map((z)=>z.node),M=C.error,V=(z)=>M?[{icon:"refresh",label:"Retry",title:"Retry",actions:z}]:[];if(F.length){let z=F.map(dC).join(" ")+(Z.trim()?` · "${Z.trim()}"`:"");return[{id:"filtered",title:C.loading?"Filtering…":M?"Filter failed":"Filtered",verbatim:C.loading||M?null:z,controls:V([new RB(F,Z)]),items:U.map(G),empty:C.loading?"Filtering…":M?`Couldn’t filter: ${M}`:"No files match those filters."}]}if(Z.trim())return[{id:"results",title:C.loading?"Searching…":M?"Search failed":"Results",controls:V([new IQ(K)]),items:U.map(G),empty:C.loading?"Searching…":M?`Couldn’t search: ${M}`:"No files match."}];let x=[],m=(J.recents||[]).map(G);if(m.length)x.push({id:"recent",title:"Recent",items:m});let j=(B.items||[]).length,T=B.stats?.items??null,c=T??j,h=T!=null?T.toLocaleString():`${j.toLocaleString()}+`,v=(B.items||[]).map(G);if(B.nextCursor)v.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 q("explorer.loadMore")]});if(B.trash)x.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 q("explorer.emptyTrash")]}]:[],{icon:"close",label:"Close",title:"Hide the trash",actions:[new q("explorer.hideTrash")]}],items:(B.trash||[]).map((z)=>({icon:"trash",title:z.name,detail:`deleted ${new Date(z.deletedAt).toLocaleString()} — restore`,actions:[new q("explorer.restore",z.id)],menu:()=>o$(z)})),empty:"The trash is empty."});return x.push({id:"all",title:B.nextCursor?`All items · showing ${j.toLocaleString()} of ${h}`:"All items",controls:Q?[]:[{icon:"upload",label:"Upload",title:"Upload files to this collection",actions:[new q("explorer.upload")]}],items:v,empty:B.loading?"Loading…":B.error?`Couldn’t load this collection: ${B.error}`:"Nothing here yet — upload a file to get started."}),x}function LX({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}=dB(C.query);return{query:C.query,label:C.label||null,actions:[new rQ(C.query),K.length?new RB(K,J):new IQ(J)]}})}}var GX="explorer.view";function HX({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=(L)=>L.match&&Object.keys(L.match).length&&E.filter((G)=>r$(L,G)).length/E.length>0.6,X=A.find(Y);if(X)return X}return A[0]}function r$(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 YQ{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()),X0(A,this,B.onDirty(()=>Q(J())))}kill(A){L0(A,this)}}function X0(A,Q,B){A.appState.set(Q,B)}function L0(A,Q){let B=A.appState?.get(Q);if(Array.isArray(B))B.forEach((C)=>C());else B?.();A.appState?.delete(Q)}var HC=new JA("explorer",(A)=>A.observe(),(A)=>({...A,selectedNodes:sB(A),collectionMenu:sC(A,(Q)=>new q("collections.switch",Q),()=>new q("collections.create")),collectionAdmin:LY(A,{open:(Q)=>new q("collections.switch",Q),scan:()=>new q("workbench.scanCollection"),rotate:()=>new q("workbench.openSettings"),create:()=>new q("collections.create"),access:(Q)=>new SJ(Q)})})),eK=new JA("search",(A)=>A.observe()),AE=new JA("transfers",(A)=>A.observe()),G0=new JA("activity",(A)=>A.observe()),$C=new JA("social",(A)=>A.observe()),H0=new JA("offline",(A)=>A.observe(),(A)=>({...A,pinnedIds:new Set((A?.pins||[]).map((Q)=>Q.id))})),$X=(A)=>QE.of(A);class QE extends YQ{static deps=["rotation","appState","engine"];static of=eQ(QE);constructor(A){super();this.collectionId=A,this.bootAction=new zB}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 zB)},2500);X0(A,this,[C,()=>clearInterval(J)])}kill(A){L0(A,this)}}var ZX=(A)=>BE.of(A);class BE extends YQ{static deps=["acl","appState"];static of=eQ(BE);constructor(A){super();this.collectionId=A,this.bootAction=new K0(A)}boot(A,{notify:Q}){let B=A.acl.observe();Q(B.getValue()),X0(A,this,B.onDirty(()=>Q(B.getValue())))}kill(A){L0(A,this)}}var DX=new JA("apiKeys",(A)=>A.observe(),(A)=>({...A,draftScopes:nC(A)})),ZC=new JA("workbench",(A)=>A.observe()),CE=new JA("navigation",(A)=>A.observe()),JE=new JA("overlay",(A)=>A.observe()),WX=new JA("notifications",(A)=>A.observe()),$0=new JA("settings",(A)=>A.observe()),UX=new JA("settings",(A)=>A.observe(),(A,Q)=>Q.grouped()),IX=new JA("context",(A)=>A.observe()),FX=new JA("viewport",(A)=>A.observe()),MX=new JA("voice",(A)=>A.observe(),(A,Q)=>({...A,canListen:!!Q.canListen?.()})),Z0=new JA("plugins",(A)=>A?.observe?.()),D0=new JA("viewState",(A)=>A.observe());class RX extends JA{static of=eQ(RX);constructor(A){super("contributions",(Q)=>Q.observeType(A));this.type=A}}class eA extends YQ{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(),X0(A,this,this.sources(A).filter(Boolean).map((C)=>C.onDirty(B)))}kill(A){L0(A,this)}}var RQ=["contributions","context","plugins","settings","commands","keybindings"],VQ=(A)=>[A.contributions.observe(),A.context.observe(),A.plugins?.observe?.(),A.settings.observe()],Y9=new eA(RQ,VQ,KE);function KE(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 t$=[...RQ,"overlay","workbench"],e$=(A)=>[...VQ(A),A.workbench.observe(),A.overlay.observe()],VX=new eA(t$,e$,(A)=>rK(KE(A),A.overlay.get().palette?.query||"")),NX=new eA(RQ,VQ,(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}))}),qX=new eA(RQ,VQ,(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:f0(J.key),custom:!!B[J.bindingId],clash:C.get(J.key)>1}))}),EE=(A=!1)=>YE.of(!!A),AZ=[...RQ,"explorer","search","workbench","navigation","offline","capabilities"];class YE extends eA{static of=eQ(YE);constructor(A){super(AZ,(Q)=>[...VQ(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:rK(KE(Q),(B.launch.query||"").slice(1)),pinnedIds:new Set((C.pins||[]).map((Y)=>Y.id)),keys:wX(Q)},K=XX(J,this.modal),E=tK(J.query);return{groups:K,mode:E,view:HX(jX(Q),K.flatMap((Y)=>Y.items),E==="search"?J.se.resolved?.view??null:null),help:LX({eligible:E!=="command"&&!!J.se.ran&&!J.se.loading&&!J.se.error&&!(J.se.results||[]).length,caps:Q.capabilities.getValue()})}});this.modal=A}}var zX=new eA(["explorer","transfers","activity","offline"],(A)=>[A.explorer.observe(),A.transfers.observe(),A.activity.observe(),A.offline.observe()],(A)=>{let Q=EX({ex:A.explorer.observe().getValue(),tr:A.transfers.observe().getValue(),act:A.activity.observe().getValue(),off:A.offline.observe().getValue()});return{...Q,condition:YX(Q)}}),PX=new eA(RQ,VQ,(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)=>WJ(Q,A.plugins))),OX=new eA(RQ,VQ,jX);function jX(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 _X=new eA(RQ,VQ,(A)=>{let Q=A.settings.get(MB)||{};return Object.entries(Q).map(([B,C])=>{let J=A.contributions.get(C);return{typeKey:B,openerId:C,openerTitle:J?.title||C,missing:!J}})}),SX=(A)=>XE.of(A);class XE extends JA{static of=eQ(XE);constructor(A){super("social",(Q)=>Q.observe(),(Q)=>Q?.sidecar??null);this.nodeId=A,this.bootAction=new KC(A),this.killAction=new RK(A)}}class OB extends YQ{static deps=["api"];static of=eQ(OB);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 TX=new eA(RQ,VQ,wX);function wX(A){return Object.fromEntries(A.keybindings.resolved().map((Q)=>[Q.command,A.keybindings.labelFor(Q.command)]).filter(([,Q])=>Q))}var DC=new JA("capabilities",(A)=>A);var{svg:QZ,h:BZ}=w,LE={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 I(A,{size:Q=18,strokeWidth:B=1.6,className:C}={}){let J=Object.hasOwn(LE,A)?LE[A]:LE.file;return QZ({$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)=>BZ("path",{$attrs:CZ(K)})))}function CZ(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 GE(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 JZ=/@\[([^\]]+)\]\(([^)]+)\)|(?:^|\s)@([a-zA-Z0-9._@-]{2,})/g;function xX(A){let Q=A||"",B=[],C=new RegExp(JZ.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:b,span:HA,button:TA,textarea:KZ,input:EZ,p:V9}=w,YZ=["\uD83D\uDC4D","❤️","\uD83C\uDF89","\uD83D\uDC40","\uD83D\uDE80"];function gX(A){let Q=A.so.me;if(!Q||Q.anonymous)return null;let B=(Q.name||Q.id||"?")[0].toUpperCase();return b({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 yX(A,Q){let B=A.so.notifications;return b({className:"bell-wrap"},TA({className:"iconbtn bell",title:"Notifications"},I("bell",{size:19}),B.unread?HA({className:"bell-badge"},String(B.unread>9?"9+":B.unread)):null).on({click:()=>Q.engine.dispatch(new MQ)}),A.so.inboxOpen?XZ(A,Q):null)}function XZ(A,Q){let B=A.so.notifications.items;return b({},b({className:"scrim",$styling:{background:"transparent","z-index":"54"}}).on({click:()=>Q.engine.dispatch(new MQ(!1))}),b({className:"inbox"},b({className:"inbox-head"},HA("Notifications"),A.so.pushSupported&&!A.so.pushEnabled?TA({className:"link"},"Enable push").on({click:()=>Q.engine.dispatch(new JC)}):A.so.pushEnabled?HA({className:"muted"},I("check",{size:13})):null),B.length?b({className:"inbox-items"},...B.slice(0,30).map((C)=>LZ(C,Q))):b({className:"inbox-empty"},I("info",{size:24}),HA("You’re all caught up."))))}function LZ(A,Q){let B=A.items?.[0];return b({className:`inbox-item ${A.read?"":"unread"}`},b({className:"ii-title"},A.title),B?.excerpt?b({className:"ii-excerpt"},"“"+B.excerpt+"”"):null,b({className:"ii-time"},GE(A.createdAt))).on({click:()=>{if(B?.nodeId)Q.engine.dispatch(new iJ(B.nodeId));Q.engine.dispatch(new MQ(!1))}})}function hX(A,Q){let B=A.nav,C=B.activeFile?{id:B.activeTabId,node:B.activeFile}:null;return b({className:"infopanel"},b({className:"ip-head"},I("info",{size:15}),HA("Details"),TA({className:"iconbtn",title:"Close"},I("close",{size:14})).on({click:()=>Q.engine.dispatch(new AC(!1))})),!C?b({className:"ip-empty"},HA("Open a file to see its tags and conversation.")):Q.watch(s(Q.engine,SX(C.node.id)),(J)=>b({className:"ip-body"},GZ(C.node,A,Q),HZ(C.node,A,Q),ZZ(J,Q),DZ(A,J,Q))))}function GZ(A,Q,B){let C=Q.off?.pinnedIds?.has(A.id)??!1;return b({className:"ip-file"},b({className:"ip-name"},A.name),b({className:"ip-path"},A.contentType||""),TA({className:`btn small ${C?"on":""}`,$styling:{"margin-top":"10px"}},I(C?"check":"download",{size:14}),C?"Available offline":"Make available offline").on({click:()=>C?B.engine.dispatch(new q("offline.unpin",A)):B.engine.dispatch(new q("offline.pin",A))}))}function HZ(A,Q,B){let C=Q.so.backlinks,J=A.collectionId?nB(A):null,K=C&&C.nodeId===A.id?C:null;return b({className:"ip-section"},b({className:"ip-label"},"Links"),J?TA({className:"ip-uri",title:"Copy this item’s link"},I("link",{size:12}),HA(J)).on({click:()=>$Z(B,J)}):null,b({className:"ip-label",$styling:{"margin-top":"10px"}},"Linked from"),K?.loading?b({className:"ip-muted"},"Loading…"):K?.error?b({className:"ip-muted error"},`Couldn’t load links: ${K.error}`):K?.items?.length?b({className:"ip-backlinks"},...K.items.map((E)=>TA({className:"ip-backlink",title:E.name},I("file-text",{size:12}),HA(E.name)).on({click:()=>B.engine.dispatch(new lA(E))}))):b({className:"ip-muted"},"Nothing links here yet."))}function $Z(A,Q){A.engine.dispatch(new tA(Q,`Copied ${Q}`))}function ZZ(A,Q){let B=A?.tags||[];return b({className:"ip-section"},b({className:"ip-label"},"Tags"),b({className:"tags"},...B.map((C)=>HA({className:"tag"},C.value?`${C.name}: ${C.value}`:C.name,TA({className:"tag-x"},I("close",{size:11})).on({click:()=>Q.engine.dispatch(new pJ(C.name))}))),EZ({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 mJ(K.trim(),E.join(":").trim()||void 0)),C.target.value=""}}})))}function DZ(A,Q,B){if(Q?.loading)return b({className:"ip-section"},b({className:"spinner"}));let C=Q?.comments||[],J=Q?.error?b({className:"conv-empty"},HA(`Couldn't load the conversation: ${Q.error}`),TA({className:"btn",$styling:{"margin-top":"8px"}},"Retry").on({click:()=>B.engine.dispatch(new KC(Q.nodeId))})):C.length?b({className:"thread"},...C.map((K)=>bX(K,A,B,0))):b({className:"conv-empty"},"No comments yet. Start the discussion — use @ to mention someone.");return b({className:"ip-section conv"},b({className:"ip-label"},`Conversation${Q?.commentCount?` · ${Q.commentCount}`:""}`),J,Q?.error?null:WZ(A,B))}function bX(A,Q,B,C){let J=Q.so.me,K=J&&A.author?.id===J.id;return b({className:"comment",$styling:C?{marginLeft:"18px"}:{}},b({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"},GE(A.createdAt),A.edited?" · edited":"")),A.deleted?b({className:"c-body deleted"},"comment deleted"):b({className:"c-body"},UZ(A.body)),!A.deleted?b({className:"c-actions"},...YZ.map((E)=>{let Y=A.reactions?.[E]||[];return TA({className:`react ${Y.includes(J?.id)?"on":""}`},E,Y.length?HA({className:"rc"},String(Y.length)):null).on({click:()=>B.engine.dispatch(new uJ(A.id,E))})}),TA({className:"c-link"},"Reply").on({click:()=>B.engine.dispatch(new eC({id:A.id,author:A.author}))}),K?TA({className:"c-link danger"},"Delete").on({click:()=>B.engine.dispatch(new fJ(A.id))}):null):null,(A.replies||[]).length?b({className:"replies"},...A.replies.map((E)=>bX(E,Q,B,C+1))):null).key(A.id)}function WZ(A,Q){let B=A.so.me,C=A.so.replyTo;if(!B){if(!A.off?.online)return b({className:"conv-signin"},"You’re offline. Conversations come back when you reconnect.");return b({className:"conv-signin"},HA("You’re signed out, so you can read this conversation but not add to it."),TA({className:"c-link"},"Reload to sign in").on({click:()=>window.location.reload()}))}return b({className:"composer"},C?b({className:"replying"},`Replying to ${C.author?.name||"comment"}`,TA({className:"c-link"},"cancel").on({click:()=>Q.engine.dispatch(new eC(null))})):null,KZ({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 tC(J.target.value)),J.target.value=""}}),b({className:"composer-actions"},HA({className:"muted"},"⌘/Ctrl + Enter"),TA({className:"btn primary",disabled:A.so.posting},"Comment").on({click:(J)=>{let K=J.target.closest(".composer").querySelector(".composer-input");Q.engine.dispatch(new tC(K.value)),K.value=""}})))}function UZ(A){return xX(A).map((Q)=>Q.type==="mention"?HA({className:"mention"},`@${Q.name}`):Q.value)}var{div:vX,button:HE,span:IZ,img:FZ}=w,MZ=[{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 $E(A,Q){let B=A.wb.activity,C=A.plugins?.filter((J)=>J.status==="active").length||0;return vX({className:"activitybar"},HE({className:"brand-mark",title:"Trove — home"},FZ({src:"/icon.svg",alt:"Trove"})).on({click:()=>Q.engine.dispatch(new q("workbench.view.home"))}),...MZ.map((J)=>HE({className:`item ${B===J.id?"active":""}`,title:J.title},I(J.icon,{size:22}),J.id==="plugins"&&C?IZ({className:"badge"},String(C)):null).on({click:()=>Q.engine.dispatch(new q(J.command))})),vX({className:"spacer"}),yX(A,Q),HE({className:`item ${B==="settings"?"active":""}`,title:"Settings"},I("gear",{size:21})).on({click:()=>Q.engine.dispatch(new q("workbench.openSettings"))}),gX(A))}var RZ=new Set(["SPAN","B","STRONG","I","EM","CODE","SMALL","BR","S","U"]),VZ=new Set(["class","title"]);function fX(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=lX(J,C);if(K)Q.appendChild(K)}return Q}function uX(A){return(fX(A).textContent||"").trim()}function mX(A,Q){return[...fX(A).childNodes].map((B)=>pX(B,Q)).filter((B)=>B!=null)}function pX(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)=>pX(J,Q)).filter((J)=>J!=null))}function lX(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(!RZ.has(A.tagName))return null;let B=document.createElement(A.tagName.toLowerCase());for(let C of A.attributes){let J=C.name.toLowerCase();if(!VZ.has(J))continue;B.setAttribute(J,C.value.slice(0,200))}for(let C of A.childNodes){let J=lX(C,Q);if(J)B.appendChild(J)}return B}var{div:AB,button:QB,span:$A}=w;function cX(A,Q){let B=mX(A.html,w);if(!B.length)return null;let C=A.tooltip?uX(A.tooltip):"";return A.command?QB({className:"seg",title:C},...B).on({click:()=>Q.engine.dispatch(new q(A.command))}):$A({className:"seg",title:C},...B)}function NZ(A,Q){let B=A.act||{tasks:[],issues:[]},C=B.tasks.filter((E)=>E.status==="running"),J=()=>Q.engine.dispatch(new dA(!0)),K=[];if(C.length){let E=C[0],X=E.total!=null&&E.total>0?Math.round((E.done||0)/E.total*100):null;K.push(QB({className:"seg sb-activity",title:C.map((L)=>L.title).join(`
348
- `)},AB({className:"spinner",$styling:{width:"11px",height:"11px"}}),$A(C.length>1?`${C.length} running`:`${E.title}${X==null?"":` ${X}%`}`)).on({click:J}))}if(B.issues.length)K.push(QB({className:"seg sb-attention",title:B.issues.map((E)=>E.title).join(`
349
- `)},I("info",{size:12}),$A(`${B.issues.length} need${B.issues.length===1?"s":""} attention`)).on({click:J}));return K}function ZE({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`},AB({className:"usage-bar"},AB({className:"usage-fill",$styling:{width:`${B}%`}})),$A(`${KA(A.available)} free`))}function DE(A,Q){let B=A.ex,C=B.items||[],J=A.facts,{totalItems:K,totalBytes:E}=J,Y=A.caps,X=J.uploading,L=A.statusItems||[],G=L.filter((F)=>F.slot==="left").map((F)=>cX(F,Q)),H=L.filter((F)=>F.slot!=="left").map((F)=>cX(F,Q)),Z=J.off;return AB({className:"statusbar"},!Z.online?$A({className:"seg offline-badge",title:"You are offline — pinned files and cached data are available"},I("info",{size:12}),$A("Offline")):Z.syncing?$A({className:"seg",title:"Syncing offline changes"},AB({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?QB({className:"seg",title:`${Z.pins.length} file(s) available offline`},I("download",{size:12}),$A(`${Z.pins.length} offline`),I("chevron-down",{size:11})).on({click:(F)=>{let U=Z.pins.slice(0,12).flatMap((V)=>[{label:V.name,icon:"file-text",actions:[new q("explorer.open",V)]},{label:`Remove “${V.name}” from offline`,icon:"close",actions:[new q("offline.unpin",V)]},{sep:!0}]);if(Z.pins.length>12)U.push({label:`…and ${Z.pins.length-12} more`,actions:[]});let M=F.currentTarget.getBoundingClientRect();Q.engine.dispatch(new hQ(M.left,M.top-8-U.length*34,U))}}):null,QB({className:"seg",title:"Switch collection"},I("files",{size:13}),$A(J.collectionLabel),(B.collections||[]).length>1||B.canCreateCollection?I("chevron-down",{size:11}):null).on({click:(F)=>{let U=B.collectionMenu||[];if(U.length>1||B.canCreateCollection){let M=F.currentTarget.getBoundingClientRect();Q.engine.dispatch(new hQ(M.left,M.top-8-U.length*34,U))}else Q.engine.dispatch(new q("workbench.view.home"))}}),X.length?QB({className:"seg",title:"Active uploads — click to cancel"},AB({className:"spinner",$styling:{width:"11px",height:"11px"}}),$A(`${X.length} uploading`)).on({click:(F)=>Q.engine.dispatch(new hQ(F.clientX,F.clientY,X.map((U)=>({label:`Cancel ${U.name} (${Math.round((U.ratio||0)*100)}%)`,icon:"close",danger:!0,actions:[new CC(U.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"}`),...G,AB({className:"spacer"}),...NZ(A,Q),...H,$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?"":"+"}`),ZE(J),Y?$A({className:"seg",title:"Storage backend capabilities"},I(Y.storage?.presignDownload?"download":"files",{size:12}),$A(Y.storage?.presignDownload?"S3 direct":"proxied")):null,Y?.features?.semanticSearch?QB({className:"seg",title:"Semantic search enabled"},I("star",{size:12}),$A("semantic")).on({click:()=>Q.engine.dispatch(new q("workbench.view.home"))}):null)}function nA(A,Q){for(let B of Q?.actions||[])A.engine.dispatch(B)}var{div:WE,span:dX,button:aX}=w;function W0(A,Q){let B=A.controls||[];return WE({className:"launch-h"},WE({className:"lh-title"},dX(A.title),A.verbatim?dX({className:"lh-verbatim"},A.verbatim):null),B.length?WE({className:"lh-actions"},...B.map((C)=>aX({className:"launch-up",title:C.title||C.label},C.icon?I(C.icon,{size:13}):null,C.label).on({click:()=>nA(Q,C)}))):null)}function U0(A,Q,B){if(!A.menu)return null;return aX({className:"launch-more",title:`Actions for ${A.title}`,$attrs:{"aria-label":`Actions for ${A.title}`}},I("dots",{size:14})).on({click:(C)=>{C.stopPropagation(),BB(C.currentTarget,A,Q,null,B)}})}function BB(A,Q,B,C,J){let K=A?.getBoundingClientRect?.(),E=C?.clientX??(K?K.right-8:0),Y=C?.clientY??(K?K.bottom:0),X=Q.menu();J?.(),B.engine.dispatch(new hQ(E,Y,X))}var{div:WC,span:UE}=w;function I0({groups:A,index:Q,handlers:B,ui:C}){let J=-1;return WC({className:"launch-view view-list"},...A.map((K)=>WC({className:"launch-group"},W0(K,C),K.items.length?WC({className:"launch-list"},...K.items.map((E)=>{let Y=++J;return qZ(E,Y===Q,{hover:()=>B.hover(Y),select:()=>B.select(Y)},C)})):WC({className:"launch-empty"},K.empty||"Nothing here."))))}function qZ(A,Q,{hover:B,select:C},J){return WC({className:`launch-item ${Q?"active":""}`},I(A.icon,{size:15}),UE({className:"name"},A.title),A.detail?UE({className:"launch-detail"},A.detail):null,A.badge?UE({className:"launch-kind"},A.badge):null,U0(A,J,C)).on({click:()=>nA(J,A),mouseenter:B,...A.menu?{contextmenu:(K)=>{K.preventDefault(),BB(K.currentTarget,A,J,K,C)}}:{}})}function jB(A,Q,B,{op:C="media",onError:J}={}){let K=B.platform.mediaUrls,E=null,Y=!1,X=!1,L=()=>{clearTimeout(E),E=null},G=(U)=>{if(L(),!Number.isFinite(U))return;let M=Math.max(1000,(U-Date.now())*0.8);E=setTimeout(()=>H({resume:!0}),Math.min(M,2147483647))};async function H({resume:U}){if(Y)return;let M=zZ(A),V=M&&U?A.currentTime:0,x=M&&U?!A.paused&&!A.ended:!1,m;try{m=await K.url(Q.id,{op:C})}catch(j){if(!Y)J?.(j.message);return}if(Y)return;if(A.src=m.url,M){if(A.load(),V>0||x){let j=()=>{if(A.removeEventListener("loadedmetadata",j),V>0&&Number.isFinite(A.duration)&&A.duration>V)A.currentTime=V;if(x)A.play().catch(()=>{})};A.addEventListener("loadedmetadata",j)}}G(m.expiresAt)}let Z=()=>{X=!1};A.addEventListener("load",Z),A.addEventListener("loadeddata",Z);let F=()=>{if(Y)return;if(X){J?.(null);return}X=!0,K.invalidate(Q.id,C),H({resume:!0})};return A.addEventListener("error",F),H({resume:!1}),()=>{Y=!0,L(),A.removeEventListener("error",F),A.removeEventListener("load",Z),A.removeEventListener("loadeddata",Z)}}function zZ(A){return typeof A?.play==="function"&&typeof A?.load==="function"}var{div:CB,span:PZ,img:OZ}=w;function nX({groups:A,index:Q,handlers:B,ui:C}){let J=-1;return CB({className:"launch-view view-grid"},...A.map((K)=>CB({className:"launch-group"},W0(K,C),K.items.length?CB({className:"grid-list"},...K.items.map((E)=>{let Y=++J;return _Z(E,Y===Q,{hover:()=>B.hover(Y),select:()=>B.select(Y)},C)})):CB({className:"launch-empty"},K.empty||"Nothing here."))))}function sX({key:A,textual:Q}){if(A==="ArrowLeft")return Q?null:-1;if(A==="ArrowRight")return Q?null:1;let B=jZ();if(A==="ArrowUp")return-B;if(A==="ArrowDown")return B;return null}function jZ(){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 _Z(A,Q,{hover:B,select:C},J){let K=A.node,E=(K?.contentType||"").startsWith("image/");return CB({className:`grid-tile ${Q?"active":""}`,title:A.detail?`${A.title} — ${A.detail}`:A.title},CB({className:"gt-media"},I(K?UQ(K):A.icon,{size:26}),E?OZ({className:"gt-img",alt:"",loading:"lazy",decoding:"async"}).on({$attach:(Y)=>{Y._detachMedia=jB(Y,K,J,{onError:()=>{Y.style.display="none"}})},$detach:(Y)=>{Y._detachMedia?.(),Y._detachMedia=null}}).opaque():null,A.badge?PZ({className:"gt-badge"},A.badge):null,U0(A,J,C)),CB({className:"gt-name"},A.title)).on({click:()=>nA(J,A),mouseenter:B,...A.menu?{contextmenu:(Y)=>{Y.preventDefault(),BB(Y.currentTarget,A,J,Y,C)}}:{}})}var{div:IE,button:SZ,span:TZ}=w,wZ={"core.view.list":{title:"List",icon:"list",priority:50,render:I0},"core.view.grid":{title:"Grid",icon:"grid",priority:40,match:{mime:["image/*","video/*"]},render:nX,move:sX}};function oX(A){for(let[Q,B]of Object.entries(wZ))A.contributions.register(Q,{type:"view",...B})}function iX(A,Q,B){let C=A?.views||[];if(C.length<2)return null;return IE({className:"view-switch"},...C.map((J)=>SZ({className:`vs-btn ${J.id===Q?.id?"on":""}`,title:`${J.title} view`,"aria-pressed":J.id===Q?.id?"true":"false"},I(J.icon||"list",{size:14})).on({click:()=>B.engine.dispatch(new bQ(GX,J.id))})))}function rX(A,Q,B){try{let C=A?.move?.({key:Q,...B});return Number.isFinite(C)&&C!==0?C:null}catch{return null}}function tX(A,Q){try{if(typeof A?.render==="function")return A.render(Q)}catch(B){return console.error(`view "${A?.id}" failed`,B),IE({},IE({className:"view-error"},I("warn",{size:13}),TZ(`The “${A?.title||A?.id}” view could not be drawn — showing the list instead.`)),I0(Q))}return I0(Q)}var{div:fQ,span:_B,input:kZ,button:FE}=w,xZ=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]);function gZ(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 F0=null;function yZ(A,Q){clearTimeout(F0),F0=setTimeout(()=>A.engine.dispatch(new IQ(Q)),240)}function eX(A){A.engine.dispatch(new rQ("")),A.engine.dispatch(new IQ(""))}function hZ(A,Q,B){clearTimeout(F0),F0=setTimeout(()=>A.engine.dispatch(new RB(Q,B)),200)}function M0(A,Q,B={}){let C=!!B.modal,J=A.wb.launch.query,K=C?A.modalContent:A.content,{groups:E,mode:Y,view:X}=K,L=E.flatMap((j)=>j.items),G=L.length?Math.min(A.wb.launch.index,L.length-1):0,H=(j)=>{let T=j.target.value;if(Q.engine.dispatch(new rQ(T)),T.startsWith("!"))return;let{text:c,filters:h}=dB(T);if(h.length)hZ(Q,h,c);else yZ(Q,c)},Z=(j)=>Q.engine.dispatch(new TJ(j)),F=(j)=>Q.engine.dispatch(new aJ(j,L[j]?.node)),U=(j)=>Q.engine.dispatch(new dJ(j,L.map((T)=>T.node))),M=(j)=>{let T=xZ.has(j.key)?rX(X,j.key,{index:G,count:L.length,textual:J.length>0}):null;if(T!==null)j.preventDefault(),U(T);else if(j.key==="ArrowDown")j.preventDefault(),U(1);else if(j.key==="ArrowUp")j.preventDefault(),U(-1);else if(j.key==="Enter")j.preventDefault(),nA(Q,L[G]);else if(j.key==="Escape"&&J)j.preventDefault(),eX(Q);else if(j.key==="ContextMenu"||j.shiftKey&&j.key==="F10"){let c=L[G];if(c?.menu)j.preventDefault(),BB(document.querySelector(".launch-item.active, .grid-tile.active"),c,Q)}},V=Y==="search"?A.se.resolved:null,x=V&&(V.source==="llm"||V.tagFilters&&V.tagFilters.length||(V.semanticText||"").trim()!==J.trim()),m=fQ({className:"launcher"},fQ({className:"launch-box"},I(Y==="command"?"command":Y==="filter"?"tag":"search",{size:18}),kZ({className:"launch-input",value:J,autofocus:!0,spellcheck:!1,placeholder:gZ(A.caps,{compact:A.vp?.mode==="phone",modal:C})}).on({input:H,keydown:M}),J?FE({className:"launch-clear",title:"Clear"},I("close",{size:14})).on({click:()=>eX(Q)}):null,A.voice?.canListen?FE({className:`launch-mic ${A.voice?.listening?"on":""}`,title:A.voice?.listening?"Stop listening":"Search by voice","aria-pressed":A.voice?.listening?"true":"false"},I("mic",{size:15})).on({click:()=>Q.engine.dispatch(new q("search.voice"))}):null,C?null:iX(A.views,X,Q)),x?bZ(V):null,fQ({className:"launch-body"},tX(X,{groups:E,index:G,handlers:{hover:Z,select:F},state:A,ui:Q}),vZ(K.help,Q)));return C?m:fQ({className:"editor"},m)}function bZ(A){return fQ({className:"launch-resolved"},_B({className:"rq-label"},A.source==="llm"?"Interpreted as":"Searching"),(A.semanticText||"").trim()?_B({className:"rq-text"},`“${A.semanticText.trim()}”`):null,...(A.tagFilters||[]).map((Q)=>_B({className:"rq-chip"},I("tag",{size:11}),dC(Q))))}function vZ(A,Q){if(!A)return null;return fQ({className:"launch-help"},A.hint?fQ({className:"lh-hint"},I("info",{size:13}),_B(A.hint)):null,A.examples.length?fQ({className:"lh-examples"},...A.examples.map((B)=>FE({className:"lh-example",title:B.label||"Try this search"},_B({className:"lh-q"},B.query),B.label?_B({className:"lh-label"},B.label):null).on({click:()=>nA(Q,B)}))):null)}var{div:R,h2:fZ,h3:JB,p:NQ,span:EA,select:uZ,option:mZ,input:SB,label:CL,button:yA,ul:V7,li:N7,code:pZ}=w;function ME(A,Q){let B=A.settingsGroups||new Map;return R({className:"editor"},R({className:"stage"},R({className:"settings"},fZ("Settings"),NQ({className:"sub"},"Preferences are stored in this browser. Plugins contribute their own settings here too."),...B.map((C)=>lZ(C,Q)),aZ(Q,A.caps),AD(A,Q),sZ(A,Q),JD(A.assoc,Q),KD(Q))))}function lZ(A,Q){return R({className:"group"},JB(A.category),...A.items.map((B)=>cZ(B,Q)))}function cZ(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"},dZ(A,Q)))}function dZ(A,Q){let B=(C)=>Q.engine.dispatch(new bQ(A.key,C));if(A.type==="boolean")return CL({className:"switch"},SB({type:"checkbox",checked:!!A.value}).on({change:(C)=>B(C.target.checked)}),EA({className:"track"}));if(A.type==="enum")return uZ({className:"input"},...A.enum.map((C,J)=>mZ({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 SB({className:"input",type:"number",value:A.value,$attrs:{min:A.minimum??"",max:A.maximum??""}}).on({change:C})}return SB({className:"input",value:A.value??""}).on({change:(C)=>B(C.target.value)})}function aZ(A,Q){if(!Q)return null;let B=Q.mcp,C=Q.auth||{authorizationServers:[],source:"none"};if(!B?.enabled)return R({className:"group"},JB("AI agents (MCP)"),NQ({className:"sub"},"MCP is switched off on this server. Set TROVE_MCP=on to enable it."));let J=(Y)=>()=>A.engine.dispatch(new tA(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"},JB("AI agents (MCP)"),NQ({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"},I("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"},I("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 nZ=[{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"}],JL="*",AL=!1;function sZ(A,Q){let B=A.keys||{};if(!AL&&!B.loaded&&!B.loading)AL=!0,Q.engine.dispatch(new q("keys.load"));if(B.error&&!B.keys?.length)return null;if(!B.loaded)return null;let C=A.ex?.collections||[];return R({className:"group"},JB("API keys"),NQ({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?oZ(B.minted,Q):null,B.draft?iZ(B,C,Q):null,!B.draft&&!B.minted?R({className:"keys-actions"},yA({className:"btn"},I("plus",{size:14}),"New key").on({click:()=>Q.engine.dispatch(new q("keys.new"))})):null,B.keys?.length?R({className:"keys-list"},...B.keys.map((J)=>rZ(J,B,C,Q))):R({className:"keys-empty"},"No keys yet."))}function oZ(A,Q){let B=()=>Q.engine.dispatch(new tA(A.secret,"Key copied"));return R({className:"key-minted"},R({className:"key-minted-head"},I("warn",{size:15}),EA(`“${A.key.name}” is ready — copy it now.`)),NQ({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"},pZ({className:"mono"},A.secret),yA({className:"btn small",title:"Copy"},I("link",{size:13})).on({click:B})),R({className:"keys-actions"},yA({className:"btn"},"Done").on({click:()=>Q.engine.dispatch(new q("keys.dismissMinted"))})))}function iZ(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"},SB({className:"input",value:C.name,$attrs:{placeholder:"CI uploader"}}).on({input:(E)=>B.engine.dispatch(new A0({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"},SB({className:"input",type:"number",value:C.expiresInDays,$attrs:{min:"1",max:"3650",placeholder:"never"}}).on({input:(E)=>B.engine.dispatch(new A0({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.")),QL({id:JL,name:"All collections",wildcard:!0},C,B),...Q.map((E)=>QL(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 q("keys.mint"))}),yA({className:"btn"},"Cancel").on({click:()=>B.engine.dispatch(new q("keys.cancel"))})))}function QL(A,Q,B){let C=new Set(Q.caps[A.id]||[]);return R({className:`key-scope ${A.wildcard?"wildcard":""}`},R({className:"key-scope-name"},I(A.wildcard?"grid":"files",{size:14}),EA(A.name||A.id)),R({className:"key-scope-caps"},...nZ.map((J)=>CL({className:`cap ${C.has(J.id)?"on":""}`,title:J.hint},SB({type:"checkbox",checked:C.has(J.id)}).on({change:()=>B.engine.dispatch(new cJ(A.id,J.id))}),EA(J.label)))))}function rZ(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"},...tZ(A,B)),R({className:"key-row-meta"},eZ(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 q("keys.revoke",A.id))}):null)}function tZ(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===JL?"all collections":B(C.collectionId)),EA({className:"what"},C.capabilities.join(" · "))))}function eZ(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 AD(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(s(Q.engine,$X(B)),(J)=>QD(C,J||{},Q))}function QD(A,Q,B){let C=Q.rotation?.status==="running",J=Q.estimate;return R({className:"group"},JB("Encryption"),NQ({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 tA(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.`:BD(J))),R({className:"control"},C?yA({className:"btn small",disabled:!!Q.busy},"Stop").on({click:()=>B.engine.dispatch(new qK)}):yA({className:"btn small",disabled:!!Q.busy},"Rotate").on({click:()=>B.engine.dispatch(new NK)}))),C?null:R({},CD(J),NQ({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 BD(A){if(!A)return"Re-seals every file under a fresh key.";return A.summary||"Re-seals every file under a fresh key."}function CD(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 JD(A,Q){return R({className:"group"},JB("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"},I("close",{size:14})).on({click:()=>Q.engine.dispatch(new EC(B.typeKey,null))}))))):NQ({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 KL="keybindingCapture",BL=null;function KD(A){return BL??=NA(A.engine,{bindings:qX,view:D0},(Q)=>ED(Q.bindings||[],A,Q.view?.[KL]??null)),BL()}function ED(A,Q,B){let C=(E)=>Q.engine.dispatch(new tQ(KL,E)),J=()=>C(null),K=(E,Y)=>Q.engine.dispatch(new zJ(E,Y));return R({className:"group"},JB("Keyboard Shortcuts"),NQ({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"},I("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:(X)=>{if(!Y)return;if(X.preventDefault(),X.stopPropagation(),X.key==="Escape")return J();if(X.key==="Backspace")return K(E.bindingId,null),J();if(["Control","Meta","Alt","Shift"].includes(X.key))return;K(E.bindingId,v0(X)),J()},$attach:(X)=>{if(Y)queueMicrotask(()=>X.focus())}}),E.custom?yA({className:"c-link",title:"Back to the default"},"reset").on({click:()=>{K(E.bindingId,null),C(null)}}):null))}))}var{div:AQ,h2:EL,p:YL,button:VE,span:RE}=w;function NE(A,Q){let B=A.ex||{};return AQ({className:"editor"},AQ({className:"stage"},AQ({className:"gate"},B.gate==="create"?YD(Q):XD(B,Q))))}function YD(A){return AQ({className:"gate-card"},AQ({className:"gate-icon"},I("files",{size:26})),EL("Make your first collection"),YL({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."),AQ({className:"gate-actions"},VE({className:"btn primary"},I("plus",{size:14}),"New collection").on({click:()=>A.engine.dispatch(new q("collections.create"))})))}function XD(A,Q){let B=A.collections||[];return AQ({className:"gate-card"},AQ({className:"gate-icon"},I("grid",{size:26})),EL(B.length===1?"Open your collection":"Choose a collection"),YL({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."),AQ({className:"gate-list"},...B.map((C)=>VE({className:"gate-choice"},AQ({className:"gate-choice-main"},RE({className:"n"},C.name||C.id),RE({className:"d"},C.driver?`${C.driver}${C.description?` · ${C.description}`:""}`:C.description||"")),RE({className:"gate-caps"},(C.capabilities||[]).join(" · "))).on({click:()=>Q.engine.dispatch(new q("collections.switch",C.id))}))),A.canCreateCollection?AQ({className:"gate-actions"},VE({className:"btn"},I("plus",{size:14}),"New collection").on({click:()=>Q.engine.dispatch(new q("collections.create"))})):null)}var{div:i,span:hA,p:LD,button:UC,h2:GD,input:qE,label:HD}=w;function zE(A,Q){let B=A.plugins||[];return i({className:"editor"},i({className:"stage"},i({className:"plugins"},GD("Plugins"),LD({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."),i({className:"plugin-install"},UC({className:"btn primary"},I("upload",{size:15}),"Install from file…").on({click:()=>Q.engine.dispatch(new q("plugins.installFromFile"))}),UC({className:"btn"},I("plug",{size:15}),"Install from URL…").on({click:()=>Q.engine.dispatch(new q("plugins.installFromUrl"))})),B.length?i({$styling:{display:"flex","flex-direction":"column",gap:"12px","margin-top":"14px"}},...B.map((C)=>$D(C,A,Q))):i({className:"empty",$styling:{padding:"48px"}},I("plug",{size:30}),hA("No plugins installed yet.")))))}function $D(A,Q,B){let C=!A.responsive?"not responding":A.manifest?.online===!1?"offline":"connected",J=A.features||[];return i({className:"plugin-card"},i({className:"top"},i({className:"avatar"},(A.name||"?")[0].toUpperCase()),i({$styling:{flex:"1"}},i({className:"name"},A.name,A.version?hA({$styling:{color:"var(--text-faint)","font-weight":"400","margin-left":"6px"}},"v"+A.version):null),i({$styling:{"font-size":"11px",color:"var(--text-faint)"}},A.id)),WD(A.trust),hA({className:`status ${A.status}`},A.status)),A.error?i({className:"desc",$styling:{color:"var(--danger)"}},A.error):null,i({className:"caps"},...(A.capabilities||[]).map((K)=>hA({className:"cap"},K))),(A.endpoints||[]).length?i({className:"plugin-endpoints",$styling:{"font-size":"11px",color:"var(--text-faint)","margin-top":"2px"}},I("plug",{size:11})," Network: ",(A.endpoints||[]).map((K)=>K.host).join(", ")):null,A.status==="active"?i({className:"plugin-features"},i({className:"pf-head"},hA(`Features · ${C}`),hA({className:"muted"},`${J.filter((K)=>K.available).length}/${J.length} available`)),J.length?i({className:"pf-list"},...J.map(ID)):i({className:"muted",$styling:{"font-size":"12px"}},A.responsive?"No contributions announced.":"No manifest received — the plugin may not be running.")):null,(A.settingsSchema||[]).length?ZD(A,B,Q):null,i({className:"actions"},A.hasUi?UC({className:"btn"},I("command",{size:14}),"Open panel").on({click:()=>B.engine.dispatch(new QC(A.id))}):null,UC({className:"btn"},I("refresh",{size:14}),"Refresh").on({click:()=>B.engine.dispatch(new sJ(A.id))}),UC({className:"btn danger"},"Uninstall").on({click:()=>B.engine.dispatch(new aA({kind:"confirm",title:`Uninstall ${A.name}?`,danger:!0,confirmLabel:"Uninstall",body:"The plugin and all data it stored will be removed.",confirmActions:[new MJ(A.id)]}))})))}function ZD(A,Q,B){return i({className:"plugin-features"},i({className:"pf-head"},hA("Settings")),i({$styling:{display:"flex","flex-direction":"column",gap:"8px"}},...A.settingsSchema.map((C)=>DD(A,C,Q,B))))}function DD(A,Q,B,C){let J=`${A.id}.${Q.key}`,K=Q.secret?"":C.settings?.[J]??Q.default??"";return i({className:"setting",$styling:{padding:"6px 0"}},i({className:"info"},i({className:"t"},Q.title||Q.key),Q.description?i({className:"d"},Q.description):null),i({className:"control"},Q.secret?qE({className:"input",type:"password",placeholder:"Set secret…"}).on({change:(E)=>{if(E.target.value)B.engine.dispatch(new oJ(A.id,Q.key,E.target.value)),E.target.value="",E.target.placeholder="Saved ✓"}}):Q.type==="boolean"?HD({className:"switch"},qE({type:"checkbox",checked:!!K}).on({change:(E)=>B.engine.dispatch(new bQ(J,E.target.checked))}),hA({className:"track"})):qE({className:"input",value:K}).on({change:(E)=>B.engine.dispatch(new bQ(J,E.target.value))})))}function WD(A){if(!A)return null;let Q=cB(A),B=Q.status==="verified"?Q.domain:Q.status==="invalid"?"invalid signature":Q.status;return hA({className:`trust ${Q.tone}`,title:Q.explanation},I(Q.icon,{size:12}),B)}var UD={command:"command",opener:"file",indexer:"search",statusItem:"info"};function ID(A){return i({className:`pf-row ${A.available?"":"off"}`},I(UD[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:y,h2:FD,h3:IC,p:TB,span:QQ,button:bA,select:MD,option:PE,input:RD}=w;function OE(A,Q){let B=A.caps;return y({className:"editor"},y({className:"stage"},y({className:"settings admin"},FD("Administration"),TB({className:"sub"},"How this drive is configured, and what it can do. Most of it is decided by the deployment rather than here."),VD(B,A,Q),ND(A,Q),PD(B,A,Q),OD(B,A),jD(A,Q))))}function qA(A,Q,B){return y({className:"setting"},y({className:"info"},y({className:"t"},A),Q?y({className:"d"},Q):null),y({className:"control"},typeof B==="string"?QQ({className:"mono"},B):B))}function VD(A,Q,B){let C=A?.auth||{},J=A?.principal||Q.so?.me||{},K=C.authorizationServers||[];return y({className:"group"},IC("Access"),TB({className:"sub"},"Who can reach this drive. Set by the deployment, not here."),qA("Signed in as",J.anonymous?"This drive does not require a sign-in.":J.email||J.id,J.anonymous?"anonymous":J.name||J.id||"—"),qA("Sign-in required","Whether a caller must present a token.",A?.mcp?.requiresAuth?"Yes":"No"),qA("Authorization server","Where clients are sent to sign in.",K.length?K.join(", "):"not set"),qA("API keys","Credentials for scripts and services, scoped per collection.",bA({className:"btn small"},"In Settings").on({click:()=>B.engine.dispatch(new q("workbench.openSettings"))})))}function ND(A,Q){let B=A.ex?.collectionAdmin,C=B?.rows||[],J=(K)=>async()=>{for(let E of K)if((await Q.engine.dispatch(E).next(["complete","error","abort"]))?.type!=="complete")break};return y({className:"group"},IC("Collections"),TB({className:"sub"},"What exists on this drive, where its bytes live, and which key seals it."),...C.length?C.map((K)=>y({className:"setting stacked"},y({className:"info"},y({className:"t"},K.name,K.current?QQ({className:"mono muted"}," · open"):null),y({className:"d"},K.encrypted?`${K.driver} · sealed, key ${String(K.fingerprint).slice(0,12)}…`:`${K.driver} · not encrypted`),y({className:"d"},`You may: ${K.capabilities.join(", ")||"nothing"}`)),y({className:"control admin-actions"},K.current?null:bA({className:"btn small"},"Open").on({click:J(K.actions.open)}),bA({className:"btn small"},"Scan").on({click:J(K.actions.scan)}),K.actions.rotate?bA({className:"btn small"},"Rotate key…").on({click:J(K.actions.rotate)}):null,K.actions.access?bA({className:`btn small ${A.wb?.aclFor===K.id?"on":""}`},"Access…").on({click:J(K.actions.access)}):null),A.wb?.aclFor===K.id?Q.watch(s(Q.engine,ZX(K.id)),(E)=>zD(E,Q,K.id)):null)):[qA("Collections","Nothing has been created yet.","none")],B?.canCreate?y({className:"setting"},y({className:"info"},y({className:"t"},"New collection"),y({className:"d"},"A backing store you own — a bucket, a directory, a mount. Encryption is chosen here, at creation.")),y({className:"control"},bA({className:"btn small"},"Create…").on({click:J(B.create)}))):qA("New collection","You do not have permission to create one on this drive.","not allowed"))}var qD=["read","write","delete","admin"];function zD(A,Q,B){if(!A)return y({className:"acl"},QQ({className:"mono muted"},"Loading access…"));if(A.error)return y({className:"acl"},QQ({className:"mono muted"},A.error));let C=A.grants||[],J=(Y)=>Q.engine.dispatch(new VK(B,Y)),K=(Y)=>{let X=new Set(Y.capabilities||[]),L=Y.type==="anyone"?"Everyone":`${Y.type}: ${Y.subject}`;return y({className:"acl-row"},QQ({className:"acl-who"},L),...qD.map((G)=>bA({className:`btn small ${X.has(G)?"on":""}`,title:G==="admin"?"admin implies every other capability":`toggle ${G}`},G).on({click:()=>J({type:Y.type,subject:Y.subject,capabilities:X.has(G)?(Y.capabilities||[]).filter((H)=>H!==G):[...Y.capabilities||[],G]})})),bA({className:"btn small",title:"remove this grant entirely"},"×").on({click:()=>J({type:Y.type,subject:Y.subject,capabilities:[]})}))},E=(A.admins||[]).map((Y)=>y({className:"acl-row acl-fixed"},QQ({className:"acl-who"},Y),QQ({className:"mono muted"},"admin · set by this deployment")));return y({className:"acl"},...E,...C.length?C.map(K):E.length?[]:[QQ({className:"mono muted"},"Nobody yet.")],y({className:"acl-row acl-add"},MD({className:"acl-type"},PE({value:"user"},"user"),PE({value:"role"},"role"),PE({value:"anyone"},"anyone")),RD({className:"acl-subject",placeholder:"email, or a role name"}),bA({className:"btn small"},"Grant read").on({click:(Y)=>{let X=Y.target.closest(".acl-add"),L=X.querySelector(".acl-type").value,G=X.querySelector(".acl-subject").value.trim();if(L!=="anyone"&&!G)return;J({type:L,subject:L==="anyone"?"":G,capabilities:["read"]})}})))}function PD(A,Q,B){let C=A?.storage||{},J=A?.storageDrivers||[],K=Q.ex?.usage,E=(Y)=>QQ({className:`mono ${Y?"":"muted"}`},Y?"yes":"no");return y({className:"group"},IC("Storage"),TB({className:"sub"},"The backing stores this deployment offers, and what they support."),qA("Drivers offered","What a new collection may be created on.",J.length?J.map((Y)=>Y.label||Y.key).join(", "):"none registered"),qA("Direct downloads","A presigned URL sends bytes from the store, not through the drive.",E(C.presignDownload)),qA("Direct uploads","A presigned PUT sends bytes to the store, not through the drive.",E(C.presignUpload)),qA("Multipart","Large files go up in parts, resumably.",E(C.multipart)),qA("Range requests","Seeking inside a file without fetching the whole thing.",E(C.range)),K?.total?qA("Space","Reported by the backing store.",`${KA(K.available)} free of ${KA(K.total)}`):qA("Space","This store does not report a total, which object stores generally cannot.","not reported"),y({className:"setting"},y({className:"info"},y({className:"t"},"Check the backing stores"),y({className:"d"},"Asks whether each store can actually be reached from here — the failure that makes every file open to a spinner.")),y({className:"control"},bA({className:"btn small"},"Run check").on({click:()=>B.engine.dispatch(new q("workbench.checkStorage"))}))))}function OD(A,Q){let B=A?.indexers||[],C=Q.plugins||[];return y({className:"group"},IC("Extensions"),TB({className:"sub"},"What reads and adds to this drive."),y({className:"setting"},y({className:"info"},y({className:"t"},"Indexers"),y({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.")),y({className:"control"},QQ({className:"mono"},B.length?B.map((J)=>J.displayName||J.id).join(", "):"none"))),C.length?y({},...C.map((J)=>y({className:"setting"},y({className:"info"},y({className:"t"},J.manifest?.displayName||J.id),y({className:"d"},(J.grants||[]).length?`May: ${(J.grants||[]).join(", ")}`:"Granted nothing — it runs in its sandbox and can only draw.")),y({className:"control"},QQ({className:`mono ${J.status==="active"?"":"muted"}`},J.status||"idle"))))):qA("Plugins","Installed by an administrator, from a signed package.","none installed"))}function jD(A,Q){let B=A.act||{tasks:[],issues:[]},C=(B.tasks||[]).filter((J)=>J.status==="running");return y({className:"group"},IC("Work"),TB({className:"sub"},"Background jobs and anything that needs attention."),qA("Running now","Scans, reindexes and rotations happening on the server.",C.length?`${C.length}`:"nothing running"),qA("Needs attention","Standing problems — they persist until fixed, unlike a toast.",B.issues?.length?`${B.issues.length}`:"none"),y({className:"setting stacked"},y({className:"info"},y({className:"t"},"Maintenance"),y({className:"d"},"A scan picks up files changed in the bucket by something other than Trove. A reindex rebuilds search from scratch.")),y({className:"control admin-actions"},bA({className:"btn small"},"Activity panel").on({click:()=>Q.engine.dispatch(new q("workbench.showActivity"))}),bA({className:"btn small"},"Scan").on({click:()=>Q.engine.dispatch(new q("workbench.scanCollection"))}),bA({className:"btn small"},"Reindex").on({click:()=>Q.engine.dispatch(new q("workbench.rebuildIndex"))}))))}async function XL(A,Q,{from:B}={}){let C=aC(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 lA(K.node)),K.node}catch(K){return J.warn(_D(C,K,B)),null}}function _D(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:KB,span:_E,h1:SD,h2:TD,h3:wD,p:DL,ul:kD,ol:xD,li:gD,pre:yD,code:WL,a:LL,em:hD,strong:bD,blockquote:vD,hr:fD,br:uD}=w;function UL(A,Q){let B=zC(s(Q.engine,OB.of(A.id,jE,A.size)),(C)=>C.text);return w.alias(()=>Q.watch(B,(C)=>{try{return KB({className:"viewer markdown"},KB({className:"md"},...IL(C,A,Q)))}catch(J){return console.error("markdown render failed",J),GL(`This document couldn’t be displayed: ${J.message}`)}},{placeholder:()=>KB({className:"viewer"},KB({className:"loading"},KB({className:"spinner"}),_E("Loading…"))),error:(C)=>GL(C.message)}))()}function GL(A){return KB({className:"viewer"},KB({className:"fallback"},I("warn",{size:40}),_E(A)))}var jE=524288,mD=5000,pD=2000;function IL(A,Q,B){let C=String(A??""),J=C.length>jE,K=(J?C.slice(0,jE):C).split(/\r?\n/),E=[],Y=0;while(Y<K.length){if(E.length>=mD)return[...E,HL()];let X=K[Y],L=/^\s*(```+|~~~+)(.*)$/.exec(X);if(L){let M=L[1][0].repeat(3),V=[];Y++;while(Y<K.length&&!K[Y].trimStart().startsWith(M))V.push(K[Y++]);Y++,E.push(yD({className:"md-code"},WL(V.join(`
350
- `))));continue}if(!X.trim()){Y++;continue}let G=/^(#{1,6})\s+(.*)$/.exec(X);if(G){let M=G[1].length,V=M===1?SD:M===2?TD:wD;E.push(V({className:`md-h md-h${M}`},...FC(G[2],Q,B))),Y++;continue}if(/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(X)){E.push(fD({className:"md-hr"})),Y++;continue}if(/^\s*>/.test(X)){let M=[];while(Y<K.length&&/^\s*>/.test(K[Y]))M.push(K[Y++].replace(/^\s*>\s?/,""));E.push(vD({className:"md-quote"},...IL(M.join(`
351
- `),Q,B)));continue}let H=/^\s*([-*+]|\d+[.)])\s+/.exec(X);if(H){let M=/\d/.test(H[1]),V=[];while(Y<K.length){let x=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(K[Y]);if(!x||/\d/.test(x[1])!==M)break;V.push(gD({className:"md-li"},...FC(x[2],Q,B))),Y++}E.push((M?xD:kD)({className:"md-list"},...V));continue}let Z=[];while(Y<K.length&&K[Y].trim()&&!lD(K[Y]))Z.push(K[Y++]);let F=Z.join(`
352
- `),U=[];F.split(`
353
- `).forEach((M,V)=>{if(V)U.push(uD());U.push(...FC(M,Q,B))}),E.push(DL({className:"md-p"},...U))}return J?[...E,HL()]:E}function HL(){return DL({className:"md-truncated"},"This document is too large to display in full. Download it to read the rest.")}function lD(A){return/^(#{1,6}\s|\s*>|\s*([-*+]|\d+[.)])\s|\s*(```|~~~))/.test(A)||/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(A)}var cD=[{re:/`([^`]+)`/,node:(A)=>WL({className:"md-inline-code"},A[1])},{re:/\[([^\]]*)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/,node:(A,Q,B)=>ZL(A[2],A[1]||A[2],Q,B)},{re:/(\*\*|__)(.+?)\1/,node:(A,Q,B,C)=>bD(...FC(A[2],Q,B,C+1))},{re:/(\*|_)(.+?)\1/,node:(A,Q,B,C)=>hD(...FC(A[2],Q,B,C+1))},{re:/(trove:[^\s<>"'`)\]}]+|https?:\/\/[^\s<>"'`)\]}]+)/,node:(A,Q,B)=>ZL($L(A[1]),$L(A[1]),Q,B)}];function FC(A,Q,B,C=0){if(!A)return[];if(C>12)return[A];let J=[],K=A;while(K){if(J.length>=pD){J.push(K);break}let E=null;for(let L of cD){let G=L.re.exec(K);if(G&&(E===null||G.index<E.m.index))E={m:G,rule:L}}if(!E){J.push(K);break}let{m:Y,rule:X}=E;if(Y.index)J.push(K.slice(0,Y.index));J.push(X.node(Y,Q,B,C)),K=K.slice(Y.index+Y[0].length)}return J}function $L(A){return A.replace(/[.,;:!?]+$/,"")}function ZL(A,Q,B,C){if(aC(A))return LL({className:"md-link md-trove",href:"#",title:A},Q).on({click:(K)=>{K.preventDefault(),XL(C,A,{from:B})}});if(/^https?:\/\//i.test(A))return LL({className:"md-link",href:A,target:"_blank",rel:"noopener noreferrer",title:A},Q);return _E({className:"md-deadlink",title:`Unsupported link: ${A}`},Q)}var{div:jA,pre:dD,img:aD,span:EB,button:nD,video:sD,audio:oD}=w,iD={"core.audio":{title:"Audio Player",priority:20,match:{mime:["audio/*"],ext:[".mp3",".flac",".wav",".opus",".ogg",".m4a",".m4b"]},component:Q4},"core.video":{title:"Video Player",priority:20,match:{mime:["video/*"],ext:[".mp4",".webm",".mkv",".mov"]},component:B4},"core.image":{title:"Image Viewer",priority:20,match:{mime:["image/*"],ext:[".png",".jpg",".jpeg",".gif",".webp",".svg",".avif"]},component:A4},"core.markdown":{title:"Markdown",priority:30,match:{ext:[".md",".markdown"],mime:["text/markdown"]},component:UL},"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:tD}};function FL(A){for(let[Q,B]of Object.entries(iD))A.contributions.register(Q,{type:"opener",...B})}function ML(A,Q,B){let C=B.platform.contributions.get(Q);if(C?.component)try{return C.component(A,B)}catch(J){return VL(J.message)}if(C?.pluginId)return C4(C,A,B);return RL(A,B)}var rD=524288;function tD(A,Q){let B=s(Q.engine,OB.of(A.id,rD,A.size));return w.alias(()=>Q.watch(B,({text:C,truncated:J,total:K})=>jA({className:"viewer text"},dD(C),J?jA({className:"md-truncated"},`Showing the first ${Math.round(C.length/1024)} KB${K?` of ${(K/1048576).toFixed(1)} MB`:""}. `,EB("Download the file to read all of it.")):null),{placeholder:()=>jA({className:"viewer"},jA({className:"loading"},jA({className:"spinner"}),EB("Loading…"))),error:(C)=>VL(C.message)}))()}var eD="This file couldn't be loaded — it may be missing or in an unsupported format.";function SE(A,Q,B){let C=d({error:null}),K=B((E)=>C.setValue({error:E||eD}));return w.alias(()=>ZQ(C,(E)=>E.error?RL(A,Q,E.error):K))()}var TE=(A,Q,B,C)=>A.on({$attach:(J)=>{J._detachMedia=jB(J,Q,B,{onError:C})},$detach:(J)=>{J._detachMedia?.(),J._detachMedia=null}}).opaque();function A4(A,Q){return SE(A,Q,(B)=>jA({className:"viewer image"},TE(aD({alt:A.name}),A,Q,B)))}function Q4(A,Q){return SE(A,Q,(B)=>jA({className:"viewer",$styling:{display:"grid","place-items":"center",gap:"16px",padding:"40px"}},I("file-audio",{size:48}),EB({$styling:{color:"var(--text-dim)"}},A.name),TE(oD({controls:!0,$styling:{width:"min(520px, 90%)"}}),A,Q,B)))}function B4(A,Q){return SE(A,Q,(B)=>jA({className:"viewer",$styling:{display:"grid","place-items":"center",background:"#000"}},TE(sD({controls:!0,$styling:{"max-width":"100%","max-height":"100%"}}),A,Q,B)))}function RL(A,Q,B){return jA({className:"viewer"},jA({className:"fallback"},I(B?"warn":"file",{size:44}),EB({$styling:{"font-weight":600}},A.name),EB(`${A.contentType||"Unknown type"} · ${KA(A.size)}`),EB({$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."),nD({className:"btn primary"},I("download",{size:15}),"Download").on({click:()=>Q.engine.dispatch(new q("explorer.download",A))})))}function C4(A,Q,B){return jA({className:"viewer plugin-viewer"},jA({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(J4(J))}}}).opaque(),jA({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 J4(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 VL(A){return jA({className:"viewer"},jA({className:"fallback"},I("warn",{size:40}),EB(A||"Failed to open")))}var{div:kB,span:NL,button:wB}=w,R0=new Map;function V0(A,Q){let B=A.wb,C=A.nav.stack.filter((K)=>K.kind==="file");X4(C);let J=C[C.length-1];if(!J)return kB({className:"editor"});return kB({className:"editor"},K4(C,J,A,Q),kB({className:"stage"},Y4(J,Q)))}function K4(A,Q,B,C){return kB({className:"viewer-nav"},wB({className:"vn-back",title:"Back (Esc)"},I("chevron-left",{size:16})).on({click:()=>C.engine.dispatch(new nJ)}),kB({className:"vn-trail"},wB({className:"vn-crumb"},I("search",{size:13}),NL("Search")).on({click:()=>C.engine.dispatch(new vQ)}),...A.map((J)=>wB({className:`vn-crumb ${J.id===Q.id?"active":""}`,title:J.node.name},I(UQ(J.node),{size:13}),NL({className:"label"},J.node.name)).on({click:()=>C.engine.dispatch(new FQ(J.node,J.openerId))}))),kB({className:"vn-actions"},E4(Q,B,C),wB({className:"iconbtn",title:"Details & comments"},I("info",{size:15})).on({click:()=>C.engine.dispatch(new AC)}),wB({className:"iconbtn",title:"Close (Esc)"},I("close",{size:15})).on({click:()=>C.engine.dispatch(new vQ)})))}function E4(A,Q,B){let C=e8(Q.openers,A.node);if(C.length<=1)return null;return wB({className:"iconbtn",title:"Open with…"},I("dots",{size:15})).on({click:()=>B.engine.dispatch(new aA({kind:"opener-chooser",node:A.node,openers:C,current:A.openerId}))})}function Y4(A,Q){let B=`${A.id}:${A.openerId}`,C=R0.get(B);if(!C)C=()=>ML(A.node,A.openerId,Q),R0.set(B,C);return w.alias(C)().key(A.id)}function X4(A){let Q=new Set(A.map((B)=>`${B.id}:${B.openerId}`));for(let B of R0.keys())if(!Q.has(B))R0.delete(B)}var{div:sA,input:L4,span:uQ}=w;function wE(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 eB),B.mode==="files")Q.engine.dispatch(new lA(E.node));else Q.engine.dispatch(new q(E.id))};return sA({},sA({className:"scrim"}).on({click:()=>Q.engine.dispatch(new eB)}),sA({className:"palette"},sA({className:"search"},I(B.mode==="files"?"search":"command",{size:18}),L4({type:"text",value:B.query,autofocus:!0,placeholder:B.mode==="files"?"Search files by name…":"Type a command…"}).on({input:(E)=>D4(Q,E.target.value),keydown:(E)=>Z4(E,Q,C,J,K),$attach:(E)=>{if(queueMicrotask(()=>E.focus()),E.value!==B.query)E.value=B.query}})),sA({className:"results"},C.length?C.map((E,Y)=>{let X=()=>Q.engine.dispatch(new jJ(Y));return B.mode==="files"?$4(E,Y===J,K,X):H4(E,Y===J,Q,K,X)}):G4(B,A))))}function G4(A,Q){if(A.mode!=="files")return sA({className:"none"},"No matching commands");if(Q.se.paletteError)return sA({className:"none error"},I("warn",{size:14}),` ${Q.se.paletteError}`);if(Q.se.paletteLoading)return sA({className:"none"},sA({className:"spinner"})," Searching…");return sA({className:"none"},A.query.trim()?"No files found":"Type to search files by name")}function H4(A,Q,B,C,J){return sA({className:`opt ${Q?"active":""} ${A.available?"":"unavailable"}`},uQ({className:"ico"},I(A.icon||"command",{size:16})),A.category?uQ({className:"cat"},A.category+" ›"):null,uQ({className:"title"},A.title),!A.available?uQ({className:"offline-tag"},"offline"):null,A.keybinding?uQ({className:"kbd"},w.h("kbd",A.keybinding)):null).on({click:()=>C(A),mouseenter:J})}function $4(A,Q,B,C){return sA({className:`opt ${Q?"active":""}`},uQ({className:"ico"},I(UQ(A.node),{size:16})),uQ({className:"title"},A.node.name),uQ({className:"sub"},A.node.contentType||"")).on({click:()=>B(A),mouseenter:C})}function Z4(A,Q,B,C,J){if(A.key==="ArrowDown")A.preventDefault(),Q.engine.dispatch(new iC(1,B.length));else if(A.key==="ArrowUp")A.preventDefault(),Q.engine.dispatch(new iC(-1,B.length));else if(A.key==="Enter")A.preventDefault(),J(B[C]);else if(A.key==="Escape")A.preventDefault(),Q.engine.dispatch(new eB)}var qL=null;function D4(A,Q){A.engine.dispatch(new OJ(Q)),clearTimeout(qL),qL=setTimeout(()=>A.engine.dispatch(new VJ(Q)),200)}var{div:a,span:YA,button:zL,h3:VI,p:W4,label:jL,input:_L}=w,PL="pluginReview";function SL(A,Q,B){let C=A.summary,J=cC(B,PL,A,{grants:C.capabilities.filter((L)=>!L.adminOnly||A.isAdmin).map((L)=>L.id),acknowledged:!1}),K=A.policy||{requiresAcknowledgement:!1},E=K.requiresAcknowledgement&&!J.acknowledged,Y=(L)=>Q.engine.dispatch(new tQ(PL,{...J,...L})),X=(L)=>Y({grants:J.grants.includes(L)?J.grants.filter((G)=>G!==L):[...J.grants,L]});return a({},a({className:"scrim"}).on({click:()=>Q.engine.dispatch(new OA)}),a({className:"dialog review",$styling:{width:"min(560px, 96vw)"}},I4(C),a({className:"review-body"},C.description?W4({className:"review-desc"},C.description):null,xB("Capabilities it requests",C.capabilities.length?a({className:"cap-list"},...C.capabilities.map((L)=>M4(L,A.isAdmin,J.grants.includes(L.id),()=>X(L.id)))):P4("None — this plugin only runs in its sandbox.")),(C.network||[]).length?xB("Network access",a({className:"contrib-list"},...C.network.map(N4))):null,(C.commands||[]).length?xB("Commands it can run",a({className:"contrib-list"},...C.commands.map((L)=>V4(L,Q)))):null,C.storage?xB("Storage",q4(C.storage)):null,C.contributions.length?xB("What it adds",a({className:"contrib-list"},...C.contributions.map(R4))):null,C.settings.length?xB("Settings",a({className:"contrib-list"},...C.settings.map(z4))):null,a({className:"review-meta"},`${C.fileCount} files · ${KA(C.sizeBytes)} · id ${C.id}`)),K.headline?U4(K,J,Y):null,a({className:"row-actions"},zL({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new OA)}),zL({className:`btn primary ${E?"disabled":""}`,disabled:E},I("plug",{size:15}),"Install").on({click:()=>!E&&A.onInstall([...J.grants])}))))}function U4(A,Q,B){return a({className:`review-warning ${A.status}`},a({className:"rw-head"},I("warn",{size:15}),YA(A.headline)),a({className:"rw-detail"},A.detail),A.requiresAcknowledgement?jL({className:"rw-ack"},_L({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 I4(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)),F4(Q))}function F4(A){let Q=cB(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},I(Q.icon,{size:13}),B)}function M4(A,Q,B,C){let J=A.adminOnly&&!Q;return jL({className:`cap-row ${J?"blocked":""}`},_L({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 R4(A){let Q={command:"command",opener:"file",indexer:"search",statusItem:"info",register:"info",keymap:"command"}[A.kind]||"command";return a({className:"contrib-row"},I(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 V4(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"}`},I("command",{size:13}),YA({className:"cr-title"},B?.title||A),YA({className:"cr-detail"},A),YA({className:"pf-kind"},C))}function N4(A){return a({className:"contrib-row"},I("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 q4(A){let Q=[];if(A.plugin)Q.push(OL("Private database","A SQLite store just for this plugin (server + this device).",!1));if(A.domain)Q.push(OL("Shared database","Shared with other plugins from its domain (SQLite).",A.domainBlocked));return a({className:"contrib-list"},...Q)}function OL(A,Q,B){return a({className:`contrib-row ${B?"blocked":""}`},I("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 z4(A){return a({className:"contrib-row"},I("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 xB(A,Q){return a({className:"review-section"},a({className:"rs-title"},A),Q)}function P4(A){return a({className:"muted",$styling:{"font-size":"12.5px"}},A)}var{div:_,span:vA,button:fA,input:mQ,h3:kE,p:wI,select:wL,option:N0,label:pQ,textarea:kI}=w;function kL(A,Q){let B=A.overlay.dialog;if(!B)return null;if(B.kind==="collection")return j4(B,Q,A.caps,A.view);if(B.kind==="plugin-review")return SL(B,Q,A.view);if(B.kind==="opener-chooser")return O4(B,Q);let C=l8(A.view,B),J=()=>{if(B.kind==="confirm")Q.engine.dispatch(new OA);nA(Q,{actions:B.confirmActions})};return _({},_({className:"scrim"}).on({click:()=>Q.engine.dispatch(new OA)}),_({className:"dialog"},kE(B.title),B.body?_({className:"body"},B.body):null,B.kind==="prompt"?_({className:"field"},B.label?vA({$styling:{"font-size":"12px",color:"var(--text-dim)"}},B.label):null,mQ({className:"input",value:C,placeholder:B.placeholder||"",autofocus:!0}).on({input:(K)=>Q.engine.dispatch(new tQ(lB,{ref:B,value:K.target.value})),keydown:(K)=>{if(K.key==="Enter")J();if(K.key==="Escape")Q.engine.dispatch(new OA)},$attach:(K)=>queueMicrotask(()=>{K.focus(),K.select()})})):null,_({className:"row-actions"},fA({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new OA)}),fA({className:`btn ${B.danger?"danger":"primary"}`},B.confirmLabel||"OK").on({click:J}))))}function O4(A,Q){let B=A.openerId||A.current||A.openers[0]?.id,C=!!A.remember,J=()=>{if(C&&B)Q.engine.dispatch(new EC(AY(A.node),B));Q.engine.dispatch(new OA),Q.engine.dispatch(new FQ(A.node,B,{reset:!!A.reset}))};return _({},_({className:"scrim"}).on({click:()=>Q.engine.dispatch(new OA)}),_({className:"dialog opener-chooser"},kE(`Open “${A.node.name}” with…`),_({className:"opener-list"},...A.openers.map((K)=>pQ({className:`opener-opt ${K.id===B?"sel":""}`},mQ({type:"radio",name:"opener-choice",checked:K.id===B}).on({change:()=>Q.engine.dispatch(new tB({openerId:K.id}))}),I(K.icon||UQ(A.node),{size:18}),_({className:"oo-main"},vA({className:"oo-title"},K.title||K.id),vA({className:"oo-src"},K.source))).on({click:()=>Q.engine.dispatch(new tB({openerId:K.id}))}))),pQ({className:"opener-remember"},mQ({type:"checkbox",checked:C}).on({change:(K)=>Q.engine.dispatch(new tB({remember:K.target.checked}))}),vA(`Always use this for ${QY(A.node)}`)),_({className:"row-actions"},fA({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new OA)}),fA({className:"btn primary"},"Open").on({click:J}))))}var TL="collectionDialog";function j4(A,Q,B,C){let J=B?.storageDrivers||[],K={name:"",description:"",driver:J[0]?.key||"",encrypt:!1,encryptWhat:"all",encryptList:""},E=cC(C,TL,A,{form:K}),Y=E.form,X=J.find((U)=>U.key===Y.driver)||J[0],L=(U)=>(M)=>{let V=M.target.type==="checkbox"?M.target.checked:M.target.value;Q.engine.dispatch(new AK(TL,E.ref,{[U]:V},K))},G=()=>{let U={driver:Y.driver};for(let M of X?.fields||[]){let V=Y[M.name];if(V!==void 0&&V!=="")U[M.name]=M.type==="number"?Number(V):V}Q.engine.dispatch(new eJ({name:Y.name,description:Y.description,store:U,encryption:_4(Y)}))},H=(U,M,V="")=>_({className:"field",$styling:{"margin-bottom":"10px"}},pQ(U),mQ({className:"input",placeholder:V}).on({input:L(M)})),Z=Y.encrypt&&Y.encryptWhat!=="all"&&!xL(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,F=!!Y.name.trim()&&!!Y.driver&&!Z&&(X?.fields||[]).every((U)=>!U.required||String(Y[U.name]??"").trim());return _({},_({className:"scrim"}).on({click:()=>Q.engine.dispatch(new OA)}),_({className:"dialog",$styling:{width:"min(480px, 94vw)"}},kE("New collection"),_({className:"body"},"A collection is a backing store you own. Configure where its files live."),H("Name","name","Team Vault"),J.length?_({className:"field",$styling:{"margin-bottom":"10px"}},pQ("Backing store"),wL({className:"input"},...J.map((U)=>N0({value:U.key,selected:Y.driver===U.key},U.label))).on({change:L("driver")})):_({className:"body"},"This server has no storage drivers registered, so a collection cannot be created."),X?T4(X,Y,L):null,S4(Y,L,B,Z),_({className:"row-actions"},fA({className:"btn"},"Cancel").on({click:()=>Q.engine.dispatch(new OA)}),fA({className:"btn primary",$attrs:F?{}:{disabled:"true"}},"Create collection").on({click:()=>F&&G()}))))}function _4(A){if(!A.encrypt)return null;let Q=xL(A.encryptList);return{enabled:!0,rules:A.encryptWhat==="all"?{all:!0}:A.encryptWhat==="extensions"?{extensions:Q}:{mimeTypes:Q}}}function xL(A){return String(A||"").split(/[\s,]+/).map((Q)=>Q.trim()).filter(Boolean)}function S4(A,Q,B,C){let J=(B?.indexers||[]).filter((K)=>K.readsContent!==!1);return _({className:"field enc-section",$styling:{"margin-bottom":"10px"}},pQ({className:"enc-toggle"},mQ({type:"checkbox",checked:!!A.encrypt}).on({change:Q("encrypt")}),vA("Encrypt files in this collection")),!A.encrypt?_({className:"enc-hint"},"Files are stored exactly as uploaded."):_({className:"enc-body"},_({className:"field"},pQ("What to encrypt"),wL({className:"input"},N0({value:"all",selected:A.encryptWhat==="all"},"Every file"),N0({value:"extensions",selected:A.encryptWhat==="extensions"},"Only these extensions"),N0({value:"mimeTypes",selected:A.encryptWhat==="mimeTypes"},"Only these media types")).on({change:Q("encryptWhat")})),A.encryptWhat!=="all"?_({className:"field"},mQ({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"},I("warn",{size:13}),vA(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 T4(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"}},pQ({},mQ({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"}},pQ(C.label+(C.required?"":" (optional)")),mQ({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 gL(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 VB),contextmenu:(E)=>{E.preventDefault(),Q.engine.dispatch(new VB)}}),_({className:"menu",$styling:{left:J+"px",top:K+"px"}},...B.items.map((E,Y)=>E.sep?_({className:"sep"}):fA({className:`mi ${E.danger?"danger":""}`,autofocus:Y===0},E.icon?I(E.icon,{size:15}):null,vA(E.label),E.kbd?vA({className:"kbd"},E.kbd):null).on({click:()=>{Q.engine.dispatch(new VB),nA(Q,E)},keydown:(X)=>{if(X.key==="Escape")X.preventDefault(),Q.engine.dispatch(new VB)},$attach:(X)=>{if(Y===0)queueMicrotask(()=>X.focus())}}))))}function yL(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),fA({className:"x"},I("close",{size:14})).on({click:()=>Q.engine.dispatch(new PJ(C.id))})).key(C.id)))}function hL(A,Q){let B=A.tr.items;if(!B.length)return null;return _({className:"tray"},_({className:"head"},I("upload",{size:14}),vA({$styling:{"margin-left":"6px"}},"Transfers"),_({className:"actions"},fA({className:"iconbtn",title:"Clear finished"},I("check",{size:14})).on({click:()=>Q.engine.dispatch(new vJ)}))),_({className:"items"},...B.map((C)=>_({className:`xfer ${C.status}`},_({className:"top"},I(C.status==="error"?"warn":C.status==="done"?"check":"upload",{size:14}),vA({className:"name"},C.name),C.status==="active"?fA({className:"iconbtn",title:"Cancel"},I("close",{size:13})).on({click:()=>Q.engine.dispatch(new CC(C.id))}):vA({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"},fA({className:"btn small"},I("refresh",{size:12}),vA("Retry")).on({click:()=>Q.engine.dispatch(new hJ(C.id))}),fA({className:"btn small ghost"},"Dismiss").on({click:()=>Q.engine.dispatch(new bJ(C.id))})):null).key(C.id))))}function bL(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"},I("plug",{size:14}),vA(C?.name||B),fA({className:"iconbtn x"},I("close",{size:14})).on({click:()=>Q.engine.dispatch(new wJ)})),_({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:qQ,span:MC,h3:w4,p:vL,pre:k4}=w,x4={running:"refresh",done:"check",failed:"close",cancelled:"close"};function g4(A,Q){Q.engine.dispatch(new tA(A))}function fL(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 uL(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"}}):I(x4[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?qQ({className:"act-action",title:"Cancel"},I("close",{size:12})).on({click:()=>Q.engine.dispatch(new kJ(A.id))}):!B?qQ({className:"act-action",title:"Dismiss"},I("close",{size:12})).on({click:()=>Q.engine.dispatch(new xJ(A.id))}):null),B?l({className:`act-bar ${C?"":"indeterminate"}`},l({className:"act-fill",$styling:C?{width:`${J}%`}:{}})):null,B&&fL(A)?l({className:"act-amount"},fL(A)):null)}function y4(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"},I(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?k4({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?qQ({className:"btn small ghost"},"Copy fix").on({click:()=>g4(A.remedy,Q)}):null,A.retryable?qQ({className:"btn small act-retry"},I("refresh",{size:12}),MC("Retry")).on({click:()=>Q.engine.dispatch(new gJ(A.id))}):null,qQ({className:"btn small ghost act-dismiss"},"Dismiss").on({click:()=>Q.engine.dispatch(new yJ(A.id))})))}function xE(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"},w4("Activity"),qQ({className:"act-action",title:"Close"},I("close",{size:13})).on({click:()=>Q.engine.dispatch(new dA(!1))})),B.tasksError||B.issuesError?l({className:"act-offline"},I("info",{size:12}),MC(`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)=>uL(K,Q))):vL({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)=>y4(K,Q)))):l({className:"act-section"},l({className:"act-section-title"},"Needs attention"),vL({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)=>uL(K,Q)))):null,l({className:"act-foot act-actions"},qQ({className:"btn small ghost act-rebuild"},I("refresh",{size:12}),MC("Rebuild search index")).on({click:()=>Q.engine.dispatch(new q("workbench.rebuildIndex"))}),qQ({className:"btn small ghost act-scan"},I("refresh",{size:12}),MC("Scan for outside changes")).on({click:()=>Q.engine.dispatch(new q("workbench.scanCollection"))}),qQ({className:"btn small ghost act-storage"},I("plug",{size:12}),MC("Check storage")).on({click:()=>Q.engine.dispatch(new q("workbench.checkStorage"))})))}var{div:ZA,button:YB,span:GQ,img:lL}=w,mL=[{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"}],pL={offline:{icon:"info",tone:"warn"},issues:{icon:"warn",tone:"danger"},working:{spinner:!0,tone:""},lowSpace:{icon:"info",tone:"warn"},idle:{icon:"info",tone:""}};function cL(A,Q){let B=A.facts,C=B.condition,J={...pL[C.kind]||pL.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"},YB({className:"pb-brand",title:"Trove — home"},lL({src:"/icon.svg",alt:"Trove"})).on({click:()=>Q.engine.dispatch(new q("workbench.view.home"))}),ZA({className:"pb-title"},K),YB({className:`pb-status ${J.tone}`,title:J.label,$attrs:{"aria-label":J.label}},J.spinner?ZA({className:"spinner",$styling:{width:"15px",height:"15px"}}):I(J.icon,{size:18}),J.badge?GQ({className:"pb-badge"},String(J.badge>9?"9+":J.badge)):null).on({click:()=>Q.engine.dispatch(new rC("status"))}))}function dL(A,Q){let B=A.wb.activity,C=A.wb.sheet,J=A.so.notifications.unread;return ZA({className:"phonebar bottom"},...mL.map((K)=>YB({className:`pb-tab ${!C&&B===K.id?"active":""}`,$attrs:{"aria-label":K.label}},I(K.icon,{size:21}),GQ({className:"pb-label"},K.label)).on({click:()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new q(K.command))}})),YB({className:`pb-tab ${C==="more"||!C&&!mL.some((K)=>K.id===B)?"active":""}`,$attrs:{"aria-label":"More"}},I("dots",{size:21}),J?GQ({className:"pb-badge"},String(J>9?"9+":J)):null,GQ({className:"pb-label"},"More")).on({click:()=>Q.engine.dispatch(new rC("more"))}))}function _A({icon:A,label:Q,value:B,danger:C,onClick:J}){let K=[I(A,{size:18}),GQ({className:"sr-label"},Q),B!=null?GQ({className:"sr-value"},B):null,J?I("chevron-right",{size:16,className:"sr-go"}):null];return J?YB({className:`sheet-row ${C?"danger":""}`},...K).on({click:J}):ZA({className:"sheet-row static"},...K)}function aL(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 cA)}),ZA({className:"sheet"},ZA({className:"sheet-grip"}).on({click:()=>Q.engine.dispatch(new cA)}),B==="status"?h4(A,Q):b4(A,Q)))}function h4(A,Q){let B=A.facts,C=(J)=>()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new q(J))};return ZA({className:"sheet-body"},ZA({className:"sheet-title"},B.collectionLabel),B.issues.length?_A({icon:"warn",danger:!0,label:`${B.issues.length} need${B.issues.length===1?"s":""} attention`,onClick:()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new dA(!0))}}):null,B.running.length||B.uploading.length?_A({icon:"refresh",label:`${B.running.length+B.uploading.length} running`,onClick:()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new dA(!0))}}):null,!B.off.online?_A({icon:"info",label:"Offline",value:`${B.off.pins.length} pinned`}):null,B.off.queued?_A({icon:"upload",label:"Waiting to sync",value:String(B.off.queued)}):null,_A({icon:"files",label:"Items",value:B.partial?`${B.shown.toLocaleString()} of ${B.totalKnown?B.totalItems.toLocaleString():"more"}`:B.totalItems.toLocaleString()}),_A({icon:"file",label:"Size",value:`${KA(B.totalBytes)}${B.totalKnown||!B.partial?"":"+"}`}),B.usage?.total?ZA({className:"sheet-row static usage"},I("download",{size:18}),GQ({className:"sr-label"},"Free space"),ZE(B)):null,A.caps?_A({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?_A({icon:"star",label:"Search",value:"Semantic + keyword"}):null,ZA({className:"sheet-actions"},YB({className:"btn small ghost"},I("refresh",{size:13}),GQ("Scan for changes")).on({click:C("workbench.scanCollection")}),YB({className:"btn small ghost"},I("refresh",{size:13}),GQ("Activity")).on({click:()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new dA(!0))}})))}function b4(A,Q){let B=(K)=>()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new q(K))},C=A.so.me,J=A.so.notifications.unread;return ZA({className:"sheet-body"},C&&!C.anonymous?ZA({className:"sheet-me"},C.picture?lL({src:C.picture,alt:"",className:"avatar-img"}):GQ({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,_A({icon:"bell",label:J?`Notifications (${J})`:"Notifications",onClick:()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new MQ(!0))}}),_A({icon:"refresh",label:"Activity & problems",onClick:()=>{Q.engine.dispatch(new cA),Q.engine.dispatch(new dA(!0))}}),_A({icon:"info",label:"Details & conversation",onClick:B("workbench.toggleInfoPanel")}),_A({icon:"trash",label:"Trash",onClick:B("explorer.showTrash")}),_A({icon:"refresh",label:"Refresh",onClick:B("explorer.refresh")}),_A({icon:"command",label:"All commands",onClick:B("workbench.showCommandPalette")}),_A({icon:"gear",label:"Settings",onClick:B("workbench.openSettings")}))}var{alias:v4,div:HQ}=w;function gE({engine:A,platform:Q}){let B={engine:A,platform:Q,watch:ZQ},C=r([s(A,ZC),s(A,JE),s(A,CE),s(A,HC),s(A,eK),s(A,IX),s(A,$0),s(A,H0),s(A,FX),s(A,MX),s(A,D0),s(A,DC),s(A,TX),s(A,EE(!1)),s(A,EE(!0)),s(A,OX),s(A,PX)],(E,Y,X,L,G,H,Z,F,U,M,V,x,m,j,T,c,h)=>({wb:E,overlay:Y,nav:X,ex:L,se:G,ctx:H,settings:Z,off:F,vp:U,voice:M,view:V,caps:x,commandKeys:m,content:j,modalContent:T,views:c,openers:h})),J={ex:HC,tr:AE,act:G0,off:H0,so:$C,wb:ZC,statusItems:NX,caps:DC,facts:zX},K={statusBar:NA(A,J,(E)=>DE(E,B),{placeholder:()=>HQ({className:"statusbar"})}),phoneTopBar:NA(A,J,(E)=>cL(E,B),{placeholder:()=>HQ({className:"phonebar top"})}),phoneBottomBar:NA(A,J,(E)=>dL(E,B),{placeholder:()=>HQ({className:"phonebar bottom"})}),phoneSheet:NA(A,J,(E)=>aL(E,B)),transferTray:NA(A,{tr:AE},(E)=>hL(E,B)),toasts:NA(A,{notif:WX},(E)=>yL(E,B)),activityPanel:NA(A,{act:G0},(E)=>xE(E,B)),settingsView:NA(A,{settings:$0,settingsGroups:UX,keys:DX,caps:DC,ex:HC,assoc:_X},(E)=>ME(E,B)),pluginsView:NA(A,{plugins:Z0,settings:$0},(E)=>zE(E,B)),adminView:NA(A,{caps:DC,ex:HC,plugins:Z0,act:G0,so:$C,wb:ZC},(E)=>OE(E,B)),infoPanel:NA(A,{so:$C,off:H0,nav:CE},(E)=>hX(E,B)),activityBar:NA(A,{wb:ZC,plugins:Z0,so:$C},(E)=>$E(E,B)),commandPalette:NA(A,{overlay:JE,se:eK,matches:VX},(E)=>wE(E,B))};return v4(()=>ZQ(C,(E)=>f4(E,B,K)))}function f4(A,Q,B){let C=A.vp?.mode||"desktop",J=C==="phone";return HQ({className:`shell ${C} ${A.settings["workbench.density"]==="compact"?"compact":""}`},J?B.phoneTopBar():null,HQ({className:"body"},J?null:B.activityBar(),u4(A,Q,B)),J?B.phoneBottomBar():B.statusBar(),J?B.phoneSheet():null,m4(A,Q),B.commandPalette(),kL(A,Q),gL(A,Q),bL(A,Q),B.toasts(),B.transferTray(),B.activityPanel())}function u4(A,Q,B){if(A.ex?.gate&&A.wb.activity!=="settings")return NE(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 M0(A,Q);if(!A.wb.infoPanel)return V0(A,Q);return A.vp?.mode==="phone"?B.infoPanel():HQ({className:"editor-split"},V0(A,Q),B.infoPanel())}}}function m4(A,Q){if(!A.wb.searchModal)return HQ();return HQ({className:"search-modal"},HQ({className:"scrim"}).on({click:()=>Q.engine.dispatch(new NB)}),HQ({className:"search-modal-panel"},M0(A,Q,{modal:!0})))}function sL({root:A=document.querySelector(".workbench"),baseUrl:Q="",openers:B=[],views:C=[],settings:J=[],serviceWorker:K=!0}={}){let E=oY({baseUrl:Q}),{engine:Y,app:X}=JX(E);if(FL(E),oX(E),nL(E,"opener",B),nL(E,"view",C),J.length)E.settings.register(J);E.plugins.restore();let L=gE({engine:Y,platform:E});w.reconcile(A,[L()]);let G=()=>{document.documentElement.dataset.theme=E.settings.get("workbench.theme")||"dark"};if(G(),TQ(E.settings.observe(),()=>G()),E.viewport.install(),E.voice.refresh().catch(()=>{}),E.spatialNav.install(),E.keybindings.install(window),window.addEventListener("popstate",(H)=>X.navigation.onPopState(H)),p4(Y),K&&"serviceWorker"in navigator)window.addEventListener("load",()=>navigator.serviceWorker.register("/sw.js").catch(()=>{}));return l4(Y,X),(async()=>{try{}catch(H){E.notifications.error(`Cannot reach the Trove server: ${H.message}`)}Y.dispatch(new oC)})(),window.__trove={platform:E,engine:Y,app:X,test:{parsePackage:oQ,assessTrust:(H)=>E.plugins.assessTrust(H),install:(H,Z)=>E.plugins.install(H,Z),NavigateAction:xA,attachMedia:jB}},{platform:E,engine:Y,app:X}}function nL(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 p4(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 _J),Q=0;else Q=C}else if(B.key!=="Shift")Q=0})}function l4(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 rB(C.dataTransfer.files))})}sL();
354
-
355
- //# debugId=276B23E7AF0BABFD64756E2164756E21
356
- //# sourceMappingURL=main-c9dnnnc6.js.map