@zenovay/cli 0.1.57 → 0.1.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-C-GanomY.js +7 -0
- package/dist/{alerts-BUjlL7ZR.js → alerts-CPFSBaVU.js} +1 -1
- package/dist/{analytical-screen-CMrKaPtI.js → analytical-screen-CRn5UoFi.js} +1 -1
- package/dist/{analytics-DEiY_a_o.js → analytics-Dg7UtCHo.js} +1 -1
- package/dist/{annotation-Df0RaeUT.js → annotation-GkAYwvze.js} +1 -1
- package/dist/{api-keys-CyNO4KI4.js → api-keys-DphyO-_Y.js} +1 -1
- package/dist/bin.js +5 -5
- package/dist/{chat-panel-B9jVoY6L.js → chat-panel-C_yjPXnw.js} +1 -1
- package/dist/{commands-CV0cMhz-.js → commands-BX5I2UyT.js} +1 -1
- package/dist/{companies-BJXt6maG.js → companies-COJh5d6p.js} +1 -1
- package/dist/{deploys-GkuPA2gu.js → deploys-D044xeG7.js} +1 -1
- package/dist/{devices-Cm8akFhd.js → devices-CKVbnV06.js} +1 -1
- package/dist/{doctor-BghEu2pa.js → doctor-CF3D4SXm.js} +1 -1
- package/dist/{domains-CPyxq1EV.js → domains-2z51Uxcq.js} +1 -1
- package/dist/{emit-CRHuIcDu.js → emit-DBYk96TD.js} +1 -1
- package/dist/{errors-yw-tBGKd.js → errors-CX-BTLp1.js} +1 -1
- package/dist/{events-tail-DaJfYL04.js → events-tail-pDYhVzFg.js} +1 -1
- package/dist/{export-DehR4nSJ.js → export-DCbp6_Ae.js} +1 -1
- package/dist/{funnel-BC1iFv9K.js → funnel-CBYMcT0x.js} +1 -1
- package/dist/{geo-s0Vo_eCB.js → geo-CZGN3jMJ.js} +1 -1
- package/dist/globe-BesYTdf0.js +2 -0
- package/dist/{goals-c0s2dNji.js → goals-xzqn8Yvu.js} +1 -1
- package/dist/{health-DXvhULKc.js → health-9O6q4lla.js} +1 -1
- package/dist/{health-6jjgJIjO.js → health-lTPnKNY9.js} +1 -1
- package/dist/heatmaps-Dbw4tjvl.js +1 -0
- package/dist/{home-f9tur346.js → home-DAjqGgZH.js} +1 -1
- package/dist/init-DJ7cYn-0.js +1 -0
- package/dist/{init-CVARLXd4.js → init-J3iobD6o.js} +2 -2
- package/dist/insights-mWJUgQim.js +1 -0
- package/dist/journeys-DYHyPzD3.js +1 -0
- package/dist/live-BV3Ke3Pe.js +1 -0
- package/dist/login-C9V2iVUx.js +2 -0
- package/dist/{login-B_SVncFx.js → login-CxdKhA-o.js} +1 -1
- package/dist/logout-BiMIjAoN.js +2 -0
- package/dist/pages-B3Va-Uv4.js +1 -0
- package/dist/{projects-GGLzVDru.js → projects-0DoM_DNY.js} +1 -1
- package/dist/{query-NH3ViXw0.js → query-Cvxg7VGc.js} +1 -1
- package/dist/{resolve-site-tpOmUbqY.js → resolve-site-DSJR9vuz.js} +1 -1
- package/dist/retention-C6UOSoTA.js +1 -0
- package/dist/{revenue-DWzbEv6U.js → revenue-BoCu83Qb.js} +1 -1
- package/dist/sessions-bW9Zq9Ie.js +1 -0
- package/dist/{share-G548T55e.js → share-DGMIOBqH.js} +1 -1
- package/dist/{sources-CDdmsE0T.js → sources-COk75RfB.js} +1 -1
- package/dist/{stats-CaOl4H6-.js → stats-Cljlonha.js} +1 -1
- package/dist/status-agent-C2184gQB.js +10 -0
- package/dist/telemetry-BHyqKLqh.js +1 -0
- package/dist/{telemetry-Ct75THZH.js → telemetry-DVyGPeIl.js} +1 -1
- package/dist/{telemetry-Chcnnkeu.js → telemetry-urcJlNpJ.js} +1 -1
- package/dist/{themes-ssQriwiJ.js → themes-Dqt--qhd.js} +1 -1
- package/dist/update-DV3UrhdN.js +1 -0
- package/dist/uptime-B50oSlpy.js +1 -0
- package/dist/{use-DRwXjJuz.js → use-DKqiTC6X.js} +1 -1
- package/dist/{visitors-CCliwZ_d.js → visitors-BhAgZwqV.js} +1 -1
- package/dist/{vitals-BTw8-53n.js → vitals-BfCdH0Um.js} +1 -1
- package/dist/watch-C3s26qCL.js +1 -0
- package/dist/{webhooks-BP5UtY7b.js → webhooks-TMX618nq.js} +1 -1
- package/dist/{webhooks-forward-3FTU1l5a.js → webhooks-forward-Dijs9bUk.js} +1 -1
- package/dist/wizard-bin.js +1 -1
- package/package.json +1 -1
- package/dist/ai-tljhav25.js +0 -7
- package/dist/globe-BsihcEUp.js +0 -2
- package/dist/heatmaps-C91BqZMY.js +0 -1
- package/dist/init-CgNl0TCs.js +0 -1
- package/dist/insights-BZK_Zzuq.js +0 -1
- package/dist/journeys-5eR0xDBT.js +0 -1
- package/dist/live-Ko1UCfea.js +0 -1
- package/dist/login-BYSspMWm.js +0 -2
- package/dist/logout-C7J2gWKj.js +0 -2
- package/dist/pages-4kat87s8.js +0 -1
- package/dist/retention-Ct_4ob4-.js +0 -1
- package/dist/sessions-CuDcCdLo.js +0 -1
- package/dist/status-agent-DgxaMznV.js +0 -10
- package/dist/telemetry-CqGupjRQ.js +0 -1
- package/dist/update-DBjJLlwb.js +0 -1
- package/dist/uptime-DdjFTcEG.js +0 -1
- package/dist/watch-DKZxuGDI.js +0 -1
- /package/dist/{prompt-Bk9qczy9.js → prompt-D-Uzz_GF.js} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emit as n}from"./telemetry-urcJlNpJ.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{spawn as i}from"node:child_process";import a from"node:path";import{existsSync as o,mkdirSync as s,readFileSync as c,renameSync as l,unlinkSync as u,writeFileSync as d}from"node:fs";import{homedir as f}from"node:os";const p=6e4;function m(){return a.join(f(),`.zenovay`)}function h(){return a.join(m(),`status-agent.pid`)}function g(){return a.join(m(),`tmux-status`)}function _(){s(m(),{recursive:!0,mode:448})}function v(e){let t=h(),n=`${t}.tmp.${process.pid}`;d(n,String(e),{mode:384}),l(n,t)}function y(e){try{return process.kill(e,0),!0}catch{return!1}}function b(e){if(!e)return[];let t=[];for(let n of e.split(`,`).map(e=>e.trim()).filter(Boolean)){let e=n.match(/^([a-z_]+)\s*(>|<)\s*(-?\d+(?:\.\d+)?)$/i);if(!e)continue;t.push({key:(e[1]??``).toLowerCase(),op:e[2]??`>`,value:Number(e[3]??0)})}return t}function x(e,t,n){let r=(t/1e5).toFixed(1);return[`#[fg=colour141]● ${e} live`,`#[fg=colour114]▲ MRR $${r}k`,`#[fg=colour203]✗ ${n.toFixed(0)} err/s`].join(` `)}const S=5*60*1e3,C=new Map;function w(e,t){let n=Math.floor(t/10),r=`${e}:${n}`,i=Date.now(),a=C.get(r);return a&&i-a<S?!1:(C.set(r,i),!0)}async function T(e,t){let n=process.platform;try{if(n===`darwin`){await new Promise((n,r)=>{let a=i(`terminal-notifier`,[`-title`,e,`-message`,t,`-group`,`zenovay`],{stdio:`ignore`});a.on(`error`,r),a.on(`exit`,()=>n())});return}if(n===`linux`){await new Promise((n,r)=>{let a=i(`notify-send`,[e,t],{stdio:`ignore`});a.on(`error`,r),a.on(`exit`,()=>n())});return}}catch{}process.stdout.write(`\x1b]9;${e} — ${t}\x07`)}function E(e,t){let n=[];for(let r of e){let e=t[r.key];if(typeof e!=`number`)continue;r.op===`>`&&e>r.value&&n.push({rule:r,actual:e}),r.op===`<`&&e<r.value&&n.push({rule:r,actual:e})}return n}async function D(i){let a=await e(),o=await t({strict:!1});if(!o)return process.stderr.write(`status-agent: not logged in
|
|
2
|
+
`),2;let s=new r({config:a,cliVersion:i.cliVersion,token:o}),c=i.siteId??a.defaultSiteId??``;if(!c)return process.stderr.write("status-agent: no site selected — pass --site-id or run `zenovay use <site>`\n"),2;_();let l=b(i.notifyOn),f=i.intervalMs??p,m=Date.now(),v=0;n(`status_agent.start`,{properties:{rule_count:l.length,interval_ms:f}});let y=null,S=!1,C=null,D=()=>{S=!0,C&&C()};for(process.on(`SIGTERM`,D),process.on(`SIGINT`,D);!S;){try{let[e,t,r]=await Promise.all([s.getLive(c).catch(()=>({activeVisitors:0,recentEvents:[]})),s.getErrors(c,{window:`24h`}).catch(()=>({errors:[],total:0})),s.getRevenue(c,`24h`).catch(()=>null)]),i=e.activeVisitors,a=r?.mrr??r?.totalAmount??0,o=t.total/86400;d(g(),x(i,a,o),{mode:420});let u=y&&y>0?(y-a)/y*100:0,f=E(l,{error_rate:o,revenue_drop:u});for(let e of f){if(!w(e.rule.key,e.actual))continue;n(`status_agent.alert_fired`,{properties:{rule_key:e.rule.key,op:e.rule.op,threshold:e.rule.value,actual:e.actual}}),await T(`Zenovay alert`,`${e.rule.key} ${e.rule.op} ${e.rule.value} (got ${e.actual.toFixed(2)})`)}v+=1,v%10==0&&n(`status_agent.tick`,{properties:{visitors:i,error_rate_24h_avg:o,mrr_cents:a,tick:v}}),y=a}catch(e){process.stderr.write(`status-agent tick failed: ${e.message}\n`)}await new Promise(e=>{let t=setTimeout(e,f);C=()=>{clearTimeout(t),e()}}),C=null}n(`status_agent.stop`,{duration_ms:Date.now()-m,properties:{ticks:v}});try{u(h())}catch{}return 0}function O(){return[`# Add to ~/.tmux.conf:`,`set -g status-right "#(cat ~/.zenovay/tmux-status) %H:%M"`,``,`# Then reload:`,`# $ tmux source ~/.tmux.conf`].join(`
|
|
3
|
+
`)}function k(){let e=process.argv[0]??`zenovay`;return[`[Unit]`,`Description=Zenovay status agent`,`After=network.target`,``,`[Service]`,`Type=simple`,`ExecStart=${e} status-agent --child`,`Restart=on-failure`,`RestartSec=10`,``,`[Install]`,`WantedBy=default.target`,``,`# Save as ~/.config/systemd/user/zenovay-status.service`,`# systemctl --user enable --now zenovay-status`].join(`
|
|
4
|
+
`)}function A(){let e=process.argv[0]??`zenovay`;return[`<?xml version="1.0" encoding="UTF-8"?>`,`<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">`,`<plist version="1.0">`,`<dict>`,` <key>Label</key><string>com.zenovay.status-agent</string>`,` <key>ProgramArguments</key>`,` <array>`,` <string>${e}</string>`,` <string>status-agent</string>`,` <string>--child</string>`,` </array>`,` <key>RunAtLoad</key><true/>`,` <key>KeepAlive</key><true/>`,`</dict>`,`</plist>`,``,`<!-- Save as ~/Library/LaunchAgents/com.zenovay.status-agent.plist -->`,`<!-- launchctl load ~/Library/LaunchAgents/com.zenovay.status-agent.plist -->`].join(`
|
|
5
|
+
`)}async function j(e){if(e.installTmux)return process.stdout.write(O()+`
|
|
6
|
+
`),0;if(e.installSystemd)return process.stdout.write(k()+`
|
|
7
|
+
`),0;if(e.installLaunchd)return process.stdout.write(A()+`
|
|
8
|
+
`),0;if(e.stop){let e=h();if(!o(e))return process.stderr.write(`status-agent: no PID file — daemon not running?
|
|
9
|
+
`),1;let t=Number(c(e,`utf8`).trim());if(!Number.isInteger(t)||t<=0){process.stderr.write(`status-agent: PID file is malformed (got ${JSON.stringify(t)}); removing.\n`);try{u(e)}catch{}return 1}if(!y(t)){process.stderr.write(`status-agent: process ${t} not running; removing stale PID file.\n`);try{u(e)}catch{}return 0}try{process.kill(t,`SIGTERM`);try{u(e)}catch{}return process.stdout.write(`Stopped (PID: ${t})\n`),0}catch(n){process.stderr.write(`status-agent: kill ${t} failed: ${n.message}\n`);try{u(e)}catch{}return 1}}if(e.child)return _(),v(process.pid),D(e);if(e.daemonize){_();let e=h();if(o(e)){let t=Number(c(e,`utf8`).trim());if(Number.isInteger(t)&&t>0&&y(t))return process.stderr.write(`status-agent: already running (PID ${t}). Use --stop first.\n`),1;try{u(e)}catch{}}let t=process.argv.slice(2).filter(e=>e!==`--daemonize`);t.push(`--child`);let n=process.argv[0]??`node`,r=i(n,[process.argv[1]??``,...t],{detached:!0,stdio:`ignore`});if(r.unref(),typeof r.pid==`number`)v(r.pid),process.stdout.write(`Started (PID: ${r.pid})\n`);else return process.stderr.write(`status-agent: failed to spawn detached child
|
|
10
|
+
`),1;return 0}return D(e)}export{j as statusAgentCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./config-Dn_Cl0cD.js";import{emit as e,flush as t,getProcessUptimeMs as n,getTelemetryStatus as r,initTelemetry as i,setTelemetry as a}from"./telemetry-urcJlNpJ.js";export{e as emit,t as flush,n as getProcessUptimeMs,r as getTelemetryStatus,i as initTelemetry,a as setTelemetry};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import{getTelemetryStatus as e,setTelemetry as t}from"./telemetry-
|
|
1
|
+
import"./config-Dn_Cl0cD.js";import{getTelemetryStatus as e,setTelemetry as t}from"./telemetry-urcJlNpJ.js";async function n(n){let r=n.action??`status`;if(r===`on`)return await t(!0),n.json?process.stdout.write(JSON.stringify({ok:!0,enabled:!0})+`
|
|
2
2
|
`):process.stdout.write(`Telemetry enabled.
|
|
3
3
|
`),0;if(r===`off`)return await t(!1),n.json?process.stdout.write(JSON.stringify({ok:!0,enabled:!1})+`
|
|
4
4
|
`):process.stdout.write(`Telemetry disabled. Existing pending events on disk will not be sent.
|
|
@@ -2,4 +2,4 @@ import{configDir as e,readConfig as t,writeConfig as n}from"./config-Dn_Cl0cD.js
|
|
|
2
2
|
No site data, file contents, or chat messages are included.
|
|
3
3
|
Disable: \`zenovay telemetry off\` or set ZENOVAY_TELEMETRY=0 / DO_NOT_TRACK=1
|
|
4
4
|
|
|
5
|
-
`),r={...r,telemetry:{enabled:!0,disclosed_at:Date.now()}};try{await n(r)}catch{}}w=D(r),await j().catch(()=>void 0),process.on(`exit`,()=>{_.length>0&&A(_.splice(0))});for(let e of[`SIGINT`,`SIGTERM`])process.on(e,()=>{k()})}}function E(){let e=process.env.ZENOVAY_TELEMETRY;if(e===`0`||e===`false`||e===`off`||e===`no`)return!0;let t=process.env.DO_NOT_TRACK;return t===`1`||t===`true`}function D(e){let t=e.telemetry;return typeof t==`boolean`?t:t&&typeof t==`object`&&`enabled`in t?!!t.enabled:!0}function O(e,t={}){w!==!1&&(_.length>=f||(_.push({ts:Date.now(),event:e,cli_version:b,node_version:process.versions.node,os:process.platform,arch:process.arch,session_id:h,...t}),_.length>=d?k():v||=setTimeout(()=>{v=null,k()},u)))}async function k(){if(y)return y;if(_.length===0)return;if(w===!1){_.length=0;return}v&&(clearTimeout(v),v=null);let e=_.splice(0);return y=(async()=>{try{let t=x.replace(/\/$/,``)+l;await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...S?{Authorization:`Bearer ${S}`}:{}},body:JSON.stringify({events:e}),signal:AbortSignal.timeout(p)})}catch{try{A(e.slice(0,f))}catch{}}finally{y=null}})(),y}function A(t){try{i(e(),{recursive:!0,mode:448})}catch{}let n=[];try{let e=o(m,`utf8`),t=JSON.parse(e);Array.isArray(t)&&(n=t.slice(0,f))}catch{}let r=[...n,...t].slice(-f);try{s(m,JSON.stringify(r),{mode:384})}catch{}}async function j(){let e=[];try{let t=await a.readFile(m,`utf8`),n=JSON.parse(t);Array.isArray(n)&&(e=n)}catch{return}if(e.length===0)return;let t=e.slice(-f);try{let e=x.replace(/\/$/,``)+l,n=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S?{Authorization:`Bearer ${S}`}:{}},body:JSON.stringify({events:t}),signal:AbortSignal.timeout(p)});if(n.ok)try{await a.unlink(m)}catch{}}catch{}}async function M(){if(E())return{enabled:!1,source:`env`,endpoint:x.replace(/\/$/,``)+l,pending_count:await N()};let e=await t().catch(()=>null),n=e?.telemetry,r=!0,i,a=`default`;return typeof n==`boolean`?(r=n,a=`config`):n&&typeof n==`object`&&(r=!!n.enabled,i=n.disclosed_at,a=`config`),{enabled:r,source:a,disclosed_at:i,endpoint:x.replace(/\/$/,``)+l,pending_count:await N()}}async function N(){try{let e=await a.readFile(m,`utf8`),t=JSON.parse(e);return Array.isArray(t)?t.length:0}catch{return 0}}async function P(e){let r=await t();await n({...r,telemetry:{enabled:e,disclosed_at:Date.now()}}),w=e}function F(){return Date.now()-g}export{O as emit
|
|
5
|
+
`),r={...r,telemetry:{enabled:!0,disclosed_at:Date.now()}};try{await n(r)}catch{}}w=D(r),await j().catch(()=>void 0),process.on(`exit`,()=>{_.length>0&&A(_.splice(0))});for(let e of[`SIGINT`,`SIGTERM`])process.on(e,()=>{k()})}}function E(){let e=process.env.ZENOVAY_TELEMETRY;if(e===`0`||e===`false`||e===`off`||e===`no`)return!0;let t=process.env.DO_NOT_TRACK;return t===`1`||t===`true`}function D(e){let t=e.telemetry;return typeof t==`boolean`?t:t&&typeof t==`object`&&`enabled`in t?!!t.enabled:!0}function O(e,t={}){w!==!1&&(_.length>=f||(_.push({ts:Date.now(),event:e,cli_version:b,node_version:process.versions.node,os:process.platform,arch:process.arch,session_id:h,...t}),_.length>=d?k():v||=setTimeout(()=>{v=null,k()},u)))}async function k(){if(y)return y;if(_.length===0)return;if(w===!1){_.length=0;return}v&&(clearTimeout(v),v=null);let e=_.splice(0);return y=(async()=>{try{let t=x.replace(/\/$/,``)+l;await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...S?{Authorization:`Bearer ${S}`}:{}},body:JSON.stringify({events:e}),signal:AbortSignal.timeout(p)})}catch{try{A(e.slice(0,f))}catch{}}finally{y=null}})(),y}function A(t){try{i(e(),{recursive:!0,mode:448})}catch{}let n=[];try{let e=o(m,`utf8`),t=JSON.parse(e);Array.isArray(t)&&(n=t.slice(0,f))}catch{}let r=[...n,...t].slice(-f);try{s(m,JSON.stringify(r),{mode:384})}catch{}}async function j(){let e=[];try{let t=await a.readFile(m,`utf8`),n=JSON.parse(t);Array.isArray(n)&&(e=n)}catch{return}if(e.length===0)return;let t=e.slice(-f);try{let e=x.replace(/\/$/,``)+l,n=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S?{Authorization:`Bearer ${S}`}:{}},body:JSON.stringify({events:t}),signal:AbortSignal.timeout(p)});if(n.ok)try{await a.unlink(m)}catch{}}catch{}}async function M(){if(E())return{enabled:!1,source:`env`,endpoint:x.replace(/\/$/,``)+l,pending_count:await N()};let e=await t().catch(()=>null),n=e?.telemetry,r=!0,i,a=`default`;return typeof n==`boolean`?(r=n,a=`config`):n&&typeof n==`object`&&(r=!!n.enabled,i=n.disclosed_at,a=`config`),{enabled:r,source:a,disclosed_at:i,endpoint:x.replace(/\/$/,``)+l,pending_count:await N()}}async function N(){try{let e=await a.readFile(m,`utf8`),t=JSON.parse(e);return Array.isArray(t)?t.length:0}catch{return 0}}async function P(e){let r=await t();await n({...r,telemetry:{enabled:e,disclosed_at:Date.now()}}),w=e}function F(){return Date.now()-g}export{O as emit,k as flush,F as getProcessUptimeMs,M as getTelemetryStatus,T as initTelemetry,P as setTelemetry};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-B_yDcIcn.js";import{Banner as a}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-
|
|
1
|
+
import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-B_yDcIcn.js";import{Banner as a}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-Cey-h6wI.js";import{promises as o}from"node:fs";import{Box as s,Text as c,render as l}from"ink";import u from"react";const d=[{name:`mocha`,theme:n,mode:`dark`},{name:`latte`,theme:t,mode:`light`},{name:`dracula`,theme:e,mode:`dark`},{name:`tokyoNight`,theme:i,mode:`dark`},{name:`nord`,theme:r,mode:`dark`}],f=[`name`,`bg`,`fg`,`muted`,`accent`,`accent2`,`success`,`warn`,`error`,`border`,`dim`];function p({name:e,theme:t,mode:n}){let r=[t.accent,t.accent2,t.success,t.warn,t.error];return u.createElement(s,{flexDirection:`row`},u.createElement(c,{bold:!0},e.padEnd(14)),u.createElement(c,{color:`gray`},n.padEnd(7)),r.map((e,t)=>u.createElement(c,{key:t,color:e},`████`,` `)),u.createElement(c,{color:`gray`},t.bg))}function m({themes:e}){return u.createElement(s,{flexDirection:`column`},u.createElement(a,{version:`themes`}),u.createElement(s,{marginTop:1,marginBottom:1},u.createElement(c,{color:`gray`},e.length,` themes — pass --theme <name> to any command, or set in your config.`)),u.createElement(s,{flexDirection:`column`},u.createElement(s,null,u.createElement(c,{bold:!0},`name`.padEnd(14)),u.createElement(c,{bold:!0},`mode`.padEnd(7)),u.createElement(c,{bold:!0},`swatch`.padEnd(28)),u.createElement(c,{bold:!0},`bg`)),e.map(({name:e,theme:t,mode:n})=>u.createElement(p,{key:e,name:e,theme:t,mode:n}))))}async function h(e){if(e.validate){let t;try{let n=await o.readFile(e.validate,`utf8`);t=JSON.parse(n)}catch(t){return process.stderr.write(`✗ Failed to read ${e.validate}: ${t.message}\n`),1}let n=f.filter(e=>t[e]==null);return n.length>0?(process.stderr.write(`✗ Missing required tokens: ${n.join(`, `)}\n`),e.json&&process.stdout.write(JSON.stringify({ok:!1,missing:n},null,2)+`
|
|
2
2
|
`),1):(process.stdout.write(`✔ Valid theme (${f.length} tokens present).\n`),e.json&&process.stdout.write(JSON.stringify({ok:!0,theme:t},null,2)+`
|
|
3
3
|
`),0)}if(e.json)return process.stdout.write(JSON.stringify({themes:d.map(({name:e,theme:t,mode:n})=>({name:e,mode:n,background:t.bg,foreground:t.fg,accent:t.accent}))},null,2)+`
|
|
4
4
|
`),0;let{waitUntilExit:t}=l(u.createElement(m,{themes:d}));return await t(),0}export{h as themesCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{classifyBump as t,fetchManifest as n}from"./check-D9G0N7NB.js";import{applyUpdate as r}from"./apply-oUMOH7u2.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";async function o(o){let s=await e(),c=await n({cliBase:s.cliBase}),l=t(o.cliVersion,c.latest);if(o.check)return a({json:o.json})?i({type:`info`,message:`latest=${c.latest} current=${o.cliVersion} bump=${l}`}):process.stdout.write(`Current: ${o.cliVersion}\nLatest: ${c.latest}\nBump: ${l}\n`),{updated:!1,from:o.cliVersion,to:c.latest};if(l===`none`)return a({json:o.json})||process.stdout.write(`Already on latest (${o.cliVersion}).\n`),{updated:!1,from:o.cliVersion,to:c.latest};if(l===`downgrade`&&!o.forceDowngrade)throw Error(`Refused to downgrade ${o.cliVersion} → ${c.latest}. Pass --force-downgrade if you really want this.`);let u=await r({currentVersion:o.cliVersion,cliBase:s.cliBase,binaryPath:o.binaryPath,forceDowngrade:o.forceDowngrade});return a({json:o.json})?u.updated&&i({type:`update.applied`,from:u.from,to:u.to}):u.updated?process.stdout.write(`Updated ${u.from} → ${u.to}\n`):process.stdout.write(`Not updated (${u.reason??`unknown`}).\n`),u}export{o as updateCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-DSJR9vuz.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";function C(e){return e===`up`?{glyph:`● up`,color:`green`}:e===`down`?{glyph:`● down`,color:`red`}:{glyph:`○ unknown`,color:`gray`}}function w(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.round((t-Date.now())/(1e3*60*60*24));return`${n}d`}async function T(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 u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{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??d;if(a(o)){let e=await u.getUptime(d);return i({type:`uptime.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[T,E]=x(!0),[D,O]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`uptime`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getUptime(t);n||(g(r.monitors),E(!1))}catch(e){n||(O(e.message),E(!1))}})(),()=>{n=!0}},[e,t]),T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching monitors…`))));if(D)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:D}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No monitors configured`,hint:`Add one at app.zenovay.com/uptime`}));let k=[{key:`url`,label:`monitor`,width:36},{key:`status`,label:`status`,width:12,format:e=>C(String(e)).glyph},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:7,format:e=>w(e)}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(o,{title:`Monitors (${l.length})`},y.createElement(u,{columns:k,data:l,zebra:!0})),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{T as uptimeCommand};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config-Dn_Cl0cD.js";import{ApiClient as n}from"./api-BD_nTdOq.js";import{readToken as r}from"./token-store-DWXh9r3Z.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as i,wrapSnapshot as a}from"./emit-
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config-Dn_Cl0cD.js";import{ApiClient as n}from"./api-BD_nTdOq.js";import{readToken as r}from"./token-store-DWXh9r3Z.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as i,wrapSnapshot as a}from"./emit-DBYk96TD.js";async function o(o){if(o.reset)return await t({defaultSiteId:void 0,defaultSiteName:void 0}),o.json?(i(a({reset:!0,defaultSiteId:null},`use.reset`)),0):(process.stdout.write(`Default site cleared.
|
|
2
2
|
`),0);if(!o.match||!o.match.trim()){let t=await e();if(t.defaultSiteId){let e={siteId:t.defaultSiteId,name:t.defaultSiteName??null,domain:t.defaultSiteName??null};return o.json?(i(a(e,`use.current`,{siteId:t.defaultSiteId})),0):(process.stdout.write(`Default site: ${e.name??e.siteId} (${t.defaultSiteId})\n`),0)}return o.json?(i(a(null,`use.current`,{})),0):(process.stdout.write("No default site set. Run `zenovay use <domain>` to set one.\n"),0)}let c=await e(),l=await r({strict:!1});if(!l&&!process.env.ZENOVAY_API_TOKEN)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:c,cliVersion:o.cliVersion,token:l}),d=o.match.trim().toLowerCase(),f=await u.getSites(),p=f.find(e=>e.id===o.match||e.trackingCode===o.match||e.url===o.match),m=p??f.find(e=>s(e.url).includes(d)||e.name.toLowerCase().includes(d));return m?(await t({defaultSiteId:m.id,defaultSiteName:m.name}),o.json?(i(a({siteId:m.id,name:m.name,domain:s(m.url)},`use.set`,{siteId:m.id})),0):(process.stdout.write(`Default site → ${m.name} (${m.url})\n`),0)):(process.stderr.write(`No site matched "${o.match}". Your sites:\n${f.map(e=>` ${e.name} — ${e.url} — ${e.id}`).join(`
|
|
3
3
|
`)}\n`),2)}function s(e){return e.toLowerCase().replace(/^https?:\/\//,``).replace(/\/.*$/,``)}export{o as useCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{brailleSpark as a,spark as o}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as s}from"./resolve-site-DSJR9vuz.js";import{DataTable as c}from"./data-table-BpbyyNSA.js";import{deepLinkFor as l,openInBrowser as u}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as d}from"./analytical-screen-CRn5UoFi.js";import{Box as f,Text as p}from"ink";import m from"react";function h(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}function g(e){let t=e,n=t.events??t.timeseries;return Array.isArray(n)&&n.length>0?o(n,8):`▁▁▁▁▁▁▁▁`}function _(e){let t=e;if(typeof t.sessionDurationSec==`number`)return t.sessionDurationSec;if(typeof t.sessionDurationMs==`number`)return Math.floor(t.sessionDurationMs/1e3);if(typeof t.durationMs==`number`)return Math.floor(t.durationMs/1e3);if(typeof t.duration==`number`)return Math.floor(t.duration/1e3);let n=Date.parse(e.startedAt);return Number.isNaN(n)?0:Math.max(0,Math.floor((Date.now()-n)/1e3))}async function v(o){let v=await e(),y=await t({strict:!1}),b=new n({config:v,cliVersion:o.cliVersion,token:y}),x,S;try{({siteId:x,site:S}=await s(b,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let C=i(o),w=o.limit??50,T=typeof o.minDuration==`number`&&o.minDuration>0?o.minDuration:0,E=e=>T<=0?e:e.filter(e=>_(e)>=T),D=6e4,O=e=>{let t=Date.parse(e.startedAt);return Number.isFinite(t)&&Date.now()-t<D},k=[{key:`startedAt`,label:``,width:5,format:(e,t)=>O(t)?`● new`:``},{key:`startedAt`,label:`when`,width:6,format:e=>h(String(e))},{key:`country`,label:`country`,width:7,format:e=>String(e??`—`)},{key:`city`,label:`city`,width:14,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`page`,label:`page`,width:26,format:e=>String(e??`—`)},{key:`id`,label:`24h`,width:8,format:(e,t)=>g(t)}];return d({cliVersion:o.cliVersion,title:`visitors · ${x}`,commandName:`visitors`,ai:{api:b,siteId:x,siteLabel:S?.url?S.url.replace(/^https?:\/\//,``).replace(/\/$/,``):S?.name??x},authToken:y?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>b.getVisitors(x,{limit:w},e),format:C,keybindings:{o:{label:`open in browser`,handler:()=>{u(l(`visitors`,{siteId:x}))}}},headlessEmit:(e,t)=>{let n={...e,visitors:E(e.visitors)};if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(n,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}let i=[`startedAt`,`country`,`city`,`device`,`page`];process.stdout.write(r(n.visitors,i,t))},panels:[{id:`live`,title:`Now`,render:e=>{let t=E(e.visitors),n=[...t].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)),r=n[0],i=Array(24*6).fill(0),o=Date.now();for(let e of t){let t=o-new Date(e.startedAt).getTime(),n=Math.floor(t/(10*60*1e3));n>=0&&n<i.length&&(i[i.length-1-n]+=1)}return m.createElement(f,{flexDirection:`column`},m.createElement(p,{bold:!0},t.length,` live`),m.createElement(p,{color:`gray`},a(i,40)),r?m.createElement(p,{color:`gray`},`top: `,r.city??r.country??`—`,` · `,r.page??`—`):null)}},{id:`visitors`,title:`Active sessions`,render:e=>{let t=E(e.visitors),n=[...t].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)).slice(0,w);return n.length===0?m.createElement(p,{color:`gray`},`— no visitors yet —`):m.createElement(c,{columns:k,data:n,headerStyle:`accent`})}}]})}export{v as visitorsCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-CRn5UoFi.js";import{Box as u,Text as d}from"ink";import f from"react";const p={lcp:{good:2500,poor:4e3},inp:{good:200,poor:500},cls:{good:.1,poor:.25},ttfb:{good:800,poor:1800},fcp:{good:1800,poor:3e3}};function m(e,t){let n=p[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function h(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function g(p){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:p.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(p),S=[{key:`url`,label:`url`,width:32},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,label:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return l({cliVersion:p.cliVersion,title:`vitals · ${y}`,commandName:`vitals`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:p.watch?5*6e4:0,fetcher:e=>v.getVitals(y,{url:p.url,device:p.device,window:p.window},e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`vitals`,{siteId:y}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}process.stdout.write(r(e.vitals,[`url`,`device`,`samples`],t))},panels:[{id:`summary`,title:`Site-wide p75`,render:e=>{let t=t=>{let n=0,r=0;for(let i of e.vitals){let e=i[t]?.p75;typeof e==`number`&&(n+=e*i.samples,r+=i.samples)}return r>0?n/r:0},n=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return f.createElement(u,{flexDirection:`column`},n.map(e=>{let n=t(e),r=m(e,n);return f.createElement(d,{key:e},f.createElement(d,{color:r.color},`● `),f.createElement(d,{bold:!0},e.toUpperCase().padEnd(5)),` `,f.createElement(d,null,h(e,n).padStart(8)),` `,f.createElement(d,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?f.createElement(d,{color:`gray`},`— no vitals data yet —`):f.createElement(o,{data:e.vitals.slice(0,15),columns:S,headerStyle:`accent`})}]})}export{g as vitalsCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{spark as l}from"./sparkline-BZ0eMB-w.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{z as m}from"zod";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useState as S}from"react";import C from"ink-spinner";import w from"ink-text-input";const T=Math.PI*2;function E(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 D(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=E(n),a=r*Math.cos(i)/Math.PI,o=Math.sin(i);return{x:a,y:o}}function O(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 k(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function A(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function j(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*T,c=Math.round(t+r*Math.cos(s)),l=Math.round(n+i*Math.sin(s));A(e,c,l)}}function M(e){let t=Math.floor(e.dh/2);for(let n=0;n<e.dw;n+=4)A(e,n,t)}function N(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=D(o.lat,o.lng);if(!t)continue;let s=Math.round(n+t.x*i),c=Math.round(r-t.y*a);A(e,s,c),A(e,s+1,c),A(e,s,c+1),A(e,s+1,c+1)}}const P=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function F(e,t,n){let r=0;for(let i=0;i<P.length;i++){let[a,o]=P[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 I(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 L({data:e,width:t=80,height:n=20,asciiOnly:r}){let i=O(r),a=k(t,n);j(a),M(a),N(a,e);let o=[];for(let e=0;e<n;e++){let n=``;for(let r=0;r<t;r++)n+=i?I(a,r,e):F(a,r,e);o.push(n)}return b.createElement(h,{flexDirection:`column`},o.map((e,t)=>b.createElement(g,{key:t,color:`magenta`},e)),b.createElement(g,{color:`gray`},e.length,` live · `,i?`ascii mode`:`braille mode`))}const R=m.object({siteId:m.string().optional(),window:m.string().optional(),totalVisitors:m.number().optional(),visitors:m.object({count:m.number().optional(),series:m.array(m.number()).optional()}).optional(),topPages:m.array(m.object({path:m.string(),views:m.number().optional(),count:m.number().optional()})).optional(),sources:m.array(m.object({source:m.string(),visitors:m.number()})).optional()}).passthrough();async function z(r){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:r.cliVersion,token:s}),l;try{({siteId:l}=await u(c,{explicit:r.siteId,headless:!!r.json,cliVersion:r.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(a(r)){let e=await c.getDashboardSnapshot(l);return i({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=_(b.createElement(B,{api:c,siteId:l,intervalMs:r.intervalMs??15e3,cliVersion:r.cliVersion,onExit:n=>{t(),e(n)}}))})}const B=({api:e,siteId:t,intervalMs:n,cliVersion:i,onExit:a})=>{let{exit:l}=v(),[u,m]=S(null),[_,w]=S(null),[T,E]=S(null),[D,O]=S([]),[k,A]=S(!0),[j,M]=S(null),[N,P]=S(1),[F,I]=S(!1),[z,B]=S(!1);y((e,n)=>{if(e===`o`||e===`O`){p(f(`watch`,{siteId:t}));return}if(e===`q`){l(),a(0);return}if(e===`?`||e===`/`){B(e=>!e);return}if(e===`g`){I(e=>!e);return}if(n.tab){P(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`)&&P(Number(e))});let[J,Y]=S(!1);if(x(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=R.safeParse(n);if(!i.success){Y(!0),A(!1);return}Y(!1);let a=i.data,o={visitors:a.visitors??(typeof a.totalVisitors==`number`?{count:a.totalVisitors}:void 0),topPages:a.topPages?.map(e=>({path:e.path,views:e.views??e.count??0})),sources:a.sources};m(o),e.getVitals(t).then(e=>{r||w(e)},()=>{}),e.getGoals(t).then(e=>{r||E(e)},()=>{}),A(!1),M(null)}catch(e){r||M(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),x(()=>{let n=new AbortController;return(async()=>{try{let i=await e.openEventsStream(t,n.signal);for await(let e of r(i))e.type===`error`&&O(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),k)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(o,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:`magenta`},b.createElement(C,{type:`dots`})),b.createElement(g,null,` Fetching snapshot…`))));if(j&&!u)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(o,{title:`Error`,state:`err`},b.createElement(g,{color:`red`},j)));if(J&&!u)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(d,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let X=process.stdout.columns??80,Z=Math.max(20,Math.floor(X/3)-1),Q=[];return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}${F?` · globe`:``}`}),b.createElement(h,{flexDirection:`row`},b.createElement(h,{flexDirection:`column`},F?b.createElement(o,{title:`Live globe`,focused:N===1,width:Z},b.createElement(L,{data:Q,width:Math.max(40,Z-4),height:12})):b.createElement(H,{snapshot:u,focused:N===1,width:Z}),b.createElement(G,{events:D,focused:N===4,width:Z})),b.createElement(h,{flexDirection:`column`},b.createElement(U,{snapshot:u,focused:N===2,width:Z}),b.createElement(K,{vitals:_,focused:N===5,width:Z})),b.createElement(h,{flexDirection:`column`},b.createElement(W,{snapshot:u,focused:N===3,width:Z}),b.createElement(q,{goals:T,focused:N===6,width:Z}))),z?b.createElement(V,{api:e,siteId:t,width:X-2}):null,b.createElement(c,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:F?`panels`:`globe`},{key:`?/`,label:z?`close chat`:`ai chat`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))},V=({api:e,siteId:t,width:n})=>{let[i,a]=S(``),[s,c]=S([]),[l,u]=S(!1),[d,f]=S(``),[p,m]=S(null),_=async n=>{let i=n.trim();if(!i||l)return;m(null),a(``);let o=[...s,{role:`user`,content:i}];c(o),u(!0),f(``);try{let n=o.map(e=>({role:e.role,content:e.content})),i=await e.openAiStream(`chat`,{messages:n,siteId:t},void 0),a=``;for await(let e of r(i))if(e.type===`delta`)a+=e.content,f(a);else if(e.type===`error`)m(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...o,{role:`assistant`,content:a}]),f(``)}catch(e){m(e instanceof Error?e.message:`chat failed`)}finally{u(!1)}};return b.createElement(h,{marginTop:1},b.createElement(o,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},b.createElement(h,{flexDirection:`column`},s.slice(-6).map((e,t)=>b.createElement(h,{key:t,flexDirection:`column`,marginBottom:1},b.createElement(g,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),b.createElement(g,null,e.content))),l&&d?b.createElement(h,{flexDirection:`column`,marginBottom:1},b.createElement(g,{color:`magenta`,bold:!0},`zenovay`),b.createElement(g,null,d)):null,p?b.createElement(g,{color:`red`},`✗ `,p):null,b.createElement(h,null,b.createElement(g,{color:`cyan`},l?`⠋ `:`▸ `),b.createElement(w,{value:i,onChange:a,onSubmit:_,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},H=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return b.createElement(o,{title:`Visitors`,focused:t,width:n},b.createElement(g,{bold:!0},r.toString()),b.createElement(g,{color:`gray`},i.length>0?l(i,Math.max(8,n-6)):`— no data —`))},U=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return b.createElement(o,{title:`Top pages`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.path},b.createElement(g,null,e.path.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.views))))},W=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return b.createElement(o,{title:`Sources`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.source},b.createElement(g,null,e.source.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.visitors))))},G=({events:e,focused:t,width:n})=>b.createElement(o,{title:`Events`,focused:t,width:n},e.length===0?b.createElement(g,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>b.createElement(g,{key:t},e.slice(0,n-4)))),K=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>b.createElement(h,{key:e},b.createElement(g,{bold:!0},e.padEnd(6)),b.createElement(g,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return b.createElement(o,{title:`Vitals`,focused:t,width:n},r(`LCP`,e?.lcpP75,`ms`),r(`INP`,e?.inpP75,`ms`),r(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),r(`TTFB`,e?.ttfbP75,`ms`),r(`FCP`,e?.fcpP75,`ms`))},q=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return b.createElement(o,{title:`Goals`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.name},b.createElement(g,null,e.name.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.completions))))};export{z as watchCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emitErrorEnvelope as n}from"./error-codes-BohPg7wr.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emitErrorEnvelope as n}from"./error-codes-BohPg7wr.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-DBYk96TD.js";function c(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}function l(e){return e?new Date(e).toISOString().slice(0,10):`—`}async function u(u){let d=await e(),f=await t({strict:!1}),p=new r({config:d,cliVersion:u.cliVersion,token:f});try{switch(u.action){case`list`:{let{webhooks:e}=await p.listWebhooks();if(u.json)return a(s(e,`webhooks.list`),{legacyKey:`webhooks`,legacyValue:e}),0;if(e.length===0)return process.stdout.write("No webhooks yet. Add one with `zenovay webhooks add <https-url> --events <e1,e2>`.\n"),0;let t=[``,`id`,`url`,`events`,`created`],n=[1,14,40,28,10],r=e=>e.map((e,t)=>(e??``).padEnd(n[t])).join(` `);process.stdout.write(r(t)+`
|
|
2
2
|
`),process.stdout.write(r(n.map(e=>`─`.repeat(e)))+`
|
|
3
3
|
`);for(let t of e){let e=t.status===`disabled`?`○`:`●`,i=t.url.length>n[2]?`${t.url.slice(0,n[2]-1)}…`:t.url,a=t.events.join(`,`),o=a.length>n[3]?`${a.slice(0,n[3]-1)}…`:a;process.stdout.write(r([e,c(t.id),i,o,l(t.createdAt)])+`
|
|
4
4
|
`)}return process.stdout.write(`
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{Panel as r}from"./panel-B_yDcIcn.js";import{Banner as i}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-
|
|
1
|
+
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{Panel as r}from"./panel-B_yDcIcn.js";import{Banner as i}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-Cey-h6wI.js";import{Box as a,Text as o,render as s,useApp as c,useInput as l}from"ink";import u,{useEffect as d,useState as f}from"react";async function p(e,t){let n=new TextEncoder,r=await crypto.subtle.importKey(`raw`,n.encode(e),{name:`HMAC`,hash:`SHA-256`},!1,[`sign`]),i=await crypto.subtle.sign(`HMAC`,r,n.encode(t));return Array.from(new Uint8Array(i),e=>e.toString(16).padStart(2,`0`)).join(``)}function m({stats:e}){return u.createElement(r,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},u.createElement(a,{flexDirection:`column`},u.createElement(o,null,u.createElement(o,{color:`gray`},`public URL `),u.createElement(o,{color:`cyan`},e.publicUrl)),u.createElement(o,null,u.createElement(o,{color:`gray`},`→ forwarding to `),u.createElement(o,{color:`magenta`},e.wsUrl)),u.createElement(o,null,e.connected?u.createElement(o,{color:`green`},`● connected`):u.createElement(o,{color:`yellow`},`○ connecting…`),u.createElement(o,{color:`gray`},` · `,e.total,` requests · `,e.ok,` ok · `),u.createElement(o,{color:e.err>0?`red`:`gray`},e.err,` err`),e.lastStatus===null?null:u.createElement(o,{color:`gray`},` · last: HTTP `,e.lastStatus)),e.lastError?u.createElement(o,{color:`red`},`last error: `,e.lastError.slice(0,80)):null))}async function h(r){let h=await e(),g=await t({strict:!1});if(!g?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;let _=r.siteId??g.teamId??``;if(!_)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
|
|
2
2
|
`),2;if(!r.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
|
|
3
3
|
`),2;let v=r.to.match(/^https?:\/\//)?r.to:`http://${r.to}`,y=new n({config:h,cliVersion:r.cliVersion,token:g}),b;try{b=await y.createTunnel(_,r.to)}catch(e){return process.stderr.write(`Failed to register tunnel: ${e.message}\n`),1}let x=r.sign?r.secret??b.tunnelKey:null,S=()=>{let{exit:e}=c(),[t,n]=f({total:0,ok:0,err:0,lastStatus:null,lastError:null,publicUrl:b.publicUrl,wsUrl:b.wsUrl,connected:!1});return l((t,n)=>{(t===`q`||n.escape)&&e()}),d(()=>{let e=new AbortController,t=async e=>{try{let t={...e.headers};delete t.host,delete t[`content-length`],x&&(t[`X-Zenovay-Signature`]=`sha256=${await p(x,e.body)}`);let r=await fetch(v,{method:e.method,headers:t,body:e.method===`GET`||e.method===`HEAD`?void 0:e.body}),i=await r.text(),a={};return r.headers.forEach((e,t)=>{a[t]=e}),n(e=>({...e,total:e.total+1,ok:e.ok+(r.ok?1:0),err:e.err+(r.ok?0:1),lastStatus:r.status,lastError:r.ok?null:`HTTP ${r.status}`})),{status:r.status,headers:a,body:i}}catch(e){let t=e instanceof Error?e.message:String(e);return n(e=>({...e,total:e.total+1,err:e.err+1,lastError:t})),{status:502,body:JSON.stringify({error:`cli_local_failed`,detail:t})}}};return(async()=>{let r=y.tunnelClient(b.wsUrl);n(e=>({...e,connected:!0}));try{await r.start(t,e.signal)}catch(e){n(t=>({...t,connected:!1,lastError:e.message}))}})(),()=>{e.abort()}},[]),u.createElement(a,{flexDirection:`column`},u.createElement(i,{version:`webhooks forward`}),u.createElement(m,{stats:t}),u.createElement(o,{color:`gray`},`target: `,v,` `,r.sign?`· HMAC-signed`:``),u.createElement(o,{color:`gray`},`[q | Esc] quit`))},{waitUntilExit:C}=s(u.createElement(S,null));return await C(),0}export{h as webhooksForwardCommand};
|
package/dist/wizard-bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import(`./init-
|
|
2
|
+
import(`./init-DJ7cYn-0.js`).then(async({initCommand:e})=>{let{readFileSync:t}=await import(`node:fs`),n=await import(`node:path`),{fileURLToPath:r}=await import(`node:url`),i=n.dirname(r(import.meta.url)),a=JSON.parse(t(n.join(i,`..`,`package.json`),`utf8`)),o=process.argv.slice(2),s=o.includes(`--json`),c=o.includes(`--yes`),l=o.includes(`--skip-mcp`),u=o.includes(`--skip-verify`),d=await e({cliVersion:a.version,cwd:process.cwd(),json:s,yes:c,skipMcp:l,skipVerify:u});process.exit(d)});
|
package/package.json
CHANGED
package/dist/ai-tljhav25.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{ApiClient as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import"./telemetry-Chcnnkeu.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{detectInstalled as i,initCommand as a}from"./init-CVARLXd4.js";import{parseSseStream as o}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit as s,isHeadless as c}from"./emit-CRHuIcDu.js";import"./secrets-ApB7yh2A.js";import"./login-BYSspMWm.js";import{Panel as l}from"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import{Select as u}from"./prompt-Bk9qczy9.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{ChatPanel as d}from"./chat-panel-B9jVoY6L.js";import{Box as f,Text as p,render as m}from"ink";import h from"react";async function g(e){let t=await i(e.cwd),n;if(e.mode)n=e.mode;else if(!t.installed)n=`install`;else if(c(e))return s({type:`error`,code:`no_mode`,message:`Headless mode requires --mode chat|mcp|install`}),2;else n=await _(t);return n===`install`?a({cliVersion:e.cliVersion,cwd:e.cwd,json:e.json}):n===`chat`?v(e):y(e)}async function _(e){return new Promise(t=>{let n=[{label:`Chat with your analytics`,value:`chat`,description:`Ask natural-language questions about your data`},{label:`Manage via MCP`,value:`mcp`,description:`Create goals, funnels, sites, etc. in plain English`},{label:`Re-run install / repair`,value:`install`,description:`Run the install wizard again`}],{unmount:r}=m(h.createElement(f,{flexDirection:`column`},h.createElement(l,{title:`Zenovay detected${e.packageMarker?` (${e.packageMarker})`:``}`,state:`idle`},h.createElement(p,null,`What do you want to do?`)),h.createElement(u,{items:n,onSelect:e=>{r(),t(e)}})))})}async function v(t){let i=await e(),a=await n({strict:!1});if(!a)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let o=i.defaultSiteId,s=i.defaultSiteName,c=new r({config:i,cliVersion:t.cliVersion,token:a});return new Promise(e=>{let{unmount:n}=m(h.createElement(d,{cliVersion:t.cliVersion,api:c,dashboardContext:{commandName:`ai chat`,siteId:o,siteLabel:s,metricsSnapshot:null},onClose:()=>{n(),e(0)}}))})}async function y(r){let i=await e(),a=await n({strict:!1});if(!a)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new t({config:i,cliVersion:r.cliVersion,token:a});process.stdout.write(`
|
|
2
|
-
Zenovay · MCP mode — describe what you want to create or change. Ctrl-C to exit.
|
|
3
|
-
|
|
4
|
-
> `);let c=await b();if(!c)return 0;let l=await s.openAiStream(`mcp`,{messages:[{role:`user`,content:c}]});for await(let e of o(l)){if(e.type===`delta`&&process.stdout.write(e.content),e.type===`tool_start`&&process.stdout.write(`\n[tool: ${e.name}] `),e.type===`tool_result`&&process.stdout.write(`
|
|
5
|
-
[result]`),e.type===`done`){process.stdout.write(`
|
|
6
|
-
`);break}if(e.type===`error`)return process.stderr.write(`\n[${e.code}] ${e.message}\n`),1}return 0}function b(){return new Promise(e=>{let t=``,n=r=>{let i=r.toString(`utf8`);i.includes(`
|
|
7
|
-
`)||i.includes(`\r`)?(t+=i.replace(/[\r\n]/g,``),process.stdin.off(`data`,n),process.stdin.pause(),e(t)):t+=i};process.stdin.resume(),process.stdin.on(`data`,n)})}export{g as aiCommand};
|
package/dist/globe-BsihcEUp.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-Chcnnkeu.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit as r,isHeadless as i}from"./emit-CRHuIcDu.js";import{Panel as a,useTheme as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{ChatPanel as l}from"./chat-panel-B9jVoY6L.js";import{resolveSiteId as u}from"./resolve-site-tpOmUbqY.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{Bar as f}from"./bar-DWT-1xOE.js";import{deepLinkFor as p,openInBrowser as m}from"./keybar-deep-link-DC31T3CP.js";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useMemo as ee,useRef as te,useState as S}from"react";import ne from"ink-spinner";const C={DZ:{lat:28.0339,lng:1.6596,name:`Algeria`,spread:8},EG:{lat:26.8206,lng:30.8025,name:`Egypt`,spread:6},ET:{lat:9.145,lng:40.4897,name:`Ethiopia`,spread:6},GH:{lat:7.9465,lng:-1.0232,name:`Ghana`,spread:3},KE:{lat:-.0236,lng:37.9062,name:`Kenya`,spread:4},MA:{lat:31.7917,lng:-7.0926,name:`Morocco`,spread:5},NG:{lat:9.082,lng:8.6753,name:`Nigeria`,spread:5},ZA:{lat:-30.5595,lng:22.9375,name:`South Africa`,spread:7},TZ:{lat:-6.369,lng:34.8888,name:`Tanzania`,spread:5},UG:{lat:1.3733,lng:32.2903,name:`Uganda`,spread:3},TN:{lat:33.8869,lng:9.5375,name:`Tunisia`,spread:3},SN:{lat:14.4974,lng:-14.4524,name:`Senegal`,spread:3},CI:{lat:7.54,lng:-5.5471,name:`Côte d'Ivoire`,spread:3},CM:{lat:7.3697,lng:12.3547,name:`Cameroon`,spread:4},AO:{lat:-11.2027,lng:17.8739,name:`Angola`,spread:6},MZ:{lat:-18.6657,lng:35.5296,name:`Mozambique`,spread:6},ZW:{lat:-19.0154,lng:29.1549,name:`Zimbabwe`,spread:4},ZM:{lat:-13.1339,lng:27.8493,name:`Zambia`,spread:5},RW:{lat:-1.9403,lng:29.8739,name:`Rwanda`,spread:1.5},MG:{lat:-18.7669,lng:46.8691,name:`Madagascar`,spread:5},LY:{lat:26.3351,lng:17.2283,name:`Libya`,spread:8},SD:{lat:12.8628,lng:30.2176,name:`Sudan`,spread:7},US:{lat:39.0902,lng:-98.5795,name:`United States`,spread:18},CA:{lat:56.1304,lng:-106.3468,name:`Canada`,spread:22},MX:{lat:23.6345,lng:-102.5528,name:`Mexico`,spread:9},BR:{lat:-10.235,lng:-51.9253,name:`Brazil`,spread:18},AR:{lat:-38.4161,lng:-63.6167,name:`Argentina`,spread:11},CL:{lat:-35.6751,lng:-71.543,name:`Chile`,spread:11},CO:{lat:4.5709,lng:-74.2973,name:`Colombia`,spread:6},PE:{lat:-9.19,lng:-75.0152,name:`Peru`,spread:7},VE:{lat:6.4238,lng:-66.5897,name:`Venezuela`,spread:6},EC:{lat:-1.8312,lng:-78.1834,name:`Ecuador`,spread:3},BO:{lat:-16.2902,lng:-63.5887,name:`Bolivia`,spread:6},UY:{lat:-32.5228,lng:-55.7658,name:`Uruguay`,spread:2.5},PY:{lat:-23.4425,lng:-58.4438,name:`Paraguay`,spread:4},GT:{lat:15.7835,lng:-90.2308,name:`Guatemala`,spread:2},CU:{lat:21.5218,lng:-77.7812,name:`Cuba`,spread:3},DO:{lat:18.7357,lng:-70.1627,name:`Dominican Republic`,spread:1.5},CR:{lat:9.7489,lng:-83.7534,name:`Costa Rica`,spread:1.2},PA:{lat:8.538,lng:-80.7821,name:`Panama`,spread:1.5},HN:{lat:15.2,lng:-86.2419,name:`Honduras`,spread:2},PR:{lat:18.2208,lng:-66.5901,name:`Puerto Rico`,spread:.6},JM:{lat:18.1096,lng:-77.2975,name:`Jamaica`,spread:.7},TT:{lat:10.6918,lng:-61.2225,name:`Trinidad and Tobago`,spread:.6},GB:{lat:55.3781,lng:-3.436,name:`United Kingdom`,spread:3},IE:{lat:53.4129,lng:-8.2439,name:`Ireland`,spread:2},FR:{lat:46.6034,lng:1.8883,name:`France`,spread:4},DE:{lat:51.1657,lng:10.4515,name:`Germany`,spread:3.5},IT:{lat:41.8719,lng:12.5674,name:`Italy`,spread:3.5},ES:{lat:40.4637,lng:-3.7492,name:`Spain`,spread:4},PT:{lat:39.3999,lng:-8.2245,name:`Portugal`,spread:2},NL:{lat:52.1326,lng:5.2913,name:`Netherlands`,spread:1.2},BE:{lat:50.5039,lng:4.4699,name:`Belgium`,spread:1},CH:{lat:46.8182,lng:8.2275,name:`Switzerland`,spread:1.4},AT:{lat:47.5162,lng:14.5501,name:`Austria`,spread:2},PL:{lat:51.9194,lng:19.1451,name:`Poland`,spread:3.5},CZ:{lat:49.8175,lng:15.473,name:`Czechia`,spread:1.8},SE:{lat:60.1282,lng:18.6435,name:`Sweden`,spread:5},NO:{lat:60.472,lng:8.4689,name:`Norway`,spread:5},FI:{lat:61.9241,lng:25.7482,name:`Finland`,spread:4},DK:{lat:56.2639,lng:9.5018,name:`Denmark`,spread:1.5},IS:{lat:64.9631,lng:-19.0208,name:`Iceland`,spread:3},GR:{lat:39.0742,lng:21.8243,name:`Greece`,spread:3},TR:{lat:38.9637,lng:35.2433,name:`Turkey`,spread:6},RO:{lat:45.9432,lng:24.9668,name:`Romania`,spread:3},HU:{lat:47.1625,lng:19.5033,name:`Hungary`,spread:2},UA:{lat:48.3794,lng:31.1656,name:`Ukraine`,spread:5},RU:{lat:61.524,lng:80,name:`Russia`,spread:28},BG:{lat:42.7339,lng:25.4858,name:`Bulgaria`,spread:2},HR:{lat:45.1,lng:15.2,name:`Croatia`,spread:2},RS:{lat:44.0165,lng:21.0059,name:`Serbia`,spread:2},SK:{lat:48.669,lng:19.699,name:`Slovakia`,spread:1.8},SI:{lat:46.1512,lng:14.9955,name:`Slovenia`,spread:1.2},LT:{lat:55.1694,lng:23.8813,name:`Lithuania`,spread:1.5},LV:{lat:56.8796,lng:24.6032,name:`Latvia`,spread:1.5},EE:{lat:58.5953,lng:25.0136,name:`Estonia`,spread:1.5},BY:{lat:53.7098,lng:27.9534,name:`Belarus`,spread:3},MD:{lat:47.4116,lng:28.3699,name:`Moldova`,spread:1.2},AL:{lat:41.1533,lng:20.1683,name:`Albania`,spread:1},MK:{lat:41.6086,lng:21.7453,name:`North Macedonia`,spread:1},BA:{lat:43.9159,lng:17.6791,name:`Bosnia and Herzegovina`,spread:1.2},ME:{lat:42.7087,lng:19.3744,name:`Montenegro`,spread:.8},XK:{lat:42.6026,lng:20.903,name:`Kosovo`,spread:.7},LU:{lat:49.8153,lng:6.1296,name:`Luxembourg`,spread:.4},MT:{lat:35.9375,lng:14.3754,name:`Malta`,spread:.3},CY:{lat:35.1264,lng:33.4299,name:`Cyprus`,spread:.6},CN:{lat:35.8617,lng:104.1954,name:`China`,spread:18},JP:{lat:36.2048,lng:138.2529,name:`Japan`,spread:5},KR:{lat:35.9078,lng:127.7669,name:`South Korea`,spread:2},IN:{lat:20.5937,lng:78.9629,name:`India`,spread:12},ID:{lat:-2.7893,lng:113.9213,name:`Indonesia`,spread:12},PH:{lat:12.8797,lng:121.774,name:`Philippines`,spread:5},VN:{lat:14.0583,lng:108.2772,name:`Vietnam`,spread:5},TH:{lat:15.87,lng:100.9925,name:`Thailand`,spread:4},MY:{lat:4.2105,lng:101.9758,name:`Malaysia`,spread:4},SG:{lat:1.3521,lng:103.8198,name:`Singapore`,spread:.3},PK:{lat:30.3753,lng:69.3451,name:`Pakistan`,spread:6},BD:{lat:23.685,lng:90.3563,name:`Bangladesh`,spread:3},LK:{lat:7.8731,lng:80.7718,name:`Sri Lanka`,spread:2},MM:{lat:21.9162,lng:95.956,name:`Myanmar`,spread:6},KH:{lat:12.5657,lng:104.991,name:`Cambodia`,spread:3},LA:{lat:19.8563,lng:102.4955,name:`Laos`,spread:3},NP:{lat:28.3949,lng:84.124,name:`Nepal`,spread:3},IR:{lat:32.4279,lng:53.688,name:`Iran`,spread:7},IQ:{lat:33.2232,lng:43.6793,name:`Iraq`,spread:4},IL:{lat:31.0461,lng:34.8516,name:`Israel`,spread:1},SA:{lat:23.8859,lng:45.0792,name:`Saudi Arabia`,spread:8},AE:{lat:23.4241,lng:53.8478,name:`UAE`,spread:2},QA:{lat:25.3548,lng:51.1839,name:`Qatar`,spread:.6},KW:{lat:29.3117,lng:47.4818,name:`Kuwait`,spread:.8},OM:{lat:21.4735,lng:55.9754,name:`Oman`,spread:4},JO:{lat:30.5852,lng:36.2384,name:`Jordan`,spread:2},LB:{lat:33.8547,lng:35.8623,name:`Lebanon`,spread:.7},SY:{lat:34.8021,lng:38.9968,name:`Syria`,spread:3},YE:{lat:15.5527,lng:48.5164,name:`Yemen`,spread:4},AF:{lat:33.9391,lng:67.71,name:`Afghanistan`,spread:5},KZ:{lat:48.0196,lng:66.9237,name:`Kazakhstan`,spread:13},UZ:{lat:41.3775,lng:64.5853,name:`Uzbekistan`,spread:5},TM:{lat:38.9697,lng:59.5563,name:`Turkmenistan`,spread:5},KG:{lat:41.2044,lng:74.7661,name:`Kyrgyzstan`,spread:3},TJ:{lat:38.861,lng:71.2761,name:`Tajikistan`,spread:3},AZ:{lat:40.1431,lng:47.5769,name:`Azerbaijan`,spread:2},GE:{lat:42.3154,lng:43.3569,name:`Georgia`,spread:2},AM:{lat:40.0691,lng:45.0382,name:`Armenia`,spread:1.2},HK:{lat:22.3193,lng:114.1694,name:`Hong Kong`,spread:.3},TW:{lat:23.6978,lng:120.9605,name:`Taiwan`,spread:1.5},AU:{lat:-25.2744,lng:133.7751,name:`Australia`,spread:18},NZ:{lat:-40.9006,lng:174.886,name:`New Zealand`,spread:5},PG:{lat:-6.314,lng:143.9555,name:`Papua New Guinea`,spread:5},FJ:{lat:-16.578,lng:179.4144,name:`Fiji`,spread:1}},re=Object.fromEntries(Object.entries(C).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function w(e){return!e||e.length!==2?null:C[e.toUpperCase()]??null}function T(e,t){let n=w(e);if(!n||t<=0)return[];let r=[],i=0;for(let t=0;t<e.length;t++)i=i*31+e.charCodeAt(t)>>>0;for(let e=0;e<t;e++){i=i+1831565813>>>0;let e=i;e=Math.imul(e^e>>>15,e|1)>>>0,e=(e^e+(Math.imul(e^e>>>7,e|61)>>>0))>>>0;let t=((e^e>>>14)>>>0)/4294967296;i=i+2246822507>>>0;let a=i;a=Math.imul(a^a>>>15,a|1)>>>0,a=(a^a+(Math.imul(a^a>>>7,a|61)>>>0))>>>0;let o=((a^a>>>14)>>>0)/4294967296,s=n.spread*Math.sqrt(t),c=o*2*Math.PI;r.push({lat:n.lat+s*Math.sin(c)*.7,lng:n.lng+s*Math.cos(c)/Math.max(.3,Math.cos(n.lat*Math.PI/180))})}return r}const E=360,D=180,O=new Uint8Array(E*D),k=new Uint8Array(E*D),A=[`__OCEAN__`];function j(e){let t=(e%360+360)%360;return Math.floor(t)}function M(e){return Math.max(0,Math.min(D-1,Math.floor(90-e)))}function N(e,t,n){let r=M(e),i=j(t);O[r*E+i]=1,k[r*E+i]=n}for(let e of Object.keys(C)){let t=C[e];A.push(e);let n=A.length-1,r=Math.max(.5,t.spread*.85),i=Math.max(.25,Math.cos(t.lat*Math.PI/180)),a=Math.max(.5,t.spread/i),o=Math.floor(t.lat-r),s=Math.ceil(t.lat+r),c=Math.floor(t.lng-a),l=Math.ceil(t.lng+a);for(let e=o;e<=s;e++)for(let i=c;i<=l;i++){let o=(e-t.lat)/r,s=(i-t.lng)/a;s*s+o*o>1||N(e,i,n)}}const P=new Uint8Array(O);for(let e=1;e<D-1;e++)for(let t=0;t<E;t++){if(O[e*E+t])continue;let n=0,r=0;for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){if(i===0&&a===0)continue;let o=(t+a+E)%E;O[(e+i)*E+o]&&(n++,r||=k[(e+i)*E+o]??0)}n>=4&&(P[e*E+t]=1,k[e*E+t]=r)}O.set(P);const F=new Uint8Array(E*D);for(let e=0;e<D;e++)for(let t=0;t<E;t++){let n=k[e*E+t];if(!n)continue;let r=e>0?k[(e-1)*E+t]:0,i=e<D-1?k[(e+1)*E+t]:0,a=k[e*E+(t-1+E)%E],o=k[e*E+(t+1)%E];(r!==n||i!==n||a!==n||o!==n)&&(F[e*E+t]=1)}function I(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(D-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return O[n*E+i]===1?1:0}function L(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(D-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return F[n*E+i]===1?1:0}function R(e){return e*Math.PI/180}function z(e,t){let n=R(e),r=R(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function B(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:n*e.x+r*e.z,y:e.y,z:-r*e.x+n*e.z}}function V(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:e.x,y:n*e.y-r*e.z,z:r*e.y+n*e.z}}function H(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function U(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function W(e,t,n,r){let i=r*r;for(let a=-r;a<=r;a++)for(let o=-r;o<=r;o++)o*o+a*a<=i&&U(e,Math.round(t+o),Math.round(n+a))}const G=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function K(e,t,n){let r=0;for(let i=0;i<G.length;i++){let[a,o]=G[i],s=t*2+a,c=n*4+o;e.bits[c*e.dw+s]&&(r|=1<<i)}return r===0?` `:String.fromCodePoint(10240+r)}function q(e,t,n){let r=0;for(let i=0;i<4;i++)for(let a=0;a<2;a++){let o=t*2+a,s=n*4+i;e.bits[s*e.dw+o]&&r++}return r===0?` `:r<=2?`·`:r<=5?`○`:`●`}function J(e){if(e)return!0;let t=process.env;if(t.NO_COLOR||t.ZENOVAY_GLOBE===`ascii`)return!0;let n=(t.LANG||t.LC_ALL||t.LC_CTYPE||``).toLowerCase();return!!(n&&!n.includes(`utf`))}function Y(e,t,n){if(e.z<0)return null;let r=t/2,i=n/2,a=Math.min(t,n/2)*.95;return{x:r+e.x*a,y:i-e.y*a}}function X(e){let t=e.dw/2,n=e.dh/2,r=Math.min(e.dw,e.dh/2)*.95,i=Math.round(2*Math.PI*r);for(let a=0;a<i;a++){let o=a/i*2*Math.PI,s=Math.round(t+r*Math.cos(o)),c=Math.round(n+r*Math.sin(o));U(e,s,c)}}function ie(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=V(B(z(r,i),t),n),o=Y(a,e.dw,e.dh);o&&U(e,Math.round(o.x),Math.round(o.y))}for(let r=-180;r<180;r+=30)for(let i=-85;i<=85;i+=4){let a=V(B(z(i,r),t),n),o=Y(a,e.dw,e.dh);o&&U(e,Math.round(o.x),Math.round(o.y))}}function ae({visitors:e,highlight:t,width:n=50,height:r=25,rotationDeg:i=0,tiltDeg:a=20,gridlines:s=!0,asciiOnly:c}){let{theme:l}=o(),u=J(c),d=H(n,r),f=H(n,r),p=H(n,r),m=H(n,r),_=H(n,r),v=R(i),y=R(-a);X(d),s&&ie(d,v,y);{let e=f.dw/2,t=f.dh/2,n=Math.min(f.dw,f.dh/2)*.95,r=Math.cos(v),i=Math.sin(v),a=Math.cos(y),o=Math.sin(y);for(let s=0;s<f.dh;s++){let c=(t-s)/n;if(!(c<-1||c>1))for(let t=0;t<f.dw;t++){let l=(t-e)/n,u=l*l+c*c;if(u>1)continue;let d=Math.sqrt(1-u),m=l,h=c,g=a*h+o*d,_=-o*h+a*d,v=r*m-i*_,y=i*m+r*_,b=Math.asin(g)*(180/Math.PI),x=Math.atan2(v,y)*(180/Math.PI);I(b,x)&&(U(f,t,s),L(b,x)&&U(p,t,s))}}}for(let t of e){let e=V(B(z(t.lat,t.lng),v),y),n=Y(e,m.dw,m.dh);if(!n)continue;let r=typeof t.freshness==`number`?t.freshness:.5;W(m,n.x,n.y,r>.7?2:1)}if(t&&t.length>0)for(let e of t){let t=V(B(z(e.lat,e.lng),v),y),n=Y(t,_.dw,_.dh);if(!n)continue;W(_,n.x,n.y,2)}let x=[];for(let e=0;e<r;e++){let t=[],r=null,i=(e,n)=>{r&&r.color===e?r.text+=n:(r={color:e,text:n},t.push(r))};for(let r=0;r<n;r++){let n=u?q(_,r,e):K(_,r,e);if(n!==` `){i(l.warn,n);continue}let a=u?q(m,r,e):K(m,r,e);if(a!==` `){i(l.accent,a);continue}let o=u?q(p,r,e):K(p,r,e);if(o!==` `){i(l.fg,o);continue}let s=u?q(f,r,e):K(f,r,e);if(s!==` `){i(l.success,s);continue}let c=u?q(d,r,e):K(d,r,e);if(c!==` `){i(l.muted,c);continue}let h=t.length>0?t[t.length-1]:void 0;i(h?h.color:l.muted,` `)}x.push(b.createElement(h,{key:e},b.createElement(g,null,t.map((e,t)=>b.createElement(g,{key:t,color:e.color,bold:!0},e.text)))))}return b.createElement(h,{flexDirection:`column`},x)}async function Z(e,t,n){let r=await e.getGeo(t).catch(()=>({countries:[],cities:[]})),i=(r.countries??[]).map(e=>{let t=w(e.country),r=n.get(e.country)??0;return{code:e.country,visitors:e.visitors,lat:t?.lat,lng:t?.lng,freshness:e.visitors>r?1:.4}});return{countries:i,totalVisitors:i.reduce((e,t)=>e+t.visitors,0),unknownCount:i.filter(e=>typeof e.lat!=`number`).reduce((e,t)=>e+t.visitors,0),lastFetchedAt:Date.now()}}async function Q(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),l,d;try{({siteId:l,site:d}=await u(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??l;if(a.browser){let e=p(`globe`,{siteId:l});a.json?process.stdout.write(JSON.stringify({openedUrl:e})+`
|
|
2
|
-
`):process.stdout.write(`\n Opening Mapbox globe in your default browser:\n ${e}\n\n`);try{await m(e)}catch{}return 0}if(i(a)){let e=await Z(c,l,new Map);return r({type:`globe.snapshot`,data:{countries:e.countries,total:e.totalVisitors,unknownCount:e.unknownCount}}),0}return new Promise(e=>{let{unmount:t}=_(b.createElement(ue,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const oe=5e3,se=60,ce=1,le=80,ue=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:u}=v(),{theme:_}=o(),[C,re]=S(null),[E,D]=S(!0),[O,k]=S(null),[A,j]=S(0),[M,N]=S(!1),[P,F]=S(20),[I,L]=S(1),[R,z]=S(0),B=te(new Map),[V,H]=S(!1);y(n=>{if(!V){if(n===`/`){H(!0);return}if(n===`q`){u(),i(0);return}if(n===` `){N(e=>!e);return}if(n===`+`||n===`=`){L(e=>Math.min(1.6,e+.1));return}if(n===`-`||n===`_`){L(e=>Math.max(.7,e-.1));return}if(n===`t`){F(e=>(e+15)%60);return}if(n===`j`){z(e=>e+1);return}if(n===`k`){z(e=>Math.max(0,e-1));return}if(n===`o`||n===`O`||n===`w`){m(p(`globe`,{siteId:t}));return}if(n===`c`&&C){let e=C.countries[R];e?.lng!==void 0&&(j(-e.lng),N(!0));return}n===`r`&&(async()=>{try{let n=await Z(e,t,B.current);B.current=new Map(n.countries.map(e=>[e.code,e.visitors])),re(n)}catch(e){k(e.message)}})()}}),x(()=>{let n=!1,r=null,i=async()=>{try{let r=await Z(e,t,B.current);if(n)return;B.current=new Map(r.countries.map(e=>[e.code,e.visitors])),re(r),D(!1)}catch(e){n||(k(e.message),D(!1))}n||(r=setTimeout(i,oe))};return i(),()=>{n=!0,r&&clearTimeout(r)}},[e,t]),x(()=>{if(M)return;let e=setInterval(()=>{j(e=>(e+ce)%360)},se);return()=>clearInterval(e)},[M]);let U=ee(()=>{if(!C)return[];let e=[];for(let t of C.countries){if(typeof t.lat!=`number`||typeof t.lng!=`number`)continue;let n=Math.min(le,Math.max(3,t.visitors*5));for(let r of T(t.code,n))e.push({lat:r.lat,lng:r.lng,freshness:t.freshness})}return e},[C]),W=ee(()=>{if(!C)return[];let e=C.countries[Math.min(R,C.countries.length-1)];return!e||typeof e.lat!=`number`?[]:T(e.code,Math.min(80,Math.max(8,e.visitors*4)))},[C,R]),G=`globe · ${n} · live`,K=[{key:`q`,label:`quit`},{key:`j/k`,label:`select country`},{key:`c`,label:`center on selected`},{key:`space`,label:M?`resume`:`pause`},{key:`t`,label:`tilt ${P}°`},{key:`+/-`,label:`zoom`},{key:`o`,label:`open web globe`},{key:`r`,label:`refresh`},{key:`/`,label:`ask AI`}];if(V)return b.createElement(l,{cliVersion:r,api:e,dashboardContext:{commandName:`globe`,siteId:t,siteLabel:n,metricsSnapshot:C},onClose:()=>H(!1)});if(E)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),b.createElement(a,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:`cyan`},b.createElement(ne,{type:`dots`})),b.createElement(g,null,` Spinning up Earth…`))));if(O)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),b.createElement(d,{reason:`error`,headline:`Failed to load`,hint:O}),b.createElement(c,{items:K}));if(!C||C.countries.length===0&&C.unknownCount===0)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),b.createElement(d,{reason:`no-data`,headline:`No geolocated visitors yet`,hint:`Visit your site to populate the map.`}),b.createElement(c,{items:K}));let q=process.stdout.columns??100,J=36,Y=Math.max(40,Math.min(90,q-J-4)),X=Math.round(Y*I),ie=Math.round(X*.5),Q=C.countries.slice(0,12),ue=Math.max(1,...Q.map(e=>e.visitors)),de=Math.max(1,Math.floor((Date.now()-C.lastFetchedAt)/1e3)),$=C.countries[Math.min(R,C.countries.length-1)],fe=$?w($.code):null;return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),$?b.createElement(h,{flexDirection:`row`,marginBottom:1},b.createElement(h,{width:2}),b.createElement(h,{borderStyle:`round`,borderColor:_.warn,paddingX:1},b.createElement(g,{color:_.warn,bold:!0},fe?.name??$.code),b.createElement(g,{color:_.dim},` · `),b.createElement(g,{color:_.fg},$.visitors,` visitor`,$.visitors===1?``:`s`))):null,b.createElement(h,{flexDirection:`row`},b.createElement(h,{flexDirection:`column`,marginRight:2},b.createElement(ae,{visitors:U,highlight:W,width:X,height:ie,rotationDeg:A,tiltDeg:P}),b.createElement(h,{marginTop:1},b.createElement(g,{color:_.dim},C.totalVisitors,` visitors · `,C.countries.length,` countries`,C.unknownCount>0?` · ${C.unknownCount} unmapped`:``,` · `,M?`rotation paused`:`↻ ${ce}°/${se}ms`,` · refreshed `,de,`s ago`))),b.createElement(h,{flexDirection:`column`,width:J},b.createElement(a,{title:`Live by country`},Q.map((e,t)=>{let n=t===Math.min(R,C.countries.length-1),r=e.freshness>.7,i=n?_.warn:r?_.success:_.fg;return b.createElement(h,{key:e.code,flexDirection:`row`},b.createElement(h,{width:2},b.createElement(g,{color:_.warn},n?`›`:` `)),b.createElement(h,{width:3},b.createElement(g,{color:i,bold:n},e.code)),b.createElement(f,{value:e.visitors,max:ue,width:14,showPercent:!1}),b.createElement(h,{width:6},b.createElement(g,{color:_.muted},String(e.visitors).padStart(5))))})),C.countries.length>12?b.createElement(h,{marginTop:1},b.createElement(g,{color:_.muted},`+`,C.countries.length-12,` more (j/k to scroll)`)):null)),b.createElement(c,{items:K}))};export{Q as globeCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-tpOmUbqY.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";async function C(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 u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{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??d;if(a(o)){let e=await u.getHeatmaps(d);return i({type:`heatmaps.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(w,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[C,w]=x(!0),[T,E]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`heatmaps`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getHeatmaps(t);n||(g(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching heatmaps…`))));if(T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:T}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No heatmaps yet`,hint:`Enable heatmaps in your site settings`}));let D=[{key:`url`,label:`page`,width:36},{key:`type`,label:`type`,width:12},{key:`captureCount`,label:`captures`,align:`right`,width:10},{key:`createdAt`,label:`first seen`,width:24}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(o,{title:`Heatmaps (${l.length})`},y.createElement(u,{columns:D,data:l,zebra:!0})),y.createElement(m,{marginTop:1},y.createElement(h,{color:`gray`},`Open any heatmap at https://app.zenovay.com/heatmaps`)),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{C as heatmapsCommand};
|
package/dist/init-CgNl0TCs.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import{initCommand as e}from"./init-CVARLXd4.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import"./emit-CRHuIcDu.js";import"./secrets-ApB7yh2A.js";import"./login-BYSspMWm.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-Bk9qczy9.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";export{e as initCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-tpOmUbqY.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";function S(e){return e===`critical`?`err`:e===`warning`?`warn`:`ok`}function C(e){return e===`anomaly`?`⚡ anomaly`:e===`recommendation`?`✦ recommendation`:`↗ trend`}async function w(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 u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{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??d;if(a(o)){let e=await u.getInsights(d);return i({type:`insights.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(T,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const T=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=g(),[l,h]=b(null),[w,T]=b(!0),[E,D]=b(null);return _(e=>{if(e===`o`||e===`O`){f(d(`insights`,{siteId:t}));return}e===`q`&&(a(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getInsights(t);n||(h(r),T(!1))}catch(e){n||(D(e.message),T(!1))}})(),()=>{n=!0}},[e,t]),w?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`insights · ${n}`}),v.createElement(o,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Fetching insights…`)))):E?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`insights · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:E})):!l||l.length===0?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`insights · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No insights yet`,hint:`Insights are generated nightly — check back tomorrow`})):v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`insights · ${n}`}),l.map((e,t)=>v.createElement(o,{key:t,title:`${C(e.kind)} · ${e.severity}`,state:S(e.severity)},v.createElement(m,{bold:!0},e.title),e.body?v.createElement(m,{color:`gray`},e.body):null)),v.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{w as insightsCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-tpOmUbqY.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(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 u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{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??d;if(a(o)){let e=await u.getJourneys(d);return i({type:`journeys.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(C,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=g(),[l,h]=b(null),[S,C]=b(!0),[w,T]=b(null);if(_(e=>{if(e===`o`||e===`O`){f(d(`journeys`,{siteId:t}));return}e===`q`&&(a(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getJourneys(t);n||(h(r.flows),C(!1))}catch(e){n||(T(e.message),C(!1))}})(),()=>{n=!0}},[e,t]),S)return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`journeys · ${n}`}),v.createElement(o,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Computing flows…`))));if(w)return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`journeys · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:w}));if(!l||l.length===0)return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`journeys · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No journeys yet`,hint:`Need at least 2 page-views per session to compute flows`}));let E=Math.max(...l.map(e=>e.count),1),D=12;return v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`journeys · ${n}`}),v.createElement(o,{title:`Top page transitions (${l.length})`},l.map((e,t)=>{let n=Math.max(1,Math.round(e.count/E*D));return v.createElement(p,{key:t,flexDirection:`row`},v.createElement(m,null,e.from.padEnd(22).slice(0,22)),v.createElement(m,{color:`cyan`},` → `),v.createElement(m,null,e.to.padEnd(22).slice(0,22)),v.createElement(m,{color:`magenta`},` `,`█`.repeat(n),`░`.repeat(D-n)),v.createElement(m,{color:`gray`},` ${e.count}`))})),v.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{S as journeysCommand};
|
package/dist/live-Ko1UCfea.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-Chcnnkeu.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit as r,isHeadless as i}from"./emit-CRHuIcDu.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import{ChatPanel as c}from"./chat-panel-B9jVoY6L.js";import{resolveSiteId as l}from"./resolve-site-tpOmUbqY.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{MetricCard as d}from"./metric-card-COEIZmbN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";async function C(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await l(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await c.getLive(u);return r({type:`live.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(w,{api:c,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:l}=_(),[g,C]=x(null),[w,T]=x(!0),[E,D]=x(null),[O,k]=x(!1);if(v(e=>{if(!O){if(e===`/`){k(!0);return}if(e===`o`||e===`O`){p(f(`live`,{siteId:t}));return}e===`q`&&(l(),i(0))}}),b(()=>{if(O)return;let n=!1,r=async()=>{try{let r=await e.getLive(t);n||(C(r),T(!1),D(null))}catch(e){n||(D(e.message),T(!1))}};r();let i=setInterval(r,2e3);return()=>{n=!0,clearInterval(i)}},[e,t,O]),O)return y.createElement(c,{cliVersion:r,api:e,dashboardContext:{commandName:`live`,siteId:t,siteLabel:n,metricsSnapshot:g},onClose:()=>k(!1)});if(w)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:`live · ${n}`}),y.createElement(a,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Connecting…`))));if(E&&!g)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:`live · ${n}`}),y.createElement(u,{reason:`error`,headline:`Failed to load`,hint:E}));let A=process.stdout.columns??80,j=Math.max(20,Math.min(40,Math.floor(A/3)));return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:`live · ${n}`}),y.createElement(d,{title:`Active now`,value:g?.activeVisitors??0,format:`number`,width:j}),y.createElement(a,{title:`Recent events`},!g||g.recentEvents.length===0?y.createElement(h,{color:`gray`},`— waiting for events —`):g.recentEvents.slice(0,15).map((e,t)=>y.createElement(m,{key:t},y.createElement(h,{color:`cyan`},(e.type??`pageview`).padEnd(10)),y.createElement(h,null,e.path.padEnd(36).slice(0,36)),y.createElement(h,{color:`gray`},e.country??`—`)))),y.createElement(s,{items:[{key:`/`,label:`ask AI`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{C as liveCommand};
|
package/dist/login-BYSspMWm.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{ApiClient as t,pollDeviceToken as n,startDeviceAuthorization as r}from"./api-BD_nTdOq.js";import{writeToken as i}from"./token-store-DWXh9r3Z.js";import{emit as a,isHeadless as o}from"./emit-CRHuIcDu.js";import s from"node:path";import{promises as c}from"node:fs";import l from"node:os";import u from"open";async function d(s){let c=await e(),l=o({json:s.json}),d=await r({apiBase:c.apiBase}),f=d.verification_uri_complete??d.verification_uri;l?a({type:`info`,message:`Open ${f} and enter code ${d.user_code}`}):s.onCode?s.onCode({userCode:d.user_code,verificationUri:d.verification_uri,verificationUriComplete:d.verification_uri_complete}):process.stdout.write(`\n Open this URL to authorize the CLI:\n ${f}\n Or enter code: ${d.user_code}\n\n`);let p=s.openBrowser??!l;if(p)try{await u(f)}catch{}let m=await n({apiBase:c.apiBase,deviceCode:d.device_code,interval:d.interval,expiresIn:d.expires_in});await i(m);let h=new t({config:c,cliVersion:s.cliVersion,token:m}),_=await h.me().catch(()=>null);if(_){let e={...m,userId:_.user.id,teamId:_.team?.id,email:_.user.email};await i(e)}return l?a({type:`done`,command:`login`,exitCode:0}):await g().catch(()=>void 0),{email:_?.user.email}}function f(){let e=process.env.SHELL??``,t=l.homedir();if(e.endsWith(`/zsh`)||e.endsWith(`zsh`))return{shell:`zsh`,rcPath:s.join(t,`.zshrc`)};if(e.endsWith(`/bash`)||e.endsWith(`bash`)){let e=process.platform===`darwin`?s.join(t,`.bash_profile`):s.join(t,`.bashrc`);return{shell:`bash`,rcPath:e}}return e.endsWith(`/fish`)||e.endsWith(`fish`)?{shell:`fish`,rcPath:s.join(t,`.config`,`fish`,`config.fish`)}:null}const p=/zenovay\s+completions/;async function m(e,t){try{let n=await c.readFile(e,`utf8`);return t.test(n)}catch{return!1}}function h(e){return process.stdin.isTTY?new Promise(t=>{process.stdout.write(e),process.stdin.setEncoding(`utf8`);let n=e=>{process.stdin.removeListener(`data`,n);try{process.stdin.pause()}catch{}let r=e.trim().toLowerCase();return t(r===``||r===`y`||r===`yes`)};process.stdin.resume(),process.stdin.on(`data`,n)}):Promise.resolve(!1)}async function g(){let e=f();if(!e||await m(e.rcPath,p))return;let t=await h(`Install shell completions for ${e.shell}? [Y/n] `);if(!t){process.stdout.write(`Skipped. You can install later with: zenovay completions ${e.shell} >> ${e.rcPath}\n`);return}let n=e.shell===`fish`?`zenovay completions fish | source
|
|
2
|
-
`:`eval "$(zenovay completions ${e.shell})"\n`;try{await c.mkdir(s.dirname(e.rcPath),{recursive:!0}),await c.appendFile(e.rcPath,`\n# Added by zenovay login\n${n}`,`utf8`),process.stdout.write(`✓ Completions installed. Restart your shell or source ${e.rcPath}.\n`)}catch(t){process.stdout.write(`Could not write ${e.rcPath} (${t.message}). Run manually: zenovay completions ${e.shell} >> ${e.rcPath}\n`)}}export{d as loginCommand};
|
package/dist/logout-C7J2gWKj.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{ApiClient as t}from"./api-BD_nTdOq.js";import{clearToken as n,readToken as r}from"./token-store-DWXh9r3Z.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";async function o(o){let s=await e(),c=await r({strict:!1}).catch(()=>null);if(c)try{let e=new t({config:s,cliVersion:o.cliVersion,token:c});await e.revokeCurrentToken()}catch{}await n(),a({json:o.json})?i({type:`done`,command:`logout`,exitCode:0}):process.stdout.write(`Logged out.
|
|
2
|
-
`)}export{o as logoutCommand};
|
package/dist/pages-4kat87s8.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{emit as r,isHeadless as i}from"./emit-CRHuIcDu.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-tpOmUbqY.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getPages(u);return r({type:`pages.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(C,{api:l,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:c}=g(),[h,S]=b(null),[C,w]=b(!0),[T,E]=b(null);if(_(e=>{if(e===`o`||e===`O`){f(d(`pages`,{siteId:t}));return}e===`q`&&(c(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getPages(t);n||(S(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`pages · ${n}`}),v.createElement(a,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Fetching pages…`))));if(T)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`pages · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:T}));if(!h||h.length===0)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`pages · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No pages yet`,hint:`Visit your site to send the first event`}));let D=[{key:`path`,label:`path`,width:36},{key:`views`,label:`views`,align:`right`,width:8},{key:`uniqueVisitors`,label:`unique`,align:`right`,width:8},{key:`avgTime`,label:`avg time`,align:`right`,width:9,format:e=>typeof e==`number`?`${Math.round(e/1e3)}s`:`—`},{key:`bounceRate`,label:`bounce`,align:`right`,width:7,format:e=>typeof e==`number`?`${(e*100).toFixed(0)}%`:`—`}];return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`pages · ${n}`}),v.createElement(a,{title:`Top pages (${h.length})`},v.createElement(l,{columns:D,data:h,zebra:!0})),v.createElement(s,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{S as pagesCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-tpOmUbqY.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";function S(e){return e>=.6?`magenta`:e>=.4?`cyan`:e>=.2?`blue`:`gray`}function C(e){return!Number.isFinite(e)||e===0?` — `:` ${(e*100).toFixed(0).padStart(3)}% `}async function w(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 u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{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??d;if(a(o)){let e=await u.getRetention(d);return i({type:`retention.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(T,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const T=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=g(),[l,h]=b(null),[w,T]=b(!0),[E,D]=b(null);return _(e=>{if(e===`o`||e===`O`){f(d(`retention`,{siteId:t}));return}e===`q`&&(a(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getRetention(t);n||(h(r.cohorts),T(!1))}catch(e){n||(D(e.message),T(!1))}})(),()=>{n=!0}},[e,t]),w?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(o,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Crunching cohorts…`)))):E?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:E})):!l||l.length===0?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No retention data yet`,hint:`Retention needs at least 30 days of traffic`})):v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(o,{title:`Cohort retention (D1 / D7 / D30)`},v.createElement(p,{flexDirection:`row`},v.createElement(m,{bold:!0},`cohort`.padEnd(12)),v.createElement(m,{bold:!0},` D1 `),v.createElement(m,{bold:!0},` D7 `),v.createElement(m,{bold:!0},` D30 `)),l.map(e=>v.createElement(p,{key:e.date,flexDirection:`row`},v.createElement(m,null,e.date.padEnd(12).slice(0,12)),v.createElement(m,{color:S(e.day1)},C(e.day1)),v.createElement(m,{color:S(e.day7)},C(e.day7)),v.createElement(m,{color:S(e.day30)},C(e.day30))))),v.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{w as retentionCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-tpOmUbqY.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";function C(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 w(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 T(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 u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{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??d;if(a(o)){let e=await u.getSessions(d);return i({type:`sessions.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[T,E]=x(!0),[D,O]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`sessions`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getSessions(t);n||(g(r),E(!1))}catch(e){n||(O(e.message),E(!1))}})(),()=>{n=!0}},[e,t]),T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching sessions…`))));if(D)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:D}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No replays yet`,hint:`Enable session replay in your site settings`}));let k=[{key:`id`,label:`session id`,width:24},{key:`visitor`,label:`visitor`,width:18},{key:`duration`,label:`duration`,align:`right`,width:9,format:e=>C(e)},{key:`startedAt`,label:`when`,align:`right`,width:6,format:e=>w(String(e))},{key:`pageCount`,label:`events`,align:`right`,width:7},{key:`deviceType`,label:`device`,width:8,format:e=>String(e??`—`)}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(o,{title:`Recent sessions (${l.length})`},y.createElement(u,{columns:k,data:l,zebra:!0})),y.createElement(m,{marginTop:1},y.createElement(h,{color:`gray`},`Open any session for replay at https://app.zenovay.com/replay`)),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{T as sessionsCommand};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emit$1 as n}from"./telemetry-Chcnnkeu.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{spawn as i}from"node:child_process";import a from"node:path";import{existsSync as o,mkdirSync as s,readFileSync as c,renameSync as l,unlinkSync as u,writeFileSync as d}from"node:fs";import{homedir as f}from"node:os";const p=6e4;function m(){return a.join(f(),`.zenovay`)}function h(){return a.join(m(),`status-agent.pid`)}function g(){return a.join(m(),`tmux-status`)}function _(){s(m(),{recursive:!0,mode:448})}function v(e){let t=h(),n=`${t}.tmp.${process.pid}`;d(n,String(e),{mode:384}),l(n,t)}function y(e){try{return process.kill(e,0),!0}catch{return!1}}function b(e){if(!e)return[];let t=[];for(let n of e.split(`,`).map(e=>e.trim()).filter(Boolean)){let e=n.match(/^([a-z_]+)\s*(>|<)\s*(-?\d+(?:\.\d+)?)$/i);if(!e)continue;t.push({key:(e[1]??``).toLowerCase(),op:e[2]??`>`,value:Number(e[3]??0)})}return t}function x(e,t,n){let r=(t/1e5).toFixed(1);return[`#[fg=colour141]● ${e} live`,`#[fg=colour114]▲ MRR $${r}k`,`#[fg=colour203]✗ ${n.toFixed(0)} err/s`].join(` `)}const S=5*60*1e3,C=new Map;function w(e,t){let n=Math.floor(t/10),r=`${e}:${n}`,i=Date.now(),a=C.get(r);return a&&i-a<S?!1:(C.set(r,i),!0)}async function T(e,t){let n=process.platform;try{if(n===`darwin`){await new Promise((n,r)=>{let a=i(`terminal-notifier`,[`-title`,e,`-message`,t,`-group`,`zenovay`],{stdio:`ignore`});a.on(`error`,r),a.on(`exit`,()=>n())});return}if(n===`linux`){await new Promise((n,r)=>{let a=i(`notify-send`,[e,t],{stdio:`ignore`});a.on(`error`,r),a.on(`exit`,()=>n())});return}}catch{}process.stdout.write(`\x1b]9;${e} — ${t}\x07`)}function E(e,t){let n=[];for(let r of e){let e=t[r.key];if(typeof e!=`number`)continue;r.op===`>`&&e>r.value&&n.push({rule:r,actual:e}),r.op===`<`&&e<r.value&&n.push({rule:r,actual:e})}return n}async function D(i){let a=await e(),o=await t({strict:!1});if(!o)return process.stderr.write(`status-agent: not logged in
|
|
2
|
-
`),2;let s=new r({config:a,cliVersion:i.cliVersion,token:o}),c=i.siteId??a.defaultSiteId??``;if(!c)return process.stderr.write("status-agent: no site selected — pass --site-id or run `zenovay use <site>`\n"),2;_();let l=b(i.notifyOn),f=i.intervalMs??p,m=Date.now(),v=0;n(`status_agent.start`,{properties:{rule_count:l.length,interval_ms:f}});let y=null,S=!1,C=()=>{S=!0};for(process.on(`SIGTERM`,C),process.on(`SIGINT`,C);!S;){try{let[e,t,r]=await Promise.all([s.getLive(c).catch(()=>({activeVisitors:0,recentEvents:[]})),s.getErrors(c,{window:`24h`}).catch(()=>({errors:[],total:0})),s.getRevenue(c,`24h`).catch(()=>null)]),i=e.activeVisitors,a=r?.mrr??r?.totalAmount??0,o=t.total/86400;d(g(),x(i,a,o),{mode:420});let u=y&&y>0?(y-a)/y*100:0,f=E(l,{error_rate:o,revenue_drop:u});for(let e of f){if(!w(e.rule.key,e.actual))continue;n(`status_agent.alert_fired`,{properties:{rule_key:e.rule.key,op:e.rule.op,threshold:e.rule.value,actual:e.actual}}),await T(`Zenovay alert`,`${e.rule.key} ${e.rule.op} ${e.rule.value} (got ${e.actual.toFixed(2)})`)}v+=1,v%10==0&&n(`status_agent.tick`,{properties:{visitors:i,error_rate_24h_avg:o,mrr_cents:a,tick:v}}),y=a}catch(e){process.stderr.write(`status-agent tick failed: ${e.message}\n`)}await new Promise(e=>{let t=setTimeout(e,f);t.unref?.()})}n(`status_agent.stop`,{duration_ms:Date.now()-m,properties:{ticks:v}});try{u(h())}catch{}return 0}function O(){return[`# Add to ~/.tmux.conf:`,`set -g status-right "#(cat ~/.zenovay/tmux-status) %H:%M"`,``,`# Then reload:`,`# $ tmux source ~/.tmux.conf`].join(`
|
|
3
|
-
`)}function k(){let e=process.argv[0]??`zenovay`;return[`[Unit]`,`Description=Zenovay status agent`,`After=network.target`,``,`[Service]`,`Type=simple`,`ExecStart=${e} status-agent --child`,`Restart=on-failure`,`RestartSec=10`,``,`[Install]`,`WantedBy=default.target`,``,`# Save as ~/.config/systemd/user/zenovay-status.service`,`# systemctl --user enable --now zenovay-status`].join(`
|
|
4
|
-
`)}function A(){let e=process.argv[0]??`zenovay`;return[`<?xml version="1.0" encoding="UTF-8"?>`,`<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">`,`<plist version="1.0">`,`<dict>`,` <key>Label</key><string>com.zenovay.status-agent</string>`,` <key>ProgramArguments</key>`,` <array>`,` <string>${e}</string>`,` <string>status-agent</string>`,` <string>--child</string>`,` </array>`,` <key>RunAtLoad</key><true/>`,` <key>KeepAlive</key><true/>`,`</dict>`,`</plist>`,``,`<!-- Save as ~/Library/LaunchAgents/com.zenovay.status-agent.plist -->`,`<!-- launchctl load ~/Library/LaunchAgents/com.zenovay.status-agent.plist -->`].join(`
|
|
5
|
-
`)}async function j(e){if(e.installTmux)return process.stdout.write(O()+`
|
|
6
|
-
`),0;if(e.installSystemd)return process.stdout.write(k()+`
|
|
7
|
-
`),0;if(e.installLaunchd)return process.stdout.write(A()+`
|
|
8
|
-
`),0;if(e.stop){let e=h();if(!o(e))return process.stderr.write(`status-agent: no PID file — daemon not running?
|
|
9
|
-
`),1;let t=Number(c(e,`utf8`).trim());if(!Number.isInteger(t)||t<=0){process.stderr.write(`status-agent: PID file is malformed (got ${JSON.stringify(t)}); removing.\n`);try{u(e)}catch{}return 1}if(!y(t)){process.stderr.write(`status-agent: process ${t} not running; removing stale PID file.\n`);try{u(e)}catch{}return 0}try{process.kill(t,`SIGTERM`);try{u(e)}catch{}return process.stdout.write(`Stopped (PID: ${t})\n`),0}catch(n){process.stderr.write(`status-agent: kill ${t} failed: ${n.message}\n`);try{u(e)}catch{}return 1}}if(e.child)return _(),v(process.pid),D(e);if(e.daemonize){_();let e=h();if(o(e)){let t=Number(c(e,`utf8`).trim());if(Number.isInteger(t)&&t>0&&y(t))return process.stderr.write(`status-agent: already running (PID ${t}). Use --stop first.\n`),1;try{u(e)}catch{}}let t=process.argv.slice(2).filter(e=>e!==`--daemonize`);t.push(`--child`);let n=process.argv[0]??`node`,r=i(n,[process.argv[1]??``,...t],{detached:!0,stdio:`ignore`});if(r.unref(),typeof r.pid==`number`)v(r.pid),process.stdout.write(`Started (PID: ${r.pid})\n`);else return process.stderr.write(`status-agent: failed to spawn detached child
|
|
10
|
-
`),1;return 0}return D(e)}export{j as statusAgentCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import{emit$1 as e,flush as t,getProcessUptimeMs as n,getTelemetryStatus as r,initTelemetry as i,setTelemetry as a}from"./telemetry-Chcnnkeu.js";export{e as emit,t as flush,n as getProcessUptimeMs,r as getTelemetryStatus,i as initTelemetry,a as setTelemetry};
|
package/dist/update-DBjJLlwb.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import{classifyBump as t,fetchManifest as n}from"./check-D9G0N7NB.js";import{applyUpdate as r}from"./apply-oUMOH7u2.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";async function o(o){let s=await e(),c=await n({cliBase:s.cliBase}),l=t(o.cliVersion,c.latest);if(o.check)return a({json:o.json})?i({type:`info`,message:`latest=${c.latest} current=${o.cliVersion} bump=${l}`}):process.stdout.write(`Current: ${o.cliVersion}\nLatest: ${c.latest}\nBump: ${l}\n`),{updated:!1,from:o.cliVersion,to:c.latest};if(l===`none`)return a({json:o.json})||process.stdout.write(`Already on latest (${o.cliVersion}).\n`),{updated:!1,from:o.cliVersion,to:c.latest};if(l===`downgrade`&&!o.forceDowngrade)throw Error(`Refused to downgrade ${o.cliVersion} → ${c.latest}. Pass --force-downgrade if you really want this.`);let u=await r({currentVersion:o.cliVersion,cliBase:s.cliBase,binaryPath:o.binaryPath,forceDowngrade:o.forceDowngrade});return a({json:o.json})?u.updated&&i({type:`update.applied`,from:u.from,to:u.to}):u.updated?process.stdout.write(`Updated ${u.from} → ${u.to}\n`):process.stdout.write(`Not updated (${u.reason??`unknown`}).\n`),u}export{o as updateCommand};
|
package/dist/uptime-DdjFTcEG.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-tpOmUbqY.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";function C(e){return e===`up`?{glyph:`● up`,color:`green`}:e===`down`?{glyph:`● down`,color:`red`}:{glyph:`○ unknown`,color:`gray`}}function w(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.round((t-Date.now())/(1e3*60*60*24));return`${n}d`}async function T(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 u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{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??d;if(a(o)){let e=await u.getUptime(d);return i({type:`uptime.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[T,E]=x(!0),[D,O]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`uptime`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getUptime(t);n||(g(r.monitors),E(!1))}catch(e){n||(O(e.message),E(!1))}})(),()=>{n=!0}},[e,t]),T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching monitors…`))));if(D)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:D}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No monitors configured`,hint:`Add one at app.zenovay.com/uptime`}));let k=[{key:`url`,label:`monitor`,width:36},{key:`status`,label:`status`,width:12,format:e=>C(String(e)).glyph},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:7,format:e=>w(e)}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(o,{title:`Monitors (${l.length})`},y.createElement(u,{columns:k,data:l,zebra:!0})),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{T as uptimeCommand};
|
package/dist/watch-DKZxuGDI.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit as i,isHeadless as a}from"./emit-CRHuIcDu.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-Bk9qczy9.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{spark as l}from"./sparkline-BZ0eMB-w.js";import{resolveSiteId as u}from"./resolve-site-tpOmUbqY.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{z as m}from"zod";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useState as S}from"react";import C from"ink-spinner";import w from"ink-text-input";const T=Math.PI*2;function E(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 D(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=E(n),a=r*Math.cos(i)/Math.PI,o=Math.sin(i);return{x:a,y:o}}function O(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 k(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function A(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function j(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*T,c=Math.round(t+r*Math.cos(s)),l=Math.round(n+i*Math.sin(s));A(e,c,l)}}function M(e){let t=Math.floor(e.dh/2);for(let n=0;n<e.dw;n+=4)A(e,n,t)}function N(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=D(o.lat,o.lng);if(!t)continue;let s=Math.round(n+t.x*i),c=Math.round(r-t.y*a);A(e,s,c),A(e,s+1,c),A(e,s,c+1),A(e,s+1,c+1)}}const P=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function F(e,t,n){let r=0;for(let i=0;i<P.length;i++){let[a,o]=P[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 I(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 L({data:e,width:t=80,height:n=20,asciiOnly:r}){let i=O(r),a=k(t,n);j(a),M(a),N(a,e);let o=[];for(let e=0;e<n;e++){let n=``;for(let r=0;r<t;r++)n+=i?I(a,r,e):F(a,r,e);o.push(n)}return b.createElement(h,{flexDirection:`column`},o.map((e,t)=>b.createElement(g,{key:t,color:`magenta`},e)),b.createElement(g,{color:`gray`},e.length,` live · `,i?`ascii mode`:`braille mode`))}const R=m.object({siteId:m.string().optional(),window:m.string().optional(),totalVisitors:m.number().optional(),visitors:m.object({count:m.number().optional(),series:m.array(m.number()).optional()}).optional(),topPages:m.array(m.object({path:m.string(),views:m.number().optional(),count:m.number().optional()})).optional(),sources:m.array(m.object({source:m.string(),visitors:m.number()})).optional()}).passthrough();async function z(r){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:r.cliVersion,token:s}),l;try{({siteId:l}=await u(c,{explicit:r.siteId,headless:!!r.json,cliVersion:r.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(a(r)){let e=await c.getDashboardSnapshot(l);return i({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=_(b.createElement(B,{api:c,siteId:l,intervalMs:r.intervalMs??15e3,cliVersion:r.cliVersion,onExit:n=>{t(),e(n)}}))})}const B=({api:e,siteId:t,intervalMs:n,cliVersion:i,onExit:a})=>{let{exit:l}=v(),[u,m]=S(null),[_,w]=S(null),[T,E]=S(null),[D,O]=S([]),[k,A]=S(!0),[j,M]=S(null),[N,P]=S(1),[F,I]=S(!1),[z,B]=S(!1);y((e,n)=>{if(e===`o`||e===`O`){p(f(`watch`,{siteId:t}));return}if(e===`q`){l(),a(0);return}if(e===`?`||e===`/`){B(e=>!e);return}if(e===`g`){I(e=>!e);return}if(n.tab){P(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`)&&P(Number(e))});let[J,Y]=S(!1);if(x(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=R.safeParse(n);if(!i.success){Y(!0),A(!1);return}Y(!1);let a=i.data,o={visitors:a.visitors??(typeof a.totalVisitors==`number`?{count:a.totalVisitors}:void 0),topPages:a.topPages?.map(e=>({path:e.path,views:e.views??e.count??0})),sources:a.sources};m(o),e.getVitals(t).then(e=>{r||w(e)},()=>{}),e.getGoals(t).then(e=>{r||E(e)},()=>{}),A(!1),M(null)}catch(e){r||M(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),x(()=>{let n=new AbortController;return(async()=>{try{let i=await e.openEventsStream(t,n.signal);for await(let e of r(i))e.type===`error`&&O(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),k)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(o,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:`magenta`},b.createElement(C,{type:`dots`})),b.createElement(g,null,` Fetching snapshot…`))));if(j&&!u)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(o,{title:`Error`,state:`err`},b.createElement(g,{color:`red`},j)));if(J&&!u)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(d,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let X=process.stdout.columns??80,Z=Math.max(20,Math.floor(X/3)-1),Q=[];return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}${F?` · globe`:``}`}),b.createElement(h,{flexDirection:`row`},b.createElement(h,{flexDirection:`column`},F?b.createElement(o,{title:`Live globe`,focused:N===1,width:Z},b.createElement(L,{data:Q,width:Math.max(40,Z-4),height:12})):b.createElement(H,{snapshot:u,focused:N===1,width:Z}),b.createElement(G,{events:D,focused:N===4,width:Z})),b.createElement(h,{flexDirection:`column`},b.createElement(U,{snapshot:u,focused:N===2,width:Z}),b.createElement(K,{vitals:_,focused:N===5,width:Z})),b.createElement(h,{flexDirection:`column`},b.createElement(W,{snapshot:u,focused:N===3,width:Z}),b.createElement(q,{goals:T,focused:N===6,width:Z}))),z?b.createElement(V,{api:e,siteId:t,width:X-2}):null,b.createElement(c,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:F?`panels`:`globe`},{key:`?/`,label:z?`close chat`:`ai chat`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))},V=({api:e,siteId:t,width:n})=>{let[i,a]=S(``),[s,c]=S([]),[l,u]=S(!1),[d,f]=S(``),[p,m]=S(null),_=async n=>{let i=n.trim();if(!i||l)return;m(null),a(``);let o=[...s,{role:`user`,content:i}];c(o),u(!0),f(``);try{let n=o.map(e=>({role:e.role,content:e.content})),i=await e.openAiStream(`chat`,{messages:n,siteId:t},void 0),a=``;for await(let e of r(i))if(e.type===`delta`)a+=e.content,f(a);else if(e.type===`error`)m(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...o,{role:`assistant`,content:a}]),f(``)}catch(e){m(e instanceof Error?e.message:`chat failed`)}finally{u(!1)}};return b.createElement(h,{marginTop:1},b.createElement(o,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},b.createElement(h,{flexDirection:`column`},s.slice(-6).map((e,t)=>b.createElement(h,{key:t,flexDirection:`column`,marginBottom:1},b.createElement(g,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),b.createElement(g,null,e.content))),l&&d?b.createElement(h,{flexDirection:`column`,marginBottom:1},b.createElement(g,{color:`magenta`,bold:!0},`zenovay`),b.createElement(g,null,d)):null,p?b.createElement(g,{color:`red`},`✗ `,p):null,b.createElement(h,null,b.createElement(g,{color:`cyan`},l?`⠋ `:`▸ `),b.createElement(w,{value:i,onChange:a,onSubmit:_,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},H=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return b.createElement(o,{title:`Visitors`,focused:t,width:n},b.createElement(g,{bold:!0},r.toString()),b.createElement(g,{color:`gray`},i.length>0?l(i,Math.max(8,n-6)):`— no data —`))},U=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return b.createElement(o,{title:`Top pages`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.path},b.createElement(g,null,e.path.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.views))))},W=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return b.createElement(o,{title:`Sources`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.source},b.createElement(g,null,e.source.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.visitors))))},G=({events:e,focused:t,width:n})=>b.createElement(o,{title:`Events`,focused:t,width:n},e.length===0?b.createElement(g,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>b.createElement(g,{key:t},e.slice(0,n-4)))),K=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>b.createElement(h,{key:e},b.createElement(g,{bold:!0},e.padEnd(6)),b.createElement(g,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return b.createElement(o,{title:`Vitals`,focused:t,width:n},r(`LCP`,e?.lcpP75,`ms`),r(`INP`,e?.inpP75,`ms`),r(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),r(`TTFB`,e?.ttfbP75,`ms`),r(`FCP`,e?.fcpP75,`ms`))},q=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return b.createElement(o,{title:`Goals`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.name},b.createElement(g,null,e.name.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.completions))))};export{z as watchCommand};
|
|
File without changes
|