@zenovay/cli 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/{ai-B8PRo9Ja.js → ai-BtL-3tWv.js} +1 -1
  2. package/dist/{analytical-screen-DI8ahq4z.js → analytical-screen-DdnG-A8U.js} +1 -1
  3. package/dist/bin.js +5 -2
  4. package/dist/companies-Ck1YXksb.js +2 -0
  5. package/dist/{data-table-lMY6gJTI.js → data-table-B1FiGp8c.js} +1 -1
  6. package/dist/deploys-BDcSODZT.js +2 -0
  7. package/dist/devices-DiBMDyfc.js +1 -0
  8. package/dist/{doctor-CnWr28VY.js → doctor-Cewej993.js} +1 -1
  9. package/dist/{empty-state-CsRSB1cb.js → empty-state-BUlTM7wA.js} +1 -1
  10. package/dist/errors-DHpw3PO2.js +2 -0
  11. package/dist/{events-tail-BpAhoXVM.js → events-tail-BlMK84c8.js} +1 -1
  12. package/dist/{funnel-DaoYO2g_.js → funnel-Z3HHRLwg.js} +2 -2
  13. package/dist/geo-PyqvcLvy.js +1 -0
  14. package/dist/gradient-93CUjfDW.js +3 -0
  15. package/dist/{health-BaXEAzM7.js → health-BioDPveS.js} +1 -1
  16. package/dist/{health-Bz-S_pGQ.js → health-DBXPCNzJ.js} +1 -1
  17. package/dist/heatmaps-CrOP0_TX.js +1 -0
  18. package/dist/{init-DZfTNHF4.js → init-CZTDJ-vf.js} +3 -3
  19. package/dist/init-DbWxI6M2.js +1 -0
  20. package/dist/insights-yI1UgyRG.js +1 -0
  21. package/dist/journeys-DegXpwij.js +1 -0
  22. package/dist/{keybar-DUC7w1HQ.js → keybar-CoNHlPOn.js} +1 -1
  23. package/dist/live-BeZkd7mo.js +1 -0
  24. package/dist/{metric-card-W4GayhPO.js → metric-card--FhiQMgt.js} +1 -1
  25. package/dist/overview-CGTlmjQy.js +1 -0
  26. package/dist/pages-CEcLNfKb.js +1 -0
  27. package/dist/panel-BNI8Q_9k.js +1 -0
  28. package/dist/projects-DnzI_z_C.js +2 -0
  29. package/dist/prompt-CnNQNqeK.js +1 -0
  30. package/dist/query-DlhhP3PE.js +8 -0
  31. package/dist/{resolve-site-D4W9yMVw.js → resolve-site-IXvBPhrx.js} +1 -1
  32. package/dist/retention-xuYAxg4L.js +1 -0
  33. package/dist/revenue-CUHv5LCn.js +2 -0
  34. package/dist/sessions-DXxeC1Om.js +1 -0
  35. package/dist/sources-Bs-T6MjS.js +2 -0
  36. package/dist/stats-DWj2oLhf.js +2 -0
  37. package/dist/themes-DbjOibiR.js +4 -0
  38. package/dist/ui-Bw_RHAeN.js +1 -0
  39. package/dist/uptime-DQUNMxBI.js +1 -0
  40. package/dist/{use-BxzYOpQl.js → use-DSsSDVW7.js} +1 -1
  41. package/dist/vitals-B23CXo61.js +2 -0
  42. package/dist/{watch-SfQIks0Y.js → watch-D12Fz1UB.js} +1 -1
  43. package/dist/webhooks-forward-9COAtWRu.js +3 -0
  44. package/dist/wizard-bin.js +1 -1
  45. package/package.json +1 -1
  46. package/dist/companies-Xu9p4GXI.js +0 -2
  47. package/dist/deploys-Bf_wSsLz.js +0 -2
  48. package/dist/devices-BaWxrRjY.js +0 -1
  49. package/dist/errors-BaS_oMYP.js +0 -2
  50. package/dist/geo-DG_ETC0h.js +0 -1
  51. package/dist/heatmaps-B56aCdpr.js +0 -1
  52. package/dist/init-Vrznsq24.js +0 -1
  53. package/dist/insights-Cx67JytT.js +0 -1
  54. package/dist/journeys-DqtbkbRQ.js +0 -1
  55. package/dist/live-DB5w__ih.js +0 -1
  56. package/dist/overview-ChOU9GHP.js +0 -1
  57. package/dist/pages-BGODfLio.js +0 -1
  58. package/dist/panel-DZqvtaao.js +0 -1
  59. package/dist/projects-DYxHeEYi.js +0 -2
  60. package/dist/prompt-DEng-me1.js +0 -3
  61. package/dist/query-ClP0vb33.js +0 -8
  62. package/dist/retention-BSmE8p6T.js +0 -1
  63. package/dist/revenue-CMeu1Pv6.js +0 -2
  64. package/dist/sessions-4yj1VVsv.js +0 -1
  65. package/dist/sources-EJuXDR0z.js +0 -2
  66. package/dist/stats-Cl-2pqTC.js +0 -2
  67. package/dist/themes-Ty85UcjT.js +0 -4
  68. package/dist/ui-BtZp4Eh8.js +0 -1
  69. package/dist/uptime-pvxntalC.js +0 -1
  70. package/dist/vitals-B87wKDAN.js +0 -2
  71. package/dist/webhooks-forward-DLMxW-Kg.js +0 -3
  72. /package/dist/{api-v2-FrwTv9zH.js → api-v2-CRj-zoG9.js} +0 -0
  73. /package/dist/{completions-DHOrzR_j.js → completions-CnHbpLqp.js} +0 -0
  74. /package/dist/{globe-UnGLnca5.js → globe-1bi4DjwJ.js} +0 -0
  75. /package/dist/{logout-B_-6rZdK.js → logout-B3V_2DRZ.js} +0 -0
  76. /package/dist/{sparkline-B6ueqPAB.js → sparkline-ut0Tvv-E.js} +0 -0
  77. /package/dist/{tier-CSgWXnOt.js → tier-DJvWU86k.js} +0 -0
  78. /package/dist/{update-5mypMXp6.js → update-wMGBdUT-.js} +0 -0
