@zenovay/cli 0.1.52 → 0.1.53
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/{ai-BcTacXVX.js → ai-0_Fj-s69.js} +1 -1
- package/dist/analytics-BzPbgxUz.js +2 -0
- package/dist/bin.js +3 -3
- package/dist/{companies-BqIS4j9h.js → companies-SLdSyZlr.js} +1 -1
- package/dist/{csv-emit-BuRZNWYM.js → csv-emit-BjL_a4Hk.js} +1 -1
- package/dist/{deploys-D044xeG7.js → deploys-BUxMQNdU.js} +1 -1
- package/dist/{devices-B42BgNHR.js → devices-CuI5DQCF.js} +1 -1
- package/dist/{doctor-CF3D4SXm.js → doctor-CxtU2i5C.js} +1 -1
- package/dist/embedded-globe-ClP_lA3q.js +1 -0
- package/dist/{errors-Bvz3ldBZ.js → errors-DGmpLOKI.js} +1 -1
- package/dist/{export-DCbp6_Ae.js → export-BzuIMKTq.js} +1 -1
- package/dist/{funnel-Ds9U10cE.js → funnel-e5I9PXCO.js} +1 -1
- package/dist/{geo-nRtvR5z7.js → geo-Ckzgg8Nz.js} +1 -1
- package/dist/globe-B9zxVE5j.js +2 -0
- package/dist/{health-lTPnKNY9.js → health-avCr8d4g.js} +1 -1
- package/dist/{init-DwgZQLgY.js → init-D6qfFHJW.js} +1 -1
- package/dist/{init-D15V10Ay.js → init-yaZypDtf.js} +1 -1
- package/dist/live-bC-2juBf.js +1 -0
- package/dist/{projects-CF9gkQnY.js → projects-WpLMA6OD.js} +1 -1
- package/dist/{query-DXLNEQfu.js → query-BX4rrOV_.js} +1 -1
- package/dist/{revenue-C6Dohqs2.js → revenue-D4xdtgW3.js} +1 -1
- package/dist/{self-test-C60HyTDS.js → self-test-BEGQAxd6.js} +1 -1
- package/dist/{sources-BTQtmp0s.js → sources-KNLyYn1s.js} +1 -1
- package/dist/sphere-globe-CvHshl9g.js +1 -0
- package/dist/{stats-BSIpzfbA.js → stats-DAluMkCV.js} +1 -1
- package/dist/{themes-Dqt--qhd.js → themes-DDiCFNwd.js} +1 -1
- package/dist/{visitors-BJAZuFPy.js → visitors-DbRze8fL.js} +1 -1
- package/dist/{vitals-BSfmTgnP.js → vitals-CnmfwDz9.js} +1 -1
- package/dist/{watch-DtaGj9rw.js → watch-CFDlcLl_.js} +1 -1
- package/dist/{webhooks-forward-Dijs9bUk.js → webhooks-forward-BpVuzTpH.js} +1 -1
- package/dist/wizard-bin.js +1 -1
- package/package.json +1 -1
- package/dist/analytics-DXs-73fZ.js +0 -2
- package/dist/globe-CGZ5vibb.js +0 -2
- package/dist/live-STTP72bj.js +0 -1
- package/dist/metric-card-COEIZmbN.js +0 -1
- /package/dist/{analytical-screen-CRn5UoFi.js → analytical-screen-nJlxAocC.js} +0 -0
- /package/dist/{annotation-GkAYwvze.js → annotation-BxgifdZn.js} +0 -0
- /package/dist/{api-keys-DphyO-_Y.js → api-keys-Q9lP4gE8.js} +0 -0
- /package/dist/{audit-5ImaVfEy.js → audit-Cz8sSmCb.js} +0 -0
- /package/dist/{commands-BX5I2UyT.js → commands-DNM6zbNf.js} +0 -0
- /package/dist/{completions-C_hmoEps.js → completions-Dkd2mw5i.js} +0 -0
- /package/dist/{csv-emit-Dn3c0RCG.js → csv-emit-BZVq1YR5.js} +0 -0
- /package/dist/{domains-2z51Uxcq.js → domains-Dqp3u2N1.js} +0 -0
- /package/dist/{events-tail-pDYhVzFg.js → events-tail-DrAY7_Zr.js} +0 -0
- /package/dist/{examples-BtWVpY-G.js → examples-CFatZcPz.js} +0 -0
- /package/dist/{globe-CD96vU4b.js → globe-DaSl9ejK.js} +0 -0
- /package/dist/{goals-vW8TXNxY.js → goals-Bls3-0Od.js} +0 -0
- /package/dist/{health-9O6q4lla.js → health-CflD_ysx.js} +0 -0
- /package/dist/{heatmaps-Pdew7TmM.js → heatmaps-B4EIgsJB.js} +0 -0
- /package/dist/{home-C1MIRuKj.js → home-BDDXwGy7.js} +0 -0
- /package/dist/{insights-IHUOC1FY.js → insights-B1j-Xb7l.js} +0 -0
- /package/dist/{integrations-BCiTNesV.js → integrations-U7bCP21o.js} +0 -0
- /package/dist/{journeys-BopFgaqo.js → journeys-Bhni1s_j.js} +0 -0
- /package/dist/{logout-DhxuBzBA.js → logout-Bj9vLF6-.js} +0 -0
- /package/dist/{notes-T3ZNNEoB.js → notes-RXAEpOlc.js} +0 -0
- /package/dist/{pages-BSrLs-uO.js → pages-D4wGIILk.js} +0 -0
- /package/dist/{plans-CQEvr15R.js → plans--eG1V1XX.js} +0 -0
- /package/dist/{profile-6Qi1GQhk.js → profile-CF7ChkCR.js} +0 -0
- /package/dist/{retention-CnnvhKfg.js → retention-CRtzacoI.js} +0 -0
- /package/dist/{sessions-XlocBz-a.js → sessions-BoV2tpmy.js} +0 -0
- /package/dist/{settings-Hf05xTPV.js → settings-DwWt5fMc.js} +0 -0
- /package/dist/{share-BAJcRgY3.js → share-B3DFNgTz.js} +0 -0
- /package/dist/{team-DVMA4G7x.js → team-BVzoYxOP.js} +0 -0
- /package/dist/{teams-k4OJgxiP.js → teams-DrpDNMX9.js} +0 -0
- /package/dist/{telemetry-DVyGPeIl.js → telemetry-BpoBNhpE.js} +0 -0
- /package/dist/{tour-Bwbv_E4Q.js → tour-B_va1vor.js} +0 -0
- /package/dist/{ui-Cey-h6wI.js → ui-DzoMR7th.js} +0 -0
- /package/dist/{update-DV3UrhdN.js → update-BykeQE-n.js} +0 -0
- /package/dist/{uptime-IeukwgWB.js → uptime-C_eyrDoC.js} +0 -0
- /package/dist/{usage-Ck3nnMro.js → usage-B4m_xh1T.js} +0 -0
- /package/dist/{use-DKqiTC6X.js → use-TXJD8FsG.js} +0 -0
- /package/dist/{webhooks-TMX618nq.js → webhooks-Ci5H77lC.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{ApiClient as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{detectInstalled as i,initCommand as a}from"./init-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{ApiClient as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{detectInstalled as i,initCommand as a}from"./init-yaZypDtf.js";import{parseSseStream as o}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as s,isHeadless as c}from"./emit-DBYk96TD.js";import"./secrets-ApB7yh2A.js";import"./login-C9V2iVUx.js";import{Panel as l}from"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import{Select as u}from"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{ChatPanel as d}from"./chat-panel-C_yjPXnw.js";import{Box as f,Text as p,render as m}from"ink";import h from"react";async function g(e){let t=await i(e.cwd),n;if(e.mode)n=e.mode;else if(!t.installed)n=`install`;else if(c(e))return s({type:`error`,code:`no_mode`,message:`Headless mode requires --mode chat|mcp|install`}),2;else n=await _(t);return n===`install`?a({cliVersion:e.cliVersion,cwd:e.cwd,json:e.json}):n===`chat`?v(e):y(e)}async function _(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}=m(h.createElement(f,{flexDirection:`column`},h.createElement(l,{title:`Zenovay detected${e.packageMarker?` (${e.packageMarker})`:``}`,state:`idle`},h.createElement(p,null,`What do you want to do?`)),h.createElement(u,{items:n,onSelect:e=>{r(),t(e)}})))})}async function v(t){let i=await e(),a=await n({strict:!1});if(!a)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let o=i.defaultSiteId,s=i.defaultSiteName,c=new r({config:i,cliVersion:t.cliVersion,token:a});return new Promise(e=>{let{unmount:n}=m(h.createElement(d,{cliVersion:t.cliVersion,api:c,dashboardContext:{commandName:`ai chat`,siteId:o,siteLabel:s,metricsSnapshot:null},onClose:()=>{n(),e(0)}}))})}async function y(r){let i=await e(),a=await n({strict:!1});if(!a)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new t({config:i,cliVersion:r.cliVersion,token:a});process.stdout.write(`
|
|
2
2
|
Zenovay · MCP mode — describe what you want to create or change. Ctrl-C to exit.
|
|
3
3
|
|
|
4
4
|
> `);let c=await b();if(!c)return 0;let l=await s.openAiStream(`mcp`,{messages:[{role:`user`,content:c}]});for await(let e of o(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(`
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{ApiError as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{ChatPanel as l}from"./chat-panel-C_yjPXnw.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{stripUrlPrefix as d}from"./fmt-gMsty5jy.js";import{DataTable as f}from"./data-table-BpbyyNSA.js";import{EmptyState as p}from"./empty-state-CJxa1jUN.js";import{EmbeddedGlobe as m,MetricCard as h}from"./embedded-globe-ClP_lA3q.js";import{Bar as g}from"./bar-DWT-1xOE.js";import{deepLinkFor as _,openInBrowser as ee}from"./keybar-deep-link-C9xNYihD.js";import"./sphere-globe-CvHshl9g.js";import{Box as v,Text as y,render as b,useApp as x,useInput as S}from"ink";import C,{useEffect as w,useState as T}from"react";import E from"ink-spinner";function D(e){if(!(e instanceof t))return!1;let n=e.status;if(n===401||n===403||n===404)return!0;let r=e.body,i=r?.code;return i===`forbidden`||i===`not_found`||i===`auth_required`||i===`auth_invalid`||i===`tier_insufficient`}function O(e,t){return e.catch(e=>{if(D(e))throw e;return t})}async function k(t){let o=await e(),s=await n({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new r({config:o,cliVersion:t.cliVersion,token:s}),l,d;try{({siteId:l,site:d}=await u(c,{explicit:t.siteId,headless:!!t.json,cliVersion:t.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??l;if(a(t))try{let e=await j(c,l,`24h`);if(t.csv||t.tsv){let{writeCsv:n}=await import(`./csv-emit-BjL_a4Hk.js`);return n(e.topPages,[`path`,`views`,`uniqueVisitors`,`avgTime`,`bounceRate`],t.tsv?`tsv`:`csv`)}if(t.ndjson){for(let t of e.topPages)process.stdout.write(JSON.stringify(t)+`
|
|
2
|
+
`);return 0}return i({type:`overview.snapshot`,data:e}),0}catch(e){let{emitErrorEnvelope:n}=await import(`./error-codes-BeJw1P4i.js`);return n(e,{command:`analytics`,cliVersion:t.cliVersion})}return new Promise(e=>{let{unmount:n}=b(C.createElement(M,{api:c,siteId:l,siteLabel:f,cliVersion:t.cliVersion,onExit:t=>{n(),e(t)}}))})}function A(e){return e===`24h`?`7d`:e}async function j(e,t,n){let[r,i,a,o,s]=await Promise.all([O(e.getStats(t,n),null),O(e.getPages(t),[]),O(e.getSources(t,A(n),`prev`),null),O(e.getGeo(t),null),O(e.getDevices(t),null)]),c=i.reduce((e,t)=>e+t.views,0),l=(r?.daily??[]).map(e=>e.visitors),u=(r?.daily??[]).map(e=>e.pageviews),d=Math.floor(l.length/2),f=l.slice(0,d).reduce((e,t)=>e+t,0),p=u.slice(0,d).reduce((e,t)=>e+t,0),m=(a?.sources??[]).filter(e=>e.channel!==`other`||!e.source.includes(`/`)).slice(0,6).map(e=>({name:e.source,visitors:e.visitors,delta:e.delta??null}));return{visitors:r?.visitors??0,pageviews:r?.pageviews??c,bounceRate:r?.bounceRate??null,avgSession:r?.avgSessionSec??null,series:l,pageviewsSeries:u,prevVisitors:f,prevPageviews:p,topPages:i.slice(0,10),channels:m,countries:(o?.countries??[]).slice(0,8),browsers:(s?.browsers??[]).slice(0,5),devices:(s?.devices??[]).slice(0,5)}}const M=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=x(),[u,b]=T(null),[D,O]=T(!0),[k,A]=T(null),[M,N]=T(`24h`),[P,F]=T(t),[I,L]=T(n),[R,z]=T(!1),[B,V]=T([]),[H,U]=T(!1);S(async t=>{if(!H){if(t===`/`){U(!0);return}if(t===`o`||t===`O`){ee(_(`overview`,{siteId:P}));return}if(t===`q`){a(),i(0);return}if(t===`1`){N(`24h`);return}if(t===`2`){N(`7d`);return}if(t===`3`){N(`30d`);return}if(t===`4`){N(`90d`);return}if(t===`s`){if(B.length===0)try{let t=await e.getSites();V(t)}catch{}z(e=>!e);return}}}),w(()=>{let t=!1;return O(!0),(async()=>{try{let n=await j(e,P,M);t||(b(n),O(!1))}catch(e){t||(A(e.message),O(!1))}})(),()=>{t=!0}},[e,P,M]);let W=()=>C.createElement(o,{title:`Switch site`,state:`idle`},B.length===0?C.createElement(y,{color:`gray`},`Loading your sites…`):B.map(e=>C.createElement(v,{key:e.id},C.createElement(y,{color:e.id===P?`cyan`:`gray`},e.id===P?`› `:` `),C.createElement(y,{bold:e.id===P},e.name),C.createElement(y,{color:`gray`},` (`,e.url.replace(/^https?:\/\//,``).replace(/\/$/,``),`)`))),C.createElement(v,{marginTop:1},C.createElement(y,{color:`gray`},`Press `),C.createElement(y,{color:`cyan`},`[number]`),C.createElement(y,{color:`gray`},` to pick, `),C.createElement(y,{color:`cyan`},`[s]`),C.createElement(y,{color:`gray`},` to close.`)));S(e=>{if(H||!R)return;let t=Number(e);if(Number.isInteger(t)&&t>=1&&t<=B.length){let e=B[t-1];F(e.id),L(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),z(!1)}});let G=`overview · ${I} · ${M}`,K=[{key:`q`,label:`quit`},{key:`/`,label:`ask AI`},{key:`o`,label:`open in browser`},{key:`s`,label:`site`},{key:`1-4`,label:`range (24h/7d/30d/90d)`}];if(H)return C.createElement(l,{cliVersion:r,api:e,dashboardContext:{commandName:`overview`,siteId:P,siteLabel:I,metricsSnapshot:u},onClose:()=>U(!1)});if(D)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(o,{title:`Loading`,state:`busy`},C.createElement(v,null,C.createElement(y,{color:`cyan`},C.createElement(E,{type:`dots`})),C.createElement(y,null,` Fetching dashboard…`))),R?W():null);if(k)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(p,{reason:`error`,headline:`Failed to load`,hint:k}),R?W():null,C.createElement(c,{items:K}));if(!u||u.visitors===0&&u.pageviews===0&&u.topPages.length===0)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(p,{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.`}),R?W():null,C.createElement(c,{items:K}));let q=process.stdout.columns??80,J=Math.max(18,Math.floor(q/4)-1),Y=Math.max(28,Math.floor(q/2)-2),X=[{key:`path`,label:`path`,width:32,format:e=>d(String(e??``))},{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)}%`:`—`}],Z=u.prevVisitors>0?(u.visitors-u.prevVisitors)/u.prevVisitors:void 0,Q=u.prevPageviews>0?(u.pageviews-u.prevPageviews)/u.prevPageviews:void 0,te=Math.max(1,...u.channels.map(e=>e.visitors)),ne=Math.max(1,...u.countries.map(e=>e.visitors)),re=Math.max(1,...u.browsers.map(e=>e.visitors)),ie=Math.max(1,...u.devices.map(e=>e.visitors)),$=Math.max(8,Math.floor(Y/3)),ae=q>=70,oe=u.countries.flatMap(e=>Array(Math.min(e.visitors,8)).fill({country:e.country}));return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(v,{flexDirection:`row`},C.createElement(h,{title:`Visitors`,value:u.visitors,format:`number`,width:J,series:u.series,...typeof Z==`number`?{delta:Z}:{}}),C.createElement(h,{title:`Pageviews`,value:u.pageviews,format:`number`,width:J,series:u.pageviewsSeries,...typeof Q==`number`?{delta:Q}:{}}),C.createElement(h,{title:`Bounce rate`,value:u.bounceRate??``,emptyHint:`—`,format:`percent`,width:J}),C.createElement(h,{title:`Avg session`,value:u.avgSession??``,emptyHint:`—`,format:`duration`,width:J})),ae?C.createElement(o,{title:`Globe`},C.createElement(m,{events:oe,width:Math.max(60,q-4),height:12})):null,C.createElement(v,{flexDirection:`row`,flexWrap:`wrap`},C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Channels`},u.channels.length===0?C.createElement(y,{color:`gray`},`No channel data yet.`):u.channels.map(e=>C.createElement(v,{key:e.name,flexDirection:`row`},C.createElement(v,{width:12},C.createElement(y,null,e.name)),C.createElement(g,{value:e.visitors,max:te,width:$,showPercent:!1,...typeof e.delta==`number`?{delta:e.delta}:{}}),C.createElement(y,{color:`gray`},` `,e.visitors))))),C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Top countries`},u.countries.length===0?C.createElement(y,{color:`gray`},`No geo data yet.`):u.countries.map(e=>C.createElement(v,{key:e.country,flexDirection:`row`},C.createElement(v,{width:5},C.createElement(y,null,e.country)),C.createElement(g,{value:e.visitors,max:ne,width:$,showPercent:!1}),C.createElement(y,{color:`gray`},` `,e.visitors)))))),C.createElement(v,{flexDirection:`row`,flexWrap:`wrap`},C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Top browsers`},u.browsers.length===0?C.createElement(y,{color:`gray`},`No browser data yet.`):u.browsers.map(e=>C.createElement(v,{key:e.name,flexDirection:`row`},C.createElement(v,{width:12},C.createElement(y,null,e.name)),C.createElement(g,{value:e.visitors,max:re,width:$,showPercent:!1}),C.createElement(y,{color:`gray`},` `,e.visitors))))),C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Top devices`},u.devices.length===0?C.createElement(y,{color:`gray`},`No device data yet.`):u.devices.map(e=>C.createElement(v,{key:e.name,flexDirection:`row`},C.createElement(v,{width:12},C.createElement(y,null,e.name)),C.createElement(g,{value:e.visitors,max:ie,width:$,showPercent:!1}),C.createElement(y,{color:`gray`},` `,e.visitors)))))),C.createElement(o,{title:`Top pages (${M})`},u.topPages.length===0?C.createElement(y,{color:`gray`},`No pages with data in this window yet.`):C.createElement(f,{columns:X,data:u.topPages,zebra:!0})),R?W():null,C.createElement(c,{items:K}))};async function N(e){return k(e)}export{N as analyticsCommand};
|
package/dist/bin.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import{configDir as e,readConfig as t}from"./config-Dn_Cl0cD.js";import{manifestSchema as n}from"./check-D9G0N7NB.js";import{applyManifest as r}from"./apply-oUMOH7u2.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import{normalizeError as i}from"./error-codes-BohPg7wr.js";import{emit as a,flush as o,initTelemetry as s}from"./telemetry-urcJlNpJ.js";import{cac as c}from"cac";import{fork as l,spawn as u}from"node:child_process";import d from"node:path";import{fileURLToPath as f}from"node:url";import{promises as p,readFileSync as m}from"node:fs";import h from"semver";import{z as g}from"zod";const _=2e3,v=3e4,y=5e3,b=5e3,x=36e5,S=new Set([`update`,`health`,`doctor`,`--version`,`-v`]),C=g.object({checkedAt:g.number(),latest:g.string()});function w(){return d.join(e(),`update-cache.json`)}async function T(){try{let e=await p.readFile(w(),`utf8`),t=C.safeParse(JSON.parse(e));return t.success?t.data:null}catch{return null}}async function E(t){try{await p.mkdir(e(),{recursive:!0,mode:448}),await p.writeFile(w(),JSON.stringify(t),{mode:384})}catch{}}const D=g.object({latest:g.string(),minSupported:g.string().optional(),platforms:g.record(g.string(),g.unknown()).optional(),downloads:g.record(g.string(),g.unknown()).optional()});async function O(e){if(k(e.argv))return;let t=null,n=await T();if(n&&Date.now()-n.checkedAt<x)t={latest:n.latest,platforms:{}};else{try{t=await A()}catch(e){I(`update check failed: ${e.message}`);return}t&&await E({checkedAt:Date.now(),latest:t.latest})}if(!t||!h.valid(e.currentVersion)||!h.valid(t.latest)||h.eq(e.currentVersion,t.latest)||h.lt(t.latest,e.currentVersion))return;let r=h.diff(e.currentVersion,t.latest);if(!r)return;let i=j();if(r===`patch`||r===`prepatch`){let n=await M(t,e,i);if(n&&i===`npm-global`)return;n&&F(e.argv);return}if(r===`minor`||r===`preminor`||r===`major`||r===`premajor`||r===`prerelease`){let n=await P(t.latest);if(!n){process.stderr.write(`Continuing with ${e.currentVersion}.\n`);return}let r=await M(t,e,i);if(r&&i===`npm-global`)return;r&&F(e.argv);return}}function k(e){if(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`||e.includes(`--no-update-check`))return!0;let t=e[2];return!!(t&&S.has(t))}async function A(){let e=j();if(e===`npm-global`||e===`npm-local`||e===`unknown`)try{let e=await fetch(`https://registry.npmjs.org/@zenovay/cli/latest`,{signal:AbortSignal.timeout(_),headers:{Accept:`application/json`}});if(!e.ok)return null;let t=await e.json();return t.version?{latest:t.version,platforms:{}}:null}catch{return null}let r=await t();try{let e=await fetch(`${r.cliBase}/version`,{signal:AbortSignal.timeout(_)});if(!e.ok)return null;let t=await e.json(),i=n.safeParse(t);if(i.success)return i.data;let a=D.safeParse(t);return a.success?{latest:a.data.latest,minSupported:a.data.minSupported,platforms:{}}:null}catch{return null}}function j(){let e=process.argv[1]??``;if(!e)return`unknown`;let t=e.replace(/\\/g,`/`);return t.includes(`/_npx/`)?`npm-local`:t.includes(`/node_modules/@zenovay/cli/`)?`npm-global`:t.includes(`/node_modules/.bin/zenovay`)?`npm-local`:t.includes(`/node_modules/`)?`unknown`:`binary`}async function M(e,n,i){if(i===`npm-local`)return process.stderr.write(`Update available — \`npm i -g @zenovay/cli@${e.latest}\` to upgrade.\n`),!1;if(i===`unknown`)return I(`unknown install method; skipping auto-update (latest ${e.latest})`),!1;if(i===`npm-global`)return await N(e.latest);try{let i=await t(),a=await Promise.race([r({currentVersion:n.currentVersion,cliBase:i.cliBase,binaryPath:n.binaryPath,manifest:e}),new Promise((e,t)=>setTimeout(()=>t(Error(`patch install timeout`)),y))]);return a.updated?!0:(I(`update skipped: ${a.reason??`unknown`}`),!1)}catch(e){return I(`update failed: ${e.message}`),!1}}function N(e){return new Promise(t=>{process.stderr.write(` Updating @zenovay/cli to ${e}...\n`);let n=process.platform===`win32`?`npm.cmd`:`npm`,r=[`install`,`-g`,`@zenovay/cli@${e}`],i={stdio:[`ignore`,`ignore`,`pipe`]},a=``,o=!1,s=u(n,r,i),c=setTimeout(()=>{if(!o){o=!0;try{s.kill(`SIGKILL`)}catch{}I(`npm install timed out after ${v/1e3}s; continuing with current version`),t(!1)}},v);s.stderr?.on(`data`,e=>{a+=e.toString(`utf8`)}),s.on(`error`,e=>{o||(o=!0,clearTimeout(c),I(`npm install error: ${e.message}`),t(!1))}),s.on(`exit`,n=>{o||(o=!0,clearTimeout(c),n===0&&(process.stderr.write(` ✔ Updated to ${e}. Re-run your command to use the new version.\n`),process.exit(0)),/EACCES|permission denied/i.test(a)?process.stderr.write(`Auto-update needs sudo for the global npm prefix. Run: sudo npm i -g @zenovay/cli@${e}\n`):I(`npm install exited ${n}; continuing with current version`),t(!1))})})}function P(e){return new Promise(t=>{if(!process.stdin.isTTY||!process.stderr.isTTY){t(!0);return}process.stderr.write(`New version ${e} available. Update? [Y/n] (auto-yes 5s) `);let n=!1,r=e=>{if(n)return;let r=e.toString(`utf8`).trim().toLowerCase();n=!0,i(),process.stderr.write(`
|
|
3
3
|
`),t(r===``||r===`y`||r===`yes`)},i=()=>{clearTimeout(a),process.stdin.off(`data`,r);try{process.stdin.pause()}catch{}},a=setTimeout(()=>{n||(n=!0,i(),process.stderr.write(`
|
|
4
|
-
`),t(!0))},b);try{process.stdin.resume(),process.stdin.on(`data`,r)}catch{i(),t(!0)}})}function F(e){try{let t=e.slice(1),n=u(process.execPath,t,{stdio:`inherit`});n.on(`exit`,e=>{process.exit(typeof e==`number`?e:0)}),n.on(`error`,()=>{})}catch{}}function I(e){if(process.env.ZENOVAY_DEBUG_UPDATE===`1`)try{process.stderr.write(`zenovay: ${e}\n`)}catch{}}const L=d.dirname(f(import.meta.url)),R=d.join(L,`..`,`package.json`),z=JSON.parse(m(R,`utf8`)),B=z.version,V=process.argv[0]??`zenovay`;function H(){if(process.env.ZENOVAY_BACKGROUND_UPDATE===`1`&&!(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`))try{let e=d.join(L,`lib`,`update`,`worker.js`),t=l(e,[],{detached:!0,stdio:`ignore`});t.unref()}catch{}}const U=c(`zenovay`);U.version(B),U.help(e=>{let t=e.filter(e=>{let t=e.title??``;return!/for more info/i.test(t)});return t.push({body:"Run `zenovay <command> --help` for command-specific options and examples."}),t}),U.option(`-q, --quiet`,`Suppress spinners + interactive UI; implies --json`),U.option(`--team <name-or-id>`,"Team override for this command (alternative to `zenovay teams switch`)"),(process.argv.includes(`-q`)||process.argv.includes(`--quiet`))&&(process.env.ZENOVAY_FORMAT=`json`,process.argv.includes(`--json`)||process.argv.push(`--json`));const W=process.argv.findIndex(e=>e===`--team`);if(W!==-1&&process.argv[W+1]&&(process.env.ZENOVAY_TEAM_ID=process.argv[W+1]),!process.env.ZENOVAY_TEAM_ID)try{let e=process.env.HOME??process.env.USERPROFILE??``,t=d.join(e,`.config`,`zenovay`,`config.json`),n=m(t,`utf8`),r=JSON.parse(n);r.currentTeamId&&(process.env.ZENOVAY_TEAM_ID=r.currentTeamId)}catch{}U.command(`init`,`AI install wizard — add Zenovay tracking to your codebase`).option(`--json`,`Emit NDJSON events to stdout`).option(`--yes`,`Auto-approve all diffs (for CI)`).option(`--skip-mcp`,`Skip MCP client install`).option(`--skip-verify`,`Skip first-event verification`).action(async e=>{let{initCommand:t}=await import(`./init-
|
|
4
|
+
`),t(!0))},b);try{process.stdin.resume(),process.stdin.on(`data`,r)}catch{i(),t(!0)}})}function F(e){try{let t=e.slice(1),n=u(process.execPath,t,{stdio:`inherit`});n.on(`exit`,e=>{process.exit(typeof e==`number`?e:0)}),n.on(`error`,()=>{})}catch{}}function I(e){if(process.env.ZENOVAY_DEBUG_UPDATE===`1`)try{process.stderr.write(`zenovay: ${e}\n`)}catch{}}const L=d.dirname(f(import.meta.url)),R=d.join(L,`..`,`package.json`),z=JSON.parse(m(R,`utf8`)),B=z.version,V=process.argv[0]??`zenovay`;function H(){if(process.env.ZENOVAY_BACKGROUND_UPDATE===`1`&&!(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`))try{let e=d.join(L,`lib`,`update`,`worker.js`),t=l(e,[],{detached:!0,stdio:`ignore`});t.unref()}catch{}}const U=c(`zenovay`);U.version(B),U.help(e=>{let t=e.filter(e=>{let t=e.title??``;return!/for more info/i.test(t)});return t.push({body:"Run `zenovay <command> --help` for command-specific options and examples."}),t}),U.option(`-q, --quiet`,`Suppress spinners + interactive UI; implies --json`),U.option(`--team <name-or-id>`,"Team override for this command (alternative to `zenovay teams switch`)"),(process.argv.includes(`-q`)||process.argv.includes(`--quiet`))&&(process.env.ZENOVAY_FORMAT=`json`,process.argv.includes(`--json`)||process.argv.push(`--json`));const W=process.argv.findIndex(e=>e===`--team`);if(W!==-1&&process.argv[W+1]&&(process.env.ZENOVAY_TEAM_ID=process.argv[W+1]),!process.env.ZENOVAY_TEAM_ID)try{let e=process.env.HOME??process.env.USERPROFILE??``,t=d.join(e,`.config`,`zenovay`,`config.json`),n=m(t,`utf8`),r=JSON.parse(n);r.currentTeamId&&(process.env.ZENOVAY_TEAM_ID=r.currentTeamId)}catch{}U.command(`init`,`AI install wizard — add Zenovay tracking to your codebase`).option(`--json`,`Emit NDJSON events to stdout`).option(`--yes`,`Auto-approve all diffs (for CI)`).option(`--skip-mcp`,`Skip MCP client install`).option(`--skip-verify`,`Skip first-event verification`).action(async e=>{let{initCommand:t}=await import(`./init-D6qfFHJW.js`),n=await t({cliVersion:B,cwd:process.cwd(),json:e.json,yes:e.yes,skipMcp:e.skipMcp,skipVerify:e.skipVerify});process.exitCode=n}),U.command(`login`,`Authenticate via OAuth device flow`).option(`--json`,`Emit NDJSON events`).option(`--no-browser`,`Skip opening the browser automatically`).action(async e=>{let{loginCommand:t}=await import(`./login-CxdKhA-o.js`),n=await t({cliVersion:B,json:e.json,openBrowser:e.browser!==!1,onCode:e=>{process.stdout.write(`\n Open this URL to authorize the CLI:\n ${e.verificationUriComplete??e.verificationUri}\n Or enter code: ${e.userCode}\n\n`)}});!e.json&&n.email?process.stdout.write(`\n ✔ Logged in as ${n.email}\n Try \`zenovay overview\` to see your dashboard, or \`zenovay --help\` for the full command list.\n\n`):e.json||process.stdout.write(`
|
|
5
5
|
✔ Logged in.
|
|
6
6
|
|
|
7
|
-
`)}),U.command(`logout`,`Revoke current session and delete local auth`).option(`--json`,``).action(async e=>{let{logoutCommand:t}=await import(`./logout-DhxuBzBA.js`);await t({cliVersion:B,json:e.json})}),U.command(`ai`,`3-mode AI assistant (install / chat / mcp)`).option(`--mode <mode>`,`install | chat | mcp`).option(`--json`,``).action(async e=>{let{aiCommand:t}=await import(`./ai-BcTacXVX.js`),n=await t({cliVersion:B,cwd:process.cwd(),mode:e.mode,json:e.json});process.exitCode=n}),U.command(`watch`,"[ANALYTICS] Alias for `analytics` (dashboard summary)").option(`--site-id <id>`,`Site ID`).option(`--interval <ms>`,`Poll interval ms (legacy; ignored by analytics)`,{default:15e3}).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-DXs-73fZ.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`analytics`,`[ANALYTICS] Landing dashboard — visitors, pageviews, bounce, top pages`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-DXs-73fZ.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`overview`,"[ANALYTICS] Alias for `analytics`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-DXs-73fZ.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`home`,`[ACCOUNT] Top-level summary — sites + this-week deltas`).option(`--json`,``).action(async e=>{let{homeCommand:t}=await import(`./home-C1MIRuKj.js`);process.exitCode=await t({cliVersion:B,json:e.json})}),U.command(`live`,`[ANALYTICS] Real-time visitors + globe + recent events (2s polling)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-STTP72bj.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`pages`,`[ANALYTICS] Top pages by views — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{pagesCommand:t}=await import(`./pages-BSrLs-uO.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`devices`,`[ANALYTICS] Device / browser / OS breakdown — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit devices as CSV`).option(`--tsv`,`Emit devices as TSV`).option(`--ndjson`,`Emit devices as NDJSON (one row per line)`).action(async e=>{let{devicesCommand:t}=await import(`./devices-B42BgNHR.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`geo`,`[ANALYTICS] Countries + cities + globe — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit countries as CSV`).option(`--tsv`,`Emit countries as TSV`).option(`--ndjson`,`Emit countries as NDJSON (one row per line)`).action(async e=>{let{geoCommand:t}=await import(`./geo-nRtvR5z7.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`retention`,`[BEHAVIOR] Cohort retention heatmap — D1 / D7 / D30 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{retentionCommand:t}=await import(`./retention-CnnvhKfg.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`uptime`,`[BEHAVIOR] Uptime monitors with status + p95 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{uptimeCommand:t}=await import(`./uptime-IeukwgWB.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`sessions`,`[BEHAVIOR] Recent session-replay list (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{sessionsCommand:t}=await import(`./sessions-XlocBz-a.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`heatmaps`,`[BEHAVIOR] Recent heatmap captures (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{heatmapsCommand:t}=await import(`./heatmaps-Pdew7TmM.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`journeys`,`[BEHAVIOR] Page-to-page transition flow (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{journeysCommand:t}=await import(`./journeys-BopFgaqo.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`insights`,`[INTELLIGENCE] AI-generated anomaly / trend / recommendation cards (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-IHUOC1FY.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`events tail`,`Stream live events`).option(`--site-id <id>`,`Site ID`,{default:``}).option(`--filter <expr>`,`Filter expression (e.g. 'type=pageview AND country=US')`).option(`--forward-to <url>`,`POST each event to a webhook with HMAC-SHA256 signature`).option(`--replay-24h`,`Replay the last 24h before going live`).option(`--set-forward-secret <hex>`,`Persist the HMAC secret used by --forward-to`).option(`--json`,``).action(async e=>{let{eventsTailCommand:t}=await import(`./events-tail-pDYhVzFg.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,filter:e.filter,forwardTo:e.forwardTo,replay24h:e.replay24h,setForwardSecret:e.setForwardSecret});process.exitCode=n}),U.command(`health`,`Run self-diagnostic checks`).option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-lTPnKNY9.js`),n=await t({cliVersion:B,binaryPath:V,json:e.json});process.exitCode=n}),U.command(`annotation [action]`,`[OPERATIONS] annotation create [--type --message --occurred-at] (deploy / release / campaign / incident / custom)`).option(`--type <type>`,`One of: deploy, release, campaign, incident, custom`,{default:`custom`}).option(`--message <message>`,`Short description (1–500 chars)`,{default:``}).option(`--occurred-at <iso>`,`ISO 8601 timestamp (default: now)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async(e,t)=>{let n=e??`create`;if(n!==`create`){process.stderr.write(`Unknown annotation action: ${n}. Try: zenovay annotation create --type=deploy --message="..."\n`),process.exitCode=2;return}let{annotationCreateCommand:r}=await import(`./annotation-GkAYwvze.js`),i=await r({cliVersion:B,type:t.type,message:t.message,occurredAt:t.occurredAt,siteId:t.siteId,json:t.json});process.exitCode=i}),U.command(`doctor`,`AI-assisted self-healing`).option(`--json`,``).action(async e=>{let{doctorCommand:t}=await import(`./doctor-CF3D4SXm.js`),n=await t({cliVersion:B,binaryPath:V,json:e.json});process.exitCode=n}),U.command(`stats`,`One-shot dashboard summary (scriptable by default)`).option(`--site-id <id>`,`Site ID`).option(`--range <range>`,`Time range: 24h | 7d | 30d`,{default:`24h`}).option(`--watch`,`Auto-refresh every 60s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{statsCommand:t}=await import(`./stats-BSIpzfbA.js`),n=await t({cliVersion:B,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`sources`,`Traffic source breakdown with delta arrows`).option(`--site-id <id>`,`Site ID`).option(`--period <p>`,`Period: 7d | 30d | 90d | 1y`,{default:`30d`}).option(`--compare <c>`,`Comparison window (use "prev" for period-over-period)`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{sourcesCommand:t}=await import(`./sources-BTQtmp0s.js`),n=await t({cliVersion:B,siteId:e.siteId,period:e.period,compare:e.compare,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`vitals`,`Core Web Vitals dashboard (LCP / INP / CLS / TTFB / FCP)`).option(`--site-id <id>`,`Site ID`).option(`--url <path>`,`Filter to a single URL`).option(`--device <type>`,`Filter by device: mobile | desktop`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`7d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{vitalsCommand:t}=await import(`./vitals-BSfmTgnP.js`),n=await t({cliVersion:B,siteId:e.siteId,url:e.url,device:e.device,window:e.window,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`revenue`,`MRR / ARR / transaction series`).option(`--site-id <id>`,`Site ID`).option(`--range <r>`,`Time range: 24h | 7d | 30d | 1y`,{default:`30d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{revenueCommand:t}=await import(`./revenue-C6Dohqs2.js`),n=await t({cliVersion:B,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`funnels`,`List available funnels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-Ds9U10cE.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`themes`,`List available themes with colored swatches`).option(`--validate <path>`,`Validate a custom theme JSON file`).option(`--json`,`Emit themes JSON to stdout`).action(async e=>{let{themesCommand:t}=await import(`./themes-Dqt--qhd.js`),n=await t({cliVersion:B,validate:e.validate,json:e.json});process.exitCode=n}),U.command(`completions [shell] [valuesType]`,`Emit shell-completion script (bash | zsh | fish | nushell | pwsh)`).option(`--list`,`List supported shells`).action(async(e,t,n)=>{let{completionsCommand:r}=await import(`./completions-C_hmoEps.js`),i=await r({shell:e,valuesType:t,list:n.list});process.exitCode=i}),U.command(`query [sql]`,`Restricted SQL REPL over the analytics schema (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--max-rows <n>`,`Cap result row count`,{default:1e3}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{queryCommand:n}=await import(`./query-DXLNEQfu.js`),r=await n({cliVersion:B,siteId:t.siteId,sql:e,maxRows:typeof t.maxRows==`string`?Number(t.maxRows):t.maxRows,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),U.command(`companies`,`B2B identification feed (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max rows`,{default:100}).option(`--new-only`,`Show only newly identified companies (first-seen in last hour)`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-BqIS4j9h.js`),n=await t({cliVersion:B,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,newOnly:e.newOnly,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`projects`,`List your tracked projects`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{projectsCommand:t}=await import(`./projects-CF9gkQnY.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`deploys`,`[OPERATIONS] Recent deploy markers overlaid on charts`).option(`--site-id <id>`,`Site ID`).option(`--branch <name>`,`Filter to a single branch (e.g. main, develop)`).option(`--since <iso>`,`Only commits after this ISO timestamp`).option(`--limit <n>`,`Max rows`,{default:50}).option(`--connect`,`Print the GitHub-integration deep link in app.zenovay.com`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{deploysCommand:t}=await import(`./deploys-D044xeG7.js`),n=await t({cliVersion:B,siteId:e.siteId,branch:e.branch,since:e.since,limit:typeof e.limit==`string`?Number(e.limit):e.limit,connect:e.connect,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`webhooks forward`,`[OPERATIONS] Forward webhook events to a local URL (stripe-listen-style tunnel)`).option(`--to <url>`,`Local URL to POST events to (e.g. localhost:3000/webhook)`).option(`--site-id <id>`,`Site ID`).option(`--sign`,`HMAC-sign each forwarded request with X-Zenovay-Signature`).option(`--secret <hex>`,`HMAC secret (auto-derived from tunnel key if --sign without --secret)`).option(`--max-retries <n>`,`Per-request retry count`,{default:3}).action(async e=>{let{webhooksForwardCommand:t}=await import(`./webhooks-forward-Dijs9bUk.js`),n=await t({cliVersion:B,to:e.to,siteId:e.siteId,sign:e.sign,secret:e.secret,maxRetries:typeof e.maxRetries==`string`?Number(e.maxRetries):e.maxRetries});process.exitCode=n}),U.command(`errors`,`[BEHAVIOR] Recent JS / HTTP error snapshot`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max errors to fetch`,{default:100}).option(`--search <q>`,`Filter by class or message substring`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{errorsCommand:t}=await import(`./errors-Bvz3ldBZ.js`),n=await t({cliVersion:B,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,search:e.search,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`funnel <id>`,`Funnel drop-off chart for a specific funnel`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 7d | 30d`,{default:`30d`}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{funnelCommand:n}=await import(`./funnel-Ds9U10cE.js`),r=await n({cliVersion:B,siteId:t.siteId,funnelId:e,window:t.window,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),U.command(`api-keys [action] [id]`,`[MANAGE] api-keys list | create [--name --scope] | delete <id>`).option(`--name <n>`,`Human-readable label (create)`).option(`--scope <scope>`,`read | write (create)`,{default:`read`}).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{apiKeysCommand:r}=await import(`./api-keys-DphyO-_Y.js`),i=e??`list`;process.exitCode=await r({cliVersion:B,action:i,id:t,name:n.name,scope:n.scope===`write`?`write`:`read`,yes:n.yes,json:n.json})}),U.command(`domains [action] [arg]`,`[MANAGE] domains list | add <url> [--name] | delete <id>`).option(`--name <n>`,`Friendly project name (add; default: domain itself)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{domainsCommand:r}=await import(`./domains-2z51Uxcq.js`),i=e??`list`;process.exitCode=await r({cliVersion:B,action:i,url:i===`add`?t:void 0,id:i===`delete`?t:void 0,name:n.name,yes:n.yes,json:n.json})}),U.command(`team [action] [arg] [arg2]`,`[MANAGE] team list | invite <email> [--role] | remove <userId> | role <userId> <admin|member> (Pro+)`).option(`--role <role>`,`admin | member (invite)`,{default:`member`}).option(`--yes`,`Skip confirmation (remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{teamCommand:i}=await import(`./team-DVMA4G7x.js`),a=e??`list`,o;a===`role`?o=n===`admin`?`admin`:`member`:a===`invite`&&(o=r.role===`admin`?`admin`:`member`),process.exitCode=await i({cliVersion:B,action:a,email:a===`invite`?t:void 0,userId:a===`remove`||a===`role`?t:void 0,role:o,yes:r.yes,json:r.json})}),U.command(`profile [action]`,`[ACCOUNT] profile show | edit [--name --notifications]`).option(`--name <n>`,`New display name (edit)`).option(`--notifications <pref>`,`email | none (edit)`).option(`--json`,``).action(async(e,t)=>{let n=e??`show`,r=t.notifications===`email`||t.notifications===`none`?t.notifications:void 0,{profileCommand:i}=await import(`./profile-6Qi1GQhk.js`);process.exitCode=await i({cliVersion:B,action:n,name:t.name,notifications:r,json:t.json})}),U.command(`plans [action] [arg] [arg2]`,`[ACCOUNT] plans info | upgrade <pro|scale> | cancel --yes | payment update`).option(`--yes`,"Required for `cancel`").option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`info`,{plansCommand:a}=await import(`./plans-CQEvr15R.js`),o;if(i===`upgrade`&&t){let e=String(t).toLowerCase();(e===`pro`||e===`scale`||e===`enterprise`)&&(o=e)}let s=i===`payment`&&t===`update`||i===`payment`?`update`:void 0;process.exitCode=await a({cliVersion:B,action:i,targetPlan:o,paymentAction:s,yes:r.yes,json:r.json})}),U.command(`billing [action]`,"[ACCOUNT] Alias for `plans info`").option(`--json`,``).action(async(e,t)=>{let{plansCommand:n}=await import(`./plans-CQEvr15R.js`);process.exitCode=await n({cliVersion:B,action:`info`,json:t.json})}),U.command(`settings [action] [key] [value]`,`[ACCOUNT] settings get [key] | set <key> <value>`).option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`get`,{settingsCommand:a}=await import(`./settings-Hf05xTPV.js`);process.exitCode=await a({cliVersion:B,action:i,key:t||void 0,value:n||void 0,json:r.json})}),U.command(`integrations [action] [name]`,`[ACCOUNT] integrations list | connect <gsc|github> | disconnect <gsc|github>`).option(`--yes`,`Skip confirmation (disconnect)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=t===`gsc`||t===`github`?t:void 0,{integrationsCommand:a}=await import(`./integrations-BCiTNesV.js`);process.exitCode=await a({cliVersion:B,action:r,name:i,yes:n.yes,json:n.json})}),U.command(`goals [action] [id]`,`[ACCOUNT] goals list | create [--name --type --target] | delete <id> (Pro+)`).option(`--name <n>`,`Goal name (create)`).option(`--type <t>`,`pageview | event (create)`).option(`--target <v>`,`URL pattern or event name (create)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=n.type===`event`||n.type===`pageview`?n.type:void 0,{goalsCommand:a}=await import(`./goals-vW8TXNxY.js`);process.exitCode=await a({cliVersion:B,action:r,id:t,name:n.name,type:i,target:n.target,yes:n.yes,json:n.json})}),U.command(`notes [action] [id]`,`[ACCOUNT] notes list | create [--content --site-id] | delete <id>`).option(`--content <text>`,`Note body (create)`).option(`--site-id <id>`,`Attach to a specific site (create; defaults to current)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{notesCommand:i}=await import(`./notes-T3ZNNEoB.js`);process.exitCode=await i({cliVersion:B,action:r,id:t,content:n.content,siteId:n.siteId,yes:n.yes,json:n.json})}),U.command(`agency [action] [arg] [arg2]`,`[ACCOUNT] agency clients list | clients add [--email --name] | clients remove <id> | report send <clientId> (Scale+)`).option(`--email <e>`,`Client contact email (clients add)`).option(`--name <n>`,`Client name (clients add)`).option(`--yes`,`Skip confirmation (clients remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{agencyCommand:i}=await import(`./agency-Jld-6MFj.js`),a=`clients-list`,o;e===`clients`?t===`add`?a=`clients-add`:t===`remove`?(a=`clients-remove`,o=n):a=`clients-list`:e===`report`&&t===`send`&&(a=`report-send`,o=n),process.exitCode=await i({cliVersion:B,action:a,id:o,email:r.email,name:r.name,yes:r.yes,json:r.json})}),U.command(`analytics live`,"[ANALYTICS] Alias for `live`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-STTP72bj.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics funnels`,"[ANALYTICS] Alias for `funnels`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-Ds9U10cE.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics goals`,"[ANALYTICS] Alias for `goals list` (Pro+)").option(`--json`,``).action(async e=>{let{goalsCommand:t}=await import(`./goals-vW8TXNxY.js`);process.exitCode=await t({cliVersion:B,action:`list`,json:e.json})}),U.command(`analytics insights`,"[ANALYTICS] Alias for `insights` (Pro+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-IHUOC1FY.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics profiles`,"[ANALYTICS] User-profiles list (NOT `profile`, which is current-user)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{visitorsCommand:t}=await import(`./visitors-BJAZuFPy.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics companies`,"[ANALYTICS] Alias for `companies` (Scale+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-BqIS4j9h.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`use [site]`,`Set / show / reset your default site (used when --site-id is omitted)`).option(`--reset`,`Clear the stored default site`).option(`--show`,`Print the current default and exit`).option(`--json`,`Emit JSON`).action(async(e,t)=>{let{useCommand:n}=await import(`./use-DKqiTC6X.js`),r=await n({cliVersion:B,match:e,reset:t.reset,show:t.show,json:t.json});process.exitCode=r}),U.command(`update`,`Manually install the latest version`).option(`--check`,`Don't install — just print latest`).option(`--force-downgrade`,`Allow downgrading to an older version`).option(`--no-update-check`,`Disable auto-update for this invocation`).option(`--json`,``).action(async e=>{let{updateCommand:t}=await import(`./update-DV3UrhdN.js`);await t({cliVersion:B,binaryPath:V,check:e.check,forceDowngrade:e.forceDowngrade,json:e.json})}),U.command(`usage`,`[ACCOUNT] Current month events vs plan limits + headcounts`).option(`--json`,``).action(async e=>{let{usageCommand:t}=await import(`./usage-Ck3nnMro.js`);process.exitCode=await t({cliVersion:B,json:e.json})}),U.command(`globe`,`[ANALYTICS] Live 3D globe — visitors plotted on a Braille sphere`).option(`--site-id <id>`,`Site ID`).option(`--browser`,`Open the dashboard's Mapbox globe in your browser instead of the terminal version`).option(`--json`,``).action(async e=>{let{globeCommand:t}=await import(`./globe-CGZ5vibb.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,browser:e.browser,json:e.json})}),U.command(`webhooks [action] [arg]`,`[MANAGE] webhooks list | add <url> [--events] | delete <id> | rotate <id> | test <id>`).option(`--events <list>`,`Comma-separated event types (add)`).option(`--yes`,`Skip confirmation (delete/rotate)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{webhooksCommand:i}=await import(`./webhooks-TMX618nq.js`);process.exitCode=await i({cliVersion:B,action:r,url:r===`add`?t:void 0,id:r===`delete`||r===`rotate`||r===`test`?t:void 0,events:n.events,yes:n.yes,json:n.json})}),U.command(`audit [action]`,`[ACCOUNT] audit list [--since --action --actor] | export [--format --out] (Pro+)`).option(`--since <window>`,`Window like 24h, 7d, 30d (list)`,{default:`7d`}).option(`--action <pattern>`,`Filter by action string (list)`).option(`--actor <userId>`,`Filter by actor user ID (list)`).option(`--format <fmt>`,`ndjson | csv | json (export)`,{default:`ndjson`}).option(`--out <file>`,`Output file path (export). Defaults to stdout`).option(`--json`,``).action(async(e,t)=>{let n=e??`list`,r=t.format===`csv`||t.format===`json`?t.format:`ndjson`,{auditCommand:i}=await import(`./audit-5ImaVfEy.js`);process.exitCode=await i({cliVersion:B,action:n,since:t.since,filterAction:t.action,actor:t.actor,format:r,out:t.out,json:t.json})}),U.command(`share [action]`,`[ACCOUNT] share enable | disable | url — public dashboard share for the current site`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--yes`,`Skip confirmation (disable)`).option(`--json`,``).action(async(e,t)=>{let n=e??`url`,{shareCommand:r}=await import(`./share-BAJcRgY3.js`);process.exitCode=await r({cliVersion:B,action:n,siteId:t.siteId,yes:t.yes,json:t.json})}),U.command(`commands`,`Emit the machine-readable command tree (for AI agents and shell-completion regen)`).option(`--json`,``).action(async e=>{let{commandsCommand:t}=await import(`./commands-BX5I2UyT.js`);process.exitCode=await t({cliVersion:B,json:e.json})}),U.command(`teams [action] [arg]`,`[ACCOUNT] teams list | switch <name-or-id> | current | reset`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{teamsCommand:i}=await import(`./teams-k4OJgxiP.js`);process.exitCode=await i({cliVersion:B,action:r,match:r===`switch`?t:void 0,json:n.json})}),U.command(`self-test`,`[OPERATIONS] Functional smoke check across every read endpoint and your local install`).option(`--quick`,`Run a 10-test subset (faster)`).option(`--full`,`Include active security probes + CLI meta-tests (dev/CI use)`).option(`--verbose`,`Include full stdout/stderr per test`).option(`--parallel <n>`,`Concurrent subprocesses (default 4)`,{default:4}).option(`--json`,`Emit NDJSON one line per test result + final summary`).action(async e=>{let{selfTestCommand:t}=await import(`./self-test-C60HyTDS.js`);process.exitCode=await t({cliVersion:B,full:!!e.full,quick:!!e.quick,verbose:!!e.verbose,parallel:Number(e.parallel)||4,json:!!e.json})}),U.command(`tour`,`[OPERATIONS] Interactive 8-step walkthrough of the CLI`).option(`--non-interactive`,`Print all 8 steps as a flat document (no prompts)`).action(async e=>{let{tourCommand:t}=await import(`./tour-Bwbv_E4Q.js`);process.exitCode=await t({cliVersion:B,nonInteractive:!!(e[`non-interactive`]||e.nonInteractive)})}),U.command(`alerts [action] [id]`,`[MANAGE] alerts list | create [--metric --op --threshold --window] | delete <id> (Pro+)`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--metric <name>`,`Metric to watch (visitors|pageviews|bounce_rate|errors|lcp|inp|cls|uptime|revenue)`).option(`--op <gt|lt>`,`Comparison operator`).option(`--threshold <num>`,`Numeric threshold`).option(`--window <e.g. 1h>`,`Rolling window (5m|1h|24h|7d)`).option(`--name <label>`,`Optional friendly label for the alert`).option(`--channel <chan>`,`Notification channel: in_app | email | webhook (default in_app)`).option(`--email <addr>`,`Notification email (required when --channel email)`).option(`--yes`,`Skip confirmation prompt on delete`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=new Set([`list`,`create`,`delete`]);i.has(r)||(process.stderr.write(n.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown alerts action: ${e}`,hint:`Run zenovay alerts --help`})+`
|
|
7
|
+
`)}),U.command(`logout`,`Revoke current session and delete local auth`).option(`--json`,``).action(async e=>{let{logoutCommand:t}=await import(`./logout-Bj9vLF6-.js`);await t({cliVersion:B,json:e.json})}),U.command(`ai`,`3-mode AI assistant (install / chat / mcp)`).option(`--mode <mode>`,`install | chat | mcp`).option(`--json`,``).action(async e=>{let{aiCommand:t}=await import(`./ai-0_Fj-s69.js`),n=await t({cliVersion:B,cwd:process.cwd(),mode:e.mode,json:e.json});process.exitCode=n}),U.command(`watch`,"[ANALYTICS] Alias for `analytics` (dashboard summary)").option(`--site-id <id>`,`Site ID`).option(`--interval <ms>`,`Poll interval ms (legacy; ignored by analytics)`,{default:15e3}).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-BzPbgxUz.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`analytics`,`[ANALYTICS] Landing dashboard — visitors, pageviews, bounce, top pages`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-BzPbgxUz.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`overview`,"[ANALYTICS] Alias for `analytics`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-BzPbgxUz.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`home`,`[ACCOUNT] Top-level summary — sites + this-week deltas`).option(`--json`,``).action(async e=>{let{homeCommand:t}=await import(`./home-BDDXwGy7.js`);process.exitCode=await t({cliVersion:B,json:e.json})}),U.command(`live`,`[ANALYTICS] Real-time visitors + globe + recent events (2s polling)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-bC-2juBf.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`pages`,`[ANALYTICS] Top pages by views — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{pagesCommand:t}=await import(`./pages-D4wGIILk.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`devices`,`[ANALYTICS] Device / browser / OS breakdown — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit devices as CSV`).option(`--tsv`,`Emit devices as TSV`).option(`--ndjson`,`Emit devices as NDJSON (one row per line)`).action(async e=>{let{devicesCommand:t}=await import(`./devices-CuI5DQCF.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`geo`,`[ANALYTICS] Countries + cities + globe — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit countries as CSV`).option(`--tsv`,`Emit countries as TSV`).option(`--ndjson`,`Emit countries as NDJSON (one row per line)`).action(async e=>{let{geoCommand:t}=await import(`./geo-Ckzgg8Nz.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`retention`,`[BEHAVIOR] Cohort retention heatmap — D1 / D7 / D30 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{retentionCommand:t}=await import(`./retention-CRtzacoI.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`uptime`,`[BEHAVIOR] Uptime monitors with status + p95 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{uptimeCommand:t}=await import(`./uptime-C_eyrDoC.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`sessions`,`[BEHAVIOR] Recent session-replay list (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{sessionsCommand:t}=await import(`./sessions-BoV2tpmy.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`heatmaps`,`[BEHAVIOR] Recent heatmap captures (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{heatmapsCommand:t}=await import(`./heatmaps-B4EIgsJB.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`journeys`,`[BEHAVIOR] Page-to-page transition flow (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{journeysCommand:t}=await import(`./journeys-Bhni1s_j.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`insights`,`[INTELLIGENCE] AI-generated anomaly / trend / recommendation cards (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-B1j-Xb7l.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json});process.exitCode=n}),U.command(`events tail`,`Stream live events`).option(`--site-id <id>`,`Site ID`,{default:``}).option(`--filter <expr>`,`Filter expression (e.g. 'type=pageview AND country=US')`).option(`--forward-to <url>`,`POST each event to a webhook with HMAC-SHA256 signature`).option(`--replay-24h`,`Replay the last 24h before going live`).option(`--set-forward-secret <hex>`,`Persist the HMAC secret used by --forward-to`).option(`--json`,``).action(async e=>{let{eventsTailCommand:t}=await import(`./events-tail-DrAY7_Zr.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,filter:e.filter,forwardTo:e.forwardTo,replay24h:e.replay24h,setForwardSecret:e.setForwardSecret});process.exitCode=n}),U.command(`health`,`Run self-diagnostic checks`).option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-avCr8d4g.js`),n=await t({cliVersion:B,binaryPath:V,json:e.json});process.exitCode=n}),U.command(`annotation [action]`,`[OPERATIONS] annotation create [--type --message --occurred-at] (deploy / release / campaign / incident / custom)`).option(`--type <type>`,`One of: deploy, release, campaign, incident, custom`,{default:`custom`}).option(`--message <message>`,`Short description (1–500 chars)`,{default:``}).option(`--occurred-at <iso>`,`ISO 8601 timestamp (default: now)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async(e,t)=>{let n=e??`create`;if(n!==`create`){process.stderr.write(`Unknown annotation action: ${n}. Try: zenovay annotation create --type=deploy --message="..."\n`),process.exitCode=2;return}let{annotationCreateCommand:r}=await import(`./annotation-BxgifdZn.js`),i=await r({cliVersion:B,type:t.type,message:t.message,occurredAt:t.occurredAt,siteId:t.siteId,json:t.json});process.exitCode=i}),U.command(`doctor`,`AI-assisted self-healing`).option(`--json`,``).action(async e=>{let{doctorCommand:t}=await import(`./doctor-CxtU2i5C.js`),n=await t({cliVersion:B,binaryPath:V,json:e.json});process.exitCode=n}),U.command(`stats`,`One-shot dashboard summary (scriptable by default)`).option(`--site-id <id>`,`Site ID`).option(`--range <range>`,`Time range: 24h | 7d | 30d`,{default:`24h`}).option(`--watch`,`Auto-refresh every 60s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{statsCommand:t}=await import(`./stats-DAluMkCV.js`),n=await t({cliVersion:B,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`sources`,`Traffic source breakdown with delta arrows`).option(`--site-id <id>`,`Site ID`).option(`--period <p>`,`Period: 7d | 30d | 90d | 1y`,{default:`30d`}).option(`--compare <c>`,`Comparison window (use "prev" for period-over-period)`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{sourcesCommand:t}=await import(`./sources-KNLyYn1s.js`),n=await t({cliVersion:B,siteId:e.siteId,period:e.period,compare:e.compare,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`vitals`,`Core Web Vitals dashboard (LCP / INP / CLS / TTFB / FCP)`).option(`--site-id <id>`,`Site ID`).option(`--url <path>`,`Filter to a single URL`).option(`--device <type>`,`Filter by device: mobile | desktop`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`7d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{vitalsCommand:t}=await import(`./vitals-CnmfwDz9.js`),n=await t({cliVersion:B,siteId:e.siteId,url:e.url,device:e.device,window:e.window,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`revenue`,`MRR / ARR / transaction series`).option(`--site-id <id>`,`Site ID`).option(`--range <r>`,`Time range: 24h | 7d | 30d | 1y`,{default:`30d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{revenueCommand:t}=await import(`./revenue-D4xdtgW3.js`),n=await t({cliVersion:B,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`funnels`,`List available funnels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-e5I9PXCO.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`themes`,`List available themes with colored swatches`).option(`--validate <path>`,`Validate a custom theme JSON file`).option(`--json`,`Emit themes JSON to stdout`).action(async e=>{let{themesCommand:t}=await import(`./themes-DDiCFNwd.js`),n=await t({cliVersion:B,validate:e.validate,json:e.json});process.exitCode=n}),U.command(`completions [shell] [valuesType]`,`Emit shell-completion script (bash | zsh | fish | nushell | pwsh)`).option(`--list`,`List supported shells`).action(async(e,t,n)=>{let{completionsCommand:r}=await import(`./completions-Dkd2mw5i.js`),i=await r({shell:e,valuesType:t,list:n.list});process.exitCode=i}),U.command(`query [sql]`,`Restricted SQL REPL over the analytics schema (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--max-rows <n>`,`Cap result row count`,{default:1e3}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{queryCommand:n}=await import(`./query-BX4rrOV_.js`),r=await n({cliVersion:B,siteId:t.siteId,sql:e,maxRows:typeof t.maxRows==`string`?Number(t.maxRows):t.maxRows,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),U.command(`companies`,`B2B identification feed (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max rows`,{default:100}).option(`--new-only`,`Show only newly identified companies (first-seen in last hour)`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-SLdSyZlr.js`),n=await t({cliVersion:B,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,newOnly:e.newOnly,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`projects`,`List your tracked projects`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{projectsCommand:t}=await import(`./projects-WpLMA6OD.js`),n=await t({cliVersion:B,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`deploys`,`[OPERATIONS] Recent deploy markers overlaid on charts`).option(`--site-id <id>`,`Site ID`).option(`--branch <name>`,`Filter to a single branch (e.g. main, develop)`).option(`--since <iso>`,`Only commits after this ISO timestamp`).option(`--limit <n>`,`Max rows`,{default:50}).option(`--connect`,`Print the GitHub-integration deep link in app.zenovay.com`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{deploysCommand:t}=await import(`./deploys-BUxMQNdU.js`),n=await t({cliVersion:B,siteId:e.siteId,branch:e.branch,since:e.since,limit:typeof e.limit==`string`?Number(e.limit):e.limit,connect:e.connect,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`webhooks forward`,`[OPERATIONS] Forward webhook events to a local URL (stripe-listen-style tunnel)`).option(`--to <url>`,`Local URL to POST events to (e.g. localhost:3000/webhook)`).option(`--site-id <id>`,`Site ID`).option(`--sign`,`HMAC-sign each forwarded request with X-Zenovay-Signature`).option(`--secret <hex>`,`HMAC secret (auto-derived from tunnel key if --sign without --secret)`).option(`--max-retries <n>`,`Per-request retry count`,{default:3}).action(async e=>{let{webhooksForwardCommand:t}=await import(`./webhooks-forward-BpVuzTpH.js`),n=await t({cliVersion:B,to:e.to,siteId:e.siteId,sign:e.sign,secret:e.secret,maxRetries:typeof e.maxRetries==`string`?Number(e.maxRetries):e.maxRetries});process.exitCode=n}),U.command(`errors`,`[BEHAVIOR] Recent JS / HTTP error snapshot`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max errors to fetch`,{default:100}).option(`--search <q>`,`Filter by class or message substring`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{errorsCommand:t}=await import(`./errors-DGmpLOKI.js`),n=await t({cliVersion:B,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,search:e.search,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),U.command(`funnel <id>`,`Funnel drop-off chart for a specific funnel`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 7d | 30d`,{default:`30d`}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{funnelCommand:n}=await import(`./funnel-e5I9PXCO.js`),r=await n({cliVersion:B,siteId:t.siteId,funnelId:e,window:t.window,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),U.command(`api-keys [action] [id]`,`[MANAGE] api-keys list | create [--name --scope] | delete <id>`).option(`--name <n>`,`Human-readable label (create)`).option(`--scope <scope>`,`read | write (create)`,{default:`read`}).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{apiKeysCommand:r}=await import(`./api-keys-Q9lP4gE8.js`),i=e??`list`;process.exitCode=await r({cliVersion:B,action:i,id:t,name:n.name,scope:n.scope===`write`?`write`:`read`,yes:n.yes,json:n.json})}),U.command(`domains [action] [arg]`,`[MANAGE] domains list | add <url> [--name] | delete <id>`).option(`--name <n>`,`Friendly project name (add; default: domain itself)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{domainsCommand:r}=await import(`./domains-Dqp3u2N1.js`),i=e??`list`;process.exitCode=await r({cliVersion:B,action:i,url:i===`add`?t:void 0,id:i===`delete`?t:void 0,name:n.name,yes:n.yes,json:n.json})}),U.command(`team [action] [arg] [arg2]`,`[MANAGE] team list | invite <email> [--role] | remove <userId> | role <userId> <admin|member> (Pro+)`).option(`--role <role>`,`admin | member (invite)`,{default:`member`}).option(`--yes`,`Skip confirmation (remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{teamCommand:i}=await import(`./team-BVzoYxOP.js`),a=e??`list`,o;a===`role`?o=n===`admin`?`admin`:`member`:a===`invite`&&(o=r.role===`admin`?`admin`:`member`),process.exitCode=await i({cliVersion:B,action:a,email:a===`invite`?t:void 0,userId:a===`remove`||a===`role`?t:void 0,role:o,yes:r.yes,json:r.json})}),U.command(`profile [action]`,`[ACCOUNT] profile show | edit [--name --notifications]`).option(`--name <n>`,`New display name (edit)`).option(`--notifications <pref>`,`email | none (edit)`).option(`--json`,``).action(async(e,t)=>{let n=e??`show`,r=t.notifications===`email`||t.notifications===`none`?t.notifications:void 0,{profileCommand:i}=await import(`./profile-CF7ChkCR.js`);process.exitCode=await i({cliVersion:B,action:n,name:t.name,notifications:r,json:t.json})}),U.command(`plans [action] [arg] [arg2]`,`[ACCOUNT] plans info | upgrade <pro|scale> | cancel --yes | payment update`).option(`--yes`,"Required for `cancel`").option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`info`,{plansCommand:a}=await import(`./plans--eG1V1XX.js`),o;if(i===`upgrade`&&t){let e=String(t).toLowerCase();(e===`pro`||e===`scale`||e===`enterprise`)&&(o=e)}let s=i===`payment`&&t===`update`||i===`payment`?`update`:void 0;process.exitCode=await a({cliVersion:B,action:i,targetPlan:o,paymentAction:s,yes:r.yes,json:r.json})}),U.command(`billing [action]`,"[ACCOUNT] Alias for `plans info`").option(`--json`,``).action(async(e,t)=>{let{plansCommand:n}=await import(`./plans--eG1V1XX.js`);process.exitCode=await n({cliVersion:B,action:`info`,json:t.json})}),U.command(`settings [action] [key] [value]`,`[ACCOUNT] settings get [key] | set <key> <value>`).option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`get`,{settingsCommand:a}=await import(`./settings-DwWt5fMc.js`);process.exitCode=await a({cliVersion:B,action:i,key:t||void 0,value:n||void 0,json:r.json})}),U.command(`integrations [action] [name]`,`[ACCOUNT] integrations list | connect <gsc|github> | disconnect <gsc|github>`).option(`--yes`,`Skip confirmation (disconnect)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=t===`gsc`||t===`github`?t:void 0,{integrationsCommand:a}=await import(`./integrations-U7bCP21o.js`);process.exitCode=await a({cliVersion:B,action:r,name:i,yes:n.yes,json:n.json})}),U.command(`goals [action] [id]`,`[ACCOUNT] goals list | create [--name --type --target] | delete <id> (Pro+)`).option(`--name <n>`,`Goal name (create)`).option(`--type <t>`,`pageview | event (create)`).option(`--target <v>`,`URL pattern or event name (create)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=n.type===`event`||n.type===`pageview`?n.type:void 0,{goalsCommand:a}=await import(`./goals-Bls3-0Od.js`);process.exitCode=await a({cliVersion:B,action:r,id:t,name:n.name,type:i,target:n.target,yes:n.yes,json:n.json})}),U.command(`notes [action] [id]`,`[ACCOUNT] notes list | create [--content --site-id] | delete <id>`).option(`--content <text>`,`Note body (create)`).option(`--site-id <id>`,`Attach to a specific site (create; defaults to current)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{notesCommand:i}=await import(`./notes-RXAEpOlc.js`);process.exitCode=await i({cliVersion:B,action:r,id:t,content:n.content,siteId:n.siteId,yes:n.yes,json:n.json})}),U.command(`agency [action] [arg] [arg2]`,`[ACCOUNT] agency clients list | clients add [--email --name] | clients remove <id> | report send <clientId> (Scale+)`).option(`--email <e>`,`Client contact email (clients add)`).option(`--name <n>`,`Client name (clients add)`).option(`--yes`,`Skip confirmation (clients remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{agencyCommand:i}=await import(`./agency-Jld-6MFj.js`),a=`clients-list`,o;e===`clients`?t===`add`?a=`clients-add`:t===`remove`?(a=`clients-remove`,o=n):a=`clients-list`:e===`report`&&t===`send`&&(a=`report-send`,o=n),process.exitCode=await i({cliVersion:B,action:a,id:o,email:r.email,name:r.name,yes:r.yes,json:r.json})}),U.command(`analytics live`,"[ANALYTICS] Alias for `live`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-bC-2juBf.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics funnels`,"[ANALYTICS] Alias for `funnels`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-e5I9PXCO.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics goals`,"[ANALYTICS] Alias for `goals list` (Pro+)").option(`--json`,``).action(async e=>{let{goalsCommand:t}=await import(`./goals-Bls3-0Od.js`);process.exitCode=await t({cliVersion:B,action:`list`,json:e.json})}),U.command(`analytics insights`,"[ANALYTICS] Alias for `insights` (Pro+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-B1j-Xb7l.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics profiles`,"[ANALYTICS] User-profiles list (NOT `profile`, which is current-user)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{visitorsCommand:t}=await import(`./visitors-DbRze8fL.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`analytics companies`,"[ANALYTICS] Alias for `companies` (Scale+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-SLdSyZlr.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,json:e.json})}),U.command(`use [site]`,`Set / show / reset your default site (used when --site-id is omitted)`).option(`--reset`,`Clear the stored default site`).option(`--show`,`Print the current default and exit`).option(`--json`,`Emit JSON`).action(async(e,t)=>{let{useCommand:n}=await import(`./use-TXJD8FsG.js`),r=await n({cliVersion:B,match:e,reset:t.reset,show:t.show,json:t.json});process.exitCode=r}),U.command(`update`,`Manually install the latest version`).option(`--check`,`Don't install — just print latest`).option(`--force-downgrade`,`Allow downgrading to an older version`).option(`--no-update-check`,`Disable auto-update for this invocation`).option(`--json`,``).action(async e=>{let{updateCommand:t}=await import(`./update-BykeQE-n.js`);await t({cliVersion:B,binaryPath:V,check:e.check,forceDowngrade:e.forceDowngrade,json:e.json})}),U.command(`usage`,`[ACCOUNT] Current month events vs plan limits + headcounts`).option(`--json`,``).action(async e=>{let{usageCommand:t}=await import(`./usage-B4m_xh1T.js`);process.exitCode=await t({cliVersion:B,json:e.json})}),U.command(`globe`,`[ANALYTICS] Live 3D globe — visitors plotted on a Braille sphere`).option(`--site-id <id>`,`Site ID`).option(`--browser`,`Open the dashboard's Mapbox globe in your browser instead of the terminal version`).option(`--json`,``).action(async e=>{let{globeCommand:t}=await import(`./globe-B9zxVE5j.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,browser:e.browser,json:e.json})}),U.command(`webhooks [action] [arg]`,`[MANAGE] webhooks list | add <url> [--events] | delete <id> | rotate <id> | test <id>`).option(`--events <list>`,`Comma-separated event types (add)`).option(`--yes`,`Skip confirmation (delete/rotate)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{webhooksCommand:i}=await import(`./webhooks-Ci5H77lC.js`);process.exitCode=await i({cliVersion:B,action:r,url:r===`add`?t:void 0,id:r===`delete`||r===`rotate`||r===`test`?t:void 0,events:n.events,yes:n.yes,json:n.json})}),U.command(`audit [action]`,`[ACCOUNT] audit list [--since --action --actor] | export [--format --out] (Pro+)`).option(`--since <window>`,`Window like 24h, 7d, 30d (list)`,{default:`7d`}).option(`--action <pattern>`,`Filter by action string (list)`).option(`--actor <userId>`,`Filter by actor user ID (list)`).option(`--format <fmt>`,`ndjson | csv | json (export)`,{default:`ndjson`}).option(`--out <file>`,`Output file path (export). Defaults to stdout`).option(`--json`,``).action(async(e,t)=>{let n=e??`list`,r=t.format===`csv`||t.format===`json`?t.format:`ndjson`,{auditCommand:i}=await import(`./audit-Cz8sSmCb.js`);process.exitCode=await i({cliVersion:B,action:n,since:t.since,filterAction:t.action,actor:t.actor,format:r,out:t.out,json:t.json})}),U.command(`share [action]`,`[ACCOUNT] share enable | disable | url — public dashboard share for the current site`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--yes`,`Skip confirmation (disable)`).option(`--json`,``).action(async(e,t)=>{let n=e??`url`,{shareCommand:r}=await import(`./share-B3DFNgTz.js`);process.exitCode=await r({cliVersion:B,action:n,siteId:t.siteId,yes:t.yes,json:t.json})}),U.command(`commands`,`Emit the machine-readable command tree (for AI agents and shell-completion regen)`).option(`--json`,``).action(async e=>{let{commandsCommand:t}=await import(`./commands-DNM6zbNf.js`);process.exitCode=await t({cliVersion:B,json:e.json})}),U.command(`teams [action] [arg]`,`[ACCOUNT] teams list | switch <name-or-id> | current | reset`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{teamsCommand:i}=await import(`./teams-DrpDNMX9.js`);process.exitCode=await i({cliVersion:B,action:r,match:r===`switch`?t:void 0,json:n.json})}),U.command(`self-test`,`[OPERATIONS] Functional smoke check across every read endpoint and your local install`).option(`--quick`,`Run a 10-test subset (faster)`).option(`--full`,`Include active security probes + CLI meta-tests (dev/CI use)`).option(`--verbose`,`Include full stdout/stderr per test`).option(`--parallel <n>`,`Concurrent subprocesses (default 4)`,{default:4}).option(`--json`,`Emit NDJSON one line per test result + final summary`).action(async e=>{let{selfTestCommand:t}=await import(`./self-test-BEGQAxd6.js`);process.exitCode=await t({cliVersion:B,full:!!e.full,quick:!!e.quick,verbose:!!e.verbose,parallel:Number(e.parallel)||4,json:!!e.json})}),U.command(`tour`,`[OPERATIONS] Interactive 8-step walkthrough of the CLI`).option(`--non-interactive`,`Print all 8 steps as a flat document (no prompts)`).action(async e=>{let{tourCommand:t}=await import(`./tour-B_va1vor.js`);process.exitCode=await t({cliVersion:B,nonInteractive:!!(e[`non-interactive`]||e.nonInteractive)})}),U.command(`alerts [action] [id]`,`[MANAGE] alerts list | create [--metric --op --threshold --window] | delete <id> (Pro+)`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--metric <name>`,`Metric to watch (visitors|pageviews|bounce_rate|errors|lcp|inp|cls|uptime|revenue)`).option(`--op <gt|lt>`,`Comparison operator`).option(`--threshold <num>`,`Numeric threshold`).option(`--window <e.g. 1h>`,`Rolling window (5m|1h|24h|7d)`).option(`--name <label>`,`Optional friendly label for the alert`).option(`--channel <chan>`,`Notification channel: in_app | email | webhook (default in_app)`).option(`--email <addr>`,`Notification email (required when --channel email)`).option(`--yes`,`Skip confirmation prompt on delete`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=new Set([`list`,`create`,`delete`]);i.has(r)||(process.stderr.write(n.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown alerts action: ${e}`,hint:`Run zenovay alerts --help`})+`
|
|
8
8
|
`:`\n✗ Unknown action: '${e}'\n Valid: list | create | delete. Run \`zenovay alerts --help\`\n`),process.exit(2));let{alertsCommand:a}=await import(`./alerts-CPFSBaVU.js`);process.exitCode=await a({cliVersion:B,action:r,siteId:n[`site-id`]??n.siteId,metric:n.metric,op:n.op,threshold:n.threshold,window:n.window,name:n.name,channel:n.channel,email:n.email,id:t,yes:!!n.yes,json:!!n.json})}),U.command(`export <type>`,`[OPERATIONS] Export data: analytics | sessions (Pro+) | heatmaps (Pro+)`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--range <range>`,`Time range: 7d | 30d | 90d`,{default:`30d`}).option(`--format <fmt>`,`Output format: csv | json`,{default:`csv`}).option(`--out <file>`,`Write to file instead of stdout`).option(`--json`,``).action(async(e,t)=>{let n=new Set([`analytics`,`sessions`,`heatmaps`]);n.has(e)||(process.stderr.write(t.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown export type: ${e}`,hint:`Valid: analytics | sessions | heatmaps`})+`
|
|
9
|
-
`:`\n✗ Unknown export type: '${e}'\n Valid: analytics | sessions | heatmaps. Run \`zenovay export --help\`\n`),process.exit(2));let r=t.format===`json`?`json`:`csv`,{exportCommand:i}=await import(`./export-
|
|
9
|
+
`:`\n✗ Unknown export type: '${e}'\n Valid: analytics | sessions | heatmaps. Run \`zenovay export --help\`\n`),process.exit(2));let r=t.format===`json`?`json`:`csv`,{exportCommand:i}=await import(`./export-BzuIMKTq.js`);process.exitCode=await i({type:e,cliVersion:B,siteId:t[`site-id`]||t.siteId,range:t.range,format:r,out:t.out,json:!!t.json})}),U.command(`visitors`,`[ANALYTICS] Live visitor table with sortable rows`).option(`--site-id <id>`,`Site ID`).option(`--min-duration <seconds>`,`Filter to sessions ≥ N seconds`,{default:0}).option(`--json`,``).action(async e=>{let{visitorsCommand:t}=await import(`./visitors-DbRze8fL.js`);process.exitCode=await t({cliVersion:B,siteId:e.siteId,minDuration:Number(e[`min-duration`]||e.minDuration)||0,json:!!e.json})}),U.command(`status`,"[OPERATIONS] Alias of `health` — self-diagnostic checks").option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-avCr8d4g.js`);process.exitCode=await t({cliVersion:B,binaryPath:V,json:!!e.json})}),U.command(`telemetry [action]`,`[OPERATIONS] Manage anonymous CLI telemetry (on / off / status)`).option(`--json`,``).action(async(e,t)=>{let{telemetryCommand:n}=await import(`./telemetry-BpoBNhpE.js`);process.exitCode=await n({cliVersion:B,action:e,json:!!t.json})}),U.parse(process.argv,{run:!1}),(async()=>{await O({binaryPath:V,currentVersion:B,argv:process.argv}),H();let e,t;try{let t=process.env.HOME??process.env.USERPROFILE??``,n=d.join(t,`.config`,`zenovay`,`config.json`),r=m(n,`utf8`);e=JSON.parse(r).apiBase}catch{}try{let e=process.env.HOME??process.env.USERPROFILE??``,n=d.join(e,`.config`,`zenovay`,`auth.json`),r=m(n,`utf8`);t=JSON.parse(r).accessToken}catch{}await s({cliVersion:B,apiBase:e,token:t}).catch(()=>void 0);let n=Date.now(),r=(()=>{let e=U.matchedCommand;return e?.name})();a(`cli.startup`,{command:r});try{let e=U.matchedCommand,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`)),i=process.argv.includes(`--help`)||process.argv.includes(`-h`);if(!e&&t.length>0&&!i&&(process.stderr.write(`Unknown command: \`${t.join(` `)}\`\nRun \`zenovay --help\` to see all commands.\n`),a(`cli.exit`,{command:r,exit_code:2,duration_ms:Date.now()-n,error_code:`unknown_command`}),await o().catch(()=>void 0),process.exit(2)),!e&&t.length===0&&!i){U.outputHelp(),a(`cli.exit`,{command:`help`,exit_code:0,duration_ms:Date.now()-n}),await o().catch(()=>void 0);return}await U.runMatchedCommand(),a(`cli.exit`,{command:r,exit_code:typeof process.exitCode==`number`?process.exitCode:0,duration_ms:Date.now()-n}),await o().catch(()=>void 0)}catch(e){let t=i(e),s=process.env.ZENOVAY_FORMAT===`json`||process.argv.includes(`--json`)||process.argv.includes(`-q`)||process.argv.includes(`--quiet`);s?process.stderr.write(JSON.stringify(t)+`
|
|
10
10
|
`):(process.stderr.write(`\n✗ ${t.message}\n`),t.hint&&process.stderr.write(` ${t.hint}\n`)),a(`command.error`,{command:r,error_code:t.code??`unknown_error`,duration_ms:Date.now()-n}),a(`cli.exit`,{command:r,exit_code:1,duration_ms:Date.now()-n}),await o().catch(()=>void 0),process.exit(1)}})();
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-nJlxAocC.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}function m(e){return e==null?`—`:e>=500?`Enterprise`:e>=50?`Growth`:`SMB`}async function h(h){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:h.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:h.siteId,headless:!!(h.json||h.csv||h.tsv||h.ndjson),cliVersion:h.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(h),S=h.window??`24h`,C=h.limit??100,w=[{key:`lastSeenAt`,label:`when`,width:6,format:e=>p(String(e))},{key:`name`,label:`company`,width:24,format:e=>String(e).slice(0,24)},{key:`employeeCount`,label:`tier`,width:11,format:e=>m(typeof e==`number`?e:null)},{key:`industry`,label:`industry`,width:18,format:e=>String(e??`—`).slice(0,18)},{key:`visitCount`,label:`visits`,width:6,align:`right`},{key:`isNew`,label:``,width:5,format:e=>e?`NEW`:``}];return l({cliVersion:h.cliVersion,title:`companies · ${y} · ${S}`,commandName:`companies`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:h.watch?3e4:0,fetcher:e=>v.getCompaniesSnapshot(y,{window:S,limit:C},e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`companies`,{siteId:y}))}}},headlessEmit:(e,t)=>{let n=h.newOnly?e.companies.filter(e=>e.isNew):e.companies;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of n)process.stdout.write(JSON.stringify(e)+`
|
|
2
2
|
`);else process.stdout.write(JSON.stringify({companies:n,total:n.length},null,2));return}process.stdout.write(r(n,[`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 f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{bold:!0},e.total),f.createElement(d,{color:`gray`},` companies in `,S)),f.createElement(d,{color:`gray`},f.createElement(d,{color:`green`},`● `,t,` new`),` · `,n,` enterprise`))}},{id:`feed`,title:`Feed`,render:e=>{let t=h.newOnly?e.companies.filter(e=>e.isNew):e.companies;return t.length===0?f.createElement(d,{color:`gray`},`— no `,h.newOnly?`new `:``,`companies in window —`):f.createElement(o,{data:t.slice(0,30),columns:w,headerStyle:`accent`})}}]})}export{h as companiesCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./formatter-DutfcQAc.js";import{toCsv as e,writeCsv as t}from"./csv-emit-
|
|
1
|
+
import"./formatter-DutfcQAc.js";import{toCsv as e,writeCsv as t}from"./csv-emit-BZVq1YR5.js";export{t as writeCsv};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-nJlxAocC.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 n({config:p,cliVersion:f.cliVersion,token:m}),g,_;try{({siteId:g,site:_}=await a(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=i(f),y=f.limit??50,b=[{key:`pushed_at`,label:`when`,width:6,format:e=>d(String(e))},{key:`branch`,label:`branch`,width:14,format:e=>String(e??`—`).slice(0,14)},{key:`commit_sha`,label:`commit`,width:9,format:e=>String(e).slice(0,8)},{key:`commit_author`,label:`author`,width:16,format:e=>String(e??`—`).slice(0,16)},{key:`commit_message`,label:`message`,width:40,format:e=>String(e??`—`).slice(0,40)},{key:`show_on_chart`,label:`chart`,width:5,format:e=>e?`●`:`○`}];return s({cliVersion:f.cliVersion,title:`deploys · ${g}`,commandName:`deploys`,ai:{api:h,siteId:g,siteLabel:_?.url?_.url.replace(/^https?:\/\//,``).replace(/\/$/,``):_?.name??g},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
2
|
`);else process.stdout.write(JSON.stringify(e,null,2));return}process.stdout.write(r(e.deploys,[`pushed_at`,`branch`,`commit_sha`,`commit_author`,`commit_message`,`repository`,`commit_url`,`show_on_chart`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>{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(o,{data:e.deploys.slice(0,30),columns:b,headerStyle:`accent`})}]})}export{f as deploysCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-C9xNYihD.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getDevices(u);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-C9xNYihD.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getDevices(u);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-BjL_a4Hk.js`);return t(e.devices,[`name`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.devices)process.stdout.write(JSON.stringify(t)+`
|
|
2
2
|
`);return 0}return r({type:`devices.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(C,{api:l,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:c}=g(),[h,S]=b(null),[C,w]=b(!0),[T,E]=b(null);if(_(e=>{if(e===`o`||e===`O`){f(d(`devices`,{siteId:t}));return}e===`q`&&(c(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getDevices(t);n||(S(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(a,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Fetching breakdown…`))));if(T)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:T}));let D=!h||h.devices.length===0&&h.browsers.length===0&&h.os.length===0;if(D)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let O=[{key:`name`,label:`name`,width:16},{key:`visitors`,label:`visitors`,align:`right`,width:8}];return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(p,{flexDirection:`row`},v.createElement(a,{title:`Devices`},h.devices.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:O,data:h.devices,zebra:!0})),v.createElement(a,{title:`Browsers`},h.browsers.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:O,data:h.browsers,zebra:!0})),v.createElement(a,{title:`OS`},h.os.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:O,data:h.os,zebra:!0}))),v.createElement(s,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{S as devicesCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{runHealthChecks as o}from"./health-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{runHealthChecks as o}from"./health-CflD_ysx.js";import{join as s}from"node:path";import{homedir as c,platform as l}from"node:os";import{stat as u}from"node:fs/promises";async function d(){let e=c(),t=l()===`darwin`,n=[{name:`Claude Code`,path:s(e,`.claude`)},{name:`Cursor`,path:t?s(e,`Library`,`Application Support`,`Cursor`):s(e,`.config`,`Cursor`)},{name:`Windsurf`,path:t?s(e,`Library`,`Application Support`,`Windsurf`):s(e,`.config`,`Windsurf`)},{name:`VS Code`,path:s(e,`.vscode`)}];return Promise.all(n.map(async e=>{try{return await u(e.path),{name:e.name,installed:!0,configPath:e.path}}catch{return{name:e.name,installed:!1}}}))}async function f(s){let c=await o({cliVersion:s.cliVersion,binaryPath:s.binaryPath}),l=await d();if(a(s))process.stdout.write(`${JSON.stringify({type:`doctor.agents`,agents:l})}\n`);else{process.stdout.write(`
|
|
2
2
|
AI Agents:
|
|
3
3
|
`);for(let e of l){let t=e.installed?`\x1B[32m✔\x1B[0m`:`\x1B[2m✗\x1B[0m`,n=e.installed&&e.configPath?` \x1b[2m${e.configPath}\x1b[0m`:``;process.stdout.write(` ${t} ${e.name}${n}\n`)}process.stdout.write(`
|
|
4
4
|
`)}let u=c.filter(e=>e.status===`fail`);if(u.length===0)return a(s)||process.stdout.write(`All checks pass — no healing needed.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useTheme as e}from"./panel-B_yDcIcn.js";import{spark as t}from"./sparkline-BZ0eMB-w.js";import{SphereGlobe as n,scatterCountryDots as r}from"./sphere-globe-CvHshl9g.js";import{Box as i,Text as a}from"ink";import o,{useMemo as s}from"react";function c(e,t){if(typeof e==`string`)return e;switch(t){case`percent`:{let t=Math.abs(e)<=1?e*100:e;return`${t.toFixed(1)}%`}case`duration`:{if(e<60)return`${Math.round(e)}s`;let t=Math.floor(e/60),n=Math.round(e%60);return`${t}m ${n.toString().padStart(2,`0`)}s`}case`currency`:{let t=e/100;return`$${t.toLocaleString(void 0,{minimumFractionDigits:0,maximumFractionDigits:2})}`}case`number`:default:return e.toLocaleString()}}const l=[`• `,`•• `,`•••`,` ••`,` •`,` `];function u(){let[e,t]=o.useState(0);return o.useEffect(()=>{let e=setInterval(()=>{t(e=>(e+1)%l.length)},180);return()=>clearInterval(e)},[]),e}function d({title:n,value:r,series:s,delta:d,format:f=`number`,loading:p=!1,emptyHint:m,width:h}){let{theme:g}=e(),_=u(),v=o.createElement(a,{color:g.typography.label.color,dimColor:g.typography.label.dim},n.toUpperCase()),y=({children:e})=>o.createElement(i,{flexDirection:`column`,width:h,marginRight:2,minHeight:3},e);if(p)return o.createElement(y,null,v,o.createElement(a,{color:g.accent},l[_]));let b=typeof r==`number`?r:Number(r),x=(r===``||r===`—`||typeof r==`number`&&!Number.isFinite(b))&&(!s||s.length===0);if(x)return o.createElement(y,null,v,o.createElement(a,{color:g.dim},m??`no data yet`));let S=c(r,f),C=typeof h==`number`?Math.max(8,h-4):16,w=s&&s.length>0?t(s,C):``,T=null;if(typeof d==`number`&&Number.isFinite(d)){let e=Math.abs(d*100);T=e<.5?o.createElement(a,{color:g.dim},` `,`→ `,e.toFixed(1),`%`):d>0?o.createElement(a,{color:g.success},` `,`↑ `,e.toFixed(1),`%`):o.createElement(a,{color:g.error},` `,`↓ `,e.toFixed(1),`%`)}return o.createElement(y,null,v,o.createElement(a,{color:g.typography.headline.color,bold:g.typography.headline.bold},S),w?o.createElement(i,{flexDirection:`row`},o.createElement(a,{color:g.accent},w),T):T?o.createElement(i,{flexDirection:`row`},T):o.createElement(i,{height:1}))}const f=(()=>{let e=process.env.LANG??``;if(e===`C`||e===`POSIX`)return!0;let t=process.env.TERM??``;return!!(/^(linux|dumb)$/.test(t)||process.env.ZENOVAY_GLOBE===`ascii`)})();function p(e){let t=new Map;for(let n of e){if(!n.country)continue;let e=n.country.toUpperCase();t.set(e,(t.get(e)??0)+1)}let n=[];for(let[e,i]of t){let t=r(e,Math.min(i,8));for(let e of t)n.push({lat:e.lat,lng:e.lng,freshness:1})}return n}function m(e,t){if(e.width!==t.width||e.height!==t.height||e.events.length!==t.events.length)return!1;let n=Math.min(e.events.length,5);for(let r=0;r<n;r++)if(e.events[r]?.country!==t.events[r]?.country)return!1;return!0}const h=({events:e,width:t,height:r})=>{let i=s(()=>p(e),[e]);return o.createElement(n,{visitors:i,width:t,height:r,rotationDeg:20,tiltDeg:20,gridlines:!0,asciiOnly:f})},g=o.memo(h,m);export{g as EmbeddedGlobe,d as MetricCard};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{spark as a}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as o}from"./resolve-site-DSJR9vuz.js";import{DataTable as s}from"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import{deepLinkFor as c,openInBrowser as l}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as u}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{spark as a}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as o}from"./resolve-site-DSJR9vuz.js";import{DataTable as s}from"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import{deepLinkFor as c,openInBrowser as l}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as u}from"./analytical-screen-nJlxAocC.js";import"./ui-DzoMR7th.js";import{Box as d,Text as f}from"ink";import p from"react";function m(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}function h(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 g(g){let _=await e(),v=await t({strict:!1}),y=new n({config:_,cliVersion:g.cliVersion,token:v}),b,x;try{({siteId:b,site:x}=await o(y,{explicit:g.siteId,headless:!!(g.json||g.csv||g.tsv||g.ndjson),cliVersion:g.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let S=i(g),C=g.window??`24h`,w=g.limit??100,T=[{key:`ts`,label:`when`,width:6,format:e=>h(String(e))},{key:`class`,label:`class`,width:18,format:e=>String(e)},{key:`message`,label:`message`,width:42,format:e=>m(String(e??``),42)},{key:`page`,label:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:8,format:e=>String(e??`—`)}];return u({cliVersion:g.cliVersion,title:`errors · ${b} · ${C}`,commandName:`errors`,ai:{api:y,siteId:b,siteLabel:x?.url?x.url.replace(/^https?:\/\//,``).replace(/\/$/,``):x?.name??b},authToken:v?.accessToken??null,refreshIntervalMs:g.watch?3e4:0,fetcher:e=>y.getErrors(b,{window:C,limit:w},e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{l(c(`errors`,{siteId:b}))}}},headlessEmit:(e,t)=>{let n=g.search?e.errors.filter(e=>e.class.toLowerCase().includes(g.search.toLowerCase())||e.message.toLowerCase().includes(g.search.toLowerCase())):e.errors;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of n)process.stdout.write(JSON.stringify(e)+`
|
|
2
2
|
`);else process.stdout.write(JSON.stringify({errors:n,total:n.length},null,2));return}process.stdout.write(r(n,[`ts`,`class`,`message`,`page`,`device`,`fingerprint`],t))},panels:[{id:`summary`,title:`Recent errors`,render:e=>{let t=g.search?e.errors.filter(e=>e.class.toLowerCase().includes(g.search.toLowerCase())||e.message.toLowerCase().includes(g.search.toLowerCase())):e.errors,n=new Map,r=Date.now(),i=60;for(let e of t){let t=new Date(e.ts).getTime(),a=Math.floor((r-t)/(60*1e3));if(a<0||a>=i)continue;let o=n.get(e.class)??Array(i).fill(0),s=i-1-a;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 p.createElement(d,{flexDirection:`column`},p.createElement(f,null,p.createElement(f,{bold:!0},t.length),p.createElement(f,{color:`gray`},` errors in `,C)),o.length===0?null:p.createElement(d,{flexDirection:`column`,marginTop:1},o.map(([e,t])=>p.createElement(f,{key:e},p.createElement(f,{color:`red`},e.padEnd(20).slice(0,20)),` `,p.createElement(f,{color:`gray`},a(t,30))))))}},{id:`table`,title:`Detail`,render:e=>{let t=g.search?e.errors.filter(e=>e.class.toLowerCase().includes(g.search.toLowerCase())||e.message.toLowerCase().includes(g.search.toLowerCase())):e.errors;return t.length===0?p.createElement(f,{color:`gray`},`— no errors `,g.search?`matching "${g.search}"`:`in window`,` —`):p.createElement(s,{data:t.slice(0,30),columns:T,headerStyle:`accent`})}}]})}export{g as errorsCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emitErrorEnvelope as n}from"./error-codes-BohPg7wr.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{requireTier as i}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{resolveSiteId as s}from"./resolve-site-DSJR9vuz.js";import{toCsv as c}from"./csv-emit-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emitErrorEnvelope as n}from"./error-codes-BohPg7wr.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{requireTier as i}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{resolveSiteId as s}from"./resolve-site-DSJR9vuz.js";import{toCsv as c}from"./csv-emit-BZVq1YR5.js";import{resolve as l}from"node:path";import{writeFile as u}from"node:fs/promises";function d(e){let t=(e??`30d`).toLowerCase();return t===`7d`||t===`30d`||t===`90d`?t:`30d`}function f(e,t){t||process.stderr.isTTY&&process.stderr.write(`${e}\n`)}async function p(c){let p=await e(),g=await t({strict:!1}),_=new r({config:p,cliVersion:c.cliVersion,token:g});if(c.type!==`analytics`&&c.type!==`sessions`&&c.type!==`heatmaps`){let e=`Unknown export type '${c.type}'. Use one of: analytics, sessions, heatmaps.`;return c.json?n(Error(e),{command:`export`,cliVersion:c.cliVersion}):(process.stderr.write(`Error: ${e}\n`),2)}let v=c.format===`json`?`json`:`csv`,y=d(c.range),b=!!c.json;if(c.type===`sessions`||c.type===`heatmaps`)try{await i(_,`pro`)}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}let x;try{({siteId:x}=await s(_,{explicit:c.siteId,headless:b,cliVersion:c.cliVersion}))}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}try{f(`→ Fetching ${c.type} ${y}...`,b);let{rows:e,columns:t}=await m(_,c.type,x,y),n=h(e,t,v),r=c.out?l(process.cwd(),c.out):null;return r?(await u(r,n,`utf8`),c.json?(a(o({rowsWritten:e.length,file:r,format:v,range:y,type:c.type},`export.completed`,{siteId:x,command:`export ${c.type}`,cliVersion:c.cliVersion})),0):(process.stdout.write(`✓ Exported ${e.length} rows to ${r}\n`),0)):(process.stdout.write(n),n.endsWith(`
|
|
2
2
|
`)||process.stdout.write(`
|
|
3
3
|
`),c.json&&a(o({rowsWritten:e.length,file:null,format:v,range:y,type:c.type},`export.completed`,{siteId:x,command:`export ${c.type}`,cliVersion:c.cliVersion})),0)}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`✗ ${e.message}\n`),1)}}async function m(e,t,n,r){if(t===`analytics`){let t=await e.getStats(n,r);if(t.daily&&t.daily.length>0){let e=t.daily.map(e=>({date:e.date,visitors:e.visitors,pageviews:e.pageviews}));return{rows:e,columns:[`date`,`visitors`,`pageviews`]}}let i=[{range:r,visitors:t.visitors,pageviews:t.pageviews,sessions:t.sessions,bounceRate:t.bounceRate,avgSessionSec:t.avgSessionSec,windowStart:t.windowStart,windowEnd:t.windowEnd}];return{rows:i,columns:[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSessionSec`,`windowStart`,`windowEnd`]}}if(t===`sessions`){let t=await e.getSessions(n),r=t.map(e=>({id:e.id,visitor:e.visitor,durationMs:e.duration,startedAt:e.startedAt,pageCount:e.pageCount,deviceType:e.deviceType??``}));return{rows:r,columns:[`id`,`visitor`,`durationMs`,`startedAt`,`pageCount`,`deviceType`]}}let i=await e.getHeatmaps(n),a=i.map(e=>({id:e.id,url:e.url,type:e.type,captureCount:e.captureCount,createdAt:e.createdAt}));return{rows:a,columns:[`id`,`url`,`type`,`captureCount`,`createdAt`]}}function h(e,t,n){if(n===`json`){let n=e.map(e=>{let n={};for(let r of t)n[String(r)]=e[r];return n});return JSON.stringify(n,null,2)+`
|
|
4
4
|
`}return c(e,t,`csv`)}export{p as exportCommand};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-nJlxAocC.js";import{Box as u,Text as d}from"ink";import f from"react";function p(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 m(m){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:m.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{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 x=i(m);if(!m.funnelId){let e=[{key:`name`,label:`name`,width:30},{key:`stepCount`,label:`steps`,width:6,align:`right`},{key:`id`,label:`id`,width:36,format:e=>String(e).slice(0,36)}];return l({cliVersion:m.cliVersion,title:`funnels · ${y}`,commandName:`funnels`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:0,fetcher:e=>v.listFunnels(y,e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`funnel`,{siteId: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
2
|
`);return}process.stdout.write(r(e.funnels,[`id`,`name`,`stepCount`],t))},panels:[{id:`funnels`,title:`Funnels`,render:t=>t.funnels.length===0?f.createElement(d,{color:`gray`},`— no funnels defined —`):f.createElement(o,{data:t.funnels,columns:e,headerStyle:`accent`})},{id:`hint`,title:`Next`,render:()=>f.createElement(d,{color:`gray`},"Run `zenovay funnel <id>` for drop-off detail.")}]})}let S=m.window??`30d`;return l({cliVersion:m.cliVersion,title:`funnel · ${m.funnelId} · ${S}`,commandName:`funnel`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:0,fetcher:e=>v.getFunnel(y,m.funnelId,S,e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`funnel`,{siteId: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
3
|
`);return}process.stdout.write(r(e.steps,[`id`,`name`,`visitors`,`conversions`],t))},panels:[{id:`overview`,title:h(`Overview`),render:e=>f.createElement(u,{flexDirection:`column`},f.createElement(d,{bold:!0},e.name),f.createElement(d,{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 f.createElement(u,{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 f.createElement(u,{key:n.id,flexDirection:`column`},a?f.createElement(d,{color:`red`},` `,`↓ drop `,o.toLocaleString(),` (`,s.toFixed(1),`%)`):null,f.createElement(d,null,f.createElement(d,{bold:!0},`${r+1}. ${n.name}`.padEnd(22).slice(0,22)),` `,f.createElement(d,{color:`magenta`},p(i,30)),` `,f.createElement(d,null,(i*100).toFixed(1).padStart(5),`% `),f.createElement(d,{color:`gray`},n.visitors.toLocaleString())))}))}}]})}function h(e){return e}export{m as funnelCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-C9xNYihD.js";import{Globe as p}from"./globe-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-C9xNYihD.js";import{Globe as p}from"./globe-DaSl9ejK.js";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";async function C(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getGeo(u);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-BjL_a4Hk.js`);return t(e.countries,[`country`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.countries)process.stdout.write(JSON.stringify(t)+`
|
|
2
2
|
`);return 0}return r({type:`geo.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(w,{api:l,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:c}=_(),[g,C]=x(null),[w,T]=x(!0),[E,D]=x(null);if(v(e=>{if(e===`o`||e===`O`){f(d(`geo`,{siteId:t}));return}e===`q`&&(c(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getGeo(t);n||(C(r),T(!1))}catch(e){n||(D(e.message),T(!1))}})(),()=>{n=!0}},[e,t]),w)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:`geo · ${n}`}),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 geo…`))));if(E)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:`geo · ${n}`}),y.createElement(u,{reason:`error`,headline:`Failed to load`,hint:E}));let O=!g||g.countries.length===0&&g.cities.length===0;if(O)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:`geo · ${n}`}),y.createElement(u,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let k=[{key:`country`,label:`country`,width:18},{key:`visitors`,label:`visitors`,align:`right`,width:8}],A=[{key:`city`,label:`city`,width:20},{key:`country`,label:`country`,width:12},{key:`visitors`,label:`visitors`,align:`right`,width:8}],j=process.stdout.columns??80;return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:`geo · ${n}`}),y.createElement(m,{flexDirection:`row`},y.createElement(a,{title:`Countries`},g.countries.length===0?y.createElement(h,{color:`gray`},`— —`):y.createElement(l,{columns:k,data:g.countries.slice(0,15),zebra:!0})),y.createElement(a,{title:`Globe`},y.createElement(p,{data:[],width:Math.max(36,j-60),height:12}))),y.createElement(a,{title:`Cities`},g.cities.length===0?y.createElement(h,{color:`gray`},`— —`):y.createElement(l,{columns:A,data:g.cities.slice(0,20),zebra:!0})),y.createElement(s,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{C as geoCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a,useTheme as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{ChatPanel as l}from"./chat-panel-C_yjPXnw.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{Bar as f}from"./bar-DWT-1xOE.js";import{SphereGlobe as p,infoFor as m,scatterCountryDots as h}from"./sphere-globe-CvHshl9g.js";import{Box as g,Text as _,render as v,useApp as y,useInput as ee}from"ink";import b,{useEffect as x,useMemo as S,useRef as te,useState as C}from"react";import w from"ink-spinner";import T from"open";async function E(e,t,n){let r=await e.getGeo(t).catch(()=>({countries:[],cities:[]})),i=(r.countries??[]).map(e=>{let t=m(e.country),r=n.get(e.country)??0;return{code:e.country,visitors:e.visitors,lat:t?.lat,lng:t?.lng,freshness:e.visitors>r?1:.4}});return{countries:i,totalVisitors:i.reduce((e,t)=>e+t.visitors,0),unknownCount:i.filter(e=>typeof e.lat!=`number`).reduce((e,t)=>e+t.visitors,0),lastFetchedAt:Date.now()}}async function D(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),l,d;try{({siteId:l,site:d}=await u(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??l;if(a.browser){let e=`https://app.zenovay.com/domains/${encodeURIComponent(l)}?tab=globe`;a.json?process.stdout.write(JSON.stringify({openedUrl:e})+`
|
|
2
|
+
`):process.stdout.write(`\n Opening Mapbox globe in your default browser:\n ${e}\n\n`);try{await T(e)}catch{}return 0}if(i(a)){let e=await E(c,l,new Map);return r({type:`globe.snapshot`,data:{countries:e.countries,total:e.totalVisitors,unknownCount:e.unknownCount}}),0}return new Promise(e=>{let{unmount:t}=v(b.createElement(j,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const O=5e3,k=60,A=1,ne=80,j=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:u}=y(),{theme:v}=o(),[D,j]=C(null),[re,M]=C(!0),[N,P]=C(null),[ie,F]=C(0),[I,L]=C(!1),[R,ae]=C(20),[oe,z]=C(1),[B,V]=C(0),H=te(new Map),[U,W]=C(!1);ee(n=>{if(!U){if(n===`/`){W(!0);return}if(n===`q`){u(),i(0);return}if(n===` `){L(e=>!e);return}if(n===`+`||n===`=`){z(e=>Math.min(1.6,e+.1));return}if(n===`-`||n===`_`){z(e=>Math.max(.7,e-.1));return}if(n===`t`){ae(e=>(e+15)%60);return}if(n===`j`){V(e=>e+1);return}if(n===`k`){V(e=>Math.max(0,e-1));return}if(n===`w`){let e=`https://app.zenovay.com/domains/${encodeURIComponent(t)}?tab=globe`;T(e).catch(()=>{});return}if(n===`o`&&D){let e=D.countries[B];e?.lng!==void 0&&(F(-e.lng),L(!0));return}n===`r`&&(async()=>{try{let n=await E(e,t,H.current);H.current=new Map(n.countries.map(e=>[e.code,e.visitors])),j(n)}catch(e){P(e.message)}})()}}),x(()=>{let n=!1,r=null,i=async()=>{try{let r=await E(e,t,H.current);if(n)return;H.current=new Map(r.countries.map(e=>[e.code,e.visitors])),j(r),M(!1)}catch(e){n||(P(e.message),M(!1))}n||(r=setTimeout(i,O))};return i(),()=>{n=!0,r&&clearTimeout(r)}},[e,t]),x(()=>{if(I)return;let e=setInterval(()=>{F(e=>(e+A)%360)},k);return()=>clearInterval(e)},[I]);let G=S(()=>{if(!D)return[];let e=[];for(let t of D.countries){if(typeof t.lat!=`number`||typeof t.lng!=`number`)continue;let n=Math.min(ne,Math.max(3,t.visitors*5));for(let r of h(t.code,n))e.push({lat:r.lat,lng:r.lng,freshness:t.freshness})}return e},[D]),K=S(()=>{if(!D)return[];let e=D.countries[Math.min(B,D.countries.length-1)];return!e||typeof e.lat!=`number`?[]:h(e.code,Math.min(80,Math.max(8,e.visitors*4)))},[D,B]),q=`globe · ${n} · live`,J=[{key:`q`,label:`quit`},{key:`j/k`,label:`select country`},{key:`o`,label:`orbit to selected`},{key:`space`,label:I?`resume`:`pause`},{key:`t`,label:`tilt ${R}°`},{key:`+/-`,label:`zoom`},{key:`w`,label:`open Mapbox view in browser`},{key:`r`,label:`refresh`},{key:`/`,label:`ask AI`}];if(U)return b.createElement(l,{cliVersion:r,api:e,dashboardContext:{commandName:`globe`,siteId:t,siteLabel:n,metricsSnapshot:D},onClose:()=>W(!1)});if(re)return b.createElement(g,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:q}),b.createElement(a,{title:`Loading`,state:`busy`},b.createElement(g,null,b.createElement(_,{color:`cyan`},b.createElement(w,{type:`dots`})),b.createElement(_,null,` Spinning up Earth…`))));if(N)return b.createElement(g,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:q}),b.createElement(d,{reason:`error`,headline:`Failed to load`,hint:N}),b.createElement(c,{items:J}));if(!D||D.countries.length===0&&D.unknownCount===0)return b.createElement(g,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:q}),b.createElement(d,{reason:`no-data`,headline:`No geolocated visitors yet`,hint:`Visit your site to populate the map.`}),b.createElement(c,{items:J}));let se=process.stdout.columns??100,Y=36,ce=Math.max(40,Math.min(90,se-Y-4)),X=Math.round(ce*oe),Z=Math.round(X*.5),Q=D.countries.slice(0,12),le=Math.max(1,...Q.map(e=>e.visitors)),ue=Math.max(1,Math.floor((Date.now()-D.lastFetchedAt)/1e3)),$=D.countries[Math.min(B,D.countries.length-1)],de=$?m($.code):null;return b.createElement(g,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:q}),$?b.createElement(g,{flexDirection:`row`,marginBottom:1},b.createElement(g,{width:2}),b.createElement(g,{borderStyle:`round`,borderColor:v.warn,paddingX:1},b.createElement(_,{color:v.warn,bold:!0},de?.name??$.code),b.createElement(_,{color:v.dim},` · `),b.createElement(_,{color:v.fg},$.visitors,` visitor`,$.visitors===1?``:`s`))):null,b.createElement(g,{flexDirection:`row`},b.createElement(g,{flexDirection:`column`,marginRight:2},b.createElement(p,{visitors:G,highlight:K,width:X,height:Z,rotationDeg:ie,tiltDeg:R}),b.createElement(g,{marginTop:1},b.createElement(_,{color:v.dim},D.totalVisitors,` visitors · `,D.countries.length,` countries`,D.unknownCount>0?` · ${D.unknownCount} unmapped`:``,` · `,I?`rotation paused`:`↻ ${A}°/${k}ms`,` · refreshed `,ue,`s ago`))),b.createElement(g,{flexDirection:`column`,width:Y},b.createElement(a,{title:`Live by country`},Q.map((e,t)=>{let n=t===Math.min(B,D.countries.length-1),r=e.freshness>.7,i=n?v.warn:r?v.success:v.fg;return b.createElement(g,{key:e.code,flexDirection:`row`},b.createElement(g,{width:2},b.createElement(_,{color:v.warn},n?`›`:` `)),b.createElement(g,{width:3},b.createElement(_,{color:i,bold:n},e.code)),b.createElement(f,{value:e.visitors,max:le,width:14,showPercent:!1}),b.createElement(g,{width:6},b.createElement(_,{color:v.muted},String(e.visitors).padStart(5))))})),D.countries.length>12?b.createElement(g,{marginTop:1},b.createElement(_,{color:v.muted},`+`,D.countries.length-12,` more (j/k to scroll)`)):null)),b.createElement(c,{items:J}))};export{D as globeCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import"./check-D9G0N7NB.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import"./formatter-DutfcQAc.js";import"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-
|
|
1
|
+
import"./config-Dn_Cl0cD.js";import"./check-D9G0N7NB.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import"./formatter-DutfcQAc.js";import"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-CflD_ysx.js";export{n as healthCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import{initCommand as e}from"./init-
|
|
1
|
+
import"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import{initCommand as e}from"./init-yaZypDtf.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import"./emit-DBYk96TD.js";import"./secrets-ApB7yh2A.js";import"./login-C9V2iVUx.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";export{e as initCommand};
|
|
@@ -67,7 +67,7 @@ export default function App({ Component, pageProps }: AppProps) {
|
|
|
67
67
|
`)+`
|
|
68
68
|
`;if(o)await _.writeFile(i,f,`utf8`);else{let e=await _.open(i,`w`,384);try{await e.writeFile(f,`utf8`)}finally{await e.close()}}return{created:!o,existing:o,addedKeys:c,skippedKeys:l}}const Ue=`https://api.zenovay.com/mcp`,We=v.object({url:v.string().url(),headers:v.record(v.string(),v.string()).optional()}),Ge=v.object({mcpServers:v.record(v.string(),We).optional()}).passthrough();function Ke(e){return e.HOME??e.USERPROFILE??y.homedir()}function qe(e){return e.APPDATA??null}function Je(e,t){let n=Ke(t),r=qe(t),i=[];return i.push({id:`cursor`,displayName:`Cursor`,configPath:g.join(n,`.cursor`,`mcp.json`)}),e===`win32`&&r&&i.push({id:`cursor`,displayName:`Cursor (AppData)`,configPath:g.join(r,`Cursor`,`User`,`globalStorage`,`cursor.mcp`,`mcp.json`)}),e===`darwin`?i.push({id:`claude-desktop`,displayName:`Claude Desktop`,configPath:g.join(n,`Library`,`Application Support`,`Claude`,`claude_desktop_config.json`)}):e===`win32`&&r?i.push({id:`claude-desktop`,displayName:`Claude Desktop`,configPath:g.join(r,`Claude`,`claude_desktop_config.json`)}):i.push({id:`claude-desktop`,displayName:`Claude Desktop`,configPath:g.join(n,`.config`,`Claude`,`claude_desktop_config.json`)}),i.push({id:`vscode`,displayName:`VS Code`,configPath:g.join(n,`.vscode`,`mcp.json`)}),i}async function Ye(e){try{return await _.access(e),!0}catch{return!1}}async function Xe(e){try{let t=await _.readFile(e,`utf8`);if(t.trim().length===0)return{};let n=JSON.parse(t),r=Ge.safeParse(n);return r.success?r.data:n&&typeof n==`object`?n:{}}catch{return{}}}function Ze(e){return{url:Ue,headers:{Authorization:`Bearer ${e}`}}}async function Y(e){let t=e.env??process.env,n=e.platform??process.platform,r=new Set(e.skip??[]),i=[],a=[],o=[],s=new Set,c=Ze(e.accessToken);for(let e of Je(n,t)){if(r.has(e.id)){a.push(e.displayName);continue}if(s.has(e.configPath))continue;s.add(e.configPath);try{let t=await Ye(e.configPath);if(!t){a.push(e.displayName);continue}let n=await Xe(e.configPath),r=`${e.configPath}.bak`;await _.copyFile(e.configPath,r);let o={...n,mcpServers:{...n.mcpServers??{},zenovay:c}};await _.mkdir(g.dirname(e.configPath),{recursive:!0}),await _.writeFile(e.configPath,JSON.stringify(o,null,2)+`
|
|
69
69
|
`,`utf8`),i.push(e.displayName)}catch(t){o.push({client:e.displayName,message:t instanceof Error?t.message:String(t)})}}return{installed:i,skipped:a,errors:o}}async function Qe(e,t,n){let r=n.timeoutMs??18e4,i=n.pollIntervalMs??2e3,a=n.now??(()=>Date.now()),o=n.sleep??(e=>new Promise(t=>setTimeout(t,e))),s=a(),c=s+r;for(n.onTick?.(0);;){let l=await n.api.getFirstEvent({siteId:e,since:t});if(l.received)return{received:!0,event:l.event};let u=a()-s;if(u>=r)return{received:!1};let d=c-a(),f=Math.min(i,Math.max(0,d));if(f<=0)return{received:!1};await o(f),n.onTick?.(a()-s)}}const $e=v.object({path:v.string().min(1)}),et=v.object({path:v.string().min(1),content:v.string(),reason:v.string().min(1)}),tt=v.object({path:v.string().min(1),patch:v.string().min(1),reason:v.string().min(1)}),nt=v.object({}),rt=v.object({question:v.string().min(1),choices:v.array(v.string()).optional()});async function it(e,t){let n=$e.safeParse(t);if(!n.success)return{ok:!1,content:null,error:`invalid_args`};try{let t=await e.safeRead(n.data.path),r=W.scrubSecrets(t);return{ok:!0,content:W.wrapForModel(n.data.path,r)}}catch(e){return{ok:!1,content:null,error:e.message}}}async function at(e,t,n){let r=et.safeParse(t);if(!r.success)return{ok:!1,content:null,error:`invalid_args`};let{path:i,content:a,reason:o}=r.data,s=``;try{s=await e.safeRead(i)}catch{s=``}let c=await n.approve({path:i,oldContent:s,newContent:a,reason:o});if(c===`n`)return{ok:!1,content:null,error:`skipped_by_user`};if(c===`e`)return{ok:!1,content:null,error:`deferred_to_user_edit`};try{let{backupPath:t}=await e.safeWrite(i,a);return{ok:!0,content:{path:i,backupPath:t}}}catch(e){return{ok:!1,content:null,error:e.message}}}async function ot(e,t,n){let r=tt.safeParse(t);if(!r.success)return{ok:!1,content:null,error:`invalid_args`};let{path:i,patch:a,reason:o}=r.data;if(/^\*\*\*\s+Begin Patch/m.test(a)||/^\*\*\*\s+Update File:/m.test(a))return{ok:!1,content:null,error:'unsupported_patch_format: This tool only accepts STANDARD unified diff with `--- a/...`, `+++ b/...`, and `@@ -N,M +N,M @@` headers. The "*** Begin Patch / *** Update File:" V4A format is NOT supported. Please call write_file with the full new file content instead.'};let s;try{s=await e.safeRead(i)}catch(e){return{ok:!1,content:null,error:e.message}}let c;try{c=M(s,a)}catch(e){return{ok:!1,content:null,error:`patch_failed: ${e.message}. Please call write_file with the full new file content instead — write_file is more reliable than patch_file for this use case.`}}return c===!1||typeof c!=`string`?{ok:!1,content:null,error:`patch_did_not_apply_cleanly. The patch context may not match the file. Please call write_file with the full new file content instead.`}:at(e,{path:i,content:c,reason:o},n)}async function st(e){try{let t=K(e),{adapter:n,ranked:r}=await G(t);return{ok:!0,content:{matched:n!==null,adapter:n?.id,displayName:n?.displayName,ranked:r.map(e=>({id:e.adapter.id,confidence:e.result.confidence,reason:e.result.reason}))}}}catch(e){return{ok:!1,content:null,error:e.message}}}async function ct(e,t){let n=rt.safeParse(t);if(!n.success)return{ok:!1,content:null,error:`invalid_args`};try{let t=await e.ask(n.data);return{ok:!0,content:{answer:t}}}catch(e){return{ok:!1,content:null,error:e.message}}}async function lt(e){let{api:t,sandbox:n,approval:r,prompter:a,handlers:o}=e,s=[...e.initialMessages],c=``,l=0;for(;l<B;){n.incrementRound(),l++;let u=await t.openAiStream(`install`,{messages:s,cwd_fingerprint:n.sessionId,diagnosis:e.diagnosis,targetTrackingCode:e.targetTrackingCode}),d=[],f=``;for await(let e of i(u))switch(e.type){case`delta`:f+=e.content,o?.onDelta?.(e.content);break;case`tool_start`:o?.onToolStart?.({id:e.id,name:e.name});break;case`tool_call`:{let t=await ut(e.name,e.arguments,{sandbox:n,cwd:n.cwd,approval:r,prompter:a});d.push({id:e.id,name:e.name,arguments:e.arguments,result:t}),o?.onToolResult?.({id:e.id,name:e.name,result:t});break}case`usage`:o?.onUsage?.(e);break;case`error`:throw o?.onError?.(e),Error(`[${e.code}] ${e.message}`);case`done`:break}if(f&&(c+=f),d.length===0){f&&s.push({role:`assistant`,content:f});break}s.push({role:`assistant`,content:f,toolCalls:d.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}))});for(let e of d)s.push({role:`tool`,toolCallId:e.id,toolName:e.name,content:JSON.stringify(e.result)})}return{finalText:c,rounds:l}}async function ut(e,t,n){try{switch(e){case`read_file`:return await it(n.sandbox,t);case`write_file`:return await at(n.sandbox,t,n.approval);case`patch_file`:return await ot(n.sandbox,t,n.approval);case`detect_framework`:return await st(n.cwd);case`ask_user`:return await ct(n.prompter,t);default:return{ok:!1,content:null,error:`unknown_tool:${e}`}}}catch(e){return{ok:!1,content:null,error:`tool_threw: ${e.message}`}}}const dt=e=>`<script defer\n data-id="${e}"\n data-allow-localhost="true"\n src="https://api.zenovay.com/z.js">\n</script>`;async function ft(e){let t={installed:[],skipped:[],errors:[]},n=await A([`**/*.html`,`!node_modules/**`,`!.git/**`,`!dist/**`,`!.next/**`,`!.nuxt/**`,`!build/**`,`!.output/**`],{cwd:e.cwd,gitignore:!0,absolute:!1});if(n.length===0)return t;let r=dt(e.trackingCode),i=RegExp(`data-id\\s*=\\s*["']${pt(e.trackingCode)}["']`);for(let a of n){let n=g.join(e.cwd,a),o;try{o=await _.readFile(n,`utf8`)}catch(e){t.errors.push({file:a,error:e.message});continue}if(H.test(o)&&i.test(o)){t.skipped.push({file:a,reason:`already installed with correct tracking code`});continue}let s;if(H.test(o))s=o.replace(/(<script[^>]*src\s*=\s*["']https:\/\/(?:api|cdn)\.zenovay\.com\/[^"']+["'][^>]*>)/i,t=>t.replace(/data-id\s*=\s*["']ZV_\w+["']/i,`data-id="${e.trackingCode}"`)),s===o&&(s=o.replace(/<script(\s)/i,`<script$1data-id="${e.trackingCode}"$1`));else if(e.updateOnly){t.skipped.push({file:a,reason:`updateOnly=true and no Zenovay tag present`});continue}else if(/<\/head>/i.test(o)){if(s=o.replace(/(\n[\t ]*)?<\/head>/i,(e,t)=>{let n=t??`
|
|
70
|
-
`,i=r.replace(/\n/g,`${n}`);return`${n}${i}${n}</head>`}),s===o){t.skipped.push({file:a,reason:`</head> regex did not match unexpectedly`});continue}}else{t.skipped.push({file:a,reason:`no <head>...</head> in file (fragment or non-page)`});continue}let c=null;for(let{name:e,re:t}of U)if(t.test(o)&&!t.test(s)){c=e;break}if(c){t.errors.push({file:a,error:`would remove ${c} tracker — refusing to write`});continue}try{await _.writeFile(n,s,`utf8`),t.installed.push(a)}catch(e){t.errors.push({file:a,error:e.message})}}return t}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function mt(){let e=[12,15,18,22,28,35,41,50,58,64,72,78],t=h(e,24);return[` ↑`,` ${t}`,` └────────────────────────`,` May Jun Jul Aug Sep`]}function ht(){return[` Landing page ████████████████████ 100%`,` ↓ -28%`,` Pricing ██████████████░░░░░░ 72%`,` ↓ -50%`,` Checkout ███████░░░░░░░░░░░░░ 36%`,` ↓ -64%`,` Purchased ███░░░░░░░░░░░░░░░░░ 13%`]}function gt(){return[` ▇▇▇▇▇▇▇▇▇▎ 89 Sarah K. /pricing 🇺🇸`,` ▇▇▇▇▇▇░░░░ 61 anon /docs 🇩🇪`,` ▇▇▇░░░░░░░ 34 anon /changelog 🇯🇵`]}function _t(){return[` LCP ● 2.1s good ████████████░░░░░░`,` INP ● 89ms good ██████████████████`,` CLS ⚠ 0.14 needs ████████████░░░░░░`,` TTFB ● 380ms good ███████████████░░░`]}const X=[{title:`Welcome`,body:[`The wizard is an agent — it handles the entire`,`Zenovay setup process on your behalf.`,``,`Reading your project, deciding where the tracker`,`belongs, and writing the snippet for you.`]},{title:`Events`,body:[`Events are the foundation of Zenovay analytics.`,``,`Every pageview, click, and custom action is an`,`event. Group them into Goals to track conversions.`]},{title:`Trends`,body:[`Use trends to measure growth.`,``,`See how visitors, signups, and revenue have`,`changed over the last week, month, or quarter.`],visual:mt},{title:`Funnels`,body:[`Funnels reveal where users drop off.`,``,`Define the steps you care about — landing,`,`pricing, checkout, purchase — and Zenovay shows`,`the per-step conversion rate.`],visual:ht},{title:`Live visitors`,body:[`Watch every visitor in real time, ranked by an`,`AI score that highlights high-intent traffic.`,``,"Use `zenovay visitors --live` after install."],visual:gt},{title:`Core Web Vitals`,body:[`LCP, INP, CLS — Google's page-experience metrics,`,`collected automatically once the tracker is in.`,``,"Use `zenovay vitals` to see them per page + device."],visual:_t},{title:`MCP integration`,body:[`Your CLI session can install Zenovay's MCP server`,`into Cursor / Claude Desktop / VS Code.`,``,`Then ask your AI: "what were my top pages today?"`,`and it queries Zenovay directly.`]},{title:`AI insights`,body:[`Zenovay watches your data and surfaces anomalies`,`automatically — traffic spikes, error bursts,`,`revenue drops — without you needing to ask.`,``,"Run `zenovay ai` after install to chat with them."]},{title:`Privacy-first`,body:[`No cookies required. No third-party trackers.`,`Cookieless mode is one toggle in your dashboard.`,``,`GDPR, CCPA, and PECR-compliant out of the box.`]}],vt=8e3,yt=({width:e,height:t})=>{let[n,r]=k(0);D(()=>{let e=setInterval(()=>{r(e=>(e+1)%X.length)},vt);return()=>clearInterval(e)},[]);let i=X[n],a=i.visual?i.visual():[],o=X.map((e,t)=>t===n?`●`:`·`).join(` `);return E.createElement(S,{flexDirection:`column`,width:e,height:t,paddingX:2,paddingY:1},E.createElement(S,{marginBottom:1},E.createElement(C,{color:`magentaBright`,bold:!0},`Learn`)),E.createElement(S,{marginBottom:1},E.createElement(C,{bold:!0,color:`white`},i.title)),i.body.map((e,t)=>E.createElement(C,{key:t,color:`gray`},e||` `)),a.length>0&&E.createElement(S,{flexDirection:`column`,marginTop:1},a.map((e,t)=>E.createElement(C,{key:t,color:`cyan`},e))),E.createElement(S,{flexGrow:1}),E.createElement(S,{marginTop:1},E.createElement(C,{color:`gray`,dimColor:!0},o,` · `,n+1,` / `,X.length)))},bt={pending:`·`,active:`⠋`,done:`✓`,error:`✗`},xt={pending:`gray`,active:`magenta`,done:`green`,error:`red`},St=({tasks:e,width:t,height:n,liveLine:r})=>{let i=e.filter(e=>e.status===`done`).length;return E.createElement(S,{flexDirection:`column`,width:t,height:n,paddingX:2,paddingY:1},E.createElement(S,{marginBottom:1},E.createElement(C,{color:`magentaBright`,bold:!0},`Tasks`)),e.map(e=>E.createElement(S,{key:e.id,flexDirection:`column`},E.createElement(S,null,e.status===`active`?E.createElement(C,{color:`magenta`},E.createElement(j,{type:`dots`})):E.createElement(C,{color:xt[e.status]},bt[e.status]),E.createElement(C,null,` `),E.createElement(C,{color:e.status===`pending`?`gray`:`white`},e.label)),e.detail&&E.createElement(S,{paddingLeft:2},E.createElement(C,{color:`gray`,dimColor:!0},e.detail)))),E.createElement(S,{flexGrow:1}),r&&E.createElement(S,{marginTop:1},E.createElement(C,{color:`cyan`},`◆ `),E.createElement(C,{color:`white`},r)),E.createElement(S,{marginTop:1},E.createElement(C,{color:`gray`,dimColor:!0},i,` / `,e.length)))};async function Ct(e){if(o(e))return wt(e);let t=`quit`,n=null,r=await new Promise(r=>{let{unmount:i,waitUntilExit:a}=w(E.createElement(Tt,{opts:e,onExit:(e,a,o)=>{t=a??`quit`,n=o??null,i(),r(e)}}));a().catch(()=>r(1))});if(r!==0||t===`quit`||!n)return r;let i=n.id;if(t===`watch`){let{watchCommand:t}=await import(`./watch-DtaGj9rw.js`);return t({cliVersion:e.cliVersion,siteId:i})}if(t===`events`){let{eventsTailCommand:t}=await import(`./events-tail-pDYhVzFg.js`);return t({cliVersion:e.cliVersion,siteId:i})}return 0}async function wt(t){let i=await import(`./telemetry-BHyqKLqh.js`).catch(()=>null);i?.emit(`install.start`,{properties:{mode:`headless`}});try{let o=await e(),s=await q(t.cwd);if(!s)return a({type:`error`,code:`no_framework`,message:`Could not detect framework (headless mode has no picker).`}),i?.emit(`install.error`,{error_code:`no_framework`,properties:{mode:`headless`}}),2;a({type:`framework.detected`,framework:s.id,confidence:1}),i?.emit(`install.framework_detected`,{properties:{framework:s.id}});let c=await r({strict:!1});if(!c&&!process.env.ZENOVAY_API_TOKEN)return a({type:`error`,code:`not_logged_in`,message:"Run `zenovay login` first (or set ZENOVAY_API_TOKEN)."}),2;let l=new n({config:o,cliVersion:t.cliVersion,token:c}),u=await l.getSites(),d=t.siteId?u.find(e=>e.id===t.siteId):u[0];if(!d&&t.siteId)return a({type:`error`,code:`site_not_found`,message:`Site ${t.siteId} not found.`}),2;if(!d)return a({type:`error`,code:`no_site`,message:`No sites exist; create one at app.zenovay.com or re-run interactively.`}),2;a({type:`info`,message:`Using site ${d.id} (${d.name}) trackingCode=${d.trackingCode??d.id}`});let f=await J(t.cwd,{[s.envVarName]:d.trackingCode??d.id});return a({type:`info`,message:`env vars added: ${f.addedKeys.join(`,`)}`}),a({type:`done`,command:`init`,exitCode:0}),i?.emit(`install.success`,{properties:{framework:s.id,mode:`headless`,env_keys_added:f.addedKeys.length}}),0}catch(e){return a({type:`error`,code:`init_failed`,message:e.message}),i?.emit(`install.error`,{error_code:`init_failed`,properties:{mode:`headless`,error:(e.message??`unknown`).slice(0,128)}}),1}}const Tt=({opts:t,onExit:i})=>{let{exit:a}=ee(),[o,s]=k(`intro`),[d,f]=k(null),[p,h]=k([]),[g,_]=k(null),[v,y]=k(null),[b,x]=k(null),[w,T]=k([]),[A,M]=k(void 0),[N,P]=k(null),[F,te]=k(0),I=O(!1);return D(()=>(process.stdout.isTTY&&process.stdout.write(`\x1B[?1049h\x1B[H`),()=>{process.stdout.isTTY&&process.stdout.write(`\x1B[?1049l`)}),[]),D(()=>{I.current||(I.current=!0,(async()=>{try{s(`detecting`);let i=await q(t.cwd);if(!i){x(`Could not detect your framework. Supported: Next.js, Nuxt, SvelteKit, Astro, Remix, plain HTML.`),s(`error`);return}f(i);let a=await r({strict:!1});!process.env.ZENOVAY_API_TOKEN&&!a&&(s(`login`),await c({cliVersion:t.cliVersion})),s(`loading-sites`);let o=await e(),l=await r({strict:!1}),u=new n({config:o,cliVersion:t.cliVersion,token:l}),d=await u.getSites(),p=await zt(t.cwd),m=Bt(d,p);if(h(d),_(p),d.length===0){s(`create-site`);return}if(t.siteId){let e=d.find(e=>e.id===t.siteId);if(!e){x(`Site ${t.siteId} not found in your account.`),s(`error`);return}y(e),Z(e,i,t,{setPhase:s,setErrorMsg:x,setTasks:T,setLiveLine:M,setSandboxStats:P});return}if(t.yes&&m){y(m),Z(m,i,t,{setPhase:s,setErrorMsg:x,setTasks:T,setLiveLine:M,setSandboxStats:P});return}s(`site-picker`)}catch(e){x(e.message),s(`error`)}})())},[]),D(()=>{o===`error`&&setTimeout(()=>{a(),i(1)},8e3)},[o]),E.createElement(S,{flexDirection:`column`},E.createElement(u,{version:t.cliVersion,subtitle:`AI install wizard`}),o===`intro`&&E.createElement(Et,null),o===`detecting`&&E.createElement(l,{title:`Scanning`,state:`busy`},E.createElement(S,null,E.createElement(C,{color:`magenta`},E.createElement(j,{type:`dots`})),E.createElement(C,null,` Detecting framework…`))),o===`login`&&E.createElement(l,{title:`Authenticating`,state:`busy`},E.createElement(C,null,`Opening browser for login… (paste ZENOVAY_API_TOKEN env var to skip)`)),o===`loading-sites`&&E.createElement(l,{title:`Loading your sites`,state:`busy`},E.createElement(S,null,E.createElement(C,{color:`magenta`},E.createElement(j,{type:`dots`})),E.createElement(C,null,` Fetching your Zenovay sites…`))),o===`site-picker`&&d&&E.createElement(Ot,{sites:p,preselectHint:g,onPick:e=>{if(e===`create-new`){s(`create-site`);return}y(e),Z(e,d,t,{setPhase:s,setErrorMsg:x,setTasks:T,setLiveLine:M,setSandboxStats:P})}}),o===`create-site`&&E.createElement(l,{title:`Create a new site`,state:`warn`},E.createElement(C,{color:`yellow`},"No site picked (or none exist yet). Visit https://app.zenovay.com/websites to create one, then re-run `zenovay init`."),E.createElement(C,{color:`gray`},`(Inline site creation from the CLI is scheduled for V1.1 — it requires a plan-limit check.)`)),o===`agent`&&d&&v&&E.createElement(Dt,{adapter:d,site:v,tasks:w,liveLine:A}),o===`install-complete`&&d&&v&&E.createElement(jt,{adapter:d,site:v,stats:N,onCommit:()=>s(`commit-prompt`),onSkipCommit:()=>s(`deploy-prompt`)}),o===`commit-prompt`&&v&&E.createElement(Mt,{cwd:t.cwd,onDone:e=>{e.committed&&M(`Pushed ${e.shortSha} to ${e.branch}`),s(`deploy-prompt`)},onError:e=>{x(e),s(`error`)}}),o===`deploy-prompt`&&v&&E.createElement(Nt,{site:v,onDeployed:()=>s(`visit-prompt`),onSkip:()=>s(`verify`)}),o===`visit-prompt`&&v&&E.createElement(Pt,{site:v,onContinue:()=>s(`verify`)}),o===`verify`&&v&&E.createElement(It,{site:v,elapsed:F,onTick:e=>te(e),onArrived:()=>s(`success`),onTimeout:()=>s(`success`)}),o===`success`&&d&&v&&E.createElement(At,{adapter:d,site:v,stats:N,onPick:e=>{a(),i(0,e,v)}}),o===`error`&&E.createElement(l,{title:`Install failed`,state:`err`},E.createElement(C,{color:`red`},b??`Unknown error`)),E.createElement(m,{items:[{key:`q`,label:`quit`},{key:`ctrl-c`,label:`abort`}]}))};async function Z(i,a,o,s){try{s.setPhase(`agent`);let c=await e(),l=await r({strict:!1}),u=new n({config:c,cliVersion:o.cliVersion,token:l}),d=new W({cwd:o.cwd}),f=i.trackingCode??i.id;await t({defaultSiteId:i.id,defaultSiteName:i.name}).catch(()=>void 0);let p=await re(o.cwd,f);if(p.recommendation===`no-op`){s.setTasks(e=>e.map(e=>e.id===`detect`||e.id===`read`||e.id===`write`?{...e,status:`done`,detail:`already installed correctly`}:e)),s.setLiveLine(p.summary),s.setSandboxStats?.({reads:0,writes:0,rounds:0}),!o.skipMcp&&l&&await Y({accessToken:l.accessToken}).catch(()=>void 0),s.setPhase(`install-complete`);return}p.competitors.length>0&&s.setLiveLine(`Detected ${p.competitors.map(e=>e.name).join(`, `)} — will install Zenovay alongside (won't touch their tags).`);let m=a.id===`plain-html`&&(p.recommendation===`fresh-install`||p.recommendation===`fresh-install-alongside-competitor`||p.recommendation===`update-tracking-code`);if(m){s.setTasks(e=>e.map(e=>e.id===`detect`?{...e,status:`done`,detail:`Plain HTML`}:e)),s.setLiveLine(`Plain HTML — using fast install path (no AI needed)…`);let e=await ft({cwd:o.cwd,trackingCode:f,updateOnly:p.recommendation===`update-tracking-code`});if(e.installed.length===0&&e.errors.length===0)throw Error(`No HTML files were modified. Either no .html files contain a <head>...</head> block, or every file already has the correct tracker.`);if(e.installed.length===0&&e.errors.length>0)throw Error(`Programmatic install failed for all ${e.errors.length} file(s). First error: ${e.errors[0].file}: ${e.errors[0].error}`);s.setTasks(t=>t.map(t=>t.id===`read`||t.id===`write`?{...t,status:`done`,detail:`${e.installed.length} file(s)`}:t)),s.setLiveLine(`Tracker added to ${e.installed.length} file(s). Skipped ${e.skipped.length}, errored ${e.errors.length}.`);let t=await J(o.cwd,{[a.envVarName]:f});if(s.setTasks(e=>e.map(e=>e.id===`env`?{...e,status:`done`,detail:`${t.addedKeys.length} key(s) added`}:e)),!o.skipMcp&&l){let e=await Y({accessToken:l.accessToken}).catch(()=>null);s.setTasks(t=>t.map(t=>t.id===`mcp`?{...t,status:`done`,detail:e&&e.installed.length>0?e.installed.join(`, `):`none detected`}:t))}else s.setTasks(e=>e.map(e=>e.id===`mcp`?{...e,status:`done`,detail:`skipped`}:e));s.setLiveLine(void 0),s.setSandboxStats?.({reads:e.installed.length,writes:e.installed.length,rounds:0}),s.setPhase(`install-complete`);return}let h=a.buildSnippets({trackingCode:f,siteId:i.id}),g=`Install Zenovay tracking into this ${a.displayName} project.\nSite: ${i.name} (trackingCode: ${f}).\n1. Call detect_framework to confirm the framework.\n2. Read the entry file(s) for this framework:\n`+a.files.map(e=>` - ${e.path}`).join(`
|
|
70
|
+
`,i=r.replace(/\n/g,`${n}`);return`${n}${i}${n}</head>`}),s===o){t.skipped.push({file:a,reason:`</head> regex did not match unexpectedly`});continue}}else{t.skipped.push({file:a,reason:`no <head>...</head> in file (fragment or non-page)`});continue}let c=null;for(let{name:e,re:t}of U)if(t.test(o)&&!t.test(s)){c=e;break}if(c){t.errors.push({file:a,error:`would remove ${c} tracker — refusing to write`});continue}try{await _.writeFile(n,s,`utf8`),t.installed.push(a)}catch(e){t.errors.push({file:a,error:e.message})}}return t}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function mt(){let e=[12,15,18,22,28,35,41,50,58,64,72,78],t=h(e,24);return[` ↑`,` ${t}`,` └────────────────────────`,` May Jun Jul Aug Sep`]}function ht(){return[` Landing page ████████████████████ 100%`,` ↓ -28%`,` Pricing ██████████████░░░░░░ 72%`,` ↓ -50%`,` Checkout ███████░░░░░░░░░░░░░ 36%`,` ↓ -64%`,` Purchased ███░░░░░░░░░░░░░░░░░ 13%`]}function gt(){return[` ▇▇▇▇▇▇▇▇▇▎ 89 Sarah K. /pricing 🇺🇸`,` ▇▇▇▇▇▇░░░░ 61 anon /docs 🇩🇪`,` ▇▇▇░░░░░░░ 34 anon /changelog 🇯🇵`]}function _t(){return[` LCP ● 2.1s good ████████████░░░░░░`,` INP ● 89ms good ██████████████████`,` CLS ⚠ 0.14 needs ████████████░░░░░░`,` TTFB ● 380ms good ███████████████░░░`]}const X=[{title:`Welcome`,body:[`The wizard is an agent — it handles the entire`,`Zenovay setup process on your behalf.`,``,`Reading your project, deciding where the tracker`,`belongs, and writing the snippet for you.`]},{title:`Events`,body:[`Events are the foundation of Zenovay analytics.`,``,`Every pageview, click, and custom action is an`,`event. Group them into Goals to track conversions.`]},{title:`Trends`,body:[`Use trends to measure growth.`,``,`See how visitors, signups, and revenue have`,`changed over the last week, month, or quarter.`],visual:mt},{title:`Funnels`,body:[`Funnels reveal where users drop off.`,``,`Define the steps you care about — landing,`,`pricing, checkout, purchase — and Zenovay shows`,`the per-step conversion rate.`],visual:ht},{title:`Live visitors`,body:[`Watch every visitor in real time, ranked by an`,`AI score that highlights high-intent traffic.`,``,"Use `zenovay visitors --live` after install."],visual:gt},{title:`Core Web Vitals`,body:[`LCP, INP, CLS — Google's page-experience metrics,`,`collected automatically once the tracker is in.`,``,"Use `zenovay vitals` to see them per page + device."],visual:_t},{title:`MCP integration`,body:[`Your CLI session can install Zenovay's MCP server`,`into Cursor / Claude Desktop / VS Code.`,``,`Then ask your AI: "what were my top pages today?"`,`and it queries Zenovay directly.`]},{title:`AI insights`,body:[`Zenovay watches your data and surfaces anomalies`,`automatically — traffic spikes, error bursts,`,`revenue drops — without you needing to ask.`,``,"Run `zenovay ai` after install to chat with them."]},{title:`Privacy-first`,body:[`No cookies required. No third-party trackers.`,`Cookieless mode is one toggle in your dashboard.`,``,`GDPR, CCPA, and PECR-compliant out of the box.`]}],vt=8e3,yt=({width:e,height:t})=>{let[n,r]=k(0);D(()=>{let e=setInterval(()=>{r(e=>(e+1)%X.length)},vt);return()=>clearInterval(e)},[]);let i=X[n],a=i.visual?i.visual():[],o=X.map((e,t)=>t===n?`●`:`·`).join(` `);return E.createElement(S,{flexDirection:`column`,width:e,height:t,paddingX:2,paddingY:1},E.createElement(S,{marginBottom:1},E.createElement(C,{color:`magentaBright`,bold:!0},`Learn`)),E.createElement(S,{marginBottom:1},E.createElement(C,{bold:!0,color:`white`},i.title)),i.body.map((e,t)=>E.createElement(C,{key:t,color:`gray`},e||` `)),a.length>0&&E.createElement(S,{flexDirection:`column`,marginTop:1},a.map((e,t)=>E.createElement(C,{key:t,color:`cyan`},e))),E.createElement(S,{flexGrow:1}),E.createElement(S,{marginTop:1},E.createElement(C,{color:`gray`,dimColor:!0},o,` · `,n+1,` / `,X.length)))},bt={pending:`·`,active:`⠋`,done:`✓`,error:`✗`},xt={pending:`gray`,active:`magenta`,done:`green`,error:`red`},St=({tasks:e,width:t,height:n,liveLine:r})=>{let i=e.filter(e=>e.status===`done`).length;return E.createElement(S,{flexDirection:`column`,width:t,height:n,paddingX:2,paddingY:1},E.createElement(S,{marginBottom:1},E.createElement(C,{color:`magentaBright`,bold:!0},`Tasks`)),e.map(e=>E.createElement(S,{key:e.id,flexDirection:`column`},E.createElement(S,null,e.status===`active`?E.createElement(C,{color:`magenta`},E.createElement(j,{type:`dots`})):E.createElement(C,{color:xt[e.status]},bt[e.status]),E.createElement(C,null,` `),E.createElement(C,{color:e.status===`pending`?`gray`:`white`},e.label)),e.detail&&E.createElement(S,{paddingLeft:2},E.createElement(C,{color:`gray`,dimColor:!0},e.detail)))),E.createElement(S,{flexGrow:1}),r&&E.createElement(S,{marginTop:1},E.createElement(C,{color:`cyan`},`◆ `),E.createElement(C,{color:`white`},r)),E.createElement(S,{marginTop:1},E.createElement(C,{color:`gray`,dimColor:!0},i,` / `,e.length)))};async function Ct(e){if(o(e))return wt(e);let t=`quit`,n=null,r=await new Promise(r=>{let{unmount:i,waitUntilExit:a}=w(E.createElement(Tt,{opts:e,onExit:(e,a,o)=>{t=a??`quit`,n=o??null,i(),r(e)}}));a().catch(()=>r(1))});if(r!==0||t===`quit`||!n)return r;let i=n.id;if(t===`watch`){let{watchCommand:t}=await import(`./watch-CFDlcLl_.js`);return t({cliVersion:e.cliVersion,siteId:i})}if(t===`events`){let{eventsTailCommand:t}=await import(`./events-tail-DrAY7_Zr.js`);return t({cliVersion:e.cliVersion,siteId:i})}return 0}async function wt(t){let i=await import(`./telemetry-BHyqKLqh.js`).catch(()=>null);i?.emit(`install.start`,{properties:{mode:`headless`}});try{let o=await e(),s=await q(t.cwd);if(!s)return a({type:`error`,code:`no_framework`,message:`Could not detect framework (headless mode has no picker).`}),i?.emit(`install.error`,{error_code:`no_framework`,properties:{mode:`headless`}}),2;a({type:`framework.detected`,framework:s.id,confidence:1}),i?.emit(`install.framework_detected`,{properties:{framework:s.id}});let c=await r({strict:!1});if(!c&&!process.env.ZENOVAY_API_TOKEN)return a({type:`error`,code:`not_logged_in`,message:"Run `zenovay login` first (or set ZENOVAY_API_TOKEN)."}),2;let l=new n({config:o,cliVersion:t.cliVersion,token:c}),u=await l.getSites(),d=t.siteId?u.find(e=>e.id===t.siteId):u[0];if(!d&&t.siteId)return a({type:`error`,code:`site_not_found`,message:`Site ${t.siteId} not found.`}),2;if(!d)return a({type:`error`,code:`no_site`,message:`No sites exist; create one at app.zenovay.com or re-run interactively.`}),2;a({type:`info`,message:`Using site ${d.id} (${d.name}) trackingCode=${d.trackingCode??d.id}`});let f=await J(t.cwd,{[s.envVarName]:d.trackingCode??d.id});return a({type:`info`,message:`env vars added: ${f.addedKeys.join(`,`)}`}),a({type:`done`,command:`init`,exitCode:0}),i?.emit(`install.success`,{properties:{framework:s.id,mode:`headless`,env_keys_added:f.addedKeys.length}}),0}catch(e){return a({type:`error`,code:`init_failed`,message:e.message}),i?.emit(`install.error`,{error_code:`init_failed`,properties:{mode:`headless`,error:(e.message??`unknown`).slice(0,128)}}),1}}const Tt=({opts:t,onExit:i})=>{let{exit:a}=ee(),[o,s]=k(`intro`),[d,f]=k(null),[p,h]=k([]),[g,_]=k(null),[v,y]=k(null),[b,x]=k(null),[w,T]=k([]),[A,M]=k(void 0),[N,P]=k(null),[F,te]=k(0),I=O(!1);return D(()=>(process.stdout.isTTY&&process.stdout.write(`\x1B[?1049h\x1B[H`),()=>{process.stdout.isTTY&&process.stdout.write(`\x1B[?1049l`)}),[]),D(()=>{I.current||(I.current=!0,(async()=>{try{s(`detecting`);let i=await q(t.cwd);if(!i){x(`Could not detect your framework. Supported: Next.js, Nuxt, SvelteKit, Astro, Remix, plain HTML.`),s(`error`);return}f(i);let a=await r({strict:!1});!process.env.ZENOVAY_API_TOKEN&&!a&&(s(`login`),await c({cliVersion:t.cliVersion})),s(`loading-sites`);let o=await e(),l=await r({strict:!1}),u=new n({config:o,cliVersion:t.cliVersion,token:l}),d=await u.getSites(),p=await zt(t.cwd),m=Bt(d,p);if(h(d),_(p),d.length===0){s(`create-site`);return}if(t.siteId){let e=d.find(e=>e.id===t.siteId);if(!e){x(`Site ${t.siteId} not found in your account.`),s(`error`);return}y(e),Z(e,i,t,{setPhase:s,setErrorMsg:x,setTasks:T,setLiveLine:M,setSandboxStats:P});return}if(t.yes&&m){y(m),Z(m,i,t,{setPhase:s,setErrorMsg:x,setTasks:T,setLiveLine:M,setSandboxStats:P});return}s(`site-picker`)}catch(e){x(e.message),s(`error`)}})())},[]),D(()=>{o===`error`&&setTimeout(()=>{a(),i(1)},8e3)},[o]),E.createElement(S,{flexDirection:`column`},E.createElement(u,{version:t.cliVersion,subtitle:`AI install wizard`}),o===`intro`&&E.createElement(Et,null),o===`detecting`&&E.createElement(l,{title:`Scanning`,state:`busy`},E.createElement(S,null,E.createElement(C,{color:`magenta`},E.createElement(j,{type:`dots`})),E.createElement(C,null,` Detecting framework…`))),o===`login`&&E.createElement(l,{title:`Authenticating`,state:`busy`},E.createElement(C,null,`Opening browser for login… (paste ZENOVAY_API_TOKEN env var to skip)`)),o===`loading-sites`&&E.createElement(l,{title:`Loading your sites`,state:`busy`},E.createElement(S,null,E.createElement(C,{color:`magenta`},E.createElement(j,{type:`dots`})),E.createElement(C,null,` Fetching your Zenovay sites…`))),o===`site-picker`&&d&&E.createElement(Ot,{sites:p,preselectHint:g,onPick:e=>{if(e===`create-new`){s(`create-site`);return}y(e),Z(e,d,t,{setPhase:s,setErrorMsg:x,setTasks:T,setLiveLine:M,setSandboxStats:P})}}),o===`create-site`&&E.createElement(l,{title:`Create a new site`,state:`warn`},E.createElement(C,{color:`yellow`},"No site picked (or none exist yet). Visit https://app.zenovay.com/websites to create one, then re-run `zenovay init`."),E.createElement(C,{color:`gray`},`(Inline site creation from the CLI is scheduled for V1.1 — it requires a plan-limit check.)`)),o===`agent`&&d&&v&&E.createElement(Dt,{adapter:d,site:v,tasks:w,liveLine:A}),o===`install-complete`&&d&&v&&E.createElement(jt,{adapter:d,site:v,stats:N,onCommit:()=>s(`commit-prompt`),onSkipCommit:()=>s(`deploy-prompt`)}),o===`commit-prompt`&&v&&E.createElement(Mt,{cwd:t.cwd,onDone:e=>{e.committed&&M(`Pushed ${e.shortSha} to ${e.branch}`),s(`deploy-prompt`)},onError:e=>{x(e),s(`error`)}}),o===`deploy-prompt`&&v&&E.createElement(Nt,{site:v,onDeployed:()=>s(`visit-prompt`),onSkip:()=>s(`verify`)}),o===`visit-prompt`&&v&&E.createElement(Pt,{site:v,onContinue:()=>s(`verify`)}),o===`verify`&&v&&E.createElement(It,{site:v,elapsed:F,onTick:e=>te(e),onArrived:()=>s(`success`),onTimeout:()=>s(`success`)}),o===`success`&&d&&v&&E.createElement(At,{adapter:d,site:v,stats:N,onPick:e=>{a(),i(0,e,v)}}),o===`error`&&E.createElement(l,{title:`Install failed`,state:`err`},E.createElement(C,{color:`red`},b??`Unknown error`)),E.createElement(m,{items:[{key:`q`,label:`quit`},{key:`ctrl-c`,label:`abort`}]}))};async function Z(i,a,o,s){try{s.setPhase(`agent`);let c=await e(),l=await r({strict:!1}),u=new n({config:c,cliVersion:o.cliVersion,token:l}),d=new W({cwd:o.cwd}),f=i.trackingCode??i.id;await t({defaultSiteId:i.id,defaultSiteName:i.name}).catch(()=>void 0);let p=await re(o.cwd,f);if(p.recommendation===`no-op`){s.setTasks(e=>e.map(e=>e.id===`detect`||e.id===`read`||e.id===`write`?{...e,status:`done`,detail:`already installed correctly`}:e)),s.setLiveLine(p.summary),s.setSandboxStats?.({reads:0,writes:0,rounds:0}),!o.skipMcp&&l&&await Y({accessToken:l.accessToken}).catch(()=>void 0),s.setPhase(`install-complete`);return}p.competitors.length>0&&s.setLiveLine(`Detected ${p.competitors.map(e=>e.name).join(`, `)} — will install Zenovay alongside (won't touch their tags).`);let m=a.id===`plain-html`&&(p.recommendation===`fresh-install`||p.recommendation===`fresh-install-alongside-competitor`||p.recommendation===`update-tracking-code`);if(m){s.setTasks(e=>e.map(e=>e.id===`detect`?{...e,status:`done`,detail:`Plain HTML`}:e)),s.setLiveLine(`Plain HTML — using fast install path (no AI needed)…`);let e=await ft({cwd:o.cwd,trackingCode:f,updateOnly:p.recommendation===`update-tracking-code`});if(e.installed.length===0&&e.errors.length===0)throw Error(`No HTML files were modified. Either no .html files contain a <head>...</head> block, or every file already has the correct tracker.`);if(e.installed.length===0&&e.errors.length>0)throw Error(`Programmatic install failed for all ${e.errors.length} file(s). First error: ${e.errors[0].file}: ${e.errors[0].error}`);s.setTasks(t=>t.map(t=>t.id===`read`||t.id===`write`?{...t,status:`done`,detail:`${e.installed.length} file(s)`}:t)),s.setLiveLine(`Tracker added to ${e.installed.length} file(s). Skipped ${e.skipped.length}, errored ${e.errors.length}.`);let t=await J(o.cwd,{[a.envVarName]:f});if(s.setTasks(e=>e.map(e=>e.id===`env`?{...e,status:`done`,detail:`${t.addedKeys.length} key(s) added`}:e)),!o.skipMcp&&l){let e=await Y({accessToken:l.accessToken}).catch(()=>null);s.setTasks(t=>t.map(t=>t.id===`mcp`?{...t,status:`done`,detail:e&&e.installed.length>0?e.installed.join(`, `):`none detected`}:t))}else s.setTasks(e=>e.map(e=>e.id===`mcp`?{...e,status:`done`,detail:`skipped`}:e));s.setLiveLine(void 0),s.setSandboxStats?.({reads:e.installed.length,writes:e.installed.length,rounds:0}),s.setPhase(`install-complete`);return}let h=a.buildSnippets({trackingCode:f,siteId:i.id}),g=`Install Zenovay tracking into this ${a.displayName} project.\nSite: ${i.name} (trackingCode: ${f}).\n1. Call detect_framework to confirm the framework.\n2. Read the entry file(s) for this framework:\n`+a.files.map(e=>` - ${e.path}`).join(`
|
|
71
71
|
`)+`
|
|
72
72
|
3. Insert the tracker using the snippet below.
|
|
73
73
|
4. Confirm the change with a diff before writing.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{ChatPanel as c}from"./chat-panel-C_yjPXnw.js";import{resolveSiteId as l}from"./resolve-site-DSJR9vuz.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{EmbeddedGlobe as d,MetricCard as f}from"./embedded-globe-ClP_lA3q.js";import{deepLinkFor as p,openInBrowser as m}from"./keybar-deep-link-C9xNYihD.js";import"./sphere-globe-CvHshl9g.js";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useState as S}from"react";import C from"ink-spinner";async function w(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await l(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await c.getLive(u);return r({type:`live.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=_(b.createElement(T,{api:c,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const T=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:l}=v(),[_,w]=S(null),[T,E]=S(!0),[D,O]=S(null),[k,A]=S(!1);if(y(e=>{if(!k){if(e===`/`){A(!0);return}if(e===`o`||e===`O`){m(p(`live`,{siteId:t}));return}e===`q`&&(l(),i(0))}}),x(()=>{if(k)return;let n=!1,r=async()=>{try{let r=await e.getLive(t);n||(w(r),E(!1),O(null))}catch(e){n||(O(e.message),E(!1))}};r();let i=setInterval(r,2e3);return()=>{n=!0,clearInterval(i)}},[e,t,k]),k)return b.createElement(c,{cliVersion:r,api:e,dashboardContext:{commandName:`live`,siteId:t,siteLabel:n,metricsSnapshot:_},onClose:()=>A(!1)});if(T)return b.createElement(h,{flexDirection:`column`},b.createElement(o,{version:r,subtitle:`live · ${n}`}),b.createElement(a,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:`magenta`},b.createElement(C,{type:`dots`})),b.createElement(g,null,` Connecting…`))));if(D&&!_)return b.createElement(h,{flexDirection:`column`},b.createElement(o,{version:r,subtitle:`live · ${n}`}),b.createElement(u,{reason:`error`,headline:`Failed to load`,hint:D}));let j=process.stdout.columns??80,M=Math.max(20,Math.min(40,Math.floor(j/3)));return b.createElement(h,{flexDirection:`column`},b.createElement(o,{version:r,subtitle:`live · ${n}`}),b.createElement(h,{flexDirection:`row`},b.createElement(f,{title:`Active now`,value:_?.activeVisitors??0,format:`number`,width:M}),b.createElement(a,{title:`Globe`,width:Math.max(40,j-M-4)},b.createElement(d,{events:_?.recentEvents??[],width:Math.max(36,j-M-10),height:10}))),b.createElement(a,{title:`Recent events`},!_||_.recentEvents.length===0?b.createElement(g,{color:`gray`},`— waiting for events —`):_.recentEvents.slice(0,15).map((e,t)=>b.createElement(h,{key:t},b.createElement(g,{color:`cyan`},(e.type??`pageview`).padEnd(10)),b.createElement(g,null,e.path.padEnd(36).slice(0,36)),b.createElement(g,{color:`gray`},e.country??`—`)))),b.createElement(s,{items:[{key:`/`,label:`ask AI`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{w as liveCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-nJlxAocC.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 n({config:f,cliVersion:d.cliVersion,token:p}),h,g;try{({siteId:h,site:g}=await a(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 _=i(d),v=u(),y=[{key:`isCurrent`,label:``,width:v.current,format:e=>e?`*`:` `},{key:`name`,label:`project`,width:v.name},{key:`domain`,label:`domain`,width:v.domain,format:e=>String(e??`—`)},{key:`tier`,label:`tier`,width:v.tier},{key:`pageviews24h`,label:`24h pv`,width:v.pageviews24h,align:`right`},{key:`id`,label:`id`,width:v.id}];return s({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
2
|
`);else process.stdout.write(JSON.stringify(e,null,2));return}process.stdout.write(r(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(o,{data:e.projects,columns:y,headerStyle:`accent`})}]})}export{d as projectsCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import{formatTabular as i,selectFormat as a}from"./formatter-DutfcQAc.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import{formatTabular as i,selectFormat as a}from"./formatter-DutfcQAc.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-DzoMR7th.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(),[i,a]=g(``),[c,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),a(``)}}},E=h(()=>c?c.columns.map(e=>({key:e,label:e,width:18,format:e=>e==null?`∅`:String(e).slice(0,18)})):[],[c]);return m.createElement(u,{flexDirection:`column`},m.createElement(s,{version:`query`}),m.createElement(o,{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:i,onChange:a,onSubmit:T})),x?m.createElement(d,{color:`gray`},`running…`):null,y?m.createElement(o,{title:`Error`,state:`err`},m.createElement(d,{color:`red`},y)):null,c?m.createElement(o,{title:`${c.row_count} rows · ${c.duration_ms}ms${c.truncated?` · truncated`:``}`,state:`ok`},c.row_count===0?m.createElement(d,{color:`gray`},`— empty —`):m.createElement(l,{data:c.rows.slice(0,50),columns:E,headerStyle:`accent`})):null)}async function y(o){let s=await e(),l=await t({strict:!1}),u=new n({config:s,cliVersion:o.cliVersion,token:l});try{await r(u,`scale`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d;try{({siteId:d}=await c(u,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=o.maxRows??1e3,p=a(o);if(o.sql)try{let e=await u.runSqlQuery(d,o.sql,{maxRows:f});if(p===`json`)process.stdout.write(JSON.stringify(e,null,2)),process.stdout.write(`
|
|
2
2
|
`);else if(p===`ndjson`)for(let t of e.rows)process.stdout.write(JSON.stringify(t)+`
|
|
3
3
|
`);else if(p===`csv`||p===`tsv`)process.stdout.write(i(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
4
|
`),process.stdout.write(`|`+e.columns.map((e,n)=>` ${e.padEnd(t[n]??0)} `).join(`|`)+`|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{spark as a}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as o}from"./resolve-site-DSJR9vuz.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{spark as a}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as o}from"./resolve-site-DSJR9vuz.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-nJlxAocC.js";import"./ui-DzoMR7th.js";import{Box as u,Text as d}from"ink";import f from"react";function p(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 m(m){let h=await e(),g=await t({strict:!1}),_=new n({config:h,cliVersion:m.cliVersion,token:g}),v,y;try{({siteId:v,site:y}=await o(_,{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=i(m),x=m.range??`30d`;return l({cliVersion:m.cliVersion,title:`revenue · ${v} · ${x}`,commandName:`revenue`,ai:{api:_,siteId:v,siteLabel:y?.url?y.url.replace(/^https?:\/\//,``).replace(/\/$/,``):y?.name??v},authToken:g?.accessToken??null,refreshIntervalMs:m.watch?5*6e4:0,fetcher:e=>_.getRevenue(v,x,e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`revenue`,{siteId: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
2
|
`);return}process.stdout.write(r(e.series,[`bucket`,`amount`,`currency`,`transactions`],t))},panels:[{id:`totals`,title:`Top line`,render:e=>f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{color:`green`,bold:!0},p(e.totalAmount,e.currency)),` `,f.createElement(d,{color:`gray`},`total · `,e.totalTransactions,` transactions`)),typeof e.mrr==`number`?f.createElement(d,null,f.createElement(d,{bold:!0},`MRR `),f.createElement(d,{color:`magenta`},p(e.mrr,e.currency)),typeof e.arpu==`number`?f.createElement(d,{color:`gray`},` · ARPU `,p(e.arpu,e.currency)):null):null)},{id:`series`,title:`Daily (${x})`,render:e=>{let t=e.series.map(e=>e.amount);if(t.length===0)return f.createElement(d,{color:`gray`},`— no transactions —`);let n=Math.max(...t,1);return f.createElement(u,{flexDirection:`column`},f.createElement(d,{color:`magenta`},a(t,Math.min(60,t.length*2))),f.createElement(d,{color:`gray`},`peak: `,p(n,e.currency),` ·`,` `,`avg: `,p(e.totalAmount/Math.max(1,t.length),e.currency)))}},{id:`window`,title:`Window`,render:e=>f.createElement(d,{color:`gray`},new Date(e.windowStart).toISOString().slice(0,10),` →`,` `,new Date(e.windowEnd).toISOString().slice(0,10))}]})}export{m as revenueCommand};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import{spawn as e}from"node:child_process";import t from"chalk";const n=3e4,r=4,i=1e3;function a(e,t){let n=e.requires;if(!n)return null;if(n.auth!==!1&&!t.authenticated)return`not authenticated`;if(n.tier&&t.currentTier){let e={free:0,pro:1,scale:2,enterprise:3},r=e[t.currentTier]??0,i=e[n.tier]??99}return n.multipleTeams&&!t.hasMultipleTeams?`requires 2+ teams`:n.freeTeam&&!t.hasFreeTeam?`requires a Free-tier team`:null}function o(t,n,r,i){return new Promise(a=>{let o=e(`node`,[t,...n],{env:{...process.env,ZENOVAY_NO_UPDATE_CHECK:`1`,...i},stdio:[`ignore`,`pipe`,`pipe`]}),s=``,c=``,l=!1,u=setTimeout(()=>{l=!0;try{o.kill(`SIGKILL`)}catch{}},r);o.stdout?.on(`data`,e=>{s+=e.toString(`utf8`),s.length>1048576&&(s=s.slice(0,1048576))}),o.stderr?.on(`data`,e=>{c+=e.toString(`utf8`),c.length>1048576&&(c=c.slice(0,1048576))}),o.on(`error`,e=>{clearTimeout(u),a({stdout:s,stderr:c+`\n[spawn error: ${e.message}]`,exitCode:-1,timedOut:l})}),o.on(`close`,e=>{clearTimeout(u),a({stdout:s,stderr:c,exitCode:e??0,timedOut:l})})})}async function s(e,t){let r=Date.now(),s=a(e,t.env);if(s)return{name:e.name,category:e.category,status:`skip`,durationMs:0,reason:s};if(e.inProcess)try{let t=await e.inProcess(),n=Date.now()-r;return t.ok?{name:e.name,category:e.category,status:`pass`,durationMs:n,...t.detail?{detail:t.detail}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:n,reason:t.reason}}catch(t){return{name:e.name,category:e.category,status:`fail`,durationMs:Date.now()-r,reason:t.message}}let c=e.name===`stack-leak.bad-net`?{ZENOVAY_API_BASE:`http://127.0.0.1:1`}:void 0,l=t.timeoutMs??n,u=await o(t.binPath,e.command,l,c),d=Date.now()-r;if(u.timedOut)return{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:`timeout (${Math.round(l/1e3)}s)`,...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}};let f;try{f=e.assert(u.stdout,u.stderr,u.exitCode)}catch(n){return{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:`assert threw: ${n.message}`,...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}}}return f.ok?{name:e.name,category:e.category,status:`pass`,durationMs:d,...f.detail?{detail:f.detail}:{},...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:f.reason,...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}}}async function c(e,t){let n=Date.now(),i=Math.max(1,t.parallel??r),a=Array(e.length).fill(void 0),o=[];for(let n=0;n<e.length;n++){let r=e[n];r&&(t.quick&&!r.quick||o.push(n))}let c=0,l=[],u=async()=>{for(;;){let n=c;if(c+=1,n>=o.length)return;let r=o[n];if(r===void 0)return;let i=e[r];if(!i)continue;let l=await s(i,t);a[r]=l,t.onResult?.(l)}};for(let e=0;e<i;e++)l.push(u());await Promise.all(l);let d=[];for(let e of a)e&&d.push(e);let f=d.filter(e=>e.status===`pass`).length,p=d.filter(e=>e.status===`fail`).length,m=d.filter(e=>e.status===`skip`).length;return{results:d,total:d.length,pass:f,fail:p,skip:m,durationMs:Date.now()-n}}async function l(e){let t={currentTier:null,hasMultipleTeams:!1,hasFreeTeam:!1,authenticated:!1};try{let{readToken:n}=await import(`./token-store-BliA7lF_.js`),{readConfig:r}=await import(`./config-i0nb93yX.js`),{ApiV2Client:i}=await import(`./api-v2-BlZLQy11.js`),a=await n({strict:!1}).catch(()=>null);if(!a)return t;t.authenticated=!0;let o=await r(),s=new i({config:o,cliVersion:e,token:a}),c=await s.me();if(c.team?.plan){let e=c.team.plan.toLowerCase();(e===`free`||e===`pro`||e===`scale`||e===`enterprise`)&&(t.currentTier=e)}c.teams&&c.teams.length>=2&&(t.hasMultipleTeams=!0),(c.teams&&c.teams.some(e=>e.plan?.toLowerCase()===`free`)||t.currentTier===`free`)&&(t.hasFreeTeam=!0)}catch{}return t}function u(e){let t=e.trim();if(!t)return{ok:!1,reason:`empty stdout`};try{return{ok:!0,value:JSON.parse(t)}}catch{let e=t.split(`
|
|
2
2
|
`).filter(e=>e.trim().startsWith(`{`)||e.trim().startsWith(`[`)).pop();if(e)try{return{ok:!0,value:JSON.parse(e)}}catch{}return{ok:!1,reason:`stdout not JSON (got ${t.length} bytes)`}}}function d(e,t,n){if(n!==0)return{ok:!1,reason:`exit ${n}`};let r=u(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function f(e,t,n){if(n!==0){let r=[e,t];for(let e of r)if(e.includes(`tier_insufficient`))return{ok:!0,detail:{gated:!0}};return{ok:!1,reason:`exit ${n} — ${(t||e).slice(0,80)}`}}let r=u(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function p(e){if(typeof e!=`object`||!e)return!1;let t=e;if(Array.isArray(t.items)||Array.isArray(t.rows)||Array.isArray(t.data))return!0;if(typeof t.data==`object`&&t.data!==null){let e=t.data;if(Array.isArray(e.items)||Array.isArray(e.rows))return!0}return!1}const m=[{name:`analytics`,category:`ANALYTICS`,command:[`analytics`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(!i.ok)return{ok:!1,reason:i.reason};let a=i.value,o=a.visitors??a.data?.visitors,s=a.pageviews??a.data?.pageviews;return{ok:!0,detail:{visitors:o??null,pageviews:s??null}}},quick:!0},{name:`overview`,category:`ANALYTICS`,command:[`overview`,`--json`],assert:d},{name:`pages`,category:`ANALYTICS`,command:[`pages`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(!i.ok)return{ok:!1,reason:i.reason};let a=i.value,o=a.items??a.data?.items;return{ok:!0,detail:{rows:o?.length??0}}},quick:!0},{name:`sources`,category:`ANALYTICS`,command:[`sources`,`--json`],assert:d,quick:!0},{name:`devices`,category:`ANALYTICS`,command:[`devices`,`--json`],assert:d},{name:`geo`,category:`ANALYTICS`,command:[`geo`,`--json`],assert:d},{name:`live`,category:`ANALYTICS`,command:[`live`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(i.ok&&typeof i.value==`object`&&i.value!==null){let e=i.value,t=e.bounceRate??e.data?.bounceRate;if(typeof t==`number`&&(t<0||t>1))return{ok:!1,reason:`bounceRate semantics violated (got ${t}, expected 0..1)`}}return{ok:!0}}},{name:`revenue`,category:`ANALYTICS`,command:[`revenue`,`--json`],assert:d},{name:`funnels`,category:`ANALYTICS`,command:[`funnels`,`--json`],assert:f,requires:{tier:`pro`}},{name:`home`,category:`ANALYTICS`,command:[`home`,`--json`],assert:d},{name:`usage`,category:`ANALYTICS`,command:[`usage`,`--json`],assert:d,quick:!0},{name:`stats`,category:`ANALYTICS`,command:[`stats`,`--json`],assert:d},{name:`retention`,category:`BEHAVIOR`,command:[`retention`,`--json`],assert:f,requires:{tier:`pro`}},{name:`uptime`,category:`BEHAVIOR`,command:[`uptime`,`--json`],assert:f,requires:{tier:`pro`}},{name:`sessions`,category:`BEHAVIOR`,command:[`sessions`,`--json`],assert:f,requires:{tier:`pro`}},{name:`heatmaps`,category:`BEHAVIOR`,command:[`heatmaps`,`--json`],assert:f,requires:{tier:`pro`}},{name:`journeys`,category:`BEHAVIOR`,command:[`journeys`,`--json`],assert:f,requires:{tier:`pro`}},{name:`insights`,category:`INTELLIGENCE`,command:[`insights`,`--json`],assert:f,requires:{tier:`pro`}},{name:`domains list`,category:`MANAGE`,command:[`domains`,`list`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);return!i.ok||!p(i.value)?{ok:!1,reason:`expected list shape ({items|rows|data})`}:{ok:!0}},quick:!0},{name:`api-keys list`,category:`MANAGE`,command:[`api-keys`,`list`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);return!i.ok||!p(i.value)?{ok:!1,reason:`expected list shape`}:{ok:!0}}},{name:`team list`,category:`MANAGE`,command:[`team`,`list`,`--json`],assert:f,requires:{tier:`pro`}},{name:`webhooks list`,category:`MANAGE`,command:[`webhooks`,`list`,`--json`],assert:d},{name:`profile show`,category:`ACCOUNT`,command:[`profile`,`show`,`--json`],assert:d,quick:!0},{name:`plans info`,category:`ACCOUNT`,command:[`plans`,`info`,`--json`],assert:d},{name:`settings get`,category:`ACCOUNT`,command:[`settings`,`get`,`--json`],assert:d},{name:`integrations list`,category:`ACCOUNT`,command:[`integrations`,`list`,`--json`],assert:d},{name:`goals list`,category:`ACCOUNT`,command:[`goals`,`list`,`--json`],assert:f,requires:{tier:`pro`}},{name:`notes list`,category:`ACCOUNT`,command:[`notes`,`list`,`--json`],assert:d},{name:`audit list`,category:`ACCOUNT`,command:[`audit`,`list`,`--json`],assert:f,requires:{tier:`pro`}},{name:`share url`,category:`ACCOUNT`,command:[`share`,`url`,`--json`],assert:(e,t,n)=>n!==0&&n!==1&&n!==2?{ok:!1,reason:`unexpected exit ${n}`}:{ok:!0}},{name:`teams list`,category:`ACCOUNT`,command:[`teams`,`list`,`--json`],assert:d},{name:`health`,category:`OPERATIONS`,command:[`health`,`--json`],assert:(e,t,n)=>{let r=u(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}},quick:!0},{name:`commands`,category:`OPERATIONS`,command:[`commands`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(!i.ok)return{ok:!1,reason:i.reason};let a=i.value,o=a.commands;return!Array.isArray(o)||o.length===0?{ok:!1,reason:`commands tree empty`}:{ok:!0,detail:{commands:o.length}}}},{name:`themes`,category:`OPERATIONS`,command:[`themes`,`--json`],assert:d},{name:`projects`,category:`OPERATIONS`,command:[`projects`,`--json`],assert:d},{name:`idor.cross-team`,category:`SECURITY`,command:[`domains`,`list`,`--site-id`,`00000000-0000-0000-0000-000000000001`,`--json`],assert:(e,t,n)=>{let r=e+t;return/forbidden|not_found|tier_insufficient|auth_required|auth_invalid/.test(r)?{ok:!0,detail:{rejected:!0}}:r.includes(`"items"`)||r.includes(`"rows"`)?{ok:!1,reason:`expected forbidden/not_found, got data`}:{ok:!0,detail:{rejected:`empty`}}},requires:{multipleTeams:!0},dev:!0},{name:`idor.bad-uuid`,category:`SECURITY`,command:[`analytics`,`--site-id`,`00000000-0000-0000-0000-000000000000`,`--json`],assert:(e,t,n)=>{let r=e+t;return/not_found|forbidden|auth_/.test(r)?{ok:!0,detail:{rejected:!0}}:/error|invalid|"code":/i.test(r)?{ok:!0,detail:{rejected:`error-shaped`}}:{ok:!1,reason:`silent zeros — expected not_found`}},quick:!0,dev:!0},{name:`tier-gate.retention`,category:`SECURITY`,command:[`retention`,`--json`],assert:(e,t,n)=>{let r=e+t;return r.includes(`tier_insufficient`)?{ok:!0,detail:{gated:`tier_insufficient`}}:/upgrade_required|tier_required/.test(r)?{ok:!0,detail:{gated:`legacy-or-transitional`}}:/"code":\s*"forbidden"/.test(r)&&/tier|upgrade|plan/i.test(r)?{ok:!0,detail:{gated:`forbidden+tier-message`}}:n===0&&!/"type"\s*:\s*"error"/.test(r)?{ok:!0,detail:{gated:`pass-through (Pro+ access)`}}:{ok:!1,reason:`gate did not behave as expected (no tier envelope and no clean pass-through)`}},dev:!0},{name:`stack-leak.bad-net`,category:`SECURITY`,command:[`analytics`,`--json`],assert:(e,t,n)=>{let r=e+t;return/\/Users\//.test(r)||/node:internal\//.test(r)?{ok:!1,reason:`stack trace leaked filesystem path`}:{ok:!0}},quick:!0},{name:`token-perms`,category:`SECURITY`,command:[],assert:()=>({ok:!1,reason:`should run in-process`}),inProcess:async()=>{let{stat:e}=await import(`node:fs/promises`),t=await import(`node:path`),n=process.env.HOME??process.env.USERPROFILE??``,r=process.env.XDG_CONFIG_HOME??t.join(n,`.config`),i=process.platform===`win32`?t.join(process.env.APPDATA??t.join(n,`AppData`,`Roaming`),`zenovay`,`auth.json`):t.join(r,`zenovay`,`auth.json`);try{let t=await e(i);if(process.platform===`win32`)return{ok:!0,detail:{mode:`win32-skip`}};let n=t.mode&511;return n===384?{ok:!0,detail:{mode:`0600`}}:{ok:!1,reason:`auth.json mode ${n.toString(8)} != 0600`}}catch(e){let t=e.code;return t===`ENOENT`?{ok:!0,detail:{mode:`no-auth-file`}}:{ok:!1,reason:e.message}}},quick:!0},{name:`secret-scrub`,category:`SECURITY`,command:[],assert:()=>({ok:!1,reason:`should run in-process`}),inProcess:async()=>{let{SECRET_PATTERNS:e,scrubSecrets:t}=await import(`./secrets-c-NB_plk.js`),n=[{name:`openai-proj`,sample:`sk-proj-abcdefghijklmnopqrstuvwxyz0123456789`},{name:`anthropic`,sample:`sk-ant-abcdefghijklmnopqrstuvwxyz0123456789`},{name:`openai-sk`,sample:`sk-abcdefghijklmnopqrstuvwxyz0123`},{name:`github-pat-new`,sample:`github_pat_`+`a`.repeat(82)},{name:`github-pat`,sample:`ghp_`+`a`.repeat(36)},{name:`github-oauth`,sample:`gho_`+`a`.repeat(36)},{name:`aws-access-key`,sample:`AKIAABCDEFGHIJKLMNOP`},{name:`stripe-live`,sample:`sk_live_`+`a`.repeat(28)},{name:`stripe-test`,sample:`pk_test_`+`a`.repeat(28)},{name:`stripe-restricted`,sample:`rk_live_`+`a`.repeat(28)},{name:`stripe-webhook`,sample:`whsec_`+`a`.repeat(28)},{name:`slack-bot`,sample:`xoxb-1234567890-abcdef`},{name:`google-api`,sample:`AIza`+`a`.repeat(35)},{name:`jwt`,sample:`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c`},{name:`private-key-rsa`,sample:`-----BEGIN RSA PRIVATE KEY-----`},{name:`private-key-pkcs8`,sample:`-----BEGIN PRIVATE KEY-----`},{name:`supabase-jwt`,sample:`eyJhbGciOi`+`a`.repeat(40)},{name:`resend-api`,sample:`re_`+`a`.repeat(20)},{name:`gitlab-pat`,sample:`glpat-`+`a`.repeat(20)},{name:`shopify`,sample:`shpat_`+`a`.repeat(32)},{name:`service-role-key`,sample:`service_role: "`+`a`.repeat(40)+`"`}],r=n.map(e=>`${e.name}=${e.sample}`).join(`
|
|
3
3
|
`),i=t(r),a=n.filter(e=>i.includes(`[REDACTED:${e.name}]`)).length,o=e.length,s=Math.max(18,o-4);return a>=s?{ok:!0,detail:{matched:a,total:o}}:{ok:!1,reason:`${a}/${o} patterns redacted (need >= ${s})`}},quick:!0},{name:`help-line-count`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=e.split(`
|
|
4
|
-
`).length;return r<90?{ok:!0,detail:{lines:r}}:{ok:!1,reason:`${r} lines (target < 90)`}},dev:!0},{name:`help-no-wave-markers`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=/\b(?:Wave\s*\d|W\d|V2\.1)\b/i,i=e.match(r);return i?{ok:!1,reason:`found marker: ${i[0]}`}:{ok:!0}},dev:!0},{name:`help-has-groups`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=[`ANALYTICS`,`BEHAVIOR`,`MANAGE`,`ACCOUNT`,`OPERATIONS`],i=r.filter(t=>!e.includes(t));return i.length===0?{ok:!0,detail:{found:r}}:{ok:!1,reason:`missing groups: ${i.join(`, `)}`}},dev:!0},{name:`examples-coverage`,category:`DISCOVERABILITY`,command:[],assert:()=>({ok:!1,reason:`should run in-process`}),inProcess:async()=>{let{EXAMPLES:e}=await import(`./examples-
|
|
4
|
+
`).length;return r<90?{ok:!0,detail:{lines:r}}:{ok:!1,reason:`${r} lines (target < 90)`}},dev:!0},{name:`help-no-wave-markers`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=/\b(?:Wave\s*\d|W\d|V2\.1)\b/i,i=e.match(r);return i?{ok:!1,reason:`found marker: ${i[0]}`}:{ok:!0}},dev:!0},{name:`help-has-groups`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=[`ANALYTICS`,`BEHAVIOR`,`MANAGE`,`ACCOUNT`,`OPERATIONS`],i=r.filter(t=>!e.includes(t));return i.length===0?{ok:!0,detail:{found:r}}:{ok:!1,reason:`missing groups: ${i.join(`, `)}`}},dev:!0},{name:`examples-coverage`,category:`DISCOVERABILITY`,command:[],assert:()=>({ok:!1,reason:`should run in-process`}),inProcess:async()=>{let{EXAMPLES:e}=await import(`./examples-CFatZcPz.js`),t=Object.keys(e).length;return t>=25?{ok:!0,detail:{commands:t}}:{ok:!1,reason:`${t} commands have examples (need >= 25)`}},dev:!0},{name:`envelope-shape`,category:`DISCOVERABILITY`,command:[`commands`,`--json`],assert:(e,t,n)=>{if(n!==0)return{ok:!1,reason:`exit ${n}`};let r=u(e);if(!r.ok)return{ok:!1,reason:r.reason};let i=r.value,a=typeof i.version==`string`&&Array.isArray(i.commands);return a?{ok:!0,detail:{commands:i.commands.length}}:{ok:!1,reason:`commands payload missing version+commands`}},dev:!0}],h=m.length;async function g(e){let t=process.argv[1]??process.execPath,n=!!e.full||process.env.ZENOVAY_SELF_TEST_FULL===`1`,r=m.filter(e=>n||!e.dev);e.quick&&(r=r.filter(e=>e.quick));let i=await l(e.cliVersion);return e.json?_({...e,binPath:t,env:i,catalog:r}):b({...e,binPath:t,env:i,catalog:r})}async function _(e){let t=await c(e.catalog,{binPath:e.binPath,quick:e.quick??!1,verbose:e.verbose??!1,parallel:e.parallel,env:e.env,onResult:e=>{let t={type:`self-test.result`,name:e.name,category:e.category,status:e.status,durationMs:e.durationMs,...e.detail?{detail:e.detail}:{},...e.reason?{reason:e.reason}:{},...e.rawStdout?{rawStdout:e.rawStdout}:{},...e.rawStderr?{rawStderr:e.rawStderr}:{}};process.stdout.write(`${JSON.stringify(t)}\n`)}});return process.stdout.write(`${JSON.stringify({type:`self-test.summary`,total:t.total,pass:t.pass,fail:t.fail,skip:t.skip,durationMs:t.durationMs,cliVersion:e.cliVersion,env:e.env})}\n`),t.fail>0?1:0}const v=26,y=8;async function b(e){S(e.cliVersion,e.quick??!1,e.catalog.length);let t=new Map,n=0,r=null,i=new Map;for(let t of e.catalog)i.set(t.category,(i.get(t.category)??0)+1);let a=await c(e.catalog,{binPath:e.binPath,quick:e.quick??!1,verbose:e.verbose??!1,parallel:e.parallel,env:e.env,onResult:a=>{for(t.set(a.name,a);n<e.catalog.length;){let a=e.catalog[n];if(!a)break;let o=t.get(a.name);if(!o)break;r!==a.category&&(C(a.category,i.get(a.category)??0),r=a.category),w(a,o),t.delete(a.name),n+=1}}});return T(a),a.fail>0?1:0}function x(){return Math.max(60,process.stdout.columns??80)}function S(e,n,r){let i=Math.min(120,x()),a=i-2,o=`ZENOVAY · v${e}`,s=`self-test · ${n?`quick`:`full`} · ${r} test${r===1?``:`s`}`,c=`╭─ `+o+` `+`─`.repeat(Math.max(0,a-o.length-4))+`╮`,l=`│ `+s+` `.repeat(Math.max(0,a-s.length-2))+`│`,u=`╰`+`─`.repeat(a)+`╯`;process.stdout.write(t.cyan(c)+`
|
|
5
5
|
`),process.stdout.write(t.cyan(l)+`
|
|
6
6
|
`),process.stdout.write(t.cyan(u)+`
|
|
7
7
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-nJlxAocC.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e,t){let n=Math.round(e/100*t);return`█`.repeat(n)+`░`.repeat(Math.max(0,t-n))}function m(e){return e==null?{glyph:`·`,color:`gray`}:e>.5?{glyph:`▲`,color:`green`}:e<-.5?{glyph:`▼`,color:`red`}:{glyph:`→`,color:`gray`}}async function h(h){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:h.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:h.siteId,headless:!!(h.json||h.csv||h.tsv||h.ndjson),cliVersion:h.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(h),S=h.period??`30d`,C=[{key:`source`,label:`source`,width:22},{key:`channel`,label:`channel`,width:10,format:e=>String(e??`—`)},{key:`visitors`,label:`visitors`,width:8,align:`right`},{key:`delta`,label:`Δ`,width:6,align:`right`,format:e=>typeof e==`number`?`${e>0?`+`:``}${(e*100).toFixed(1)}%`:`—`}];return l({cliVersion:h.cliVersion,title:`sources · ${y} · ${S}`,commandName:`sources`,authToken:_?.accessToken??null,refreshIntervalMs:6e4,fetcher:e=>v.getSources(y,S,h.compare,e),format:x,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`sources`,{siteId: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
2
|
`);return}process.stdout.write(r(e.sources,[`source`,`channel`,`visitors`,`conversions`,`revenue`,`delta`],t))},panels:[{id:`summary`,title:`Total`,render:e=>f.createElement(d,null,f.createElement(d,{bold:!0},e.totalVisitors.toLocaleString()),` `,f.createElement(d,{color:`gray`},`visitors · `,e.sources.length,` sources`))},{id:`channels`,title:`By channel`,render:e=>{if(e.sources.length===0)return f.createElement(d,{color:`gray`},`— no source data —`);let t=e.totalVisitors||1,n=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return f.createElement(u,{flexDirection:`column`},n.map((e,n)=>{let r=e.visitors/t*100,i=m(e.delta);return f.createElement(u,{key:`${e.source}-${n}`},f.createElement(d,null,f.createElement(d,{color:`cyan`},e.source.padEnd(20).slice(0,20)),` `,f.createElement(d,{color:`magenta`},p(r,30)),` `,f.createElement(d,null,e.visitors.toString().padStart(6),` `),f.createElement(d,{color:`gray`},`(`,r.toFixed(1),`%)`),` `,f.createElement(d,{color:i.color},i.glyph)))}))}},{id:`table`,title:`Detail`,render:e=>e.sources.length===0?f.createElement(d,{color:`gray`},`— —`):f.createElement(o,{data:e.sources.slice(0,20),columns:C,headerStyle:`accent`})}]})}export{h as sourcesCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useTheme as e}from"./panel-B_yDcIcn.js";import{Box as t,Text as n}from"ink";import r from"react";const i={DZ:{lat:28.0339,lng:1.6596,name:`Algeria`,spread:8},EG:{lat:26.8206,lng:30.8025,name:`Egypt`,spread:6},ET:{lat:9.145,lng:40.4897,name:`Ethiopia`,spread:6},GH:{lat:7.9465,lng:-1.0232,name:`Ghana`,spread:3},KE:{lat:-.0236,lng:37.9062,name:`Kenya`,spread:4},MA:{lat:31.7917,lng:-7.0926,name:`Morocco`,spread:5},NG:{lat:9.082,lng:8.6753,name:`Nigeria`,spread:5},ZA:{lat:-30.5595,lng:22.9375,name:`South Africa`,spread:7},TZ:{lat:-6.369,lng:34.8888,name:`Tanzania`,spread:5},UG:{lat:1.3733,lng:32.2903,name:`Uganda`,spread:3},TN:{lat:33.8869,lng:9.5375,name:`Tunisia`,spread:3},SN:{lat:14.4974,lng:-14.4524,name:`Senegal`,spread:3},CI:{lat:7.54,lng:-5.5471,name:`Côte d'Ivoire`,spread:3},CM:{lat:7.3697,lng:12.3547,name:`Cameroon`,spread:4},AO:{lat:-11.2027,lng:17.8739,name:`Angola`,spread:6},MZ:{lat:-18.6657,lng:35.5296,name:`Mozambique`,spread:6},ZW:{lat:-19.0154,lng:29.1549,name:`Zimbabwe`,spread:4},ZM:{lat:-13.1339,lng:27.8493,name:`Zambia`,spread:5},RW:{lat:-1.9403,lng:29.8739,name:`Rwanda`,spread:1.5},MG:{lat:-18.7669,lng:46.8691,name:`Madagascar`,spread:5},LY:{lat:26.3351,lng:17.2283,name:`Libya`,spread:8},SD:{lat:12.8628,lng:30.2176,name:`Sudan`,spread:7},US:{lat:39.0902,lng:-98.5795,name:`United States`,spread:18},CA:{lat:56.1304,lng:-106.3468,name:`Canada`,spread:22},MX:{lat:23.6345,lng:-102.5528,name:`Mexico`,spread:9},BR:{lat:-10.235,lng:-51.9253,name:`Brazil`,spread:18},AR:{lat:-38.4161,lng:-63.6167,name:`Argentina`,spread:11},CL:{lat:-35.6751,lng:-71.543,name:`Chile`,spread:11},CO:{lat:4.5709,lng:-74.2973,name:`Colombia`,spread:6},PE:{lat:-9.19,lng:-75.0152,name:`Peru`,spread:7},VE:{lat:6.4238,lng:-66.5897,name:`Venezuela`,spread:6},EC:{lat:-1.8312,lng:-78.1834,name:`Ecuador`,spread:3},BO:{lat:-16.2902,lng:-63.5887,name:`Bolivia`,spread:6},UY:{lat:-32.5228,lng:-55.7658,name:`Uruguay`,spread:2.5},PY:{lat:-23.4425,lng:-58.4438,name:`Paraguay`,spread:4},GT:{lat:15.7835,lng:-90.2308,name:`Guatemala`,spread:2},CU:{lat:21.5218,lng:-77.7812,name:`Cuba`,spread:3},DO:{lat:18.7357,lng:-70.1627,name:`Dominican Republic`,spread:1.5},CR:{lat:9.7489,lng:-83.7534,name:`Costa Rica`,spread:1.2},PA:{lat:8.538,lng:-80.7821,name:`Panama`,spread:1.5},HN:{lat:15.2,lng:-86.2419,name:`Honduras`,spread:2},PR:{lat:18.2208,lng:-66.5901,name:`Puerto Rico`,spread:.6},JM:{lat:18.1096,lng:-77.2975,name:`Jamaica`,spread:.7},TT:{lat:10.6918,lng:-61.2225,name:`Trinidad and Tobago`,spread:.6},GB:{lat:55.3781,lng:-3.436,name:`United Kingdom`,spread:3},IE:{lat:53.4129,lng:-8.2439,name:`Ireland`,spread:2},FR:{lat:46.6034,lng:1.8883,name:`France`,spread:4},DE:{lat:51.1657,lng:10.4515,name:`Germany`,spread:3.5},IT:{lat:41.8719,lng:12.5674,name:`Italy`,spread:3.5},ES:{lat:40.4637,lng:-3.7492,name:`Spain`,spread:4},PT:{lat:39.3999,lng:-8.2245,name:`Portugal`,spread:2},NL:{lat:52.1326,lng:5.2913,name:`Netherlands`,spread:1.2},BE:{lat:50.5039,lng:4.4699,name:`Belgium`,spread:1},CH:{lat:46.8182,lng:8.2275,name:`Switzerland`,spread:1.4},AT:{lat:47.5162,lng:14.5501,name:`Austria`,spread:2},PL:{lat:51.9194,lng:19.1451,name:`Poland`,spread:3.5},CZ:{lat:49.8175,lng:15.473,name:`Czechia`,spread:1.8},SE:{lat:60.1282,lng:18.6435,name:`Sweden`,spread:5},NO:{lat:60.472,lng:8.4689,name:`Norway`,spread:5},FI:{lat:61.9241,lng:25.7482,name:`Finland`,spread:4},DK:{lat:56.2639,lng:9.5018,name:`Denmark`,spread:1.5},IS:{lat:64.9631,lng:-19.0208,name:`Iceland`,spread:3},GR:{lat:39.0742,lng:21.8243,name:`Greece`,spread:3},TR:{lat:38.9637,lng:35.2433,name:`Turkey`,spread:6},RO:{lat:45.9432,lng:24.9668,name:`Romania`,spread:3},HU:{lat:47.1625,lng:19.5033,name:`Hungary`,spread:2},UA:{lat:48.3794,lng:31.1656,name:`Ukraine`,spread:5},RU:{lat:61.524,lng:80,name:`Russia`,spread:28},BG:{lat:42.7339,lng:25.4858,name:`Bulgaria`,spread:2},HR:{lat:45.1,lng:15.2,name:`Croatia`,spread:2},RS:{lat:44.0165,lng:21.0059,name:`Serbia`,spread:2},SK:{lat:48.669,lng:19.699,name:`Slovakia`,spread:1.8},SI:{lat:46.1512,lng:14.9955,name:`Slovenia`,spread:1.2},LT:{lat:55.1694,lng:23.8813,name:`Lithuania`,spread:1.5},LV:{lat:56.8796,lng:24.6032,name:`Latvia`,spread:1.5},EE:{lat:58.5953,lng:25.0136,name:`Estonia`,spread:1.5},BY:{lat:53.7098,lng:27.9534,name:`Belarus`,spread:3},MD:{lat:47.4116,lng:28.3699,name:`Moldova`,spread:1.2},AL:{lat:41.1533,lng:20.1683,name:`Albania`,spread:1},MK:{lat:41.6086,lng:21.7453,name:`North Macedonia`,spread:1},BA:{lat:43.9159,lng:17.6791,name:`Bosnia and Herzegovina`,spread:1.2},ME:{lat:42.7087,lng:19.3744,name:`Montenegro`,spread:.8},XK:{lat:42.6026,lng:20.903,name:`Kosovo`,spread:.7},LU:{lat:49.8153,lng:6.1296,name:`Luxembourg`,spread:.4},MT:{lat:35.9375,lng:14.3754,name:`Malta`,spread:.3},CY:{lat:35.1264,lng:33.4299,name:`Cyprus`,spread:.6},CN:{lat:35.8617,lng:104.1954,name:`China`,spread:18},JP:{lat:36.2048,lng:138.2529,name:`Japan`,spread:5},KR:{lat:35.9078,lng:127.7669,name:`South Korea`,spread:2},IN:{lat:20.5937,lng:78.9629,name:`India`,spread:12},ID:{lat:-2.7893,lng:113.9213,name:`Indonesia`,spread:12},PH:{lat:12.8797,lng:121.774,name:`Philippines`,spread:5},VN:{lat:14.0583,lng:108.2772,name:`Vietnam`,spread:5},TH:{lat:15.87,lng:100.9925,name:`Thailand`,spread:4},MY:{lat:4.2105,lng:101.9758,name:`Malaysia`,spread:4},SG:{lat:1.3521,lng:103.8198,name:`Singapore`,spread:.3},PK:{lat:30.3753,lng:69.3451,name:`Pakistan`,spread:6},BD:{lat:23.685,lng:90.3563,name:`Bangladesh`,spread:3},LK:{lat:7.8731,lng:80.7718,name:`Sri Lanka`,spread:2},MM:{lat:21.9162,lng:95.956,name:`Myanmar`,spread:6},KH:{lat:12.5657,lng:104.991,name:`Cambodia`,spread:3},LA:{lat:19.8563,lng:102.4955,name:`Laos`,spread:3},NP:{lat:28.3949,lng:84.124,name:`Nepal`,spread:3},IR:{lat:32.4279,lng:53.688,name:`Iran`,spread:7},IQ:{lat:33.2232,lng:43.6793,name:`Iraq`,spread:4},IL:{lat:31.0461,lng:34.8516,name:`Israel`,spread:1},SA:{lat:23.8859,lng:45.0792,name:`Saudi Arabia`,spread:8},AE:{lat:23.4241,lng:53.8478,name:`UAE`,spread:2},QA:{lat:25.3548,lng:51.1839,name:`Qatar`,spread:.6},KW:{lat:29.3117,lng:47.4818,name:`Kuwait`,spread:.8},OM:{lat:21.4735,lng:55.9754,name:`Oman`,spread:4},JO:{lat:30.5852,lng:36.2384,name:`Jordan`,spread:2},LB:{lat:33.8547,lng:35.8623,name:`Lebanon`,spread:.7},SY:{lat:34.8021,lng:38.9968,name:`Syria`,spread:3},YE:{lat:15.5527,lng:48.5164,name:`Yemen`,spread:4},AF:{lat:33.9391,lng:67.71,name:`Afghanistan`,spread:5},KZ:{lat:48.0196,lng:66.9237,name:`Kazakhstan`,spread:13},UZ:{lat:41.3775,lng:64.5853,name:`Uzbekistan`,spread:5},TM:{lat:38.9697,lng:59.5563,name:`Turkmenistan`,spread:5},KG:{lat:41.2044,lng:74.7661,name:`Kyrgyzstan`,spread:3},TJ:{lat:38.861,lng:71.2761,name:`Tajikistan`,spread:3},AZ:{lat:40.1431,lng:47.5769,name:`Azerbaijan`,spread:2},GE:{lat:42.3154,lng:43.3569,name:`Georgia`,spread:2},AM:{lat:40.0691,lng:45.0382,name:`Armenia`,spread:1.2},HK:{lat:22.3193,lng:114.1694,name:`Hong Kong`,spread:.3},TW:{lat:23.6978,lng:120.9605,name:`Taiwan`,spread:1.5},AU:{lat:-25.2744,lng:133.7751,name:`Australia`,spread:18},NZ:{lat:-40.9006,lng:174.886,name:`New Zealand`,spread:5},PG:{lat:-6.314,lng:143.9555,name:`Papua New Guinea`,spread:5},FJ:{lat:-16.578,lng:179.4144,name:`Fiji`,spread:1}},a=Object.fromEntries(Object.entries(i).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function o(e){return!e||e.length!==2?null:i[e.toUpperCase()]??null}function s(e,t){let n=o(e);if(!n||t<=0)return[];let r=[],i=0;for(let t=0;t<e.length;t++)i=i*31+e.charCodeAt(t)>>>0;for(let e=0;e<t;e++){i=i+1831565813>>>0;let e=i;e=Math.imul(e^e>>>15,e|1)>>>0,e=(e^e+(Math.imul(e^e>>>7,e|61)>>>0))>>>0;let t=((e^e>>>14)>>>0)/4294967296;i=i+2246822507>>>0;let a=i;a=Math.imul(a^a>>>15,a|1)>>>0,a=(a^a+(Math.imul(a^a>>>7,a|61)>>>0))>>>0;let o=((a^a>>>14)>>>0)/4294967296,s=n.spread*Math.sqrt(t),c=o*2*Math.PI;r.push({lat:n.lat+s*Math.sin(c)*.7,lng:n.lng+s*Math.cos(c)/Math.max(.3,Math.cos(n.lat*Math.PI/180))})}return r}const c=360,l=180,u=new Uint8Array(c*l),d=new Uint8Array(c*l),f=[`__OCEAN__`];function p(e){let t=(e%360+360)%360;return Math.floor(t)}function m(e){return Math.max(0,Math.min(l-1,Math.floor(90-e)))}function h(e,t,n){let r=m(e),i=p(t);u[r*c+i]=1,d[r*c+i]=n}for(let e of Object.keys(i)){let t=i[e];f.push(e);let n=f.length-1,r=Math.max(.5,t.spread*.85),a=Math.max(.25,Math.cos(t.lat*Math.PI/180)),o=Math.max(.5,t.spread/a),s=Math.floor(t.lat-r),c=Math.ceil(t.lat+r),l=Math.floor(t.lng-o),u=Math.ceil(t.lng+o);for(let e=s;e<=c;e++)for(let i=l;i<=u;i++){let a=(e-t.lat)/r,s=(i-t.lng)/o;s*s+a*a>1||h(e,i,n)}}const g=new Uint8Array(u);for(let e=1;e<l-1;e++)for(let t=0;t<c;t++){if(u[e*c+t])continue;let n=0,r=0;for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){if(i===0&&a===0)continue;let o=(t+a+c)%c;u[(e+i)*c+o]&&(n++,r||=d[(e+i)*c+o]??0)}n>=4&&(g[e*c+t]=1,d[e*c+t]=r)}u.set(g);const _=new Uint8Array(c*l);for(let e=0;e<l;e++)for(let t=0;t<c;t++){let n=d[e*c+t];if(!n)continue;let r=e>0?d[(e-1)*c+t]:0,i=e<l-1?d[(e+1)*c+t]:0,a=d[e*c+(t-1+c)%c],o=d[e*c+(t+1)%c];(r!==n||i!==n||a!==n||o!==n)&&(_[e*c+t]=1)}function v(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(l-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return u[n*c+i]===1?1:0}function y(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(l-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return _[n*c+i]===1?1:0}function b(e){return e*Math.PI/180}function x(e,t){let n=b(e),r=b(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function S(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:n*e.x+r*e.z,y:e.y,z:-r*e.x+n*e.z}}function C(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:e.x,y:n*e.y-r*e.z,z:r*e.y+n*e.z}}function w(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function T(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function E(e,t,n,r){let i=r*r;for(let a=-r;a<=r;a++)for(let o=-r;o<=r;o++)o*o+a*a<=i&&T(e,Math.round(t+o),Math.round(n+a))}const D=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function O(e,t,n){let r=0;for(let i=0;i<D.length;i++){let[a,o]=D[i],s=t*2+a,c=n*4+o;e.bits[c*e.dw+s]&&(r|=1<<i)}return r===0?` `:String.fromCodePoint(10240+r)}function k(e,t,n){let r=0;for(let i=0;i<4;i++)for(let a=0;a<2;a++){let o=t*2+a,s=n*4+i;e.bits[s*e.dw+o]&&r++}return r===0?` `:r<=2?`·`:r<=5?`○`:`●`}function A(e){if(e)return!0;let t=process.env;if(t.NO_COLOR||t.ZENOVAY_GLOBE===`ascii`)return!0;let n=(t.LANG||t.LC_ALL||t.LC_CTYPE||``).toLowerCase();return!!(n&&!n.includes(`utf`))}function j(e,t,n){if(e.z<0)return null;let r=t/2,i=n/2,a=Math.min(t,n/2)*.95;return{x:r+e.x*a,y:i-e.y*a}}function M(e){let t=e.dw/2,n=e.dh/2,r=Math.min(e.dw,e.dh/2)*.95,i=Math.round(2*Math.PI*r);for(let a=0;a<i;a++){let o=a/i*2*Math.PI,s=Math.round(t+r*Math.cos(o)),c=Math.round(n+r*Math.sin(o));T(e,s,c)}}function N(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=C(S(x(r,i),t),n),o=j(a,e.dw,e.dh);o&&T(e,Math.round(o.x),Math.round(o.y))}for(let r=-180;r<180;r+=30)for(let i=-85;i<=85;i+=4){let a=C(S(x(i,r),t),n),o=j(a,e.dw,e.dh);o&&T(e,Math.round(o.x),Math.round(o.y))}}function P({visitors:i,highlight:a,width:o=50,height:s=25,rotationDeg:c=0,tiltDeg:l=20,gridlines:u=!0,asciiOnly:d}){let{theme:f}=e(),p=A(d),m=w(o,s),h=w(o,s),g=w(o,s),_=w(o,s),D=w(o,s),P=b(c),F=b(-l);M(m),u&&N(m,P,F);{let e=h.dw/2,t=h.dh/2,n=Math.min(h.dw,h.dh/2)*.95,r=Math.cos(P),i=Math.sin(P),a=Math.cos(F),o=Math.sin(F);for(let s=0;s<h.dh;s++){let c=(t-s)/n;if(!(c<-1||c>1))for(let t=0;t<h.dw;t++){let l=(t-e)/n,u=l*l+c*c;if(u>1)continue;let d=Math.sqrt(1-u),f=l,p=c,m=a*p+o*d,_=-o*p+a*d,b=r*f-i*_,x=i*f+r*_,S=Math.asin(m)*(180/Math.PI),C=Math.atan2(b,x)*(180/Math.PI);v(S,C)&&(T(h,t,s),y(S,C)&&T(g,t,s))}}}for(let e of i){let t=C(S(x(e.lat,e.lng),P),F),n=j(t,_.dw,_.dh);if(!n)continue;let r=typeof e.freshness==`number`?e.freshness:.5;E(_,n.x,n.y,r>.7?2:1)}if(a&&a.length>0)for(let e of a){let t=C(S(x(e.lat,e.lng),P),F),n=j(t,D.dw,D.dh);if(!n)continue;E(D,n.x,n.y,2)}let I=[];for(let e=0;e<s;e++){let i=[],a=null,s=(e,t)=>{a&&a.color===e?a.text+=t:(a={color:e,text:t},i.push(a))};for(let t=0;t<o;t++){let n=p?k(D,t,e):O(D,t,e);if(n!==` `){s(f.warn,n);continue}let r=p?k(_,t,e):O(_,t,e);if(r!==` `){s(f.accent,r);continue}let a=p?k(g,t,e):O(g,t,e);if(a!==` `){s(f.fg,a);continue}let o=p?k(h,t,e):O(h,t,e);if(o!==` `){s(f.success,o);continue}let c=p?k(m,t,e):O(m,t,e);if(c!==` `){s(f.muted,c);continue}let l=i.length>0?i[i.length-1]:void 0;s(l?l.color:f.muted,` `)}I.push(r.createElement(t,{key:e},r.createElement(n,null,i.map((e,t)=>r.createElement(n,{key:t,color:e.color,bold:!0},e.text)))))}return r.createElement(t,{flexDirection:`column`},I)}export{P as SphereGlobe,o as infoFor,s as scatterCountryDots};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-nJlxAocC.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 n({config:m,cliVersion:p.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await a(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.range??`24h`,x=[{key:`url`,label:`page`,width:40,format:e=>String(e??`—`)},{key:`views`,label:`views`,width:8,align:`right`}],S=[{key:`country`,label:`country`,width:8},{key:`visitors`,label:`visitors`,width:8,align:`right`}];return s({cliVersion:p.cliVersion,title:`stats · ${_} · ${b}`,commandName:`stats`,ai:{api:g,siteId:_,siteLabel:v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_},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
2
|
`);return}process.stdout.write(r([{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(o,{data:e.topPages.slice(0,10),columns:x,headerStyle:`accent`})},{id:`countries`,title:`Top countries`,render:e=>e.topCountries.length===0?u.createElement(l,{color:`gray`},`— no country data —`):u.createElement(o,{data:e.topCountries.slice(0,10),columns:S,headerStyle:`accent`})}]})}export{p as statsCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-B_yDcIcn.js";import{Banner as a}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-
|
|
1
|
+
import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-B_yDcIcn.js";import{Banner as a}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-DzoMR7th.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
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
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
4
|
`),0;let{waitUntilExit:t}=l(u.createElement(m,{themes:d}));return await t(),0}export{h as themesCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{brailleSpark as a,spark as o}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as s}from"./resolve-site-DSJR9vuz.js";import{DataTable as c}from"./data-table-BpbyyNSA.js";import{deepLinkFor as l,openInBrowser as u}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as d}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{brailleSpark as a,spark as o}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as s}from"./resolve-site-DSJR9vuz.js";import{DataTable as c}from"./data-table-BpbyyNSA.js";import{deepLinkFor as l,openInBrowser as u}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as d}from"./analytical-screen-nJlxAocC.js";import{Box as f,Text as p}from"ink";import m from"react";function h(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 g(e){let t=e,n=t.events??t.timeseries;return Array.isArray(n)&&n.length>0?o(n,8):`▁▁▁▁▁▁▁▁`}function _(e){let t=e;if(typeof t.sessionDurationSec==`number`)return t.sessionDurationSec;if(typeof t.sessionDurationMs==`number`)return Math.floor(t.sessionDurationMs/1e3);if(typeof t.durationMs==`number`)return Math.floor(t.durationMs/1e3);if(typeof t.duration==`number`)return Math.floor(t.duration/1e3);let n=Date.parse(e.startedAt);return Number.isNaN(n)?0:Math.max(0,Math.floor((Date.now()-n)/1e3))}async function v(o){let v=await e(),y=await t({strict:!1}),b=new n({config:v,cliVersion:o.cliVersion,token:y}),x,S;try{({siteId:x,site:S}=await s(b,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let C=i(o),w=o.limit??50,T=typeof o.minDuration==`number`&&o.minDuration>0?o.minDuration:0,E=e=>T<=0?e:e.filter(e=>_(e)>=T),D=6e4,O=e=>{let t=Date.parse(e.startedAt);return Number.isFinite(t)&&Date.now()-t<D},k=[{key:`startedAt`,label:``,width:5,format:(e,t)=>O(t)?`● new`:``},{key:`startedAt`,label:`when`,width:6,format:e=>h(String(e))},{key:`country`,label:`country`,width:7,format:e=>String(e??`—`)},{key:`city`,label:`city`,width:14,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`page`,label:`page`,width:26,format:e=>String(e??`—`)},{key:`id`,label:`24h`,width:8,format:(e,t)=>g(t)}];return d({cliVersion:o.cliVersion,title:`visitors · ${x}`,commandName:`visitors`,ai:{api:b,siteId:x,siteLabel:S?.url?S.url.replace(/^https?:\/\//,``).replace(/\/$/,``):S?.name??x},authToken:y?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>b.getVisitors(x,{limit:w},e),format:C,keybindings:{o:{label:`open in browser`,handler:()=>{u(l(`visitors`,{siteId:x}))}}},headlessEmit:(e,t)=>{let n={...e,visitors:E(e.visitors)};if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(n,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}let i=[`startedAt`,`country`,`city`,`device`,`page`];process.stdout.write(r(n.visitors,i,t))},panels:[{id:`live`,title:`Now`,render:e=>{let t=E(e.visitors),n=[...t].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)),r=n[0],i=Array(24*6).fill(0),o=Date.now();for(let e of t){let t=o-new Date(e.startedAt).getTime(),n=Math.floor(t/(10*60*1e3));n>=0&&n<i.length&&(i[i.length-1-n]+=1)}return m.createElement(f,{flexDirection:`column`},m.createElement(p,{bold:!0},t.length,` live`),m.createElement(p,{color:`gray`},a(i,40)),r?m.createElement(p,{color:`gray`},`top: `,r.city??r.country??`—`,` · `,r.page??`—`):null)}},{id:`visitors`,title:`Active sessions`,render:e=>{let t=E(e.visitors),n=[...t].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)).slice(0,w);return n.length===0?m.createElement(p,{color:`gray`},`— no visitors yet —`):m.createElement(c,{columns:k,data:n,headerStyle:`accent`})}}]})}export{v as visitorsCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-C9xNYihD.js";import{runAnalyticalScreen as l}from"./analytical-screen-nJlxAocC.js";import{Box as u,Text as d}from"ink";import f from"react";const p={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 m(e,t){let n=p[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function h(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function g(p){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:p.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{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 x=i(p),S=[{key:`url`,label:`url`,width:32},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,label:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return l({cliVersion:p.cliVersion,title:`vitals · ${y}`,commandName:`vitals`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:p.watch?5*6e4:0,fetcher:e=>v.getVitals(y,{url:p.url,device:p.device,window:p.window},e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`vitals`,{siteId: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
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 f.createElement(u,{flexDirection:`column`},n.map(e=>{let n=t(e),r=m(e,n);return f.createElement(d,{key:e},f.createElement(d,{color:r.color},`● `),f.createElement(d,{bold:!0},e.toUpperCase().padEnd(5)),` `,f.createElement(d,null,h(e,n).padStart(8)),` `,f.createElement(d,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?f.createElement(d,{color:`gray`},`— no vitals data yet —`):f.createElement(o,{data:e.vitals.slice(0,15),columns:S,headerStyle:`accent`})}]})}export{g as vitalsCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{spark as l}from"./sparkline-BZ0eMB-w.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-C9xNYihD.js";import{Globe as m}from"./globe-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{spark as l}from"./sparkline-BZ0eMB-w.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-C9xNYihD.js";import{Globe as m}from"./globe-DaSl9ejK.js";import{z as h}from"zod";import{Box as g,Text as _,render as v,useApp as y,useInput as b}from"ink";import x,{useEffect as S,useState as C}from"react";import w from"ink-spinner";import T from"ink-text-input";const E=h.object({siteId:h.string().optional(),window:h.string().optional(),totalVisitors:h.number().optional(),visitors:h.object({count:h.number().optional(),series:h.array(h.number()).optional()}).optional(),topPages:h.array(h.object({path:h.string(),views:h.number().optional(),count:h.number().optional()})).optional(),sources:h.array(h.object({source:h.string(),visitors:h.number()})).optional()}).passthrough();async function D(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}=v(x.createElement(O,{api:c,siteId:l,intervalMs:r.intervalMs??15e3,cliVersion:r.cliVersion,onExit:n=>{t(),e(n)}}))})}const O=({api:e,siteId:t,intervalMs:n,cliVersion:i,onExit:a})=>{let{exit:l}=y(),[u,h]=C(null),[v,T]=C(null),[D,O]=C(null),[I,L]=C([]),[R,z]=C(!0),[B,V]=C(null),[H,U]=C(1),[W,G]=C(!1),[K,q]=C(!1);b((e,n)=>{if(e===`o`||e===`O`){p(f(`watch`,{siteId:t}));return}if(e===`q`){l(),a(0);return}if(e===`?`||e===`/`){q(e=>!e);return}if(e===`g`){G(e=>!e);return}if(n.tab){U(e=>{let t=n.shift?(e+4)%6+1:e%6+1;return t});return}(e===`1`||e===`2`||e===`3`||e===`4`||e===`5`||e===`6`)&&U(Number(e))});let[J,Y]=C(!1);if(S(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=E.safeParse(n);if(!i.success){Y(!0),z(!1);return}Y(!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};h(o),e.getVitals(t).then(e=>{r||T(e)},()=>{}),e.getGoals(t).then(e=>{r||O(e)},()=>{}),z(!1),V(null)}catch(e){r||V(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),S(()=>{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`&&L(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),R)return x.createElement(g,{flexDirection:`column`},x.createElement(s,{version:i,subtitle:`watch · ${t}`}),x.createElement(o,{title:`Loading`,state:`busy`},x.createElement(g,null,x.createElement(_,{color:`magenta`},x.createElement(w,{type:`dots`})),x.createElement(_,null,` Fetching snapshot…`))));if(B&&!u)return x.createElement(g,{flexDirection:`column`},x.createElement(s,{version:i,subtitle:`watch · ${t}`}),x.createElement(o,{title:`Error`,state:`err`},x.createElement(_,{color:`red`},B)));if(J&&!u)return x.createElement(g,{flexDirection:`column`},x.createElement(s,{version:i,subtitle:`watch · ${t}`}),x.createElement(d,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let X=process.stdout.columns??80,Z=Math.max(20,Math.floor(X/3)-1),Q=[];return x.createElement(g,{flexDirection:`column`},x.createElement(s,{version:i,subtitle:`watch · ${t}${W?` · globe`:``}`}),x.createElement(g,{flexDirection:`row`},x.createElement(g,{flexDirection:`column`},W?x.createElement(o,{title:`Live globe`,focused:H===1,width:Z},x.createElement(m,{data:Q,width:Math.max(40,Z-4),height:12})):x.createElement(A,{snapshot:u,focused:H===1,width:Z}),x.createElement(N,{events:I,focused:H===4,width:Z})),x.createElement(g,{flexDirection:`column`},x.createElement(j,{snapshot:u,focused:H===2,width:Z}),x.createElement(P,{vitals:v,focused:H===5,width:Z})),x.createElement(g,{flexDirection:`column`},x.createElement(M,{snapshot:u,focused:H===3,width:Z}),x.createElement(F,{goals:D,focused:H===6,width:Z}))),K?x.createElement(k,{api:e,siteId:t,width:X-2}):null,x.createElement(c,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:W?`panels`:`globe`},{key:`?/`,label:K?`close chat`:`ai chat`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))},k=({api:e,siteId:t,width:n})=>{let[i,a]=C(``),[s,c]=C([]),[l,u]=C(!1),[d,f]=C(``),[p,m]=C(null),h=async n=>{let i=n.trim();if(!i||l)return;m(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`)m(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...o,{role:`assistant`,content:a}]),f(``)}catch(e){m(e instanceof Error?e.message:`chat failed`)}finally{u(!1)}};return x.createElement(g,{marginTop:1},x.createElement(o,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},x.createElement(g,{flexDirection:`column`},s.slice(-6).map((e,t)=>x.createElement(g,{key:t,flexDirection:`column`,marginBottom:1},x.createElement(_,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),x.createElement(_,null,e.content))),l&&d?x.createElement(g,{flexDirection:`column`,marginBottom:1},x.createElement(_,{color:`magenta`,bold:!0},`zenovay`),x.createElement(_,null,d)):null,p?x.createElement(_,{color:`red`},`✗ `,p):null,x.createElement(g,null,x.createElement(_,{color:`cyan`},l?`⠋ `:`▸ `),x.createElement(T,{value:i,onChange:a,onSubmit:h,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},A=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return x.createElement(o,{title:`Visitors`,focused:t,width:n},x.createElement(_,{bold:!0},r.toString()),x.createElement(_,{color:`gray`},i.length>0?l(i,Math.max(8,n-6)):`— no data —`))},j=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return x.createElement(o,{title:`Top pages`,focused:t,width:n},r.length===0?x.createElement(_,{color:`gray`},`— no data —`):r.map(e=>x.createElement(g,{key:e.path},x.createElement(_,null,e.path.padEnd(n-10).slice(0,n-10)),x.createElement(_,{color:`gray`},` `,e.views))))},M=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return x.createElement(o,{title:`Sources`,focused:t,width:n},r.length===0?x.createElement(_,{color:`gray`},`— no data —`):r.map(e=>x.createElement(g,{key:e.source},x.createElement(_,null,e.source.padEnd(n-10).slice(0,n-10)),x.createElement(_,{color:`gray`},` `,e.visitors))))},N=({events:e,focused:t,width:n})=>x.createElement(o,{title:`Events`,focused:t,width:n},e.length===0?x.createElement(_,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>x.createElement(_,{key:t},e.slice(0,n-4)))),P=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>x.createElement(g,{key:e},x.createElement(_,{bold:!0},e.padEnd(6)),x.createElement(_,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return x.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`))},F=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return x.createElement(o,{title:`Goals`,focused:t,width:n},r.length===0?x.createElement(_,{color:`gray`},`— no data —`):r.map(e=>x.createElement(g,{key:e.name},x.createElement(_,null,e.name.padEnd(n-10).slice(0,n-10)),x.createElement(_,{color:`gray`},` `,e.completions))))};export{D as watchCommand};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{Panel as r}from"./panel-B_yDcIcn.js";import{Banner as i}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{Panel as r}from"./panel-B_yDcIcn.js";import{Banner as i}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-DzoMR7th.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
|
`),2;if(!r.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
|
|
3
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-D6qfFHJW.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
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{ApiError as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{ChatPanel as l}from"./chat-panel-C_yjPXnw.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{stripUrlPrefix as d}from"./fmt-gMsty5jy.js";import{DataTable as f}from"./data-table-BpbyyNSA.js";import{EmptyState as p}from"./empty-state-CJxa1jUN.js";import{MetricCard as m}from"./metric-card-COEIZmbN.js";import{Bar as h}from"./bar-DWT-1xOE.js";import{deepLinkFor as g,openInBrowser as _}from"./keybar-deep-link-C9xNYihD.js";import{Box as v,Text as y,render as b,useApp as x,useInput as S}from"ink";import C,{useEffect as w,useState as T}from"react";import E from"ink-spinner";function D(e){if(!(e instanceof t))return!1;let n=e.status;if(n===401||n===403||n===404)return!0;let r=e.body,i=r?.code;return i===`forbidden`||i===`not_found`||i===`auth_required`||i===`auth_invalid`||i===`tier_insufficient`}function O(e,t){return e.catch(e=>{if(D(e))throw e;return t})}async function k(t){let o=await e(),s=await n({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new r({config:o,cliVersion:t.cliVersion,token:s}),l,d;try{({siteId:l,site:d}=await u(c,{explicit:t.siteId,headless:!!t.json,cliVersion:t.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??l;if(a(t))try{let e=await j(c,l,`24h`);if(t.csv||t.tsv){let{writeCsv:n}=await import(`./csv-emit-BuRZNWYM.js`);return n(e.topPages,[`path`,`views`,`uniqueVisitors`,`avgTime`,`bounceRate`],t.tsv?`tsv`:`csv`)}if(t.ndjson){for(let t of e.topPages)process.stdout.write(JSON.stringify(t)+`
|
|
2
|
-
`);return 0}return i({type:`overview.snapshot`,data:e}),0}catch(e){let{emitErrorEnvelope:n}=await import(`./error-codes-BeJw1P4i.js`);return n(e,{command:`analytics`,cliVersion:t.cliVersion})}return new Promise(e=>{let{unmount:n}=b(C.createElement(M,{api:c,siteId:l,siteLabel:f,cliVersion:t.cliVersion,onExit:t=>{n(),e(t)}}))})}function A(e){return e===`24h`?`7d`:e}async function j(e,t,n){let[r,i,a,o,s]=await Promise.all([O(e.getStats(t,n),null),O(e.getPages(t),[]),O(e.getSources(t,A(n),`prev`),null),O(e.getGeo(t),null),O(e.getDevices(t),null)]),c=i.reduce((e,t)=>e+t.views,0),l=(r?.daily??[]).map(e=>e.visitors),u=(r?.daily??[]).map(e=>e.pageviews),d=Math.floor(l.length/2),f=l.slice(0,d).reduce((e,t)=>e+t,0),p=u.slice(0,d).reduce((e,t)=>e+t,0),m=(a?.sources??[]).filter(e=>e.channel!==`other`||!e.source.includes(`/`)).slice(0,6).map(e=>({name:e.source,visitors:e.visitors,delta:e.delta??null}));return{visitors:r?.visitors??0,pageviews:r?.pageviews??c,bounceRate:r?.bounceRate??null,avgSession:r?.avgSessionSec??null,series:l,pageviewsSeries:u,prevVisitors:f,prevPageviews:p,topPages:i.slice(0,10),channels:m,countries:(o?.countries??[]).slice(0,8),browsers:(s?.browsers??[]).slice(0,5),devices:(s?.devices??[]).slice(0,5)}}const M=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=x(),[u,b]=T(null),[D,O]=T(!0),[k,A]=T(null),[M,N]=T(`24h`),[P,F]=T(t),[I,L]=T(n),[R,z]=T(!1),[B,V]=T([]),[H,U]=T(!1);S(async t=>{if(!H){if(t===`/`){U(!0);return}if(t===`o`||t===`O`){_(g(`overview`,{siteId:P}));return}if(t===`q`){a(),i(0);return}if(t===`1`){N(`24h`);return}if(t===`2`){N(`7d`);return}if(t===`3`){N(`30d`);return}if(t===`4`){N(`90d`);return}if(t===`s`){if(B.length===0)try{let t=await e.getSites();V(t)}catch{}z(e=>!e);return}}}),w(()=>{let t=!1;return O(!0),(async()=>{try{let n=await j(e,P,M);t||(b(n),O(!1))}catch(e){t||(A(e.message),O(!1))}})(),()=>{t=!0}},[e,P,M]);let W=()=>C.createElement(o,{title:`Switch site`,state:`idle`},B.length===0?C.createElement(y,{color:`gray`},`Loading your sites…`):B.map(e=>C.createElement(v,{key:e.id},C.createElement(y,{color:e.id===P?`cyan`:`gray`},e.id===P?`› `:` `),C.createElement(y,{bold:e.id===P},e.name),C.createElement(y,{color:`gray`},` (`,e.url.replace(/^https?:\/\//,``).replace(/\/$/,``),`)`))),C.createElement(v,{marginTop:1},C.createElement(y,{color:`gray`},`Press `),C.createElement(y,{color:`cyan`},`[number]`),C.createElement(y,{color:`gray`},` to pick, `),C.createElement(y,{color:`cyan`},`[s]`),C.createElement(y,{color:`gray`},` to close.`)));S(e=>{if(H||!R)return;let t=Number(e);if(Number.isInteger(t)&&t>=1&&t<=B.length){let e=B[t-1];F(e.id),L(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),z(!1)}});let G=`overview · ${I} · ${M}`,K=[{key:`q`,label:`quit`},{key:`/`,label:`ask AI`},{key:`o`,label:`open in browser`},{key:`s`,label:`site`},{key:`1-4`,label:`range (24h/7d/30d/90d)`}];if(H)return C.createElement(l,{cliVersion:r,api:e,dashboardContext:{commandName:`overview`,siteId:P,siteLabel:I,metricsSnapshot:u},onClose:()=>U(!1)});if(D)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(o,{title:`Loading`,state:`busy`},C.createElement(v,null,C.createElement(y,{color:`cyan`},C.createElement(E,{type:`dots`})),C.createElement(y,null,` Fetching dashboard…`))),R?W():null);if(k)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(p,{reason:`error`,headline:`Failed to load`,hint:k}),R?W():null,C.createElement(c,{items:K}));if(!u||u.visitors===0&&u.pageviews===0&&u.topPages.length===0)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(p,{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.`}),R?W():null,C.createElement(c,{items:K}));let q=process.stdout.columns??80,J=Math.max(18,Math.floor(q/4)-1),Y=Math.max(28,Math.floor(q/2)-2),X=[{key:`path`,label:`path`,width:32,format:e=>d(String(e??``))},{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)}%`:`—`}],Z=u.prevVisitors>0?(u.visitors-u.prevVisitors)/u.prevVisitors:void 0,Q=u.prevPageviews>0?(u.pageviews-u.prevPageviews)/u.prevPageviews:void 0,ee=Math.max(1,...u.channels.map(e=>e.visitors)),te=Math.max(1,...u.countries.map(e=>e.visitors)),ne=Math.max(1,...u.browsers.map(e=>e.visitors)),re=Math.max(1,...u.devices.map(e=>e.visitors)),$=Math.max(8,Math.floor(Y/3));return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:G}),C.createElement(v,{flexDirection:`row`},C.createElement(m,{title:`Visitors`,value:u.visitors,format:`number`,width:J,series:u.series,...typeof Z==`number`?{delta:Z}:{}}),C.createElement(m,{title:`Pageviews`,value:u.pageviews,format:`number`,width:J,series:u.pageviewsSeries,...typeof Q==`number`?{delta:Q}:{}}),C.createElement(m,{title:`Bounce rate`,value:u.bounceRate??``,emptyHint:`—`,format:`percent`,width:J}),C.createElement(m,{title:`Avg session`,value:u.avgSession??``,emptyHint:`—`,format:`duration`,width:J})),C.createElement(v,{flexDirection:`row`,flexWrap:`wrap`},C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Channels`},u.channels.length===0?C.createElement(y,{color:`gray`},`No channel data yet.`):u.channels.map(e=>C.createElement(v,{key:e.name,flexDirection:`row`},C.createElement(v,{width:12},C.createElement(y,null,e.name)),C.createElement(h,{value:e.visitors,max:ee,width:$,showPercent:!1,...typeof e.delta==`number`?{delta:e.delta}:{}}),C.createElement(y,{color:`gray`},` `,e.visitors))))),C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Top countries`},u.countries.length===0?C.createElement(y,{color:`gray`},`No geo data yet.`):u.countries.map(e=>C.createElement(v,{key:e.country,flexDirection:`row`},C.createElement(v,{width:5},C.createElement(y,null,e.country)),C.createElement(h,{value:e.visitors,max:te,width:$,showPercent:!1}),C.createElement(y,{color:`gray`},` `,e.visitors)))))),C.createElement(v,{flexDirection:`row`,flexWrap:`wrap`},C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Top browsers`},u.browsers.length===0?C.createElement(y,{color:`gray`},`No browser data yet.`):u.browsers.map(e=>C.createElement(v,{key:e.name,flexDirection:`row`},C.createElement(v,{width:12},C.createElement(y,null,e.name)),C.createElement(h,{value:e.visitors,max:ne,width:$,showPercent:!1}),C.createElement(y,{color:`gray`},` `,e.visitors))))),C.createElement(v,{width:Y,flexDirection:`column`},C.createElement(o,{title:`Top devices`},u.devices.length===0?C.createElement(y,{color:`gray`},`No device data yet.`):u.devices.map(e=>C.createElement(v,{key:e.name,flexDirection:`row`},C.createElement(v,{width:12},C.createElement(y,null,e.name)),C.createElement(h,{value:e.visitors,max:re,width:$,showPercent:!1}),C.createElement(y,{color:`gray`},` `,e.visitors)))))),C.createElement(o,{title:`Top pages (${M})`},u.topPages.length===0?C.createElement(y,{color:`gray`},`No pages with data in this window yet.`):C.createElement(f,{columns:X,data:u.topPages,zebra:!0})),R?W():null,C.createElement(c,{items:K}))};async function N(e){return k(e)}export{N as analyticsCommand};
|
package/dist/globe-CGZ5vibb.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a,useTheme as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{ChatPanel as l}from"./chat-panel-C_yjPXnw.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{Bar as f}from"./bar-DWT-1xOE.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useMemo as b,useRef as x,useState as S}from"react";import ee from"ink-spinner";import C from"open";const w={DZ:{lat:28.0339,lng:1.6596,name:`Algeria`,spread:8},EG:{lat:26.8206,lng:30.8025,name:`Egypt`,spread:6},ET:{lat:9.145,lng:40.4897,name:`Ethiopia`,spread:6},GH:{lat:7.9465,lng:-1.0232,name:`Ghana`,spread:3},KE:{lat:-.0236,lng:37.9062,name:`Kenya`,spread:4},MA:{lat:31.7917,lng:-7.0926,name:`Morocco`,spread:5},NG:{lat:9.082,lng:8.6753,name:`Nigeria`,spread:5},ZA:{lat:-30.5595,lng:22.9375,name:`South Africa`,spread:7},TZ:{lat:-6.369,lng:34.8888,name:`Tanzania`,spread:5},UG:{lat:1.3733,lng:32.2903,name:`Uganda`,spread:3},TN:{lat:33.8869,lng:9.5375,name:`Tunisia`,spread:3},SN:{lat:14.4974,lng:-14.4524,name:`Senegal`,spread:3},CI:{lat:7.54,lng:-5.5471,name:`Côte d'Ivoire`,spread:3},CM:{lat:7.3697,lng:12.3547,name:`Cameroon`,spread:4},AO:{lat:-11.2027,lng:17.8739,name:`Angola`,spread:6},MZ:{lat:-18.6657,lng:35.5296,name:`Mozambique`,spread:6},ZW:{lat:-19.0154,lng:29.1549,name:`Zimbabwe`,spread:4},ZM:{lat:-13.1339,lng:27.8493,name:`Zambia`,spread:5},RW:{lat:-1.9403,lng:29.8739,name:`Rwanda`,spread:1.5},MG:{lat:-18.7669,lng:46.8691,name:`Madagascar`,spread:5},LY:{lat:26.3351,lng:17.2283,name:`Libya`,spread:8},SD:{lat:12.8628,lng:30.2176,name:`Sudan`,spread:7},US:{lat:39.0902,lng:-98.5795,name:`United States`,spread:18},CA:{lat:56.1304,lng:-106.3468,name:`Canada`,spread:22},MX:{lat:23.6345,lng:-102.5528,name:`Mexico`,spread:9},BR:{lat:-10.235,lng:-51.9253,name:`Brazil`,spread:18},AR:{lat:-38.4161,lng:-63.6167,name:`Argentina`,spread:11},CL:{lat:-35.6751,lng:-71.543,name:`Chile`,spread:11},CO:{lat:4.5709,lng:-74.2973,name:`Colombia`,spread:6},PE:{lat:-9.19,lng:-75.0152,name:`Peru`,spread:7},VE:{lat:6.4238,lng:-66.5897,name:`Venezuela`,spread:6},EC:{lat:-1.8312,lng:-78.1834,name:`Ecuador`,spread:3},BO:{lat:-16.2902,lng:-63.5887,name:`Bolivia`,spread:6},UY:{lat:-32.5228,lng:-55.7658,name:`Uruguay`,spread:2.5},PY:{lat:-23.4425,lng:-58.4438,name:`Paraguay`,spread:4},GT:{lat:15.7835,lng:-90.2308,name:`Guatemala`,spread:2},CU:{lat:21.5218,lng:-77.7812,name:`Cuba`,spread:3},DO:{lat:18.7357,lng:-70.1627,name:`Dominican Republic`,spread:1.5},CR:{lat:9.7489,lng:-83.7534,name:`Costa Rica`,spread:1.2},PA:{lat:8.538,lng:-80.7821,name:`Panama`,spread:1.5},HN:{lat:15.2,lng:-86.2419,name:`Honduras`,spread:2},PR:{lat:18.2208,lng:-66.5901,name:`Puerto Rico`,spread:.6},JM:{lat:18.1096,lng:-77.2975,name:`Jamaica`,spread:.7},TT:{lat:10.6918,lng:-61.2225,name:`Trinidad and Tobago`,spread:.6},GB:{lat:55.3781,lng:-3.436,name:`United Kingdom`,spread:3},IE:{lat:53.4129,lng:-8.2439,name:`Ireland`,spread:2},FR:{lat:46.6034,lng:1.8883,name:`France`,spread:4},DE:{lat:51.1657,lng:10.4515,name:`Germany`,spread:3.5},IT:{lat:41.8719,lng:12.5674,name:`Italy`,spread:3.5},ES:{lat:40.4637,lng:-3.7492,name:`Spain`,spread:4},PT:{lat:39.3999,lng:-8.2245,name:`Portugal`,spread:2},NL:{lat:52.1326,lng:5.2913,name:`Netherlands`,spread:1.2},BE:{lat:50.5039,lng:4.4699,name:`Belgium`,spread:1},CH:{lat:46.8182,lng:8.2275,name:`Switzerland`,spread:1.4},AT:{lat:47.5162,lng:14.5501,name:`Austria`,spread:2},PL:{lat:51.9194,lng:19.1451,name:`Poland`,spread:3.5},CZ:{lat:49.8175,lng:15.473,name:`Czechia`,spread:1.8},SE:{lat:60.1282,lng:18.6435,name:`Sweden`,spread:5},NO:{lat:60.472,lng:8.4689,name:`Norway`,spread:5},FI:{lat:61.9241,lng:25.7482,name:`Finland`,spread:4},DK:{lat:56.2639,lng:9.5018,name:`Denmark`,spread:1.5},IS:{lat:64.9631,lng:-19.0208,name:`Iceland`,spread:3},GR:{lat:39.0742,lng:21.8243,name:`Greece`,spread:3},TR:{lat:38.9637,lng:35.2433,name:`Turkey`,spread:6},RO:{lat:45.9432,lng:24.9668,name:`Romania`,spread:3},HU:{lat:47.1625,lng:19.5033,name:`Hungary`,spread:2},UA:{lat:48.3794,lng:31.1656,name:`Ukraine`,spread:5},RU:{lat:61.524,lng:80,name:`Russia`,spread:28},BG:{lat:42.7339,lng:25.4858,name:`Bulgaria`,spread:2},HR:{lat:45.1,lng:15.2,name:`Croatia`,spread:2},RS:{lat:44.0165,lng:21.0059,name:`Serbia`,spread:2},SK:{lat:48.669,lng:19.699,name:`Slovakia`,spread:1.8},SI:{lat:46.1512,lng:14.9955,name:`Slovenia`,spread:1.2},LT:{lat:55.1694,lng:23.8813,name:`Lithuania`,spread:1.5},LV:{lat:56.8796,lng:24.6032,name:`Latvia`,spread:1.5},EE:{lat:58.5953,lng:25.0136,name:`Estonia`,spread:1.5},BY:{lat:53.7098,lng:27.9534,name:`Belarus`,spread:3},MD:{lat:47.4116,lng:28.3699,name:`Moldova`,spread:1.2},AL:{lat:41.1533,lng:20.1683,name:`Albania`,spread:1},MK:{lat:41.6086,lng:21.7453,name:`North Macedonia`,spread:1},BA:{lat:43.9159,lng:17.6791,name:`Bosnia and Herzegovina`,spread:1.2},ME:{lat:42.7087,lng:19.3744,name:`Montenegro`,spread:.8},XK:{lat:42.6026,lng:20.903,name:`Kosovo`,spread:.7},LU:{lat:49.8153,lng:6.1296,name:`Luxembourg`,spread:.4},MT:{lat:35.9375,lng:14.3754,name:`Malta`,spread:.3},CY:{lat:35.1264,lng:33.4299,name:`Cyprus`,spread:.6},CN:{lat:35.8617,lng:104.1954,name:`China`,spread:18},JP:{lat:36.2048,lng:138.2529,name:`Japan`,spread:5},KR:{lat:35.9078,lng:127.7669,name:`South Korea`,spread:2},IN:{lat:20.5937,lng:78.9629,name:`India`,spread:12},ID:{lat:-2.7893,lng:113.9213,name:`Indonesia`,spread:12},PH:{lat:12.8797,lng:121.774,name:`Philippines`,spread:5},VN:{lat:14.0583,lng:108.2772,name:`Vietnam`,spread:5},TH:{lat:15.87,lng:100.9925,name:`Thailand`,spread:4},MY:{lat:4.2105,lng:101.9758,name:`Malaysia`,spread:4},SG:{lat:1.3521,lng:103.8198,name:`Singapore`,spread:.3},PK:{lat:30.3753,lng:69.3451,name:`Pakistan`,spread:6},BD:{lat:23.685,lng:90.3563,name:`Bangladesh`,spread:3},LK:{lat:7.8731,lng:80.7718,name:`Sri Lanka`,spread:2},MM:{lat:21.9162,lng:95.956,name:`Myanmar`,spread:6},KH:{lat:12.5657,lng:104.991,name:`Cambodia`,spread:3},LA:{lat:19.8563,lng:102.4955,name:`Laos`,spread:3},NP:{lat:28.3949,lng:84.124,name:`Nepal`,spread:3},IR:{lat:32.4279,lng:53.688,name:`Iran`,spread:7},IQ:{lat:33.2232,lng:43.6793,name:`Iraq`,spread:4},IL:{lat:31.0461,lng:34.8516,name:`Israel`,spread:1},SA:{lat:23.8859,lng:45.0792,name:`Saudi Arabia`,spread:8},AE:{lat:23.4241,lng:53.8478,name:`UAE`,spread:2},QA:{lat:25.3548,lng:51.1839,name:`Qatar`,spread:.6},KW:{lat:29.3117,lng:47.4818,name:`Kuwait`,spread:.8},OM:{lat:21.4735,lng:55.9754,name:`Oman`,spread:4},JO:{lat:30.5852,lng:36.2384,name:`Jordan`,spread:2},LB:{lat:33.8547,lng:35.8623,name:`Lebanon`,spread:.7},SY:{lat:34.8021,lng:38.9968,name:`Syria`,spread:3},YE:{lat:15.5527,lng:48.5164,name:`Yemen`,spread:4},AF:{lat:33.9391,lng:67.71,name:`Afghanistan`,spread:5},KZ:{lat:48.0196,lng:66.9237,name:`Kazakhstan`,spread:13},UZ:{lat:41.3775,lng:64.5853,name:`Uzbekistan`,spread:5},TM:{lat:38.9697,lng:59.5563,name:`Turkmenistan`,spread:5},KG:{lat:41.2044,lng:74.7661,name:`Kyrgyzstan`,spread:3},TJ:{lat:38.861,lng:71.2761,name:`Tajikistan`,spread:3},AZ:{lat:40.1431,lng:47.5769,name:`Azerbaijan`,spread:2},GE:{lat:42.3154,lng:43.3569,name:`Georgia`,spread:2},AM:{lat:40.0691,lng:45.0382,name:`Armenia`,spread:1.2},HK:{lat:22.3193,lng:114.1694,name:`Hong Kong`,spread:.3},TW:{lat:23.6978,lng:120.9605,name:`Taiwan`,spread:1.5},AU:{lat:-25.2744,lng:133.7751,name:`Australia`,spread:18},NZ:{lat:-40.9006,lng:174.886,name:`New Zealand`,spread:5},PG:{lat:-6.314,lng:143.9555,name:`Papua New Guinea`,spread:5},FJ:{lat:-16.578,lng:179.4144,name:`Fiji`,spread:1}},te=Object.fromEntries(Object.entries(w).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function T(e){return!e||e.length!==2?null:w[e.toUpperCase()]??null}function E(e,t){let n=T(e);if(!n||t<=0)return[];let r=[],i=0;for(let t=0;t<e.length;t++)i=i*31+e.charCodeAt(t)>>>0;for(let e=0;e<t;e++){i=i+1831565813>>>0;let e=i;e=Math.imul(e^e>>>15,e|1)>>>0,e=(e^e+(Math.imul(e^e>>>7,e|61)>>>0))>>>0;let t=((e^e>>>14)>>>0)/4294967296;i=i+2246822507>>>0;let a=i;a=Math.imul(a^a>>>15,a|1)>>>0,a=(a^a+(Math.imul(a^a>>>7,a|61)>>>0))>>>0;let o=((a^a>>>14)>>>0)/4294967296,s=n.spread*Math.sqrt(t),c=o*2*Math.PI;r.push({lat:n.lat+s*Math.sin(c)*.7,lng:n.lng+s*Math.cos(c)/Math.max(.3,Math.cos(n.lat*Math.PI/180))})}return r}const D=360,O=180,k=new Uint8Array(D*O),A=new Uint8Array(D*O),j=[`__OCEAN__`];function M(e){let t=(e%360+360)%360;return Math.floor(t)}function N(e){return Math.max(0,Math.min(O-1,Math.floor(90-e)))}function P(e,t,n){let r=N(e),i=M(t);k[r*D+i]=1,A[r*D+i]=n}for(let e of Object.keys(w)){let t=w[e];j.push(e);let n=j.length-1,r=Math.max(.5,t.spread*.85),i=Math.max(.25,Math.cos(t.lat*Math.PI/180)),a=Math.max(.5,t.spread/i),o=Math.floor(t.lat-r),s=Math.ceil(t.lat+r),c=Math.floor(t.lng-a),l=Math.ceil(t.lng+a);for(let e=o;e<=s;e++)for(let i=c;i<=l;i++){let o=(e-t.lat)/r,s=(i-t.lng)/a;s*s+o*o>1||P(e,i,n)}}const F=new Uint8Array(k);for(let e=1;e<O-1;e++)for(let t=0;t<D;t++){if(k[e*D+t])continue;let n=0,r=0;for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){if(i===0&&a===0)continue;let o=(t+a+D)%D;k[(e+i)*D+o]&&(n++,r||=A[(e+i)*D+o]??0)}n>=4&&(F[e*D+t]=1,A[e*D+t]=r)}k.set(F);const I=new Uint8Array(D*O);for(let e=0;e<O;e++)for(let t=0;t<D;t++){let n=A[e*D+t];if(!n)continue;let r=e>0?A[(e-1)*D+t]:0,i=e<O-1?A[(e+1)*D+t]:0,a=A[e*D+(t-1+D)%D],o=A[e*D+(t+1)%D];(r!==n||i!==n||a!==n||o!==n)&&(I[e*D+t]=1)}function ne(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(O-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return k[n*D+i]===1?1:0}function L(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(O-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return I[n*D+i]===1?1:0}function R(e){return e*Math.PI/180}function z(e,t){let n=R(e),r=R(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function B(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:n*e.x+r*e.z,y:e.y,z:-r*e.x+n*e.z}}function V(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:e.x,y:n*e.y-r*e.z,z:r*e.y+n*e.z}}function H(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function U(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function W(e,t,n,r){let i=r*r;for(let a=-r;a<=r;a++)for(let o=-r;o<=r;o++)o*o+a*a<=i&&U(e,Math.round(t+o),Math.round(n+a))}const G=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function K(e,t,n){let r=0;for(let i=0;i<G.length;i++){let[a,o]=G[i],s=t*2+a,c=n*4+o;e.bits[c*e.dw+s]&&(r|=1<<i)}return r===0?` `:String.fromCodePoint(10240+r)}function q(e,t,n){let r=0;for(let i=0;i<4;i++)for(let a=0;a<2;a++){let o=t*2+a,s=n*4+i;e.bits[s*e.dw+o]&&r++}return r===0?` `:r<=2?`·`:r<=5?`○`:`●`}function J(e){if(e)return!0;let t=process.env;if(t.NO_COLOR||t.ZENOVAY_GLOBE===`ascii`)return!0;let n=(t.LANG||t.LC_ALL||t.LC_CTYPE||``).toLowerCase();return!!(n&&!n.includes(`utf`))}function Y(e,t,n){if(e.z<0)return null;let r=t/2,i=n/2,a=Math.min(t,n/2)*.95;return{x:r+e.x*a,y:i-e.y*a}}function X(e){let t=e.dw/2,n=e.dh/2,r=Math.min(e.dw,e.dh/2)*.95,i=Math.round(2*Math.PI*r);for(let a=0;a<i;a++){let o=a/i*2*Math.PI,s=Math.round(t+r*Math.cos(o)),c=Math.round(n+r*Math.sin(o));U(e,s,c)}}function re(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=V(B(z(r,i),t),n),o=Y(a,e.dw,e.dh);o&&U(e,Math.round(o.x),Math.round(o.y))}for(let r=-180;r<180;r+=30)for(let i=-85;i<=85;i+=4){let a=V(B(z(i,r),t),n),o=Y(a,e.dw,e.dh);o&&U(e,Math.round(o.x),Math.round(o.y))}}function ie({visitors:e,highlight:t,width:n=50,height:r=25,rotationDeg:i=0,tiltDeg:a=20,gridlines:s=!0,asciiOnly:c}){let{theme:l}=o(),u=J(c),d=H(n,r),f=H(n,r),h=H(n,r),g=H(n,r),_=H(n,r),y=R(i),b=R(-a);X(d),s&&re(d,y,b);{let e=f.dw/2,t=f.dh/2,n=Math.min(f.dw,f.dh/2)*.95,r=Math.cos(y),i=Math.sin(y),a=Math.cos(b),o=Math.sin(b);for(let s=0;s<f.dh;s++){let c=(t-s)/n;if(!(c<-1||c>1))for(let t=0;t<f.dw;t++){let l=(t-e)/n,u=l*l+c*c;if(u>1)continue;let d=Math.sqrt(1-u),p=l,m=c,g=a*m+o*d,_=-o*m+a*d,v=r*p-i*_,y=i*p+r*_,b=Math.asin(g)*(180/Math.PI),x=Math.atan2(v,y)*(180/Math.PI);ne(b,x)&&(U(f,t,s),L(b,x)&&U(h,t,s))}}}for(let t of e){let e=V(B(z(t.lat,t.lng),y),b),n=Y(e,g.dw,g.dh);if(!n)continue;let r=typeof t.freshness==`number`?t.freshness:.5;W(g,n.x,n.y,r>.7?2:1)}if(t&&t.length>0)for(let e of t){let t=V(B(z(e.lat,e.lng),y),b),n=Y(t,_.dw,_.dh);if(!n)continue;W(_,n.x,n.y,2)}let x=[];for(let e=0;e<r;e++){let t=[],r=null,i=(e,n)=>{r&&r.color===e?r.text+=n:(r={color:e,text:n},t.push(r))};for(let r=0;r<n;r++){let n=u?q(_,r,e):K(_,r,e);if(n!==` `){i(l.warn,n);continue}let a=u?q(g,r,e):K(g,r,e);if(a!==` `){i(l.accent,a);continue}let o=u?q(h,r,e):K(h,r,e);if(o!==` `){i(l.fg,o);continue}let s=u?q(f,r,e):K(f,r,e);if(s!==` `){i(l.success,s);continue}let c=u?q(d,r,e):K(d,r,e);if(c!==` `){i(l.muted,c);continue}let p=t.length>0?t[t.length-1]:void 0;i(p?p.color:l.muted,` `)}x.push(v.createElement(p,{key:e},v.createElement(m,null,t.map((e,t)=>v.createElement(m,{key:t,color:e.color,bold:!0},e.text)))))}return v.createElement(p,{flexDirection:`column`},x)}async function Z(e,t,n){let r=await e.getGeo(t).catch(()=>({countries:[],cities:[]})),i=(r.countries??[]).map(e=>{let t=T(e.country),r=n.get(e.country)??0;return{code:e.country,visitors:e.visitors,lat:t?.lat,lng:t?.lng,freshness:e.visitors>r?1:.4}});return{countries:i,totalVisitors:i.reduce((e,t)=>e+t.visitors,0),unknownCount:i.filter(e=>typeof e.lat!=`number`).reduce((e,t)=>e+t.visitors,0),lastFetchedAt:Date.now()}}async function Q(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),l,d;try{({siteId:l,site:d}=await u(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??l;if(a.browser){let e=`https://app.zenovay.com/domains/${encodeURIComponent(l)}?tab=globe`;a.json?process.stdout.write(JSON.stringify({openedUrl:e})+`
|
|
2
|
-
`):process.stdout.write(`\n Opening Mapbox globe in your default browser:\n ${e}\n\n`);try{await C(e)}catch{}return 0}if(i(a)){let e=await Z(c,l,new Map);return r({type:`globe.snapshot`,data:{countries:e.countries,total:e.totalVisitors,unknownCount:e.unknownCount}}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(le,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const ae=5e3,oe=60,se=1,ce=80,le=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:u}=g(),{theme:h}=o(),[w,te]=S(null),[D,O]=S(!0),[k,A]=S(null),[j,M]=S(0),[N,P]=S(!1),[F,I]=S(20),[ne,L]=S(1),[R,z]=S(0),B=x(new Map),[V,H]=S(!1);_(n=>{if(!V){if(n===`/`){H(!0);return}if(n===`q`){u(),i(0);return}if(n===` `){P(e=>!e);return}if(n===`+`||n===`=`){L(e=>Math.min(1.6,e+.1));return}if(n===`-`||n===`_`){L(e=>Math.max(.7,e-.1));return}if(n===`t`){I(e=>(e+15)%60);return}if(n===`j`){z(e=>e+1);return}if(n===`k`){z(e=>Math.max(0,e-1));return}if(n===`w`){let e=`https://app.zenovay.com/domains/${encodeURIComponent(t)}?tab=globe`;C(e).catch(()=>{});return}if(n===`o`&&w){let e=w.countries[R];e?.lng!==void 0&&(M(-e.lng),P(!0));return}n===`r`&&(async()=>{try{let n=await Z(e,t,B.current);B.current=new Map(n.countries.map(e=>[e.code,e.visitors])),te(n)}catch(e){A(e.message)}})()}}),y(()=>{let n=!1,r=null,i=async()=>{try{let r=await Z(e,t,B.current);if(n)return;B.current=new Map(r.countries.map(e=>[e.code,e.visitors])),te(r),O(!1)}catch(e){n||(A(e.message),O(!1))}n||(r=setTimeout(i,ae))};return i(),()=>{n=!0,r&&clearTimeout(r)}},[e,t]),y(()=>{if(N)return;let e=setInterval(()=>{M(e=>(e+se)%360)},oe);return()=>clearInterval(e)},[N]);let U=b(()=>{if(!w)return[];let e=[];for(let t of w.countries){if(typeof t.lat!=`number`||typeof t.lng!=`number`)continue;let n=Math.min(ce,Math.max(3,t.visitors*5));for(let r of E(t.code,n))e.push({lat:r.lat,lng:r.lng,freshness:t.freshness})}return e},[w]),W=b(()=>{if(!w)return[];let e=w.countries[Math.min(R,w.countries.length-1)];return!e||typeof e.lat!=`number`?[]:E(e.code,Math.min(80,Math.max(8,e.visitors*4)))},[w,R]),G=`globe · ${n} · live`,K=[{key:`q`,label:`quit`},{key:`j/k`,label:`select country`},{key:`o`,label:`orbit to selected`},{key:`space`,label:N?`resume`:`pause`},{key:`t`,label:`tilt ${F}°`},{key:`+/-`,label:`zoom`},{key:`w`,label:`open Mapbox view in browser`},{key:`r`,label:`refresh`},{key:`/`,label:`ask AI`}];if(V)return v.createElement(l,{cliVersion:r,api:e,dashboardContext:{commandName:`globe`,siteId:t,siteLabel:n,metricsSnapshot:w},onClose:()=>H(!1)});if(D)return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:G}),v.createElement(a,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`cyan`},v.createElement(ee,{type:`dots`})),v.createElement(m,null,` Spinning up Earth…`))));if(k)return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:G}),v.createElement(d,{reason:`error`,headline:`Failed to load`,hint:k}),v.createElement(c,{items:K}));if(!w||w.countries.length===0&&w.unknownCount===0)return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:G}),v.createElement(d,{reason:`no-data`,headline:`No geolocated visitors yet`,hint:`Visit your site to populate the map.`}),v.createElement(c,{items:K}));let q=process.stdout.columns??100,J=36,Y=Math.max(40,Math.min(90,q-J-4)),X=Math.round(Y*ne),re=Math.round(X*.5),Q=w.countries.slice(0,12),le=Math.max(1,...Q.map(e=>e.visitors)),ue=Math.max(1,Math.floor((Date.now()-w.lastFetchedAt)/1e3)),$=w.countries[Math.min(R,w.countries.length-1)],de=$?T($.code):null;return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:G}),$?v.createElement(p,{flexDirection:`row`,marginBottom:1},v.createElement(p,{width:2}),v.createElement(p,{borderStyle:`round`,borderColor:h.warn,paddingX:1},v.createElement(m,{color:h.warn,bold:!0},de?.name??$.code),v.createElement(m,{color:h.dim},` · `),v.createElement(m,{color:h.fg},$.visitors,` visitor`,$.visitors===1?``:`s`))):null,v.createElement(p,{flexDirection:`row`},v.createElement(p,{flexDirection:`column`,marginRight:2},v.createElement(ie,{visitors:U,highlight:W,width:X,height:re,rotationDeg:j,tiltDeg:F}),v.createElement(p,{marginTop:1},v.createElement(m,{color:h.dim},w.totalVisitors,` visitors · `,w.countries.length,` countries`,w.unknownCount>0?` · ${w.unknownCount} unmapped`:``,` · `,N?`rotation paused`:`↻ ${se}°/${oe}ms`,` · refreshed `,ue,`s ago`))),v.createElement(p,{flexDirection:`column`,width:J},v.createElement(a,{title:`Live by country`},Q.map((e,t)=>{let n=t===Math.min(R,w.countries.length-1),r=e.freshness>.7,i=n?h.warn:r?h.success:h.fg;return v.createElement(p,{key:e.code,flexDirection:`row`},v.createElement(p,{width:2},v.createElement(m,{color:h.warn},n?`›`:` `)),v.createElement(p,{width:3},v.createElement(m,{color:i,bold:n},e.code)),v.createElement(f,{value:e.visitors,max:le,width:14,showPercent:!1}),v.createElement(p,{width:6},v.createElement(m,{color:h.muted},String(e.visitors).padStart(5))))})),w.countries.length>12?v.createElement(p,{marginTop:1},v.createElement(m,{color:h.muted},`+`,w.countries.length-12,` more (j/k to scroll)`)):null)),v.createElement(c,{items:K}))};export{Q as globeCommand};
|
package/dist/live-STTP72bj.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{ChatPanel as c}from"./chat-panel-C_yjPXnw.js";import{resolveSiteId as l}from"./resolve-site-DSJR9vuz.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{MetricCard as d}from"./metric-card-COEIZmbN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-C9xNYihD.js";import{Globe as m}from"./globe-CD96vU4b.js";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useState as S}from"react";import C from"ink-spinner";async function w(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await l(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await c.getLive(u);return r({type:`live.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=_(b.createElement(T,{api:c,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const T=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:l}=v(),[_,w]=S(null),[T,E]=S(!0),[D,O]=S(null),[k,A]=S(!1);if(y(e=>{if(!k){if(e===`/`){A(!0);return}if(e===`o`||e===`O`){p(f(`live`,{siteId:t}));return}e===`q`&&(l(),i(0))}}),x(()=>{if(k)return;let n=!1,r=async()=>{try{let r=await e.getLive(t);n||(w(r),E(!1),O(null))}catch(e){n||(O(e.message),E(!1))}};r();let i=setInterval(r,2e3);return()=>{n=!0,clearInterval(i)}},[e,t,k]),k)return b.createElement(c,{cliVersion:r,api:e,dashboardContext:{commandName:`live`,siteId:t,siteLabel:n,metricsSnapshot:_},onClose:()=>A(!1)});if(T)return b.createElement(h,{flexDirection:`column`},b.createElement(o,{version:r,subtitle:`live · ${n}`}),b.createElement(a,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:`magenta`},b.createElement(C,{type:`dots`})),b.createElement(g,null,` Connecting…`))));if(D&&!_)return b.createElement(h,{flexDirection:`column`},b.createElement(o,{version:r,subtitle:`live · ${n}`}),b.createElement(u,{reason:`error`,headline:`Failed to load`,hint:D}));let j=process.stdout.columns??80,M=Math.max(20,Math.min(40,Math.floor(j/3)));return b.createElement(h,{flexDirection:`column`},b.createElement(o,{version:r,subtitle:`live · ${n}`}),b.createElement(h,{flexDirection:`row`},b.createElement(d,{title:`Active now`,value:_?.activeVisitors??0,format:`number`,width:M}),b.createElement(a,{title:`Globe`,width:Math.max(40,j-M-4)},b.createElement(m,{data:[],width:Math.max(36,j-M-10),height:10}))),b.createElement(a,{title:`Recent events`},!_||_.recentEvents.length===0?b.createElement(g,{color:`gray`},`— waiting for events —`):_.recentEvents.slice(0,15).map((e,t)=>b.createElement(h,{key:t},b.createElement(g,{color:`cyan`},(e.type??`pageview`).padEnd(10)),b.createElement(g,null,e.path.padEnd(36).slice(0,36)),b.createElement(g,{color:`gray`},e.country??`—`)))),b.createElement(s,{items:[{key:`/`,label:`ask AI`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{w as liveCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{useTheme as e}from"./panel-B_yDcIcn.js";import{spark as t}from"./sparkline-BZ0eMB-w.js";import{Box as n,Text as r}from"ink";import i from"react";function a(e,t){if(typeof e==`string`)return e;switch(t){case`percent`:{let t=Math.abs(e)<=1?e*100:e;return`${t.toFixed(1)}%`}case`duration`:{if(e<60)return`${Math.round(e)}s`;let t=Math.floor(e/60),n=Math.round(e%60);return`${t}m ${n.toString().padStart(2,`0`)}s`}case`currency`:{let t=e/100;return`$${t.toLocaleString(void 0,{minimumFractionDigits:0,maximumFractionDigits:2})}`}case`number`:default:return e.toLocaleString()}}const o=[`• `,`•• `,`•••`,` ••`,` •`,` `];function s(){let[e,t]=i.useState(0);return i.useEffect(()=>{let e=setInterval(()=>{t(e=>(e+1)%o.length)},180);return()=>clearInterval(e)},[]),e}function c({title:c,value:l,series:u,delta:d,format:f=`number`,loading:p=!1,emptyHint:m,width:h}){let{theme:g}=e(),_=s(),v=i.createElement(r,{color:g.typography.label.color,dimColor:g.typography.label.dim},c.toUpperCase()),y=({children:e})=>i.createElement(n,{flexDirection:`column`,width:h,marginRight:2,minHeight:3},e);if(p)return i.createElement(y,null,v,i.createElement(r,{color:g.accent},o[_]));let b=typeof l==`number`?l:Number(l),x=(l===``||l===`—`||typeof l==`number`&&!Number.isFinite(b))&&(!u||u.length===0);if(x)return i.createElement(y,null,v,i.createElement(r,{color:g.dim},m??`no data yet`));let S=a(l,f),C=typeof h==`number`?Math.max(8,h-4):16,w=u&&u.length>0?t(u,C):``,T=null;if(typeof d==`number`&&Number.isFinite(d)){let e=Math.abs(d*100);T=e<.5?i.createElement(r,{color:g.dim},` `,`→ `,e.toFixed(1),`%`):d>0?i.createElement(r,{color:g.success},` `,`↑ `,e.toFixed(1),`%`):i.createElement(r,{color:g.error},` `,`↓ `,e.toFixed(1),`%`)}return i.createElement(y,null,v,i.createElement(r,{color:g.typography.headline.color,bold:g.typography.headline.bold},S),w?i.createElement(n,{flexDirection:`row`},i.createElement(r,{color:g.accent},w),T):T?i.createElement(n,{flexDirection:`row`},T):i.createElement(n,{height:1}))}export{c as MetricCard};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|