@zenovay/cli 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/{ai-DDefS75j.js → ai-BkP3oeh2.js} +1 -1
  2. package/dist/{analytical-screen-B4xo6sII.js → analytical-screen-BvQa8oH6.js} +1 -1
  3. package/dist/analytics-S6AFt20R.js +1 -0
  4. package/dist/bin.js +5 -5
  5. package/dist/{companies-BFUFJkEM.js → companies-Cpb3yv2Q.js} +1 -1
  6. package/dist/{csv-emit-CmlDBfbA.js → csv-emit-B-5km-O-.js} +1 -1
  7. package/dist/{deploys-DLvmc21H.js → deploys-DZ0IR9Re.js} +1 -1
  8. package/dist/{devices-BMdSSO0o.js → devices-C_NjBY89.js} +1 -1
  9. package/dist/{doctor-BI6TF72T.js → doctor-BsEuqZTb.js} +1 -1
  10. package/dist/{errors-DTs33lNs.js → errors-DPRcy7WT.js} +1 -1
  11. package/dist/{export-BAFQahzg.js → export-DhSRfpg_.js} +1 -1
  12. package/dist/{funnel-CnkLL8HX.js → funnel-Cb4-3RJB.js} +1 -1
  13. package/dist/{geo-B9TL_gUX.js → geo-ReUNKl3F.js} +1 -1
  14. package/dist/{health-C6ZK4ZDk.js → health-DTR77eQW.js} +1 -1
  15. package/dist/{heatmaps-BLVXNROm.js → heatmaps-B-As729q.js} +1 -1
  16. package/dist/{init-CczZwsQf.js → init-igNlvq0N.js} +6 -6
  17. package/dist/{init-DJbtwhvX.js → init-x1CXZTzr.js} +1 -1
  18. package/dist/{insights-J4kYprJu.js → insights-BiqMftak.js} +1 -1
  19. package/dist/{journeys-BRqDOAqs.js → journeys-CogDUObU.js} +1 -1
  20. package/dist/{live-DJsNJ-fo.js → live-BNX4HBCf.js} +1 -1
  21. package/dist/{analytics-ZCtpMy4v.js → overview-CmTIumZy.js} +2 -2
  22. package/dist/overview-L8jqiSuU.js +1 -0
  23. package/dist/{pages-DXd2DGo6.js → pages-BYVz90uO.js} +1 -1
  24. package/dist/{projects-CTXvqzN8.js → projects-BdRZaLg8.js} +1 -1
  25. package/dist/{retention-DWQML_Jo.js → retention-DQHXVSG0.js} +1 -1
  26. package/dist/{revenue-Dm4wls0K.js → revenue-CitFZ4DN.js} +1 -1
  27. package/dist/{self-test-CEclBRpu.js → self-test-BcCqMRQ9.js} +1 -1
  28. package/dist/{sessions-KmEQ4zZp.js → sessions-dPZ32wpz.js} +1 -1
  29. package/dist/{sources-CJQtexqb.js → sources-lvpcvTTz.js} +1 -1
  30. package/dist/{stats-ctt0SOlE.js → stats-EeSDu70A.js} +1 -1
  31. package/dist/{uptime-Dgi5KItw.js → uptime-BA8vRzJQ.js} +1 -1
  32. package/dist/{visitors-CbU2tXXG.js → visitors-mjvSIKkI.js} +1 -1
  33. package/dist/{vitals-3NBHzH_m.js → vitals-D3sMQksQ.js} +1 -1
  34. package/dist/{webhooks-forward-CCd-RyJc.js → webhooks-forward-B8nnKB4f.js} +1 -1
  35. package/dist/wizard-bin.js +1 -1
  36. package/package.json +1 -1
  37. package/dist/watch-GUa_JTOS.js +0 -1
  38. /package/dist/{annotation-aMzsv1oV.js → annotation-CZ2bEuyD.js} +0 -0
  39. /package/dist/{api-keys-x_GGL61a.js → api-keys-CLol-4YC.js} +0 -0
  40. /package/dist/{audit-VHsZwYPM.js → audit-CFlSb0g5.js} +0 -0
  41. /package/dist/{commands-BE8-kQ9U.js → commands-DVRYYbbn.js} +0 -0
  42. /package/dist/{completions-suqE20Pu.js → completions-XLznfo7H.js} +0 -0
  43. /package/dist/{csv-emit-C-9o-imN.js → csv-emit-BiRGo6SK.js} +0 -0
  44. /package/dist/{domains-CNv8-i1K.js → domains-ByXV1O4R.js} +0 -0
  45. /package/dist/{events-tail-CzYtpjey.js → events-tail-DEdVkmT0.js} +0 -0
  46. /package/dist/{examples-DikBW-H2.js → examples-CsQBLv9W.js} +0 -0
  47. /package/dist/{globe-CnpFQ9iU.js → globe-DwaTDQns.js} +0 -0
  48. /package/dist/{goals-DQqxuANi.js → goals-Ds0QZ4H6.js} +0 -0
  49. /package/dist/{health-Cg5Vtq-A.js → health-D6w7hF5q.js} +0 -0
  50. /package/dist/{home-CcQ7J4RY.js → home-DGYBSPWi.js} +0 -0
  51. /package/dist/{integrations-C3z-N73K.js → integrations-CCvt4xb_.js} +0 -0
  52. /package/dist/{logout-u6BpGCg6.js → logout-BoUfEnN9.js} +0 -0
  53. /package/dist/{notes-sFga-5H5.js → notes-BrY4efpr.js} +0 -0
  54. /package/dist/{plans-BhicnNJA.js → plans-DT8hilXl.js} +0 -0
  55. /package/dist/{profile-DsSj1vSw.js → profile-CDY3kFEq.js} +0 -0
  56. /package/dist/{query-Ds3hjKZ8.js → query-DLC0vi-K.js} +0 -0
  57. /package/dist/{range-tabs-BbJdVWNV.js → range-tabs-CH2cEXOf.js} +0 -0
  58. /package/dist/{settings-1kdqZcWp.js → settings-DO8UOasX.js} +0 -0
  59. /package/dist/{share-BsCpBNTV.js → share-BkvKZuPo.js} +0 -0
  60. /package/dist/{site-switcher-B2L1-Pjd.js → site-switcher-BAoYWp18.js} +0 -0
  61. /package/dist/{status-agent-CMpp3zEX.js → status-agent-BLIJc81G.js} +0 -0
  62. /package/dist/{team-CyzZCg--.js → team-Bw6dcpI2.js} +0 -0
  63. /package/dist/{teams-DnOLx5tK.js → teams-cwzXaqBH.js} +0 -0
  64. /package/dist/{telemetry-C-0DECLq.js → telemetry-CgyMy4hV.js} +0 -0
  65. /package/dist/{themes-6H0KlK3b.js → themes-BC8U4Od4.js} +0 -0
  66. /package/dist/{tour-fOYY-mK0.js → tour-ChHRo89U.js} +0 -0
  67. /package/dist/{ui-C5Te-OTJ.js → ui-BTnLAro-.js} +0 -0
  68. /package/dist/{update-C72vyFU1.js → update-DkMxLJbM.js} +0 -0
  69. /package/dist/{usage-BOlapdBM.js → usage-CkyXScnm.js} +0 -0
  70. /package/dist/{use-DBiMOOkB.js → use-BW8rVPgW.js} +0 -0
  71. /package/dist/{webhooks-CrE9paQf.js → webhooks-D1PNfhgJ.js} +0 -0
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{spark as s}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as c}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./bar-NfgovYHe.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as d}from"./analytical-screen-B4xo6sII.js";import"./ui-C5Te-OTJ.js";import{Box as f,Text as p}from"ink";import m from"react";function h(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}`}function g({data:e}){let{theme:t}=o();return m.createElement(f,{flexDirection:`column`},m.createElement(p,null,m.createElement(p,{color:t.accent,bold:!0},h(e.totalAmount,e.currency)),` `,m.createElement(p,{color:t.muted},`total · `,e.totalTransactions,` transactions`)),typeof e.mrr==`number`?m.createElement(p,null,m.createElement(p,{bold:!0},`MRR `),m.createElement(p,{color:t.accent},h(e.mrr,e.currency)),typeof e.arpu==`number`?m.createElement(p,{color:t.muted},` · ARPU `,h(e.arpu,e.currency)):null):null)}function _({data:e}){let{theme:t}=o(),n=e.series.map(e=>e.amount);if(n.length===0)return m.createElement(l,{reason:`no-data`,headline:`No transactions yet`,hint:`Connect a payment provider or widen the window with the 30d / 90d tabs.`});let r=Math.max(...n,1);return m.createElement(f,{flexDirection:`column`},m.createElement(p,{color:t.accent},s(n,Math.min(60,n.length*2))),m.createElement(p,{color:t.muted},`peak: `,h(r,e.currency),` ·`,` `,`avg: `,h(e.totalAmount/Math.max(1,n.length),e.currency)))}function v({data:e}){let{theme:t}=o();return m.createElement(p,{color:t.muted},new Date(e.windowStart).toISOString().slice(0,10),` →`,` `,new Date(e.windowEnd).toISOString().slice(0,10))}async function y(o){let s=await e(),l=await t({strict:!1}),f=new n({config:s,cliVersion:o.cliVersion,token:l}),p,h;try{({siteId:p,site:h}=await c(f,{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 y=i(o),b=o.range??`30d`;return d({cliVersion:o.cliVersion,title:`revenue · ${h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p}`,commandName:`revenue`,ai:{api:f,siteId:p,siteLabel:h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?5*6e4:0,ranges:{windows:[`7d`,`30d`,`90d`]},fetcher:(e,t)=>f.getRevenue(p,t?t===`90d`?`1y`:t:b,e),format:y,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`revenue`,{siteId:p}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{spark as s}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as c}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./bar-NfgovYHe.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as d}from"./analytical-screen-BvQa8oH6.js";import"./ui-BTnLAro-.js";import{Box as f,Text as p}from"ink";import m from"react";function h(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}`}function g({data:e}){let{theme:t}=o();return m.createElement(f,{flexDirection:`column`},m.createElement(p,null,m.createElement(p,{color:t.accent,bold:!0},h(e.totalAmount,e.currency)),` `,m.createElement(p,{color:t.muted},`total · `,e.totalTransactions,` transactions`)),typeof e.mrr==`number`?m.createElement(p,null,m.createElement(p,{bold:!0},`MRR `),m.createElement(p,{color:t.accent},h(e.mrr,e.currency)),typeof e.arpu==`number`?m.createElement(p,{color:t.muted},` · ARPU `,h(e.arpu,e.currency)):null):null)}function _({data:e}){let{theme:t}=o(),n=e.series.map(e=>e.amount);if(n.length===0)return m.createElement(l,{reason:`no-data`,headline:`No transactions yet`,hint:`Connect a payment provider or widen the window with the 30d / 90d tabs.`});let r=Math.max(...n,1);return m.createElement(f,{flexDirection:`column`},m.createElement(p,{color:t.accent},s(n,Math.min(60,n.length*2))),m.createElement(p,{color:t.muted},`peak: `,h(r,e.currency),` ·`,` `,`avg: `,h(e.totalAmount/Math.max(1,n.length),e.currency)))}function v({data:e}){let{theme:t}=o();return m.createElement(p,{color:t.muted},new Date(e.windowStart).toISOString().slice(0,10),` →`,` `,new Date(e.windowEnd).toISOString().slice(0,10))}async function y(o){let s=await e(),l=await t({strict:!1}),f=new n({config:s,cliVersion:o.cliVersion,token:l}),p,h;try{({siteId:p,site:h}=await c(f,{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 y=i(o),b=o.range??`30d`;return d({cliVersion:o.cliVersion,title:`revenue · ${h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p}`,commandName:`revenue`,ai:{api:f,siteId:p,siteLabel:h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?5*6e4:0,ranges:{windows:[`7d`,`30d`,`90d`]},fetcher:(e,t)=>f.getRevenue(p,t?t===`90d`?`1y`:t:b,e),format:y,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`revenue`,{siteId:p}))}}},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=>m.createElement(g,{data:e})},{id:`series`,title:`Daily`,render:e=>m.createElement(_,{data:e})},{id:`window`,title:`Window`,render:e=>m.createElement(v,{data:e})}]})}export{y as revenueCommand};
@@ -1,7 +1,7 @@
1
1
  import{mocha as e}from"./theme-Brz9wK0w.js";import{spawn as t}from"node:child_process";import n from"chalk";const r=3e4,i=4,a=1e3;function o(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 s(e,n,r,i){return new Promise(a=>{let o=/\.[mc]?js$/.test(e),s=o?`node`:e,c=o?[e,...n]:n,l=t(s,c,{env:{...process.env,ZENOVAY_NO_UPDATE_CHECK:`1`,...i},stdio:[`ignore`,`pipe`,`pipe`]}),u=``,d=``,f=!1,p=setTimeout(()=>{f=!0;try{l.kill(`SIGKILL`)}catch{}},r);l.stdout?.on(`data`,e=>{u+=e.toString(`utf8`),u.length>1048576&&(u=u.slice(0,1048576))}),l.stderr?.on(`data`,e=>{d+=e.toString(`utf8`),d.length>1048576&&(d=d.slice(0,1048576))}),l.on(`error`,e=>{clearTimeout(p),a({stdout:u,stderr:d+`\n[spawn error: ${e.message}]`,exitCode:-1,timedOut:f})}),l.on(`close`,e=>{clearTimeout(p),a({stdout:u,stderr:d,exitCode:e??0,timedOut:f})})})}async function c(e,t){let n=Date.now(),i=o(e,t.env);if(i)return{name:e.name,category:e.category,status:`skip`,durationMs:0,reason:i};if(e.inProcess)try{let t=await e.inProcess(),r=Date.now()-n;return t.ok?{name:e.name,category:e.category,status:`pass`,durationMs:r,...t.detail?{detail:t.detail}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:r,reason:t.reason}}catch(t){return{name:e.name,category:e.category,status:`fail`,durationMs:Date.now()-n,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??r,u=await s(t.binPath,e.command,l,c),d=Date.now()-n;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,a),rawStderr:u.stderr.slice(0,a)}:{}};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,a),rawStderr:u.stderr.slice(0,a)}:{}}}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,a),rawStderr:u.stderr.slice(0,a)}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:f.reason,...t.verbose?{rawStdout:u.stdout.slice(0,a),rawStderr:u.stderr.slice(0,a)}:{}}}async function l(e,t){let n=Date.now(),r=Math.max(1,t.parallel??i),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 s=0,l=[],u=async()=>{for(;;){let n=s;if(s+=1,n>=o.length)return;let r=o[n];if(r===void 0)return;let i=e[r];if(!i)continue;let l=await c(i,t);a[r]=l,t.onResult?.(l)}};for(let e=0;e<r;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 u(e){let t={currentTier:null,hasMultipleTeams:!1,hasFreeTeam:!1,authenticated:!1};try{let{readToken:n}=await import(`./token-store-QTNSg4TT.js`),{readConfig:r}=await import(`./config-B72_Kfe0.js`),{ApiV2Client:i}=await import(`./api-v2-Co0dWAP5.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 d(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 f(e,t,n){if(n!==0)return{ok:!1,reason:`exit ${n}`};let r=d(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function p(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=d(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function m(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 h=[{name:`analytics`,category:`ANALYTICS`,command:[`analytics`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(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:f},{name:`pages`,category:`ANALYTICS`,command:[`pages`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(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:f,quick:!0},{name:`devices`,category:`ANALYTICS`,command:[`devices`,`--json`],assert:f},{name:`geo`,category:`ANALYTICS`,command:[`geo`,`--json`],assert:f},{name:`live`,category:`ANALYTICS`,command:[`live`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(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:f},{name:`funnels`,category:`ANALYTICS`,command:[`funnels`,`--json`],assert:p,requires:{tier:`pro`}},{name:`home`,category:`ANALYTICS`,command:[`home`,`--json`],assert:f},{name:`usage`,category:`ANALYTICS`,command:[`usage`,`--json`],assert:f,quick:!0},{name:`stats`,category:`ANALYTICS`,command:[`stats`,`--json`],assert:f},{name:`retention`,category:`BEHAVIOR`,command:[`retention`,`--json`],assert:p,requires:{tier:`pro`}},{name:`uptime`,category:`BEHAVIOR`,command:[`uptime`,`--json`],assert:p,requires:{tier:`pro`}},{name:`sessions`,category:`BEHAVIOR`,command:[`sessions`,`--json`],assert:p,requires:{tier:`pro`}},{name:`heatmaps`,category:`BEHAVIOR`,command:[`heatmaps`,`--json`],assert:p,requires:{tier:`pro`}},{name:`journeys`,category:`BEHAVIOR`,command:[`journeys`,`--json`],assert:p,requires:{tier:`pro`}},{name:`insights`,category:`INTELLIGENCE`,command:[`insights`,`--json`],assert:p,requires:{tier:`pro`}},{name:`domains list`,category:`MANAGE`,command:[`domains`,`list`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(e);return!i.ok||!m(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=f(e,t,n);if(!r.ok)return r;let i=d(e);return!i.ok||!m(i.value)?{ok:!1,reason:`expected list shape`}:{ok:!0}}},{name:`team list`,category:`MANAGE`,command:[`team`,`list`,`--json`],assert:p,requires:{tier:`pro`}},{name:`webhooks list`,category:`MANAGE`,command:[`webhooks`,`list`,`--json`],assert:f},{name:`profile show`,category:`ACCOUNT`,command:[`profile`,`show`,`--json`],assert:f,quick:!0},{name:`plans info`,category:`ACCOUNT`,command:[`plans`,`info`,`--json`],assert:f},{name:`settings get`,category:`ACCOUNT`,command:[`settings`,`get`,`--json`],assert:f},{name:`integrations list`,category:`ACCOUNT`,command:[`integrations`,`list`,`--json`],assert:f},{name:`goals list`,category:`ACCOUNT`,command:[`goals`,`list`,`--json`],assert:p,requires:{tier:`pro`}},{name:`notes list`,category:`ACCOUNT`,command:[`notes`,`list`,`--json`],assert:f},{name:`audit list`,category:`ACCOUNT`,command:[`audit`,`list`,`--json`],assert:p,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:f},{name:`health`,category:`OPERATIONS`,command:[`health`,`--json`],assert:(e,t,n)=>{let r=d(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=f(e,t,n);if(!r.ok)return r;let i=d(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:f},{name:`projects`,category:`OPERATIONS`,command:[`projects`,`--json`],assert:f},{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-DikBW-H2.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=d(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}],g=h.length,_={accent:n.hex(e.accent),success:n.hex(e.success),error:n.hex(e.error),muted:n.hex(e.muted)};async function v(e){let t=(process.execPath||``).split(`/`).pop()||``,n=/^node(\.exe)?$/i.test(t),r=n?process.argv[1]??process.execPath:process.execPath,i=!!e.full||process.env.ZENOVAY_SELF_TEST_FULL===`1`,a=h.filter(e=>i||!e.dev);e.quick&&(a=a.filter(e=>e.quick));let o=await u(e.cliVersion);return e.json?y({...e,binPath:r,env:o,catalog:a}):S({...e,binPath:r,env:o,catalog:a})}async function y(e){let t=await l(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 b=26,x=8;async function S(e){w(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 l(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&&(T(a.category,i.get(a.category)??0),r=a.category),E(a,o),t.delete(a.name),n+=1}}});return D(a),a.fail>0?1:0}function C(){return Math.max(60,process.stdout.columns??80)}function w(e,t,n){let r=Math.min(120,C()),i=r-2,a=`ZENOVAY · v${e}`,o=`self-test · ${t?`quick`:`full`} · ${n} test${n===1?``:`s`}`,s=`╭─ `+a+` `+`─`.repeat(Math.max(0,i-a.length-4))+`╮`,c=`│ `+o+` `.repeat(Math.max(0,i-o.length-2))+`│`,l=`╰`+`─`.repeat(i)+`╯`;process.stdout.write(_.accent(s)+`
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-CsQBLv9W.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=d(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}],g=h.length,_={accent:n.hex(e.accent),success:n.hex(e.success),error:n.hex(e.error),muted:n.hex(e.muted)};async function v(e){let t=(process.execPath||``).split(`/`).pop()||``,n=/^node(\.exe)?$/i.test(t),r=n?process.argv[1]??process.execPath:process.execPath,i=!!e.full||process.env.ZENOVAY_SELF_TEST_FULL===`1`,a=h.filter(e=>i||!e.dev);e.quick&&(a=a.filter(e=>e.quick));let o=await u(e.cliVersion);return e.json?y({...e,binPath:r,env:o,catalog:a}):S({...e,binPath:r,env:o,catalog:a})}async function y(e){let t=await l(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 b=26,x=8;async function S(e){w(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 l(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&&(T(a.category,i.get(a.category)??0),r=a.category),E(a,o),t.delete(a.name),n+=1}}});return D(a),a.fail>0?1:0}function C(){return Math.max(60,process.stdout.columns??80)}function w(e,t,n){let r=Math.min(120,C()),i=r-2,a=`ZENOVAY · v${e}`,o=`self-test · ${t?`quick`:`full`} · ${n} test${n===1?``:`s`}`,s=`╭─ `+a+` `+`─`.repeat(Math.max(0,i-a.length-4))+`╮`,c=`│ `+o+` `.repeat(Math.max(0,i-o.length-2))+`│`,l=`╰`+`─`.repeat(i)+`╯`;process.stdout.write(_.accent(s)+`
5
5
  `),process.stdout.write(_.accent(c)+`
6
6
  `),process.stdout.write(_.accent(l)+`
7
7
 
@@ -1 +1 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{DataTable as f}from"./data-table-BhKjjiOS.js";import{EmptyState as p}from"./empty-state-D-krMX62.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as g}from"./site-switcher-B2L1-Pjd.js";import{Box as _,Text as v,render as y,useApp as b,useInput as x}from"ink";import S,{useEffect as C,useState as w}from"react";import T from"ink-spinner";function E(e){if(!e||e<=0)return`—`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return`${n}m ${(t%60).toString().padStart(2,`0`)}s`}function D(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));return n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:`${Math.floor(n/86400)}d`}async function O(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await d(l,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(a(o)){let e=await l.getSessions(u);return i({type:`sessions.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=y(S.createElement(k,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const k=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:a}=b(),{theme:d}=l(),[y,O]=w(null),[k,A]=w(!0),[j,M]=w(null),[N,P]=w(t),[F,I]=w(n),L=g(e,N,e=>{P(e.id),I(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),O(null)});if(x((e,t)=>{if(L.open){(t.escape||e===`s`)&&L.close();return}if(e===`o`||e===`O`){o(m(`sessions`,{siteId:N}));return}if(e===`s`){L.toggle();return}e===`q`&&(a(),i(0))}),C(()=>{let t=!1;return(async()=>{try{let n=await e.getSessions(N);t||(O(n),A(!1))}catch(e){t||(M(e.message),A(!1))}})(),()=>{t=!0}},[e,N]),k)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(c,{title:`Loading`,state:`busy`},S.createElement(_,null,S.createElement(v,{color:d.accent},S.createElement(T,{type:`dots`})),S.createElement(v,null,` Fetching sessions…`))));if(j)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(p,{reason:`error`,headline:`Failed to load`,hint:j}),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}));if(!y||y.length===0)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(p,{reason:`no-data`,headline:`No replays yet`,hint:`Enable session replay in your site settings, press [s] to switch site, then revisit your site to capture one.`}),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}));let R=[{key:`id`,label:`session id`,width:24},{key:`visitor`,label:`visitor`,width:18},{key:`duration`,label:`duration`,align:`right`,width:9,format:e=>E(e)},{key:`startedAt`,label:`when`,align:`right`,width:6,format:e=>D(String(e))},{key:`pageCount`,label:`events`,align:`right`,width:7},{key:`deviceType`,label:`device`,width:8,format:e=>String(e??`—`)}],z=process.stdout.rows??40,B=Math.max(4,z-15),V=y.slice(0,B),H=y.length-V.length;return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(c,{title:`Recent sessions (${y.length})`},S.createElement(f,{columns:R,data:V,zebra:!0}),H>0?S.createElement(v,{color:d.dim},` +${H} more · run with --json for all`):null),S.createElement(_,{marginTop:1},S.createElement(v,{color:d.dim},`Open any session for replay at https://app.zenovay.com/replay`)),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}],active:`o`}))};export{O as sessionsCommand};
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{DataTable as f}from"./data-table-BhKjjiOS.js";import{EmptyState as p}from"./empty-state-D-krMX62.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as g}from"./site-switcher-BAoYWp18.js";import{Box as _,Text as v,render as y,useApp as b,useInput as x}from"ink";import S,{useEffect as C,useState as w}from"react";import T from"ink-spinner";function E(e){if(!e||e<=0)return`—`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return`${n}m ${(t%60).toString().padStart(2,`0`)}s`}function D(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));return n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:`${Math.floor(n/86400)}d`}async function O(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await d(l,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(a(o)){let e=await l.getSessions(u);return i({type:`sessions.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=y(S.createElement(k,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const k=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:a}=b(),{theme:d}=l(),[y,O]=w(null),[k,A]=w(!0),[j,M]=w(null),[N,P]=w(t),[F,I]=w(n),L=g(e,N,e=>{P(e.id),I(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),O(null)});if(x((e,t)=>{if(L.open){(t.escape||e===`s`)&&L.close();return}if(e===`o`||e===`O`){o(m(`sessions`,{siteId:N}));return}if(e===`s`){L.toggle();return}e===`q`&&(a(),i(0))}),C(()=>{let t=!1;return(async()=>{try{let n=await e.getSessions(N);t||(O(n),A(!1))}catch(e){t||(M(e.message),A(!1))}})(),()=>{t=!0}},[e,N]),k)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(c,{title:`Loading`,state:`busy`},S.createElement(_,null,S.createElement(v,{color:d.accent},S.createElement(T,{type:`dots`})),S.createElement(v,null,` Fetching sessions…`))));if(j)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(p,{reason:`error`,headline:`Failed to load`,hint:j}),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}));if(!y||y.length===0)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(p,{reason:`no-data`,headline:`No replays yet`,hint:`Enable session replay in your site settings, press [s] to switch site, then revisit your site to capture one.`}),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}));let R=[{key:`id`,label:`session id`,width:24},{key:`visitor`,label:`visitor`,width:18},{key:`duration`,label:`duration`,align:`right`,width:9,format:e=>E(e)},{key:`startedAt`,label:`when`,align:`right`,width:6,format:e=>D(String(e))},{key:`pageCount`,label:`events`,align:`right`,width:7},{key:`deviceType`,label:`device`,width:8,format:e=>String(e??`—`)}],z=process.stdout.rows??40,B=Math.max(4,z-15),V=y.slice(0,B),H=y.length-V.length;return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(c,{title:`Recent sessions (${y.length})`},S.createElement(f,{columns:R,data:V,zebra:!0}),H>0?S.createElement(v,{color:d.dim},` +${H} more · run with --json for all`):null),S.createElement(_,{marginTop:1},S.createElement(v,{color:d.dim},`Open any session for replay at https://app.zenovay.com/replay`)),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}],active:`o`}))};export{O as sessionsCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{Bar as u}from"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-B4xo6sII.js";import{Box as p,Text as m}from"ink";import h from"react";function g(e){return e==null?{glyph:`·`,tone:`neutral`}:e>.5?{glyph:`▲`,tone:`up`}:e<-.5?{glyph:`▼`,tone:`down`}:{glyph:`→`,tone:`neutral`}}function _({data:e}){let{theme:t}=o();return h.createElement(m,null,h.createElement(m,{bold:!0},e.totalVisitors.toLocaleString()),` `,h.createElement(m,{color:t.muted},`visitors · `,e.sources.length,` sources`))}function v({data:e}){let{theme:t}=o();if(e.sources.length===0)return h.createElement(l,{reason:`no-data`,headline:`No source data yet`,hint:`Visit your site so referrers can be attributed, or widen the window with the number keys.`});let n={up:t.success,down:t.accent2,neutral:t.muted},r=e.totalVisitors||1,i=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return h.createElement(p,{flexDirection:`column`},i.map((e,i)=>{let a=e.visitors/r*100,o=g(e.delta);return h.createElement(p,{key:`${e.source}-${i}`,flexDirection:`row`},h.createElement(p,{width:20,marginRight:1,flexShrink:0},h.createElement(m,{wrap:`truncate`},e.source)),h.createElement(p,{flexShrink:0},h.createElement(u,{value:e.visitors,max:r,width:30,showPercent:!1,track:!0})),h.createElement(p,{width:7,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.fg},e.visitors.toLocaleString())),h.createElement(p,{width:8,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.muted},a.toFixed(1),`%`)),h.createElement(p,{width:2,marginLeft:1,flexShrink:0},h.createElement(m,{color:n[o.tone]},o.glyph)))}))}function y({data:e,columns:t}){return e.sources.length===0?h.createElement(l,{reason:`no-data`,headline:`No source data yet`,hint:`Visit your site so referrers can be attributed, or widen the window with [1-4].`}):h.createElement(c,{data:e.sources.slice(0,20),columns:t,headerStyle:`accent`})}async function b(o){let c=await e(),l=await t({strict:!1}),u=new n({config:c,cliVersion:o.cliVersion,token:l}),p,m;try{({siteId:p,site:m}=await s(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 g=i(o),b=o.period??`30d`,x=[{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 f({cliVersion:o.cliVersion,title:`sources · ${m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p}`,commandName:`sources`,authToken:l?.accessToken??null,refreshIntervalMs:6e4,ranges:{windows:[`7d`,`30d`,`90d`]},fetcher:(e,t)=>u.getSources(p,t&&t!==`24h`?t:b,o.compare,e),format:g,ai:{api:u,siteId:p,siteLabel:m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p},keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`sources`,{siteId:p}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{Bar as u}from"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as f}from"./analytical-screen-BvQa8oH6.js";import{Box as p,Text as m}from"ink";import h from"react";function g(e){return e==null?{glyph:`·`,tone:`neutral`}:e>.5?{glyph:`▲`,tone:`up`}:e<-.5?{glyph:`▼`,tone:`down`}:{glyph:`→`,tone:`neutral`}}function _({data:e}){let{theme:t}=o();return h.createElement(m,null,h.createElement(m,{bold:!0},e.totalVisitors.toLocaleString()),` `,h.createElement(m,{color:t.muted},`visitors · `,e.sources.length,` sources`))}function v({data:e}){let{theme:t}=o();if(e.sources.length===0)return h.createElement(l,{reason:`no-data`,headline:`No source data yet`,hint:`Visit your site so referrers can be attributed, or widen the window with the number keys.`});let n={up:t.success,down:t.accent2,neutral:t.muted},r=e.totalVisitors||1,i=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return h.createElement(p,{flexDirection:`column`},i.map((e,i)=>{let a=e.visitors/r*100,o=g(e.delta);return h.createElement(p,{key:`${e.source}-${i}`,flexDirection:`row`},h.createElement(p,{width:20,marginRight:1,flexShrink:0},h.createElement(m,{wrap:`truncate`},e.source)),h.createElement(p,{flexShrink:0},h.createElement(u,{value:e.visitors,max:r,width:30,showPercent:!1,track:!0})),h.createElement(p,{width:7,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.fg},e.visitors.toLocaleString())),h.createElement(p,{width:8,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.muted},a.toFixed(1),`%`)),h.createElement(p,{width:2,marginLeft:1,flexShrink:0},h.createElement(m,{color:n[o.tone]},o.glyph)))}))}function y({data:e,columns:t}){return e.sources.length===0?h.createElement(l,{reason:`no-data`,headline:`No source data yet`,hint:`Visit your site so referrers can be attributed, or widen the window with [1-4].`}):h.createElement(c,{data:e.sources.slice(0,20),columns:t,headerStyle:`accent`})}async function b(o){let c=await e(),l=await t({strict:!1}),u=new n({config:c,cliVersion:o.cliVersion,token:l}),p,m;try{({siteId:p,site:m}=await s(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 g=i(o),b=o.period??`30d`,x=[{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 f({cliVersion:o.cliVersion,title:`sources · ${m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p}`,commandName:`sources`,authToken:l?.accessToken??null,refreshIntervalMs:6e4,ranges:{windows:[`7d`,`30d`,`90d`]},fetcher:(e,t)=>u.getSources(p,t&&t!==`24h`?t:b,o.compare,e),format:g,ai:{api:u,siteId:p,siteLabel:m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p},keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`sources`,{siteId:p}))}}},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=>h.createElement(_,{data:e})},{id:`channels`,title:`By channel`,render:e=>h.createElement(v,{data:e})},{id:`table`,title:`Detail`,render:e=>h.createElement(y,{data:e,columns:x})}]})}export{b as sourcesCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as a}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as o}from"./resolve-site-BTVBMF1C.js";import{DataTable as s}from"./data-table-BhKjjiOS.js";import{EmptyState as c}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as l}from"./analytical-screen-B4xo6sII.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e){return`${(e*100).toFixed(1)}%`}function m(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`}const h=({data:e})=>{let{theme:t}=a();return f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{bold:!0},e.visitors.toLocaleString()),f.createElement(d,{color:t.muted},` visitors `),f.createElement(d,{bold:!0},e.pageviews.toLocaleString()),f.createElement(d,{color:t.muted},` pageviews `),f.createElement(d,{bold:!0},e.sessions.toLocaleString()),f.createElement(d,{color:t.muted},` sessions`)),f.createElement(d,{color:t.muted},`bounce `,p(e.bounceRate),` · avg session `,m(e.avgSessionSec)))};async function g(a){let u=await e(),d=await t({strict:!1}),g=new n({config:u,cliVersion:a.cliVersion,token:d}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:a.siteId,headless:!!(a.json||a.csv||a.tsv||a.ndjson),cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(a),b=a.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 l({cliVersion:a.cliVersion,title:`stats · ${v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_}`,commandName:`stats`,ranges:{windows:[`24h`,`7d`,`30d`]},ai:{api:g,siteId:_,siteLabel:v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_},authToken:d?.accessToken??null,refreshIntervalMs:a.watch?6e4:0,fetcher:(e,t)=>g.getStats(_,t??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(`
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as a}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as o}from"./resolve-site-BTVBMF1C.js";import{DataTable as s}from"./data-table-BhKjjiOS.js";import{EmptyState as c}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as l}from"./analytical-screen-BvQa8oH6.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e){return`${(e*100).toFixed(1)}%`}function m(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`}const h=({data:e})=>{let{theme:t}=a();return f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{bold:!0},e.visitors.toLocaleString()),f.createElement(d,{color:t.muted},` visitors `),f.createElement(d,{bold:!0},e.pageviews.toLocaleString()),f.createElement(d,{color:t.muted},` pageviews `),f.createElement(d,{bold:!0},e.sessions.toLocaleString()),f.createElement(d,{color:t.muted},` sessions`)),f.createElement(d,{color:t.muted},`bounce `,p(e.bounceRate),` · avg session `,m(e.avgSessionSec)))};async function g(a){let u=await e(),d=await t({strict:!1}),g=new n({config:u,cliVersion:a.cliVersion,token:d}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:a.siteId,headless:!!(a.json||a.csv||a.tsv||a.ndjson),cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(a),b=a.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 l({cliVersion:a.cliVersion,title:`stats · ${v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_}`,commandName:`stats`,ranges:{windows:[`24h`,`7d`,`30d`]},ai:{api:g,siteId:_,siteLabel:v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_},authToken:d?.accessToken??null,refreshIntervalMs:a.watch?6e4:0,fetcher:(e,t)=>g.getStats(_,t??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:p(e.bounceRate),avgSession:m(e.avgSessionSec)}],[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSession`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>f.createElement(h,{data:e})},{id:`pages`,title:`Top pages`,render:e=>e.topPages.length===0?f.createElement(c,{reason:`no-data`,headline:`No pages yet`,hint:`No page views in the ${b} window.`}):f.createElement(s,{data:e.topPages.slice(0,10),columns:x,headerStyle:`accent`})},{id:`countries`,title:`Top countries`,render:e=>e.topCountries.length===0?f.createElement(c,{reason:`no-data`,headline:`No country data yet`,hint:`No located visitors in the ${b} window.`}):f.createElement(s,{data:e.topCountries.slice(0,10),columns:S,headerStyle:`accent`})}]})}export{g as statsCommand};
@@ -1 +1 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{stripUrlPrefix as f}from"./fmt-xxIPQJX-.js";import{DataTable as p}from"./data-table-BhKjjiOS.js";import{EmptyState as m}from"./empty-state-D-krMX62.js";import{deepLinkFor as h}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as g}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as _}from"./site-switcher-B2L1-Pjd.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){return e===`up`?`● up`:e===`down`?`● down`:`○ unknown`}function O(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.round((t-Date.now())/(1e3*60*60*24));return`${n}d`}function k(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function A(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await d(l,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(a(o)){let e=await l.getUptime(u);return i({type:`uptime.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=b(C.createElement(j,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const j=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{g();let{exit:a}=x(),{theme:d}=l(),[b,A]=T(null),[j,M]=T(!0),[N,P]=T(null),[ee,F]=T(0),[I,L]=T(!1),[R,z]=T(null),[B,V]=T(()=>Date.now()),[H,U]=T(t),[W,G]=T(n),K=_(e,H,e=>{U(e.id),G(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),A(null)}),q=[{key:`r`,label:`refresh`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}];if(S((e,t)=>{if(K.open){(t.escape||e===`s`)&&K.close();return}if(e===`r`||e===`R`){F(e=>e+1);return}if(e===`s`){K.toggle();return}if(e===`o`||e===`O`){o(h(`uptime`,{siteId:H}));return}e===`q`&&(a(),i(0))}),w(()=>{let e=setInterval(()=>V(Date.now()),5e3),t=setInterval(()=>F(e=>e+1),3e4);return()=>{clearInterval(e),clearInterval(t)}},[]),w(()=>{let t=!1;return b===null?M(!0):L(!0),(async()=>{try{let n=await e.getUptime(H);if(t)return;A(n.monitors),M(!1),L(!1),z(Date.now())}catch(e){t||(P(e.message),M(!1),L(!1))}})(),()=>{t=!0}},[e,H,ee]),j)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(c,{title:`Loading`,state:`busy`},C.createElement(v,null,C.createElement(y,{color:d.accent},C.createElement(E,{type:`dots`})),C.createElement(y,null,` Fetching monitors…`))));if(N)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(m,{reason:`error`,headline:`Couldn't load monitors`,hint:N}),C.createElement(u,{items:q,active:`r`}));if(!b||b.length===0)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(m,{reason:`no-data`,headline:`No monitors configured`,hint:`Add an uptime monitor at app.zenovay.com/uptime, press [s] to switch site, then re-run.`}),K.overlay,C.createElement(u,{items:q,active:`r`}));let J=[{key:`url`,label:`monitor`,width:36,format:e=>f(String(e??``))},{key:`status`,label:`status`,width:11,format:e=>D(String(e))},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:8,format:e=>O(e)}],Y=process.stdout.rows??40,X=Math.max(4,Y-16),Z=b.slice(0,X),Q=b.length-Z.length,$=b.filter(e=>e.status===`down`).length,te=b.filter(e=>e.status===`up`).length;return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!0}),C.createElement(v,{marginTop:1,flexDirection:`row`},C.createElement(y,{color:d.success},te,` up`),C.createElement(y,{color:d.dim},` · `),C.createElement(y,{color:$>0?d.error:d.dim},$,` down`)),C.createElement(v,{marginTop:1},C.createElement(c,{title:`Monitors (${b.length})`},C.createElement(p,{columns:J,data:Z,zebra:!0}),Q>0?C.createElement(y,{color:d.dim},` +${Q} more · run with --json for all`):null)),C.createElement(v,{marginTop:1},C.createElement(y,{color:d.dim},I?`↻ refreshing…`:R===null?``:`↻ updated ${k(R,B)} · [r] refresh`)),K.overlay,C.createElement(u,{items:q,active:`r`}))};export{A as uptimeCommand};
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{stripUrlPrefix as f}from"./fmt-xxIPQJX-.js";import{DataTable as p}from"./data-table-BhKjjiOS.js";import{EmptyState as m}from"./empty-state-D-krMX62.js";import{deepLinkFor as h}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as g}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as _}from"./site-switcher-BAoYWp18.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){return e===`up`?`● up`:e===`down`?`● down`:`○ unknown`}function O(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.round((t-Date.now())/(1e3*60*60*24));return`${n}d`}function k(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function A(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await d(l,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??u;if(a(o)){let e=await l.getUptime(u);return i({type:`uptime.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=b(C.createElement(j,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const j=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{g();let{exit:a}=x(),{theme:d}=l(),[b,A]=T(null),[j,M]=T(!0),[N,P]=T(null),[ee,F]=T(0),[I,L]=T(!1),[R,z]=T(null),[B,V]=T(()=>Date.now()),[H,U]=T(t),[W,G]=T(n),K=_(e,H,e=>{U(e.id),G(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),A(null)}),q=[{key:`r`,label:`refresh`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}];if(S((e,t)=>{if(K.open){(t.escape||e===`s`)&&K.close();return}if(e===`r`||e===`R`){F(e=>e+1);return}if(e===`s`){K.toggle();return}if(e===`o`||e===`O`){o(h(`uptime`,{siteId:H}));return}e===`q`&&(a(),i(0))}),w(()=>{let e=setInterval(()=>V(Date.now()),5e3),t=setInterval(()=>F(e=>e+1),3e4);return()=>{clearInterval(e),clearInterval(t)}},[]),w(()=>{let t=!1;return b===null?M(!0):L(!0),(async()=>{try{let n=await e.getUptime(H);if(t)return;A(n.monitors),M(!1),L(!1),z(Date.now())}catch(e){t||(P(e.message),M(!1),L(!1))}})(),()=>{t=!0}},[e,H,ee]),j)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(c,{title:`Loading`,state:`busy`},C.createElement(v,null,C.createElement(y,{color:d.accent},C.createElement(E,{type:`dots`})),C.createElement(y,null,` Fetching monitors…`))));if(N)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(m,{reason:`error`,headline:`Couldn't load monitors`,hint:N}),C.createElement(u,{items:q,active:`r`}));if(!b||b.length===0)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(m,{reason:`no-data`,headline:`No monitors configured`,hint:`Add an uptime monitor at app.zenovay.com/uptime, press [s] to switch site, then re-run.`}),K.overlay,C.createElement(u,{items:q,active:`r`}));let J=[{key:`url`,label:`monitor`,width:36,format:e=>f(String(e??``))},{key:`status`,label:`status`,width:11,format:e=>D(String(e))},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:8,format:e=>O(e)}],Y=process.stdout.rows??40,X=Math.max(4,Y-16),Z=b.slice(0,X),Q=b.length-Z.length,$=b.filter(e=>e.status===`down`).length,te=b.filter(e=>e.status===`up`).length;return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!0}),C.createElement(v,{marginTop:1,flexDirection:`row`},C.createElement(y,{color:d.success},te,` up`),C.createElement(y,{color:d.dim},` · `),C.createElement(y,{color:$>0?d.error:d.dim},$,` down`)),C.createElement(v,{marginTop:1},C.createElement(c,{title:`Monitors (${b.length})`},C.createElement(p,{columns:J,data:Z,zebra:!0}),Q>0?C.createElement(y,{color:d.dim},` +${Q} more · run with --json for all`):null)),C.createElement(v,{marginTop:1},C.createElement(y,{color:d.dim},I?`↻ refreshing…`:R===null?``:`↻ updated ${k(R,B)} · [r] refresh`)),K.overlay,C.createElement(u,{items:q,active:`r`}))};export{A as uptimeCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{brailleSpark as s,spark as c}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as l}from"./resolve-site-BTVBMF1C.js";import{DataTable as u}from"./data-table-BhKjjiOS.js";import{EmptyState as d}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as f}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as p}from"./analytical-screen-B4xo6sII.js";import{Box as m,Text as h}from"ink";import g from"react";function _(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}function v(e){let t=e,n=t.events??t.timeseries;return Array.isArray(n)&&n.length>0?c(n,8):`▁▁▁▁▁▁▁▁`}function y(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 b(o){let s=await e(),c=await t({strict:!1}),u=new n({config:s,cliVersion:o.cliVersion,token:c}),d,m;try{({siteId:d,site:m}=await l(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 h=m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??d,b=i(o),C=o.limit??50,w=typeof o.minDuration==`number`&&o.minDuration>0?o.minDuration:0,T=e=>w<=0?e:e.filter(e=>y(e)>=w),E=6e4,D=e=>{let t=Date.parse(e.startedAt);return Number.isFinite(t)&&Date.now()-t<E},O=[{key:`startedAt`,label:``,width:5,format:(e,t)=>D(t)?`● new`:``},{key:`startedAt`,label:`when`,width:6,format:e=>_(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)=>v(t)}];return p({cliVersion:o.cliVersion,title:`visitors · ${h}`,commandName:`visitors`,ai:{api:u,siteId:d,siteLabel:h},authToken:c?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>u.getVisitors(d,{limit:C},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(f(`visitors`,{siteId:d}))}}},headlessEmit:(e,t)=>{let n={...e,visitors:T(e.visitors)};if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(n,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{brailleSpark as s,spark as c}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as l}from"./resolve-site-BTVBMF1C.js";import{DataTable as u}from"./data-table-BhKjjiOS.js";import{EmptyState as d}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as f}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as p}from"./analytical-screen-BvQa8oH6.js";import{Box as m,Text as h}from"ink";import g from"react";function _(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}function v(e){let t=e,n=t.events??t.timeseries;return Array.isArray(n)&&n.length>0?c(n,8):`▁▁▁▁▁▁▁▁`}function y(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 b(o){let s=await e(),c=await t({strict:!1}),u=new n({config:s,cliVersion:o.cliVersion,token:c}),d,m;try{({siteId:d,site:m}=await l(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 h=m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??d,b=i(o),C=o.limit??50,w=typeof o.minDuration==`number`&&o.minDuration>0?o.minDuration:0,T=e=>w<=0?e:e.filter(e=>y(e)>=w),E=6e4,D=e=>{let t=Date.parse(e.startedAt);return Number.isFinite(t)&&Date.now()-t<E},O=[{key:`startedAt`,label:``,width:5,format:(e,t)=>D(t)?`● new`:``},{key:`startedAt`,label:`when`,width:6,format:e=>_(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)=>v(t)}];return p({cliVersion:o.cliVersion,title:`visitors · ${h}`,commandName:`visitors`,ai:{api:u,siteId:d,siteLabel:h},authToken:c?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>u.getVisitors(d,{limit:C},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(f(`visitors`,{siteId:d}))}}},headlessEmit:(e,t)=>{let n={...e,visitors:T(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=>g.createElement(x,{visitors:T(e.visitors)})},{id:`visitors`,title:`Active sessions`,render:e=>g.createElement(S,{visitors:T(e.visitors),limit:C,columns:O})}]})}const x=({visitors:e})=>{let{theme:t}=o(),n=[...e].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)),r=n[0],i=Array(24*6).fill(0),a=Date.now();for(let t of e){let e=a-new Date(t.startedAt).getTime(),n=Math.floor(e/(10*60*1e3));n>=0&&n<i.length&&(i[i.length-1-n]+=1)}return g.createElement(m,{flexDirection:`column`},g.createElement(h,{bold:!0},e.length,` live`),g.createElement(h,{color:t.muted},s(i,40)),r?g.createElement(h,{color:t.muted},`top: `,r.city??r.country??`—`,` · `,r.page??`—`):null)},S=({visitors:e,limit:t,columns:n})=>{let r=[...e].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)).slice(0,t);return r.length===0?g.createElement(d,{reason:`no-data`,headline:`No active sessions yet`,hint:`Visitors appear here as they browse — this view polls every 10s.`}):g.createElement(u,{columns:n,data:r,headerStyle:`accent`})};export{b as visitorsCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as d}from"./analytical-screen-B4xo6sII.js";import{Box as f,Text as p}from"ink";import m from"react";const h={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 g(e,t){let n=h[e];return t<=n.good?{label:`good`,tone:`good`}:t<=n.poor?{label:`needs`,tone:`needs`}:{label:`poor`,tone:`poor`}}function _(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function v({data:e}){let{theme:t}=o(),n={good:t.success,needs:t.warn,poor:t.error},r=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},i=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return m.createElement(f,{flexDirection:`column`},i.map(e=>{let t=r(e),i=g(e,t);return m.createElement(p,{key:e},m.createElement(p,{color:n[i.tone]},`● `),m.createElement(p,{bold:!0},e.toUpperCase().padEnd(5)),` `,m.createElement(p,null,_(e,t).padStart(8)),` `,m.createElement(p,{color:n[i.tone]},i.label))}))}function y({data:e,columns:t}){return e.vitals.length===0?m.createElement(l,{reason:`no-data`,headline:`No vitals data yet`,hint:`Core Web Vitals appear once real visitors load instrumented pages.`}):m.createElement(c,{data:e.vitals.slice(0,15),columns:t,headerStyle:`accent`})}async function b(o){let c=await e(),l=await t({strict:!1}),f=new n({config:c,cliVersion:o.cliVersion,token:l}),p,h;try{({siteId:p,site:h}=await s(f,{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 g=i(o),b=[{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?_(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?_(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?_(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return d({cliVersion:o.cliVersion,title:`vitals · ${h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p}`,commandName:`vitals`,ai:{api:f,siteId:p,siteLabel:h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?5*6e4:0,ranges:!0,fetcher:(e,t)=>f.getVitals(p,{url:o.url,device:o.device,window:t??o.window},e),format:g,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`vitals`,{siteId:p}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as d}from"./analytical-screen-BvQa8oH6.js";import{Box as f,Text as p}from"ink";import m from"react";const h={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 g(e,t){let n=h[e];return t<=n.good?{label:`good`,tone:`good`}:t<=n.poor?{label:`needs`,tone:`needs`}:{label:`poor`,tone:`poor`}}function _(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function v({data:e}){let{theme:t}=o(),n={good:t.success,needs:t.warn,poor:t.error},r=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},i=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return m.createElement(f,{flexDirection:`column`},i.map(e=>{let t=r(e),i=g(e,t);return m.createElement(p,{key:e},m.createElement(p,{color:n[i.tone]},`● `),m.createElement(p,{bold:!0},e.toUpperCase().padEnd(5)),` `,m.createElement(p,null,_(e,t).padStart(8)),` `,m.createElement(p,{color:n[i.tone]},i.label))}))}function y({data:e,columns:t}){return e.vitals.length===0?m.createElement(l,{reason:`no-data`,headline:`No vitals data yet`,hint:`Core Web Vitals appear once real visitors load instrumented pages.`}):m.createElement(c,{data:e.vitals.slice(0,15),columns:t,headerStyle:`accent`})}async function b(o){let c=await e(),l=await t({strict:!1}),f=new n({config:c,cliVersion:o.cliVersion,token:l}),p,h;try{({siteId:p,site:h}=await s(f,{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 g=i(o),b=[{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?_(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?_(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?_(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return d({cliVersion:o.cliVersion,title:`vitals · ${h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p}`,commandName:`vitals`,ai:{api:f,siteId:p,siteLabel:h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?5*6e4:0,ranges:!0,fetcher:(e,t)=>f.getVitals(p,{url:o.url,device:o.device,window:t??o.window},e),format:g,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`vitals`,{siteId:p}))}}},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=>m.createElement(v,{data:e})},{id:`pages`,title:`Per-page`,render:e=>m.createElement(y,{data:e,columns:b})}]})}export{b as vitalsCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./theme-Brz9wK0w.js";import{Banner as r,Panel as i,useTheme as a}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import{Keybar as o}from"./keybar-DO5OoZy9.js";import"./sparkline-CpoBjjlc.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import"./bar-NfgovYHe.js";import"./ui-C5Te-OTJ.js";import{Box as c,Text as l,render as u,useApp as d,useInput as f}from"ink";import p,{useEffect as m,useState as h}from"react";function g(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function _(e,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 v({label:e,value:t,valueColor:n}){let{theme:r}=a();return p.createElement(c,{flexDirection:`row`},p.createElement(c,{width:14},p.createElement(l,{color:r.dim},e.toUpperCase())),p.createElement(c,{flexGrow:1},p.createElement(l,{color:n??r.fg,wrap:`truncate`},t)))}function y({stats:e,target:t}){let{theme:n}=a();return p.createElement(i,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},p.createElement(v,{label:`public url`,value:e.publicUrl,valueColor:n.accent}),p.createElement(v,{label:`forwarding to`,value:t}),p.createElement(c,{flexDirection:`row`,marginTop:1},e.connected?p.createElement(l,{color:n.success},`● connected`):p.createElement(l,{color:n.warn},`○ connecting…`),p.createElement(l,{color:n.muted},` · `,e.total,` requests · `),p.createElement(l,{color:n.success},e.ok,` ok`),p.createElement(l,{color:n.muted},` · `),p.createElement(l,{color:e.err>0?n.error:n.muted},e.err,` err`),e.lastStatus===null?null:p.createElement(l,{color:n.muted},` · last HTTP `,e.lastStatus)),e.lastError?p.createElement(c,{flexDirection:`row`},p.createElement(l,{color:n.error,wrap:`truncate`},`last error: `,e.lastError)):null)}async function b(i){let v=await e(),b=await t({strict:!1});if(!b?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;if(!i.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./theme-Brz9wK0w.js";import{Banner as r,Panel as i,useTheme as a}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import{Keybar as o}from"./keybar-DO5OoZy9.js";import"./sparkline-CpoBjjlc.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import"./bar-NfgovYHe.js";import"./ui-BTnLAro-.js";import{Box as c,Text as l,render as u,useApp as d,useInput as f}from"ink";import p,{useEffect as m,useState as h}from"react";function g(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function _(e,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 v({label:e,value:t,valueColor:n}){let{theme:r}=a();return p.createElement(c,{flexDirection:`row`},p.createElement(c,{width:14},p.createElement(l,{color:r.dim},e.toUpperCase())),p.createElement(c,{flexGrow:1},p.createElement(l,{color:n??r.fg,wrap:`truncate`},t)))}function y({stats:e,target:t}){let{theme:n}=a();return p.createElement(i,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},p.createElement(v,{label:`public url`,value:e.publicUrl,valueColor:n.accent}),p.createElement(v,{label:`forwarding to`,value:t}),p.createElement(c,{flexDirection:`row`,marginTop:1},e.connected?p.createElement(l,{color:n.success},`● connected`):p.createElement(l,{color:n.warn},`○ connecting…`),p.createElement(l,{color:n.muted},` · `,e.total,` requests · `),p.createElement(l,{color:n.success},e.ok,` ok`),p.createElement(l,{color:n.muted},` · `),p.createElement(l,{color:e.err>0?n.error:n.muted},e.err,` err`),e.lastStatus===null?null:p.createElement(l,{color:n.muted},` · last HTTP `,e.lastStatus)),e.lastError?p.createElement(c,{flexDirection:`row`},p.createElement(l,{color:n.error,wrap:`truncate`},`last error: `,e.lastError)):null)}async function b(i){let v=await e(),b=await t({strict:!1});if(!b?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;if(!i.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
2
2
  `),2;let x=i.to.match(/^https?:\/\//)?i.to:`http://${i.to}`,S=new n({config:v,cliVersion:i.cliVersion,token:b}),C,w;try{({siteId:C,site:w}=await s(S,{explicit:i.siteId,headless:!1,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let T=w?.url?w.url.replace(/^https?:\/\//,``).replace(/\/$/,``):w?.name??C,E;try{E=await S.createTunnel(C,i.to)}catch(e){return process.stderr.write(`Failed to register tunnel: ${e.message}\n`),1}let D=i.sign?i.secret??E.tunnelKey:null,O=()=>{let{theme:e}=a(),{exit:t}=d(),[n,s]=h({total:0,ok:0,err:0,lastStatus:null,lastError:null,lastForwardedAt:null,publicUrl:E.publicUrl,wsUrl:E.wsUrl,connected:!1}),[u,v]=h(()=>Date.now());m(()=>{let e=setInterval(()=>v(Date.now()),5e3);return()=>clearInterval(e)},[]),f((e,n)=>{(e===`q`||n.escape)&&t()}),m(()=>{let e=new AbortController,t=async e=>{try{let t={...e.headers};delete t.host,delete t[`content-length`],D&&(t[`X-Zenovay-Signature`]=`sha256=${await _(D,e.body)}`);let n=await fetch(x,{method:e.method,headers:t,body:e.method===`GET`||e.method===`HEAD`?void 0:e.body}),r=await n.text(),i={};return n.headers.forEach((e,t)=>{i[t]=e}),s(e=>({...e,total:e.total+1,ok:e.ok+(n.ok?1:0),err:e.err+(n.ok?0:1),lastStatus:n.status,lastError:n.ok?null:`HTTP ${n.status}`,lastForwardedAt:Date.now()})),{status:n.status,headers:i,body:r}}catch(e){let t=e instanceof Error?e.message:String(e);return s(e=>({...e,total:e.total+1,err:e.err+1,lastError:t,lastForwardedAt:Date.now()})),{status:502,body:JSON.stringify({error:`cli_local_failed`,detail:t})}}};return(async()=>{let n=S.tunnelClient(E.wsUrl);s(e=>({...e,connected:!0}));try{await n.start(t,e.signal)}catch(e){s(t=>({...t,connected:!1,lastError:e.message}))}})(),()=>{e.abort()}},[]);let b=n.lastForwardedAt===null?n.connected?`↻ live · waiting for first webhook`:`↻ connecting…`:`↻ last forward ${g(n.lastForwardedAt,u)}`;return p.createElement(c,{flexDirection:`column`},p.createElement(r,{version:i.cliVersion,subtitle:`webhooks forward · ${T} · ${n.connected?`live`:`connecting`}`,live:n.connected}),p.createElement(y,{stats:n,target:`${x}${i.sign?` · HMAC-signed`:``}`}),p.createElement(c,{marginTop:1},p.createElement(l,{color:e.dim},b)),p.createElement(o,{items:[{key:`q`,label:`quit`},{key:`esc`,label:`quit`}]}))},{waitUntilExit:k}=u(p.createElement(O,null));return await k(),0}export{b as webhooksForwardCommand};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import(`./init-DJbtwhvX.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)});
