@zenovay/cli 0.1.68 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agency-BRTQMQko.js → agency-DHAyzKd-.js} +1 -1
- package/dist/ai-xhCcy02q.js +3 -0
- package/dist/alerts-Be0XKEUX.js +3 -0
- package/dist/analytical-screen-BU2yCSg_.js +2 -0
- package/dist/analytics-D7vhDrdG.js +2 -0
- package/dist/annotation-dveH657H.js +8 -0
- package/dist/{api-keys-BmmNLpjG.js → api-keys-DKQX5aL9.js} +1 -1
- package/dist/{api-v2-C6bvRBzw.js → api-v2-C7-5GPx8.js} +1 -1
- package/dist/api-v2-DqKh6FgZ.js +1 -0
- package/dist/{apply-B19bFTz0.js → apply-oUMOH7u2.js} +1 -1
- package/dist/{audit-D_NXQFBa.js → audit-DgHopH-O.js} +1 -1
- package/dist/bar-NfgovYHe.js +1 -0
- package/dist/bin.js +7 -6
- package/dist/chat-panel-PSN5hjlF.js +12 -0
- package/dist/commands-BE8-kQ9U.js +2 -0
- package/dist/companies-uScE2uHf.js +2 -0
- package/dist/{completions-D-Esx72b.js → completions-DKyjFPMK.js} +1 -1
- package/dist/csv-emit-C-9o-imN.js +1 -0
- package/dist/csv-emit-CmlDBfbA.js +1 -0
- package/dist/data-table-BhKjjiOS.js +1 -0
- package/dist/deploys-BqQmCzVb.js +2 -0
- package/dist/devices-CUgpkbAC.js +2 -0
- package/dist/{doctor-B_C_zJQh.js → doctor-D1bGGwtN.js} +1 -1
- package/dist/{domains-xWz-syku.js → domains-iRmYn9G7.js} +1 -1
- package/dist/{emit-NkY7PE3R.js → emit-D4YlMlzk.js} +2 -2
- package/dist/empty-state-D-krMX62.js +1 -0
- package/dist/errors-CEIyrEgF.js +2 -0
- package/dist/events-tail-CRgba_gO.js +5 -0
- package/dist/export-Csl7rWLW.js +4 -0
- package/dist/funnel-B36lGX2i.js +3 -0
- package/dist/geo-CPt2etQd.js +2 -0
- package/dist/globe-yy_-G4K8.js +2 -0
- package/dist/{goals-cNoELf2s.js → goals-BTzgvDOK.js} +1 -1
- package/dist/grid-CMwhs-Ms.js +1 -0
- package/dist/health-D26VB-iZ.js +2 -0
- package/dist/{health-CbaNXgdP.js → health-RsLcvYTb.js} +1 -1
- package/dist/heatmaps-D4o0Ghjn.js +1 -0
- package/dist/home-B8CoN9Hd.js +2 -0
- package/dist/init-BrxmKAnU.js +1 -0
- package/dist/init-Cee2-8Kd.js +105 -0
- package/dist/insights-B0L6kIxY.js +1 -0
- package/dist/{integrations-m8rSzn3o.js → integrations-CJ9Pa-II.js} +1 -1
- package/dist/journeys--jjaTA3C.js +1 -0
- package/dist/keybar-DO5OoZy9.js +1 -0
- package/dist/keybar-deep-link-B4VJn2ko.js +1 -0
- package/dist/live-CuVd6yRs.js +1 -0
- package/dist/login-CsQ7fPVu.js +2 -0
- package/dist/login-DeznxBjS.js +1 -0
- package/dist/logout-C3KOOdIM.js +2 -0
- package/dist/metric-card-C4iqxdww.js +1 -0
- package/dist/{notes-IHtGD1hp.js → notes-jV1DYMp_.js} +1 -1
- package/dist/pages-0DLiuGYc.js +2 -0
- package/dist/panel-CTtQ2ue6.js +1 -0
- package/dist/{plans-BjApr8oD.js → plans-D4o6-tbv.js} +1 -1
- package/dist/{profile-u9G8Sxdv.js → profile-Cm5RFs_L.js} +1 -1
- package/dist/{progress-row-5ns2IsFh.js → progress-row-Afnt5Ng8.js} +1 -1
- package/dist/projects-BTTgnjOZ.js +2 -0
- package/dist/{prompt-CJw_Mqo2.js → prompt-BXvg2B4R.js} +1 -1
- package/dist/query-yn10M321.js +8 -0
- package/dist/range-tabs-BbJdVWNV.js +1 -0
- package/dist/resolve-site-BLrtFOyW.js +2 -0
- package/dist/retention-DpBuavgY.js +1 -0
- package/dist/revenue-Bv1Cqzjr.js +2 -0
- package/dist/secrets-c-NB_plk.js +1 -0
- package/dist/{self-test-QdQWJ7tK.js → self-test-Cml0QXeA.js} +3 -3
- package/dist/sessions-B0RwtHvP.js +1 -0
- package/dist/{settings-HSntEG-D.js → settings-i4TqMmAY.js} +1 -1
- package/dist/{share-CQwuZtgh.js → share-DTHFqTzp.js} +2 -2
- package/dist/site-switcher-D_JBKFaR.js +1 -0
- package/dist/sources-B39BFFKF.js +2 -0
- package/dist/stats-Dh9MQAXx.js +2 -0
- package/dist/{status-agent-C2-h8fKK.js → status-agent-C3q7fOEs.js} +1 -1
- package/dist/{team-_SMC_yFx.js → team-DZtvClMF.js} +1 -1
- package/dist/{teams-C_eV1rXM.js → teams-CqJFecKB.js} +1 -1
- package/dist/{telemetry-BwXO7Z83.js → telemetry-BdWnMaJC.js} +1 -1
- package/dist/telemetry-C1045t6Q.js +1 -0
- package/dist/{telemetry-BJbpxgIp.js → telemetry-DRh10SvO.js} +1 -1
- package/dist/themes-6H0KlK3b.js +4 -0
- package/dist/tour-fOYY-mK0.js +8 -0
- package/dist/update-CoZzBsMu.js +1 -0
- package/dist/uptime-Ck1GdjRR.js +1 -0
- package/dist/{usage-beKJ1HbM.js → usage-BN_mEsal.js} +1 -1
- package/dist/{use-DbUqNyZk.js → use-NGqXzASp.js} +2 -2
- package/dist/use-fullscreen-ucSyZkjO.js +1 -0
- package/dist/visitors-BCz-O9rK.js +2 -0
- package/dist/vitals-Dx_eY6tW.js +2 -0
- package/dist/watch-CP-Klikt.js +1 -0
- package/dist/{webhooks-CFtGBoJm.js → webhooks-BR1D3o5S.js} +1 -1
- package/dist/webhooks-forward-CpXm4GHn.js +2 -0
- package/dist/wizard-bin.js +1 -1
- package/dist/wrapper-Dl9i0Nh7.js +6 -0
- package/dist/ws-client-MoEdfqAO.js +1 -0
- package/package.json +9 -7
- package/dist/ai-RVuD47iX.js +0 -1
- package/dist/alerts-B65b9jWl.js +0 -3
- package/dist/analytical-screen-DM7SBY5U.js +0 -2
- package/dist/analytics-CBP38R6T.js +0 -2
- package/dist/annotation-CdqECkB6.js +0 -8
- package/dist/api-v2-C82L-ZOL.js +0 -1
- package/dist/banner-DdgwXGzt.js +0 -1
- package/dist/bar-C1Zrfe9H.js +0 -1
- package/dist/chat-panel-DS-FxXoL.js +0 -7
- package/dist/commands-BJQxwCUl.js +0 -2
- package/dist/companies-DNay1Xrh.js +0 -2
- package/dist/csv-emit-BWWv60mT.js +0 -1
- package/dist/csv-emit-CVO5kebZ.js +0 -1
- package/dist/data-table-DJzT7bAr.js +0 -1
- package/dist/deploys-BnByoalt.js +0 -2
- package/dist/devices-Di7NUUmM.js +0 -2
- package/dist/empty-state-DbToIL5T.js +0 -1
- package/dist/errors-DhQE6fJQ.js +0 -2
- package/dist/events-tail-CSHCH77I.js +0 -5
- package/dist/export-CmypMMjU.js +0 -4
- package/dist/funnel-DwBZVMGB.js +0 -3
- package/dist/geo-hKUpyWuw.js +0 -2
- package/dist/globe-8qdyNUN-.js +0 -2
- package/dist/health-BJwKEdIp.js +0 -2
- package/dist/heatmaps-SCfq5M8H.js +0 -1
- package/dist/home-DAEqaTOD.js +0 -2
- package/dist/init-C7zAAhfS.js +0 -79
- package/dist/init-DOrkLxxe.js +0 -1
- package/dist/insights-Bshy_7Ln.js +0 -1
- package/dist/journeys-DZvlQiCz.js +0 -1
- package/dist/keybar-QgnmSion.js +0 -1
- package/dist/keybar-deep-link-DbmPjAEz.js +0 -1
- package/dist/live-3YVbBo2f.js +0 -1
- package/dist/login-COMo5KUL.js +0 -2
- package/dist/login-W7wIGtyL.js +0 -1
- package/dist/logout-D89CET3S.js +0 -2
- package/dist/metric-card-bQ-j_G6l.js +0 -1
- package/dist/pages-BD1BmfgN.js +0 -2
- package/dist/panel-B-XxdP-N.js +0 -1
- package/dist/projects-DK9ZO7qd.js +0 -2
- package/dist/query-BhtiMkwf.js +0 -8
- package/dist/resolve-site-GDYx0__E.js +0 -2
- package/dist/retention-BA59Mo79.js +0 -1
- package/dist/revenue-vHyW8Ypm.js +0 -2
- package/dist/secrets-BBaEWu03.js +0 -1
- package/dist/sessions-DN4j8OEV.js +0 -1
- package/dist/sources-CSFQi-V7.js +0 -2
- package/dist/stats-DCzM0MeA.js +0 -2
- package/dist/telemetry-CZhEbFqI.js +0 -1
- package/dist/themes-D5A3e_mg.js +0 -4
- package/dist/tour-STZ66G7K.js +0 -8
- package/dist/update-DoOjZZNm.js +0 -1
- package/dist/uptime-Da9_QYPm.js +0 -1
- package/dist/visitors-CJ2FfgSL.js +0 -2
- package/dist/vitals-Cczahuhy.js +0 -2
- package/dist/watch-6c4jbLbR.js +0 -1
- package/dist/webhooks-forward-D-erVn8S.js +0 -3
- package/dist/ws-client-BZMMGeRe.js +0 -1
- /package/dist/{client-I4GTcUcm.js → client-ntsEXSVC.js} +0 -0
- /package/dist/{confirm-CIdxMt7N.js → confirm-DS5wux0g.js} +0 -0
- /package/dist/{examples-CFatZcPz.js → examples-DikBW-H2.js} +0 -0
- /package/dist/{formatter-DDG2TSOz.js → formatter-C4YSOKuq.js} +0 -0
- /package/dist/{open-url-CTfSApWl.js → open-url-BtI5aLgL.js} +0 -0
- /package/dist/{secrets-DzueUVGL.js → secrets-ApB7yh2A.js} +0 -0
- /package/dist/{theme-BuGrQHax.js → theme-Brz9wK0w.js} +0 -0
- /package/dist/{tier-C4q8fJ8m.js → tier-BneaO4vD.js} +0 -0
- /package/dist/{ui-whccLLRv.js → ui-C5Te-OTJ.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./formatter-C4YSOKuq.js";import{toCsv as e,writeCsv as t}from"./csv-emit-C-9o-imN.js";export{t as writeCsv};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{usePanelWidth as e,useTheme as t}from"./panel-CTtQ2ue6.js";import{Box as n,Text as r}from"ink";import i from"react";import a from"string-width";function o(){let e=process.stdout.columns;return typeof e==`number`&&e>0?e:80}function s(e,t){let n=[...e],r=n.reduce((e,t)=>e+t,0),i=1e5;for(;r>t&&i-- >0;){let e=-1,t=3;for(let r=0;r<n.length;r++)(n[r]??0)>t&&(t=n[r]??0,e=r);if(e===-1)break;n[e]=(n[e]??0)-1,--r}return n}function c(e,t){if(a(e)<=t)return e;if(t<=1)return e.slice(0,Math.max(0,t));let n=``,r=0;for(let i of e){let e=a(i);if(r+e>t-1)break;n+=i,r+=e}return`${n}…`}function l(e,t,n){let r=a(e);if(r>=t)return c(e,t);let i=t-r;return n===`right`?` `.repeat(i)+e:e+` `.repeat(i)}function u(e){return e.label??e.header??``}function d(e,t){return e.map(e=>{if(typeof e.width==`number`&&e.width>0)return e.width;let n=a(u(e));for(let r of t){let t=r[e.key],i=e.format?e.format(t,r):String(t??``),o=a(i);o>n&&(n=o)}return Math.max(3,n)})}function f({columns:c,data:f,zebra:p=!1,headerStyle:m=`plain`,maxWidth:h}){let{theme:g}=t(),_=e(),v=d(c,f),y=c.length*3+1,b=Math.min(h??_??o(),o()),x=Math.max(c.length*3,b-y),S=s(v,x),C=Math.min(S.reduce((e,t)=>e+t,0)+y,Math.max(8,b)),w=(e,t,n)=>{let r=e;return S.forEach((e,i)=>{r+=`─`.repeat(e+2),r+=i===S.length-1?n:t}),r},T=w(`╭`,`┬`,`╮`),E=w(`├`,`┼`,`┤`),D=w(`╰`,`┴`,`╯`),O=c.map((e,t)=>l(u(e),S[t]??a(u(e)),e.align??`left`)).join(` │ `),k=m===`accent`,A=k?g.accent:g.dim,j=k?O:O.toUpperCase();return i.createElement(n,{flexDirection:`column`,width:C},i.createElement(r,{color:g.border,wrap:`truncate`},T),i.createElement(n,{flexDirection:`row`},i.createElement(r,{color:g.border},`│ `),i.createElement(r,{color:A,bold:k,wrap:`truncate`},j),i.createElement(r,{color:g.border},` │`)),i.createElement(r,{color:g.border,wrap:`truncate`},E),f.map((e,t)=>{let o=p&&t%2==1,s=o?g.muted:g.fg,u=c.map((t,n)=>{let r=e[t.key],i=t.format?t.format(r,e):String(r??``);return l(i,S[n]??a(i),t.align??`left`)}).join(` │ `);return i.createElement(n,{key:t,flexDirection:`row`},i.createElement(r,{color:g.border},`│ `),i.createElement(r,{color:s,wrap:`truncate`},u),i.createElement(r,{color:g.border},` │`))}),i.createElement(r,{color:g.border,wrap:`truncate`},D))}export{f as DataTable};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as a}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-PSN5hjlF.js";import{resolveSiteId as o}from"./resolve-site-BLrtFOyW.js";import{DataTable as s}from"./data-table-BhKjjiOS.js";import{EmptyState as c}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as l}from"./analytical-screen-BU2yCSg_.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}async function m(a){if(a.connect){let t=await e(),n=t.apiBase.replace(`api.zenovay.com`,`app.zenovay.com`),r=`${n}/settings/integrations/github`;return process.stdout.write(`\n Connect GitHub to Zenovay:\n ${r}\n\n Open this URL in your browser. Zenovay re-uses the same GitHub\n OAuth app you already authorized for login (auth-zenovay), so\n no separate "Zenovay Deploys" app is needed. Pick the repos you\n want to track and deploys will appear here automatically.\n\n`),0}let s=await e(),c=await t({strict:!1}),u=new n({config:s,cliVersion:a.cliVersion,token:c}),d,m;try{({siteId:d,site:m}=await o(u,{explicit:a.siteId,headless:!!(a.json||a.csv||a.tsv||a.ndjson),cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let _=i(a),v=a.limit??50,y=m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??d,b=[{key:`pushed_at`,label:`when`,width:6,format:e=>p(String(e))},{key:`branch`,label:`branch`,width:14,format:e=>String(e??`—`).slice(0,14)},{key:`commit_sha`,label:`commit`,width:9,format:e=>String(e).slice(0,8)},{key:`commit_author`,label:`author`,width:16,format:e=>String(e??`—`).slice(0,16)},{key:`commit_message`,label:`message`,width:40,format:e=>String(e??`—`).slice(0,40)},{key:`show_on_chart`,label:`chart`,width:5,format:e=>e?`●`:`○`}];return l({cliVersion:a.cliVersion,title:`deploys · ${y}`,commandName:`deploys`,ai:{api:u,siteId:d,siteLabel:y},authToken:c?.accessToken??null,refreshIntervalMs:0,fetcher:e=>u.getDeploys(d,{branch:a.branch,since:a.since,limit:v},e),format:_,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let t of e.deploys)process.stdout.write(JSON.stringify(t)+`
|
|
2
|
+
`);else process.stdout.write(JSON.stringify(e,null,2));return}process.stdout.write(r(e.deploys,[`pushed_at`,`branch`,`commit_sha`,`commit_author`,`commit_message`,`repository`,`commit_url`,`show_on_chart`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>f.createElement(h,{data:e,branch:a.branch})},{id:`list`,title:`Recent`,render:e=>f.createElement(g,{data:e,columns:b})}]})}const h=({data:e,branch:t})=>{let{theme:n}=a(),r=e.deploys.filter(e=>e.show_on_chart).length,i=new Set(e.deploys.map(e=>e.repository).filter(e=>!!e));return f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{bold:!0},e.total),f.createElement(d,{color:n.muted},` commits`,t?` · branch=${t}`:``)),f.createElement(d,{color:n.muted},f.createElement(d,{color:n.accent},`● `,r,` on chart`),f.createElement(d,null,` · `),f.createElement(d,null,i.size,` `,i.size===1?`repo`:`repos`)))},g=({data:e,columns:t})=>e.deploys.length===0?f.createElement(c,{reason:`no-data`,headline:`No deploys yet`,hint:"Run `zenovay deploys --connect` to wire up the GitHub integration."}):f.createElement(s,{data:e.deploys.slice(0,30),columns:t,headerStyle:`accent`});export{m as deploysCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as l}from"./keybar-DO5OoZy9.js";import{resolveSiteId as u}from"./resolve-site-BLrtFOyW.js";import{DataTable as d}from"./data-table-BhKjjiOS.js";import{EmptyState as f}from"./empty-state-D-krMX62.js";import{ResponsiveGrid as p}from"./grid-CMwhs-Ms.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{RangeTabs as g,rangeForKey as _}from"./range-tabs-BbJdVWNV.js";import{useSiteSwitcher as v}from"./site-switcher-D_JBKFaR.js";import{Box as y,Text as b,render as x,useApp as S,useInput as C}from"ink";import w,{useEffect as T,useState as E}from"react";import D from"ink-spinner";async function O(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),l,d;try{({siteId:l,site:d}=await u(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??l;if(i(a)){let e=await c.getDevices(l);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-CmlDBfbA.js`);return t(e.devices,[`name`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.devices)process.stdout.write(JSON.stringify(t)+`
|
|
2
|
+
`);return 0}return r({type:`devices.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=x(w.createElement(k,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const k=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:u}=S(),{theme:x}=c(),[O,k]=E(null),[A,j]=E(!0),[M,N]=E(null),[P,F]=E(`24h`),[I,L]=E(t),[R,z]=E(n),B=v(e,I,e=>{L(e.id),z(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),k(null)});C((e,t)=>{if(B.open){(t.escape||e===`s`)&&B.close();return}if(e===`o`||e===`O`){a(m(`devices`,{siteId:I}));return}if(e===`s`){B.toggle();return}let n=_(e);if(n){F(n);return}e===`q`&&(u(),i(0))}),T(()=>{let t=!1;return O===null&&j(!0),(async()=>{try{let n=await e.getDevices(I,P);t||(k(n),j(!1))}catch(e){t||(N(e.message),j(!1))}})(),()=>{t=!0}},[e,I,P]);let V=`devices · ${R} · ${P}`;if(A)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(s,{title:`Loading`,state:`busy`},w.createElement(y,null,w.createElement(b,{color:x.accent},w.createElement(D,{type:`dots`})),w.createElement(b,null,` Fetching breakdown…`))));if(M)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`error`,headline:`Failed to load`,hint:M}));let H=!O||O.devices.length===0&&O.browsers.length===0&&O.os.length===0;if(H)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`no-data`,headline:`No data in this window`,hint:`Press 1-4 to widen the range, [s] to switch site, or visit your site to send an event`}),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`q`,label:`quit`}],active:`s`}));let U=[{key:`name`,label:`name`,width:16},{key:`visitors`,label:`visitors`,align:`right`,width:8}],W=process.stdout.columns??80,G=[{key:`devices`,title:`Devices`,render:()=>O.devices.length===0?w.createElement(f,{reason:`no-data`,headline:`No devices yet`}):w.createElement(d,{columns:U,data:O.devices,zebra:!0})},{key:`browsers`,title:`Browsers`,render:()=>O.browsers.length===0?w.createElement(f,{reason:`no-data`,headline:`No browsers yet`}):w.createElement(d,{columns:U,data:O.browsers,zebra:!0})},{key:`os`,title:`OS`,render:()=>O.os.length===0?w.createElement(f,{reason:`no-data`,headline:`No OS data yet`}):w.createElement(d,{columns:U,data:O.os,zebra:!0})}];return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(y,{marginTop:1},w.createElement(p,{totalWidth:W,panels:G,minColWidth:26,maxCols:3,gap:2})),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}],active:`o`}))};export{O as devicesCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-hWp9s3Y8.js";import{readToken as n}from"./token-store-BQuGH0z2.js";import"./formatter-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-hWp9s3Y8.js";import{readToken as n}from"./token-store-BQuGH0z2.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{parseSseStream as a}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import{detectInstallPaths as o,remediationHint as s,runHealthChecks as c}from"./health-D26VB-iZ.js";import{join as l}from"node:path";import{homedir as u,platform as d}from"node:os";import{stat as f}from"node:fs/promises";async function p(){let e=u(),t=d()===`darwin`,n=[{name:`Claude Code`,path:l(e,`.claude`)},{name:`Cursor`,path:t?l(e,`Library`,`Application Support`,`Cursor`):l(e,`.config`,`Cursor`)},{name:`Windsurf`,path:t?l(e,`Library`,`Application Support`,`Windsurf`):l(e,`.config`,`Windsurf`)},{name:`VS Code`,path:l(e,`.vscode`)}];return Promise.all(n.map(async e=>{try{return await f(e.path),{name:e.name,installed:!0,configPath:e.path}}catch{return{name:e.name,installed:!1}}}))}async function m(l){let u=await c({cliVersion:l.cliVersion,binaryPath:l.binaryPath}),d=await p();if(i(l))process.stdout.write(`${JSON.stringify({type:`doctor.agents`,agents:d})}\n`);else{process.stdout.write(`
|
|
2
2
|
AI Agents:
|
|
3
3
|
`);for(let e of d){let t=e.installed?`\x1B[32m✔\x1B[0m`:`\x1B[2m✗\x1B[0m`,n=e.installed&&e.configPath?` \x1b[2m${e.configPath}\x1b[0m`:``;process.stdout.write(` ${t} ${e.name}${n}\n`)}process.stdout.write(`
|
|
4
4
|
`)}let f=o(`zenovay`);if(f.paths.length>=2){let e=s(f,l.binaryPath);i(l)?process.stdout.write(`${JSON.stringify({type:`doctor.dual_binary`,info:f,hint:e})}\n`):(process.stdout.write(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-DqKh6FgZ.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-D4YlMlzk.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{resolveSiteId as c}from"./resolve-site-BLrtFOyW.js";import{fmtNumber as l,formatTable as u,shortId as d}from"./fmt-xxIPQJX-.js";async function f(i){let o=await e(),f=await t({strict:!1});if(!f)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let p=new r({config:o,cliVersion:i.cliVersion,token:f}),m;try{({siteId:m}=await c(p,{explicit:void 0,headless:!0,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let h;try{h=await p.getProjects(m)}catch(e){return n(e,{command:`domains list`})}let g=h.projects??[];if(i.json)return a(s(g,`domains.list`),{legacyKey:`domains`,legacyValue:g}),0;if(g.length===0)return process.stdout.write(`
|
|
2
2
|
No domains tracked yet — add one with \`zenovay domains add <url>\`.
|
|
3
3
|
|
|
4
4
|
`),0;let _=[{key:`isCurrent`,header:``,width:1,format:e=>e?`*`:` `},{key:`name`,header:`name`,width:18,format:e=>String(e??`—`)},{key:`domain`,header:`domain`,width:28,format:e=>String(e??`—`)},{key:`tier`,header:`tier`,width:6,format:e=>String(e??`—`)},{key:`pageviews24h`,header:`24h pv`,width:8,align:`right`,format:e=>l(Number(e??0))},{key:`id`,header:`id`,width:14,format:e=>d(String(e))}];return process.stdout.write(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{formatEvent as e,formatTabular as t}from"./formatter-
|
|
2
|
-
`)}export{a as emit,d as emitEnvelope,i as isHeadless,u as wrapItem,l as wrapList,c as wrapSnapshot};
|
|
1
|
+
import{formatEvent as e,formatTabular as t}from"./formatter-C4YSOKuq.js";function n(e){return typeof e==`object`&&!!e&&Array.isArray(e._columns)&&Array.isArray(e._rows)}function r(){let e=process.argv;for(let t=0;t<e.length;t++){let n=e[t];if(n){if(n===`--json`)return`json`;if(n===`--csv`)return`csv`;if(n===`--tsv`)return`tsv`;if(n===`--ndjson`)return`ndjson`;if(n===`--format`&&t+1<e.length){let n=(e[t+1]??``).toLowerCase();if(n===`json`||n===`csv`||n===`tsv`||n===`ndjson`)return n}if(n.startsWith(`--format=`)){let e=n.slice(9).toLowerCase();if(e===`json`||e===`csv`||e===`tsv`||e===`ndjson`)return e}}}let t=(process.env.ZENOVAY_FORMAT??``).toLowerCase();return t===`json`||t===`csv`||t===`tsv`||t===`ndjson`?t:`ndjson`}function i(e={}){if(e.json||e.csv||e.tsv||e.ndjson||!process.stdout.isTTY||process.env.CI===`true`||process.env.CI===`1`||process.env.NO_COLOR!=null&&process.env.NO_COLOR!==``)return!0;let t=(process.env.ZENOVAY_FORMAT??``).toLowerCase();return t===`json`||t===`ndjson`||t===`csv`||t===`tsv`}function a(i){let a=r();if(n(i)){process.stdout.write(t(i._rows,i._columns,a));return}if(a===`ndjson`){let e={ts:new Date().toISOString(),...i};process.stdout.write(`${JSON.stringify(e)}\n`);return}process.stdout.write(e({ts:new Date().toISOString(),...i},a))}function o(){let e=process.env.ZENOVAY_CLI_VERSION??`0`,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`)),n=t.join(` `)||`unknown`;return{cliVersion:e,command:n}}function s(e){let t=o(),n={cliVersion:e?.cliVersion??t.cliVersion,command:e?.command??t.command};return e?.siteId&&(n.siteId=e.siteId),e?.teamId&&(n.teamId=e.teamId),e?.cached!==void 0&&(n.cached=e.cached),n}function c(e,t,n){return{type:t,ts:new Date().toISOString(),data:e,meta:s(n)}}function l(e,t,n){return{type:t,ts:new Date().toISOString(),data:{items:e,total:e.length},meta:s(n)}}function u(e,t,n){return{type:t,ts:new Date().toISOString(),data:e,meta:s(n)}}function d(e,t){let n={...e};t?.legacyKey&&(n[t.legacyKey]=t.legacyValue,process.env.ZENOVAY_DEPRECATION_WARN===`1`&&process.stderr.write(`[deprecation] '${t.legacyKey}' top-level key is going away in 0.1.40. Read \`data.items\` instead.\n`)),process.stdout.write(JSON.stringify(n)+`
|
|
2
|
+
`)}export{a as emit$1,d as emitEnvelope,i as isHeadless,u as wrapItem,l as wrapList,c as wrapSnapshot};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useTheme as e}from"./panel-CTtQ2ue6.js";import{Box as t,Text as n}from"ink";import r from"react";const i={"no-data":`○`,"tier-gated":`◆`,error:`✗`},a=`https://app.zenovay.com/billing`;function o({headline:o,hint:s,reason:c=`no-data`,cta:l,width:u}){let{theme:d}=e(),f=i[c],p=c===`error`?d.error:c===`tier-gated`?d.accent:d.muted,m=l??(c===`tier-gated`?`Upgrade → ${a}`:void 0);return r.createElement(t,{flexDirection:`column`,alignItems:`center`,width:u},r.createElement(n,{color:p,bold:!0},f),r.createElement(n,{color:d.typography.title.color,bold:d.typography.title.bold},o),s?r.createElement(n,{color:d.dim},s):null,m?r.createElement(n,{color:d.accent},m):null)}export{o as EmptyState};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{spark as s}from"./sparkline-CpoBjjlc.js";import"./chat-panel-PSN5hjlF.js";import{resolveSiteId as c}from"./resolve-site-BLrtFOyW.js";import{DataTable as l}from"./data-table-BhKjjiOS.js";import{EmptyState as u}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-BU2yCSg_.js";import"./ui-C5Te-OTJ.js";import{Box as p,Text as m}from"ink";import h from"react";function g(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}function _(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}const v=({filtered:e,window:t})=>{let{theme:n}=o(),r=new Map,i=Date.now(),a=60;for(let t of e){let e=new Date(t.ts).getTime(),n=Math.floor((i-e)/(60*1e3));if(n<0||n>=a)continue;let o=r.get(t.class)??Array(a).fill(0),s=a-1-n;o[s]+=1,r.set(t.class,o)}let c=[...r.entries()].sort((e,t)=>t[1].reduce((e,t)=>e+t,0)-e[1].reduce((e,t)=>e+t,0)).slice(0,6);return h.createElement(p,{flexDirection:`column`},h.createElement(m,null,h.createElement(m,{bold:!0},e.length),h.createElement(m,{color:n.muted},` errors in `,t)),c.length===0?null:h.createElement(p,{flexDirection:`column`,marginTop:1},c.map(([e,t])=>h.createElement(p,{key:e,flexDirection:`row`},h.createElement(p,{width:20,marginRight:1,flexShrink:0},h.createElement(m,{wrap:`truncate`},e)),h.createElement(m,{color:n.accent},s(t,30))))))},y=({filtered:e,search:t,columns:n})=>e.length===0?t?h.createElement(u,{reason:`no-data`,headline:`No matching errors`,hint:`Nothing matched "${t}" in this window — clear the filter or widen the range.`}):h.createElement(u,{reason:`no-data`,headline:`No errors in window`,hint:`No errors recorded for this site — widen the range with the time tabs above.`}):h.createElement(l,{data:e.slice(0,30),columns:n,headerStyle:`accent`});async function b(o){let s=await e(),l=await t({strict:!1}),u=new n({config:s,cliVersion:o.cliVersion,token:l}),p,m;try{({siteId:p,site:m}=await c(u,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let b=i(o),x=o.window??`24h`,S=o.limit??100,C=[{key:`ts`,label:`when`,width:6,format:e=>_(String(e))},{key:`class`,label:`class`,width:18,format:e=>String(e)},{key:`message`,label:`message`,width:42,format:e=>g(String(e??``),42)},{key:`page`,label:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:8,format:e=>String(e??`—`)}];return f({cliVersion:o.cliVersion,title:`errors · ${m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p}`,commandName:`errors`,ranges:!0,ai:{api:u,siteId:p,siteLabel:m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?3e4:0,fetcher:(e,t)=>u.getErrors(p,{window:t??x,limit:S},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`errors`,{siteId:p}))}}},headlessEmit:(e,t)=>{let n=o.search?e.errors.filter(e=>e.class.toLowerCase().includes(o.search.toLowerCase())||e.message.toLowerCase().includes(o.search.toLowerCase())):e.errors;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of n)process.stdout.write(JSON.stringify(e)+`
|
|
2
|
+
`);else process.stdout.write(JSON.stringify({errors:n,total:n.length},null,2));return}process.stdout.write(r(n,[`ts`,`class`,`message`,`page`,`device`,`fingerprint`],t))},panels:[{id:`summary`,title:`Recent errors`,render:e=>{let t=o.search?e.errors.filter(e=>e.class.toLowerCase().includes(o.search.toLowerCase())||e.message.toLowerCase().includes(o.search.toLowerCase())):e.errors;return h.createElement(v,{filtered:t,window:x})}},{id:`table`,title:`Detail`,render:e=>{let t=o.search?e.errors.filter(e=>e.class.toLowerCase().includes(o.search.toLowerCase())||e.message.toLowerCase().includes(o.search.toLowerCase())):e.errors;return h.createElement(y,{filtered:t,search:o.search,columns:C})}}]})}export{b as errorsCommand};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import{ApiClient as n}from"./api-hWp9s3Y8.js";import{readToken as r}from"./token-store-BQuGH0z2.js";import"./formatter-C4YSOKuq.js";import{isHeadless as i}from"./emit-D4YlMlzk.js";import{parseSseStream as a}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import{TextInput as l}from"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{stripUrlPrefix as d}from"./fmt-xxIPQJX-.js";import{DataTable as f}from"./data-table-BhKjjiOS.js";import{EmptyState as p}from"./empty-state-D-krMX62.js";import{useFullscreen as m}from"./use-fullscreen-ucSyZkjO.js";import h from"node:path";import{promises as g}from"node:fs";import _ from"node:os";import v from"node:crypto";import{Box as y,Text as b,render as x,useApp as S,useInput as ee}from"ink";import C,{useEffect as w,useRef as T,useState as E}from"react";const D=new Set([`type`,`page`,`country`,`device`,`user_id`,`sessionId`,`referrer`,`ts`,`url`,`method`,`status`]);function O(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(/\s/.test(r)){n+=1;continue}if(r===`(`){t.push({kind:`lparen`}),n+=1;continue}if(r===`)`){t.push({kind:`rparen`}),n+=1;continue}if(r===`"`||r===`'`){let i=r,a=n+1,o=``;for(;a<e.length&&e[a]!==i;)e[a]===`\\`&&a+1<e.length?(o+=e[a+1],a+=2):(o+=e[a],a+=1);if(a>=e.length)throw Error(`filter: unterminated string starting at column ${n+1}`);t.push({kind:`string`,value:o}),n=a+1;continue}if(r===`!`&&e[n+1]===`=`){t.push({kind:`op`,value:`!=`}),n+=2;continue}if(r===`!`&&e[n+1]===`~`){t.push({kind:`op`,value:`!~`}),n+=2;continue}if(r===`=`){t.push({kind:`op`,value:`=`}),n+=1;continue}if(r===`~`){t.push({kind:`op`,value:`~`}),n+=1;continue}let i=n;for(;n<e.length&&!/[\s()=!~]/.test(e[n])&&e[n]!==`"`&&e[n]!==`'`;)n+=1;let a=e.slice(i,n);if(a.length===0)throw Error(`filter: unexpected character at column ${i+1}`);let o=a.toUpperCase();o===`AND`?t.push({kind:`and`}):o===`OR`?t.push({kind:`or`}):t.push({kind:`ident`,value:a})}return t}function k(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function A(e,t,n){let r=e==null?``:String(e);switch(t){case`=`:return r===n;case`!=`:return r!==n;case`~`:{let e=new RegExp(k(n),`i`);return e.test(r)}case`!~`:{let e=new RegExp(k(n),`i`);return!e.test(r)}}}function j(e){return e.tokens[e.pos]}function M(e){let t=e.tokens[e.pos];return e.pos+=1,t}function N(e){let t=j(e);if(!t)throw Error(`filter: unexpected end of expression`);if(t.kind===`lparen`){M(e);let t=P(e),n=M(e);if(!n||n.kind!==`rparen`)throw Error(`filter: missing closing ")"`);return t}if(t.kind!==`ident`)throw Error(`filter: expected key, got ${t.kind}`);M(e);let n=t.value;if(!D.has(n))throw Error(`filter: unknown key "${n}". Allowed: ${[...D].join(`, `)}`);let r=M(e);if(!r||r.kind!==`op`)throw Error(`filter: expected operator after "${n}"`);let i=M(e);if(!i||i.kind!==`ident`&&i.kind!==`string`)throw Error(`filter: expected value after operator "${r.value}"`);let a=r.value,o=i.value;return e=>A(e[n],a,o)}function P(e){let t=N(e);for(;;){let n=j(e);if(!n)break;if(n.kind===`and`){M(e);let n=N(e),r=t;t=e=>r(e)&&n(e);continue}if(n.kind===`or`){M(e);let n=N(e),r=t;t=e=>r(e)||n(e);continue}break}return t}function F(e){if(typeof e!=`string`||e.trim().length===0)throw Error(`filter: expression is empty`);let t=O(e);if(t.length===0)throw Error(`filter: expression is empty`);let n={tokens:t,pos:0},r=P(n);if(n.pos!==t.length){let e=n.tokens[n.pos];throw Error(`filter: unexpected trailing token "${I(e)}"`)}return r}function I(e){return e.kind===`ident`||e.kind===`string`||e.kind===`op`?e.value:e.kind}const L=10*1024*1024;var te=class{currentBytes=0;initialized=!1;writeQueue=Promise.resolve();constructor(e,t=L){this.filePath=e,this.maxBytes=t}async init(){if(!this.initialized){this.initialized=!0;try{await g.mkdir(h.dirname(this.filePath),{recursive:!0,mode:448})}catch{}try{let e=await g.stat(this.filePath);this.currentBytes=e.size}catch{this.currentBytes=0}}}append(e){let t=(async()=>{await this.init();let t=e.endsWith(`
|
|
2
|
+
`)?e:`${e}\n`,n=Buffer.byteLength(t,`utf8`);this.currentBytes+n>this.maxBytes&&await this.rotate();try{await g.appendFile(this.filePath,t,{mode:384}),this.currentBytes+=n}catch(e){process.stderr.write(`[scrollback] append failed: ${e.message}\n`)}})();return this.writeQueue=this.writeQueue.then(()=>t,()=>t),t}async rotate(){let e=e=>{if(e===0)return this.filePath;let t=h.parse(this.filePath);return h.join(t.dir,`${t.name}.${e}${t.ext}`)};try{await g.unlink(e(3))}catch{}for(let t=2;t>=0;--t)try{await g.rename(e(t),e(t+1))}catch(n){n.code!==`ENOENT`&&process.stderr.write(`[scrollback] rotate ${e(t)} failed: ${n.message}\n`)}this.currentBytes=0}async close(){await this.writeQueue}};const R=5e3,z=1e3,B=`─── replay end, live below ───`;async function V(a){if(a.setForwardSecret)return await t({forwardSecret:a.setForwardSecret}),process.stdout.write(`Forward secret saved.
|
|
3
|
+
`),0;let o=await e(),s=await r({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),l=null;if(a.filter)try{l=F(a.filter)}catch(e){return process.stderr.write(`Invalid --filter expression: ${e.message}\n`),2}if(i(a))return W(c,a,l,o.forwardSecret);let u=a.siteId;try{let e=(await c.getSites()).find(e=>e.id===a.siteId);e&&(u=e.url?e.url.replace(/^https?:\/\//,``).replace(/\/$/,``):e.name)}catch{}let d=a.scrollbackPath??h.join(_.homedir(),`.zenovay`,`events-scrollback.log`);return new Promise(e=>{let{unmount:t}=x(C.createElement(K,{api:c,opts:a,siteLabel:u,predicate:l,forwardSecret:o.forwardSecret,scrollbackPath:d,onExit:n=>{t(),e(n)}}))})}function H(e){return{raw:JSON.stringify(e),parsed:e}}async function U(e,t,n){let r=JSON.stringify(n),i=v.createHmac(`sha256`,t).update(r).digest(`hex`);try{await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Zenovay-Signature":`sha256=${i}`},body:r})}catch{}}async function W(e,t,n,r){let i=new AbortController;process.on(`SIGINT`,()=>i.abort());let o=()=>new Date().toISOString();try{let s=await e.openEventsStream(t.siteId,i.signal);for await(let e of a(s)){if(e.type===`error`)return process.stdout.write(`${JSON.stringify({ts:o(),type:`error`,code:e.code,message:e.message})}\n`),1;if(e.type===`done`)return 0;let i=e;if(n&&!n(i))continue;process.stdout.write(`${JSON.stringify({ts:o(),...i})}\n`),t.forwardTo&&r&&await U(t.forwardTo,r,{event:e,ts:o(),site_id:t.siteId})}return 0}catch(e){return process.stdout.write(`${JSON.stringify({ts:o(),type:`error`,code:`stream_failed`,message:e.message})}\n`),1}}function ne(e){let t=e?.ts??e?.timestamp??e?.created_at,n=typeof t==`string`||typeof t==`number`?new Date(t):new Date;return Number.isNaN(n.getTime())?new Date().toLocaleTimeString():n.toLocaleTimeString()}function G(e,t){if(!e)return``;for(let n of t){let t=e[n];if(t!=null&&t!==``)return String(t)}return``}const K=({api:e,opts:t,siteLabel:n,predicate:r,forwardSecret:i,scrollbackPath:h,onExit:_})=>{m();let{theme:v}=c(),{exit:x}=S(),D=T([]),O=T(null),[k,A]=E([]),[j,M]=E(0),[N,P]=E(null),[F,I]=E(!1),[L,R]=E(null),B=F||N!==null;O.current||=new te(h),ee(n=>{if(!F){if(N){P(null);return}if(n===`q`){x(),_(0);return}if(n===`f`){let e=D.current[D.current.length-1];e&&P(e);return}if(n===`w`){I(!0);return}if(n===`r`){J(e,t.siteId,D,R);return}}});let V=process.stdout.rows??40,W=Math.max(5,Math.min(24,V-12));w(()=>{if(B)return;let e=()=>{A(D.current.slice(-W)),M(D.current.length)};e();let t=setInterval(e,z);return()=>clearInterval(t)},[B,W]),w(()=>{let n=new AbortController,o=!1;return(async()=>{t.replay24h&&await J(e,t.siteId,D,R);try{let s=await e.openEventsStream(t.siteId,n.signal);for await(let e of a(s)){if(o)break;if(e.type===`error`){let t={raw:`[ERR ${e.code}] ${e.message}`};q(D,t),O.current?.append(t.raw);continue}if(e.type===`done`)break;let n=e;if(r&&!r(n))continue;let a=H(e);q(D,a),O.current?.append(a.raw),t.forwardTo&&i&&U(t.forwardTo,i,{event:e,ts:new Date().toISOString(),site_id:t.siteId})}}catch(e){let t={raw:`[DISCONNECT] ${e.message}`};q(D,t)}})(),()=>{o=!0,n.abort(),O.current?.close()}},[e,t.siteId,t.replay24h,t.forwardTo,r,i]);let K=async e=>{let t=e.trim()||`events.ndjson`;try{let e=D.current.map(e=>e.raw).join(`
|
|
4
|
+
`)+`
|
|
5
|
+
`;await g.writeFile(t,e,{mode:384}),R(`Wrote ${D.current.length} events → ${t}`)}catch(e){R(`Write failed: ${e.message}`)}I(!1)},Y=`events tail · ${n}`,X=[{key:`f`,label:`freeze`},{key:`w`,label:`write`},{key:`r`,label:`replay 24h`},{key:`q`,label:`quit`}],re=[{key:`parsed`,label:`time`,width:11,format:(e,t)=>ne(t.parsed)},{key:`parsed`,label:`event`,width:12,format:(e,t)=>G(t.parsed,[`type`,`event`,`name`])||`event`},{key:`parsed`,label:`path`,width:30,format:(e,t)=>d(G(t.parsed,[`path`,`page_url`,`url`,`href`]))||`—`},{key:`parsed`,label:`country`,width:8,format:(e,t)=>G(t.parsed,[`country`,`country_code`,`geo`])||`—`}],Z=k.filter(e=>e.parsed&&!e.marker),Q=k.filter(e=>!e.parsed||e.marker),$=j-k.length;return C.createElement(y,{flexDirection:`column`},C.createElement(o,{version:t.cliVersion,subtitle:Y,live:j>0}),N?C.createElement(y,{marginTop:1},C.createElement(s,{title:`Frozen event — press any key to resume`,state:`warn`},C.createElement(b,{wrap:`truncate`},N.parsed?JSON.stringify(N.parsed):N.raw))):F?C.createElement(y,{marginTop:1},C.createElement(s,{title:`Write buffer to NDJSON`,state:`busy`},C.createElement(l,{question:`filename:`,placeholder:`events.ndjson`,onSubmit:K}))):C.createElement(y,{marginTop:1},C.createElement(s,{title:`Live events`,state:`idle`},j===0?C.createElement(p,{reason:`no-data`,headline:`Waiting for events…`,hint:`Visit your tracked site (or fire a test event) and rows will stream in here.`}):Z.length===0&&Q.length===0?C.createElement(p,{reason:`no-data`,headline:`No matching events`,hint:t.filter?`No events match --filter "${t.filter}" yet.`:`Waiting for the next event…`}):C.createElement(C.Fragment,null,$>0?C.createElement(b,{color:v.dim},` …${$.toLocaleString()} earlier`):null,Z.length>0?C.createElement(f,{columns:re,data:Z,zebra:!0}):null,Q.map((e,t)=>C.createElement(b,{key:`notice-${t}`,color:e.marker?v.accent:v.warn,wrap:`truncate`},e.raw))))),L?C.createElement(b,{color:v.success},L):null,C.createElement(y,{marginTop:1},C.createElement(b,{color:v.dim},B?`↻ paused`:j>0?`↻ live · ${j.toLocaleString()} events buffered`:`↻ connecting…`)),C.createElement(u,{items:X,active:`q`}))};function q(e,t){e.current.push(t),e.current.length>R&&e.current.splice(0,e.current.length-R)}async function J(e,t,n,r){let i=e.getEventsHistory;if(typeof i==`function`)try{let a=await i.call(e,t,`24h`);if(Array.isArray(a))for(let e of a)q(n,{raw:JSON.stringify(e),parsed:e});q(n,{raw:B,marker:!0}),r(`Replayed ${Array.isArray(a)?a.length:0} events`);return}catch(e){r(`Replay failed: ${e.message}`);return}r(`Replay endpoint coming Wave 1`)}export{V as eventsTailCommand};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-DqKh6FgZ.js";import{requireTier as i}from"./tier-BneaO4vD.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as a,wrapItem as o}from"./emit-D4YlMlzk.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{resolveSiteId as s}from"./resolve-site-BLrtFOyW.js";import{toCsv as c}from"./csv-emit-C-9o-imN.js";import{resolve as l}from"node:path";import{writeFile as u}from"node:fs/promises";function d(e){let t=(e??`30d`).toLowerCase();return t===`7d`||t===`30d`||t===`90d`?t:`30d`}function f(e,t){t||process.stderr.isTTY&&process.stderr.write(`${e}\n`)}async function p(c){let p=await e(),g=await t({strict:!1}),_=new r({config:p,cliVersion:c.cliVersion,token:g});if(c.type!==`analytics`&&c.type!==`sessions`&&c.type!==`heatmaps`){let e=`Unknown export type '${c.type}'. Use one of: analytics, sessions, heatmaps.`;return c.json?n(Error(e),{command:`export`,cliVersion:c.cliVersion}):(process.stderr.write(`Error: ${e}\n`),2)}let v=c.format??`csv`;if(v!==`csv`&&v!==`json`){let e=`Unknown export format '${v}'. Use one of: csv, json.`;return c.json?n(Error(e),{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`Error: ${e}\n`),2)}let y=v,b=d(c.range),x=!!c.json;if(c.type===`sessions`||c.type===`heatmaps`)try{await i(_,`pro`)}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}let S;try{({siteId:S}=await s(_,{explicit:c.siteId,headless:x,cliVersion:c.cliVersion}))}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}try{f(`→ Fetching ${c.type} ${b}...`,x);let{rows:e,columns:t}=await m(_,c.type,S,b),n=h(e,t,y),r=c.out?l(process.cwd(),c.out):null;return r?(await u(r,n,`utf8`),c.json?(a(o({rowsWritten:e.length,file:r,format:y,range:b,type:c.type},`export.completed`,{siteId:S,command:`export ${c.type}`,cliVersion:c.cliVersion})),0):(process.stdout.write(`✓ Exported ${e.length} rows to ${r}\n`),0)):(process.stdout.write(n),n.endsWith(`
|
|
2
|
+
`)||process.stdout.write(`
|
|
3
|
+
`),c.json&&a(o({rowsWritten:e.length,file:null,format:y,range:b,type:c.type},`export.completed`,{siteId:S,command:`export ${c.type}`,cliVersion:c.cliVersion})),0)}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`✗ ${e.message}\n`),1)}}async function m(e,t,n,r){if(t===`analytics`){let t=await e.getStats(n,r);if(t.daily&&t.daily.length>0){let e=t.daily.map(e=>({date:e.date,visitors:e.visitors,pageviews:e.pageviews}));return{rows:e,columns:[`date`,`visitors`,`pageviews`]}}let i=[{range:r,visitors:t.visitors,pageviews:t.pageviews,sessions:t.sessions,bounceRate:t.bounceRate,avgSessionSec:t.avgSessionSec,windowStart:t.windowStart,windowEnd:t.windowEnd}];return{rows:i,columns:[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSessionSec`,`windowStart`,`windowEnd`]}}if(t===`sessions`){let t=await e.getSessions(n),r=t.map(e=>({id:e.id,visitor:e.visitor,durationMs:e.duration,startedAt:e.startedAt,pageCount:e.pageCount,deviceType:e.deviceType??``}));return{rows:r,columns:[`id`,`visitor`,`durationMs`,`startedAt`,`pageCount`,`deviceType`]}}let i=await e.getHeatmaps(n),a=i.map(e=>({id:e.id,url:e.url,type:e.type,captureCount:e.captureCount,createdAt:e.createdAt}));return{rows:a,columns:[`id`,`url`,`type`,`captureCount`,`createdAt`]}}function h(e,t,n){if(n===`json`){let n=e.map(e=>{let n={};for(let r of t)n[String(r)]=e[r];return n});return JSON.stringify(n,null,2)+`
|
|
4
|
+
`}return c(e,t,`csv`)}export{p as exportCommand};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-PSN5hjlF.js";import{resolveSiteId as s}from"./resolve-site-BLrtFOyW.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{Bar as u}from"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-BU2yCSg_.js";import{Box as p,Text as m}from"ink";import h from"react";async function g(o){let l=await e(),u=await t({strict:!1}),p=new n({config:l,cliVersion:o.cliVersion,token:u}),m,g;try{({siteId:m,site:g}=await s(p,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=g?.url?g.url.replace(/^https?:\/\//,``).replace(/\/$/,``):g?.name??m,S=i(o);if(!o.funnelId){let e=[{key:`name`,label:`name`,width:30},{key:`stepCount`,label:`steps`,width:6,align:`right`},{key:`id`,label:`id`,width:36,format:e=>String(e).slice(0,36)}];return f({cliVersion:o.cliVersion,title:`funnels · ${x}`,commandName:`funnels`,ai:{api:p,siteId:m,siteLabel:x},authToken:u?.accessToken??null,refreshIntervalMs:0,fetcher:e=>p.listFunnels(m,e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`funnel`,{siteId:m}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
|
+
`);return}process.stdout.write(r(e.funnels,[`id`,`name`,`stepCount`],t))},panels:[{id:`funnels`,title:`Funnels`,render:t=>t.funnels.length===0?h.createElement(_,null):h.createElement(c,{data:t.funnels,columns:e,headerStyle:`accent`})},{id:`hint`,title:`Next`,render:()=>h.createElement(v,null)}]})}let C=o.window??`30d`;return f({cliVersion:o.cliVersion,title:`funnel · ${o.funnelId} · ${x}`,commandName:`funnel`,ai:{api:p,siteId:m,siteLabel:x},authToken:u?.accessToken??null,refreshIntervalMs:0,ranges:{windows:[`7d`,`30d`]},fetcher:(e,t)=>p.getFunnel(m,o.funnelId,t===`7d`?`7d`:t?`30d`:C,e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`funnel`,{siteId:m}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
3
|
+
`);return}process.stdout.write(r(e.steps,[`id`,`name`,`visitors`,`conversions`],t))},panels:[{id:`overview`,title:`Overview`,render:e=>h.createElement(y,{data:e})},{id:`flow`,title:`Flow`,render:e=>h.createElement(b,{data:e})}]})}function _(){return h.createElement(l,{reason:`no-data`,headline:`No funnels defined yet`,hint:"Create a funnel in the dashboard, then run `zenovay funnel <id>` for drop-off detail."})}function v(){let{theme:e}=o();return h.createElement(m,{color:e.dim},"Run `zenovay funnel <id>` for drop-off detail.")}function y({data:e}){let{theme:t}=o();return h.createElement(p,{flexDirection:`column`},h.createElement(m,{bold:!0},e.name),h.createElement(m,{color:t.muted},e.totalEntries.toLocaleString(),` entries · `,e.totalCompletions.toLocaleString(),` completed (`,(e.conversionRate*100).toFixed(1),`%)`))}function b({data:e}){let{theme:t}=o(),n=e.totalEntries||1;if(e.steps.length===0)return h.createElement(l,{reason:`no-data`,headline:`No steps in this window`,hint:`Widen the time window (number keys) or check that the funnel has recorded traffic.`});let r=69;return h.createElement(p,{flexDirection:`column`},e.steps.map((i,a)=>{let o=i.visitors/n,s=e.steps[a-1],c=s?s.visitors-i.visitors:0,l=s?c/Math.max(1,s.visitors)*100:0;return h.createElement(p,{key:i.id,flexDirection:`column`},s?h.createElement(m,{color:t.error},` `,`↓ drop `,c.toLocaleString(),` (`,l.toFixed(1),`%)`):null,h.createElement(p,{flexDirection:`row`,width:r},h.createElement(p,{width:22,marginRight:1,flexShrink:0},h.createElement(m,{bold:!0,wrap:`truncate`},`${a+1}. ${i.name}`)),h.createElement(p,{flexShrink:0},h.createElement(u,{value:i.visitors,max:n,width:30,showPercent:!1,track:!0})),h.createElement(p,{width:6,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.fg},(o*100).toFixed(1),`%`)),h.createElement(p,{width:8,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.muted},i.visitors.toLocaleString()))))}))}export{g as funnelCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as l}from"./keybar-DO5OoZy9.js";import{resolveSiteId as u}from"./resolve-site-BLrtFOyW.js";import{DataTable as d}from"./data-table-BhKjjiOS.js";import{EmptyState as f}from"./empty-state-D-krMX62.js";import{ResponsiveGrid as p}from"./grid-CMwhs-Ms.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{RangeTabs as g,rangeForKey as _}from"./range-tabs-BbJdVWNV.js";import{useSiteSwitcher as v}from"./site-switcher-D_JBKFaR.js";import{Box as y,Text as b,render as x,useApp as S,useInput as C}from"ink";import w,{useEffect as T,useState as E}from"react";import D from"ink-spinner";async function O(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),l,d;try{({siteId:l,site:d}=await u(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??l;if(i(a)){let e=await c.getGeo(l);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-CmlDBfbA.js`);return t(e.countries,[`country`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.countries)process.stdout.write(JSON.stringify(t)+`
|
|
2
|
+
`);return 0}return r({type:`geo.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=x(w.createElement(k,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const k=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:u}=S(),{theme:x}=c(),[O,k]=E(null),[A,j]=E(!0),[M,N]=E(null),[P,F]=E(`24h`),[I,L]=E(t),[R,z]=E(n),B=v(e,I,e=>{L(e.id),z(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),k(null)});C((e,t)=>{if(B.open){(t.escape||e===`s`)&&B.close();return}if(e===`o`||e===`O`){a(m(`geo`,{siteId:I}));return}if(e===`s`){B.toggle();return}let n=_(e);if(n){F(n);return}e===`q`&&(u(),i(0))}),T(()=>{let t=!1;return O===null&&j(!0),(async()=>{try{let n=await e.getGeo(I,P);t||(k(n),j(!1))}catch(e){t||(N(e.message),j(!1))}})(),()=>{t=!0}},[e,I,P]);let V=`geo · ${R} · ${P}`;if(A)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(s,{title:`Loading`,state:`busy`},w.createElement(y,null,w.createElement(b,{color:x.accent},w.createElement(D,{type:`dots`})),w.createElement(b,null,` Fetching geo…`))));if(M)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`error`,headline:`Failed to load`,hint:M}));let H=!O||O.countries.length===0&&O.cities.length===0;if(H)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`no-data`,headline:`No data in this window`,hint:`Press 1-4 to widen the range, [s] to switch site, or visit your site to send an event`}),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`q`,label:`quit`}],active:`s`}));let U=[{key:`country`,label:`country`,width:18},{key:`visitors`,label:`visitors`,align:`right`,width:8}],W=[{key:`city`,label:`city`,width:18},{key:`country`,label:`country`,width:10},{key:`visitors`,label:`visitors`,align:`right`,width:8}],G=process.stdout.columns??80,K=process.stdout.rows??40,q=Math.max(5,K-15),J=O.countries,Y=O.cities,X=J.length-Math.min(J.length,q),Z=Y.length-Math.min(Y.length,q),Q=[{key:`countries`,title:`Countries (${J.length})`,render:()=>J.length===0?w.createElement(f,{reason:`no-data`,headline:`No countries yet`,hint:`Visit your site to send the first event`}):w.createElement(w.Fragment,null,w.createElement(d,{columns:U,data:J.slice(0,q),zebra:!0}),X>0?w.createElement(b,{color:x.dim},` +${X} more · --json`):null)},{key:`cities`,title:`Cities (${Y.length})`,render:()=>Y.length===0?w.createElement(f,{reason:`no-data`,headline:`No cities yet`,hint:`City data needs a few more visits`}):w.createElement(w.Fragment,null,w.createElement(d,{columns:W,data:Y.slice(0,q),zebra:!0}),Z>0?w.createElement(b,{color:x.dim},` +${Z} more · --json`):null)}];return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(y,{marginTop:1},w.createElement(p,{totalWidth:G,panels:Q,minColWidth:40,maxCols:2,gap:2})),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}],active:`o`}))};export{O as geoCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as l}from"./keybar-DO5OoZy9.js";import{ChatPanel as u}from"./chat-panel-PSN5hjlF.js";import{resolveSiteId as d}from"./resolve-site-BLrtFOyW.js";import{EmptyState as f}from"./empty-state-D-krMX62.js";import{Bar as p}from"./bar-NfgovYHe.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{Box as g,Text as _,render as v,useApp as y,useInput as b}from"ink";import x,{useEffect as ee,useMemo as te,useRef as ne,useState as S}from"react";import re from"ink-spinner";const C={DZ:{lat:28.0339,lng:1.6596,name:`Algeria`,spread:8},EG:{lat:26.8206,lng:30.8025,name:`Egypt`,spread:6},ET:{lat:9.145,lng:40.4897,name:`Ethiopia`,spread:6},GH:{lat:7.9465,lng:-1.0232,name:`Ghana`,spread:3},KE:{lat:-.0236,lng:37.9062,name:`Kenya`,spread:4},MA:{lat:31.7917,lng:-7.0926,name:`Morocco`,spread:5},NG:{lat:9.082,lng:8.6753,name:`Nigeria`,spread:5},ZA:{lat:-30.5595,lng:22.9375,name:`South Africa`,spread:7},TZ:{lat:-6.369,lng:34.8888,name:`Tanzania`,spread:5},UG:{lat:1.3733,lng:32.2903,name:`Uganda`,spread:3},TN:{lat:33.8869,lng:9.5375,name:`Tunisia`,spread:3},SN:{lat:14.4974,lng:-14.4524,name:`Senegal`,spread:3},CI:{lat:7.54,lng:-5.5471,name:`Côte d'Ivoire`,spread:3},CM:{lat:7.3697,lng:12.3547,name:`Cameroon`,spread:4},AO:{lat:-11.2027,lng:17.8739,name:`Angola`,spread:6},MZ:{lat:-18.6657,lng:35.5296,name:`Mozambique`,spread:6},ZW:{lat:-19.0154,lng:29.1549,name:`Zimbabwe`,spread:4},ZM:{lat:-13.1339,lng:27.8493,name:`Zambia`,spread:5},RW:{lat:-1.9403,lng:29.8739,name:`Rwanda`,spread:1.5},MG:{lat:-18.7669,lng:46.8691,name:`Madagascar`,spread:5},LY:{lat:26.3351,lng:17.2283,name:`Libya`,spread:8},SD:{lat:12.8628,lng:30.2176,name:`Sudan`,spread:7},US:{lat:39.0902,lng:-98.5795,name:`United States`,spread:18},CA:{lat:56.1304,lng:-106.3468,name:`Canada`,spread:22},MX:{lat:23.6345,lng:-102.5528,name:`Mexico`,spread:9},BR:{lat:-10.235,lng:-51.9253,name:`Brazil`,spread:18},AR:{lat:-38.4161,lng:-63.6167,name:`Argentina`,spread:11},CL:{lat:-35.6751,lng:-71.543,name:`Chile`,spread:11},CO:{lat:4.5709,lng:-74.2973,name:`Colombia`,spread:6},PE:{lat:-9.19,lng:-75.0152,name:`Peru`,spread:7},VE:{lat:6.4238,lng:-66.5897,name:`Venezuela`,spread:6},EC:{lat:-1.8312,lng:-78.1834,name:`Ecuador`,spread:3},BO:{lat:-16.2902,lng:-63.5887,name:`Bolivia`,spread:6},UY:{lat:-32.5228,lng:-55.7658,name:`Uruguay`,spread:2.5},PY:{lat:-23.4425,lng:-58.4438,name:`Paraguay`,spread:4},GT:{lat:15.7835,lng:-90.2308,name:`Guatemala`,spread:2},CU:{lat:21.5218,lng:-77.7812,name:`Cuba`,spread:3},DO:{lat:18.7357,lng:-70.1627,name:`Dominican Republic`,spread:1.5},CR:{lat:9.7489,lng:-83.7534,name:`Costa Rica`,spread:1.2},PA:{lat:8.538,lng:-80.7821,name:`Panama`,spread:1.5},HN:{lat:15.2,lng:-86.2419,name:`Honduras`,spread:2},PR:{lat:18.2208,lng:-66.5901,name:`Puerto Rico`,spread:.6},JM:{lat:18.1096,lng:-77.2975,name:`Jamaica`,spread:.7},TT:{lat:10.6918,lng:-61.2225,name:`Trinidad and Tobago`,spread:.6},GB:{lat:55.3781,lng:-3.436,name:`United Kingdom`,spread:3},IE:{lat:53.4129,lng:-8.2439,name:`Ireland`,spread:2},FR:{lat:46.6034,lng:1.8883,name:`France`,spread:4},DE:{lat:51.1657,lng:10.4515,name:`Germany`,spread:3.5},IT:{lat:41.8719,lng:12.5674,name:`Italy`,spread:3.5},ES:{lat:40.4637,lng:-3.7492,name:`Spain`,spread:4},PT:{lat:39.3999,lng:-8.2245,name:`Portugal`,spread:2},NL:{lat:52.1326,lng:5.2913,name:`Netherlands`,spread:1.2},BE:{lat:50.5039,lng:4.4699,name:`Belgium`,spread:1},CH:{lat:46.8182,lng:8.2275,name:`Switzerland`,spread:1.4},AT:{lat:47.5162,lng:14.5501,name:`Austria`,spread:2},PL:{lat:51.9194,lng:19.1451,name:`Poland`,spread:3.5},CZ:{lat:49.8175,lng:15.473,name:`Czechia`,spread:1.8},SE:{lat:60.1282,lng:18.6435,name:`Sweden`,spread:5},NO:{lat:60.472,lng:8.4689,name:`Norway`,spread:5},FI:{lat:61.9241,lng:25.7482,name:`Finland`,spread:4},DK:{lat:56.2639,lng:9.5018,name:`Denmark`,spread:1.5},IS:{lat:64.9631,lng:-19.0208,name:`Iceland`,spread:3},GR:{lat:39.0742,lng:21.8243,name:`Greece`,spread:3},TR:{lat:38.9637,lng:35.2433,name:`Turkey`,spread:6},RO:{lat:45.9432,lng:24.9668,name:`Romania`,spread:3},HU:{lat:47.1625,lng:19.5033,name:`Hungary`,spread:2},UA:{lat:48.3794,lng:31.1656,name:`Ukraine`,spread:5},RU:{lat:61.524,lng:80,name:`Russia`,spread:28},BG:{lat:42.7339,lng:25.4858,name:`Bulgaria`,spread:2},HR:{lat:45.1,lng:15.2,name:`Croatia`,spread:2},RS:{lat:44.0165,lng:21.0059,name:`Serbia`,spread:2},SK:{lat:48.669,lng:19.699,name:`Slovakia`,spread:1.8},SI:{lat:46.1512,lng:14.9955,name:`Slovenia`,spread:1.2},LT:{lat:55.1694,lng:23.8813,name:`Lithuania`,spread:1.5},LV:{lat:56.8796,lng:24.6032,name:`Latvia`,spread:1.5},EE:{lat:58.5953,lng:25.0136,name:`Estonia`,spread:1.5},BY:{lat:53.7098,lng:27.9534,name:`Belarus`,spread:3},MD:{lat:47.4116,lng:28.3699,name:`Moldova`,spread:1.2},AL:{lat:41.1533,lng:20.1683,name:`Albania`,spread:1},MK:{lat:41.6086,lng:21.7453,name:`North Macedonia`,spread:1},BA:{lat:43.9159,lng:17.6791,name:`Bosnia and Herzegovina`,spread:1.2},ME:{lat:42.7087,lng:19.3744,name:`Montenegro`,spread:.8},XK:{lat:42.6026,lng:20.903,name:`Kosovo`,spread:.7},LU:{lat:49.8153,lng:6.1296,name:`Luxembourg`,spread:.4},MT:{lat:35.9375,lng:14.3754,name:`Malta`,spread:.3},CY:{lat:35.1264,lng:33.4299,name:`Cyprus`,spread:.6},CN:{lat:35.8617,lng:104.1954,name:`China`,spread:18},JP:{lat:36.2048,lng:138.2529,name:`Japan`,spread:5},KR:{lat:35.9078,lng:127.7669,name:`South Korea`,spread:2},IN:{lat:20.5937,lng:78.9629,name:`India`,spread:12},ID:{lat:-2.7893,lng:113.9213,name:`Indonesia`,spread:12},PH:{lat:12.8797,lng:121.774,name:`Philippines`,spread:5},VN:{lat:14.0583,lng:108.2772,name:`Vietnam`,spread:5},TH:{lat:15.87,lng:100.9925,name:`Thailand`,spread:4},MY:{lat:4.2105,lng:101.9758,name:`Malaysia`,spread:4},SG:{lat:1.3521,lng:103.8198,name:`Singapore`,spread:.3},PK:{lat:30.3753,lng:69.3451,name:`Pakistan`,spread:6},BD:{lat:23.685,lng:90.3563,name:`Bangladesh`,spread:3},LK:{lat:7.8731,lng:80.7718,name:`Sri Lanka`,spread:2},MM:{lat:21.9162,lng:95.956,name:`Myanmar`,spread:6},KH:{lat:12.5657,lng:104.991,name:`Cambodia`,spread:3},LA:{lat:19.8563,lng:102.4955,name:`Laos`,spread:3},NP:{lat:28.3949,lng:84.124,name:`Nepal`,spread:3},IR:{lat:32.4279,lng:53.688,name:`Iran`,spread:7},IQ:{lat:33.2232,lng:43.6793,name:`Iraq`,spread:4},IL:{lat:31.0461,lng:34.8516,name:`Israel`,spread:1},SA:{lat:23.8859,lng:45.0792,name:`Saudi Arabia`,spread:8},AE:{lat:23.4241,lng:53.8478,name:`UAE`,spread:2},QA:{lat:25.3548,lng:51.1839,name:`Qatar`,spread:.6},KW:{lat:29.3117,lng:47.4818,name:`Kuwait`,spread:.8},OM:{lat:21.4735,lng:55.9754,name:`Oman`,spread:4},JO:{lat:30.5852,lng:36.2384,name:`Jordan`,spread:2},LB:{lat:33.8547,lng:35.8623,name:`Lebanon`,spread:.7},SY:{lat:34.8021,lng:38.9968,name:`Syria`,spread:3},YE:{lat:15.5527,lng:48.5164,name:`Yemen`,spread:4},AF:{lat:33.9391,lng:67.71,name:`Afghanistan`,spread:5},KZ:{lat:48.0196,lng:66.9237,name:`Kazakhstan`,spread:13},UZ:{lat:41.3775,lng:64.5853,name:`Uzbekistan`,spread:5},TM:{lat:38.9697,lng:59.5563,name:`Turkmenistan`,spread:5},KG:{lat:41.2044,lng:74.7661,name:`Kyrgyzstan`,spread:3},TJ:{lat:38.861,lng:71.2761,name:`Tajikistan`,spread:3},AZ:{lat:40.1431,lng:47.5769,name:`Azerbaijan`,spread:2},GE:{lat:42.3154,lng:43.3569,name:`Georgia`,spread:2},AM:{lat:40.0691,lng:45.0382,name:`Armenia`,spread:1.2},HK:{lat:22.3193,lng:114.1694,name:`Hong Kong`,spread:.3},TW:{lat:23.6978,lng:120.9605,name:`Taiwan`,spread:1.5},AU:{lat:-25.2744,lng:133.7751,name:`Australia`,spread:18},NZ:{lat:-40.9006,lng:174.886,name:`New Zealand`,spread:5},PG:{lat:-6.314,lng:143.9555,name:`Papua New Guinea`,spread:5},FJ:{lat:-16.578,lng:179.4144,name:`Fiji`,spread:1}},ie=Object.fromEntries(Object.entries(C).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function w(e){return!e||e.length!==2?null:C[e.toUpperCase()]??null}function ae(e,t){let n=w(e);if(!n||t<=0)return[];let r=[],i=0;for(let t=0;t<e.length;t++)i=i*31+e.charCodeAt(t)>>>0;for(let e=0;e<t;e++){i=i+1831565813>>>0;let e=i;e=Math.imul(e^e>>>15,e|1)>>>0,e=(e^e+(Math.imul(e^e>>>7,e|61)>>>0))>>>0;let t=((e^e>>>14)>>>0)/4294967296;i=i+2246822507>>>0;let a=i;a=Math.imul(a^a>>>15,a|1)>>>0,a=(a^a+(Math.imul(a^a>>>7,a|61)>>>0))>>>0;let o=((a^a>>>14)>>>0)/4294967296,s=n.spread*Math.sqrt(t),c=o*2*Math.PI;r.push({lat:n.lat+s*Math.sin(c)*.7,lng:n.lng+s*Math.cos(c)/Math.max(.3,Math.cos(n.lat*Math.PI/180))})}return r}const T=360,E=180,D=new Uint8Array(T*E),O=new Uint8Array(T*E),k=[`__OCEAN__`];function A(e){let t=(e%360+360)%360;return Math.floor(t)}function j(e){return Math.max(0,Math.min(E-1,Math.floor(90-e)))}function M(e,t,n){let r=j(e),i=A(t);D[r*T+i]=1,O[r*T+i]=n}for(let e of Object.keys(C)){let t=C[e];k.push(e);let n=k.length-1,r=Math.max(.5,t.spread*.85),i=Math.max(.25,Math.cos(t.lat*Math.PI/180)),a=Math.max(.5,t.spread/i),o=Math.floor(t.lat-r),s=Math.ceil(t.lat+r),c=Math.floor(t.lng-a),l=Math.ceil(t.lng+a);for(let e=o;e<=s;e++)for(let i=c;i<=l;i++){let o=(e-t.lat)/r,s=(i-t.lng)/a;s*s+o*o>1||M(e,i,n)}}const N=new Uint8Array(D);for(let e=1;e<E-1;e++)for(let t=0;t<T;t++){if(D[e*T+t])continue;let n=0,r=0;for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){if(i===0&&a===0)continue;let o=(t+a+T)%T;D[(e+i)*T+o]&&(n++,r||=O[(e+i)*T+o]??0)}n>=4&&(N[e*T+t]=1,O[e*T+t]=r)}D.set(N);const P=new Uint8Array(T*E);for(let e=0;e<E;e++)for(let t=0;t<T;t++){let n=O[e*T+t];if(!n)continue;let r=e>0?O[(e-1)*T+t]:0,i=e<E-1?O[(e+1)*T+t]:0,a=O[e*T+(t-1+T)%T],o=O[e*T+(t+1)%T];(r!==n||i!==n||a!==n||o!==n)&&(P[e*T+t]=1)}function oe(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(E-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return D[n*T+i]===1?1:0}function F(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(E-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return P[n*T+i]===1?1:0}function I(e){return e*Math.PI/180}function L(e,t){let n=I(e),r=I(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function R(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:n*e.x+r*e.z,y:e.y,z:-r*e.x+n*e.z}}function z(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:e.x,y:n*e.y-r*e.z,z:r*e.y+n*e.z}}function B(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function V(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function H(e,t,n,r){let i=r*r;for(let a=-r;a<=r;a++)for(let o=-r;o<=r;o++)o*o+a*a<=i&&V(e,Math.round(t+o),Math.round(n+a))}const U=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function W(e,t,n){let r=0;for(let i=0;i<U.length;i++){let[a,o]=U[i],s=t*2+a,c=n*4+o;e.bits[c*e.dw+s]&&(r|=1<<i)}return r===0?` `:String.fromCodePoint(10240+r)}function G(e,t,n){let r=0;for(let i=0;i<4;i++)for(let a=0;a<2;a++){let o=t*2+a,s=n*4+i;e.bits[s*e.dw+o]&&r++}return r===0?` `:r<=2?`·`:r<=5?`○`:`●`}function K(e){if(e)return!0;let t=process.env;if(t.NO_COLOR||t.ZENOVAY_GLOBE===`ascii`)return!0;let n=(t.LANG||t.LC_ALL||t.LC_CTYPE||``).toLowerCase();return!!(n&&!n.includes(`utf`))}function q(e,t,n){if(e.z<0)return null;let r=t/2,i=n/2,a=Math.min(t,n/2)*.95;return{x:r+e.x*a,y:i-e.y*a}}function se(e){let t=e.dw/2,n=e.dh/2,r=Math.min(e.dw,e.dh/2)*.95,i=Math.round(2*Math.PI*r);for(let a=0;a<i;a++){let o=a/i*2*Math.PI,s=Math.round(t+r*Math.cos(o)),c=Math.round(n+r*Math.sin(o));V(e,s,c)}}function J(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=z(R(L(r,i),t),n),o=q(a,e.dw,e.dh);o&&V(e,Math.round(o.x),Math.round(o.y))}for(let r=-180;r<180;r+=30)for(let i=-85;i<=85;i+=4){let a=z(R(L(i,r),t),n),o=q(a,e.dw,e.dh);o&&V(e,Math.round(o.x),Math.round(o.y))}}function ce({visitors:e,highlight:t,width:n=50,height:r=25,rotationDeg:i=0,tiltDeg:a=20,gridlines:o=!0,asciiOnly:s}){let{theme:l}=c(),u=K(s),d=B(n,r),f=B(n,r),p=B(n,r),m=B(n,r),h=B(n,r),v=I(i),y=I(-a);se(d),o&&J(d,v,y);{let e=f.dw/2,t=f.dh/2,n=Math.min(f.dw,f.dh/2)*.95,r=Math.cos(v),i=Math.sin(v),a=Math.cos(y),o=Math.sin(y);for(let s=0;s<f.dh;s++){let c=(t-s)/n;if(!(c<-1||c>1))for(let t=0;t<f.dw;t++){let l=(t-e)/n,u=l*l+c*c;if(u>1)continue;let d=Math.sqrt(1-u),m=l,h=c,g=a*h+o*d,_=-o*h+a*d,v=r*m-i*_,y=i*m+r*_,b=Math.asin(g)*(180/Math.PI),x=Math.atan2(v,y)*(180/Math.PI);oe(b,x)&&(V(f,t,s),F(b,x)&&V(p,t,s))}}}for(let t of e){let e=z(R(L(t.lat,t.lng),v),y),n=q(e,m.dw,m.dh);if(!n)continue;let r=typeof t.freshness==`number`?t.freshness:.5;H(m,n.x,n.y,r>.7?2:1)}if(t&&t.length>0)for(let e of t){let t=z(R(L(e.lat,e.lng),v),y),n=q(t,h.dw,h.dh);if(!n)continue;H(h,n.x,n.y,2)}let b=[];for(let e=0;e<r;e++){let t=[],r=null,i=(e,n)=>{r&&r.color===e?r.text+=n:(r={color:e,text:n},t.push(r))};for(let r=0;r<n;r++){let n=u?G(h,r,e):W(h,r,e);if(n!==` `){i(l.warn,n);continue}let a=u?G(m,r,e):W(m,r,e);if(a!==` `){i(l.accent,a);continue}let o=u?G(p,r,e):W(p,r,e);if(o!==` `){i(l.fg,o);continue}let s=u?G(f,r,e):W(f,r,e);if(s!==` `){i(l.success,s);continue}let c=u?G(d,r,e):W(d,r,e);if(c!==` `){i(l.muted,c);continue}let g=t.length>0?t[t.length-1]:void 0;i(g?g.color:l.muted,` `)}b.push(x.createElement(g,{key:e},x.createElement(_,null,t.map((e,t)=>x.createElement(_,{key:t,color:e.color,bold:!0},e.text)))))}return x.createElement(g,{flexDirection:`column`},b)}async function Y(e,t,n){let r=await e.getGeo(t).catch(()=>({countries:[],cities:[]})),i=(r.countries??[]).map(e=>{let t=w(e.country),r=n.get(e.country)??0;return{code:e.country,visitors:e.visitors,lat:t?.lat,lng:t?.lng,freshness:e.visitors>r?1:.4}});return{countries:i,totalVisitors:i.reduce((e,t)=>e+t.visitors,0),unknownCount:i.filter(e=>typeof e.lat!=`number`).reduce((e,t)=>e+t.visitors,0),lastFetchedAt:Date.now()}}async function X(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:o.cliVersion,token:c}),u,f;try{({siteId:u,site:f}=await d(l,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(o.browser){let e=m(`globe`,{siteId:u});o.json?process.stdout.write(JSON.stringify({openedUrl:e})+`
|
|
2
|
+
`):process.stdout.write(`\n Opening Mapbox globe in your default browser:\n ${e}\n\n`);try{await a(e)}catch{}return 0}if(i(o)){let e=await Y(l,u,new Map);return r({type:`globe.snapshot`,data:{countries:e.countries,total:e.totalVisitors,unknownCount:e.unknownCount}}),0}return new Promise(e=>{let{unmount:t}=v(x.createElement(Z,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const le=5e3,ue=500,de=5,fe=80,Z=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:d}=y(),{theme:v}=c(),[C,ie]=S(null),[T,E]=S(!0),[D,O]=S(null),[k,A]=S(0),[j,M]=S(!1),[N,P]=S(20),[oe,F]=S(1),[I,L]=S(0),R=ne(new Map),[z,B]=S(!1);b(n=>{if(!z){if(n===`/`){B(!0);return}if(n===`q`){d(),i(0);return}if(n===` `){M(e=>!e);return}if(n===`+`||n===`=`){F(e=>Math.min(1.6,e+.1));return}if(n===`-`||n===`_`){F(e=>Math.max(.7,e-.1));return}if(n===`t`){P(e=>(e+15)%60);return}if(n===`j`){L(e=>e+1);return}if(n===`k`){L(e=>Math.max(0,e-1));return}if(n===`o`||n===`O`||n===`w`){a(m(`globe`,{siteId:t}));return}if(n===`c`&&C){let e=C.countries[I];e?.lng!==void 0&&(A(-e.lng),M(!0));return}n===`r`&&(async()=>{try{let n=await Y(e,t,R.current);R.current=new Map(n.countries.map(e=>[e.code,e.visitors])),ie(n)}catch(e){O(e.message)}})()}}),ee(()=>{if(z)return;let n=!1,r=null,i=async()=>{try{let r=await Y(e,t,R.current);if(n)return;R.current=new Map(r.countries.map(e=>[e.code,e.visitors])),ie(r),E(!1)}catch(e){n||(O(e.message),E(!1))}n||(r=setTimeout(i,le))};return i(),()=>{n=!0,r&&clearTimeout(r)}},[e,t,z]),ee(()=>{if(j||z)return;let e=setInterval(()=>{A(e=>(e+de)%360)},ue);return()=>clearInterval(e)},[j,z]);let V=te(()=>{if(!C)return[];let e=[];for(let t of C.countries){if(typeof t.lat!=`number`||typeof t.lng!=`number`)continue;let n=Math.min(fe,Math.max(3,t.visitors*5));for(let r of ae(t.code,n))e.push({lat:r.lat,lng:r.lng,freshness:t.freshness})}return e},[C]),H=te(()=>{if(!C)return[];let e=C.countries[Math.min(I,C.countries.length-1)];return!e||typeof e.lat!=`number`?[]:ae(e.code,Math.min(80,Math.max(8,e.visitors*4)))},[C,I]),U=`globe · ${n} · live`,W=[{key:`q`,label:`quit`},{key:`j/k`,label:`select country`},{key:`c`,label:`center on selected`},{key:`space`,label:j?`resume`:`pause`},{key:`t`,label:`tilt ${N}°`},{key:`+/-`,label:`zoom`},{key:`o`,label:`open web globe`},{key:`r`,label:`refresh`},{key:`/`,label:`ask AI`}];if(z)return x.createElement(u,{cliVersion:r,api:e,dashboardContext:{commandName:`globe`,siteId:t,siteLabel:n,metricsSnapshot:C},onClose:()=>B(!1)});if(T)return x.createElement(g,{flexDirection:`column`},x.createElement(o,{version:r,subtitle:U}),x.createElement(s,{title:`Loading`,state:`busy`},x.createElement(g,null,x.createElement(_,{color:v.accent},x.createElement(re,{type:`dots`})),x.createElement(_,null,` Spinning up Earth…`))));if(D)return x.createElement(g,{flexDirection:`column`},x.createElement(o,{version:r,subtitle:U}),x.createElement(f,{reason:`error`,headline:`Failed to load`,hint:D}),x.createElement(l,{items:W}));if(!C||C.countries.length===0&&C.unknownCount===0)return x.createElement(g,{flexDirection:`column`},x.createElement(o,{version:r,subtitle:U}),x.createElement(f,{reason:`no-data`,headline:`No geolocated visitors yet`,hint:`Visit your site to populate the map.`}),x.createElement(l,{items:W}));let G=process.stdout.columns??100,K=36,q=Math.max(40,Math.min(90,G-K-4)),se=process.stdout.rows??40,J=Math.max(10,se-12),X=Math.round(q*oe),Z=Math.round(X*.5);Z>J&&(Z=J,X=Math.min(X,Math.round(J*2)));let Q=Math.max(4,Math.min(12,Z-1)),pe=C.countries.slice(0,Q),me=Math.max(1,...pe.map(e=>e.visitors)),he=Math.max(1,Math.floor((Date.now()-C.lastFetchedAt)/1e3)),$=C.countries[Math.min(I,C.countries.length-1)],ge=$?w($.code):null;return x.createElement(g,{flexDirection:`column`},x.createElement(o,{version:r,subtitle:U}),$?x.createElement(g,{flexDirection:`row`,marginBottom:1},x.createElement(g,{width:2}),x.createElement(g,{borderStyle:`round`,borderColor:v.warn,paddingX:1},x.createElement(_,{color:v.warn,bold:!0},ge?.name??$.code),x.createElement(_,{color:v.dim},` · `),x.createElement(_,{color:v.fg},$.visitors,` visitor`,$.visitors===1?``:`s`))):null,x.createElement(g,{flexDirection:`row`},x.createElement(g,{flexDirection:`column`,flexShrink:0,marginRight:2},x.createElement(ce,{visitors:V,highlight:H,width:X,height:Z,rotationDeg:k,tiltDeg:N}),x.createElement(g,{marginTop:1},x.createElement(_,{color:v.dim},C.totalVisitors,` visitors · `,C.countries.length,` countries`,C.unknownCount>0?` · ${C.unknownCount} unmapped`:``,` · `,j?`rotation paused`:`↻ ${de}°/${ue}ms`,` · refreshed `,he,`s ago`))),x.createElement(g,{flexDirection:`column`,flexShrink:0,width:K},x.createElement(s,{title:`Live by country`,width:K},pe.map((e,t)=>{let n=t===Math.min(I,C.countries.length-1),r=e.freshness>.7,i=n?v.warn:r?v.success:v.fg;return x.createElement(g,{key:e.code,flexDirection:`row`},x.createElement(g,{width:2},x.createElement(_,{color:v.warn},n?`›`:` `)),x.createElement(g,{width:3},x.createElement(_,{color:i,bold:n},e.code)),x.createElement(p,{value:e.visitors,max:me,width:14,showPercent:!1}),x.createElement(g,{width:6},x.createElement(_,{color:v.muted},String(e.visitors).padStart(5))))})),C.countries.length>Q?x.createElement(g,{marginTop:1},x.createElement(_,{color:v.muted},`+`,C.countries.length-Q,` more (j/k to scroll)`)):null)),x.createElement(l,{items:W}))};export{X as globeCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-DqKh6FgZ.js";import{requireTier as i}from"./tier-BneaO4vD.js";import{confirmDestructive as a}from"./confirm-DS5wux0g.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as o,wrapItem as s,wrapList as c}from"./emit-D4YlMlzk.js";function l(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}function u(e){return e?new Date(e).toISOString().slice(0,10):`—`}async function d(d){let f=await e(),p=await t({strict:!1}),m=new r({config:f,cliVersion:d.cliVersion,token:p});try{await i(m,`pro`)}catch(e){return n(e,{command:`goals ${d.action}`})}try{switch(d.action){case`list`:{let{goals:e}=await m.listGoals();if(d.json)return o(c(e,`goals.list`),{legacyKey:`goals`,legacyValue:e}),0;if(e.length===0)return process.stdout.write("No goals yet. Create one with `zenovay goals create --name <n> --type <pageview|event> --target <url-or-event>`.\n"),0;let t=[14,24,10,30,10],n=e=>e.map((e,n)=>(e??``).padEnd(t[n])).join(` `);process.stdout.write(`
|
|
2
2
|
`+n([`id`,`name`,`type`,`target`,`created`])+`
|
|
3
3
|
`),process.stdout.write(n(t.map(e=>`─`.repeat(e)))+`
|
|
4
4
|
`);for(let r of e)process.stdout.write(n([l(r.id),(r.name??``).slice(0,t[1]),r.type,(r.target??`—`).slice(0,t[3]),u(r.createdAt)])+`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Panel as e}from"./panel-CTtQ2ue6.js";import{Box as t}from"ink";import n from"react";function r(e,t,n){if(t<=1)return[Math.max(1,e)];let r=Math.max(t,e-n*(t-1)),i=Math.floor(r/t),a=Array.from({length:t},()=>i);return a[t-1]=r-i*(t-1),a}function i(e){return Math.max(4,e-4)}function a({totalWidth:a,panels:o,minColWidth:s=36,maxCols:c=3,gap:l=2}){if(o.length===0)return null;let u=Math.max(1,Math.floor((a+l)/(s+l))),d=Math.min(c,o.length,u),f=[];for(let e=0;e<o.length;e+=d)f.push(o.slice(e,e+d));return n.createElement(t,{flexDirection:`column`},f.map((o,c)=>{let u=r(a,o.length,l);return n.createElement(t,{key:c,flexDirection:`row`,width:a,marginTop:c>0?1:0},o.map((r,a)=>{let c=u[a]??s;return n.createElement(t,{key:r.key,width:c,flexShrink:0,marginRight:a<o.length-1?l:0},n.createElement(e,{title:r.title,width:c,...r.state?{state:r.state}:{}},r.render(i(c))))}))}))}export{a as ResponsiveGrid,i as panelInnerWidth,r as tileWidths};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{configPath as e,readConfig as t}from"./config--JRu_jFq.js";import{fetchManifest as n}from"./check-D9G0N7NB.js";import{ApiClient as r}from"./api-hWp9s3Y8.js";import{readToken as i}from"./token-store-BQuGH0z2.js";import{isHeadless as a}from"./emit-D4YlMlzk.js";import{Banner as o,Panel as s,usePanelWidth as c,useTheme as l}from"./panel-CTtQ2ue6.js";import{spawnSync as u}from"node:child_process";import d from"node:path";import{existsSync as f,promises as p,statSync as m}from"node:fs";import h from"node:os";import{Box as g,Text as _,render as v}from"ink";import y from"react";const b=6*60*60*1e3;function x(){return d.join(h.homedir(),`.zenovay`,`update.json`)}async function S(){try{let e=await p.readFile(x(),`utf8`);return JSON.parse(e)}catch{return null}}async function C(e){let t=x();await p.mkdir(d.dirname(t),{recursive:!0,mode:448}),await p.writeFile(t,JSON.stringify(e,null,2))}async function w(){let e=await t();if(e.noUpdateCheck||process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`)return null;let r=await S();if(r&&Date.now()-r.fetchedAt<b)return r;try{let t=await n({cliBase:e.cliBase}),i={manifest:t,fetchedAt:Date.now(),lastNoticeAt:r?.lastNoticeAt};return await C(i),i}catch{return r}}async function T(){try{await w()}catch{}process.exit(0)}process.env.ZENOVAY_UPDATE_WORKER_FORK===`1`&&T();function E(e){return e.includes(`/Cellar/`)||e.includes(`/opt/homebrew/`)||e.includes(`/usr/local/Cellar/`)?`brew`:e.includes(`.npm-global`)||e.includes(`node_modules/.bin`)||e.includes(`npm/bin`)?`npm-global`:e.endsWith(`/.local/bin/zenovay`)||e.endsWith(`\\.local\\bin\\zenovay.exe`)?`curl-installer`:e.includes(`/lib/node_modules/`)||e.includes(`\\nodejs\\`)?`npm-prefix`:`unknown`}function D(e){let t=process.platform===`win32`,n=t?`where`:`which`,r=t?[e]:[`-a`,e];try{let e=u(n,r,{encoding:`utf8`,timeout:3e3});if(e.status!==0||!e.stdout)return[];let t=e.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);return[...new Set(t)]}catch{return[]}}function O(e){let t=process.platform===`win32`,n=t?`;`:`:`,r=(process.env.PATH??``).split(n).filter(Boolean),i=t?[`.exe`,`.cmd`,``]:[``],a=[];for(let t of r)for(let n of i){let r=d.join(t,e+n);if(f(r))try{let e=m(r);e.isFile()&&a.push(r)}catch{}}return[...new Set(a)]}function k(e=`zenovay`){let t=D(e);t.length===0&&(t=O(e));let n=t.map(e=>({path:e,kind:E(e)})),r=t[0]??null;return{paths:t,active:r,kinds:n}}function A(e,t){if(e.paths.length<2)return``;let n=[];n.push(`Multiple zenovay binaries detected on PATH:`);for(let r of e.kinds){let i=r.path===e.active,a=t&&r.path===t,o=[i&&`(first on PATH)`,a&&`(currently running)`].filter(Boolean).join(` `);n.push(` • ${r.path} [${r.kind}] ${o}`)}n.push(``),n.push(`Pick one and uninstall the others to avoid version drift:`);let r=new Set(e.kinds.map(e=>e.kind));return r.has(`npm-global`)&&n.push(` npm uninstall -g @zenovay/cli # remove the npm-installed one`),r.has(`brew`)&&n.push(` brew uninstall zenovay # remove the Homebrew-installed one`),r.has(`curl-installer`)&&n.push(` rm ~/.local/bin/zenovay # remove the curl-installer one`),n.join(`
|
|
2
|
+
`)}const j=2e3,M=5e3;async function N(e,t){let n=`${e}/mcp`,r=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),j);try{let a=await t(n,{method:`GET`,signal:i.signal}),o=Date.now()-r;return a.ok?{name:`MCP server`,status:`pass`,detail:`${e}/mcp · ${o}ms`,latencyMs:o}:{name:`MCP server`,status:`fail`,detail:`HTTP ${a.status}`,latencyMs:o}}catch(e){return{name:`MCP server`,status:`fail`,detail:e.message}}finally{clearTimeout(a)}}async function P(){try{let t=await p.readFile(e(),`utf8`),n=JSON.parse(t),r=n.openaiApiKey;return typeof r==`string`&&r.trim().length>0?{name:`OpenAI key`,status:`pass`,detail:`configured`}:{name:`OpenAI key`,status:`warn`,detail:"not set (run `zenovay ai` to configure)"}}catch(e){return e.code===`ENOENT`?{name:`OpenAI key`,status:`warn`,detail:`no config file`}:{name:`OpenAI key`,status:`warn`,detail:`unreadable config`}}}async function F(){let e=h.homedir(),t=[d.join(e,`.zshrc`),d.join(e,`.bashrc`),d.join(e,`.config`,`fish`,`completions`,`zenovay.fish`)],n=[];for(let e of t)try{let t=await p.readFile(e,`utf8`);(/zenovay\s+(complet|--?complet)/i.test(t)||/_zenovay/.test(t)||/complete\s+-c\s+zenovay/.test(t))&&n.push(d.basename(e))}catch{}return n.length>0?{name:`Completions`,status:`pass`,detail:n.join(`, `)}:{name:`Completions`,status:`warn`,detail:"not installed (run `zenovay completions` after Wave 3)"}}async function I(e,t,n,r){if(!e||!t)return{name:`Events stream`,status:`skip`,detail:`not authenticated`};let i=new AbortController,a=setTimeout(()=>i.abort(),M),o=Date.now();try{let t=await e.openEventsStream(`probe`,i.signal),r=t.body?.getReader();if(r){let e=Promise.race([r.read().then(()=>`first`),new Promise(e=>setTimeout(()=>e(`timeout`),1500))]);await e;try{r.cancel()}catch{}}let a=Date.now()-o;return{name:`Events stream`,status:`pass`,detail:`${n}/v1/cli/events/tail · ${a}ms`,latencyMs:a}}catch(e){let t=e.message;return/40\d/.test(t)?{name:`Events stream`,status:`pass`,detail:`endpoint reachable (auth-gated)`}:{name:`Events stream`,status:`fail`,detail:t}}finally{clearTimeout(a)}}async function L(n){let a=n.fetchImpl??fetch,o=[],s=await t().catch(()=>null);o.push({name:`Binary`,status:`pass`,detail:`v${n.cliVersion} (${n.binaryPath})`});let c=k(`zenovay`);if(c.paths.length>=2){let e=c.kinds.map(e=>e.kind).join(` + `);o.push({name:`Install paths`,status:`warn`,detail:`${c.paths.length} binaries on PATH (${e}). Active: ${c.active}. Run \`zenovay doctor\` for cleanup.`})}else o.push({name:`Install paths`,status:`pass`,detail:c.active??`no zenovay on PATH`});o.push({name:`Config file`,status:s?`pass`:`warn`,detail:e()});let l=await i({strict:!1}).catch(()=>null);o.push({name:`Auth`,status:l?`pass`:`fail`,detail:l?`logged in${l.email?` as ${l.email}`:``}`:`not logged in`});let u=null;if(s)try{u=new r({config:s,cliVersion:n.cliVersion,token:l,fetchImpl:a});let e=await u.ping();o.push({name:`API connection`,status:`pass`,detail:`${s.apiBase.replace(/^https?:\/\//,``)} · ${e.latencyMs}ms`,latencyMs:e.latencyMs})}catch(e){o.push({name:`API connection`,status:`fail`,detail:`${e.message}`})}let d=await S().catch(()=>null);o.push({name:`Auto-update`,status:s?.noUpdateCheck?`warn`:`pass`,detail:s?.noUpdateCheck?`disabled`:d?`latest=${d.manifest.latest}`:`manifest not yet fetched`});let f=s?.apiBase??`https://api.zenovay.com`;return o.push(await N(f,a)),o.push(await P()),o.push(await F()),o.push(await I(u,!!l,f,a)),o}function R(e){return e.some(e=>e.status===`fail`)?1:0}async function z(e){let t=await L(e),n=R(t),r=n===0;return a({json:e.json})?(process.stdout.write(`${JSON.stringify({checks:t,passed:r})}\n`),n):new Promise(r=>{let{unmount:i}=v(y.createElement(V,{checks:t,cliVersion:e.cliVersion}),{exitOnCtrlC:!0});setImmediate(()=>{i(),r(n)})})}const B=({check:e})=>{let{theme:t}=l(),n=c()??80,r=Math.max(8,n-21);return y.createElement(g,{flexDirection:`row`},y.createElement(g,{flexShrink:0},y.createElement(_,{color:U(t,e.status)},H(e.status))),y.createElement(g,{width:19,marginLeft:1,flexShrink:0},y.createElement(_,{color:t.fg,wrap:`truncate`},e.name)),y.createElement(g,{width:r,flexShrink:0},y.createElement(_,{color:t.muted,wrap:`truncate`},e.detail)))},V=({checks:e,cliVersion:t})=>{let{theme:n}=l(),r=e.filter(e=>e.status===`fail`).length,i=e.filter(e=>e.status===`warn`).length,a=r>0?n.error:i>0?n.warn:n.success,c=r>0?`${r} failed${i>0?`, ${i} warning${i===1?``:`s`}`:``}`:i>0?`all healthy · ${i} warning${i===1?``:`s`}`:`all checks passed`,u=r>0?`err`:i>0?`warn`:`ok`;return y.createElement(g,{flexDirection:`column`},t?y.createElement(o,{version:t,subtitle:`health · self-diagnostic`,live:r===0}):null,y.createElement(s,{title:`Zenovay CLI health check`,state:u},e.map(e=>y.createElement(B,{key:e.name,check:e})),y.createElement(g,{marginTop:1},y.createElement(_,{color:a,bold:!0},H(r>0?`fail`:i>0?`warn`:`pass`),` `),y.createElement(_,{color:a},c))))};function H(e){return e===`pass`?`✔`:e===`warn`?`⚠`:e===`skip`?`∼`:`✗`}function U(e,t){return t===`pass`?e.success:t===`warn`?e.warn:t===`skip`?e.dim:e.error}export{V as HealthReport,k as detectInstallPaths,R as exitCodeFor,z as healthCommand,A as remediationHint,L as runHealthChecks};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./config--JRu_jFq.js";import"./check-D9G0N7NB.js";import"./api-hWp9s3Y8.js";import"./token-store-BQuGH0z2.js";import"./formatter-
|
|
1
|
+
import"./config--JRu_jFq.js";import"./check-D9G0N7NB.js";import"./api-hWp9s3Y8.js";import"./token-store-BQuGH0z2.js";import"./formatter-C4YSOKuq.js";import"./emit-D4YlMlzk.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-D26VB-iZ.js";export{n as healthCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{requireTier as r}from"./tier-BneaO4vD.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BLrtFOyW.js";import{fmtDate as f,stripUrlPrefix as p}from"./fmt-xxIPQJX-.js";import{DataTable as m}from"./data-table-BhKjjiOS.js";import{EmptyState as h}from"./empty-state-D-krMX62.js";import{deepLinkFor as g}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as _}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as v}from"./site-switcher-D_JBKFaR.js";import{Box as y,Text as b,render as x,useApp as S,useInput as C}from"ink";import w,{useEffect as T,useState as E}from"react";import D from"ink-spinner";function O(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function k(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await d(l,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(a(o)){let e=await l.getHeatmaps(u);return i({type:`heatmaps.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=x(w.createElement(A,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const A=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{_();let{exit:a}=S(),{theme:d}=l(),[x,k]=E(null),[A,j]=E(!0),[M,N]=E(null),[P,F]=E(0),[I,L]=E(!1),[R,z]=E(null),[B,V]=E(()=>Date.now()),[H,U]=E(t),[W,G]=E(n),K=v(e,H,e=>{U(e.id),G(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),k(null)}),q=[{key:`r`,label:`refresh`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}];if(C((e,t)=>{if(K.open){(t.escape||e===`s`)&&K.close();return}if(e===`r`||e===`R`){F(e=>e+1);return}if(e===`s`){K.toggle();return}if(e===`o`||e===`O`){o(g(`heatmaps`,{siteId:H}));return}e===`q`&&(a(),i(0))}),T(()=>{let e=setInterval(()=>V(Date.now()),5e3);return()=>clearInterval(e)},[]),T(()=>{let t=!1;return x===null?j(!0):L(!0),(async()=>{try{let n=await e.getHeatmaps(H);if(t)return;k(n),j(!1),L(!1),z(Date.now())}catch(e){t||(N(e.message),j(!1),L(!1))}})(),()=>{t=!0}},[e,H,P]),A)return w.createElement(y,{flexDirection:`column`},w.createElement(s,{version:r,subtitle:`heatmaps · ${W}`,live:!1}),w.createElement(c,{title:`Loading`,state:`busy`},w.createElement(y,null,w.createElement(b,{color:d.accent},w.createElement(D,{type:`dots`})),w.createElement(b,null,` Fetching heatmaps…`))));if(M)return w.createElement(y,{flexDirection:`column`},w.createElement(s,{version:r,subtitle:`heatmaps · ${W}`,live:!1}),w.createElement(h,{reason:`error`,headline:`Couldn't load heatmaps`,hint:M}),w.createElement(u,{items:q,active:`r`}));if(!x||x.length===0)return w.createElement(y,{flexDirection:`column`},w.createElement(s,{version:r,subtitle:`heatmaps · ${W}`,live:!1}),w.createElement(h,{reason:`no-data`,headline:`No heatmaps yet`,hint:`Enable heatmaps in your site settings, press [s] to switch site, then re-run once a page has traffic.`}),K.overlay,w.createElement(u,{items:q,active:`r`}));let J=[{key:`url`,label:`page`,width:36,format:e=>p(String(e??``))},{key:`type`,label:`type`,width:10},{key:`captureCount`,label:`captures`,align:`right`,width:9},{key:`createdAt`,label:`first seen`,width:14,format:e=>f(e,`date`)}],Y=process.stdout.rows??40,X=Math.max(4,Y-14),Z=x.slice(0,X),Q=x.length-Z.length;return w.createElement(y,{flexDirection:`column`},w.createElement(s,{version:r,subtitle:`heatmaps · ${W}`,live:!0}),w.createElement(y,{marginTop:1},w.createElement(c,{title:`Heatmaps (${x.length})`},w.createElement(m,{columns:J,data:Z,zebra:!0}),Q>0?w.createElement(b,{color:d.dim},` +${Q} more · run with --json for all`):null)),w.createElement(y,{marginTop:1},w.createElement(b,{color:d.dim},I?`↻ refreshing…`:R===null?``:`↻ updated ${O(R,B)} · [r] refresh`)),K.overlay,w.createElement(u,{items:q,active:`r`}))};export{k as heatmapsCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import"./formatter-C4YSOKuq.js";import{isHeadless as r}from"./emit-D4YlMlzk.js";import{openInBrowser as i}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as a,Panel as o,useTheme as s}from"./panel-CTtQ2ue6.js";import{Keybar as c}from"./keybar-DO5OoZy9.js";import"./sparkline-CpoBjjlc.js";import{DataTable as l}from"./data-table-BhKjjiOS.js";import{EmptyState as u}from"./empty-state-D-krMX62.js";import{tileWidths as d}from"./grid-CMwhs-Ms.js";import{MetricCard as f}from"./metric-card-C4iqxdww.js";import{deepLinkFor as p}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as m}from"./use-fullscreen-ucSyZkjO.js";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useState as S}from"react";import C from"ink-spinner";function w(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toISOString().slice(0,10)}function T(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function E(e){let t=await e.me().catch(()=>null),n=t?.user.name?.trim()||t?.user.email||`you`,r=await e.getSites().catch(()=>[]),i=r.map(e=>({id:e.id,name:e.name,domain:e.url.replace(/^https?:\/\//,``).replace(/\/$/,``),lastActive:e.lastActiveAt??null})),a={visitors:0,pageviews:0,visitorsDelta:null,visitorsSeries:[],pageviewsSeries:[]},o=[0,0,0,0,0,0,0],s=[0,0,0,0,0,0,0],c=0,l=0,u=!1;if(r.length>0){let t=await Promise.all(r.map(t=>e.getStats(t.id,`30d`).catch(()=>null)));for(let e of t){let t=e?.daily??[];if(t.length===0)continue;let n=t.slice(-7);for(let e=0;e<n.length;e++){let t=7-n.length+e;o[t]+=n[e].visitors,s[t]+=n[e].pageviews,c+=n[e].visitors}if(t.length>=14){u=!0;let e=t.slice(-14,-7);for(let t of e)l+=t.visitors}}a.visitors=c,a.pageviews=s.reduce((e,t)=>e+t,0),a.visitorsSeries=o,a.pageviewsSeries=s,u&&l>0&&(a.visitorsDelta=(c-l)/l)}let d=r.length===0?``:r.length===1?i[0].domain:`all ${r.length} sites`;return{sites:i,weekly:a,weeklyScope:d,userLabel:n}}async function D(i){let a=await e(),o=await t({strict:!1});if(!o)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new n({config:a,cliVersion:i.cliVersion,token:o});if(r(i))try{let e=await E(s);return process.stdout.write(JSON.stringify({sites:e.sites,weeklyScope:e.weeklyScope,weekly:{visitors:e.weekly.visitors,pageviews:e.weekly.pageviews,visitorsDelta:e.weekly.visitorsDelta}},null,2)+`
|
|
2
|
+
`),0}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}return new Promise(e=>{let{unmount:t}=_(b.createElement(O,{api:s,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const O=({api:e,cliVersion:t,onExit:n})=>{m();let{exit:r}=v(),{theme:_}=s(),[D,O]=S(null),[k,A]=S(!0),[j,M]=S(null),[N,P]=S(!1),[F,I]=S(null),[L,R]=S(()=>Date.now()),[z,B]=S(0);x(()=>{let e=setInterval(()=>R(Date.now()),5e3),t=setInterval(()=>B(e=>e+1),3e4);return()=>{clearInterval(e),clearInterval(t)}},[]),y(e=>{if(e===`q`){r(),n(0);return}if(e===`r`||e===`R`){B(e=>e+1);return}if(e===`o`||e===`O`){i(p(`home`));return}}),x(()=>{let t=!1;return D===null?A(!0):P(!0),(async()=>{try{let n=await E(e);t||(O(n),A(!1),P(!1),I(Date.now()))}catch(e){t||(M(e.message),A(!1),P(!1))}})(),()=>{t=!0}},[e,z]);let V=`home · ${D?.userLabel??`…`}`,H=[{key:`r`,label:`refresh`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}];if(k)return b.createElement(h,{flexDirection:`column`},b.createElement(a,{version:t,subtitle:V,live:!1}),b.createElement(o,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:_.accent},b.createElement(C,{type:`dots`})),b.createElement(g,null,` Fetching your home dashboard…`))));if(j)return b.createElement(h,{flexDirection:`column`},b.createElement(a,{version:t,subtitle:V,live:!1}),b.createElement(u,{reason:`error`,headline:`Failed to load`,hint:j}),b.createElement(c,{items:H,active:`r`}));if(!D)return b.createElement(h,{flexDirection:`column`},b.createElement(a,{version:t,subtitle:V,live:!1}),b.createElement(u,{reason:`no-data`,headline:`No data`}),b.createElement(c,{items:H,active:`r`}));let U=process.stdout.columns??80,W=d(U,2,2),G=process.stdout.rows??40,K=Math.max(4,G-18),q=Math.max(3,Math.min(14,K)),J=[{key:`name`,label:`site`,width:24},{key:`domain`,label:`domain`,width:32},{key:`lastActive`,label:`last active`,width:12,format:e=>w(e)}],Y=D.weekly.visitors>0||D.weekly.pageviews>0,X=D.weeklyScope?`This week · ${D.weeklyScope}`:`This week`;return b.createElement(h,{flexDirection:`column`},b.createElement(a,{version:t,subtitle:V,live:Y}),b.createElement(h,{marginTop:1},b.createElement(g,{color:_.typography.label.color,dimColor:_.typography.label.dim},X.toUpperCase())),b.createElement(h,{flexDirection:`row`,width:U},b.createElement(h,{flexShrink:0},b.createElement(f,{title:`Visitors`,value:D.weekly.visitors,format:`number`,width:W[0],gap:2,series:D.weekly.visitorsSeries,delta:D.weekly.visitorsDelta??void 0})),b.createElement(h,{flexShrink:0},b.createElement(f,{title:`Pageviews`,value:D.weekly.pageviews,format:`number`,width:W[1],gap:2,series:D.weekly.pageviewsSeries}))),b.createElement(h,{marginTop:1},b.createElement(o,{title:`Your sites (${D.sites.length})`},D.sites.length===0?b.createElement(g,{color:_.muted},"No sites yet — run `zenovay init` to add one."):b.createElement(b.Fragment,null,b.createElement(l,{columns:J,data:D.sites.slice(0,q),zebra:!0}),D.sites.length>q?b.createElement(g,{color:_.dim},` +${D.sites.length-q} more`):null))),b.createElement(h,{marginTop:1},b.createElement(g,{color:_.dim},N?`↻ refreshing…`:F===null?``:`↻ updated ${T(F,L)} · [r] refresh`)),b.createElement(c,{items:H,active:`r`}))};export{D as homeCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import"./token-store-BQuGH0z2.js";import{initCommand as e}from"./init-Cee2-8Kd.js";import"./formatter-C4YSOKuq.js";import"./emit-D4YlMlzk.js";import"./open-url-BtI5aLgL.js";import"./secrets-ApB7yh2A.js";import"./client-ntsEXSVC.js";import"./login-CsQ7fPVu.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./sparkline-CpoBjjlc.js";export{e as initCommand};
|