@zenovay/cli 0.1.60 → 0.1.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agency-Jld-6MFj.js → agency-C69JHza5.js} +1 -1
- package/dist/{ai-C-GanomY.js → ai-CPogCNEQ.js} +1 -1
- package/dist/{alerts-CPFSBaVU.js → alerts-DWVCFKlS.js} +1 -1
- package/dist/{analytical-screen-CRn5UoFi.js → analytical-screen-BasvNR-9.js} +1 -1
- package/dist/{analytics-Dg7UtCHo.js → analytics-C7mAE3gV.js} +2 -2
- package/dist/{annotation-GkAYwvze.js → annotation-BuwTxCIH.js} +1 -1
- package/dist/{api-BD_nTdOq.js → api-FCanTxsb.js} +1 -1
- package/dist/{api-keys-DphyO-_Y.js → api-keys-CHRLCfrl.js} +1 -1
- package/dist/{api-v2-q-vnosdb.js → api-v2-CI5hxW-O.js} +1 -1
- package/dist/api-v2-CTc_U2Gw.js +1 -0
- package/dist/{audit-5ImaVfEy.js → audit-Demn5lBp.js} +1 -1
- package/dist/bin.js +5 -5
- package/dist/binaries/zenovay-darwin-arm64 +0 -0
- package/dist/binaries/zenovay-darwin-arm64.sha256 +1 -1
- package/dist/{chat-panel-C_yjPXnw.js → chat-panel-CqJaCIg3.js} +1 -1
- package/dist/{companies-COJh5d6p.js → companies-DEdYd-bV.js} +1 -1
- package/dist/{completions-C_hmoEps.js → completions-CaYLmArp.js} +1 -1
- package/dist/config--JRu_jFq.js +1 -0
- package/dist/{config-i0nb93yX.js → config-DB3jF5gG.js} +1 -1
- package/dist/{deploys-D044xeG7.js → deploys-DTIU1Kqt.js} +1 -1
- package/dist/{devices-CKVbnV06.js → devices-DK_o0JcI.js} +1 -1
- package/dist/doctor-CEtbqf4s.js +20 -0
- package/dist/{domains-2z51Uxcq.js → domains-BCDiOFYb.js} +1 -1
- package/dist/{error-codes-BohPg7wr.js → error-codes-C5caZH9p.js} +1 -1
- package/dist/error-codes-fnm-9MRL.js +1 -0
- package/dist/{errors-CX-BTLp1.js → errors-Dig3nVCV.js} +1 -1
- package/dist/{events-tail-pDYhVzFg.js → events-tail-u_lwZas2.js} +1 -1
- package/dist/{export-DCbp6_Ae.js → export-DkAIRS9F.js} +1 -1
- package/dist/{funnel-CBYMcT0x.js → funnel-Brtq8avo.js} +1 -1
- package/dist/{geo-CZGN3jMJ.js → geo-c9hA42_9.js} +1 -1
- package/dist/{globe-BesYTdf0.js → globe-C_m7zGZM.js} +1 -1
- package/dist/{goals-xzqn8Yvu.js → goals-OQ1s7Vhq.js} +1 -1
- package/dist/health-CwR_B-IA.js +1 -0
- package/dist/health-D8uQvrtL.js +2 -0
- package/dist/{heatmaps-Dbw4tjvl.js → heatmaps-BPxqgMmV.js} +1 -1
- package/dist/{home-DAjqGgZH.js → home-DGrXLbbO.js} +1 -1
- package/dist/{init-J3iobD6o.js → init-BIJkCrgc.js} +2 -2
- package/dist/init-BhfcLbDE.js +1 -0
- package/dist/{insights-mWJUgQim.js → insights-CrUKfMD5.js} +1 -1
- package/dist/{integrations-eq4v-lwT.js → integrations-S-9EITZH.js} +1 -1
- package/dist/{journeys-DYHyPzD3.js → journeys-BbySeXM2.js} +1 -1
- package/dist/{live-BV3Ke3Pe.js → live-dcM0RwGp.js} +1 -1
- package/dist/login-DgU__egg.js +1 -0
- package/dist/{login-C9V2iVUx.js → login-yhuXiFqh.js} +1 -1
- package/dist/{logout-BiMIjAoN.js → logout-eXZJMigi.js} +1 -1
- package/dist/{notes-Cbj12dSg.js → notes-DUqpXghJ.js} +1 -1
- package/dist/{pages-B3Va-Uv4.js → pages-Bk5gbJ2v.js} +1 -1
- package/dist/{plans-JCNd2VsV.js → plans-CNWFx-qt.js} +1 -1
- package/dist/{profile-BywGL64A.js → profile-CZm-_uy-.js} +1 -1
- package/dist/{projects-0DoM_DNY.js → projects-BOU9sd2x.js} +1 -1
- package/dist/{query-Cvxg7VGc.js → query-CFNNsz6m.js} +1 -1
- package/dist/{resolve-site-DSJR9vuz.js → resolve-site-mj0esTrm.js} +1 -1
- package/dist/{retention-C6UOSoTA.js → retention-CYDhYbyf.js} +1 -1
- package/dist/{revenue-BoCu83Qb.js → revenue-D8uN4mjW.js} +1 -1
- package/dist/{self-test-C2breHMW.js → self-test-Cc5PWB08.js} +2 -2
- package/dist/{sessions-bW9Zq9Ie.js → sessions-DqTjJFcP.js} +1 -1
- package/dist/{settings-goNP_z8b.js → settings-CTbX2BXa.js} +1 -1
- package/dist/{share-DGMIOBqH.js → share-BG5ipcQi.js} +1 -1
- package/dist/{sources-COk75RfB.js → sources-D0FxjzeB.js} +1 -1
- package/dist/{stats-Cljlonha.js → stats-DmkvUylD.js} +1 -1
- package/dist/status-agent-Dej6dGvX.js +10 -0
- package/dist/{team-DVMA4G7x.js → team-B1qfFxKA.js} +1 -1
- package/dist/{teams-k4OJgxiP.js → teams-BzLZoKsj.js} +1 -1
- package/dist/{telemetry-DVyGPeIl.js → telemetry--Yk0J5zc.js} +1 -1
- package/dist/telemetry-C1045t6Q.js +1 -0
- package/dist/{telemetry-urcJlNpJ.js → telemetry-DRh10SvO.js} +1 -1
- package/dist/{tier-DST3Yt2-.js → tier-BneaO4vD.js} +1 -1
- package/dist/{token-store-DWXh9r3Z.js → token-store-BQuGH0z2.js} +1 -1
- package/dist/token-store-TmBx42nv.js +1 -0
- package/dist/{update-DV3UrhdN.js → update-CyyvYJPz.js} +1 -1
- package/dist/{uptime-B50oSlpy.js → uptime-CNGVODGc.js} +1 -1
- package/dist/{usage-Ck3nnMro.js → usage-kXVWbunU.js} +1 -1
- package/dist/{use-DKqiTC6X.js → use-B8cSIrZL.js} +1 -1
- package/dist/{visitors-BhAgZwqV.js → visitors-D7Q6chjq.js} +1 -1
- package/dist/{vitals-BfCdH0Um.js → vitals-DmMAuIdP.js} +1 -1
- package/dist/{watch-C3s26qCL.js → watch-D5WeMSz2.js} +1 -1
- package/dist/{webhooks-TMX618nq.js → webhooks-BhZkT0SX.js} +1 -1
- package/dist/{webhooks-forward-Dijs9bUk.js → webhooks-forward-D9PZDQ77.js} +1 -1
- package/dist/wizard-bin.js +1 -1
- package/package.json +1 -1
- package/dist/api-v2-BlZLQy11.js +0 -1
- package/dist/config-Dn_Cl0cD.js +0 -1
- package/dist/doctor-CF3D4SXm.js +0 -16
- package/dist/error-codes-BeJw1P4i.js +0 -1
- package/dist/health-9O6q4lla.js +0 -1
- package/dist/health-lTPnKNY9.js +0 -1
- package/dist/init-DJ7cYn-0.js +0 -1
- package/dist/login-CxdKhA-o.js +0 -1
- package/dist/status-agent-C2184gQB.js +0 -10
- package/dist/telemetry-BHyqKLqh.js +0 -1
- package/dist/token-store-BliA7lF_.js +0 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{configPath as e,readConfig as t,writeConfig as n}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as r}from"./token-store-BQuGH0z2.js";import{emit as i}from"./telemetry-DRh10SvO.js";import{ApiV2Client as a}from"./api-v2-CI5hxW-O.js";import{spawn as o}from"node:child_process";import s from"node:path";import{existsSync as c,mkdirSync as l,readFileSync as u,renameSync as d,unlinkSync as f,writeFileSync as p}from"node:fs";import{homedir as m}from"node:os";const h=6e4;function g(){return s.join(m(),`.zenovay`)}function _(){return s.join(g(),`status-agent.pid`)}function v(){return s.join(g(),`tmux-status`)}function y(){l(g(),{recursive:!0,mode:448})}function b(e){let t=_(),n=`${t}.tmp.${process.pid}`;p(n,String(e),{mode:384}),d(n,t)}function x(e){try{return process.kill(e,0),!0}catch{return!1}}function S(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 C(e,t,n,r=!1){let i=(t/1e5).toFixed(1),a=[`#[fg=colour141]● ${e} live`,`#[fg=colour114]▲ MRR $${i}k`,`#[fg=colour203]✗ ${n.toFixed(0)} err/s`].join(` `);return r?`#[reverse]${a}#[noreverse]`:a}const w=3e4,T=5*60*1e3,E=new Map;function D(e,t){let n=Math.floor(t/10),r=`${e}:${n}`,i=Date.now(),a=E.get(r);return a&&i-a<T?!1:(E.set(r,i),!0)}async function O(e,t){let n=process.platform;try{if(n===`darwin`){await new Promise((n,r)=>{let i=o(`terminal-notifier`,[`-title`,e,`-message`,t,`-group`,`zenovay`],{stdio:`ignore`});i.on(`error`,r),i.on(`exit`,()=>n())});return}if(n===`linux`){await new Promise((n,r)=>{let i=o(`notify-send`,[e,t],{stdio:`ignore`});i.on(`error`,r),i.on(`exit`,()=>n())});return}}catch{}process.stdout.write(`\x1b]9;${e} — ${t}\x07`)}function k(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 A(e){let n=await t(),o=await r({strict:!1});if(!o)return process.stderr.write(`status-agent: not logged in
|
|
2
|
+
`),2;let s=new a({config:n,cliVersion:e.cliVersion,token:o}),c=e.siteId??n.defaultSiteId??``;if(!c)return process.stderr.write("status-agent: no site selected — pass --site-id or run `zenovay use <site>`\n"),2;y();let l=n.statusAgent?.notifyOn,u=n.statusAgent?.refreshIntervalMs,d=S(e.notifyOn??l),m=e.intervalMs??u??h,g=Date.now(),b=0;i(`status_agent.start`,{properties:{rule_count:d.length,interval_ms:m}});let x=null,T=!1,E=0,A=null,j=()=>{T=!0,A&&A()};for(process.on(`SIGTERM`,j),process.on(`SIGINT`,j);!T;){try{let[e,t,n]=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)]),r=e.activeVisitors,a=n?.mrr??n?.totalAmount??0,o=t.total/86400,l=x&&x>0?(x-a)/x*100:0,u=k(d,{error_rate:o,revenue_drop:l}),f=!1;for(let e of u){if(!D(e.rule.key,e.actual))continue;f=!0,i(`status_agent.alert_fired`,{properties:{rule_key:e.rule.key,op:e.rule.op,threshold:e.rule.value,actual:e.actual}}),await O(`Zenovay alert`,`${e.rule.key} ${e.rule.op} ${e.rule.value} (got ${e.actual.toFixed(2)})`)}f&&(E=Date.now());let m=E>0&&Date.now()-E<w;p(v(),C(r,a,o,m),{mode:420}),b+=1,b%10==0&&i(`status_agent.tick`,{properties:{visitors:r,error_rate_24h_avg:o,mrr_cents:a,tick:b}}),x=a}catch(e){process.stderr.write(`status-agent tick failed: ${e.message}\n`)}await new Promise(e=>{let t=setTimeout(e,m);A=()=>{clearTimeout(t),e()}}),A=null}i(`status_agent.stop`,{duration_ms:Date.now()-g,properties:{ticks:b}});try{f(_())}catch{}return 0}function j(){return[`# Add to ~/.tmux.conf:`,`set -g status-right "#(cat ~/.zenovay/tmux-status) %H:%M"`,``,`# Then reload:`,`# $ tmux source ~/.tmux.conf`].join(`
|
|
3
|
+
`)}function M(){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 N(){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 P(r){if(r.installTmux)return process.stdout.write(j()+`
|
|
6
|
+
`),0;if(r.installSystemd)return process.stdout.write(M()+`
|
|
7
|
+
`),0;if(r.installLaunchd)return process.stdout.write(N()+`
|
|
8
|
+
`),0;if(r.showConfig){let e=await t(),n=e.statusAgent??{};return process.stdout.write(`${JSON.stringify(n,null,2)}\n`),0}if(r.saveConfig){let i=await t(),a={...i,statusAgent:{refreshIntervalMs:r.intervalMs??i.statusAgent?.refreshIntervalMs??6e4,notifyOn:r.notifyOn??i.statusAgent?.notifyOn,notifierPlatform:i.statusAgent?.notifierPlatform??`auto`}};return await n(a),process.stdout.write(`Saved status-agent config to ${e()}\n`),process.stdout.write(` refreshIntervalMs: ${a.statusAgent.refreshIntervalMs}\n`),a.statusAgent.notifyOn&&process.stdout.write(` notifyOn: ${a.statusAgent.notifyOn}\n`),0}if(r.stop){let e=_();if(!c(e))return process.stderr.write(`status-agent: no PID file — daemon not running?
|
|
9
|
+
`),1;let t=Number(u(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{f(e)}catch{}return 1}if(!x(t)){process.stderr.write(`status-agent: process ${t} not running; removing stale PID file.\n`);try{f(e)}catch{}return 0}try{process.kill(t,`SIGTERM`);try{f(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{f(e)}catch{}return 1}}if(r.child)return y(),b(process.pid),A(r);if(r.daemonize){y();let e=_();if(c(e)){let t=Number(u(e,`utf8`).trim());if(Number.isInteger(t)&&t>0&&x(t))return process.stderr.write(`status-agent: already running (PID ${t}). Use --stop first.\n`),1;try{f(e)}catch{}}let t=process.argv.slice(2).filter(e=>e!==`--daemonize`);t.push(`--child`);let n=process.argv[0]??`node`,r=o(n,[process.argv[1]??``,...t],{detached:!0,stdio:`ignore`});if(r.unref(),typeof r.pid==`number`)b(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 A(r)}export{P as statusAgentCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{requireTier as r}from"./tier-BneaO4vD.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import{fmtDate as a,formatTable as o,shortId as s}from"./fmt-gMsty5jy.js";async function c(c){let l=await e(),u=await t({strict:!1}),d=new n({config:l,cliVersion:c.cliVersion,token:u});try{await r(d,`pro`)}catch(e){return process.stderr.write(`✗ ${e.message}\n`),2}try{switch(c.action){case`list`:{let e=await d.listTeam();if(c.json)return process.stdout.write(JSON.stringify(e,null,2)+`
|
|
2
2
|
`),0;let t=[{key:`userId`,header:`user id`,width:14,format:e=>s(String(e))},{key:`email`,header:`email`,width:32,format:e=>String(e??`—`)},{key:`role`,header:`role`,width:8},{key:`joinedAt`,header:`joined`,width:10,format:e=>a(e)}],n=[{key:`id`,header:`invite id`,width:14,format:e=>s(String(e))},{key:`email`,header:`email`,width:32},{key:`role`,header:`role`,width:8},{key:`expiresAt`,header:`expires`,width:10,format:e=>a(e)}];return process.stdout.write(`\nMEMBERS (${e.members.length})\n`),e.members.length===0?process.stdout.write(` — none —
|
|
3
3
|
`):process.stdout.write(o({rows:e.members,cols:t})),process.stdout.write(`\nPENDING INVITES (${e.invites.length})\n`),e.invites.length===0?process.stdout.write(` — none —
|
|
4
4
|
`):process.stdout.write(o({rows:e.invites,cols:n})),process.stdout.write(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as n}from"./token-store-BQuGH0z2.js";import{ApiV2Client as r}from"./api-v2-CI5hxW-O.js";function i(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}async function a(a){let o=await e(),s=await n({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new r({config:o,cliVersion:a.cliVersion,token:s});try{switch(a.action){case`reset`:{let e=await t({currentTeamId:void 0,currentTeamName:void 0});return a.json?(process.stdout.write(JSON.stringify({reset:!0,currentTeamId:e.currentTeamId??null})+`
|
|
2
2
|
`),0):(process.stdout.write(`✔ Team override cleared. Future commands use the API key's default team.
|
|
3
3
|
`),0)}case`current`:{let e=await c.me(),t=e.teams?.find(e=>e.isCurrent)??(e.team?{id:e.team.id,name:e.team.name,plan:e.team.plan,role:`?`,siteCount:0,isCurrent:!0}:null);return a.json?(process.stdout.write(JSON.stringify({current:t,override:o.currentTeamId??null},null,2)+`
|
|
4
4
|
`),0):t?(process.stdout.write(`\n current team: ${t.name} (${i(t.id)})\n plan: ${t.plan}\n override? ${o.currentTeamId?"yes — set via `teams switch`":`no — using API key default`}\n\n`),0):(process.stdout.write(`No team currently bound.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./config
|
|
1
|
+
import"./config--JRu_jFq.js";import{getTelemetryStatus as e,setTelemetry as t}from"./telemetry-DRh10SvO.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.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./config--JRu_jFq.js";import{emit as e,flush as t,getProcessUptimeMs as n,getTelemetryStatus as r,initTelemetry as i,setTelemetry as a}from"./telemetry-DRh10SvO.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{configDir as e,readConfig as t,writeConfig as n}from"./config
|
|
1
|
+
import{configDir as e,readConfig as t,writeConfig as n}from"./config--JRu_jFq.js";import r from"node:path";import{mkdirSync as i,promises as a,readFileSync as o,writeFileSync as s}from"node:fs";import{ulid as c}from"ulid";const l=`/cli/telemetry/events`,u=5e3,d=20,f=100,p=3e3,m=r.join(e(),`telemetry-pending.json`),h=c(),g=Date.now(),_=[];let v=null,y=null,b=`0.0.0`,x=`https://api.zenovay.com`,S,C=!1,w=null;async function T(e){if(C)return;if(C=!0,b=e.cliVersion,x=e.apiBase??`https://api.zenovay.com`,S=e.token,E()){w=!1;return}let r=await t().catch(()=>null);if(r){if(r.telemetry===void 0){process.stderr.write(`Zenovay CLI sends anonymous usage telemetry to help us improve.
|
|
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
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";const n=5*60*1e3,r=new Set([`free`,`pro`,`scale`,`enterprise`]),i={free:0,pro:1,scale:2,enterprise:3},a=`https://app.zenovay.com/billing`;function o(e){let t=(e??`free`).trim().toLowerCase();return r.has(t)?t:`free`}async function s(r){let i=await e(),a=Date.now();if(i.cachedTier&&i.cachedTierAt&&a-i.cachedTierAt<n)return o(i.cachedTier);try{let e=await r.me(),n=o(e.team?.plan);return await t({cachedTier:n,cachedTierAt:a}),n}catch{return i.cachedTier?o(i.cachedTier):`free`}}async function c(e,t){let n=await s(e);if(i[n]>=i[t])return;let r=t.charAt(0).toUpperCase()+t.slice(1);throw Error(`This command requires the ${r} plan or higher (you're on ${n}). Upgrade at ${a}.`)}export{s as getCachedTier,c as requireTier};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{configDir as e}from"./config
|
|
1
|
+
import{configDir as e}from"./config--JRu_jFq.js";import t from"node:path";import{promises as n}from"node:fs";import{z as r}from"zod";const i=r.object({accessToken:r.string().min(1),refreshToken:r.string().min(1),expiresAt:r.number(),tokenType:r.literal(`Bearer`).default(`Bearer`),scope:r.string().optional(),userId:r.string().optional(),teamId:r.string().optional(),email:r.string().email().optional(),region:r.string().optional(),cliVersionAtIssue:r.string().optional()});function a(){return t.join(e(),`auth.json`)}async function o(e){let r=a(),o;try{o=await n.stat(r)}catch(e){if(e.code===`ENOENT`)return null;throw e}if(process.platform!==`win32`){let n=o.mode&511;if(n&63){let i=e?.strict??!0;if(i)throw Error(`Refusing to read ${r}: file has insecure permissions ${n.toString(8).padStart(3,`0`)} (expected 600). Fix: chmod 600 "${r}" && chmod 700 "${t.dirname(r)}"`)}}let s=await n.readFile(r,`utf8`),c;try{c=JSON.parse(s)}catch{throw Error(`Auth file at ${r} is not valid JSON. Run \`zenovay login\` again.`)}let l=i.safeParse(c);if(!l.success)throw Error(`Auth file at ${r} is malformed. Run \`zenovay login\` again.`);return l.data}async function s(t){let r=e();await n.mkdir(r,{recursive:!0,mode:448});let o=a(),s=i.parse(t),c=JSON.stringify(s,null,2);if(await n.writeFile(o,c,{mode:384}),process.platform!==`win32`){await n.chmod(o,384);try{await n.chmod(r,448)}catch{}}}async function c(){try{await n.unlink(a())}catch(e){if(e.code!==`ENOENT`)throw e}}function l(e,t=3e4){return Date.now()>=e.expiresAt-t}export{a as authPath,c as clearToken,l as isExpired,o as readToken,i as tokenStateSchema,s as writeToken};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./config--JRu_jFq.js";import{authPath as e,clearToken as t,isExpired as n,readToken as r,tokenStateSchema as i,writeToken as a}from"./token-store-BQuGH0z2.js";export{r as readToken};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{requireTier as r}from"./tier-BneaO4vD.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-mj0esTrm.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}from"./config
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{fmtDate as r,fmtNumber as i}from"./fmt-gMsty5jy.js";const a=1e8,o=e=>e<=0||e>=a;function s(e,t,n=24){if(o(t))return`─`.repeat(n);let r=Math.min(1,e/t),i=Math.round(r*n);return`█`.repeat(i)+`░`.repeat(Math.max(0,n-i))}function c(e,t){if(o(t))return`—`;let n=e/t*100;return`${n.toFixed(0)}%`}function l(e,t){if(o(t))return``;let n=e/t;return n>=1?`⚠ over limit`:n>=.8?`⚠ near limit`:``}function u(e,t){return o(e)?`∞`:t(e)}async function d(a){let o=await e(),d=await t({strict:!1});if(!d)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let f=new n({config:o,cliVersion:a.cliVersion,token:d}),p;try{p=await f.getUsage()}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}if(a.json)return process.stdout.write(JSON.stringify(p,null,2)+`
|
|
2
2
|
`),0;let m=[{label:`events this month`,used:p.events.thisMonth,limit:p.events.monthlyLimit,format:i},{label:`events today`,used:p.events.today,limit:p.events.dailyLimit,format:i},{label:`websites`,used:p.websites.used,limit:p.websites.limit},{label:`team members`,used:p.teamMembers.used,limit:p.teamMembers.limit}],h=18,g=8,_=9,v=[];v.push(``),v.push(` plan: ${p.plan}`),v.push(``);for(let e of m){let t=e.format??i,n=t(e.used).padStart(g),r=u(e.limit,t).padStart(_),a=s(e.used,e.limit),o=c(e.used,e.limit).padStart(5),d=l(e.used,e.limit);v.push(` ${e.label.padEnd(h)} ${n} / ${r} ${a} ${o} ${d}`.trimEnd())}return v.push(` ${`api keys`.padEnd(h)} ${i(p.apiKeys.used).padStart(g)} / ${`—`.padStart(_)} ${`─`.repeat(24)} ${`—`.padStart(5)}`),v.push(``),v.push(` data retention: ${p.dataRetentionDays} days`),v.push(` last event: ${r(p.events.lastEventAt,`datetime`)}`),v.push(``),process.stdout.write(v.join(`
|
|
3
3
|
`)),0}export{d as usageCommand};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import{ApiClient as n}from"./api-FCanTxsb.js";import{readToken as r}from"./token-store-BQuGH0z2.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
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.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-CqJaCIg3.js";import{resolveSiteId as s}from"./resolve-site-mj0esTrm.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-BasvNR-9.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
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.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-CqJaCIg3.js";import{resolveSiteId as a}from"./resolve-site-mj0esTrm.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-BasvNR-9.js";import{Box as u,Text as d}from"ink";import f from"react";const p={lcp:{good:2500,poor:4e3},inp:{good:200,poor:500},cls:{good:.1,poor:.25},ttfb:{good:800,poor:1800},fcp:{good:1800,poor:3e3}};function m(e,t){let n=p[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function h(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function g(p){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:p.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(p),S=[{key:`url`,label:`url`,width:32},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,label:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return l({cliVersion:p.cliVersion,title:`vitals · ${y}`,commandName:`vitals`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:p.watch?5*6e4:0,fetcher:e=>v.getVitals(y,{url:p.url,device:p.device,window:p.window},e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`vitals`,{siteId:y}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}process.stdout.write(r(e.vitals,[`url`,`device`,`samples`],t))},panels:[{id:`summary`,title:`Site-wide p75`,render:e=>{let t=t=>{let n=0,r=0;for(let i of e.vitals){let e=i[t]?.p75;typeof e==`number`&&(n+=e*i.samples,r+=i.samples)}return r>0?n/r:0},n=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return f.createElement(u,{flexDirection:`column`},n.map(e=>{let n=t(e),r=m(e,n);return f.createElement(d,{key:e},f.createElement(d,{color:r.color},`● `),f.createElement(d,{bold:!0},e.toUpperCase().padEnd(5)),` `,f.createElement(d,null,h(e,n).padStart(8)),` `,f.createElement(d,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?f.createElement(d,{color:`gray`},`— no vitals data yet —`):f.createElement(o,{data:e.vitals.slice(0,15),columns:S,headerStyle:`accent`})}]})}export{g as vitalsCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{spark as l}from"./sparkline-BZ0eMB-w.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-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
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.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-mj0esTrm.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
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-C5caZH9p.js";import{ApiV2Client as r}from"./api-v2-CI5hxW-O.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
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.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-BhfcLbDE.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/api-v2-BlZLQy11.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import{ApiError as e}from"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import{ApiV2Client as t}from"./api-v2-q-vnosdb.js";export{t as ApiV2Client};
|
package/dist/config-Dn_Cl0cD.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import{promises as t}from"node:fs";import{z as n}from"zod";import r from"node:os";const i=n.object({theme:n.string().optional(),apiBase:n.string().url().default(`https://api.zenovay.com`),cliBase:n.string().url().default(`https://cli.zenovay.com`),region:n.enum([`us`,`eu`,`auto`]).default(`auto`),telemetry:n.union([n.boolean(),n.object({enabled:n.boolean(),disclosed_at:n.number().optional()})]).optional(),noUpdateCheck:n.boolean().default(!1),lastUpdateNotice:n.number().optional(),forwardSecret:n.string().optional(),defaultSiteId:n.string().optional(),defaultSiteName:n.string().optional(),cachedTier:n.string().optional(),cachedTierAt:n.number().optional(),currentTeamId:n.string().optional(),currentTeamName:n.string().optional()}),a={apiBase:`https://api.zenovay.com`,cliBase:`https://cli.zenovay.com`,region:`auto`,noUpdateCheck:!1};function o(){if(process.platform===`win32`){let t=process.env.APPDATA??e.join(r.homedir(),`AppData`,`Roaming`);return e.join(t,`zenovay`)}let t=process.env.XDG_CONFIG_HOME??e.join(r.homedir(),`.config`);return e.join(t,`zenovay`)}function s(){return e.join(o(),`config.json`)}async function c(){let e=s();try{let n=await t.readFile(e,`utf8`),r=i.safeParse(JSON.parse(n));return r.success?r.data:a}catch(e){if(e.code===`ENOENT`)return a;throw e}}async function l(e){let n=o();await t.mkdir(n,{recursive:!0,mode:448});let r=s();await t.writeFile(r,JSON.stringify(e,null,2),{mode:384}),process.platform!==`win32`&&await t.chmod(r,384)}async function u(e){let t=await c(),n=i.parse({...t,...e});return await l(n),n}export{a as DEFAULT_CONFIG,o as configDir,s as configPath,i as configSchema,c as readConfig,u as updateConfig,l as writeConfig};
|
package/dist/doctor-CF3D4SXm.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-BD_nTdOq.js";import{readToken as n}from"./token-store-DWXh9r3Z.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{runHealthChecks as o}from"./health-9O6q4lla.js";import{join as s}from"node:path";import{homedir as c,platform as l}from"node:os";import{stat as u}from"node:fs/promises";async function d(){let e=c(),t=l()===`darwin`,n=[{name:`Claude Code`,path:s(e,`.claude`)},{name:`Cursor`,path:t?s(e,`Library`,`Application Support`,`Cursor`):s(e,`.config`,`Cursor`)},{name:`Windsurf`,path:t?s(e,`Library`,`Application Support`,`Windsurf`):s(e,`.config`,`Windsurf`)},{name:`VS Code`,path:s(e,`.vscode`)}];return Promise.all(n.map(async e=>{try{return await u(e.path),{name:e.name,installed:!0,configPath:e.path}}catch{return{name:e.name,installed:!1}}}))}async function f(s){let c=await o({cliVersion:s.cliVersion,binaryPath:s.binaryPath}),l=await d();if(a(s))process.stdout.write(`${JSON.stringify({type:`doctor.agents`,agents:l})}\n`);else{process.stdout.write(`
|
|
2
|
-
AI Agents:
|
|
3
|
-
`);for(let e of l){let t=e.installed?`\x1B[32m✔\x1B[0m`:`\x1B[2m✗\x1B[0m`,n=e.installed&&e.configPath?` \x1b[2m${e.configPath}\x1b[0m`:``;process.stdout.write(` ${t} ${e.name}${n}\n`)}process.stdout.write(`
|
|
4
|
-
`)}let u=c.filter(e=>e.status===`fail`);if(u.length===0)return a(s)||process.stdout.write(`All checks pass — no healing needed.
|
|
5
|
-
`),0;let f=await e(),p=await n({strict:!1});if(!p){for(let e of u)process.stderr.write(`[${e.name}] ${e.detail}\n`);return process.stderr.write(`
|
|
6
|
-
Log in with \`zenovay login\` for AI-assisted diagnosis.
|
|
7
|
-
`),1}let m=new t({config:f,cliVersion:s.cliVersion,token:p}),h={platform:process.platform,arch:process.arch,node:process.version,cliVersion:s.cliVersion},g=`The Zenovay CLI failed the following health checks. Diagnose and propose a fix.
|
|
8
|
-
|
|
9
|
-
Environment: ${JSON.stringify(h)}
|
|
10
|
-
Failed checks: ${JSON.stringify(u,null,2)}
|
|
11
|
-
|
|
12
|
-
Respond with (1) a one-paragraph diagnosis, (2) a proposed fix command if applicable. Do not invent commands that could affect unrelated files. If the fix is system-level (e.g., chmod), print the exact command so the user can copy it.`,_=await m.openAiStream(`chat`,{messages:[{role:`user`,content:g}]});a(s)||process.stdout.write(`
|
|
13
|
-
Zenovay doctor — AI diagnosis:
|
|
14
|
-
|
|
15
|
-
`);for await(let e of r(_)){if(e.type===`delta`&&(a(s)?i({type:`ai.token`,mode:`chat`,content:e.content}):process.stdout.write(e.content)),e.type===`error`)return a(s)?i({type:`error`,code:e.code,message:e.message}):process.stderr.write(`\n[${e.code}] ${e.message}\n`),1;if(e.type===`done`)break}return a(s)||process.stdout.write(`
|
|
16
|
-
`),0}export{f as doctorCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import{buildErrorEnvelope as e,emitErrorEnvelope as t,isJsonOutputMode as n,normalizeError as r}from"./error-codes-BohPg7wr.js";export{t as emitErrorEnvelope};
|
package/dist/health-9O6q4lla.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{configPath as e,readConfig as t}from"./config-Dn_Cl0cD.js";import{fetchManifest as n}from"./check-D9G0N7NB.js";import{ApiClient as r}from"./api-BD_nTdOq.js";import{readToken as i}from"./token-store-DWXh9r3Z.js";import{isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import s from"node:path";import{promises as c}from"node:fs";import l from"node:os";import{Box as u,Text as d,render as f}from"ink";import p from"react";const m=6*60*60*1e3;function h(){return s.join(l.homedir(),`.zenovay`,`update.json`)}async function g(){try{let e=await c.readFile(h(),`utf8`);return JSON.parse(e)}catch{return null}}async function _(e){let t=h();await c.mkdir(s.dirname(t),{recursive:!0,mode:448}),await c.writeFile(t,JSON.stringify(e,null,2))}async function v(){let e=await t();if(e.noUpdateCheck||process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`)return null;let r=await g();if(r&&Date.now()-r.fetchedAt<m)return r;try{let t=await n({cliBase:e.cliBase}),i={manifest:t,fetchedAt:Date.now(),lastNoticeAt:r?.lastNoticeAt};return await _(i),i}catch{return r}}async function y(){try{await v()}catch{}process.exit(0)}import.meta.url===`file://${process.argv[1]}`&&y();const b=2e3,x=5e3;async function S(e,t){let n=`${e}/mcp`,r=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),b);try{let a=await t(n,{method:`GET`,signal:i.signal}),o=Date.now()-r;return a.ok?{name:`MCP server`,status:`pass`,detail:`${e}/mcp · ${o}ms`,latencyMs:o}:{name:`MCP server`,status:`fail`,detail:`HTTP ${a.status}`,latencyMs:o}}catch(e){return{name:`MCP server`,status:`fail`,detail:e.message}}finally{clearTimeout(a)}}async function C(){try{let t=await c.readFile(e(),`utf8`),n=JSON.parse(t),r=n.openaiApiKey;return typeof r==`string`&&r.trim().length>0?{name:`OpenAI key`,status:`pass`,detail:`configured`}:{name:`OpenAI key`,status:`warn`,detail:"not set (run `zenovay ai` to configure)"}}catch(e){return e.code===`ENOENT`?{name:`OpenAI key`,status:`warn`,detail:`no config file`}:{name:`OpenAI key`,status:`warn`,detail:`unreadable config`}}}async function w(){let e=l.homedir(),t=[s.join(e,`.zshrc`),s.join(e,`.bashrc`),s.join(e,`.config`,`fish`,`completions`,`zenovay.fish`)],n=[];for(let e of t)try{let t=await c.readFile(e,`utf8`);(/zenovay\s+(complet|--?complet)/i.test(t)||/_zenovay/.test(t)||/complete\s+-c\s+zenovay/.test(t))&&n.push(s.basename(e))}catch{}return n.length>0?{name:`Completions`,status:`pass`,detail:n.join(`, `)}:{name:`Completions`,status:`warn`,detail:"not installed (run `zenovay completions` after Wave 3)"}}async function T(e,t,n,r){if(!e||!t)return{name:`Events stream`,status:`skip`,detail:`not authenticated`};let i=new AbortController,a=setTimeout(()=>i.abort(),x),o=Date.now();try{let t=await e.openEventsStream(`probe`,i.signal),r=t.body?.getReader();if(r){let e=Promise.race([r.read().then(()=>`first`),new Promise(e=>setTimeout(()=>e(`timeout`),1500))]);await e;try{r.cancel()}catch{}}let a=Date.now()-o;return{name:`Events stream`,status:`pass`,detail:`${n}/v1/cli/events/tail · ${a}ms`,latencyMs:a}}catch(e){let t=e.message;return/40\d/.test(t)?{name:`Events stream`,status:`pass`,detail:`endpoint reachable (auth-gated)`}:{name:`Events stream`,status:`fail`,detail:t}}finally{clearTimeout(a)}}async function E(n){let a=n.fetchImpl??fetch,o=[],s=await t().catch(()=>null);o.push({name:`Binary`,status:`pass`,detail:`v${n.cliVersion} (${n.binaryPath})`}),o.push({name:`Config file`,status:s?`pass`:`warn`,detail:e()});let c=await i({strict:!1}).catch(()=>null);o.push({name:`Auth`,status:c?`pass`:`fail`,detail:c?`logged in${c.email?` as ${c.email}`:``}`:`not logged in`});let l=null;if(s)try{l=new r({config:s,cliVersion:n.cliVersion,token:c,fetchImpl:a});let e=await l.ping();o.push({name:`API connection`,status:`pass`,detail:`${s.apiBase.replace(/^https?:\/\//,``)} · ${e.latencyMs}ms`,latencyMs:e.latencyMs})}catch(e){o.push({name:`API connection`,status:`fail`,detail:`${e.message}`})}let u=await g().catch(()=>null);o.push({name:`Auto-update`,status:s?.noUpdateCheck?`warn`:`pass`,detail:s?.noUpdateCheck?`disabled`:u?`latest=${u.manifest.latest}`:`manifest not yet fetched`});let d=s?.apiBase??`https://api.zenovay.com`;return o.push(await S(d,a)),o.push(await C()),o.push(await w()),o.push(await T(l,!!c,d,a)),o}function D(e){return e.some(e=>e.status===`fail`)?1:0}async function O(e){let t=await E(e),n=D(t),r=n===0;return a({json:e.json})?(process.stdout.write(`${JSON.stringify({checks:t,passed:r})}\n`),n):new Promise(e=>{let{unmount:r}=f(p.createElement(k,{checks:t}),{exitOnCtrlC:!0});setImmediate(()=>{r(),e(n)})})}const k=({checks:e})=>p.createElement(o,{title:`Zenovay CLI health check`,state:`idle`},e.map(e=>p.createElement(u,{key:e.name},p.createElement(d,{color:j(e.status)},A(e.status)),p.createElement(d,null,` `),p.createElement(d,{bold:!0},e.name.padEnd(18)),p.createElement(d,{color:`gray`},e.detail))));function A(e){return e===`pass`?`✔`:e===`warn`?`⚠`:e===`skip`?`∼`:`✗`}function j(e){return e===`pass`?`green`:e===`warn`?`yellow`:e===`skip`?`gray`:`red`}export{k as HealthReport,D as exitCodeFor,O as healthCommand,E as runHealthChecks};
|
package/dist/health-lTPnKNY9.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import"./check-D9G0N7NB.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import"./formatter-DutfcQAc.js";import"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-9O6q4lla.js";export{n as healthCommand};
|
package/dist/init-DJ7cYn-0.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-J3iobD6o.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import"./emit-DBYk96TD.js";import"./secrets-ApB7yh2A.js";import"./login-C9V2iVUx.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";export{e as initCommand};
|
package/dist/login-CxdKhA-o.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import"./token-store-DWXh9r3Z.js";import"./formatter-DutfcQAc.js";import"./emit-DBYk96TD.js";import{loginCommand as e}from"./login-C9V2iVUx.js";export{e as loginCommand};
|
|
@@ -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 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};
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
import"./config-Dn_Cl0cD.js";import{authPath as e,clearToken as t,isExpired as n,readToken as r,tokenStateSchema as i,writeToken as a}from"./token-store-DWXh9r3Z.js";export{r as readToken};
|