2
+ import(`./init-x1CXZTzr.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,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenovay/cli",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Zenovay CLI — AI install wizard + full terminal analytics dashboard",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import{parseSseStream as o}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{spark as d}from"./sparkline-CpoBjjlc.js";import{resolveSiteId as f}from"./resolve-site-BTVBMF1C.js";import{stripUrlPrefix as p}from"./fmt-xxIPQJX-.js";import{EmptyState as m}from"./empty-state-D-krMX62.js";import{tileWidths as h}from"./grid-CMwhs-Ms.js";import{deepLinkFor as g}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as _}from"./use-fullscreen-ucSyZkjO.js";import{z as v}from"zod";import{Box as y,Text as b,render as x,useApp as ee,useInput as te}from"ink";import S,{useEffect as C,useState as w}from"react";import ne from"ink-spinner";import T from"ink-text-input";const E=Math.PI*2;function D(e){let t=e,n=Math.PI*Math.sin(e);for(let e=0;e<6;e++){let e=2*t+Math.sin(2*t)-n,r=2+2*Math.cos(2*t);if(r===0)break;t-=e/r}return t}function O(e,t){if(e<-90||e>90||t<-180||t>180)return null;let n=e*Math.PI/180,r=t*Math.PI/180,i=D(n),a=r*Math.cos(i)/Math.PI,o=Math.sin(i);return{x:a,y:o}}function k(e){if(e)return!0;let t=process.env;if(t.NO_COLOR||t.ZENOVAY_GLOBE===`ascii`)return!0;let n=(t.LANG||t.LC_ALL||t.LC_CTYPE||``).toLowerCase();return!!(n&&!n.includes(`utf`))}function A(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function j(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function M(e){let t=e.dw/2,n=e.dh/2,r=e.dw/2-1,i=e.dh/2-1,a=Math.max(e.dw,e.dh)*2;for(let o=0;o<a;o++){let s=o/a*E,c=Math.round(t+r*Math.cos(s)),l=Math.round(n+i*Math.sin(s));j(e,c,l)}}function N(e){let t=Math.floor(e.dh/2);for(let n=0;n<e.dw;n+=4)j(e,n,t)}function P(e,t){let n=e.dw/2,r=e.dh/2,i=e.dw/2-1,a=e.dh/2-1;for(let o of t){let t=O(o.lat,o.lng);if(!t)continue;let s=Math.round(n+t.x*i),c=Math.round(r-t.y*a);j(e,s,c),j(e,s+1,c),j(e,s,c+1),j(e,s+1,c+1)}}const F=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function I(e,t,n){let r=0;for(let i=0;i<F.length;i++){let[a,o]=F[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 L(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<=4?`:`:r<=6?`*`:`#`}function re({data:e,width:t=80,height:n=20,asciiOnly:r}){let{theme:i}=l(),a=k(r),o=A(t,n);M(o),N(o),P(o,e);let s=[];for(let e=0;e<n;e++){let n=``;for(let r=0;r<t;r++)n+=a?L(o,r,e):I(o,r,e);s.push(n)}return S.createElement(y,{flexDirection:`column`},s.map((e,t)=>S.createElement(b,{key:t,color:i.accent},e)),S.createElement(b,{color:i.muted},e.length,` live · `,a?`ascii mode`:`braille mode`))}function ie(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}const ae=v.object({siteId:v.string().optional(),window:v.string().optional(),totalVisitors:v.number().optional(),visitors:v.object({count:v.number().optional(),series:v.array(v.number()).optional()}).optional(),topPages:v.array(v.object({path:v.string(),views:v.number().optional(),count:v.number().optional()})).optional(),sources:v.array(v.object({source:v.string(),visitors:v.number()})).optional()}).passthrough();async function R(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;try{({siteId:l}=await f(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(i(a)){let e=await c.getDashboardSnapshot(l);return r({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=x(S.createElement(z,{api:c,siteId:l,intervalMs:a.intervalMs??15e3,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const z=({api:e,siteId:t,intervalMs:n,cliVersion:r,onExit:i})=>{_();let{theme:d}=l(),{exit:f}=ee(),[p,v]=w(null),[x,T]=w(null),[E,D]=w(null),[O,k]=w([]),[A,j]=w(!0),[M,N]=w(null),[P,F]=w(1),[I,L]=w(!1),[R,z]=w(!1),[B,W]=w(null),[ue,de]=w(()=>Date.now());te((e,n)=>{if(e===`o`||e===`O`){a(g(`watch`,{siteId:t}));return}if(e===`q`){f(),i(0);return}if(e===`?`||e===`/`){z(e=>!e);return}if(e===`g`){L(e=>!e);return}if(n.tab){F(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`)&&F(Number(e))});let[fe,G]=w(!1);if(C(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=ae.safeParse(n);if(!i.success){G(!0),j(!1);return}G(!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};v(o),e.getVitals(t).then(e=>{r||T(e)},()=>{}),e.getGoals(t).then(e=>{r||D(e)},()=>{}),j(!1),N(null),W(Date.now())}catch(e){r||N(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),C(()=>{if(R)return;let e=setInterval(()=>de(Date.now()),5e3);return()=>clearInterval(e)},[R]),C(()=>{let n=new AbortController;return(async()=>{try{let r=await e.openEventsStream(t,n.signal);for await(let e of o(r))e.type===`error`&&k(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),A)return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}`,live:!1}),S.createElement(c,{title:`Loading`,state:`busy`},S.createElement(y,null,S.createElement(b,{color:d.accent},S.createElement(ne,{type:`dots`})),S.createElement(b,null,` Fetching snapshot…`))));if(M&&!p)return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}`,live:!1}),S.createElement(m,{reason:`error`,headline:`Failed to load`,hint:M}));if(fe&&!p)return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}`,live:!1}),S.createElement(m,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let K=process.stdout.columns??80,q=2,J=h(K,3,q),[Y,X,Z]=[J[0]??20,J[1]??20,J[2]??20],Q=process.stdout.rows??40,pe=Math.max(4,Q-16),$=Math.max(2,Math.min(8,Math.floor(pe/2))),me=[],he=(p?.visitors?.count??0)>0||(p?.topPages?.length??0)>0||(p?.sources?.length??0)>0;return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}${I?` · globe`:``}`,live:he}),S.createElement(y,{flexDirection:`row`,width:K},S.createElement(y,{flexDirection:`column`,flexShrink:0,width:Y,marginRight:q},I?S.createElement(c,{title:`Live globe`,focused:P===1,width:Y},S.createElement(re,{data:me,width:Math.max(8,Y-4),height:Math.max(8,Math.min(12,$*2))})):S.createElement(se,{snapshot:p,focused:P===1,width:Y}),S.createElement(V,{events:O,focused:P===4,width:Y,rows:$})),S.createElement(y,{flexDirection:`column`,flexShrink:0,width:X,marginRight:q},S.createElement(ce,{snapshot:p,focused:P===2,width:X,rows:$}),S.createElement(H,{vitals:x,focused:P===5,width:X})),S.createElement(y,{flexDirection:`column`,flexShrink:0,width:Z},S.createElement(le,{snapshot:p,focused:P===3,width:Z,rows:$}),S.createElement(U,{goals:E,focused:P===6,width:Z,rows:$}))),R?S.createElement(oe,{api:e,siteId:t,width:K}):null,S.createElement(y,{marginTop:1},S.createElement(b,{color:d.dim},B===null?``:`↻ updated ${ie(B,ue)}`,` · watch is deprecated — use `,S.createElement(b,{color:d.accent},`zenovay overview`))),S.createElement(u,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:I?`panels`:`globe`},{key:`?/`,label:R?`close chat`:`ai chat`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}]}))},oe=({api:e,siteId:t,width:n})=>{let{theme:r}=l(),[i,a]=w(``),[s,u]=w([]),[d,f]=w(!1),[p,m]=w(``),[h,g]=w(null),_=async n=>{let r=n.trim();if(!r||d)return;g(null),a(``);let i=[...s,{role:`user`,content:r}];u(i),f(!0),m(``);try{let n=i.map(e=>({role:e.role,content:e.content})),r=await e.openAiStream(`chat`,{messages:n,siteId:t},void 0),a=``;for await(let e of o(r))if(e.type===`delta`)a+=e.content,m(a);else if(e.type===`error`)g(`${e.code}: ${e.message}`);else if(e.type===`done`)break;u([...i,{role:`assistant`,content:a}]),m(``)}catch(e){g(e instanceof Error?e.message:`chat failed`)}finally{f(!1)}};return S.createElement(y,{marginTop:1},S.createElement(c,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},S.createElement(y,{flexDirection:`column`},s.slice(-6).map((e,t)=>S.createElement(y,{key:t,flexDirection:`column`,marginBottom:1},S.createElement(b,{color:e.role===`user`?r.accent:r.info,bold:!0},e.role===`user`?`you`:`zenovay`),S.createElement(b,null,e.content))),d&&p?S.createElement(y,{flexDirection:`column`,marginBottom:1},S.createElement(b,{color:r.info,bold:!0},`zenovay`),S.createElement(b,null,p)):null,h?S.createElement(b,{color:r.error},`✗ `,h):null,S.createElement(y,null,S.createElement(b,{color:r.accent},d?`⠋ `:`▸ `),S.createElement(T,{value:i,onChange:a,onSubmit:_,placeholder:d?`streaming…`:`ask anything about your analytics`})))))},B=({label:e,value:t})=>{let{theme:n}=l();return S.createElement(y,{flexDirection:`row`},S.createElement(y,{flexGrow:1,flexShrink:1,marginRight:1},S.createElement(b,{wrap:`truncate`},e)),S.createElement(y,{width:t.length,flexShrink:0},S.createElement(b,{color:n.fg},t)))},se=({snapshot:e,focused:t,width:n})=>{let{theme:r}=l(),i=e?.visitors?.count??0,a=e?.visitors?.series??[];return S.createElement(c,{title:`Visitors`,focused:t,width:n},S.createElement(b,{color:r.typography.headline.color,bold:r.typography.headline.bold},i.toLocaleString()),a.length>0?S.createElement(b,{color:r.accent},d(a,Math.max(8,n-6))):S.createElement(b,{color:r.dim},`no data yet`))},ce=({snapshot:e,focused:t,width:n,rows:r=5})=>{let i=e?.topPages??[],a=i.slice(0,r),o=i.length-a.length;return S.createElement(c,{title:`Top pages`,focused:t,width:n},i.length===0?S.createElement(m,{reason:`no-data`,headline:`No pages yet`}):S.createElement(S.Fragment,null,a.map(e=>S.createElement(B,{key:e.path,label:p(e.path),value:(e.views??0).toLocaleString()})),o>0?S.createElement(W,{count:o}):null))},le=({snapshot:e,focused:t,width:n,rows:r=5})=>{let i=e?.sources??[],a=i.slice(0,r),o=i.length-a.length;return S.createElement(c,{title:`Sources`,focused:t,width:n},i.length===0?S.createElement(m,{reason:`no-data`,headline:`No sources yet`}):S.createElement(S.Fragment,null,a.map(e=>S.createElement(B,{key:e.source,label:e.source,value:e.visitors.toLocaleString()})),o>0?S.createElement(W,{count:o}):null))},V=({events:e,focused:t,width:n,rows:r=5})=>{let{theme:i}=l(),a=e.slice(-r);return S.createElement(c,{title:`Errors`,focused:t,width:n},e.length===0?S.createElement(b,{color:i.dim},`no errors — stream healthy`):a.map((e,t)=>S.createElement(b,{key:t,wrap:`truncate`},e)))},H=({vitals:e,focused:t,width:n})=>{let{theme:r}=l(),i=(e,t,n)=>S.createElement(y,{key:e,flexDirection:`row`},S.createElement(y,{width:6},S.createElement(b,{color:r.dim},e)),S.createElement(y,{flexGrow:1,justifyContent:`flex-end`},S.createElement(b,{color:r.fg},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`)));return S.createElement(c,{title:`Vitals`,focused:t,width:n},i(`LCP`,e?.lcpP75,`ms`),i(`INP`,e?.inpP75,`ms`),i(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),i(`TTFB`,e?.ttfbP75,`ms`),i(`FCP`,e?.fcpP75,`ms`))},U=({goals:e,focused:t,width:n,rows:r=5})=>{let i=e?.goals??[],a=i.slice(0,r),o=i.length-a.length;return S.createElement(c,{title:`Goals`,focused:t,width:n},i.length===0?S.createElement(m,{reason:`no-data`,headline:`No goals yet`}):S.createElement(S.Fragment,null,a.map(e=>S.createElement(B,{key:e.name,label:e.name,value:e.completions.toLocaleString()})),o>0?S.createElement(W,{count:o}):null))},W=({count:e})=>{let{theme:t}=l();return S.createElement(b,{color:t.dim},` +${e} more`)};export{R as watchCommand};
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