@@ -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-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{runAnalyticalScreen as i}from"./analytical-screen-DI8ahq4z.js";import{Table as a}from"./ui-BtZp4Eh8.js";import{resolveSiteId as o}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as s}from"./api-v2-FrwTv9zH.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}=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 _=r(f),v=f.limit??50,y=[{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:v},e),format:_,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let t of e.deploys)process.stdout.write(JSON.stringify(t)+`
2
- `);else process.stdout.write(JSON.stringify(e,null,2));return}process.stdout.write(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:y})}]})}export{f as deploysCommand};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{DataTable as u}from"./data-table-lMY6gJTI.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const x=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=m(),[c,p]=v(null),[b,x]=v(!0),[S,C]=v(null);if(h(e=>{e===`q`&&(s(),r(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getDevices(t);n||(p(r),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:n,subtitle:`devices · ${t}`}),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(S)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`devices · ${t}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:S}));let w=!c||c.devices.length===0&&c.browsers.length===0&&c.os.length===0;if(w)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`devices · ${t}`}),g.createElement(l,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let T=[{key:`name`,label:`name`,width:16},{key:`visitors`,label:`visitors`,align:`right`,width:8}];return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`devices · ${t}`}),g.createElement(d,{flexDirection:`row`},g.createElement(i,{title:`Devices`},c.devices.length===0?g.createElement(f,{color:`gray`},`— —`):g.createElement(u,{columns:T,data:c.devices,zebra:!0})),g.createElement(i,{title:`Browsers`},c.browsers.length===0?g.createElement(f,{color:`gray`},`— —`):g.createElement(u,{columns:T,data:c.browsers,zebra:!0})),g.createElement(i,{title:`OS`},c.os.length===0?g.createElement(f,{color:`gray`},`— —`):g.createElement(u,{columns:T,data:c.os,zebra:!0}))),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{b as devicesCommand};
@@ -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-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import{spark as i}from"./sparkline-B6ueqPAB.js";import{runAnalyticalScreen as a}from"./analytical-screen-DI8ahq4z.js";import{Table as o}from"./ui-BtZp4Eh8.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.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;try{({siteId:v}=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 y=r(m),b=m.window??`24h`,x=m.limit??100,S=[{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} · ${b}`,commandName:`errors`,authToken:g?.accessToken??null,refreshIntervalMs:m.watch?3e4:0,fetcher:e=>_.getErrors(v,{window:b,limit:x},e),format:y,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 `,b)),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:S})}}]})}export{m as errorsCommand};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{DataTable as u}from"./data-table-lMY6gJTI.js";import{Globe as d}from"./globe-UnGLnca5.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const S=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=h(),[c,m]=y(null),[x,S]=y(!0),[C,w]=y(null);if(g(e=>{e===`q`&&(s(),r(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getGeo(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:n,subtitle:`geo · ${t}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching geo…`))));if(C)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`geo · ${t}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:C}));let T=!c||c.countries.length===0&&c.cities.length===0;if(T)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`geo · ${t}`}),_.createElement(l,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let E=[{key:`country`,label:`country`,width:18},{key:`visitors`,label:`visitors`,align:`right`,width:8}],D=[{key:`city`,label:`city`,width:20},{key:`country`,label:`country`,width:12},{key:`visitors`,label:`visitors`,align:`right`,width:8}],O=process.stdout.columns??80;return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`geo · ${t}`}),_.createElement(f,{flexDirection:`row`},_.createElement(i,{title:`Countries`},c.countries.length===0?_.createElement(p,{color:`gray`},`— —`):_.createElement(u,{columns:E,data:c.countries.slice(0,15),zebra:!0})),_.createElement(i,{title:`Globe`},_.createElement(d,{data:[],width:Math.max(36,O-60),height:12}))),_.createElement(i,{title:`Cities`},c.cities.length===0?_.createElement(p,{color:`gray`},`— —`):_.createElement(u,{columns:D,data:c.cities.slice(0,20),zebra:!0})),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{x as geoCommand};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{DataTable as u}from"./data-table-lMY6gJTI.js";import{requireTier as d}from"./tier-CSgWXnOt.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const S=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=h(),[c,d]=y(null),[m,x]=y(!0),[S,C]=y(null);if(g(e=>{e===`q`&&(s(),r(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getHeatmaps(t);n||(d(r),x(!1))}catch(e){n||(C(e.message),x(!1))}})(),()=>{n=!0}},[e,t]),m)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`heatmaps · ${t}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching heatmaps…`))));if(S)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`heatmaps · ${t}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:S}));if(!c||c.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`heatmaps · ${t}`}),_.createElement(l,{reason:`no-data`,headline:`No heatmaps yet`,hint:`Enable heatmaps in your site settings`}));let w=[{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:n,subtitle:`heatmaps · ${t}`}),_.createElement(i,{title:`Heatmaps (${c.length})`},_.createElement(u,{columns:w,data:c,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};
@@ -1 +0,0 @@
1
- import"./config-CZ9IzjIH.js";import"./api-DXmhz2DM.js";import{initCommand as e}from"./init-DZfTNHF4.js";import"./client-vixcHdv-.js";import"./formatter-BNYzdX5c.js";import"./emit-BmfLGjqr.js";import"./login-DvMRHd3J.js";import"./panel-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{requireTier as u}from"./tier-CSgWXnOt.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;try{({siteId:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=m(),[c,u]=v(null),[p,S]=v(!0),[C,w]=v(null);return h(e=>{e===`q`&&(s(),r(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getInsights(t);n||(u(r),S(!1))}catch(e){n||(w(e.message),S(!1))}})(),()=>{n=!0}},[e,t]),p?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`insights · ${t}`}),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…`)))):C?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`insights · ${t}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:C})):!c||c.length===0?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`insights · ${t}`}),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:n,subtitle:`insights · ${t}`}),c.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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{requireTier as u}from"./tier-CSgWXnOt.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;try{({siteId:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const x=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=m(),[c,u]=v(null),[p,b]=v(!0),[x,S]=v(null);if(h(e=>{e===`q`&&(s(),r(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getJourneys(t);n||(u(r.flows),b(!1))}catch(e){n||(S(e.message),b(!1))}})(),()=>{n=!0}},[e,t]),p)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`journeys · ${t}`}),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(x)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`journeys · ${t}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:x}));if(!c||c.length===0)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`journeys · ${t}`}),g.createElement(l,{reason:`no-data`,headline:`No journeys yet`,hint:`Need at least 2 page-views per session to compute flows`}));let C=Math.max(...c.map(e=>e.count),1),w=12;return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`journeys · ${t}`}),g.createElement(i,{title:`Top page transitions (${c.length})`},c.map((e,t)=>{let n=Math.max(1,Math.round(e.count/C*w));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(w-n)),g.createElement(f,{color:`gray`},` ${e.count}`))})),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{b as journeysCommand};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{Globe as u}from"./globe-UnGLnca5.js";import{MetricCard as d}from"./metric-card-W4GayhPO.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const S=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=h(),[c,m]=y(null),[x,S]=y(!0),[C,w]=y(null);if(g(e=>{e===`q`&&(s(),r(0))}),v(()=>{let n=!1,r=async()=>{try{let r=await e.getLive(t);n||(m(r),S(!1),w(null))}catch(e){n||(w(e.message),S(!1))}};r();let i=setInterval(r,2e3);return()=>{n=!0,clearInterval(i)}},[e,t]),x)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`live · ${t}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Connecting…`))));if(C&&!c)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`live · ${t}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:C}));let T=process.stdout.columns??80,E=Math.max(20,Math.min(40,Math.floor(T/3)));return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`live · ${t}`}),_.createElement(f,{flexDirection:`row`},_.createElement(d,{title:`Active now`,value:c?.activeVisitors??0,format:`number`,width:E}),_.createElement(i,{title:`Globe`,width:Math.max(40,T-E-4)},_.createElement(u,{data:[],width:Math.max(36,T-E-10),height:10}))),_.createElement(i,{title:`Recent events`},!c||c.recentEvents.length===0?_.createElement(p,{color:`gray`},`— waiting for events —`):c.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};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{DataTable as u}from"./data-table-lMY6gJTI.js";import{MetricCard as d}from"./metric-card-W4GayhPO.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(r(i)){let e=await S(l,u);return n({type:`overview.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(C,{api:l,siteId:u,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}async function S(e,t){let[n,r]=await Promise.all([e.getStats(t,`24h`).catch(()=>null),e.getPages(t).catch(()=>[])]),i=r.reduce((e,t)=>e+t.views,0);return{visitors:n?.visitors??0,pageviews:n?.pageviews??i,bounceRate:n?.bounceRate??null,avgSession:n?.avgSessionSec??null,series:[],topPages:r.slice(0,10)}}const C=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=h(),[c,m]=y(null),[x,C]=y(!0),[w,T]=y(null);if(g(e=>{e===`q`&&(s(),r(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await S(e,t);n||(m(r),C(!1))}catch(e){n||(T(e.message),C(!1))}})(),()=>{n=!0}},[e,t]),x)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`overview · ${t}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching dashboard…`))));if(w)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`overview · ${t}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:w}));if(!c||c.visitors===0&&c.pageviews===0&&c.topPages.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`overview · ${t}`}),_.createElement(l,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let E=process.stdout.columns??80,D=Math.max(18,Math.floor(E/4)-1),O=[{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:n,subtitle:`overview · ${t}`}),_.createElement(f,{flexDirection:`row`},_.createElement(d,{title:`Visitors`,value:c.visitors,format:`number`,width:D}),_.createElement(d,{title:`Pageviews`,value:c.pageviews,format:`number`,width:D}),_.createElement(d,{title:`Bounce rate`,value:c.bounceRate??``,emptyHint:`—`,format:`percent`,width:D}),_.createElement(d,{title:`Avg session`,value:c.avgSession??``,emptyHint:`—`,format:`duration`,width:D})),_.createElement(i,{title:`Top pages`},c.topPages.length===0?_.createElement(p,{color:`gray`},`— no pages yet —`):_.createElement(u,{columns:O,data:c.topPages,zebra:!0})),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{x as overviewCommand};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{DataTable as u}from"./data-table-lMY6gJTI.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const x=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=m(),[c,p]=v(null),[b,x]=v(!0),[S,C]=v(null);if(h(e=>{e===`q`&&(s(),r(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getPages(t);n||(p(r),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:n,subtitle:`pages · ${t}`}),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(S)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`pages · ${t}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:S}));if(!c||c.length===0)return g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`pages · ${t}`}),g.createElement(l,{reason:`no-data`,headline:`No pages yet`,hint:`Visit your site to send the first event`}));let w=[{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:n,subtitle:`pages · ${t}`}),g.createElement(i,{title:`Top pages (${c.length})`},g.createElement(u,{columns:w,data:c,zebra:!0})),g.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{b as pagesCommand};
@@ -1 +0,0 @@
1
- import{Box as e,Text as t}from"ink";import n,{createContext as r,useContext as i,useEffect as a,useState as o}from"react";const s={xs:1,sm:2,md:3,lg:5,xl:8},c=e=>({headline:{color:e.accent,bold:!0},title:{color:e.fg,bold:!0},body:{color:e.fg},label:{color:e.dim,dim:!0,uppercase:!0},mono:{color:e.fg},caption:{color:e.muted}}),l={name:`mocha`,bg:`#1E1E2E`,fg:`#CDD6F4`,muted:`#6C7086`,accent:`#A6ADFF`,accent2:`#F5C2E7`,success:`#A6E3A1`,warn:`#F9E2AF`,error:`#F38BA8`,border:`#45475A`,dim:`#585B70`,spacing:s,radius:`round`,typography:c({fg:`#CDD6F4`,muted:`#6C7086`,accent:`#A6ADFF`,dim:`#585B70`})},u={name:`latte`,bg:`#EFF1F5`,fg:`#4C4F69`,muted:`#8C8FA1`,accent:`#7287FD`,accent2:`#EA76CB`,success:`#40A02B`,warn:`#DF8E1D`,error:`#D20F39`,border:`#BCC0CC`,dim:`#ACB0BE`,spacing:s,radius:`round`,typography:c({fg:`#4C4F69`,muted:`#8C8FA1`,accent:`#7287FD`,dim:`#ACB0BE`})},d={name:`dracula`,bg:`#282A36`,fg:`#F8F8F2`,muted:`#6272A4`,accent:`#BD93F9`,accent2:`#FF79C6`,success:`#50FA7B`,warn:`#F1FA8C`,error:`#FF5555`,border:`#44475A`,dim:`#6272A4`,spacing:s,radius:`round`,typography:c({fg:`#F8F8F2`,muted:`#6272A4`,accent:`#BD93F9`,dim:`#6272A4`})},f={name:`tokyoNight`,bg:`#1A1B26`,fg:`#C0CAF5`,muted:`#565F89`,accent:`#7AA2F7`,accent2:`#BB9AF7`,success:`#9ECE6A`,warn:`#E0AF68`,error:`#F7768E`,border:`#3B4261`,dim:`#414868`,spacing:s,radius:`round`,typography:c({fg:`#C0CAF5`,muted:`#565F89`,accent:`#7AA2F7`,dim:`#414868`})},p={name:`nord`,bg:`#2E3440`,fg:`#D8DEE9`,muted:`#4C566A`,accent:`#88C0D0`,accent2:`#81A1C1`,success:`#A3BE8C`,warn:`#EBCB8B`,error:`#BF616A`,border:`#3B4252`,dim:`#434C5E`,spacing:s,radius:`round`,typography:c({fg:`#D8DEE9`,muted:`#4C566A`,accent:`#88C0D0`,dim:`#434C5E`})},m={from:`#7D56F4`,to:`#FF5FD1`},h=r({theme:l});function g(){return i(h)}function _(e,t,n){if(n)return e.accent;switch(t){case`busy`:return e.accent;case`ok`:return e.success;case`warn`:return e.warn;case`err`:return e.error;case`idle`:default:return e.border}}function v(){let e=process.stdout.columns;return typeof e==`number`&&e>0?e:80}function y({title:r,state:i=`idle`,pillColor:a,width:o,focused:s=!1,density:c=`comfortable`,children:l}){let{theme:u}=g(),d=_(u,i,s),f=o??v(),p=a??d,m=c===`compact`?``:` `,h=`╭─ `,y=` ─╮`,b=r??``,x=r?b.length:0,S=r?h.length+x+y.length:4,C=Math.max(2,f-S),w=r?n.createElement(e,{flexDirection:`row`},n.createElement(t,{color:d},h),n.createElement(t,{color:p,bold:!0},b),n.createElement(t,{color:d},y,`─`.repeat(C))):n.createElement(e,{flexDirection:`row`},n.createElement(t,{color:d},`╭`,`─`.repeat(Math.max(2,f-2)),`╮`)),T=n.createElement(e,{flexDirection:`row`},n.createElement(t,{color:d},`╰`,`─`.repeat(Math.max(2,f-2)),`╯`));return n.createElement(e,{flexDirection:`column`},w,n.createElement(e,{flexDirection:`row`},n.createElement(t,{color:d},`│`,m),n.createElement(e,{flexDirection:`column`,flexGrow:1},l),n.createElement(t,{color:d},m,`│`)),T)}export{m as BRAND_GRADIENT,y as Panel,d as dracula,u as latte,l as mocha,p as nord,f as tokyoNight,g as useTheme};
@@ -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-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{runAnalyticalScreen as i}from"./analytical-screen-DI8ahq4z.js";import{Table as a}from"./ui-BtZp4Eh8.js";import{resolveSiteId as o}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as s}from"./api-v2-FrwTv9zH.js";import{Box as c,Text as l}from"ink";import u from"react";async function d(d){let f=await e(),p=await t({strict:!1}),m=new s({config:f,cliVersion:d.cliVersion,token:p}),h;try{({siteId:h}=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 g=r(d),_=[{key:`isCurrent`,header:``,width:2,format:e=>e?`*`:` `},{key:`name`,header:`project`,width:26},{key:`domain`,header:`domain`,width:28,format:e=>String(e??`—`)},{key:`tier`,header:`tier`,width:10},{key:`pageviews24h`,header:`24h pv`,width:8,align:`right`},{key:`id`,header:`id`,width:38,format:e=>String(e).slice(0,38)}];return i({cliVersion:d.cliVersion,title:`projects · ${p?.teamId??`—`}`,commandName:`projects`,authToken:p?.accessToken??null,refreshIntervalMs:0,fetcher:e=>m.getProjects(h,e),format:g,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))},panels:[{id:`summary`,title:`Tracked sites`,render:e=>{let t=e.projects.find(e=>e.isCurrent);return u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{bold:!0},e.projects.length),u.createElement(l,{color:`gray`},` projects`)),t?u.createElement(l,{color:`gray`},`current: `,u.createElement(l,{color:`cyan`},t.name),` `,`(`,t.domain??`—`,`, `,t.tier,`)`):u.createElement(l,{color:`gray`},`no current project bound to this token`))}},{id:`list`,title:`List`,render:e=>e.projects.length===0?u.createElement(l,{color:`gray`},`— no projects yet —`):u.createElement(a,{data:e.projects,columns:_})},{id:`hint`,title:`Switch`,render:()=>u.createElement(l,{color:`gray`},"To switch project: run `zenovay logout` then `zenovay login` (V2.1 adds a faster /switch flow).")}]})}export{d as projectsCommand};
@@ -1,3 +0,0 @@
1
- import{BRAND_GRADIENT as e,useTheme as t}from"./panel-DZqvtaao.js";import{Box as n,Text as r,useInput as i}from"ink";import a,{useCallback as o,useState as s}from"react";import c from"ink-select-input";import l from"ink-text-input";function u(e){let t=e.replace(`#`,``).trim(),n=t.length===3?t.split(``).map(e=>e+e).join(``):t,r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return{r:Number.isNaN(r)?0:r,g:Number.isNaN(i)?0:i,b:Number.isNaN(a)?0:a}}function d({r:e,g:t,b:n}){let r=e=>{let t=Math.max(0,Math.min(255,Math.round(e)));return t.toString(16).padStart(2,`0`)};return`#${r(e)}${r(t)}${r(n)}`}function f(e,t,n){return{r:e.r+(t.r-e.r)*n,g:e.g+(t.g-e.g)*n,b:e.b+(t.b-e.b)*n}}function p(e,t,n,i){if(e.length===0)return[];if(e.length===1)return[a.createElement(r,{key:`${i}-0`,color:d(t)},e)];let o=Array.from(e),s=o.length-1;return o.map((e,o)=>{let c=o/s,l=d(f(t,n,c));return a.createElement(r,{key:`${i}-${o}`,color:l},e)})}function m({from:e,to:t,children:n}){let i=u(e),o=u(t),s=n.split(`
2
- `),c=[];return s.forEach((e,t)=>{t>0&&c.push(a.createElement(r,{key:`nl-${t}`},`
3
- `));let n=p(e,i,o,`l${t}`);c.push(...n)}),a.createElement(r,null,c)}function h({children:t}){return a.createElement(m,{from:e.from,to:e.to},t)}function g(){let e=process.stdout.columns;return typeof e==`number`&&e>0?e:80}function _({version:e,subtitle:i}){let{theme:o}=t(),s=g(),c=`ZENOVAY · v${e}`,l=`╭─ `,u=` `,d=`─╮`,f=l.length+c.length+u.length+d.length,p=Math.max(2,s-f),m=`─`.repeat(p),_=`─`.repeat(Math.max(2,s-2)),v=i??``,y=v.slice(0,Math.max(0,s-4)),b=` `.repeat(Math.max(1,s-2-1-y.length-1));return a.createElement(n,{flexDirection:`column`},a.createElement(n,{flexDirection:`row`},a.createElement(r,{color:o.border},l),a.createElement(h,null,c),a.createElement(r,{color:o.border},u,m,d)),i?a.createElement(n,{flexDirection:`row`},a.createElement(r,{color:o.border},`│ `),a.createElement(r,{color:o.muted},y),a.createElement(r,{color:o.border},b,`│`)):null,a.createElement(n,{flexDirection:`row`},a.createElement(r,{color:o.border},`╰`,_,`╯`)))}function v({hints:e}){let{theme:n}=t();return a.createElement(r,{color:n.dim},e)}function y({items:e,onSelect:i}){let{theme:l}=t(),[u,d]=s(e[0]),f=o(e=>{i(e.value)},[i]),p=o(e=>{d(e)},[]);return a.createElement(n,{flexDirection:`column`},a.createElement(c,{items:e.map((e,t)=>({key:`${t}`,label:e.label,value:e.value})),onSelect:t=>{let n=e.find(e=>e.value===t.value);n&&f(n)},onHighlight:t=>{let n=e.find(e=>e.value===t.value);n&&p(n)}}),u?.description?a.createElement(n,{marginTop:1},a.createElement(r,{color:l.muted},u.description)):null,a.createElement(n,{marginTop:1},a.createElement(v,{hints:`[↑↓/jk nav] [enter select]`})))}function b({question:e,onSubmit:i,placeholder:o,mask:c}){let{theme:u}=t(),[d,f]=s(``);return a.createElement(n,{flexDirection:`column`},a.createElement(n,null,a.createElement(r,{color:u.fg},e,` `),a.createElement(l,{value:d,onChange:f,onSubmit:e=>i(e),placeholder:o,mask:c?`•`:void 0})),a.createElement(v,{hints:`[enter submit]`}))}export{_ as Banner,h as BrandGradient,y as Select,b as TextInput};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{Table as o}from"./ui-BtZp4Eh8.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{Box as l,Text as u,useApp as d,useInput as f}from"ink";import p,{useMemo as m,useState as h}from"react";import g from"ink-text-input";function _({api:e,siteId:t,maxRows:n}){let{exit:r}=d(),[s,c]=h(``),[_,v]=h(null),[y,b]=h(null),[x,S]=h(!1),[C,w]=h([]);f((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=m(()=>_?_.columns.map(e=>({key:e,header:e,width:18,format:e=>e==null?`∅`:String(e).slice(0,18)})):[],[_]);return p.createElement(l,{flexDirection:`column`},p.createElement(a,{version:`query`}),p.createElement(i,{title:`History`,state:`idle`},C.length===0?p.createElement(u,{color:`gray`},`— no queries yet — Esc or \\q to exit —`):C.slice(-5).map((e,t)=>p.createElement(u,{key:t,color:`gray`},`> ${e.slice(0,80)}${e.length>80?`…`:``}`))),p.createElement(l,null,p.createElement(u,{color:`magenta`},`sql`,`>`,` `),p.createElement(g,{value:s,onChange:c,onSubmit:T})),x?p.createElement(u,{color:`gray`},`running…`):null,y?p.createElement(i,{title:`Error`,state:`err`},p.createElement(u,{color:`red`},y)):null,_?p.createElement(i,{title:`${_.row_count} rows · ${_.duration_ms}ms${_.truncated?` · truncated`:``}`,state:`ok`},_.row_count===0?p.createElement(u,{color:`gray`},`— empty —`):p.createElement(o,{data:_.rows.slice(0,50),columns:E})):null)}async function v(i){let a=await e(),o=await t({strict:!1}),l=new c({config:a,cliVersion:i.cliVersion,token:o}),u;try{({siteId:u}=await s(l,{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 d=i.maxRows??1e3,f=r(i);if(i.sql)try{let e=await l.runSqlQuery(u,i.sql,{maxRows:d});if(f===`json`)process.stdout.write(JSON.stringify(e,null,2)),process.stdout.write(`
2
- `);else if(f===`ndjson`)for(let t of e.rows)process.stdout.write(JSON.stringify(t)+`
3
- `);else if(f===`csv`||f===`tsv`)process.stdout.write(n(e.rows,e.columns,f));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:m}=await import(`ink`);return await m(p.createElement(_,{api:l,siteId:u,maxRows:d})).waitUntilExit(),0}export{v 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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{requireTier as u}from"./tier-CSgWXnOt.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;try{({siteId:d}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=m(),[c,u]=v(null),[p,S]=v(!0),[C,w]=v(null);return h(e=>{e===`q`&&(s(),r(0))}),_(()=>{let n=!1;return(async()=>{try{let r=await e.getRetention(t);n||(u(r.cohorts),S(!1))}catch(e){n||(w(e.message),S(!1))}})(),()=>{n=!0}},[e,t]),p?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`retention · ${t}`}),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…`)))):C?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`retention · ${t}`}),g.createElement(l,{reason:`error`,headline:`Failed to load`,hint:C})):!c||c.length===0?g.createElement(d,{flexDirection:`column`},g.createElement(a,{version:n,subtitle:`retention · ${t}`}),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:n,subtitle:`retention · ${t}`}),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 `)),c.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};
@@ -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-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import{spark as i}from"./sparkline-B6ueqPAB.js";import{runAnalyticalScreen as a}from"./analytical-screen-DI8ahq4z.js";import"./ui-BtZp4Eh8.js";import{resolveSiteId as o}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as s}from"./api-v2-FrwTv9zH.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}=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 _=r(f),v=f.range??`30d`;return a({cliVersion:f.cliVersion,title:`revenue · ${g} · ${v}`,commandName:`revenue`,authToken:m?.accessToken??null,refreshIntervalMs:f.watch?5*6e4:0,fetcher:e=>h.getRevenue(g,v,e),format:_,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 (${v})`,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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{DataTable as u}from"./data-table-lMY6gJTI.js";import{requireTier as d}from"./tier-CSgWXnOt.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=h(),[c,d]=y(null),[m,C]=y(!0),[w,T]=y(null);if(g(e=>{e===`q`&&(s(),r(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getSessions(t);n||(d(r),C(!1))}catch(e){n||(T(e.message),C(!1))}})(),()=>{n=!0}},[e,t]),m)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`sessions · ${t}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching sessions…`))));if(w)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`sessions · ${t}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:w}));if(!c||c.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`sessions · ${t}`}),_.createElement(l,{reason:`no-data`,headline:`No replays yet`,hint:`Enable session replay in your site settings`}));let E=[{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:n,subtitle:`sessions · ${t}`}),_.createElement(i,{title:`Recent sessions (${c.length})`},_.createElement(u,{columns:E,data:c,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};
@@ -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-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{runAnalyticalScreen as i}from"./analytical-screen-DI8ahq4z.js";import{Table as a}from"./ui-BtZp4Eh8.js";import{resolveSiteId as o}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as s}from"./api-v2-FrwTv9zH.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}),_;try{({siteId:_}=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 v=r(p),y=p.period??`30d`,b=[{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 · ${_} · ${y}`,commandName:`sources`,authToken:h?.accessToken??null,refreshIntervalMs:6e4,fetcher:e=>g.getSources(_,y,p.compare,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.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:b})}]})}export{p as sourcesCommand};
@@ -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-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{runAnalyticalScreen as i}from"./analytical-screen-DI8ahq4z.js";import{Table as a}from"./ui-BtZp4Eh8.js";import{resolveSiteId as o}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as s}from"./api-v2-FrwTv9zH.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}),_;try{({siteId:_}=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 v=r(p),y=p.range??`24h`,b=[{key:`url`,header:`page`,width:40,format:e=>String(e??`—`)},{key:`views`,header:`views`,width:8,align:`right`}],x=[{key:`country`,header:`country`,width:8},{key:`visitors`,header:`visitors`,width:8,align:`right`}];return i({cliVersion:p.cliVersion,title:`stats · ${_} · ${y}`,commandName:`stats`,authToken:h?.accessToken??null,refreshIntervalMs:p.watch?6e4:0,fetcher:e=>g.getStats(_,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([{range:y,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:b})},{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:x})}]})}export{p as statsCommand};
@@ -1,4 +0,0 @@
1
- import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import"./ui-BtZp4Eh8.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};
@@ -1 +0,0 @@
1
- import{useTheme as e}from"./panel-DZqvtaao.js";import{BrandGradient as t}from"./prompt-DEng-me1.js";import{Box as n,Text as r,useInput as i}from"ink";import a,{useMemo as o,useState as s}from"react";import"diff";function c(e,t){return e.length<=t?e:t<=1?e.slice(0,t):`${e.slice(0,t-1)}…`}function l(e,t,n){if(e.length>=t)return c(e,t);let r=t-e.length;if(n===`right`)return` `.repeat(r)+e;if(n===`center`){let t=Math.floor(r/2),n=r-t;return` `.repeat(t)+e+` `.repeat(n)}return e+` `.repeat(r)}function u(e,t){return e.map(e=>{if(typeof e.width==`number`&&e.width>0)return e.width;let n=e.header.length;for(let r of t){let t=r[e.key],i=e.format?e.format(t,r):String(t??``);i.length>n&&(n=i.length)}return Math.max(3,n)})}function d({columns:i,data:o,zebra:s=!1}){let{theme:c}=e(),d=u(i,o),f=d.reduce((e,t)=>e+t,0)+i.length*3+1,p=(e,t,n)=>{let r=e;return d.forEach((e,i)=>{r+=`─`.repeat(e+2),r+=i===d.length-1?n:t}),r},m=p(`╭`,`┬`,`╮`),h=p(`├`,`┼`,`┤`),g=p(`╰`,`┴`,`╯`),_=i.map((e,t)=>l(e.header,d[t]??e.header.length,e.align??`left`)).join(` │ `);return a.createElement(n,{flexDirection:`column`,width:f},a.createElement(r,{color:c.border},m),a.createElement(n,{flexDirection:`row`},a.createElement(r,{color:c.border},`│ `),a.createElement(t,null,_),a.createElement(r,{color:c.border},` │`)),a.createElement(r,{color:c.border},h),o.map((e,t)=>{let o=s&&t%2==1,u=o?c.muted:c.fg,f=i.map((t,n)=>{let r=e[t.key],i=t.format?t.format(r,e):String(r??``);return l(i,d[n]??i.length,t.align??`left`)}).join(` │ `);return a.createElement(n,{key:t,flexDirection:`row`},a.createElement(r,{color:c.border},`│ `),a.createElement(r,{color:u},f),a.createElement(r,{color:c.border},` │`))}),a.createElement(r,{color:c.border},g))}export{d as Table};
@@ -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-DZqvtaao.js";import{Banner as a}from"./prompt-DEng-me1.js";import{Keybar as o}from"./keybar-DUC7w1HQ.js";import{resolveSiteId as s}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as c}from"./api-v2-FrwTv9zH.js";import{EmptyState as l}from"./empty-state-CsRSB1cb.js";import{DataTable as u}from"./data-table-lMY6gJTI.js";import{requireTier as d}from"./tier-CSgWXnOt.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;try{({siteId:u}=await s(l,{explicit:i.siteId,headless:!!i.json,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}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,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,cliVersion:n,onExit:r})=>{let{exit:s}=h(),[c,d]=y(null),[m,C]=y(!0),[w,T]=y(null);if(g(e=>{e===`q`&&(s(),r(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getUptime(t);n||(d(r.monitors),C(!1))}catch(e){n||(T(e.message),C(!1))}})(),()=>{n=!0}},[e,t]),m)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`uptime · ${t}`}),_.createElement(i,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching monitors…`))));if(w)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`uptime · ${t}`}),_.createElement(l,{reason:`error`,headline:`Failed to load`,hint:w}));if(!c||c.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(a,{version:n,subtitle:`uptime · ${t}`}),_.createElement(l,{reason:`no-data`,headline:`No monitors configured`,hint:`Add one at app.zenovay.com/uptime`}));let E=[{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:n,subtitle:`uptime · ${t}`}),_.createElement(i,{title:`Monitors (${c.length})`},_.createElement(u,{columns:E,data:c,zebra:!0})),_.createElement(o,{items:[{key:`q`,label:`quit`}]}))};export{C as uptimeCommand};
@@ -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-DZqvtaao.js";import"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import{runAnalyticalScreen as i}from"./analytical-screen-DI8ahq4z.js";import{Table as a}from"./ui-BtZp4Eh8.js";import{resolveSiteId as o}from"./resolve-site-D4W9yMVw.js";import{ApiV2Client as s}from"./api-v2-FrwTv9zH.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}),_;try{({siteId:_}=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 v=r(d),y=[{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: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.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:y})}]})}export{m as vitalsCommand};
@@ -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-DZqvtaao.js";import{Banner as r}from"./prompt-DEng-me1.js";import"./keybar-DUC7w1HQ.js";import"./sparkline-B6ueqPAB.js";import"./ui-BtZp4Eh8.js";import{ApiV2Client as i}from"./api-v2-FrwTv9zH.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