@knockdata/objectexplorer 0.4.0 → 0.4.1

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.
@@ -1952,4 +1952,4 @@ ${g}`)).style(`margin-left`,u?`${+u}px`:null).style(`width`,p===void 0?null:`${+
1952
1952
  `);for(let e of n)yield e}async function D1(e){let{containerHandle:t,pattern:n,flags:r=`ig`,index:a,mtimeMap:o,indexOnly:s,nameOnly:c,indexSearchOnly:l,on:u=function(){}}=e,d=e.perFileLimit||3,f=e.maxFiles||1e3,p=e.startAfterPath||``,m=e.onlyPath||``,h=e.skipMatches||0,g=n?new RegExp(n,r):null,_=await Cn(),v=await yn(TZ,EZ),y=0,b=0,x=0,S=``,C=!1,w=[oZ()],T=!1,E=!!p;if(a&&!s&&!m&&!p){let e=xZ({index:a,query:n,maxResults:50});for(let t of e)u(`indexMatch`,t)}if(l)return{containerHandle:t,filesSearched:0,totalMatchFiles:0,totalMatchContent:0,lastPath:``,truncatedFiles:!1,updatedLogBytes:null};let D=v([``,t]);for await(let[e,t]of D){let n=e.slice(1);if(E)n===p&&(E=!1);else if(!(m&&n!==m))try{let{mtime:r}=await _(t),a=o?o.get(n):void 0,l=s||c||a===void 0||Math.floor(a/1e3)!==Math.floor(r/1e3),d=await k({child:t,childPath:e,cleanPath:n,regex:g,extractKw:l,nameOnly:c});if(x++,l&&d&&(T=!0,w.push(sZ({path:n,mtime:r,keywords:d.keywords}))),d&&d.hasMore&&u(`fileMore`,{path:e}),b>=f){C=!0;break}if(m)break}catch(n){console.log({childPath:e,child:t,error:n})}}return{containerHandle:t,filesSearched:x,totalMatchFiles:b,totalMatchContent:y,lastPath:S,truncatedFiles:C,updatedLogBytes:T?w:null};function O(e){let t=Math.min(e.length,8192);for(let n=0;n<t;n++)if(e[n]===0)return!0;return!1}async function k(e){let{child:t,childPath:n,cleanPath:r,regex:a,extractKw:o=!0,nameOnly:s}=e,c=yt(r),l=r.split(`/`).pop().replace(/\.[^.]+$/,``),f=new Map,p=0,m=0,g=0,_=!1;if(s)return wZ({title:l,body:``,ext:c},f),{keywords:Array.from(f.entries()).map(([e,t])=>({keyword:e,score:t})),hasMore:!1};try{let e=w1[c],n=e?E1(e,t):Sn(t,O);for await(let e of n){let n=!1;try{n=v(e)}catch{console.log(e,t)}if(n)break}return{keywords:Array.from(f.entries()).map(([e,t])=>({keyword:e,score:t})),hasMore:_}}catch(t){return console.error({...e,...t}),null}function v(e){if(p+=1,o&&wZ({title:l,body:e,ext:c},f),a){a.lastIndex=0;let t=a.exec(e);if(t&&(m+=1,m>h)){if(g<d){y++;let a={path:n,line:e,lineNumber:p,match:t[0]};g===0&&h===0?(u(`contentFirstMatch`,a),b++,S=r):u(`contentMatch`,a),g++}else if(_=!0,o===!1)return!0}}return!1}}}console.log({type:`tracer`}),Ot&&(self.addEventListener(`unhandledrejection`,e=>{self.postMessage({type:`error`,message:e.reason?.message,stack:e.reason?.stack})},{once:!0}),self.onmessage=async function(e){console.log(e);let{containerHandle:t,pattern:n,flags:r,indexOnly:a,nameOnly:o,indexSearchOnly:s,perFileLimit:c,maxFiles:l,startAfterPath:u,onlyPath:d,skipMatches:f}=e.data;if(t)if(o){let e=await D1({containerHandle:t,nameOnly:!0,on:k1});self.postMessage({type:`finished`,result:e})}else if(a){let e=await D1({containerHandle:t,flags:r,indexOnly:!0,on:k1});self.postMessage({type:`finished`,result:e})}else{let{index:e,mtimeMap:a}=await O1(t,s?`.name.bin`:`.index.bin`),o=await D1({containerHandle:t,pattern:n,flags:r,index:e,mtimeMap:a,indexSearchOnly:s,on:k1,perFileLimit:c,maxFiles:l,startAfterPath:u,onlyPath:d,skipMatches:f});self.postMessage({type:`finished`,result:o})}});async function O1(e,t){try{let n=await(await(await e.getFileHandle(t)).getFile()).arrayBuffer(),r=bZ(cZ(new Uint8Array(n)).entries);return{index:r,mtimeMap:r.pathToMtime}}catch(e){return console.log(`no index or version mismatch, searching all files:`,e.message),{index:null,mtimeMap:null}}}function k1(e,t){self.postMessage({type:e,result:t})}var A1=``+new URL(`search-worker.js`,import.meta.url).href;function j1(e=[]){let t=new Worker(A1,{type:`module`});return t.onerror=function(e){console.error(A1,e)},t.addEventListener(`messageerror`,e=>{console.error(A1,e)}),t.addEventListener(`message`,e=>{e.data?.type===`error`&&console.error(e.data.message,e.data.stack)}),{search:c,buildIndex:n,ensureNameIndex:r};async function n(e){let{containerHandle:n}=e;return new Promise(e=>{t.onmessage=function(t){t.data.type===`finished`&&e(t.data.result)},t.postMessage({containerHandle:n,indexOnly:!0})})}async function r(e){let{containerHandle:t}=e;await a(t)||await s(t,(await o(t)).updatedLogBytes)}async function a(e){try{return await e.getFileHandle(`.name.bin`),!0}catch{return!1}}async function o(e){return new Promise(n=>{t.onmessage=function(e){e.data.type===`finished`&&n(e.data.result)},t.postMessage({containerHandle:e,nameOnly:!0})})}async function s(e,t){if(t)try{let n=await(await e.getFileHandle(`.name.bin`,{create:!0})).createWritable();for(let e of t)await n.write(e);await n.close()}catch(e){console.log(`could not save .name.bin`,e.message)}}async function c(e){let{containerHandle:n,query:r,providerType:a,root:o,flags:s,mode:c,startAfterPath:u,perFileLimit:d,maxFiles:f,onlyPath:p,skipMatches:m,force:h,signal:g,indexSearchOnly:_}=e,{onIndexMatch:v,onContentMatch:y,onContentFirstMatch:b,onFileMore:x=M1,onOversize:S=M1,onRootFinished:C=M1}=e;return n?new Promise(e=>{t.onmessage=function(t){let{data:n}=t;switch(n.type){case`indexMatch`:return v(n.result);case`contentMatch`:return y(n.result);case`contentFirstMatch`:return b(n.result);case`fileMore`:return x(n.result);case`finished`:return e(n.result);default:console.warn(n)}},t.onerror=function(t){e({error:t})},t.postMessage({containerHandle:n,pattern:r,flags:s,indexSearchOnly:_,startAfterPath:u,perFileLimit:d,maxFiles:f,onlyPath:p,skipMatches:m})}):await l({providerType:a,root:o,pattern:r,flags:s,mode:c,startAfterPath:u,perFileLimit:d,maxFiles:f,onlyPath:p,skipMatches:m,force:h,signal:g,onIndexMatch:v,onContentMatch:y,onContentFirstMatch:b,onFileMore:x,onOversize:S,onRootFinished:C})}async function l(e){let{providerType:t,root:n,pattern:r,flags:a,mode:o,startAfterPath:s,perFileLimit:c,maxFiles:l,onlyPath:u,skipMatches:d,force:f,signal:p}=e,{onIndexMatch:m,onContentMatch:h,onContentFirstMatch:g,onFileMore:_,onOversize:v,onRootFinished:y}=e,b={};try{let e=(await fetch(`/api/search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({providerType:t,root:n,pattern:r,flags:a,mode:o,startAfterPath:s,perFileLimit:c,maxFiles:l,onlyPath:u,skipMatches:d,force:f}),signal:p})).body.getReader(),m=new TextDecoder,h=``,g=!1;for(;g===!1;){let t=await e.read();if(t.done)g=!0;else{h+=m.decode(t.value,{stream:!0});let e=h.split(`
1953
1953
  `);h=e.pop();for(let t of e)t&&x(JSON.parse(t))}}}catch(e){console.warn(e),b={error:e}}return b;function x(e){let{type:t,result:n}=e;switch(t){case`indexMatch`:return m(n);case`contentMatch`:return h(n);case`contentFirstMatch`:return g(n);case`fileMore`:return _(n);case`oversize`:return v(n);case`rootFinished`:return y(n);case`finished`:b=n;return;default:console.warn(e)}}}}function M1(){}function N1(e){let{message:t,onConfirm:n=()=>{},onClose:r=()=>{},confirmLabel:a=`Open`,hideCancel:o=!1}=e,s=V(()=>B(`dialog`,{class:`prompt-dialog`,onClose:u,onclick:c,oncancel:l},B(`p`,{class:`prompt-dialog-message`},t),B(`div`,{class:`prompt-dialog-footer`},B(`button`,{class:`prompt-dialog-btn prompt-dialog-btn-confirm`,onClick:()=>{u(),n()}},a),o?``:B(`button`,{class:`prompt-dialog-btn`,onClick:u},`Cancel`))));document.body.appendChild(s),s.showModal();function c(e){if(!o){let{clientX:t,clientY:n}=e,{left:r,top:a,right:o,bottom:c}=s.getBoundingClientRect();(t<r||t>o||n<a||n>c)&&u()}}function l(e){o&&e.preventDefault()}function u(){s.close(),s.remove()}}async function P1(e,t){let n=await fetch(e,t),r=await n.text();if(n.ok)try{return JSON.parse(r)}catch(t){throw console.warn(`provider api: answer is not json`,e,r,t),Error(`${e} answered with something that is not JSON: ${r.slice(0,200)}`)}throw console.warn(`provider api failed`,e,n.status,r),Error(`${e} answered ${n.status}: ${r.slice(0,200)}`)}function F1(e,t){return P1(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)})}async function I1(e){return P1(`/api/providers/authStatus?providerType=${e}`)}async function L1(e,t){return F1(`/api/providers/login`,{providerType:e,method:t})}async function R1(e){return F1(`/api/providers/cancelLogin`,{providerType:e})}async function z1(e){return P1(`/api/providers/tools${e?`?refresh=true`:``}`)}async function B1(e){return F1(`/api/providers/installTool`,{providerType:e})}async function V1(e,t){return F1(`/api/providers/connect`,{providerType:e,secret:t})}async function H1(e){let t=await P1(`/api/${e}/`);return t&&t.payload&&t.payload.children||[]}function U1(e,t){let n=0,r=setInterval(async function(){n+=1;try{let r=await I1(e),o=!r.authed&&n>60,s=r.authed||r.loginError||o;t(r,s,o),s&&a()}catch(n){console.warn(`pollUntilAuthed`,e,n),a(),t({authed:!1,loginError:n.message},!0,!1)}},2e3);function a(){clearInterval(r)}return a}function W1(e){let{$tried:t}=e,n=T(!1),r=E(()=>t.value.length>0),a=E(()=>n.value?`Hide what was checked`:`What was checked`);return B(G,{when:r},B(`a`,{class:`provider-config-link`,onclick:()=>n.value=!n.value},a),B(G,{when:n},B(`div`,{class:`provider-config-tried`},B(H,{each:t},function(e){return B(`div`,{class:`provider-config-try ${e.skipped?`skipped`:e.ok?`ok`:`fail`}`},B(`span`,{class:`provider-config-try-mark`},e.skipped?`–`:e.ok?`✓`:`✗`),B(`span`,{class:`provider-config-try-label`},e.label),B(`code`,{class:`provider-config-try-cmd`},e.cmd),e.error?B(`div`,{class:`provider-config-try-error`},e.error):null)}))))}function G1(e,t){let{providerType:n,legend:r,placeholder:a,$message:o,onConnected:s}=e,c=T(``),l=T(!1),u=T(!1),d=E(()=>`provider-config-drop ${u.value?`dragover`:``}`),f=E(()=>l.value||c.value.trim().length===0),p=E(()=>l.value?`Connecting…`:`Connect`);async function m(){o.value=``,l.value=!0;let e={ok:!1};try{e=await V1(n,c.value)}catch(t){console.warn(`ProviderSecret connect`,n,t),e={ok:!1,message:t.message}}l.value=!1,e.ok?(c.value=``,await s()):o.value=e.message||`Could not connect.`}function h(e){e.preventDefault(),u.value=!0}function g(e){e.currentTarget.contains(e.relatedTarget)||(u.value=!1)}async function _(e){e.preventDefault(),u.value=!1;let t=e.currentTarget.querySelector(`textarea`),n=e.dataTransfer.files[0];if(n){let e=await n.text();t.value=e,c.value=e,await m()}}return B(`fieldset`,{class:`provider-config-card`},B(`legend`,null,r),B(`div`,{class:d,ondragover:h,ondragleave:g,ondrop:_},B(`textarea`,{class:`provider-config-input`,id:`provider-secret-${n}`,rows:`3`,placeholder:a,oninput:e=>c.value=e.currentTarget.value})),B(`button`,{class:`provider-config-btn`,id:`provider-connect-${n}`,onclick:m,disabled:f},p),t)}var K1=`aws-s3`;function q1(e){let{status:t,onConnected:n}=e,r=T(``),a=T(null),o=T([]),s=T(!1),c=T(``),l=T(!1),u=T(!1),d=T(``),f=E(()=>r.value===`connected`),p=E(()=>r.value===`needsAuth`),m=E(()=>p.value&&!s.value),h=E(()=>d.value!==``),g=null;return y(t),pX(_,{clazz:`provider-config`,id:`provider-config-dialog-${K1}`,header:B(`div`,{class:`provider-config-heading-row`},B(`span`,{class:`provider-config-icon`},B(U,{name:`s3`})),B(`div`,{class:`provider-config-heading`},B(`div`,{class:`provider-config-title`},`Connect to Amazon S3`))),onClose:()=>n(g)});function _(e){let{close:t}=e;return B(`div`,{class:`dialog-body`},B(G,{when:f},B(`div`,{class:`provider-config-identity`},B(`span`,{class:`provider-config-identity-mark`},`✓`),B(`div`,null,B(`div`,{class:`provider-config-identity-user`},`Connected as `,E(()=>v(`user`))),B(`div`,{class:`provider-config-identity-note`},`Account `,E(()=>v(`account`)),` · via `,E(()=>v(`source`))))),B(`button`,{class:`provider-config-btn`,onclick:t},`Continue`)),B(G,{when:p},B(G,{when:s},B(`div`,{class:`provider-config-expired`},B(`div`,{class:`provider-config-expired-text`},`Your AWS session expired. Sign in again below.`),B(G,{when:l},B(`code`,{class:`provider-config-expired-detail`},c)),B(`a`,{class:`provider-config-link`,onclick:()=>l.value=!l.value},E(()=>l.value?`Hide details`:`Show details`)))),B(G,{when:m},B(`div`,{class:`provider-config-intro`},`We couldn't find AWS credentials automatically. Paste or drop an access key below.`)),B(G1,{providerType:K1,legend:`Access key`,$message:d,onConnected:b,placeholder:`Access key ID, Secret access key
1954
1954
  AKIA…,wJal…`},B(`button`,{class:`provider-config-expander`,onclick:()=>u.value=!u.value},`Don't have a key? Create one`,B(`span`,{class:E(()=>`provider-config-expander-arrow ${u.value?`open`:``}`)},`▾`)),B(G,{when:u},B(`div`,{class:`provider-config-help`},B(`div`,null,`1. Open `,B(`a`,{href:`https://console.aws.amazon.com/iam/home#/security_credentials`,target:`_blank`,rel:`noopener`},`IAM → Security credentials`)),B(`div`,null,`2. Click "Create access key"`),B(`div`,null,`3. Copy the Access key ID and Secret access key, and paste both above`)))),B(W1,{$tried:o})),B(G,{when:h},B(`div`,{class:`provider-config-message`},d)))}function v(e){return(a.value||{})[e]||``}function y(e){e?(g=e,a.value=e.identity||null,o.value=e.tried||[],s.value=!!e.expired,c.value=e.expiredDetail||``,e.authed?r.value=`connected`:r.value=`needsAuth`):r.value=`needsAuth`}async function b(){try{y(await I1(K1))}catch(e){console.warn(`AWS probe`,e),d.value=e.message,r.value=`needsAuth`}}}function J1({providerType:e,$loggingIn:t,$loginOutput:n,$message:r,onStatus:a}){let o=null;function s(){t.value?l():c()}async function c(){r.value=``,n.value=``,t.value=!0;let s={ok:!1};try{s=await L1(e)}catch(t){console.warn(`startLogin`,e,t),s={ok:!1,message:t.message}}s.ok?o=U1(e,function(e,n,s){a(e),n&&(t.value=!1,o=null),s&&(r.value=`The browser sign-in didn't complete. Finish it in the browser tab and try again.`)}):(t.value=!1,r.value=s.message||s.error||`Login is not available.`)}async function l(){o&&=(o(),null),t.value=!1,n.value=``;try{await R1(e)}catch(t){console.warn(`abortLogin`,e,t)}}return{onSignIn:s,abortLogin:l}}var Y1=`azure`;function X1(e){let{status:t,onConnected:n}=e,r=T(``),a=T([]),o=T(!1),s=T(``),c=T(``),l=E(()=>r.value===`connected`),u=E(()=>r.value===`needsAuth`),d=E(()=>s.value!==``),f=E(()=>c.value!==``),p=E(()=>o.value?`Waiting for browser login… Cancel`:`Sign in with Microsoft`),m=E(()=>l.value?`You're all set`:`Two ways to sign in`),{onSignIn:h,abortLogin:g}=J1({providerType:Y1,$loggingIn:o,$loginOutput:s,$message:c,onStatus:y}),_=null;return y(t),pX(v,{clazz:`provider-config`,id:`provider-config-dialog-${Y1}`,header:B(`div`,{class:`provider-config-heading-row`},B(`span`,{class:`provider-config-icon`},B(U,{name:`azure`})),B(`div`,{class:`provider-config-heading`},B(`div`,{class:`provider-config-title`},`Connect to Azure Storage`),B(`div`,{class:`provider-config-subtitle`},m))),onClose:x});function v(e){let{close:t}=e;return B(`div`,{class:`dialog-body`},B(G,{when:l},B(`div`,{class:`provider-config-identity`},B(`span`,{class:`provider-config-identity-mark`},`✓`),B(`div`,null,B(`div`,{class:`provider-config-identity-user`},`Connected to Azure Storage`),B(`div`,{class:`provider-config-identity-note`},`Your accounts are ready to browse`))),B(`button`,{class:`provider-config-btn`,onclick:t},`Continue`)),B(G,{when:u},B(`div`,{class:`provider-config-intro`},`We couldn't find Azure credentials automatically. Choose how you'd like to sign in:`),B(`fieldset`,{class:`provider-config-card`},B(`legend`,null,B(`span`,null,`Sign in with Microsoft`),B(`span`,{class:`provider-config-badge`},`RECOMMENDED`)),B(`div`,{class:`provider-config-card-note`},`This sign-in happens inside the app — no CLI to install. It opens your browser for your Microsoft account, and keeps the session so your storage accounts stay available.`),B(`button`,{class:`provider-config-btn`,onclick:h},p)),B(G1,{providerType:Y1,legend:`Account key`,$message:c,onConnected:b,placeholder:`DefaultEndpointsProtocol=https;AccountName=…;AccountKey=…
1955
- or https://<account>.blob.core.windows.net/?sv=…&sig=…`},B(`a`,{class:`provider-config-link`,href:`https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage`,target:`_blank`,rel:`noopener`},`Where do I find this?`)),B(W1,{$tried:a})),B(G,{when:d},B(`pre`,{class:`provider-config-output`},s)),B(G,{when:f},B(`div`,{class:`provider-config-message`},c)))}function y(e){e?(_=e,a.value=e.tried||[],s.value=e.loginOutput||e.loginError||``,e.authed?r.value=`connected`:r.value=`needsAuth`):r.value=`needsAuth`}async function b(){try{y(await I1(Y1))}catch(e){console.warn(`Azure probe`,e),c.value=e.message,r.value=`needsAuth`}}function x(){o.value&&g(),n(_)}}function Z1(e){let{$tool:t,providerType:n,label:r}=e,a=T(!1),o=T(!1),s=T(!1),c=T(``),l=E(()=>!!t.value&&!t.value.available),u=E(()=>(t.value||{}).installCmd||``),d=E(()=>(t.value||{}).docLink||``),f=E(()=>(t.value||{}).installNote||`Signing in through the browser runs this CLI, so it has to be on this machine first. It installs for your user only — no administrator password.`),p=E(()=>u.value!==``&&!a.value),m=E(()=>o.value?`Copied`:`Copy command`),h=E(()=>a.value?`Installing in Terminal…`:`Install the ${r}`),g=null,_=null;function v(){y(),g=setInterval(async function(){try{let e=(await z1(!0))[n];e&&e.available&&(y(),a.value=!1,t.value=e)}catch(e){console.warn(`ProviderCli poll`,n,e),y(),a.value=!1}},3e3),_=setTimeout(function(){s.value=!0},12e4)}function y(){g&&=(clearInterval(g),null),_&&=(clearTimeout(_),null),s.value=!1}async function b(){a.value=!0,c.value=``;let e={ok:!1};try{e=await B1(n)}catch(t){console.warn(`ProviderCli install`,n,t),e={ok:!1,message:t.message}}e.ok?v():(a.value=!1,c.value=e.message||`The install could not be started.`)}function x(){navigator.clipboard.writeText(u.value).then(function(){o.value=!0,setTimeout(function(){o.value=!1},1500)}).catch(function(e){console.warn(`ProviderCli copyCommand`,e)})}return B(G,{when:l},B(`fieldset`,{class:`provider-config-card`},B(`legend`,null,B(`span`,null,r,` not installed`)),B(`div`,{class:`provider-config-card-note`},f),B(`code`,{class:`provider-config-cli-cmd`},u),B(`div`,{class:`provider-config-cli-actions`},B(`button`,{class:`provider-config-btn`,onclick:b,disabled:E(()=>!p.value)},h),B(`button`,{class:`provider-config-btn secondary`,onclick:x},m)),B(G,{when:a},B(`div`,{class:`provider-config-card-note`},`Finish the install in the Terminal window. This dialog unlocks as soon as the command is found.`)),B(G,{when:s},B(`div`,{class:`provider-config-card-note`},`Still nothing. A big installer can take this long — but antivirus can also block an install started this way. Copy the command and run it yourself, or use the link below.`)),B(G,{when:c},B(`div`,{class:`provider-config-card-note`},c)),B(`a`,{class:`provider-config-link`,href:d,target:`_blank`,rel:`noopener`},`Install it yourself instead`)))}var Q1=`gcp-gcs`;function $1(e){let{status:t,tool:n,onConnected:r}=e,a=T(``),o=T([]),s=T(!1),c=T(``),l=T(``),u=T(n),d=E(()=>a.value===`connected`),f=E(()=>a.value===`needsAuth`),p=E(()=>c.value!==``),m=E(()=>l.value!==``),h=E(()=>!!u.value&&!u.value.available),g=E(()=>s.value?`Waiting for browser login… Cancel`:`gcloud auth application-default login`),_=E(()=>d.value?`You're all set`:`Sign in to continue`),{onSignIn:v,abortLogin:y}=J1({providerType:Q1,$loggingIn:s,$loginOutput:c,$message:l,onStatus:S}),b=null;return S(t),pX(x,{clazz:`provider-config`,id:`provider-config-dialog-${Q1}`,header:B(`div`,{class:`provider-config-heading-row`},B(`span`,{class:`provider-config-icon`},B(U,{name:`gcp-storagebucket`})),B(`div`,{class:`provider-config-heading`},B(`div`,{class:`provider-config-title`},`Connect to Google Cloud Storage`),B(`div`,{class:`provider-config-subtitle`},_))),onClose:C});function x(e){let{close:t}=e;return B(`div`,{class:`dialog-body`},B(G,{when:d},B(`div`,{class:`provider-config-identity`},B(`span`,{class:`provider-config-identity-mark`},`✓`),B(`div`,null,B(`div`,{class:`provider-config-identity-user`},`Connected to Google Cloud`),B(`div`,{class:`provider-config-identity-note`},`Your buckets are ready to browse`))),B(`button`,{class:`provider-config-btn`,onclick:t},`Continue`)),B(G,{when:f},B(`div`,{class:`provider-config-intro`},`We couldn't find Google Cloud credentials automatically. Sign in to create them:`),B(Z1,{$tool:u,providerType:Q1,label:`Google Cloud CLI`}),B(`fieldset`,{class:`provider-config-card`},B(`legend`,null,B(`span`,null,`Sign in with gcloud`),B(`span`,{class:`provider-config-badge`},`RECOMMENDED`),B(`span`,{class:`provider-config-hint`,title:`GCS reads Application Default Credentials from ~/.config/gcloud. This command writes them.`},`?`)),B(`div`,{class:`provider-config-card-note`},`This opens your browser to sign in to Google, then writes Application Default Credentials that ObjectExplorer reads directly.`),B(`button`,{class:`provider-config-btn`,onclick:v,disabled:h},g)),B(W1,{$tried:o})),B(G,{when:p},B(`pre`,{class:`provider-config-output`},c)),B(G,{when:m},B(`div`,{class:`provider-config-message`},l)))}function S(e){e?(b=e,o.value=e.tried||[],c.value=e.loginOutput||e.loginError||``,e.authed?a.value=`connected`:a.value=`needsAuth`):a.value=`needsAuth`}function C(){s.value&&y(),r(b)}}var e0={"aws-s3":q1,azure:X1,"gcp-gcs":$1};function t0(e){let{onAdded:t}=e,n=T(new Set),r=T([]),a=T(``),o=T({});return c(),l(),pX(s,{header:`Add a Favorite`,style:`width: 460px;`,id:`add-favorite-dialog`});function s(){return B(`div`,{class:`add-favorite-body`},B(H,{each:r},function(e){return B(n0,{provider:e,$favKeys:n,$tools:o,onChanged:t})}),B(r0,{onChanged:t,$appMode:a}))}async function c(){let e=await fetch(`/api/meta`).then(e=>e.json()),t=(e.favorites||[]).filter(e=>e.objectKind===`bucket`).map(e=>`${e.providerType}:${e.root}`);n.value=new Set(t),r.value=e.providers||[],a.value=e.appMode}async function l(){try{o.value=await z1()}catch(e){console.warn(`loadTools`,e),o.value={}}}}function n0(e){let{provider:t,$favKeys:n,$tools:r,onChanged:a}=e,o=T(!1),s=T(!1),c=T(!1),l=T(!1),u=T(null),d=T([]),f=E(()=>o.value&&s.value),p=E(()=>o.value&&!s.value&&l.value),m=E(()=>p.value&&u.value!==null),h=E(()=>c.value&&!s.value&&!l.value&&!!e0[t.providerType]),g=E(()=>s.value?`probing`:c.value&&l.value?`ok`:``),_=E(()=>g.value!==``);function v(e){return(u.value||{})[e]||``}function y(){o.value=!o.value}let b=null;async function x(e){s.value=!0,e?(b=e,l.value=e.authed,u.value=e.identity||null,e.authed&&(d.value=await H1(t.providerType))):l.value=!1,c.value=!0,s.value=!1}async function S(){s.value=!0;try{await x(await I1(t.providerType))}catch(e){console.warn(`probe`,t.providerType,e),await x(null)}}S();function C(e){e.stopPropagation();let n=e0[t.providerType];n({status:b,tool:r.value[t.providerType]||null,onConnected:w})}async function w(e){await x(e),l.value&&(o.value=!0)}async function D(e,t){let r=`${e.providerType}:${e.root}`;await fetch(t?`/api/favorites/add`:`/api/favorites/remove`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({providerType:e.providerType,root:e.root,label:e.root})});let o=new Set(n.value);t?o.add(r):o.delete(r),n.value=o,a&&a()}return B(`div`,{class:`add-favorite-provider`,id:`provider-${t.providerType}`,"data-provider":t.label},B(`div`,{class:`add-favorite-row`,id:`provider-row-${t.providerType}`,onclick:y},B(`span`,{class:E(()=>`add-favorite-caret ${o.value?`expanded`:``}`)},B(U,{name:`chevron-right`})),B(`span`,{class:`add-favorite-icon`},B(U,{name:t.icon})),B(`span`,{class:`add-favorite-label`},t.label),B(G,{when:h},B(`span`,{class:`add-favorite-config`,id:`provider-config-${t.providerType}`,onclick:C},B(U,{name:`settings-gear`}))),B(G,{when:_},B(`span`,{class:E(()=>`add-favorite-mark ${g.value}`),id:`provider-mark-${t.providerType}`}))),B(G,{when:f},B(`div`,{class:`add-favorite-checking`},B(`span`,{class:`add-favorite-spinner`}),B(`div`,{class:`add-favorite-checking-title`},`Looking for `,t.label,` credentials on this machine…`))),B(G,{when:m},B(`div`,{class:`add-favorite-identity`},B(`span`,{class:`add-favorite-identity-mark`},`✓`),B(`div`,null,B(`div`,{class:`add-favorite-identity-user`},`Connected as `,E(()=>v(`user`))),B(`div`,{class:`add-favorite-identity-note`},`Account `,E(()=>v(`account`)),` · via `,E(()=>v(`source`)))))),B(G,{when:p},B(H,{each:d,Empty:()=>B(`div`,{class:`add-favorite-status`},`No buckets found`)},function(e){return B(`label`,{class:`add-favorite-check-row`},B(`input`,{type:`checkbox`,id:`bucket-${e.providerType}-${e.root}`,checked:E(()=>n.value.has(`${e.providerType}:${e.root}`)),onchange:t=>D(e,t.currentTarget.checked)}),B(`span`,{class:`add-favorite-label`},e.root))})))}function r0(e){let{onChanged:t,$appMode:n}=e,r=T(!1),a=T([]);o();async function o(){let e=await Vt(),t=await tn();a.value=[...e,...t]}function s(e){e.stopPropagation(),r.value=!r.value}async function c(){let e=n.value!==`instant`;console.log(`[add-folder] pickFolder: start, appMode=`,n.value);try{if(e)await Bt(),r.value=!0,await o(),console.log(`[add-folder] pickFolder: folders now`,a.value.map(e=>e.root)),t&&t();else{console.log(`[add-folder] pickFolder: web -> showDirectoryPicker() ...`);let e=await window.showDirectoryPicker();console.log(`[add-folder] pickFolder: picked`,e&&e.name),e&&(await Jt(e),r.value=!0,await o(),console.log(`[add-folder] pickFolder: folders now`,a.value.map(e=>e.root)),t&&t())}}catch(e){console.error(`[add-folder] pickFolder: FAILED name=`,e&&e.name,`message=`,e&&e.message),console.error(`[add-folder] pickFolder: full error object ->`,e)}}async function l(e,n){e.handle?await Yt(e.handle,n):await Ht(e.root,n),await o(),t&&t()}function u(e,t){e.currentTarget.checked?l(t,!1):l(t,!0)}return B(`div`,{class:`add-favorite-provider`,id:`provider-local`},B(`div`,{class:`add-favorite-row`,id:`provider-row-local`},B(`span`,{class:E(()=>`add-favorite-caret ${r.value?`expanded`:``}`),id:`provider-toggle-local`,onclick:s},B(U,{name:`chevron-right`})),B(`span`,{class:`add-favorite-icon`},B(U,{name:`folder-opened`})),B(`span`,{class:`add-favorite-label`},`Local folder`),B(`span`,{class:`add-favorite-config`,id:`local-folder-add`,onclick:c},B(U,{name:`add`}))),B(H,{each:a,$expanded:r,Empty:()=>B(`div`,{class:`add-favorite-status`},`No local folders`)},function(e){return B(`label`,{class:`add-favorite-check-row`},B(`input`,{type:`checkbox`,id:`folder-${e.root}`,checked:!e.hidden,onchange:t=>u(t,e)}),B(`span`,{class:`add-favorite-label`},e.label||e.root))}))}function i0(){return{$query:T(``),$results:T([]),$searching:T(!1),$excludes:T(`node_modules, dist, .git, .venv, build`),$useIgnoreFile:T(!0),$cloudOpen:T(!1),$cloud:T([]),runId:0}}function a0(e){let t=[];for(let n of e)n.handle?t.push({kind:`local`,root:n.root||n.name,handle:n.handle}):n.providerType&&n.providerType!==`local`&&n.root&&t.push({kind:`backend`,providerType:n.providerType,root:n.root});return t}function o0(e){let t=new Map;for(let n of a0(e))t.set(n.root,n);let n=[];for(let e of ZJ()){let r=t.get(e.root);r&&n.push({root:e.root,path:e.path,name:e.name,score:0,source:r})}return n}var s0=null;function c0(e){clearTimeout(s0),s0=setTimeout(()=>l0(e),150)}async function l0(e){let{state:t,searchers:n,roots:r}=e,a=t.$query.value,o=t.runId+1;if(t.runId=o,a){t.$searching.value=!0;let e=new Map,s=[...vY(r),...yY(t,`cached`,!1)];for(let r of s)if(t.runId===o){let s=n=>p0(t,o,e,r,n);r.kind===`local`?(await n.ensureNameIndex({containerHandle:r.handle}),await n.search({containerHandle:r.handle,query:a,flags:`ig`,indexSearchOnly:!0,onIndexMatch:s,onContentMatch(){},onContentFirstMatch(){}})):await n.search({providerType:r.providerType,root:r.root,mode:`cached`,query:a,flags:`ig`,onIndexMatch:s,onContentMatch(){},onContentFirstMatch(){}})}t.runId===o&&(t.$searching.value=!1)}else t.$results.set(o0(r))}function u0(e,t){let n=e.toLowerCase();return t.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).every(e=>n.includes(e))}function d0(e,t){return t.split(`,`).map(e=>e.trim()).filter(Boolean).some(t=>e.includes(t))}function f0(e,t){let n=e.replace(/\.[^.]+$/,``);return n===t?3:n.toLowerCase()===t.toLowerCase()?2:+!!e.toLowerCase().startsWith(t.toLowerCase())}function p0(e,t,n,r,a){if(e.runId===t){let t=String(a.path).replace(/^\//,``),o=r.kind===`local`?`${r.root}/${t}`:t,s=o.indexOf(`/`),c=s>=0?o.slice(0,s):o,l=s>=0?o.slice(s+1):o,u=l.split(`/`).pop(),d=e.$query.value;if(u0(u,d)&&d0(o,e.$excludes.value)===!1){n.set(o,{root:c,path:l,name:u,score:a.score||0,source:r});let t=Array.from(n.values()).sort((e,t)=>{let n=f0(t.name,d)-f0(e.name,d);return n===0?t.score-e.score:n}).slice(0,50);e.$results.set(t)}}}function m0(e){let{searchers:t,$treeData:n,onPick:r}=e,a=i0();a.$results.set(o0(n.value));let o=T(0);A(()=>{let e=n?n.value:[];lY(a,e),mY(a)});let s=E(()=>V(U,{name:a.$cloudOpen.value?`chevron-down`:`chevron-right`,size:16})),c=E(()=>{let e=a.$cloud.value;return a.$cloudOpen.value?V(NY,{state:a,providers:e}):V(function(){return B(`span`,null)},{})});return pX(l,{clazz:`quick-open`});function l(e){let{close:t}=e;return B(`div`,{class:`quick-open-body`,onkeydown:l},B(`input`,{class:`quick-open-input`,placeholder:`Search files by name`,autofocus:!0,oninput:u}),B(`div`,{class:`search-extra quick-open-extra`,style:`margin-left: 7px`},B(`div`,{class:`search-label search-label-toggle`},B(`span`,{class:`search-remote-label`,onclick:d},B(`span`,{class:`search-chevron`,$dom:s}),B(`span`,null,`remote storage`))),B(`div`,{class:`search-cloud`,$dom:c})),B(`div`,{class:`quick-open-list slim_scrollbar`},B(H,{each:a.$results,Empty:()=>B(`div`,{class:`quick-open-empty`},`No matching files`)},function(e,t){return B(`div`,{class:E(()=>`quick-open-row ${o.value===t?`selected`:``}`),onclick:()=>n(e)},B(`span`,{class:`quick-open-name`},e.name),B(`span`,{class:`quick-open-path`},e.path))})));function n(e){t(),r(e)}function l(e){let t=a.$results.value;if(e.key===`ArrowDown`)e.preventDefault(),o.value=Math.min(o.value+1,t.length-1);else if(e.key===`ArrowUp`)e.preventDefault(),o.value=Math.max(o.value-1,0);else if(e.key===`Enter`){e.preventDefault();let r=t[o.value];r&&n(r)}}}function u(e){a.$query.value=e.currentTarget.value,o.value=0,c0({state:a,searchers:t,roots:n.value})}function d(){let e=a.$cloudOpen.value===!1;a.$cloudOpen.value=e,e&&mY(a)}}console.log({type:`tracer`});var h0=T(250),g0=T(Number(localStorage.getItem(`sideSplit`))||50);function _0(e){let t=Math.min(Math.max(e,10),90);g0.value=t,localStorage.setItem(`sideSplit`,t)}async function v0(e,t){localStorage.getItem(`mode`);let n=[`Object explorer`],r=T(0),a=T(`explorer`),o=T([]),s=T(``),c=T(0),l=j1();E(()=>{let e=r.value;return n[e]}),n.map((e,t)=>E(()=>r.value===t?``:`display: none;`));let u=T([AJ(`left`)]),d=E(()=>u.value.map(e=>T(``))),f=E(()=>(m.value,`slim_scrollbar side_panes`)),p=T(window.innerWidth<640),m=T(!1),h=T(!1);E(()=>`--width: ${p.value?`100%`:`calc(100% - ${h0.value}px)`}; --left: ${p.value?`0`:`${h0.value}px`}`),window.$left_slided=p;let{openObject:g,setDom:_,previewContent:v,refreshObject:y,api:b}=$J({$sides:u,$active_side:c,$treeData:o,searchers:l,onMissing:x});function x(e){e.path?N1({message:`"${e.name||e.path}" no longer exists on disk.`,confirmLabel:`Refresh`,onConfirm:()=>QX(e)}):N1({message:`The folder "${e.root}" no longer exists and will be removed from the workspace.`,confirmLabel:`Remove`,hideCancel:!0,onConfirm:async()=>{await Zt(e.root,e.providerType),await P(),await M()}})}let S=eY({$sides:u,$active_side:c,openObject:g}),{oncontextmenu:C,OnContextMenu:w}=jJ({$sides:u,$active_side:c,openObject:g,$treeData:o,setDom:_,refreshObject:y,reloadProviders:P,$appMode:s});function D(){let e=[];return u.value.forEach(t=>{t.$openedObjects.value.forEach(t=>e.push(t.name))}),e}function O(e){let t=u.value[c.value],n=V(UY,{searchers:l,state:e,getOpenPaths:D,$treeData:o}),r={name:`Search: ${e.$query.value}`,objectKind:`searchEditor`,path:``,ext:``};_({dom:n,object:r,icon:`search`,side:t,viewMode:`render`},t)}async function k(e,t){let n=u.value[c.value];if(n){let r=n.$activeObject.value,a=e.source.kind===`local`?`local`:e.source.providerType,o=e.path.split(`/`).pop();if(!(r&&(r.providerType??``)===a&&(r.root??``)===e.root&&(r.path??``)===e.path)){let t;if(e.source.kind===`local`){let n=await Qt(e.source.handle,e.path),r=await n.getFile();t={providerType:a,root:e.root,path:e.path,name:o,file:r,handle:n}}else t={providerType:a,root:e.root,path:e.path,name:o};await g(void 0,{object:t})}n.$gotoLine.value={root:e.root,path:e.path,line:t.lineNumber,column:t.column,ts:Date.now()}}else console.error(`side is undefined`)}function A(){m0({searchers:l,$treeData:o,onPick:j})}async function j(e){if(u.value[c.value]){let t=e.source.kind===`local`?`local`:e.source.providerType,n;if(e.source.kind===`local`){let r=await Qt(e.source.handle,e.path),a=await r.getFile();n={providerType:t,root:e.root,path:e.path,name:e.name,file:a,handle:r}}else n={providerType:t,root:e.root,path:e.path,name:e.name};await g(void 0,{object:n})}else console.error(`side is undefined`)}document.addEventListener(`drop`,()=>h.value=!1),document.addEventListener(`dragend`,()=>h.value=!1);async function M(){let e=new URLSearchParams(location.search).has(`graph`)?`graph`:void 0,t=S.parseUrl(),n=new Set(o.value.map(e=>`${e.providerType}/${e.root}`));for(let e of t.sides)e.items=e.items.filter(e=>n.has(`${e.providerType}/${e.root}`)),e.activeIndex=e.items.length-1;t.sides=t.sides.filter(e=>e.items.length>0);let r=S.buildSides(t);S.syncUrl();for(let t=0;t<r.length;t++){let n=r[t].$activeObject.value;n&&await N(n,t,e)}}async function N(e,t,n){if(console.log(`[explorer] openRestoredObject`,{providerType:e?.providerType,root:e?.root,path:e?.path,sideIndex:t,mode:n}),e.providerType===`local`)if(await rn(e)){async function r(r){let a=`local:${e.root}`,o=await tn();for(let t of o)if(t.name===a){let n=await Qt(t.handle,e.path);n?(e.name=n.name,n.kind===`directory`?e.handle=n:e.file=await n.getFile()):e.notFound=!0;break}g(void 0,{object:e,mode:n,sideIndex:t})}N1({message:n===`graph`?`Open Graph for ${e.root}/${e.name}`:`Open ${e.name}`,onConfirm:r})}else x(e);else g(void 0,{object:e,mode:n,sideIndex:t})}async function P(){let e=await LG(`/api/meta`,{},{}),t=e.favorites||[];s.value=e.appMode;let n=(await tn()).filter(e=>!e.hidden).map(e=>({...e,children:[],needRequestPermission:!0}));o.value=[...t,...n],console.log(`[add-folder] reloadProviders: backend=`,t.map(e=>e.root),`local=`,n.map(e=>e.root),`total tree=`,o.value.length)}function F(){s.value===`instant`?qt().then(P):t0({onAdded:P})}function I(e){let t=document.getElementById(`sides-container`).getBoundingClientRect();_0((e-t.left)/t.width*100)}fn(async()=>{await P(),M(),new URLSearchParams(location.search).has(`animate`)&&nY({itemToObject:S.itemToObject,openRestoredObject:N}),window.addEventListener(`popstate`,e=>{M(e.state?.path??location.pathname)}),window.addEventListener(`keydown`,e=>{(e.metaKey||e.ctrlKey)&&e.key===`p`&&(e.preventDefault(),A())}),window.addEventListener(`message`,e);function e(e){let{data:t}=e;if(t?.type===`iframe-pointdown`){let{sideName:e}=t;u.value.some((t,n)=>{if(t.name===e)return c.value=n,!1})}console.log(e)}});function ee(e){a.value=`search`,requestAnimationFrame(()=>{document.getElementById(`panel-search-input`).focus()})}return B(`div`,{id:`app`,class:`full flex monaco-workbench`,style:{overflow:`hidden`,"--left-sidebar-width":h0,"font-size":`14px`,"--1px":`${(1/window.devicePixelRatio).toString(2)}px`}},B(`aside`,{class:{sidebar:!0,$left_slided:p,$dragover:h},style:{height:`100%`},id:`sidebar`},B(`header`,{class:`sidebar-header active`,style:`display: flex; align-items: center;`},B(`span`,{style:`display: flex; gap: 0; align-items: center;`,class:E(()=>`tab-title ${a.value===`explorer`?`selected`:``}`),onclick:()=>a.value=`explorer`},B(`span`,{style:`display: inline-block; width: 1.2em; `},B(`img`,{src:Pr()+`img/64.png`,style:`width: 100%; top: 1px;`})),B(`span`,null,`xplorer`)),B(`span`,{class:E(()=>`tab-title ${a.value===`search`?`selected`:``}`),onclick:ee},`Search`),B(`span`,{style:`flex-grow: 1;`}),B(`span`,{onclick:F,id:`add-favorite`,class:`icon`,title:`Add favorite`},B(gt,null)),B(`span`,{onclick:()=>p.value=!1,class:`icon expand`},B(ht,null)),B(`span`,{style:`font-size: 1.2em;`,onclick:()=>p.value=!0,class:`icon collapse`},B(mt,null))),B(`div`,{class:f,style:`overflow-y: auto; overflow-x: clip`},B(`div`,{style:E(()=>a.value===`explorer`?``:`display: none`)},B($X,{$tree:o,openObject:g,refreshObject:y,OnContextMenu:w,api:b})),B(`div`,{style:E(()=>a.value===`search`?``:`display: none`)},B(HY,{searchers:l,openSearchEditor:O,openSearchHit:k,getOpenPaths:D,$treeData:o})))),B(WY,{elementId:`sidebar`,minWidth:150,maxWidth:500}),B(`div`,{id:`sides-container`,style:`display: flex; flex-grow: 1; min-width: 0;`},B(H,{each:u,incremental:!0},(e,t)=>{let n=d[t],r=E(()=>u.value.length-1===t),a=E(()=>u.value.length>1),o=E(()=>u.value.length>1?t===0?`${g0.value}%`:`${100-g0.value}%`:`100%`);return B(GX,{side:e,id:t,$active_side:c,$activeTab:n,$rightmost:r,$multiSide:a,$width:o,onDragSplit:I,setDom:_,previewContent:v,openObject:g,OnContextMenu:w,api:b,explorerState:S})})))}document.readyState===`loading`?add_event_listener(document,`DOMContentLoaded`,y0):y0().then(()=>{console.log(`ready`)});async function y0(){let e=document.getElementById(`app`);console.log({$app:e}),pt(await ft(v0,{app:e}),e)}
1955
+ or https://<account>.blob.core.windows.net/?sv=…&sig=…`},B(`a`,{class:`provider-config-link`,href:`https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage`,target:`_blank`,rel:`noopener`},`Where do I find this?`)),B(W1,{$tried:a})),B(G,{when:d},B(`pre`,{class:`provider-config-output`},s)),B(G,{when:f},B(`div`,{class:`provider-config-message`},c)))}function y(e){e?(_=e,a.value=e.tried||[],s.value=e.loginOutput||e.loginError||``,e.authed?r.value=`connected`:r.value=`needsAuth`):r.value=`needsAuth`}async function b(){try{y(await I1(Y1))}catch(e){console.warn(`Azure probe`,e),c.value=e.message,r.value=`needsAuth`}}function x(){o.value&&g(),n(_)}}function Z1(e){let{$tool:t,providerType:n,label:r}=e,a=T(!1),o=T(!1),s=T(!1),c=T(``),l=E(()=>!!t.value&&!t.value.available),u=E(()=>(t.value||{}).installCmd||``),d=E(()=>(t.value||{}).docLink||``),f=E(()=>(t.value||{}).installNote||`Signing in through the browser runs this CLI, so it has to be on this machine first. It installs for your user only — no administrator password.`),p=E(()=>!!(t.value||{}).canInstall),m=E(()=>p.value&&!a.value),h=E(()=>o.value?`Copied`:`Copy command`),g=E(()=>p.value?`Install it yourself instead`:`Install the ${r}`),_=E(()=>a.value?`Installing in Terminal…`:`Install the ${r}`),v=null,y=null;function b(){x(),v=setInterval(async function(){try{let e=(await z1(!0))[n];e&&e.available&&(x(),a.value=!1,t.value=e)}catch(e){console.warn(`ProviderCli poll`,n,e),x(),a.value=!1}},3e3),y=setTimeout(function(){s.value=!0},12e4)}function x(){v&&=(clearInterval(v),null),y&&=(clearTimeout(y),null),s.value=!1}async function S(){a.value=!0,c.value=``;let e={ok:!1};try{e=await B1(n)}catch(t){console.warn(`ProviderCli install`,n,t),e={ok:!1,message:t.message}}e.ok?b():(a.value=!1,c.value=e.message||`The install could not be started.`)}function C(){navigator.clipboard.writeText(u.value).then(function(){o.value=!0,setTimeout(function(){o.value=!1},1500)}).catch(function(e){console.warn(`ProviderCli copyCommand`,e)})}return B(G,{when:l},B(`fieldset`,{class:`provider-config-card`},B(`legend`,null,B(`span`,null,r,` not installed`)),B(`div`,{class:`provider-config-card-note`},f),B(`code`,{class:`provider-config-cli-cmd`},u),B(`div`,{class:`provider-config-cli-actions`},B(G,{when:p},B(`button`,{class:`provider-config-btn`,onclick:S,disabled:E(()=>!m.value)},_)),B(`button`,{class:`provider-config-btn secondary`,onclick:C},h)),B(G,{when:a},B(`div`,{class:`provider-config-card-note`},`Finish the install in the Terminal window. This dialog unlocks as soon as the command is found.`)),B(G,{when:s},B(`div`,{class:`provider-config-card-note`},`Still nothing. A big installer can take this long — but antivirus can also block an install started this way. Copy the command and run it yourself, or use the link below.`)),B(G,{when:c},B(`div`,{class:`provider-config-card-note`},c)),B(`a`,{class:`provider-config-link`,href:d,target:`_blank`,rel:`noopener`},g)))}var Q1=`gcp-gcs`;function $1(e){let{status:t,tool:n,onConnected:r}=e,a=T(``),o=T([]),s=T(!1),c=T(``),l=T(``),u=T(n),d=T(!1),f=E(()=>a.value===`connected`),p=E(()=>a.value===`needsAuth`),m=E(()=>c.value!==``),h=E(()=>l.value!==``),g=E(()=>!!u.value&&!u.value.available),_=E(()=>s.value?`Waiting for browser login… Cancel`:`gcloud auth application-default login`),v=E(()=>f.value?`You're all set`:`Sign in to continue`),{onSignIn:y,abortLogin:b}=J1({providerType:Q1,$loggingIn:s,$loginOutput:c,$message:l,onStatus:C}),x=null;return C(t),pX(S,{clazz:`provider-config`,id:`provider-config-dialog-${Q1}`,header:B(`div`,{class:`provider-config-heading-row`},B(`span`,{class:`provider-config-icon`},B(U,{name:`gcp-storagebucket`})),B(`div`,{class:`provider-config-heading`},B(`div`,{class:`provider-config-title`},`Connect to Google Cloud Storage`),B(`div`,{class:`provider-config-subtitle`},v))),onClose:D});function S(e){let{close:t}=e;return B(`div`,{class:`dialog-body`},B(G,{when:f},B(`div`,{class:`provider-config-identity`},B(`span`,{class:`provider-config-identity-mark`},`✓`),B(`div`,null,B(`div`,{class:`provider-config-identity-user`},`Connected to Google Cloud`),B(`div`,{class:`provider-config-identity-note`},`Your buckets are ready to browse`))),B(`button`,{class:`provider-config-btn`,onclick:t},`Continue`)),B(G,{when:p},B(`div`,{class:`provider-config-intro`},`We couldn't find Google Cloud credentials automatically. Sign in, or paste a service account key:`),B(Z1,{$tool:u,providerType:Q1,label:`Google Cloud CLI`}),B(`fieldset`,{class:`provider-config-card`},B(`legend`,null,B(`span`,null,`Sign in with gcloud`),B(`span`,{class:`provider-config-badge`},`RECOMMENDED`),B(`span`,{class:`provider-config-hint`,title:`GCS reads Application Default Credentials from ~/.config/gcloud. This command writes them.`},`?`)),B(`div`,{class:`provider-config-card-note`},`This opens your browser to sign in to Google, then writes Application Default Credentials that ObjectExplorer reads directly.`),B(`button`,{class:`provider-config-btn`,onclick:y,disabled:g},_)),B(G1,{providerType:Q1,legend:`Service account key`,$message:l,onConnected:w,placeholder:`Paste the service account JSON, or drop the .json file here`},B(`button`,{class:`provider-config-expander`,onclick:()=>d.value=!d.value},`Don't have a key? Create one`,B(`span`,{class:E(()=>`provider-config-expander-arrow ${d.value?`open`:``}`)},`▾`)),B(G,{when:d},B(`div`,{class:`provider-config-help`},B(`div`,null,`1. Open `,B(`a`,{href:`https://console.cloud.google.com/iam-admin/serviceaccounts`,target:`_blank`,rel:`noopener`},`IAM → Service accounts`)),B(`div`,null,`2. Pick a service account with Storage access, then Keys → Add key → Create new key → JSON`),B(`div`,null,`3. Drop the downloaded .json above, or paste what is in it`)))),B(W1,{$tried:o})),B(G,{when:m},B(`pre`,{class:`provider-config-output`},c)),B(G,{when:h},B(`div`,{class:`provider-config-message`},l)))}function C(e){e?(x=e,o.value=e.tried||[],c.value=e.loginOutput||e.loginError||``,e.authed?a.value=`connected`:a.value=`needsAuth`):a.value=`needsAuth`}async function w(){try{C(await I1(Q1))}catch(e){console.warn(`GCP probe`,e),l.value=e.message,a.value=`needsAuth`}}function D(){s.value&&b(),r(x)}}var e0={"aws-s3":q1,azure:X1,"gcp-gcs":$1};function t0(e){let{onAdded:t}=e,n=T(new Set),r=T([]),a=T(``),o=T({});return c(),l(),pX(s,{header:`Add a Favorite`,style:`width: 460px;`,id:`add-favorite-dialog`});function s(){return B(`div`,{class:`add-favorite-body`},B(H,{each:r},function(e){return B(n0,{provider:e,$favKeys:n,$tools:o,onChanged:t})}),B(r0,{onChanged:t,$appMode:a}))}async function c(){let e=await fetch(`/api/meta`).then(e=>e.json()),t=(e.favorites||[]).filter(e=>e.objectKind===`bucket`).map(e=>`${e.providerType}:${e.root}`);n.value=new Set(t),r.value=e.providers||[],a.value=e.appMode}async function l(){try{o.value=await z1()}catch(e){console.warn(`loadTools`,e),o.value={}}}}function n0(e){let{provider:t,$favKeys:n,$tools:r,onChanged:a}=e,o=T(!1),s=T(!1),c=T(!1),l=T(!1),u=T(null),d=T([]),f=E(()=>o.value&&s.value),p=E(()=>o.value&&!s.value&&l.value),m=E(()=>p.value&&u.value!==null),h=E(()=>c.value&&!s.value&&!l.value&&!!e0[t.providerType]),g=E(()=>s.value?`probing`:c.value&&l.value?`ok`:``),_=E(()=>g.value!==``);function v(e){return(u.value||{})[e]||``}function y(){o.value=!o.value}let b=null;async function x(e){s.value=!0,e?(b=e,l.value=e.authed,u.value=e.identity||null,e.authed&&(d.value=await H1(t.providerType))):l.value=!1,c.value=!0,s.value=!1}async function S(){s.value=!0;try{await x(await I1(t.providerType))}catch(e){console.warn(`probe`,t.providerType,e),await x(null)}}S();function C(e){e.stopPropagation();let n=e0[t.providerType];n({status:b,tool:r.value[t.providerType]||null,onConnected:w})}async function w(e){await x(e),l.value&&(o.value=!0)}async function D(e,t){let r=`${e.providerType}:${e.root}`;await fetch(t?`/api/favorites/add`:`/api/favorites/remove`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({providerType:e.providerType,root:e.root,label:e.root})});let o=new Set(n.value);t?o.add(r):o.delete(r),n.value=o,a&&a()}return B(`div`,{class:`add-favorite-provider`,id:`provider-${t.providerType}`,"data-provider":t.label},B(`div`,{class:`add-favorite-row`,id:`provider-row-${t.providerType}`,onclick:y},B(`span`,{class:E(()=>`add-favorite-caret ${o.value?`expanded`:``}`)},B(U,{name:`chevron-right`})),B(`span`,{class:`add-favorite-icon`},B(U,{name:t.icon})),B(`span`,{class:`add-favorite-label`},t.label),B(G,{when:h},B(`span`,{class:`add-favorite-config`,id:`provider-config-${t.providerType}`,onclick:C},B(U,{name:`settings-gear`}))),B(G,{when:_},B(`span`,{class:E(()=>`add-favorite-mark ${g.value}`),id:`provider-mark-${t.providerType}`}))),B(G,{when:f},B(`div`,{class:`add-favorite-checking`},B(`span`,{class:`add-favorite-spinner`}),B(`div`,{class:`add-favorite-checking-title`},`Looking for `,t.label,` credentials on this machine…`))),B(G,{when:m},B(`div`,{class:`add-favorite-identity`},B(`span`,{class:`add-favorite-identity-mark`},`✓`),B(`div`,null,B(`div`,{class:`add-favorite-identity-user`},`Connected as `,E(()=>v(`user`))),B(`div`,{class:`add-favorite-identity-note`},`Account `,E(()=>v(`account`)),` · via `,E(()=>v(`source`)))))),B(G,{when:p},B(H,{each:d,Empty:()=>B(`div`,{class:`add-favorite-status`},`No buckets found`)},function(e){return B(`label`,{class:`add-favorite-check-row`},B(`input`,{type:`checkbox`,id:`bucket-${e.providerType}-${e.root}`,checked:E(()=>n.value.has(`${e.providerType}:${e.root}`)),onchange:t=>D(e,t.currentTarget.checked)}),B(`span`,{class:`add-favorite-label`},e.root))})))}function r0(e){let{onChanged:t,$appMode:n}=e,r=T(!1),a=T([]);o();async function o(){let e=await Vt(),t=await tn();a.value=[...e,...t]}function s(e){e.stopPropagation(),r.value=!r.value}async function c(){let e=n.value!==`instant`;console.log(`[add-folder] pickFolder: start, appMode=`,n.value);try{if(e)await Bt(),r.value=!0,await o(),console.log(`[add-folder] pickFolder: folders now`,a.value.map(e=>e.root)),t&&t();else{console.log(`[add-folder] pickFolder: web -> showDirectoryPicker() ...`);let e=await window.showDirectoryPicker();console.log(`[add-folder] pickFolder: picked`,e&&e.name),e&&(await Jt(e),r.value=!0,await o(),console.log(`[add-folder] pickFolder: folders now`,a.value.map(e=>e.root)),t&&t())}}catch(e){console.error(`[add-folder] pickFolder: FAILED name=`,e&&e.name,`message=`,e&&e.message),console.error(`[add-folder] pickFolder: full error object ->`,e)}}async function l(e,n){e.handle?await Yt(e.handle,n):await Ht(e.root,n),await o(),t&&t()}function u(e,t){e.currentTarget.checked?l(t,!1):l(t,!0)}return B(`div`,{class:`add-favorite-provider`,id:`provider-local`},B(`div`,{class:`add-favorite-row`,id:`provider-row-local`},B(`span`,{class:E(()=>`add-favorite-caret ${r.value?`expanded`:``}`),id:`provider-toggle-local`,onclick:s},B(U,{name:`chevron-right`})),B(`span`,{class:`add-favorite-icon`},B(U,{name:`folder-opened`})),B(`span`,{class:`add-favorite-label`},`Local folder`),B(`span`,{class:`add-favorite-config`,id:`local-folder-add`,onclick:c},B(U,{name:`add`}))),B(H,{each:a,$expanded:r,Empty:()=>B(`div`,{class:`add-favorite-status`},`No local folders`)},function(e){return B(`label`,{class:`add-favorite-check-row`},B(`input`,{type:`checkbox`,id:`folder-${e.root}`,checked:!e.hidden,onchange:t=>u(t,e)}),B(`span`,{class:`add-favorite-label`},e.label||e.root))}))}function i0(){return{$query:T(``),$results:T([]),$searching:T(!1),$excludes:T(`node_modules, dist, .git, .venv, build`),$useIgnoreFile:T(!0),$cloudOpen:T(!1),$cloud:T([]),runId:0}}function a0(e){let t=[];for(let n of e)n.handle?t.push({kind:`local`,root:n.root||n.name,handle:n.handle}):n.providerType&&n.providerType!==`local`&&n.root&&t.push({kind:`backend`,providerType:n.providerType,root:n.root});return t}function o0(e){let t=new Map;for(let n of a0(e))t.set(n.root,n);let n=[];for(let e of ZJ()){let r=t.get(e.root);r&&n.push({root:e.root,path:e.path,name:e.name,score:0,source:r})}return n}var s0=null;function c0(e){clearTimeout(s0),s0=setTimeout(()=>l0(e),150)}async function l0(e){let{state:t,searchers:n,roots:r}=e,a=t.$query.value,o=t.runId+1;if(t.runId=o,a){t.$searching.value=!0;let e=new Map,s=[...vY(r),...yY(t,`cached`,!1)];for(let r of s)if(t.runId===o){let s=n=>p0(t,o,e,r,n);r.kind===`local`?(await n.ensureNameIndex({containerHandle:r.handle}),await n.search({containerHandle:r.handle,query:a,flags:`ig`,indexSearchOnly:!0,onIndexMatch:s,onContentMatch(){},onContentFirstMatch(){}})):await n.search({providerType:r.providerType,root:r.root,mode:`cached`,query:a,flags:`ig`,onIndexMatch:s,onContentMatch(){},onContentFirstMatch(){}})}t.runId===o&&(t.$searching.value=!1)}else t.$results.set(o0(r))}function u0(e,t){let n=e.toLowerCase();return t.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).every(e=>n.includes(e))}function d0(e,t){return t.split(`,`).map(e=>e.trim()).filter(Boolean).some(t=>e.includes(t))}function f0(e,t){let n=e.replace(/\.[^.]+$/,``);return n===t?3:n.toLowerCase()===t.toLowerCase()?2:+!!e.toLowerCase().startsWith(t.toLowerCase())}function p0(e,t,n,r,a){if(e.runId===t){let t=String(a.path).replace(/^\//,``),o=r.kind===`local`?`${r.root}/${t}`:t,s=o.indexOf(`/`),c=s>=0?o.slice(0,s):o,l=s>=0?o.slice(s+1):o,u=l.split(`/`).pop(),d=e.$query.value;if(u0(u,d)&&d0(o,e.$excludes.value)===!1){n.set(o,{root:c,path:l,name:u,score:a.score||0,source:r});let t=Array.from(n.values()).sort((e,t)=>{let n=f0(t.name,d)-f0(e.name,d);return n===0?t.score-e.score:n}).slice(0,50);e.$results.set(t)}}}function m0(e){let{searchers:t,$treeData:n,onPick:r}=e,a=i0();a.$results.set(o0(n.value));let o=T(0);A(()=>{let e=n?n.value:[];lY(a,e),mY(a)});let s=E(()=>V(U,{name:a.$cloudOpen.value?`chevron-down`:`chevron-right`,size:16})),c=E(()=>{let e=a.$cloud.value;return a.$cloudOpen.value?V(NY,{state:a,providers:e}):V(function(){return B(`span`,null)},{})});return pX(l,{clazz:`quick-open`});function l(e){let{close:t}=e;return B(`div`,{class:`quick-open-body`,onkeydown:l},B(`input`,{class:`quick-open-input`,placeholder:`Search files by name`,autofocus:!0,oninput:u}),B(`div`,{class:`search-extra quick-open-extra`,style:`margin-left: 7px`},B(`div`,{class:`search-label search-label-toggle`},B(`span`,{class:`search-remote-label`,onclick:d},B(`span`,{class:`search-chevron`,$dom:s}),B(`span`,null,`remote storage`))),B(`div`,{class:`search-cloud`,$dom:c})),B(`div`,{class:`quick-open-list slim_scrollbar`},B(H,{each:a.$results,Empty:()=>B(`div`,{class:`quick-open-empty`},`No matching files`)},function(e,t){return B(`div`,{class:E(()=>`quick-open-row ${o.value===t?`selected`:``}`),onclick:()=>n(e)},B(`span`,{class:`quick-open-name`},e.name),B(`span`,{class:`quick-open-path`},e.path))})));function n(e){t(),r(e)}function l(e){let t=a.$results.value;if(e.key===`ArrowDown`)e.preventDefault(),o.value=Math.min(o.value+1,t.length-1);else if(e.key===`ArrowUp`)e.preventDefault(),o.value=Math.max(o.value-1,0);else if(e.key===`Enter`){e.preventDefault();let r=t[o.value];r&&n(r)}}}function u(e){a.$query.value=e.currentTarget.value,o.value=0,c0({state:a,searchers:t,roots:n.value})}function d(){let e=a.$cloudOpen.value===!1;a.$cloudOpen.value=e,e&&mY(a)}}console.log({type:`tracer`});var h0=T(250),g0=T(Number(localStorage.getItem(`sideSplit`))||50);function _0(e){let t=Math.min(Math.max(e,10),90);g0.value=t,localStorage.setItem(`sideSplit`,t)}async function v0(e,t){localStorage.getItem(`mode`);let n=[`Object explorer`],r=T(0),a=T(`explorer`),o=T([]),s=T(``),c=T(0),l=j1();E(()=>{let e=r.value;return n[e]}),n.map((e,t)=>E(()=>r.value===t?``:`display: none;`));let u=T([AJ(`left`)]),d=E(()=>u.value.map(e=>T(``))),f=E(()=>(m.value,`slim_scrollbar side_panes`)),p=T(window.innerWidth<640),m=T(!1),h=T(!1);E(()=>`--width: ${p.value?`100%`:`calc(100% - ${h0.value}px)`}; --left: ${p.value?`0`:`${h0.value}px`}`),window.$left_slided=p;let{openObject:g,setDom:_,previewContent:v,refreshObject:y,api:b}=$J({$sides:u,$active_side:c,$treeData:o,searchers:l,onMissing:x});function x(e){e.path?N1({message:`"${e.name||e.path}" no longer exists on disk.`,confirmLabel:`Refresh`,onConfirm:()=>QX(e)}):N1({message:`The folder "${e.root}" no longer exists and will be removed from the workspace.`,confirmLabel:`Remove`,hideCancel:!0,onConfirm:async()=>{await Zt(e.root,e.providerType),await P(),await M()}})}let S=eY({$sides:u,$active_side:c,openObject:g}),{oncontextmenu:C,OnContextMenu:w}=jJ({$sides:u,$active_side:c,openObject:g,$treeData:o,setDom:_,refreshObject:y,reloadProviders:P,$appMode:s});function D(){let e=[];return u.value.forEach(t=>{t.$openedObjects.value.forEach(t=>e.push(t.name))}),e}function O(e){let t=u.value[c.value],n=V(UY,{searchers:l,state:e,getOpenPaths:D,$treeData:o}),r={name:`Search: ${e.$query.value}`,objectKind:`searchEditor`,path:``,ext:``};_({dom:n,object:r,icon:`search`,side:t,viewMode:`render`},t)}async function k(e,t){let n=u.value[c.value];if(n){let r=n.$activeObject.value,a=e.source.kind===`local`?`local`:e.source.providerType,o=e.path.split(`/`).pop();if(!(r&&(r.providerType??``)===a&&(r.root??``)===e.root&&(r.path??``)===e.path)){let t;if(e.source.kind===`local`){let n=await Qt(e.source.handle,e.path),r=await n.getFile();t={providerType:a,root:e.root,path:e.path,name:o,file:r,handle:n}}else t={providerType:a,root:e.root,path:e.path,name:o};await g(void 0,{object:t})}n.$gotoLine.value={root:e.root,path:e.path,line:t.lineNumber,column:t.column,ts:Date.now()}}else console.error(`side is undefined`)}function A(){m0({searchers:l,$treeData:o,onPick:j})}async function j(e){if(u.value[c.value]){let t=e.source.kind===`local`?`local`:e.source.providerType,n;if(e.source.kind===`local`){let r=await Qt(e.source.handle,e.path),a=await r.getFile();n={providerType:t,root:e.root,path:e.path,name:e.name,file:a,handle:r}}else n={providerType:t,root:e.root,path:e.path,name:e.name};await g(void 0,{object:n})}else console.error(`side is undefined`)}document.addEventListener(`drop`,()=>h.value=!1),document.addEventListener(`dragend`,()=>h.value=!1);async function M(){let e=new URLSearchParams(location.search).has(`graph`)?`graph`:void 0,t=S.parseUrl(),n=new Set(o.value.map(e=>`${e.providerType}/${e.root}`));for(let e of t.sides)e.items=e.items.filter(e=>n.has(`${e.providerType}/${e.root}`)),e.activeIndex=e.items.length-1;t.sides=t.sides.filter(e=>e.items.length>0);let r=S.buildSides(t);S.syncUrl();for(let t=0;t<r.length;t++){let n=r[t].$activeObject.value;n&&await N(n,t,e)}}async function N(e,t,n){if(console.log(`[explorer] openRestoredObject`,{providerType:e?.providerType,root:e?.root,path:e?.path,sideIndex:t,mode:n}),e.providerType===`local`)if(await rn(e)){async function r(r){let a=`local:${e.root}`,o=await tn();for(let t of o)if(t.name===a){let n=await Qt(t.handle,e.path);n?(e.name=n.name,n.kind===`directory`?e.handle=n:e.file=await n.getFile()):e.notFound=!0;break}g(void 0,{object:e,mode:n,sideIndex:t})}N1({message:n===`graph`?`Open Graph for ${e.root}/${e.name}`:`Open ${e.name}`,onConfirm:r})}else x(e);else g(void 0,{object:e,mode:n,sideIndex:t})}async function P(){let e=await LG(`/api/meta`,{},{}),t=e.favorites||[];s.value=e.appMode;let n=(await tn()).filter(e=>!e.hidden).map(e=>({...e,children:[],needRequestPermission:!0}));o.value=[...t,...n],console.log(`[add-folder] reloadProviders: backend=`,t.map(e=>e.root),`local=`,n.map(e=>e.root),`total tree=`,o.value.length)}function F(){s.value===`instant`?qt().then(P):t0({onAdded:P})}function I(e){let t=document.getElementById(`sides-container`).getBoundingClientRect();_0((e-t.left)/t.width*100)}fn(async()=>{await P(),M(),new URLSearchParams(location.search).has(`animate`)&&nY({itemToObject:S.itemToObject,openRestoredObject:N}),window.addEventListener(`popstate`,e=>{M(e.state?.path??location.pathname)}),window.addEventListener(`keydown`,e=>{(e.metaKey||e.ctrlKey)&&e.key===`p`&&(e.preventDefault(),A())}),window.addEventListener(`message`,e);function e(e){let{data:t}=e;if(t?.type===`iframe-pointdown`){let{sideName:e}=t;u.value.some((t,n)=>{if(t.name===e)return c.value=n,!1})}console.log(e)}});function ee(e){a.value=`search`,requestAnimationFrame(()=>{document.getElementById(`panel-search-input`).focus()})}return B(`div`,{id:`app`,class:`full flex monaco-workbench`,style:{overflow:`hidden`,"--left-sidebar-width":h0,"font-size":`14px`,"--1px":`${(1/window.devicePixelRatio).toString(2)}px`}},B(`aside`,{class:{sidebar:!0,$left_slided:p,$dragover:h},style:{height:`100%`},id:`sidebar`},B(`header`,{class:`sidebar-header active`,style:`display: flex; align-items: center;`},B(`span`,{style:`display: flex; gap: 0; align-items: center;`,class:E(()=>`tab-title ${a.value===`explorer`?`selected`:``}`),onclick:()=>a.value=`explorer`},B(`span`,{style:`display: inline-block; width: 1.2em; `},B(`img`,{src:Pr()+`img/64.png`,style:`width: 100%; top: 1px;`})),B(`span`,null,`xplorer`)),B(`span`,{class:E(()=>`tab-title ${a.value===`search`?`selected`:``}`),onclick:ee},`Search`),B(`span`,{style:`flex-grow: 1;`}),B(`span`,{onclick:F,id:`add-favorite`,class:`icon`,title:`Add favorite`},B(gt,null)),B(`span`,{onclick:()=>p.value=!1,class:`icon expand`},B(ht,null)),B(`span`,{style:`font-size: 1.2em;`,onclick:()=>p.value=!0,class:`icon collapse`},B(mt,null))),B(`div`,{class:f,style:`overflow-y: auto; overflow-x: clip`},B(`div`,{style:E(()=>a.value===`explorer`?``:`display: none`)},B($X,{$tree:o,openObject:g,refreshObject:y,OnContextMenu:w,api:b})),B(`div`,{style:E(()=>a.value===`search`?``:`display: none`)},B(HY,{searchers:l,openSearchEditor:O,openSearchHit:k,getOpenPaths:D,$treeData:o})))),B(WY,{elementId:`sidebar`,minWidth:150,maxWidth:500}),B(`div`,{id:`sides-container`,style:`display: flex; flex-grow: 1; min-width: 0;`},B(H,{each:u,incremental:!0},(e,t)=>{let n=d[t],r=E(()=>u.value.length-1===t),a=E(()=>u.value.length>1),o=E(()=>u.value.length>1?t===0?`${g0.value}%`:`${100-g0.value}%`:`100%`);return B(GX,{side:e,id:t,$active_side:c,$activeTab:n,$rightmost:r,$multiSide:a,$width:o,onDragSplit:I,setDom:_,previewContent:v,openObject:g,OnContextMenu:w,api:b,explorerState:S})})))}document.readyState===`loading`?add_event_listener(document,`DOMContentLoaded`,y0):y0().then(()=>{console.log(`ready`)});async function y0(){let e=document.getElementById(`app`);console.log({$app:e}),pt(await ft(v0,{app:e}),e)}
package/cli.js CHANGED
@@ -124,7 +124,7 @@ function openBrowser(target) {
124
124
  // A machine without xdg-open (a bare container, a CI runner) emits an unhandled 'error' event that
125
125
  // takes the whole server down with it. The server is running by now; the browser is a convenience.
126
126
  function launch(command, commandArgs) {
127
- const child = spawn(command, commandArgs, { stdio: "ignore", detached: true })
127
+ const child = spawn(command, commandArgs, { stdio: "ignore", detached: true, windowsHide: true })
128
128
  child.on("error", function (error) {
129
129
  console.log(`could not open a browser (${command}): ${error.message}`)
130
130
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knockdata/objectexplorer",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "The VSCode for Cloud Storage — Explore, Analyze, Search your cloud storage locally with single click",
5
5
  "type": "module",
6
6
  "license": "ISC",
@@ -35,4 +35,4 @@
35
35
  "engines": {
36
36
  "node": ">=20"
37
37
  }
38
- }
38
+ }