@zenovay/cli 0.1.22 → 0.1.24
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-DAoX3ia1.js +11 -0
- package/dist/ai-CBcz7gVp.js +11 -0
- package/dist/{analytical-screen-DlNffR1j.js → analytical-screen-B4KwZvWt.js} +1 -1
- package/dist/analytics-CuvSsCi8.js +1 -0
- package/dist/api-keys-BSBJExQx.js +10 -0
- package/dist/api-v2-CfJ_2Z5N.js +1 -0
- package/dist/banner-BPQh2F8l.js +1 -0
- package/dist/bar-C9stEeJd.js +1 -0
- package/dist/bin.js +2 -2
- package/dist/companies-Dej3am51.js +2 -0
- package/dist/confirm-D_aKHknn.js +1 -0
- package/dist/{data-table-EsLUu8Hj.js → data-table-BVWqHy9m.js} +1 -1
- package/dist/deploys-BvO4FZ5h.js +2 -0
- package/dist/devices-DvHjJ1vj.js +1 -0
- package/dist/{doctor-C42TUuU1.js → doctor-DGINy0u2.js} +1 -1
- package/dist/domains-CJJb5eY3.js +4 -0
- package/dist/{emit-BmfLGjqr.js → emit-D7VCOSNk.js} +1 -1
- package/dist/{empty-state-ETu78blH.js → empty-state-Dkho-_3J.js} +1 -1
- package/dist/errors-DUGYxRbL.js +2 -0
- package/dist/{events-tail-Cytm6gdG.js → events-tail-5rwtRF4X.js} +1 -1
- package/dist/funnel-BS7ffNz8.js +3 -0
- package/dist/geo-DYK3YeQM.js +1 -0
- package/dist/goals-D9UeMtcm.js +10 -0
- package/dist/health-gixkqsPr.js +1 -0
- package/dist/{health-T70yG5po.js → health-oHQqxSl8.js} +1 -1
- package/dist/heatmaps-6elfFwGW.js +1 -0
- package/dist/home-rcPngoZx.js +2 -0
- package/dist/{init-3WrfX1Fb.js → init-BAvyI5n6.js} +3 -3
- package/dist/init-Bmp-Yrah.js +1 -0
- package/dist/insights-DKMGpJhD.js +1 -0
- package/dist/integrations-BQIqUYBX.js +10 -0
- package/dist/journeys-DZv7-dFm.js +1 -0
- package/dist/{keybar-DO-sCbJB.js → keybar-C7YkmK1U.js} +1 -1
- package/dist/live-BDP8RD7K.js +1 -0
- package/dist/login-Bo0VXzkT.js +1 -0
- package/dist/{login-DvMRHd3J.js → login-DWaz_EsV.js} +1 -1
- package/dist/{logout-B3V_2DRZ.js → logout-DV5SjEL4.js} +1 -1
- package/dist/{metric-card-CtAoTOEP.js → metric-card-BfVg5VG6.js} +1 -1
- package/dist/notes-Lk4Z4uT0.js +10 -0
- package/dist/pages-CBgdpzq_.js +1 -0
- package/dist/plans-0x-Zd6RV.js +7 -0
- package/dist/profile-BpjuwmG1.js +4 -0
- package/dist/{progress-row-CeP9YRKn.js → progress-row-DFOvHAc5.js} +1 -1
- package/dist/projects-7nUulyES.js +1 -0
- package/dist/projects-Cz7V3Yr9.js +2 -0
- package/dist/prompt-BURfUNxp.js +1 -0
- package/dist/query-D5KYlF3a.js +8 -0
- package/dist/{resolve-site-CKq90Xzu.js → resolve-site-D3e1i32Z.js} +1 -1
- package/dist/retention-BQVRtm1F.js +1 -0
- package/dist/revenue-C9ZiFyIZ.js +2 -0
- package/dist/sessions-BIrSllDo.js +1 -0
- package/dist/settings-CF7Bh7LX.js +4 -0
- package/dist/sources-BQQlIRsz.js +2 -0
- package/dist/stats-DRXUx_G5.js +2 -0
- package/dist/team-GCfHAd8i.js +15 -0
- package/dist/themes-M5zvyaJT.js +4 -0
- package/dist/{ui-BLnL2HSo.js → ui-oBd4Xpw5.js} +1 -1
- package/dist/{update-wMGBdUT-.js → update-DayeuoQd.js} +1 -1
- package/dist/uptime-BL5nXfbf.js +1 -0
- package/dist/{use-DsHE5Eu7.js → use-BvDJ2P2x.js} +1 -1
- package/dist/visitors-2EM5Ft4d.js +2 -0
- package/dist/vitals-DfCohk_c.js +2 -0
- package/dist/watch-CL5zAa_r.js +1 -0
- package/dist/webhooks-forward-C1uJH_7w.js +3 -0
- package/dist/wizard-bin.js +1 -1
- package/package.json +1 -1
- package/dist/ai-DGIoZ2aO.js +0 -11
- package/dist/api-v2-C7yrqNuV.js +0 -1
- package/dist/companies-D30bvUbA.js +0 -2
- package/dist/deploys-CMVAZp4i.js +0 -2
- package/dist/devices-yq4dh7UD.js +0 -1
- package/dist/errors-BlVWrZ86.js +0 -2
- package/dist/funnel-B7yQXVJa.js +0 -3
- package/dist/geo-BqtzfNwp.js +0 -1
- package/dist/health-DOOluwxM.js +0 -1
- package/dist/heatmaps-DtbYa2K3.js +0 -1
- package/dist/init-4dY3jNh8.js +0 -1
- package/dist/insights-C0xGkTYG.js +0 -1
- package/dist/journeys-Bx08wXVO.js +0 -1
- package/dist/live-BGdMxOZ_.js +0 -1
- package/dist/login-Bb_At1Ov.js +0 -1
- package/dist/overview-BieuspgD.js +0 -1
- package/dist/pages-DXpXKnCy.js +0 -1
- package/dist/projects-DKQeDin5.js +0 -2
- package/dist/prompt-CIl9JOlh.js +0 -1
- package/dist/query-B88NMsPY.js +0 -8
- package/dist/retention-C75M6nUk.js +0 -1
- package/dist/revenue-Dsy6ODmG.js +0 -2
- package/dist/sessions-FXL5fAGa.js +0 -1
- package/dist/sources-DkEkhs1V.js +0 -2
- package/dist/stats-B4iRNAEW.js +0 -2
- package/dist/themes-DxPebZga.js +0 -4
- package/dist/uptime-DMK_yhMW.js +0 -1
- package/dist/vitals-pqv_u431.js +0 -2
- package/dist/watch-CbehE_bK.js +0 -1
- package/dist/webhooks-forward-C7gK3C6A.js +0 -3
- /package/dist/{client-vixcHdv-.js → client-WzSy90dG.js} +0 -0
- /package/dist/{completions-CnHbpLqp.js → completions-CNQoXN6L.js} +0 -0
- /package/dist/{formatter-BNYzdX5c.js → formatter-mW0Yk3Nt.js} +0 -0
- /package/dist/{globe-1bi4DjwJ.js → globe-DImE1nyh.js} +0 -0
- /package/dist/{panel-Crm-x-5U.js → panel-uygscwY5.js} +0 -0
- /package/dist/{sparkline-ut0Tvv-E.js → sparkline-Bkfzqe4x.js} +0 -0
- /package/dist/{tier-DJvWU86k.js → tier-RjOGNzda.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config-CZ9IzjIH.js";import{ApiClient as n,readToken as r}from"./api-DXmhz2DM.js";import"./panel-
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config-CZ9IzjIH.js";import{ApiClient as n,readToken as r}from"./api-DXmhz2DM.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import{resolveSiteId as i}from"./resolve-site-D3e1i32Z.js";async function a(a){if(a.reset)return await t({defaultSiteId:void 0,defaultSiteName:void 0}),process.stdout.write(`Default site cleared.
|
|
2
2
|
`),0;if(a.show){let t=await e();return t.defaultSiteId?process.stdout.write(a.json?`${JSON.stringify({defaultSiteId:t.defaultSiteId,defaultSiteName:t.defaultSiteName??null})}\n`:`Default site: ${t.defaultSiteName??t.defaultSiteId} (${t.defaultSiteId})\n`):process.stdout.write(a.json?`{"defaultSiteId":null}
|
|
3
3
|
`:`No default site set.
|
|
4
4
|
`),0}let s=await e(),c=await r({strict:!1});if(!c&&!process.env.ZENOVAY_API_TOKEN)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:a.cliVersion,token:c});if(a.match&&a.match.trim()){let e=a.match.trim().toLowerCase(),n=await l.getSites(),r=n.find(e=>e.id===a.match||e.trackingCode===a.match||e.url===a.match),i=r??n.find(t=>o(t.url).includes(e)||t.name.toLowerCase().includes(e));return i?(await t({defaultSiteId:i.id,defaultSiteName:i.name}),process.stdout.write(`Default site → ${i.name} (${i.url})\n`),0):(process.stderr.write(`No site matched "${a.match}". Your sites:\n${n.map(e=>` ${e.name} — ${e.url} — ${e.id}`).join(`
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{ApiV2Client as n}from"./api-v2-CfJ_2Z5N.js";import{formatTabular as r,selectFormat as i}from"./formatter-mW0Yk3Nt.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./progress-row-DFOvHAc5.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import{spark as a}from"./sparkline-Bkfzqe4x.js";import{resolveSiteId as o}from"./resolve-site-D3e1i32Z.js";import"./bar-C9stEeJd.js";import{runAnalyticalScreen as s}from"./analytical-screen-B4KwZvWt.js";import{Table as c}from"./ui-oBd4Xpw5.js";import{Box as l,Text as u}from"ink";import d from"react";function f(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 p(p){let m=await e(),h=await t({strict:!1}),g=new n({config:m,cliVersion:p.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(p),b=p.limit??50,x=[{key:`startedAt`,header:`when`,width:6,format:e=>f(String(e))},{key:`country`,header:`country`,width:7,format:e=>String(e??`—`)},{key:`city`,header:`city`,width:14,format:e=>String(e??`—`)},{key:`device`,header:`device`,width:7,format:e=>String(e??`—`)},{key:`page`,header:`page`,width:26,format:e=>String(e??`—`)},{key:`aiScore`,header:`score`,width:5,align:`right`,format:e=>typeof e==`number`?String(Math.round(e)):`—`}];return s({cliVersion:p.cliVersion,title:`visitors · ${_}`,commandName:`visitors`,authToken:h?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>g.getVisitors(_,{limit:b},e),format:y,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}let n=[`startedAt`,`country`,`city`,`device`,`page`,`aiScore`];process.stdout.write(r(e.visitors,n,t))},panels:[{id:`live`,title:`Now`,render:e=>{let t=[...e.visitors].sort((e,t)=>(t.aiScore??0)-(e.aiScore??0)),n=t[0],r=Array(24*6).fill(0),i=Date.now();for(let t of e.visitors){let e=i-new Date(t.startedAt).getTime(),n=Math.floor(e/(10*60*1e3));n>=0&&n<r.length&&(r[r.length-1-n]+=1)}return d.createElement(l,{flexDirection:`column`},d.createElement(u,{bold:!0},e.total,` live`),d.createElement(u,{color:`gray`},a(r,40)),n?d.createElement(u,{color:`gray`},`top: `,n.city??n.country??`—`,` · `,n.page??`—`,` (score`,` `,typeof n.aiScore==`number`?Math.round(n.aiScore):`—`,`)`):null)}},{id:`visitors`,title:`Active sessions`,render:e=>{let t=[...e.visitors].sort((e,t)=>(t.aiScore??0)-(e.aiScore??0)).slice(0,b);return t.length===0?d.createElement(u,{color:`gray`},`— no visitors yet —`):d.createElement(c,{columns:x,data:t})}}]})}export{p as visitorsCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{ApiV2Client as n}from"./api-v2-CfJ_2Z5N.js";import{formatTabular as r,selectFormat as i}from"./formatter-mW0Yk3Nt.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./progress-row-DFOvHAc5.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import"./sparkline-Bkfzqe4x.js";import{resolveSiteId as a}from"./resolve-site-D3e1i32Z.js";import"./bar-C9stEeJd.js";import{runAnalyticalScreen as o}from"./analytical-screen-B4KwZvWt.js";import{Table as s}from"./ui-oBd4Xpw5.js";import{Box as c,Text as l}from"ink";import u from"react";const d={lcp:{good:2500,poor:4e3},inp:{good:200,poor:500},cls:{good:.1,poor:.25},ttfb:{good:800,poor:1800},fcp:{good:1800,poor:3e3}};function f(e,t){let n=d[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function p(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function m(d){let m=await e(),h=await t({strict:!1}),g=new n({config:m,cliVersion:d.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await a(g,{explicit:d.siteId,headless:!!(d.json||d.csv||d.tsv||d.ndjson),cliVersion:d.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(d),b=[{key:`url`,header:`url`,width:32},{key:`device`,header:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,header:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`lcp`,e.p75):`—`},{key:`inp`,header:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`inp`,e.p75):`—`},{key:`cls`,header:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`cls`,e.p75):`—`},{key:`samples`,header:`n`,width:6,align:`right`}];return o({cliVersion:d.cliVersion,title:`vitals · ${_}`,commandName:`vitals`,authToken:h?.accessToken??null,refreshIntervalMs:d.watch?5*6e4:0,fetcher:e=>g.getVitals(_,{url:d.url,device:d.device,window:d.window},e),format:y,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.vitals,[`url`,`device`,`samples`],t))},panels:[{id:`summary`,title:`Site-wide p75`,render:e=>{let t=t=>{let n=0,r=0;for(let i of e.vitals){let e=i[t]?.p75;typeof e==`number`&&(n+=e*i.samples,r+=i.samples)}return r>0?n/r:0},n=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return u.createElement(c,{flexDirection:`column`},n.map(e=>{let n=t(e),r=f(e,n);return u.createElement(l,{key:e},u.createElement(l,{color:r.color},`● `),u.createElement(l,{bold:!0},e.toUpperCase().padEnd(5)),` `,u.createElement(l,null,p(e,n).padStart(8)),` `,u.createElement(l,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?u.createElement(l,{color:`gray`},`— no vitals data yet —`):u.createElement(s,{data:e.vitals.slice(0,15),columns:b})}]})}export{m as vitalsCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{ApiV2Client as n}from"./api-v2-CfJ_2Z5N.js";import{parseSseStream as r}from"./client-WzSy90dG.js";import"./formatter-mW0Yk3Nt.js";import{emit as i,isHeadless as a}from"./emit-D7VCOSNk.js";import{Panel as o}from"./panel-uygscwY5.js";import{Banner as s}from"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import{Keybar as c}from"./keybar-C7YkmK1U.js";import{spark as l}from"./sparkline-Bkfzqe4x.js";import{resolveSiteId as u}from"./resolve-site-D3e1i32Z.js";import{EmptyState as d}from"./empty-state-Dkho-_3J.js";import{Globe as f}from"./globe-DImE1nyh.js";import{z as p}from"zod";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";import C from"ink-text-input";const w=p.object({siteId:p.string().optional(),window:p.string().optional(),totalVisitors:p.number().optional(),visitors:p.object({count:p.number().optional(),series:p.array(p.number()).optional()}).optional(),topPages:p.array(p.object({path:p.string(),views:p.number().optional(),count:p.number().optional()})).optional(),sources:p.array(p.object({source:p.string(),visitors:p.number()})).optional()}).passthrough();async function T(r){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:r.cliVersion,token:s}),l;try{({siteId:l}=await u(c,{explicit:r.siteId,headless:!!r.json,cliVersion:r.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(a(r)){let e=await c.getDashboardSnapshot(l);return i({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:c,siteId:l,intervalMs:r.intervalMs??15e3,cliVersion:r.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,intervalMs:n,cliVersion:i,onExit:a})=>{let{exit:l}=_(),[u,p]=x(null),[g,C]=x(null),[T,E]=x(null),[P,F]=x([]),[I,L]=x(!0),[R,z]=x(null),[B,V]=x(1),[H,U]=x(!1),[W,G]=x(!1);v((e,t)=>{if(e===`q`){l(),a(0);return}if(e===`?`||e===`/`){G(e=>!e);return}if(e===`g`){U(e=>!e);return}if(t.tab){V(e=>{let n=t.shift?(e+4)%6+1:e%6+1;return n});return}(e===`1`||e===`2`||e===`3`||e===`4`||e===`5`||e===`6`)&&V(Number(e))});let[K,q]=x(!1);if(b(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=w.safeParse(n);if(!i.success){q(!0),L(!1);return}q(!1);let a=i.data,o={visitors:a.visitors??(typeof a.totalVisitors==`number`?{count:a.totalVisitors}:void 0),topPages:a.topPages?.map(e=>({path:e.path,views:e.views??e.count??0})),sources:a.sources};p(o),e.getVitals(t).then(e=>{r||C(e)},()=>{}),e.getGoals(t).then(e=>{r||E(e)},()=>{}),L(!1),z(null)}catch(e){r||z(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),b(()=>{let n=new AbortController;return(async()=>{try{let i=await e.openEventsStream(t,n.signal);for await(let e of r(i))e.type===`error`&&F(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),I)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching snapshot…`))));if(R&&!u)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}`}),y.createElement(o,{title:`Error`,state:`err`},y.createElement(h,{color:`red`},R)));if(K&&!u)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}`}),y.createElement(d,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let J=process.stdout.columns??80,Y=Math.max(20,Math.floor(J/3)-1),X=[];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}${H?` · globe`:``}`}),y.createElement(m,{flexDirection:`row`},y.createElement(m,{flexDirection:`column`},H?y.createElement(o,{title:`Live globe`,focused:B===1,width:Y},y.createElement(f,{data:X,width:Math.max(40,Y-4),height:12})):y.createElement(O,{snapshot:u,focused:B===1,width:Y}),y.createElement(j,{events:P,focused:B===4,width:Y})),y.createElement(m,{flexDirection:`column`},y.createElement(k,{snapshot:u,focused:B===2,width:Y}),y.createElement(M,{vitals:g,focused:B===5,width:Y})),y.createElement(m,{flexDirection:`column`},y.createElement(A,{snapshot:u,focused:B===3,width:Y}),y.createElement(N,{goals:T,focused:B===6,width:Y}))),W?y.createElement(D,{api:e,siteId:t,width:J-2}):null,y.createElement(c,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:H?`panels`:`globe`},{key:`?/`,label:W?`close chat`:`ai chat`},{key:`q`,label:`quit`}]}))},D=({api:e,siteId:t,width:n})=>{let[i,a]=x(``),[s,c]=x([]),[l,u]=x(!1),[d,f]=x(``),[p,g]=x(null),_=async n=>{let i=n.trim();if(!i||l)return;g(null),a(``);let o=[...s,{role:`user`,content:i}];c(o),u(!0),f(``);try{let n=o.map(e=>({role:e.role,content:e.content})),i=await e.openAiStream(`chat`,{messages:n,siteId:t},void 0),a=``;for await(let e of r(i))if(e.type===`delta`)a+=e.content,f(a);else if(e.type===`error`)g(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...o,{role:`assistant`,content:a}]),f(``)}catch(e){g(e instanceof Error?e.message:`chat failed`)}finally{u(!1)}};return y.createElement(m,{marginTop:1},y.createElement(o,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},y.createElement(m,{flexDirection:`column`},s.slice(-6).map((e,t)=>y.createElement(m,{key:t,flexDirection:`column`,marginBottom:1},y.createElement(h,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),y.createElement(h,null,e.content))),l&&d?y.createElement(m,{flexDirection:`column`,marginBottom:1},y.createElement(h,{color:`magenta`,bold:!0},`zenovay`),y.createElement(h,null,d)):null,p?y.createElement(h,{color:`red`},`✗ `,p):null,y.createElement(m,null,y.createElement(h,{color:`cyan`},l?`⠋ `:`▸ `),y.createElement(C,{value:i,onChange:a,onSubmit:_,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},O=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return y.createElement(o,{title:`Visitors`,focused:t,width:n},y.createElement(h,{bold:!0},r.toString()),y.createElement(h,{color:`gray`},i.length>0?l(i,Math.max(8,n-6)):`— no data —`))},k=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return y.createElement(o,{title:`Top pages`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.path},y.createElement(h,null,e.path.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.views))))},A=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return y.createElement(o,{title:`Sources`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.source},y.createElement(h,null,e.source.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.visitors))))},j=({events:e,focused:t,width:n})=>y.createElement(o,{title:`Events`,focused:t,width:n},e.length===0?y.createElement(h,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>y.createElement(h,{key:t},e.slice(0,n-4)))),M=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>y.createElement(m,{key:e},y.createElement(h,{bold:!0},e.padEnd(6)),y.createElement(h,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return y.createElement(o,{title:`Vitals`,focused:t,width:n},r(`LCP`,e?.lcpP75,`ms`),r(`INP`,e?.inpP75,`ms`),r(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),r(`TTFB`,e?.ttfbP75,`ms`),r(`FCP`,e?.fcpP75,`ms`))},N=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return y.createElement(o,{title:`Goals`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.name},y.createElement(h,null,e.name.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.completions))))};export{T as watchCommand};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{ApiV2Client as n}from"./api-v2-CfJ_2Z5N.js";import{Panel as r}from"./panel-uygscwY5.js";import{Banner as i}from"./banner-BPQh2F8l.js";import"./progress-row-DFOvHAc5.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import"./sparkline-Bkfzqe4x.js";import"./bar-C9stEeJd.js";import"./ui-oBd4Xpw5.js";import{Box as a,Text as o,render as s,useApp as c,useInput as l}from"ink";import u,{useEffect as d,useState as f}from"react";async function p(e,t){let n=new TextEncoder,r=await crypto.subtle.importKey(`raw`,n.encode(e),{name:`HMAC`,hash:`SHA-256`},!1,[`sign`]),i=await crypto.subtle.sign(`HMAC`,r,n.encode(t));return Array.from(new Uint8Array(i),e=>e.toString(16).padStart(2,`0`)).join(``)}function m({stats:e}){return u.createElement(r,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},u.createElement(a,{flexDirection:`column`},u.createElement(o,null,u.createElement(o,{color:`gray`},`public URL `),u.createElement(o,{color:`cyan`},e.publicUrl)),u.createElement(o,null,u.createElement(o,{color:`gray`},`→ forwarding to `),u.createElement(o,{color:`magenta`},e.wsUrl)),u.createElement(o,null,e.connected?u.createElement(o,{color:`green`},`● connected`):u.createElement(o,{color:`yellow`},`○ connecting…`),u.createElement(o,{color:`gray`},` · `,e.total,` requests · `,e.ok,` ok · `),u.createElement(o,{color:e.err>0?`red`:`gray`},e.err,` err`),e.lastStatus===null?null:u.createElement(o,{color:`gray`},` · last: HTTP `,e.lastStatus)),e.lastError?u.createElement(o,{color:`red`},`last error: `,e.lastError.slice(0,80)):null))}async function h(r){let h=await e(),g=await t({strict:!1});if(!g?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;let _=r.siteId??g.teamId??``;if(!_)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
|
|
2
|
+
`),2;if(!r.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
|
|
3
|
+
`),2;let v=r.to.match(/^https?:\/\//)?r.to:`http://${r.to}`,y=new n({config:h,cliVersion:r.cliVersion,token:g}),b;try{b=await y.createTunnel(_,r.to)}catch(e){return process.stderr.write(`Failed to register tunnel: ${e.message}\n`),1}let x=r.sign?r.secret??b.tunnelKey:null,S=()=>{let{exit:e}=c(),[t,n]=f({total:0,ok:0,err:0,lastStatus:null,lastError:null,publicUrl:b.publicUrl,wsUrl:b.wsUrl,connected:!1});return l((t,n)=>{(t===`q`||n.escape)&&e()}),d(()=>{let e=new AbortController,t=async e=>{try{let t={...e.headers};delete t.host,delete t[`content-length`],x&&(t[`X-Zenovay-Signature`]=`sha256=${await p(x,e.body)}`);let r=await fetch(v,{method:e.method,headers:t,body:e.method===`GET`||e.method===`HEAD`?void 0:e.body}),i=await r.text(),a={};return r.headers.forEach((e,t)=>{a[t]=e}),n(e=>({...e,total:e.total+1,ok:e.ok+(r.ok?1:0),err:e.err+(r.ok?0:1),lastStatus:r.status,lastError:r.ok?null:`HTTP ${r.status}`})),{status:r.status,headers:a,body:i}}catch(e){let t=e instanceof Error?e.message:String(e);return n(e=>({...e,total:e.total+1,err:e.err+1,lastError:t})),{status:502,body:JSON.stringify({error:`cli_local_failed`,detail:t})}}};return(async()=>{let r=y.tunnelClient(b.wsUrl);n(e=>({...e,connected:!0}));try{await r.start(t,e.signal)}catch(e){n(t=>({...t,connected:!1,lastError:e.message}))}})(),()=>{e.abort()}},[]),u.createElement(a,{flexDirection:`column`},u.createElement(i,{version:`webhooks forward`}),u.createElement(m,{stats:t}),u.createElement(o,{color:`gray`},`target: `,v,` `,r.sign?`· HMAC-signed`:``),u.createElement(o,{color:`gray`},`[q | Esc] quit`))},{waitUntilExit:C}=s(u.createElement(S,null));return await C(),0}export{h as webhooksForwardCommand};
|
package/dist/wizard-bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import(`./init-
|
|
2
|
+
import(`./init-Bmp-Yrah.js`).then(async({initCommand:e})=>{let{readFileSync:t}=await import(`node:fs`),n=await import(`node:path`),{fileURLToPath:r}=await import(`node:url`),i=n.dirname(r(import.meta.url)),a=JSON.parse(t(n.join(i,`..`,`package.json`),`utf8`)),o=process.argv.slice(2),s=o.includes(`--json`),c=o.includes(`--yes`),l=o.includes(`--skip-mcp`),u=o.includes(`--skip-verify`),d=await e({cliVersion:a.version,cwd:process.cwd(),json:s,yes:c,skipMcp:l,skipVerify:u});process.exit(d)});
|
package/package.json
CHANGED
package/dist/ai-DGIoZ2aO.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{ApiClient as t,readToken as n}from"./api-DXmhz2DM.js";import{detectInstalled as r,initCommand as i}from"./init-3WrfX1Fb.js";import{parseSseStream as a}from"./client-vixcHdv-.js";import"./formatter-BNYzdX5c.js";import{emit as o,isHeadless as s}from"./emit-BmfLGjqr.js";import"./login-DvMRHd3J.js";import{Panel as c}from"./panel-Crm-x-5U.js";import{Select as l}from"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{Box as u,Text as d,render as f}from"ink";import p from"react";async function m(e){let t=await r(e.cwd),n;if(e.mode)n=e.mode;else if(!t.installed)n=`install`;else if(s(e))return o({type:`error`,code:`no_mode`,message:`Headless mode requires --mode chat|mcp|install`}),2;else n=await h(t);return n===`install`?i({cliVersion:e.cliVersion,cwd:e.cwd,json:e.json}):n===`chat`?g(e):_(e)}async function h(e){return new Promise(t=>{let n=[{label:`Chat with your analytics`,value:`chat`,description:`Ask natural-language questions about your data`},{label:`Manage via MCP`,value:`mcp`,description:`Create goals, funnels, sites, etc. in plain English`},{label:`Re-run install / repair`,value:`install`,description:`Run the install wizard again`}],{unmount:r}=f(p.createElement(u,{flexDirection:`column`},p.createElement(c,{title:`Zenovay detected${e.packageMarker?` (${e.packageMarker})`:``}`,state:`idle`},p.createElement(d,null,`What do you want to do?`)),p.createElement(l,{items:n,onSelect:e=>{r(),t(e)}})))})}async function g(r){let i=await e(),o=await n({strict:!1});if(!o)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new t({config:i,cliVersion:r.cliVersion,token:o});process.stdout.write(`
|
|
2
|
-
Zenovay · chat mode — type your question then press Enter. Ctrl-C to exit.
|
|
3
|
-
|
|
4
|
-
> `);let c=await v();if(!c)return 0;let l=await s.openAiStream(`chat`,{messages:[{role:`user`,content:c}]});for await(let e of a(l)){if(e.type===`delta`&&process.stdout.write(e.content),e.type===`done`){process.stdout.write(`
|
|
5
|
-
`);break}if(e.type===`error`)return process.stderr.write(`\n[${e.code}] ${e.message}\n`),1}return 0}async function _(r){let i=await e(),o=await n({strict:!1});if(!o)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new t({config:i,cliVersion:r.cliVersion,token:o});process.stdout.write(`
|
|
6
|
-
Zenovay · MCP mode — describe what you want to create or change. Ctrl-C to exit.
|
|
7
|
-
|
|
8
|
-
> `);let c=await v();if(!c)return 0;let l=await s.openAiStream(`mcp`,{messages:[{role:`user`,content:c}]});for await(let e of a(l)){if(e.type===`delta`&&process.stdout.write(e.content),e.type===`tool_start`&&process.stdout.write(`\n[tool: ${e.name}] `),e.type===`tool_result`&&process.stdout.write(`
|
|
9
|
-
[result]`),e.type===`done`){process.stdout.write(`
|
|
10
|
-
`);break}if(e.type===`error`)return process.stderr.write(`\n[${e.code}] ${e.message}\n`),1}return 0}function v(){return new Promise(e=>{let t=``,n=r=>{let i=r.toString(`utf8`);i.includes(`
|
|
11
|
-
`)||i.includes(`\r`)?(t+=i.replace(/[\r\n]/g,``),process.stdin.off(`data`,n),process.stdin.pause(),e(t)):t+=i};process.stdin.resume(),process.stdin.on(`data`,n)})}export{m as aiCommand};
|
package/dist/api-v2-C7yrqNuV.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ApiClient as e,ApiError as t,ensureFreshToken as n}from"./api-DXmhz2DM.js";import{z as r}from"zod";const i=r.object({id:r.string(),startedAt:r.string(),country:r.string().nullable().optional(),city:r.string().nullable().optional(),device:r.enum([`mobile`,`desktop`,`tablet`,`unknown`]).optional(),os:r.string().nullable().optional(),browser:r.string().nullable().optional(),page:r.string().optional(),referrer:r.string().nullable().optional(),utmSource:r.string().nullable().optional(),utmMedium:r.string().nullable().optional(),utmCampaign:r.string().nullable().optional(),aiScore:r.number().min(0).max(100).nullable().optional()}),a=r.object({visitors:r.array(i),total:r.number().int(),windowStart:r.string(),windowEnd:r.string()}),o=r.object({type:r.enum([`visitor.started`,`visitor.ended`,`visitor.heartbeat`]),visitor:i}),s=r.object({source:r.string(),channel:r.enum([`direct`,`organic`,`paid`,`social`,`referral`,`email`,`other`]).optional(),visitors:r.number().int(),conversions:r.number().int().optional(),revenue:r.number().int().optional(),delta:r.number().nullable().optional()}),c=r.object({sources:r.array(s),totalVisitors:r.number().int(),windowStart:r.string(),windowEnd:r.string()}),l=r.object({bucket:r.string(),amount:r.number().int(),currency:r.string(),transactions:r.number().int()}),u=r.object({series:r.array(l),totalAmount:r.number().int(),currency:r.string(),totalTransactions:r.number().int(),mrr:r.number().int().optional(),arpu:r.number().int().optional(),windowStart:r.string(),windowEnd:r.string()}),d=r.object({url:r.string(),device:r.enum([`mobile`,`desktop`]).optional(),lcp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),inp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),cls:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),ttfb:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),fcp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),samples:r.number().int()}),f=r.object({vitals:r.array(d),windowStart:r.string(),windowEnd:r.string()}),p=r.object({id:r.string(),name:r.string(),visitors:r.number().int(),conversions:r.number().int(),dropOff:r.number().min(0).max(1).optional()}),m=r.object({funnelId:r.string(),name:r.string(),steps:r.array(p),totalEntries:r.number().int(),totalCompletions:r.number().int(),conversionRate:r.number().min(0).max(1),windowStart:r.string(),windowEnd:r.string()}),h=r.object({id:r.string(),name:r.string(),stepCount:r.number().int(),lastEvaluatedAt:r.string().nullable().optional()}),g=r.object({funnels:r.array(h)}),_=r.object({visitors:r.number().int(),pageviews:r.number().int(),sessions:r.number().int(),bounceRate:r.number().min(0).max(1),avgSessionSec:r.number(),topPages:r.array(r.object({url:r.string(),views:r.number().int()})),topCountries:r.array(r.object({country:r.string(),visitors:r.number().int()})),windowStart:r.string(),windowEnd:r.string()}),v=r.object({id:r.string(),name:r.string(),type:r.enum([`event`,`pageview`,`revenue`]),conversions24h:r.number().int(),conversions7d:r.number().int()}),y=r.object({goals:r.array(v)}),b=r.object({id:r.string(),name:r.string(),domain:r.string().nullable().optional(),industry:r.string().nullable().optional(),employeeCount:r.number().int().nullable().optional(),visitorCount:r.number().int(),firstSeenAt:r.string(),lastSeenAt:r.string()}),x=r.object({type:r.enum([`company.identified`,`company.returning`]),company:b}),S=r.object({companies:r.array(b),total:r.number().int()}),C=r.object({type:r.literal(`error.captured`),id:r.string(),message:r.string(),stack:r.string().optional(),url:r.string().optional(),occurredAt:r.string(),count:r.number().int().optional(),spike:r.number().optional()}),w=r.object({id:r.string(),ts:r.string(),class:r.string(),message:r.string(),page:r.string().nullable(),device:r.string().nullable(),fingerprint:r.string().nullable()}),T=r.object({errors:r.array(w),total:r.number().int()}),E=r.object({id:r.string(),name:r.string(),domain:r.string().nullable(),industry:r.string().nullable(),employeeCount:r.number().int().nullable(),visitCount:r.number().int(),firstSeenAt:r.string(),lastSeenAt:r.string(),isNew:r.boolean()}),D=r.object({companies:r.array(E),total:r.number().int()}),O=r.object({columns:r.array(r.string()),rows:r.array(r.record(r.unknown())),row_count:r.number(),duration_ms:r.number(),truncated:r.boolean()}),k=r.object({id:r.string(),provider:r.literal(`github`),commit_sha:r.string(),commit_message:r.string().nullable(),commit_author:r.string().nullable(),branch:r.string().nullable(),repository:r.string().nullable(),commit_url:r.string().nullable(),pushed_at:r.string(),show_on_chart:r.boolean()}),A=r.object({deploys:r.array(k),total:r.number().int()}),j=r.object({id:r.string(),name:r.string(),domain:r.string().nullable(),tier:r.string(),pageviews24h:r.number().int(),isCurrent:r.boolean()}),M=r.object({projects:r.array(j)}),N=r.object({type:r.string(),bucket:r.string(),count:r.number().int()}),P=r.object({events:r.array(N),windowStart:r.string(),windowEnd:r.string()}),F=r.object({id:r.string(),receivedAt:r.string(),url:r.string(),method:r.string(),headers:r.record(r.string(),r.string()),body:r.string()}),I=r.object({columns:r.array(r.string()),rows:r.array(r.array(r.unknown())),rowCount:r.number().int(),durationMs:r.number(),truncated:r.boolean().optional()}),L=r.object({resource:r.string(),values:r.array(r.string()),cachedAt:r.string().optional()});function R(e,t){throw Error(`api-v2: ${e} not yet implemented; awaiting backend Wave ${t}`)}async function*z(e,t){R(e,t)}function B(e){switch(e){case`24h`:return 1;case`7d`:return 7;case`30d`:return 30;case`90d`:return 90;case`1y`:return 365;default:return 7}}var V=class extends e{v2Opts;v2Fetch;v2Token;constructor(e){super(e),this.v2Opts=e,this.v2Fetch=e.fetchImpl??fetch,this.v2Token=e.token??null}get v2ApiBase(){return this.v2Opts.config.apiBase}async v2Headers(e={}){let t=process.env.ZENOVAY_API_TOKEN;if(t&&t.trim())return{Accept:`application/json`,"User-Agent":`zenovay-cli/${this.v2Opts.cliVersion}`,"X-Zenovay-CLI-Version":this.v2Opts.cliVersion,Authorization:`Bearer ${t.trim()}`,...e};this.v2Token||=await n({apiBase:this.v2ApiBase});let r={Accept:`application/json`,"User-Agent":`zenovay-cli/${this.v2Opts.cliVersion}`,"X-Zenovay-CLI-Version":this.v2Opts.cliVersion,...e};return this.v2Token&&(r.Authorization=`${this.v2Token.tokenType} ${this.v2Token.accessToken}`),r}async v2Request(e,n,r={},i){let a=`${this.v2ApiBase}${e}`,o=await this.v2Headers(r.headers??{}),s=await this.v2Fetch(a,{...r,headers:o,signal:i});if(s.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers(r.headers??{});s=await this.v2Fetch(a,{...r,headers:e,signal:i})}if(!s.ok){let n=await s.text().catch(()=>``),i=n;try{i=JSON.parse(n)}catch{}throw new t(s.status,i,`${r.method??`GET`} ${e} → ${s.status}`)}let c=await s.json();return n.parse(c)}async v2RequestRaw(e,n={},r){let i=`${this.v2ApiBase}${e}`,a=await this.v2Headers(n.headers??{}),o=await this.v2Fetch(i,{...n,headers:a,signal:r});if(o.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers(n.headers??{});o=await this.v2Fetch(i,{...n,headers:e,signal:r})}if(!o.ok){let r=await o.text().catch(()=>``),i=r;try{i=JSON.parse(r)}catch{}throw new t(o.status,i,`${n.method??`GET`} ${e} → ${o.status}`)}let s=await o.json();return s?.data??s}async getVisitors(e,t,n){let r=new URLSearchParams({site_id:e});t?.since&&r.set(`since`,t.since),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/visitors?${r.toString()}`,{},n),o=new Date,s=new Date(Date.now()-24*3600*1e3),c=e=>{if(!e)return`unknown`;let t=e.toLowerCase();return t.includes(`mobile`)?`mobile`:t.includes(`tablet`)?`tablet`:t.includes(`desktop`)?`desktop`:`unknown`};return a.parse({total:i.liveCount??i.visitors?.length??0,visitors:(i.visitors??[]).map(e=>({id:e.sessionId,startedAt:e.lastSeen,country:e.country,city:null,device:c(e.device??null),page:e.currentPath??void 0,aiScore:typeof e.valueScore==`number`?Math.max(0,Math.min(100,e.valueScore)):null})),windowStart:s.toISOString(),windowEnd:o.toISOString()})}streamVisitors(e,t){return this.streamChannel(e,`visitors`,t)}async getSources(e,t=`30d`,n,r){let i=new URLSearchParams({site_id:e,period:t});n&&i.set(`compare`,n);let a=await this.v2RequestRaw(`/v1/cli/sources?${i.toString()}`,{},r),o=a.channels??[],s=a.top_utm_sources??[],l=o.reduce((e,t)=>e+t.visitors,0),u=new Set([`direct`,`organic`,`paid`,`social`,`referral`,`email`]),d=[...o.map(e=>({source:e.name,channel:u.has(e.name)?e.name:`other`,visitors:e.visitors,delta:typeof e.delta==`number`?e.delta/100:null})),...s.map(e=>({source:e.medium?`${e.source}/${e.medium}`:e.source,channel:`other`,visitors:e.visitors}))],f=new Date,p=new Date(Date.now()-B(t)*24*3600*1e3);return c.parse({sources:d,totalVisitors:l,windowStart:p.toISOString(),windowEnd:f.toISOString()})}async getRevenue(e,t=`30d`,n){let r=new URLSearchParams({site_id:e,window:t}),i=await this.v2RequestRaw(`/v1/cli/revenue?${r.toString()}`,{},n),a=(i.daily??[]).map(e=>({bucket:e.date,amount:e.cents,currency:i.currency??`USD`,transactions:e.transactions})),o=a.reduce((e,t)=>e+t.amount,0),s=a.reduce((e,t)=>e+t.transactions,0),c=new Date,l=new Date(Date.now()-B(t)*24*3600*1e3),d={series:a,totalAmount:o,currency:i.currency??`USD`,totalTransactions:s,windowStart:l.toISOString(),windowEnd:c.toISOString()};return typeof i.mrr_cents==`number`&&(d.mrr=i.mrr_cents),u.parse(d)}async getVitals(e,t,n){let r=new URLSearchParams({site_id:e});t?.url&&r.set(`url`,t.url),t?.device&&r.set(`device`,t.device),t?.window&&r.set(`window`,t.window);let i=await this.v2RequestRaw(`/v1/cli/vitals?${r.toString()}`,{},n),a=[];if(i.p75&&(i.sample_count??0)>0){let e=i.p75,n={url:`— site-wide aggregate —`,device:t?.device??void 0,samples:i.sample_count??0,...typeof e.lcp==`number`?{lcp:{p50:e.lcp,p75:e.lcp,p90:e.lcp}}:{},...typeof e.inp==`number`?{inp:{p50:e.inp,p75:e.inp,p90:e.inp}}:{},...typeof e.cls==`number`?{cls:{p50:e.cls,p75:e.cls,p90:e.cls}}:{},...typeof e.fcp==`number`?{fcp:{p50:e.fcp,p75:e.fcp,p90:e.fcp}}:{},...typeof e.ttfb==`number`?{ttfb:{p50:e.ttfb,p75:e.ttfb,p90:e.ttfb}}:{}};a.push(n)}for(let e of i.worst_pages??[])a.push({url:e.path,device:t?.device??void 0,samples:e.sample_count,lcp:{p50:e.lcp_p75,p75:e.lcp_p75,p90:e.lcp_p75}});let o=new Date,s=new Date(Date.now()-B(t?.window??`7d`)*24*3600*1e3);return f.parse({vitals:a,windowStart:s.toISOString(),windowEnd:o.toISOString()})}async getFunnel(e,t,n=`30d`,r){let i=new URLSearchParams({site_id:e,window:n}),a=await this.v2RequestRaw(`/v1/cli/funnels/${encodeURIComponent(t)}?${i.toString()}`,{},r),o=a.total_entries??0,s=(a.steps??[]).map(e=>({id:`step-${e.order}`,name:e.name,visitors:e.visitors,conversions:e.visitors,dropOff:Math.max(0,Math.min(1,e.dropoffPct/100))})),c=s[s.length-1],l=c?.visitors??0,u=o>0?Math.min(1,l/o):0,d=new Date,f=new Date(Date.now()-B(n)*24*3600*1e3);return m.parse({funnelId:a.id??t,name:a.name??t,steps:s,totalEntries:o,totalCompletions:l,conversionRate:u,windowStart:f.toISOString(),windowEnd:d.toISOString()})}async listFunnels(e,t){let n=new URLSearchParams({site_id:e}),r=await this.v2RequestRaw(`/v1/cli/funnels?${n.toString()}`,{},t);return g.parse({funnels:(r.funnels??[]).map(e=>({id:e.id,name:e.name,stepCount:e.step_count}))})}async getStats(e,t=`24h`,n){let r=new URLSearchParams({site_id:e,range:t}),i=await this.v2RequestRaw(`/v1/cli/stats?${r.toString()}`,{},n),a=i.visitors??0,o=i.pageviews??0,s=a,c=s>0?o/s:0,l=c>0?Math.max(0,Math.min(1,1/Math.max(1,c))):0,u=i.avgSessionSec??0,d=new Date,f=new Date(Date.now()-B(t)*24*3600*1e3);return _.parse({visitors:a,pageviews:o,sessions:s,bounceRate:l,avgSessionSec:u,topPages:i.topPage?[{url:i.topPage.path,views:i.topPage.views}]:[],topCountries:i.topSource?[{country:i.topSource.channel,visitors:i.topSource.visitors}]:[],windowStart:f.toISOString(),windowEnd:d.toISOString()})}async getGoals(e,t){let n=new URLSearchParams({site_id:e});return this.v2Request(`/v1/cli/goals?${n.toString()}`,y,{},t)}async getLive(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/live?${n.toString()}`,t)}async getPages(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/pages?${n.toString()}`,t)}async getDevices(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/devices?${n.toString()}`,t)}async getGeo(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/geo?${n.toString()}`,t)}async getRetention(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/retention?${n.toString()}`,t)}async getUptime(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/uptime?${n.toString()}`,t)}async getSessions(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/sessions?${n.toString()}`,t)}async getHeatmaps(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/heatmaps?${n.toString()}`,t)}async getJourneys(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/journeys?${n.toString()}`,t)}async getInsights(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/insights?${n.toString()}`,t)}async v2RawJson(e,n){let r=`${this.v2ApiBase}${e}`,i=await this.v2Headers(),a=await this.v2Fetch(r,{headers:i,signal:n});if(a.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers();a=await this.v2Fetch(r,{headers:e,signal:n})}if(!a.ok){let n=await a.text().catch(()=>``),r=n;try{r=JSON.parse(n)}catch{}throw new t(a.status,r,`GET ${e} → ${a.status}`)}return a.json()}streamCompaniesV2(e,t){return this.streamChannel(e,`companies`,t)}streamCompanies(e,t){return z(`streamCompanies`,2)}async getCompanies(e){R(`getCompanies`,2)}async getCompaniesSnapshot(e,t,n){let r=new URLSearchParams({site_id:e});t?.window&&r.set(`window`,t.window),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/companies?${r.toString()}`,{},n);return D.parse(i)}async runSqlQuery(e,n,r,i){let a=`${this.v2ApiBase}/v1/cli/query`,o=await this.v2Headers({"Content-Type":`application/json`}),s=await this.v2Fetch(a,{method:`POST`,headers:o,signal:i,body:JSON.stringify({site_id:e,sql:n,...r?.maxRows?{max_rows:r.maxRows}:{}})});if(!s.ok){let e=await s.text().catch(()=>``),n=e;try{n=JSON.parse(e)}catch{}throw new t(s.status,n,`POST /v1/cli/query → ${s.status}`)}let c=await s.json();return O.parse(c.data??c)}async getDeploys(e,t,n){let r=new URLSearchParams({site_id:e});t?.since&&r.set(`since`,t.since),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit)),t?.branch&&r.set(`branch`,t.branch),t?.onChartOnly&&r.set(`on_chart_only`,`true`);let i=await this.v2RequestRaw(`/v1/cli/deploys?${r.toString()}`,{},n);return A.parse(i)}async getProjects(e,t){let n=new URLSearchParams({site_id:e}),r=await this.v2RequestRaw(`/v1/cli/projects?${n.toString()}`,{},t);return M.parse(r)}async getErrors(e,t,n){let r=new URLSearchParams({site_id:e});t?.window&&r.set(`window`,t.window),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/errors?${r.toString()}`,{},n);return T.parse(i)}streamErrorsV2(e,t){return this.streamChannel(e,`errors`,t)}streamErrors(e,t){return z(`streamErrors`,2)}async getEventsHistory(e,t){R(`getEventsHistory`,2)}forwardWebhook(e,t){return z(`forwardWebhook`,2)}async registerTunnel(e,t){R(`registerTunnel`,2)}async queryRaw(e,t,n){R(`queryRaw`,3)}async getCompletions(e,t){R(`getCompletions`,3)}async*streamChannel(e,t,n){let{connectWs:r}=await import(`./ws-client-3QuvHd5K.js`),i=this.v2ApiBase.replace(/^https:\/\//,`wss://`).replace(/^http:\/\//,`ws://`),a=`${i}/v1/cli/stream/${encodeURIComponent(e)}?channels=${t}`,o=this.v2Token?.accessToken;for await(let e of r({url:a,bearer:o,signal:n})){if(e.type!==`message`)continue;let t=e.data;if(t&&typeof t==`object`){let e=t;yield e.event??t}}}async createTunnel(e,n,r){let i=`${this.v2ApiBase}/v1/cli/tunnels`,a=await this.v2Headers({"Content-Type":`application/json`}),o=await this.v2Fetch(i,{method:`POST`,headers:a,signal:r,body:JSON.stringify({site_id:e,target_pattern:n})});if(!o.ok){let e=await o.text().catch(()=>``);throw new t(o.status,e,`POST /v1/cli/tunnels → ${o.status}`)}let s=await o.json(),c=s.data??{};if(!c.tunnel_key||!c.public_url||!c.ws_url)throw new t(500,s,`createTunnel: malformed response`);return{tunnelKey:c.tunnel_key,publicUrl:c.public_url,wsUrl:c.ws_url,siteId:c.site_id??e}}tunnelClient(e){let t=this.v2Token?.accessToken;return{start:async(n,r)=>{let{WsTunnelClient:i}=await import(`./ws-client-3QuvHd5K.js`),a=new i({url:e,bearer:t,signal:r});await a.start(n)}}}};export{V as ApiV2Client};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as i}from"./analytical-screen-DlNffR1j.js";import{Table as a}from"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Box as c,Text as l}from"ink";import u from"react";function d(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`}function f(e){return e==null?`—`:e>=500?`Enterprise`:e>=50?`Growth`:`SMB`}async function p(p){let m=await e(),h=await t({strict:!1}),g=new s({config:m,cliVersion:p.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=r(p),b=p.window??`24h`,x=p.limit??100,S=[{key:`lastSeenAt`,header:`when`,width:6,format:e=>d(String(e))},{key:`name`,header:`company`,width:24,format:e=>String(e).slice(0,24)},{key:`employeeCount`,header:`tier`,width:11,format:e=>f(typeof e==`number`?e:null)},{key:`industry`,header:`industry`,width:18,format:e=>String(e??`—`).slice(0,18)},{key:`visitCount`,header:`visits`,width:6,align:`right`},{key:`isNew`,header:``,width:5,format:e=>e?`NEW`:``}];return i({cliVersion:p.cliVersion,title:`companies · ${_} · ${b}`,commandName:`companies`,authToken:h?.accessToken??null,refreshIntervalMs:p.watch?3e4:0,fetcher:e=>g.getCompaniesSnapshot(_,{window:b,limit:x},e),format:y,headlessEmit:(e,t)=>{let r=p.newOnly?e.companies.filter(e=>e.isNew):e.companies;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of r)process.stdout.write(JSON.stringify(e)+`
|
|
2
|
-
`);else process.stdout.write(JSON.stringify({companies:r,total:r.length},null,2));return}process.stdout.write(n(r,[`name`,`domain`,`industry`,`employeeCount`,`visitCount`,`firstSeenAt`,`lastSeenAt`,`isNew`],t))},panels:[{id:`summary`,title:`Now`,render:e=>{let t=e.companies.filter(e=>e.isNew).length,n=e.companies.filter(e=>(e.employeeCount??0)>=500).length;return u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{bold:!0},e.total),u.createElement(l,{color:`gray`},` companies in `,b)),u.createElement(l,{color:`gray`},u.createElement(l,{color:`green`},`● `,t,` new`),` · `,n,` enterprise`))}},{id:`feed`,title:`Feed`,render:e=>{let t=p.newOnly?e.companies.filter(e=>e.isNew):e.companies;return t.length===0?u.createElement(l,{color:`gray`},`— no `,p.newOnly?`new `:``,`companies in window —`):u.createElement(a,{data:t.slice(0,30),columns:S})}}]})}export{p as companiesCommand};
|
package/dist/deploys-CMVAZp4i.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as i}from"./analytical-screen-DlNffR1j.js";import{Table as a}from"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Box as c,Text as l}from"ink";import u from"react";function d(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 f(f){if(f.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 p=await e(),m=await t({strict:!1}),h=new s({config:p,cliVersion:f.cliVersion,token:m}),g,_;try{({siteId:g,site:_}=await o(h,{explicit:f.siteId,headless:!!(f.json||f.csv||f.tsv||f.ndjson),cliVersion:f.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let v=r(f),y=f.limit??50,b=[{key:`pushed_at`,header:`when`,width:6,format:e=>d(String(e))},{key:`branch`,header:`branch`,width:14,format:e=>String(e??`—`).slice(0,14)},{key:`commit_sha`,header:`commit`,width:9,format:e=>String(e).slice(0,8)},{key:`commit_author`,header:`author`,width:16,format:e=>String(e??`—`).slice(0,16)},{key:`commit_message`,header:`message`,width:40,format:e=>String(e??`—`).slice(0,40)},{key:`show_on_chart`,header:`chart`,width:5,format:e=>e?`●`:`○`}];return i({cliVersion:f.cliVersion,title:`deploys · ${g}`,commandName:`deploys`,authToken:m?.accessToken??null,refreshIntervalMs:0,fetcher:e=>h.getDeploys(g,{branch:f.branch,since:f.since,limit:y},e),format:v,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(n(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=>{let t=e.deploys.filter(e=>e.show_on_chart).length,n=new Set(e.deploys.map(e=>e.repository).filter(e=>!!e));return u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{bold:!0},e.total),u.createElement(l,{color:`gray`},` commits`,f.branch?` · branch=${f.branch}`:``)),u.createElement(l,{color:`gray`},u.createElement(l,{color:`magenta`},`● `,t,` on chart`),u.createElement(l,null,` · `),u.createElement(l,null,n.size,` `,n.size===1?`repo`:`repos`)))}},{id:`list`,title:`Recent`,render:e=>e.deploys.length===0?u.createElement(c,{flexDirection:`column`},u.createElement(l,{color:`gray`},`— no commits yet —`),u.createElement(l,{color:`gray`},"Run `zenovay deploys --connect` to wire up the GitHub integration.")):u.createElement(a,{data:e.deploys.slice(0,30),columns:b})}]})}export{f as deploysCommand};
|
package/dist/devices-yq4dh7UD.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{DataTable as u}from"./data-table-EsLUu8Hj.js";import{Box as d,Text as f,render as p,useApp as m,useInput as h}from"ink";import g,{useEffect as _,useState as v}from"react";import y from"ink-spinner";async function b(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 l=new c({config:a,cliVersion:i.cliVersion,token:o}),u,d;try{({siteId:u,site:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(r(i)){let e=await l.getDevices(u);return n({type:`devices.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=p(g.createElement(x,{api:l,siteId:u,siteLabel:f,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const x=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=m(),[p,b]=v(null),[x,S]=v(!0),[C,w]=v(null);if(h(e=>{e===`q`&&(c(),s(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getDevices(t);n||(b(r),S(!1))}catch(e){n||(w(e.message),S(!1))}})(),()=>{n=!0}},[e,t]),x)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`devices · ${n}`}),g.createElement(i,{title:`Loading`,state:`busy`},g.createElement(d,null,g.createElement(f,{color:`magenta`},g.createElement(y,{type:`dots`})),g.createElement(f,null,` Fetching breakdown…`))));if(C)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`devices · ${n}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:C}));let T=!p||p.devices.length===0&&p.browsers.length===0&&p.os.length===0;if(T)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`devices · ${n}`}),g.createElement(l,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let E=[{key:`name`,label:`name`,width:16},{key:`visitors`,label:`visitors`,align:`right`,width:8}];return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`devices · ${n}`}),g.createElement(d,{flexDirection:`row`},g.createElement(i,{title:`Devices`},p.devices.length===0?g.createElement(f,{color:`gray`},`— —`):g.createElement(u,{columns:E,data:p.devices,zebra:!0})),g.createElement(i,{title:`Browsers`},p.browsers.length===0?g.createElement(f,{color:`gray`},`— —`):g.createElement(u,{columns:E,data:p.browsers,zebra:!0})),g.createElement(i,{title:`OS`},p.os.length===0?g.createElement(f,{color:`gray`},`— —`):g.createElement(u,{columns:E,data:p.os,zebra:!0}))),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{b as devicesCommand};
|
package/dist/errors-BlVWrZ86.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import{spark as i}from"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as a}from"./analytical-screen-DlNffR1j.js";import{Table as o}from"./ui-BLnL2HSo.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{Box as l,Text as u}from"ink";import d from"react";function f(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}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(m){let h=await e(),g=await t({strict:!1}),_=new c({config:h,cliVersion:m.cliVersion,token:g}),v,y;try{({siteId:v,site:y}=await s(_,{explicit:m.siteId,headless:!!(m.json||m.csv||m.tsv||m.ndjson),cliVersion:m.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let b=r(m),x=m.window??`24h`,S=m.limit??100,C=[{key:`ts`,header:`when`,width:6,format:e=>p(String(e))},{key:`class`,header:`class`,width:18,format:e=>String(e)},{key:`message`,header:`message`,width:42,format:e=>f(String(e??``),42)},{key:`page`,header:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,header:`device`,width:8,format:e=>String(e??`—`)}];return a({cliVersion:m.cliVersion,title:`errors · ${v} · ${x}`,commandName:`errors`,authToken:g?.accessToken??null,refreshIntervalMs:m.watch?3e4:0,fetcher:e=>_.getErrors(v,{window:x,limit:S},e),format:b,headlessEmit:(e,t)=>{let r=m.search?e.errors.filter(e=>e.class.toLowerCase().includes(m.search.toLowerCase())||e.message.toLowerCase().includes(m.search.toLowerCase())):e.errors;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of r)process.stdout.write(JSON.stringify(e)+`
|
|
2
|
-
`);else process.stdout.write(JSON.stringify({errors:r,total:r.length},null,2));return}process.stdout.write(n(r,[`ts`,`class`,`message`,`page`,`device`,`fingerprint`],t))},panels:[{id:`summary`,title:`Recent errors`,render:e=>{let t=m.search?e.errors.filter(e=>e.class.toLowerCase().includes(m.search.toLowerCase())||e.message.toLowerCase().includes(m.search.toLowerCase())):e.errors,n=new Map,r=Date.now(),a=60;for(let e of t){let t=new Date(e.ts).getTime(),i=Math.floor((r-t)/(60*1e3));if(i<0||i>=a)continue;let o=n.get(e.class)??Array(a).fill(0),s=a-1-i;o[s]+=1,n.set(e.class,o)}let o=[...n.entries()].sort((e,t)=>t[1].reduce((e,t)=>e+t,0)-e[1].reduce((e,t)=>e+t,0)).slice(0,6);return d.createElement(l,{flexDirection:`column`},d.createElement(u,null,d.createElement(u,{bold:!0},t.length),d.createElement(u,{color:`gray`},` errors in `,x)),o.length===0?null:d.createElement(l,{flexDirection:`column`,marginTop:1},o.map(([e,t])=>d.createElement(u,{key:e},d.createElement(u,{color:`red`},e.padEnd(20).slice(0,20)),` `,d.createElement(u,{color:`gray`},i(t,30))))))}},{id:`table`,title:`Detail`,render:e=>{let t=m.search?e.errors.filter(e=>e.class.toLowerCase().includes(m.search.toLowerCase())||e.message.toLowerCase().includes(m.search.toLowerCase())):e.errors;return t.length===0?d.createElement(u,{color:`gray`},`— no errors `,m.search?`matching "${m.search}"`:`in window`,` —`):d.createElement(o,{data:t.slice(0,30),columns:C})}}]})}export{m as errorsCommand};
|
package/dist/funnel-B7yQXVJa.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as i}from"./analytical-screen-DlNffR1j.js";import{Table as a}from"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Box as c,Text as l}from"ink";import u from"react";function d(e,t){let n=Math.round(e*t);return`█`.repeat(Math.max(0,Math.min(t,n)))+`░`.repeat(Math.max(0,t-n))}async function f(f){let m=await e(),h=await t({strict:!1}),g=new s({config:m,cliVersion:f.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:f.siteId,headless:!!(f.json||f.csv||f.tsv||f.ndjson),cliVersion:f.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=r(f);if(!f.funnelId){let e=[{key:`name`,header:`name`,width:30},{key:`stepCount`,header:`steps`,width:6,align:`right`},{key:`id`,header:`id`,width:36,format:e=>String(e).slice(0,36)}];return i({cliVersion:f.cliVersion,title:`funnels · ${_}`,commandName:`funnels`,authToken:h?.accessToken??null,refreshIntervalMs:0,fetcher:e=>g.listFunnels(_,e),format:y,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(n(e.funnels,[`id`,`name`,`stepCount`],t))},panels:[{id:`funnels`,title:`Funnels`,render:t=>t.funnels.length===0?u.createElement(l,{color:`gray`},`— no funnels defined —`):u.createElement(a,{data:t.funnels,columns:e})},{id:`hint`,title:`Next`,render:()=>u.createElement(l,{color:`gray`},"Run `zenovay funnel <id>` for drop-off detail.")}]})}let b=f.window??`30d`;return i({cliVersion:f.cliVersion,title:`funnel · ${f.funnelId} · ${b}`,commandName:`funnel`,authToken:h?.accessToken??null,refreshIntervalMs:0,fetcher:e=>g.getFunnel(_,f.funnelId,b,e),format:y,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(n(e.steps,[`id`,`name`,`visitors`,`conversions`],t))},panels:[{id:`overview`,title:p(`Overview`),render:e=>u.createElement(c,{flexDirection:`column`},u.createElement(l,{bold:!0},e.name),u.createElement(l,{color:`gray`},e.totalEntries.toLocaleString(),` entries · `,e.totalCompletions.toLocaleString(),` completed (`,(e.conversionRate*100).toFixed(1),`%)`))},{id:`flow`,title:`Flow`,render:e=>{let t=e.totalEntries||1;return u.createElement(c,{flexDirection:`column`},e.steps.map((n,r)=>{let i=n.visitors/t,a=e.steps[r-1],o=a?a.visitors-n.visitors:0,s=a?o/Math.max(1,a.visitors)*100:0;return u.createElement(c,{key:n.id,flexDirection:`column`},a?u.createElement(l,{color:`red`},` `,`↓ drop `,o.toLocaleString(),` (`,s.toFixed(1),`%)`):null,u.createElement(l,null,u.createElement(l,{bold:!0},`${r+1}. ${n.name}`.padEnd(22).slice(0,22)),` `,u.createElement(l,{color:`magenta`},d(i,30)),` `,u.createElement(l,null,(i*100).toFixed(1).padStart(5),`% `),u.createElement(l,{color:`gray`},n.visitors.toLocaleString())))}))}}]})}function p(e){return e}export{f as funnelCommand};
|
package/dist/geo-BqtzfNwp.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{DataTable as u}from"./data-table-EsLUu8Hj.js";import{Globe as d}from"./globe-1bi4DjwJ.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useState as y}from"react";import b from"ink-spinner";async function x(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 l=new c({config:a,cliVersion:i.cliVersion,token:o}),u,d;try{({siteId:u,site:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(r(i)){let e=await l.getGeo(u);return n({type:`geo.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(S,{api:l,siteId:u,siteLabel:f,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const S=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=h(),[m,x]=y(null),[S,C]=y(!0),[w,T]=y(null);if(g(e=>{e===`q`&&(c(),s(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getGeo(t);n||(x(r),C(!1))}catch(e){n||(T(e.message),C(!1))}})(),()=>{n=!0}},[e,t]),S)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`geo · ${n}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching geo…`))));if(w)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`geo · ${n}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:w}));let E=!m||m.countries.length===0&&m.cities.length===0;if(E)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`geo · ${n}`}),_.createElement(l,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let D=[{key:`country`,label:`country`,width:18},{key:`visitors`,label:`visitors`,align:`right`,width:8}],O=[{key:`city`,label:`city`,width:20},{key:`country`,label:`country`,width:12},{key:`visitors`,label:`visitors`,align:`right`,width:8}],k=process.stdout.columns??80;return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`geo · ${n}`}),_.createElement(f,{flexDirection:`row`},_.createElement(i,{title:`Countries`},m.countries.length===0?_.createElement(p,{color:`gray`},`— —`):_.createElement(u,{columns:D,data:m.countries.slice(0,15),zebra:!0})),_.createElement(i,{title:`Globe`},_.createElement(d,{data:[],width:Math.max(36,k-60),height:12}))),_.createElement(i,{title:`Cities`},m.cities.length===0?_.createElement(p,{color:`gray`},`— —`):_.createElement(u,{columns:O,data:m.cities.slice(0,20),zebra:!0})),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{x as geoCommand};
|
package/dist/health-DOOluwxM.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CZ9IzjIH.js";import"./check-Comj8AkL.js";import"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import"./emit-BmfLGjqr.js";import"./panel-Crm-x-5U.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-T70yG5po.js";export{n as healthCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{DataTable as u}from"./data-table-EsLUu8Hj.js";import{requireTier as d}from"./tier-DJvWU86k.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useState as y}from"react";import b from"ink-spinner";async function x(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 l=new c({config:a,cliVersion:i.cliVersion,token:o});try{await d(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(r(i)){let e=await l.getHeatmaps(u);return n({type:`heatmaps.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(S,{api:l,siteId:u,siteLabel:p,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const S=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=h(),[d,m]=y(null),[x,S]=y(!0),[C,w]=y(null);if(g(e=>{e===`q`&&(c(),s(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getHeatmaps(t);n||(m(r),S(!1))}catch(e){n||(w(e.message),S(!1))}})(),()=>{n=!0}},[e,t]),x)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`heatmaps · ${n}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching heatmaps…`))));if(C)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`heatmaps · ${n}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:C}));if(!d||d.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`heatmaps · ${n}`}),_.createElement(l,{reason:`no-data`,headline:`No heatmaps yet`,hint:`Enable heatmaps in your site settings`}));let T=[{key:`url`,label:`page`,width:36},{key:`type`,label:`type`,width:12},{key:`captureCount`,label:`captures`,align:`right`,width:10},{key:`createdAt`,label:`first seen`,width:24}];return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`heatmaps · ${n}`}),_.createElement(i,{title:`Heatmaps (${d.length})`},_.createElement(u,{columns:T,data:d,zebra:!0})),_.createElement(f,{marginTop:1},_.createElement(p,{color:`gray`},`Open any heatmap at https://app.zenovay.com/heatmaps`)),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{x as heatmapsCommand};
|
package/dist/init-4dY3jNh8.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CZ9IzjIH.js";import"./api-DXmhz2DM.js";import{initCommand as e}from"./init-3WrfX1Fb.js";import"./client-vixcHdv-.js";import"./formatter-BNYzdX5c.js";import"./emit-BmfLGjqr.js";import"./login-DvMRHd3J.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";export{e as initCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{requireTier as u}from"./tier-DJvWU86k.js";import{Box as d,Text as f,render as p,useApp as m,useInput as h}from"ink";import g,{useEffect as _,useState as v}from"react";import y from"ink-spinner";function b(e){return e===`critical`?`err`:e===`warning`?`warn`:`ok`}function x(e){return e===`anomaly`?`⚡ anomaly`:e===`recommendation`?`✦ recommendation`:`↗ trend`}async function S(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 l=new c({config:a,cliVersion:i.cliVersion,token:o});try{await u(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let m=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(r(i)){let e=await l.getInsights(d);return n({type:`insights.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=p(g.createElement(C,{api:l,siteId:d,siteLabel:m,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=m(),[u,p]=v(null),[S,C]=v(!0),[w,T]=v(null);return h(e=>{e===`q`&&(c(),s(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getInsights(t);n||(p(r),C(!1))}catch(e){n||(T(e.message),C(!1))}})(),()=>{n=!0}},[e,t]),S?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`insights · ${n}`}),g.createElement(i,{title:`Loading`,state:`busy`},g.createElement(d,null,g.createElement(f,{color:`magenta`},g.createElement(y,{type:`dots`})),g.createElement(f,null,` Fetching insights…`)))):w?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`insights · ${n}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:w})):!u||u.length===0?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`insights · ${n}`}),g.createElement(l,{reason:`no-data`,headline:`No insights yet`,hint:`Insights are generated nightly — check back tomorrow`})):g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`insights · ${n}`}),u.map((e,t)=>g.createElement(i,{key:t,title:`${x(e.kind)} · ${e.severity}`,state:b(e.severity)},g.createElement(f,{bold:!0},e.title),e.body?g.createElement(f,{color:`gray`},e.body):null)),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{S as insightsCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{requireTier as u}from"./tier-DJvWU86k.js";import{Box as d,Text as f,render as p,useApp as m,useInput as h}from"ink";import g,{useEffect as _,useState as v}from"react";import y from"ink-spinner";async function b(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 l=new c({config:a,cliVersion:i.cliVersion,token:o});try{await u(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let m=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(r(i)){let e=await l.getJourneys(d);return n({type:`journeys.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=p(g.createElement(x,{api:l,siteId:d,siteLabel:m,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const x=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=m(),[u,p]=v(null),[b,x]=v(!0),[S,C]=v(null);if(h(e=>{e===`q`&&(c(),s(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getJourneys(t);n||(p(r.flows),x(!1))}catch(e){n||(C(e.message),x(!1))}})(),()=>{n=!0}},[e,t]),b)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`journeys · ${n}`}),g.createElement(i,{title:`Loading`,state:`busy`},g.createElement(d,null,g.createElement(f,{color:`magenta`},g.createElement(y,{type:`dots`})),g.createElement(f,null,` Computing flows…`))));if(S)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`journeys · ${n}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:S}));if(!u||u.length===0)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`journeys · ${n}`}),g.createElement(l,{reason:`no-data`,headline:`No journeys yet`,hint:`Need at least 2 page-views per session to compute flows`}));let w=Math.max(...u.map(e=>e.count),1),T=12;return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`journeys · ${n}`}),g.createElement(i,{title:`Top page transitions (${u.length})`},u.map((e,t)=>{let n=Math.max(1,Math.round(e.count/w*T));return g.createElement(d,{key:t,flexDirection:`row`},g.createElement(f,null,e.from.padEnd(22).slice(0,22)),g.createElement(f,{color:`cyan`},` → `),g.createElement(f,null,e.to.padEnd(22).slice(0,22)),g.createElement(f,{color:`magenta`},` `,`█`.repeat(n),`░`.repeat(T-n)),g.createElement(f,{color:`gray`},` ${e.count}`))})),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{b as journeysCommand};
|
package/dist/live-BGdMxOZ_.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{Globe as u}from"./globe-1bi4DjwJ.js";import{MetricCard as d}from"./metric-card-CtAoTOEP.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useState as y}from"react";import b from"ink-spinner";async function x(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 l=new c({config:a,cliVersion:i.cliVersion,token:o}),u,d;try{({siteId:u,site:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(r(i)){let e=await l.getLive(u);return n({type:`live.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(S,{api:l,siteId:u,siteLabel:f,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const S=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=h(),[m,x]=y(null),[S,C]=y(!0),[w,T]=y(null);if(g(e=>{e===`q`&&(c(),s(0))}),v(()=>{let n=!1,r=async()=>{try{let r=await e.getLive(t);n||(x(r),C(!1),T(null))}catch(e){n||(T(e.message),C(!1))}};r();let i=setInterval(r,2e3);return()=>{n=!0,clearInterval(i)}},[e,t]),S)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`live · ${n}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Connecting…`))));if(w&&!m)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`live · ${n}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:w}));let E=process.stdout.columns??80,D=Math.max(20,Math.min(40,Math.floor(E/3)));return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`live · ${n}`}),_.createElement(f,{flexDirection:`row`},_.createElement(d,{title:`Active now`,value:m?.activeVisitors??0,format:`number`,width:D}),_.createElement(i,{title:`Globe`,width:Math.max(40,E-D-4)},_.createElement(u,{data:[],width:Math.max(36,E-D-10),height:10}))),_.createElement(i,{title:`Recent events`},!m||m.recentEvents.length===0?_.createElement(p,{color:`gray`},`— waiting for events —`):m.recentEvents.slice(0,15).map((e,t)=>_.createElement(f,{key:t},_.createElement(p,{color:`cyan`},(e.type??`pageview`).padEnd(10)),_.createElement(p,null,e.path.padEnd(36).slice(0,36)),_.createElement(p,{color:`gray`},e.country??`—`)))),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{x as liveCommand};
|
package/dist/login-Bb_At1Ov.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CZ9IzjIH.js";import"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import"./emit-BmfLGjqr.js";import{loginCommand as e}from"./login-DvMRHd3J.js";export{e as loginCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{DataTable as u}from"./data-table-EsLUu8Hj.js";import{MetricCard as d}from"./metric-card-CtAoTOEP.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useState as y}from"react";import b from"ink-spinner";async function x(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 l=new c({config:a,cliVersion:i.cliVersion,token:o}),u,d;try{({siteId:u,site:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(r(i)){let e=await S(l,u,`24h`);return n({type:`overview.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(C,{api:l,siteId:u,siteLabel:f,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}async function S(e,t,n){let[r,i]=await Promise.all([e.getStats(t,n).catch(()=>null),e.getPages(t).catch(()=>[])]),a=i.reduce((e,t)=>e+t.views,0);return{visitors:r?.visitors??0,pageviews:r?.pageviews??a,bounceRate:r?.bounceRate??null,avgSession:r?.avgSessionSec??null,series:[],topPages:i.slice(0,10)}}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=h(),[m,x]=y(null),[C,w]=y(!0),[T,E]=y(null),[D,O]=y(`24h`),[k,A]=y(t),[j,M]=y(n),[N,P]=y(!1),[F,I]=y([]);g(async t=>{if(t===`q`){c(),s(0);return}if(t===`1`){O(`24h`);return}if(t===`2`){O(`7d`);return}if(t===`3`){O(`30d`);return}if(t===`4`){O(`90d`);return}if(t===`s`){if(F.length===0)try{let t=await e.getSites();I(t)}catch{}P(e=>!e);return}}),v(()=>{let t=!1;return w(!0),(async()=>{try{let n=await S(e,k,D);t||(x(n),w(!1))}catch(e){t||(E(e.message),w(!1))}})(),()=>{t=!0}},[e,k,D]);let L=()=>_.createElement(i,{title:`Switch site`,state:`idle`},F.length===0?_.createElement(p,{color:`gray`},`Loading your sites…`):F.map(e=>_.createElement(f,{key:e.id},_.createElement(p,{color:e.id===k?`cyan`:`gray`},e.id===k?`› `:` `),_.createElement(p,{bold:e.id===k},e.name),_.createElement(p,{color:`gray`},` (`,e.url.replace(/^https?:\/\//,``).replace(/\/$/,``),`)`))),_.createElement(f,{marginTop:1},_.createElement(p,{color:`gray`},`Press `),_.createElement(p,{color:`cyan`},`[number]`),_.createElement(p,{color:`gray`},` to pick, `),_.createElement(p,{color:`cyan`},`[s]`),_.createElement(p,{color:`gray`},` to close.`)));g(e=>{if(!N)return;let t=Number(e);if(Number.isInteger(t)&&t>=1&&t<=F.length){let e=F[t-1];A(e.id),M(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),P(!1)}},{isActive:N});let R=`overview · ${j} · ${D}`,z=[{key:`q`,label:`quit`},{key:`s`,label:`site`},{key:`1-4`,label:`range (24h/7d/30d/90d)`}];if(C)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:R}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`cyan`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching dashboard…`))),N?L():null);if(T)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:R}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:T}),N?L():null,_.createElement(o,{items:z}));if(!m||m.visitors===0&&m.pageviews===0&&m.topPages.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:R}),_.createElement(l,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event — or press [s] to switch to a different site, or [1-4] to widen the time range.`}),N?L():null,_.createElement(o,{items:z}));let B=process.stdout.columns??80,V=Math.max(18,Math.floor(B/4)-1),H=[{key:`path`,label:`path`,width:32},{key:`views`,label:`views`,align:`right`,width:8},{key:`uniqueVisitors`,label:`visitors`,align:`right`,width:8},{key:`avgTime`,label:`avg time`,align:`right`,width:9,format:e=>typeof e==`number`?`${Math.round(e/1e3)}s`:`—`},{key:`bounceRate`,label:`bounce`,align:`right`,width:7,format:e=>typeof e==`number`?`${(e*100).toFixed(0)}%`:`—`}];return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:R}),_.createElement(f,{flexDirection:`row`},_.createElement(d,{title:`Visitors`,value:m.visitors,format:`number`,width:V}),_.createElement(d,{title:`Pageviews`,value:m.pageviews,format:`number`,width:V}),_.createElement(d,{title:`Bounce rate`,value:m.bounceRate??``,emptyHint:`—`,format:`percent`,width:V}),_.createElement(d,{title:`Avg session`,value:m.avgSession??``,emptyHint:`—`,format:`duration`,width:V})),_.createElement(i,{title:`Top pages (${D})`},m.topPages.length===0?_.createElement(p,{color:`gray`},`No pages with data in this window yet.`):_.createElement(u,{columns:H,data:m.topPages,zebra:!0})),N?L():null,_.createElement(o,{items:z}))};export{x as overviewCommand};
|
package/dist/pages-DXpXKnCy.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{DataTable as u}from"./data-table-EsLUu8Hj.js";import{Box as d,Text as f,render as p,useApp as m,useInput as h}from"ink";import g,{useEffect as _,useState as v}from"react";import y from"ink-spinner";async function b(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 l=new c({config:a,cliVersion:i.cliVersion,token:o}),u,d;try{({siteId:u,site:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(r(i)){let e=await l.getPages(u);return n({type:`pages.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=p(g.createElement(x,{api:l,siteId:u,siteLabel:f,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const x=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=m(),[p,b]=v(null),[x,S]=v(!0),[C,w]=v(null);if(h(e=>{e===`q`&&(c(),s(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getPages(t);n||(b(r),S(!1))}catch(e){n||(w(e.message),S(!1))}})(),()=>{n=!0}},[e,t]),x)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`pages · ${n}`}),g.createElement(i,{title:`Loading`,state:`busy`},g.createElement(d,null,g.createElement(f,{color:`magenta`},g.createElement(y,{type:`dots`})),g.createElement(f,null,` Fetching pages…`))));if(C)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`pages · ${n}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:C}));if(!p||p.length===0)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`pages · ${n}`}),g.createElement(l,{reason:`no-data`,headline:`No pages yet`,hint:`Visit your site to send the first event`}));let T=[{key:`path`,label:`path`,width:36},{key:`views`,label:`views`,align:`right`,width:8},{key:`uniqueVisitors`,label:`unique`,align:`right`,width:8},{key:`avgTime`,label:`avg time`,align:`right`,width:9,format:e=>typeof e==`number`?`${Math.round(e/1e3)}s`:`—`},{key:`bounceRate`,label:`bounce`,align:`right`,width:7,format:e=>typeof e==`number`?`${(e*100).toFixed(0)}%`:`—`}];return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`pages · ${n}`}),g.createElement(i,{title:`Top pages (${p.length})`},g.createElement(u,{columns:T,data:p,zebra:!0})),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{b as pagesCommand};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as i}from"./analytical-screen-DlNffR1j.js";import{Table as a}from"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Text as c}from"ink";import l from"react";function u(){let e=process.stdout.columns??80,t=Math.max(40,e-4-18),n=1,r=t-n,i=Math.max(8,Math.floor(r*.3)),a=Math.max(8,Math.floor(r*.32)),o=Math.max(4,Math.floor(r*.1)),s=Math.max(6,Math.floor(r*.12)),c=Math.max(4,r-i-a-o-s);return{current:n,name:i,domain:a,tier:o,pageviews24h:s,id:c}}async function d(d){let f=await e(),p=await t({strict:!1}),m=new s({config:f,cliVersion:d.cliVersion,token:p}),h,g;try{({siteId:h,site:g}=await o(m,{explicit:d.siteId,headless:!!(d.json||d.csv||d.tsv||d.ndjson),cliVersion:d.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let _=r(d),v=u(),y=[{key:`isCurrent`,header:``,width:v.current,format:e=>e?`*`:` `},{key:`name`,header:`project`,width:v.name},{key:`domain`,header:`domain`,width:v.domain,format:e=>String(e??`—`)},{key:`tier`,header:`tier`,width:v.tier},{key:`pageviews24h`,header:`24h pv`,width:v.pageviews24h,align:`right`},{key:`id`,header:`id`,width:v.id}];return i({cliVersion:d.cliVersion,title:`projects · ${p?.teamId??`—`}`,commandName:`projects`,authToken:p?.accessToken??null,refreshIntervalMs:0,fetcher:e=>m.getProjects(h,e),format:_,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let t of e.projects)process.stdout.write(JSON.stringify(t)+`
|
|
2
|
-
`);else process.stdout.write(JSON.stringify(e,null,2));return}process.stdout.write(n(e.projects,[`id`,`name`,`domain`,`tier`,`pageviews24h`,`isCurrent`],t))},keybindings:{s:{label:`switch project (logout + login)`,handler:()=>{process.stderr.write("To switch project: run `zenovay logout` then `zenovay login`.\n")}}},panels:[{id:`projects`,title:`Projects`,render:e=>e.projects.length===0?l.createElement(c,{color:`gray`},`— no projects yet —`):l.createElement(a,{data:e.projects,columns:y})}]})}export{d as projectsCommand};
|
package/dist/prompt-CIl9JOlh.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{useTheme as e}from"./panel-Crm-x-5U.js";import{Box as t,Text as n,useInput as r}from"ink";import i,{useCallback as a,useState as o}from"react";import s from"ink-select-input";import c from"ink-text-input";function l(){let e=process.stdout.columns;return typeof e==`number`&&e>0?e:80}function u({version:r,subtitle:a}){let{theme:o}=e(),s=l(),c=`ZENOVAY`,u=`v${r}`,d=`╭─ `,f=` · `,p=` `,m=`─╮`,h=d.length+c.length+f.length+u.length+p.length+m.length,g=Math.max(2,s-h),_=`─`.repeat(g),v=`─`.repeat(Math.max(2,s-2)),y=a??``,b=y.slice(0,Math.max(0,s-4)),x=` `.repeat(Math.max(1,s-2-1-b.length-1));return i.createElement(t,{flexDirection:`column`},i.createElement(t,{flexDirection:`row`},i.createElement(n,{color:o.border},d),i.createElement(n,{color:o.accent,bold:!0},c),i.createElement(n,{color:o.dim},f,u),i.createElement(n,{color:o.border},p,_,m)),a?i.createElement(t,{flexDirection:`row`},i.createElement(n,{color:o.border},`│ `),i.createElement(n,{color:o.fg},b),i.createElement(n,{color:o.border},x,`│`)):null,i.createElement(t,{flexDirection:`row`},i.createElement(n,{color:o.border},`╰`,v,`╯`)))}function d({hints:t}){let{theme:r}=e();return i.createElement(n,{color:r.dim},t)}function f({items:r,onSelect:c}){let{theme:l}=e(),[u,f]=o(r[0]),[p,m]=o(null),h=a(e=>{m({label:e.label}),setTimeout(()=>c(e.value),200)},[c]),g=a(e=>{f(e)},[]);return p?i.createElement(n,{color:l.success},`✓ `,p.label):i.createElement(t,{flexDirection:`column`},i.createElement(s,{items:r.map((e,t)=>({key:`${t}`,label:e.label,value:e.value})),onSelect:e=>{let t=r.find(t=>t.value===e.value);t&&h(t)},onHighlight:e=>{let t=r.find(t=>t.value===e.value);t&&g(t)}}),u?.description?i.createElement(t,{marginTop:1},i.createElement(n,{color:l.muted},u.description)):null,i.createElement(t,{marginTop:1},i.createElement(d,{hints:`[↑↓/jk nav] [enter select]`})))}function p({question:r,onSubmit:a,placeholder:s,mask:l}){let{theme:u}=e(),[f,p]=o(``);return i.createElement(t,{flexDirection:`column`},i.createElement(t,null,i.createElement(n,{color:u.fg},r,` `),i.createElement(c,{value:f,onChange:p,onSubmit:e=>a(e),placeholder:s,mask:l?`•`:void 0})),i.createElement(d,{hints:`[enter submit]`}))}export{u as Banner,f as Select,p as TextInput};
|
package/dist/query-B88NMsPY.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{Table as o}from"./ui-BLnL2HSo.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{requireTier as l}from"./tier-DJvWU86k.js";import{Box as u,Text as d,useApp as f,useInput as p}from"ink";import m,{useMemo as h,useState as g}from"react";import _ from"ink-text-input";function v({api:e,siteId:t,maxRows:n}){let{exit:r}=f(),[s,c]=g(``),[l,v]=g(null),[y,b]=g(null),[x,S]=g(!1),[C,w]=g([]);p((e,t)=>{t.escape&&r()});let T=async i=>{if(i.trim()){if(i.trim()===`\\q`||i.trim()===`exit`||i.trim()===`quit`){r();return}w(e=>[...e,i]),S(!0),b(null);try{let r=await e.runSqlQuery(t,i,{maxRows:n});v(r)}catch(e){b(e.message),v(null)}finally{S(!1),c(``)}}},E=h(()=>l?l.columns.map(e=>({key:e,header:e,width:18,format:e=>e==null?`∅`:String(e).slice(0,18)})):[],[l]);return m.createElement(u,{flexDirection:`column`},m.createElement(a,{version:`query`}),m.createElement(i,{title:`History`,state:`idle`},C.length===0?m.createElement(d,{color:`gray`},`— no queries yet — Esc or \\q to exit —`):C.slice(-5).map((e,t)=>m.createElement(d,{key:t,color:`gray`},`> ${e.slice(0,80)}${e.length>80?`…`:``}`))),m.createElement(u,null,m.createElement(d,{color:`magenta`},`sql`,`>`,` `),m.createElement(_,{value:s,onChange:c,onSubmit:T})),x?m.createElement(d,{color:`gray`},`running…`):null,y?m.createElement(i,{title:`Error`,state:`err`},m.createElement(d,{color:`red`},y)):null,l?m.createElement(i,{title:`${l.row_count} rows · ${l.duration_ms}ms${l.truncated?` · truncated`:``}`,state:`ok`},l.row_count===0?m.createElement(d,{color:`gray`},`— empty —`):m.createElement(o,{data:l.rows.slice(0,50),columns:E})):null)}async function y(i){let a=await e(),o=await t({strict:!1}),u=new c({config:a,cliVersion:i.cliVersion,token:o});try{await l(u,`scale`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d;try{({siteId:d}=await s(u,{explicit:i.siteId,headless:!!(i.json||i.csv||i.tsv||i.ndjson),cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=i.maxRows??1e3,p=r(i);if(i.sql)try{let e=await u.runSqlQuery(d,i.sql,{maxRows:f});if(p===`json`)process.stdout.write(JSON.stringify(e,null,2)),process.stdout.write(`
|
|
2
|
-
`);else if(p===`ndjson`)for(let t of e.rows)process.stdout.write(JSON.stringify(t)+`
|
|
3
|
-
`);else if(p===`csv`||p===`tsv`)process.stdout.write(n(e.rows,e.columns,p));else{let t=e.columns.map(t=>Math.max(t.length,...e.rows.map(e=>String(e[t]??``).length))),n=`+`+t.map(e=>`-`.repeat(e+2)).join(`+`)+`+`;process.stdout.write(n+`
|
|
4
|
-
`),process.stdout.write(`|`+e.columns.map((e,n)=>` ${e.padEnd(t[n]??0)} `).join(`|`)+`|
|
|
5
|
-
`),process.stdout.write(n+`
|
|
6
|
-
`);for(let n of e.rows.slice(0,200))process.stdout.write(`|`+e.columns.map((e,r)=>` ${String(n[e]??``).padEnd(t[r]??0)} `).join(`|`)+`|
|
|
7
|
-
`);process.stdout.write(n+`
|
|
8
|
-
`),process.stdout.write(`${e.row_count} rows · ${e.duration_ms}ms${e.truncated?` · truncated`:``}\n`)}return 0}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}let{render:h}=await import(`ink`);return await h(m.createElement(v,{api:u,siteId:d,maxRows:f})).waitUntilExit(),0}export{y as queryCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{requireTier as u}from"./tier-DJvWU86k.js";import{Box as d,Text as f,render as p,useApp as m,useInput as h}from"ink";import g,{useEffect as _,useState as v}from"react";import y from"ink-spinner";function b(e){return e>=.6?`magenta`:e>=.4?`cyan`:e>=.2?`blue`:`gray`}function x(e){return!Number.isFinite(e)||e===0?` — `:` ${(e*100).toFixed(0).padStart(3)}% `}async function S(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 l=new c({config:a,cliVersion:i.cliVersion,token:o});try{await u(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let m=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(r(i)){let e=await l.getRetention(d);return n({type:`retention.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=p(g.createElement(C,{api:l,siteId:d,siteLabel:m,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=m(),[u,p]=v(null),[S,C]=v(!0),[w,T]=v(null);return h(e=>{e===`q`&&(c(),s(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getRetention(t);n||(p(r.cohorts),C(!1))}catch(e){n||(T(e.message),C(!1))}})(),()=>{n=!0}},[e,t]),S?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`retention · ${n}`}),g.createElement(i,{title:`Loading`,state:`busy`},g.createElement(d,null,g.createElement(f,{color:`magenta`},g.createElement(y,{type:`dots`})),g.createElement(f,null,` Crunching cohorts…`)))):w?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`retention · ${n}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:w})):!u||u.length===0?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`retention · ${n}`}),g.createElement(l,{reason:`no-data`,headline:`No retention data yet`,hint:`Retention needs at least 30 days of traffic`})):g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:r,subtitle:`retention · ${n}`}),g.createElement(i,{title:`Cohort retention (D1 / D7 / D30)`},g.createElement(d,{flexDirection:`row`},g.createElement(f,{bold:!0},`cohort`.padEnd(12)),g.createElement(f,{bold:!0},` D1 `),g.createElement(f,{bold:!0},` D7 `),g.createElement(f,{bold:!0},` D30 `)),u.map(e=>g.createElement(d,{key:e.date,flexDirection:`row`},g.createElement(f,null,e.date.padEnd(12).slice(0,12)),g.createElement(f,{color:b(e.day1)},x(e.day1)),g.createElement(f,{color:b(e.day7)},x(e.day7)),g.createElement(f,{color:b(e.day30)},x(e.day30))))),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{S as retentionCommand};
|
package/dist/revenue-Dsy6ODmG.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import{spark as i}from"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as a}from"./analytical-screen-DlNffR1j.js";import"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Box as c,Text as l}from"ink";import u from"react";function d(e,t){let n=e/100,r=new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:0}).format(n),i=(t||`USD`).toUpperCase();return i===`USD`?`$${r}`:i===`EUR`?`€${r}`:i===`GBP`?`£${r}`:`${r} ${i}`}async function f(f){let p=await e(),m=await t({strict:!1}),h=new s({config:p,cliVersion:f.cliVersion,token:m}),g,_;try{({siteId:g,site:_}=await o(h,{explicit:f.siteId,headless:!!(f.json||f.csv||f.tsv||f.ndjson),cliVersion:f.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let v=r(f),y=f.range??`30d`;return a({cliVersion:f.cliVersion,title:`revenue · ${g} · ${y}`,commandName:`revenue`,authToken:m?.accessToken??null,refreshIntervalMs:f.watch?5*6e4:0,fetcher:e=>h.getRevenue(g,y,e),format:v,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(n(e.series,[`bucket`,`amount`,`currency`,`transactions`],t))},panels:[{id:`totals`,title:`Top line`,render:e=>u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{color:`green`,bold:!0},d(e.totalAmount,e.currency)),` `,u.createElement(l,{color:`gray`},`total · `,e.totalTransactions,` transactions`)),typeof e.mrr==`number`?u.createElement(l,null,u.createElement(l,{bold:!0},`MRR `),u.createElement(l,{color:`magenta`},d(e.mrr,e.currency)),typeof e.arpu==`number`?u.createElement(l,{color:`gray`},` · ARPU `,d(e.arpu,e.currency)):null):null)},{id:`series`,title:`Daily (${y})`,render:e=>{let t=e.series.map(e=>e.amount);if(t.length===0)return u.createElement(l,{color:`gray`},`— no transactions —`);let n=Math.max(...t,1);return u.createElement(c,{flexDirection:`column`},u.createElement(l,{color:`magenta`},i(t,Math.min(60,t.length*2))),u.createElement(l,{color:`gray`},`peak: `,d(n,e.currency),` ·`,` `,`avg: `,d(e.totalAmount/Math.max(1,t.length),e.currency)))}},{id:`window`,title:`Window`,render:e=>u.createElement(l,{color:`gray`},new Date(e.windowStart).toISOString().slice(0,10),` →`,` `,new Date(e.windowEnd).toISOString().slice(0,10))}]})}export{f as revenueCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{DataTable as u}from"./data-table-EsLUu8Hj.js";import{requireTier as d}from"./tier-DJvWU86k.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useState as y}from"react";import b from"ink-spinner";function x(e){if(!e||e<=0)return`—`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return`${n}m ${(t%60).toString().padStart(2,`0`)}s`}function S(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));return n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:`${Math.floor(n/86400)}d`}async function C(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 l=new c({config:a,cliVersion:i.cliVersion,token:o});try{await d(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(r(i)){let e=await l.getSessions(u);return n({type:`sessions.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(w,{api:l,siteId:u,siteLabel:p,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=h(),[d,m]=y(null),[C,w]=y(!0),[T,E]=y(null);if(g(e=>{e===`q`&&(c(),s(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getSessions(t);n||(m(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`sessions · ${n}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching sessions…`))));if(T)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`sessions · ${n}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:T}));if(!d||d.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`sessions · ${n}`}),_.createElement(l,{reason:`no-data`,headline:`No replays yet`,hint:`Enable session replay in your site settings`}));let D=[{key:`id`,label:`session id`,width:24},{key:`visitor`,label:`visitor`,width:18},{key:`duration`,label:`duration`,align:`right`,width:9,format:e=>x(e)},{key:`startedAt`,label:`when`,align:`right`,width:6,format:e=>S(String(e))},{key:`pageCount`,label:`events`,align:`right`,width:7},{key:`deviceType`,label:`device`,width:8,format:e=>String(e??`—`)}];return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`sessions · ${n}`}),_.createElement(i,{title:`Recent sessions (${d.length})`},_.createElement(u,{columns:D,data:d,zebra:!0})),_.createElement(f,{marginTop:1},_.createElement(p,{color:`gray`},`Open any session for replay at https://app.zenovay.com/replay`)),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{C as sessionsCommand};
|
package/dist/sources-DkEkhs1V.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as i}from"./analytical-screen-DlNffR1j.js";import{Table as a}from"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Box as c,Text as l}from"ink";import u from"react";function d(e,t){let n=Math.round(e/100*t);return`█`.repeat(n)+`░`.repeat(Math.max(0,t-n))}function f(e){return e==null?{glyph:`·`,color:`gray`}:e>.5?{glyph:`▲`,color:`green`}:e<-.5?{glyph:`▼`,color:`red`}:{glyph:`→`,color:`gray`}}async function p(p){let m=await e(),h=await t({strict:!1}),g=new s({config:m,cliVersion:p.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=r(p),b=p.period??`30d`,x=[{key:`source`,header:`source`,width:22},{key:`channel`,header:`channel`,width:10,format:e=>String(e??`—`)},{key:`visitors`,header:`visitors`,width:8,align:`right`},{key:`delta`,header:`Δ`,width:6,align:`right`,format:e=>typeof e==`number`?`${e>0?`+`:``}${(e*100).toFixed(1)}%`:`—`}];return i({cliVersion:p.cliVersion,title:`sources · ${_} · ${b}`,commandName:`sources`,authToken:h?.accessToken??null,refreshIntervalMs:6e4,fetcher:e=>g.getSources(_,b,p.compare,e),format:y,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(n(e.sources,[`source`,`channel`,`visitors`,`conversions`,`revenue`,`delta`],t))},panels:[{id:`summary`,title:`Total`,render:e=>u.createElement(l,null,u.createElement(l,{bold:!0},e.totalVisitors.toLocaleString()),` `,u.createElement(l,{color:`gray`},`visitors · `,e.sources.length,` sources`))},{id:`channels`,title:`By channel`,render:e=>{if(e.sources.length===0)return u.createElement(l,{color:`gray`},`— no source data —`);let t=e.totalVisitors||1,n=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return u.createElement(c,{flexDirection:`column`},n.map((e,n)=>{let r=e.visitors/t*100,i=f(e.delta);return u.createElement(c,{key:`${e.source}-${n}`},u.createElement(l,null,u.createElement(l,{color:`cyan`},e.source.padEnd(20).slice(0,20)),` `,u.createElement(l,{color:`magenta`},d(r,30)),` `,u.createElement(l,null,e.visitors.toString().padStart(6),` `),u.createElement(l,{color:`gray`},`(`,r.toFixed(1),`%)`),` `,u.createElement(l,{color:i.color},i.glyph)))}))}},{id:`table`,title:`Detail`,render:e=>e.sources.length===0?u.createElement(l,{color:`gray`},`— —`):u.createElement(a,{data:e.sources.slice(0,20),columns:x})}]})}export{p as sourcesCommand};
|
package/dist/stats-B4iRNAEW.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as i}from"./analytical-screen-DlNffR1j.js";import{Table as a}from"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Box as c,Text as l}from"ink";import u from"react";function d(e){return`${(e*100).toFixed(1)}%`}function f(e){return e<60?`${Math.round(e)}s`:e<3600?`${Math.floor(e/60)}m ${Math.round(e%60)}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}async function p(p){let m=await e(),h=await t({strict:!1}),g=new s({config:m,cliVersion:p.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=r(p),b=p.range??`24h`,x=[{key:`url`,header:`page`,width:40,format:e=>String(e??`—`)},{key:`views`,header:`views`,width:8,align:`right`}],S=[{key:`country`,header:`country`,width:8},{key:`visitors`,header:`visitors`,width:8,align:`right`}];return i({cliVersion:p.cliVersion,title:`stats · ${_} · ${b}`,commandName:`stats`,authToken:h?.accessToken??null,refreshIntervalMs:p.watch?6e4:0,fetcher:e=>g.getStats(_,b,e),format:y,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(n([{range:b,visitors:e.visitors,pageviews:e.pageviews,sessions:e.sessions,bounceRate:d(e.bounceRate),avgSession:f(e.avgSessionSec)}],[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSession`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{bold:!0},e.visitors.toLocaleString()),u.createElement(l,{color:`gray`},` visitors `),u.createElement(l,{bold:!0},e.pageviews.toLocaleString()),u.createElement(l,{color:`gray`},` pageviews `),u.createElement(l,{bold:!0},e.sessions.toLocaleString()),u.createElement(l,{color:`gray`},` sessions`)),u.createElement(l,{color:`gray`},`bounce `,d(e.bounceRate),` · avg session `,f(e.avgSessionSec)))},{id:`pages`,title:`Top pages`,render:e=>e.topPages.length===0?u.createElement(l,{color:`gray`},`— no pages —`):u.createElement(a,{data:e.topPages.slice(0,10),columns:x})},{id:`countries`,title:`Top countries`,render:e=>e.topCountries.length===0?u.createElement(l,{color:`gray`},`— no country data —`):u.createElement(a,{data:e.topCountries.slice(0,10),columns:S})}]})}export{p as statsCommand};
|
package/dist/themes-DxPebZga.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import"./ui-BLnL2HSo.js";import{promises as o}from"node:fs";import{Box as s,Text as c,render as l}from"ink";import u from"react";const d=[{name:`mocha`,theme:n,mode:`dark`},{name:`latte`,theme:t,mode:`light`},{name:`dracula`,theme:e,mode:`dark`},{name:`tokyoNight`,theme:i,mode:`dark`},{name:`nord`,theme:r,mode:`dark`}],f=[`name`,`bg`,`fg`,`muted`,`accent`,`accent2`,`success`,`warn`,`error`,`border`,`dim`];function p({name:e,theme:t,mode:n}){let r=[t.accent,t.accent2,t.success,t.warn,t.error];return u.createElement(s,{flexDirection:`row`},u.createElement(c,{bold:!0},e.padEnd(14)),u.createElement(c,{color:`gray`},n.padEnd(7)),r.map((e,t)=>u.createElement(c,{key:t,color:e},`████`,` `)),u.createElement(c,{color:`gray`},t.bg))}function m({themes:e}){return u.createElement(s,{flexDirection:`column`},u.createElement(a,{version:`themes`}),u.createElement(s,{marginTop:1,marginBottom:1},u.createElement(c,{color:`gray`},e.length,` themes — pass --theme <name> to any command, or set in your config.`)),u.createElement(s,{flexDirection:`column`},u.createElement(s,null,u.createElement(c,{bold:!0},`name`.padEnd(14)),u.createElement(c,{bold:!0},`mode`.padEnd(7)),u.createElement(c,{bold:!0},`swatch`.padEnd(28)),u.createElement(c,{bold:!0},`bg`)),e.map(({name:e,theme:t,mode:n})=>u.createElement(p,{key:e,name:e,theme:t,mode:n}))))}async function h(e){if(e.validate){let t;try{let n=await o.readFile(e.validate,`utf8`);t=JSON.parse(n)}catch(t){return process.stderr.write(`✗ Failed to read ${e.validate}: ${t.message}\n`),1}let n=f.filter(e=>t[e]==null);return n.length>0?(process.stderr.write(`✗ Missing required tokens: ${n.join(`, `)}\n`),e.json&&process.stdout.write(JSON.stringify({ok:!1,missing:n},null,2)+`
|
|
2
|
-
`),1):(process.stdout.write(`✔ Valid theme (${f.length} tokens present).\n`),e.json&&process.stdout.write(JSON.stringify({ok:!0,theme:t},null,2)+`
|
|
3
|
-
`),0)}if(e.json)return process.stdout.write(JSON.stringify({themes:d.map(({name:e,theme:t,mode:n})=>({name:e,mode:n,background:t.bg,foreground:t.fg,accent:t.accent}))},null,2)+`
|
|
4
|
-
`),0;let{waitUntilExit:t}=l(u.createElement(m,{themes:d}));return await t(),0}export{h as themesCommand};
|
package/dist/uptime-DMK_yhMW.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import"./formatter-BNYzdX5c.js";import{emit as n,isHeadless as r}from"./emit-BmfLGjqr.js";import{Panel as i}from"./panel-Crm-x-5U.js";import{Banner as a}from"./prompt-CIl9JOlh.js";import{Keybar as o}from"./keybar-DO-sCbJB.js";import{resolveSiteId as s}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as c}from"./api-v2-C7yrqNuV.js";import{EmptyState as l}from"./empty-state-ETu78blH.js";import{DataTable as u}from"./data-table-EsLUu8Hj.js";import{requireTier as d}from"./tier-DJvWU86k.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useState as y}from"react";import b from"ink-spinner";function x(e){return e===`up`?{glyph:`● up`,color:`green`}:e===`down`?{glyph:`● down`,color:`red`}:{glyph:`○ unknown`,color:`gray`}}function S(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.round((t-Date.now())/(1e3*60*60*24));return`${n}d`}async function C(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 l=new c({config:a,cliVersion:i.cliVersion,token:o});try{await d(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(r(i)){let e=await l.getUptime(u);return n({type:`uptime.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(w,{api:l,siteId:u,siteLabel:p,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:s})=>{let{exit:c}=h(),[d,m]=y(null),[C,w]=y(!0),[T,E]=y(null);if(g(e=>{e===`q`&&(c(),s(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getUptime(t);n||(m(r.monitors),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`uptime · ${n}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching monitors…`))));if(T)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`uptime · ${n}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:T}));if(!d||d.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`uptime · ${n}`}),_.createElement(l,{reason:`no-data`,headline:`No monitors configured`,hint:`Add one at app.zenovay.com/uptime`}));let D=[{key:`url`,label:`monitor`,width:36},{key:`status`,label:`status`,width:12,format:e=>x(String(e)).glyph},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:7,format:e=>S(e)}];return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:r,subtitle:`uptime · ${n}`}),_.createElement(i,{title:`Monitors (${d.length})`},_.createElement(u,{columns:D,data:d,zebra:!0})),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{C as uptimeCommand};
|
package/dist/vitals-pqv_u431.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{formatTabular as n,selectFormat as r}from"./formatter-BNYzdX5c.js";import"./panel-Crm-x-5U.js";import"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import{runAnalyticalScreen as i}from"./analytical-screen-DlNffR1j.js";import{Table as a}from"./ui-BLnL2HSo.js";import{resolveSiteId as o}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as s}from"./api-v2-C7yrqNuV.js";import{Box as c,Text as l}from"ink";import u from"react";const d={lcp:{good:2500,poor:4e3},inp:{good:200,poor:500},cls:{good:.1,poor:.25},ttfb:{good:800,poor:1800},fcp:{good:1800,poor:3e3}};function f(e,t){let n=d[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function p(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function m(d){let m=await e(),h=await t({strict:!1}),g=new s({config:m,cliVersion:d.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:d.siteId,headless:!!(d.json||d.csv||d.tsv||d.ndjson),cliVersion:d.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=r(d),b=[{key:`url`,header:`url`,width:32},{key:`device`,header:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,header:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`lcp`,e.p75):`—`},{key:`inp`,header:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`inp`,e.p75):`—`},{key:`cls`,header:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`cls`,e.p75):`—`},{key:`samples`,header:`n`,width:6,align:`right`}];return i({cliVersion:d.cliVersion,title:`vitals · ${_}`,commandName:`vitals`,authToken:h?.accessToken??null,refreshIntervalMs:d.watch?5*6e4:0,fetcher:e=>g.getVitals(_,{url:d.url,device:d.device,window:d.window},e),format:y,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(n(e.vitals,[`url`,`device`,`samples`],t))},panels:[{id:`summary`,title:`Site-wide p75`,render:e=>{let t=t=>{let n=0,r=0;for(let i of e.vitals){let e=i[t]?.p75;typeof e==`number`&&(n+=e*i.samples,r+=i.samples)}return r>0?n/r:0},n=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return u.createElement(c,{flexDirection:`column`},n.map(e=>{let n=t(e),r=f(e,n);return u.createElement(l,{key:e},u.createElement(l,{color:r.color},`● `),u.createElement(l,{bold:!0},e.toUpperCase().padEnd(5)),` `,u.createElement(l,null,p(e,n).padStart(8)),` `,u.createElement(l,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?u.createElement(l,{color:`gray`},`— no vitals data yet —`):u.createElement(a,{data:e.vitals.slice(0,15),columns:b})}]})}export{m as vitalsCommand};
|
package/dist/watch-CbehE_bK.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{parseSseStream as n}from"./client-vixcHdv-.js";import"./formatter-BNYzdX5c.js";import{emit as r,isHeadless as i}from"./emit-BmfLGjqr.js";import{Panel as a}from"./panel-Crm-x-5U.js";import{Banner as o}from"./prompt-CIl9JOlh.js";import{Keybar as s}from"./keybar-DO-sCbJB.js";import{spark as c}from"./sparkline-ut0Tvv-E.js";import{resolveSiteId as l}from"./resolve-site-CKq90Xzu.js";import{ApiV2Client as u}from"./api-v2-C7yrqNuV.js";import{EmptyState as d}from"./empty-state-ETu78blH.js";import{Globe as f}from"./globe-1bi4DjwJ.js";import{z as p}from"zod";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";import C from"ink-text-input";const w=p.object({siteId:p.string().optional(),window:p.string().optional(),totalVisitors:p.number().optional(),visitors:p.object({count:p.number().optional(),series:p.array(p.number()).optional()}).optional(),topPages:p.array(p.object({path:p.string(),views:p.number().optional(),count:p.number().optional()})).optional(),sources:p.array(p.object({source:p.string(),visitors:p.number()})).optional()}).passthrough();async function T(n){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 u({config:a,cliVersion:n.cliVersion,token:o}),c;try{({siteId:c}=await l(s,{explicit:n.siteId,headless:!!n.json,cliVersion:n.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(i(n)){let e=await s.getDashboardSnapshot(c);return r({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:s,siteId:c,intervalMs:n.intervalMs??15e3,cliVersion:n.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,intervalMs:r,cliVersion:i,onExit:c})=>{let{exit:l}=_(),[u,p]=x(null),[g,C]=x(null),[T,E]=x(null),[P,F]=x([]),[I,L]=x(!0),[R,z]=x(null),[B,V]=x(1),[H,U]=x(!1),[W,G]=x(!1);v((e,t)=>{if(e===`q`){l(),c(0);return}if(e===`?`||e===`/`){G(e=>!e);return}if(e===`g`){U(e=>!e);return}if(t.tab){V(e=>{let n=t.shift?(e+4)%6+1:e%6+1;return n});return}(e===`1`||e===`2`||e===`3`||e===`4`||e===`5`||e===`6`)&&V(Number(e))});let[K,q]=x(!1);if(b(()=>{let n=!1,i=async()=>{try{let r=await e.getDashboardSnapshot(t);if(n)return;let i=w.safeParse(r);if(!i.success){q(!0),L(!1);return}q(!1);let a=i.data,o={visitors:a.visitors??(typeof a.totalVisitors==`number`?{count:a.totalVisitors}:void 0),topPages:a.topPages?.map(e=>({path:e.path,views:e.views??e.count??0})),sources:a.sources};p(o),e.getVitals(t).then(e=>{n||C(e)},()=>{}),e.getGoals(t).then(e=>{n||E(e)},()=>{}),L(!1),z(null)}catch(e){n||z(e.message)}};i();let a=setInterval(i,r);return()=>{n=!0,clearInterval(a)}},[e,t,r]),b(()=>{let r=new AbortController;return(async()=>{try{let i=await e.openEventsStream(t,r.signal);for await(let e of n(i))e.type===`error`&&F(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>r.abort()},[e,t]),I)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:i,subtitle:`watch · ${t}`}),y.createElement(a,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching snapshot…`))));if(R&&!u)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:i,subtitle:`watch · ${t}`}),y.createElement(a,{title:`Error`,state:`err`},y.createElement(h,{color:`red`},R)));if(K&&!u)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:i,subtitle:`watch · ${t}`}),y.createElement(d,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let J=process.stdout.columns??80,Y=Math.max(20,Math.floor(J/3)-1),X=[];return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:i,subtitle:`watch · ${t}${H?` · globe`:``}`}),y.createElement(m,{flexDirection:`row`},y.createElement(m,{flexDirection:`column`},H?y.createElement(a,{title:`Live globe`,focused:B===1,width:Y},y.createElement(f,{data:X,width:Math.max(40,Y-4),height:12})):y.createElement(O,{snapshot:u,focused:B===1,width:Y}),y.createElement(j,{events:P,focused:B===4,width:Y})),y.createElement(m,{flexDirection:`column`},y.createElement(k,{snapshot:u,focused:B===2,width:Y}),y.createElement(M,{vitals:g,focused:B===5,width:Y})),y.createElement(m,{flexDirection:`column`},y.createElement(A,{snapshot:u,focused:B===3,width:Y}),y.createElement(N,{goals:T,focused:B===6,width:Y}))),W?y.createElement(D,{api:e,siteId:t,width:J-2}):null,y.createElement(s,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:H?`panels`:`globe`},{key:`?/`,label:W?`close chat`:`ai chat`},{key:`q`,label:`quit`}]}))},D=({api:e,siteId:t,width:r})=>{let[i,o]=x(``),[s,c]=x([]),[l,u]=x(!1),[d,f]=x(``),[p,g]=x(null),_=async r=>{let i=r.trim();if(!i||l)return;g(null),o(``);let a=[...s,{role:`user`,content:i}];c(a),u(!0),f(``);try{let r=a.map(e=>({role:e.role,content:e.content})),i=await e.openAiStream(`chat`,{messages:r,siteId:t},void 0),o=``;for await(let e of n(i))if(e.type===`delta`)o+=e.content,f(o);else if(e.type===`error`)g(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...a,{role:`assistant`,content:o}]),f(``)}catch(e){g(e instanceof Error?e.message:`chat failed`)}finally{u(!1)}};return y.createElement(m,{marginTop:1},y.createElement(a,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:r},y.createElement(m,{flexDirection:`column`},s.slice(-6).map((e,t)=>y.createElement(m,{key:t,flexDirection:`column`,marginBottom:1},y.createElement(h,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),y.createElement(h,null,e.content))),l&&d?y.createElement(m,{flexDirection:`column`,marginBottom:1},y.createElement(h,{color:`magenta`,bold:!0},`zenovay`),y.createElement(h,null,d)):null,p?y.createElement(h,{color:`red`},`✗ `,p):null,y.createElement(m,null,y.createElement(h,{color:`cyan`},l?`⠋ `:`▸ `),y.createElement(C,{value:i,onChange:o,onSubmit:_,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},O=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return y.createElement(a,{title:`Visitors`,focused:t,width:n},y.createElement(h,{bold:!0},r.toString()),y.createElement(h,{color:`gray`},i.length>0?c(i,Math.max(8,n-6)):`— no data —`))},k=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return y.createElement(a,{title:`Top pages`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.path},y.createElement(h,null,e.path.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.views))))},A=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return y.createElement(a,{title:`Sources`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.source},y.createElement(h,null,e.source.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.visitors))))},j=({events:e,focused:t,width:n})=>y.createElement(a,{title:`Events`,focused:t,width:n},e.length===0?y.createElement(h,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>y.createElement(h,{key:t},e.slice(0,n-4)))),M=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>y.createElement(m,{key:e},y.createElement(h,{bold:!0},e.padEnd(6)),y.createElement(h,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return y.createElement(a,{title:`Vitals`,focused:t,width:n},r(`LCP`,e?.lcpP75,`ms`),r(`INP`,e?.inpP75,`ms`),r(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),r(`TTFB`,e?.ttfbP75,`ms`),r(`FCP`,e?.fcpP75,`ms`))},N=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return y.createElement(a,{title:`Goals`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.name},y.createElement(h,null,e.name.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.completions))))};export{T as watchCommand};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-DXmhz2DM.js";import{Panel as n}from"./panel-Crm-x-5U.js";import{Banner as r}from"./prompt-CIl9JOlh.js";import"./progress-row-CeP9YRKn.js";import"./keybar-DO-sCbJB.js";import"./sparkline-ut0Tvv-E.js";import"./ui-BLnL2HSo.js";import{ApiV2Client as i}from"./api-v2-C7yrqNuV.js";import{Box as a,Text as o,render as s,useApp as c,useInput as l}from"ink";import u,{useEffect as d,useState as f}from"react";async function p(e,t){let n=new TextEncoder,r=await crypto.subtle.importKey(`raw`,n.encode(e),{name:`HMAC`,hash:`SHA-256`},!1,[`sign`]),i=await crypto.subtle.sign(`HMAC`,r,n.encode(t));return Array.from(new Uint8Array(i),e=>e.toString(16).padStart(2,`0`)).join(``)}function m({stats:e}){return u.createElement(n,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},u.createElement(a,{flexDirection:`column`},u.createElement(o,null,u.createElement(o,{color:`gray`},`public URL `),u.createElement(o,{color:`cyan`},e.publicUrl)),u.createElement(o,null,u.createElement(o,{color:`gray`},`→ forwarding to `),u.createElement(o,{color:`magenta`},e.wsUrl)),u.createElement(o,null,e.connected?u.createElement(o,{color:`green`},`● connected`):u.createElement(o,{color:`yellow`},`○ connecting…`),u.createElement(o,{color:`gray`},` · `,e.total,` requests · `,e.ok,` ok · `),u.createElement(o,{color:e.err>0?`red`:`gray`},e.err,` err`),e.lastStatus===null?null:u.createElement(o,{color:`gray`},` · last: HTTP `,e.lastStatus)),e.lastError?u.createElement(o,{color:`red`},`last error: `,e.lastError.slice(0,80)):null))}async function h(n){let h=await e(),g=await t({strict:!1});if(!g?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;let _=n.siteId??g.teamId??``;if(!_)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
|
|
2
|
-
`),2;if(!n.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
|
|
3
|
-
`),2;let v=n.to.match(/^https?:\/\//)?n.to:`http://${n.to}`,y=new i({config:h,cliVersion:n.cliVersion,token:g}),b;try{b=await y.createTunnel(_,n.to)}catch(e){return process.stderr.write(`Failed to register tunnel: ${e.message}\n`),1}let x=n.sign?n.secret??b.tunnelKey:null,S=()=>{let{exit:e}=c(),[t,i]=f({total:0,ok:0,err:0,lastStatus:null,lastError:null,publicUrl:b.publicUrl,wsUrl:b.wsUrl,connected:!1});return l((t,n)=>{(t===`q`||n.escape)&&e()}),d(()=>{let e=new AbortController,t=async e=>{try{let t={...e.headers};delete t.host,delete t[`content-length`],x&&(t[`X-Zenovay-Signature`]=`sha256=${await p(x,e.body)}`);let n=await fetch(v,{method:e.method,headers:t,body:e.method===`GET`||e.method===`HEAD`?void 0:e.body}),r=await n.text(),a={};return n.headers.forEach((e,t)=>{a[t]=e}),i(e=>({...e,total:e.total+1,ok:e.ok+(n.ok?1:0),err:e.err+(n.ok?0:1),lastStatus:n.status,lastError:n.ok?null:`HTTP ${n.status}`})),{status:n.status,headers:a,body:r}}catch(e){let t=e instanceof Error?e.message:String(e);return i(e=>({...e,total:e.total+1,err:e.err+1,lastError:t})),{status:502,body:JSON.stringify({error:`cli_local_failed`,detail:t})}}};return(async()=>{let n=y.tunnelClient(b.wsUrl);i(e=>({...e,connected:!0}));try{await n.start(t,e.signal)}catch(e){i(t=>({...t,connected:!1,lastError:e.message}))}})(),()=>{e.abort()}},[]),u.createElement(a,{flexDirection:`column`},u.createElement(r,{version:`webhooks forward`}),u.createElement(m,{stats:t}),u.createElement(o,{color:`gray`},`target: `,v,` `,n.sign?`· HMAC-signed`:``),u.createElement(o,{color:`gray`},`[q | Esc] quit`))},{waitUntilExit:C}=s(u.createElement(S,null));return await C(),0}export{h as webhooksForwardCommand};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|