@zenovay/cli 0.1.26 → 0.1.28
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-C4jblL3i.js → agency-DEixFVRT.js} +1 -1
- package/dist/{ai-jOjJK1sT.js → ai-B8r28ZBm.js} +1 -1
- package/dist/{analytical-screen-BdI2ADBS.js → analytical-screen-BpTK5dCY.js} +1 -1
- package/dist/{analytics-CC-eiErU.js → analytics-ByCwmuvS.js} +1 -1
- package/dist/{api-CCL4vKaK.js → api-CeB_9iPg.js} +1 -1
- package/dist/{api-keys-CsEfbYtm.js → api-keys-DsQR075b.js} +1 -1
- package/dist/api-v2-B_kZhVxd.js +1 -0
- package/dist/{audit-B2kNeX6t.js → audit-CfOJ3rNW.js} +1 -1
- package/dist/bin.js +3 -9
- package/dist/{companies-Cg-uYL9k.js → companies-BToqUnFi.js} +1 -1
- package/dist/config-Cmi_f_SY.js +1 -0
- package/dist/{deploys-O0swRcbZ.js → deploys-CgNr5r7M.js} +1 -1
- package/dist/{devices-3jpIPhGa.js → devices-C8xVqaBs.js} +1 -1
- package/dist/{doctor-BJIaNiy8.js → doctor-K37xh3M7.js} +1 -1
- package/dist/{domains-sbpcAGEu.js → domains-Bfx2vdwv.js} +1 -1
- package/dist/{errors-C4joqM_8.js → errors-CRwoAz9u.js} +1 -1
- package/dist/{events-tail-CJ8xJl-N.js → events-tail-CXJUK5ka.js} +1 -1
- package/dist/{funnel-taH4RRmw.js → funnel-nm9X3Od7.js} +1 -1
- package/dist/{geo-CyuF1-9f.js → geo-BaCNZ7-S.js} +1 -1
- package/dist/globe-BIDJ_cmn.js +1 -0
- package/dist/{goals-DTKMrCnF.js → goals-D1qL286b.js} +1 -1
- package/dist/{health-D46wF_MS.js → health-ChZuTNP2.js} +1 -1
- package/dist/health-DfgPNC1A.js +1 -0
- package/dist/{heatmaps-Cuc9KbeF.js → heatmaps-e1Q72VWJ.js} +1 -1
- package/dist/{home-DsfaBsTD.js → home-CtsY-gj0.js} +1 -1
- package/dist/{init-CBKB7q3L.js → init-BVUEPvVr.js} +2 -2
- package/dist/init-CJ1Py9a8.js +1 -0
- package/dist/{insights-D-JKSTsV.js → insights-wx3wIgGV.js} +1 -1
- package/dist/{integrations-C1sSRVU2.js → integrations-B6IO1dM0.js} +1 -1
- package/dist/{journeys-BzevqSAQ.js → journeys-zPmCha98.js} +1 -1
- package/dist/{live-Co9QGdjV.js → live-k32y1phk.js} +1 -1
- package/dist/{login-RMoGEnH-.js → login-BSDS_gNS.js} +1 -1
- package/dist/login-B_CW06vS.js +1 -0
- package/dist/{logout-B1Qrhzkx.js → logout-1ohk4uie.js} +1 -1
- package/dist/{notes-D9L28-c2.js → notes-Cepz-K00.js} +1 -1
- package/dist/{pages-BT3kfBGz.js → pages-CAYP4Abn.js} +1 -1
- package/dist/{plans-2L-WQatk.js → plans-D8aqF_lo.js} +1 -1
- package/dist/profile-DQJdZ-s_.js +4 -0
- package/dist/{projects-DftoWXKr.js → projects-BC8pmo7u.js} +1 -1
- package/dist/{query-Ccsp3Yl_.js → query-gWCT9Xf0.js} +1 -1
- package/dist/{resolve-site-D3e1i32Z.js → resolve-site-BUpzvcMz.js} +1 -1
- package/dist/{retention-C-IrtTay.js → retention-DQPI6wVN.js} +1 -1
- package/dist/{revenue-hRORPs8y.js → revenue-Cdh1fgXQ.js} +1 -1
- package/dist/{sessions-COfi_4MX.js → sessions-Dv-Z29cQ.js} +1 -1
- package/dist/{settings-DBaQCUNE.js → settings-BsczzB3M.js} +1 -1
- package/dist/{share-DyiSQQqb.js → share-BQjP_Anq.js} +1 -1
- package/dist/{sources-BdRVvbkK.js → sources-DL_o-kkA.js} +1 -1
- package/dist/{stats-Dw8Ha9Jw.js → stats-DRy2d3At.js} +1 -1
- package/dist/{team-DIqmIayL.js → team-Bg-ggtky.js} +1 -1
- package/dist/teams-Dvh7_Gkg.js +17 -0
- package/dist/{tier-RjOGNzda.js → tier-DyX4EObq.js} +1 -1
- package/dist/{update-XFwhuuYQ.js → update-DWBRR_PD.js} +1 -1
- package/dist/{uptime-_ib4yF3y.js → uptime-DACm8Hdh.js} +1 -1
- package/dist/{usage-IXSz76AI.js → usage-BhLXHEkY.js} +1 -1
- package/dist/{use-4HLr__kI.js → use-DJ0b_xNo.js} +1 -1
- package/dist/{visitors-B1tU7aRq.js → visitors-BeyCZy77.js} +1 -1
- package/dist/{vitals-BHhOmLpW.js → vitals-lpeK0mbA.js} +1 -1
- package/dist/{watch-B-gDs4z9.js → watch-BMrHdnHX.js} +1 -1
- package/dist/{webhooks-B8I_R4oF.js → webhooks-Ddhz2P7n.js} +1 -1
- package/dist/{webhooks-forward-pKzp9SIQ.js → webhooks-forward-C1TfzLgn.js} +1 -1
- package/dist/wizard-bin.js +1 -1
- package/package.json +1 -1
- package/dist/api-v2-Ci9DDRha.js +0 -1
- package/dist/config-CZ9IzjIH.js +0 -1
- package/dist/health-C-IJCz_C.js +0 -1
- package/dist/init-CB5pEWxF.js +0 -1
- package/dist/login-DyQhcTmH.js +0 -1
- package/dist/profile-Diq5Srqj.js +0 -4
- /package/dist/{themes-BP-K1TqU.js → themes-nvY0oaq_.js} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{formatTabular as r,selectFormat as i}from"./formatter-mW0Yk3Nt.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import{resolveSiteId as a}from"./resolve-site-BUpzvcMz.js";import{DataTable as o}from"./data-table-BUyOP6Nc.js";import{runAnalyticalScreen as s}from"./analytical-screen-BpTK5dCY.js";import{Box as c,Text as l}from"ink";import u from"react";function d(e){return`${(e*100).toFixed(1)}%`}function f(e){return e<60?`${Math.round(e)}s`:e<3600?`${Math.floor(e/60)}m ${Math.round(e%60)}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}async function p(p){let m=await e(),h=await t({strict:!1}),g=new n({config:m,cliVersion:p.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await a(g,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(p),b=p.range??`24h`,x=[{key:`url`,label:`page`,width:40,format:e=>String(e??`—`)},{key:`views`,label:`views`,width:8,align:`right`}],S=[{key:`country`,label:`country`,width:8},{key:`visitors`,label:`visitors`,width:8,align:`right`}];return s({cliVersion:p.cliVersion,title:`stats · ${_} · ${b}`,commandName:`stats`,authToken:h?.accessToken??null,refreshIntervalMs:p.watch?6e4:0,fetcher:e=>g.getStats(_,b,e),format:y,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}process.stdout.write(r([{range:b,visitors:e.visitors,pageviews:e.pageviews,sessions:e.sessions,bounceRate:d(e.bounceRate),avgSession:f(e.avgSessionSec)}],[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSession`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{bold:!0},e.visitors.toLocaleString()),u.createElement(l,{color:`gray`},` visitors `),u.createElement(l,{bold:!0},e.pageviews.toLocaleString()),u.createElement(l,{color:`gray`},` pageviews `),u.createElement(l,{bold:!0},e.sessions.toLocaleString()),u.createElement(l,{color:`gray`},` sessions`)),u.createElement(l,{color:`gray`},`bounce `,d(e.bounceRate),` · avg session `,f(e.avgSessionSec)))},{id:`pages`,title:`Top pages`,render:e=>e.topPages.length===0?u.createElement(l,{color:`gray`},`— no pages —`):u.createElement(o,{data:e.topPages.slice(0,10),columns:x,headerStyle:`accent`})},{id:`countries`,title:`Top countries`,render:e=>e.topCountries.length===0?u.createElement(l,{color:`gray`},`— no country data —`):u.createElement(o,{data:e.topCountries.slice(0,10),columns:S,headerStyle:`accent`})}]})}export{p as statsCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{requireTier as r}from"./tier-DyX4EObq.js";import{confirmDestructive as i}from"./confirm-D_aKHknn.js";import{fmtDate as a,formatTable as o,shortId as s}from"./fmt-DSJbiH8w.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(`
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config-Cmi_f_SY.js";import{readToken as n}from"./api-CeB_9iPg.js";import{ApiV2Client as r}from"./api-v2-B_kZhVxd.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
|
+
`),0):(process.stdout.write(`✔ Team override cleared. Future commands use the API key's default team.
|
|
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
|
+
`),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.
|
|
5
|
+
`),0)}case`list`:{let e=await c.me(),t=e.teams??(e.team?[{id:e.team.id,name:e.team.name,plan:e.team.plan,role:`?`,siteCount:0,isCurrent:!0}]:[]);if(a.json)return process.stdout.write(JSON.stringify({teams:t},null,2)+`
|
|
6
|
+
`),0;if(t.length===0)return process.stdout.write(`
|
|
7
|
+
You are not a member of any team yet.
|
|
8
|
+
Create one in the dashboard at https://app.zenovay.com/team/create
|
|
9
|
+
|
|
10
|
+
`),0;process.stdout.write(`\n TEAMS (${t.length})\n`),process.stdout.write(` name plan role sites id
|
|
11
|
+
`),process.stdout.write(` ─ ──────────────────────────── ─────────── ─────── ───── ──────────────
|
|
12
|
+
`);for(let e of t){let t=e.isCurrent?`*`:` `,n=(e.name??`—`).padEnd(28).slice(0,28),r=e.plan.padEnd(11),a=e.role.padEnd(7),o=String(e.siteCount).padStart(5);process.stdout.write(` ${t} ${n} ${r} ${a} ${o} ${i(e.id)}\n`)}return process.stdout.write(`
|
|
13
|
+
* = current. Switch with \`zenovay teams switch <name>\` (matches name OR id).
|
|
14
|
+
|
|
15
|
+
`),0}case`switch`:{if(!a.match)return process.stderr.write("Error: pass <name-or-id> — e.g. `zenovay teams switch zenovay\\'s\\ team`.\n"),2;let e=await c.me(),n=e.teams??[];if(n.length===0)return process.stderr.write(`No teams found for this account.
|
|
16
|
+
`),2;let r=a.match.toLowerCase().trim(),i=n.find(e=>e.id===a.match);return i||=n.find(e=>(e.name??``).toLowerCase()===r),i||=n.find(e=>(e.name??``).toLowerCase().startsWith(r)),i?(await t({currentTeamId:i.id,currentTeamName:i.name}),a.json?(process.stdout.write(JSON.stringify({switched:!0,team:i},null,2)+`
|
|
17
|
+
`),0):(process.stdout.write(`\n✔ Switched to ${i.name} (${i.plan}, ${i.role}).\n Future commands will run against this team. Reset with \`zenovay teams reset\`.\n\n`),0)):(process.stderr.write(`No team matched "${a.match}". Run \`zenovay teams list\` to see options.\n`),2)}}}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}}export{a as teamsCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config-
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config-Cmi_f_SY.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{c as requireTier};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{classifyBump as t,fetchManifest as n}from"./check-Comj8AkL.js";import{applyUpdate as r}from"./apply-D2xZJdvQ.js";import"./formatter-mW0Yk3Nt.js";import{emit as i,isHeadless as a}from"./emit-DBbMG9mK.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-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{requireTier as r}from"./tier-DyX4EObq.js";import"./formatter-mW0Yk3Nt.js";import{emit as i,isHeadless as a}from"./emit-DBbMG9mK.js";import{Panel as o}from"./panel-uygscwY5.js";import{Banner as s}from"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import{Keybar as c}from"./keybar-C7YkmK1U.js";import{resolveSiteId as l}from"./resolve-site-BUpzvcMz.js";import{EmptyState as u}from"./empty-state-Dkho-_3J.js";import{DataTable as d}from"./data-table-BUyOP6Nc.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useState as y}from"react";import b from"ink-spinner";function x(e){return e===`up`?{glyph:`● up`,color:`green`}:e===`down`?{glyph:`● down`,color:`red`}:{glyph:`○ unknown`,color:`gray`}}function S(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.round((t-Date.now())/(1e3*60*60*24));return`${n}d`}async function C(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}=m(_.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}=h(),[l,m]=y(null),[C,w]=y(!0),[T,E]=y(null);if(g(e=>{e===`q`&&(a(),i(0))}),v(()=>{let n=!1;return(async()=>{try{let r=await e.getUptime(t);n||(m(r.monitors),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:`uptime · ${n}`}),_.createElement(o,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`magenta`},_.createElement(b,{type:`dots`})),_.createElement(p,null,` Fetching monitors…`))));if(T)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:`uptime · ${n}`}),_.createElement(u,{reason:`error`,headline:`Failed to load`,hint:T}));if(!l||l.length===0)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:`uptime · ${n}`}),_.createElement(u,{reason:`no-data`,headline:`No monitors configured`,hint:`Add one at app.zenovay.com/uptime`}));let D=[{key:`url`,label:`monitor`,width:36},{key:`status`,label:`status`,width:12,format:e=>x(String(e)).glyph},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:7,format:e=>S(e)}];return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:`uptime · ${n}`}),_.createElement(o,{title:`Monitors (${l.length})`},_.createElement(d,{columns:D,data:l,zebra:!0})),_.createElement(c,{items:[{key:`q`,label:`quit`}]}))};export{C as uptimeCommand};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{fmtDate as r,fmtNumber as i}from"./fmt-DSJbiH8w.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,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config-
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config-Cmi_f_SY.js";import{ApiClient as n,readToken as r}from"./api-CeB_9iPg.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import{resolveSiteId as i}from"./resolve-site-BUpzvcMz.js";async function a(a){if(a.reset)return await t({defaultSiteId:void 0,defaultSiteName:void 0}),process.stdout.write(`Default site cleared.
|
|
2
2
|
`),0;if(a.show){let t=await e();return t.defaultSiteId?process.stdout.write(a.json?`${JSON.stringify({defaultSiteId:t.defaultSiteId,defaultSiteName:t.defaultSiteName??null})}\n`:`Default site: ${t.defaultSiteName??t.defaultSiteId} (${t.defaultSiteId})\n`):process.stdout.write(a.json?`{"defaultSiteId":null}
|
|
3
3
|
`:`No default site set.
|
|
4
4
|
`),0}let s=await e(),c=await r({strict:!1});if(!c&&!process.env.ZENOVAY_API_TOKEN)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:s,cliVersion:a.cliVersion,token:c});if(a.match&&a.match.trim()){let e=a.match.trim().toLowerCase(),n=await l.getSites(),r=n.find(e=>e.id===a.match||e.trackingCode===a.match||e.url===a.match),i=r??n.find(t=>o(t.url).includes(e)||t.name.toLowerCase().includes(e));return i?(await t({defaultSiteId:i.id,defaultSiteName:i.name}),process.stdout.write(`Default site → ${i.name} (${i.url})\n`),0):(process.stderr.write(`No site matched "${a.match}". Your sites:\n${n.map(e=>` ${e.name} — ${e.url} — ${e.id}`).join(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{formatTabular as r,selectFormat as i}from"./formatter-mW0Yk3Nt.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./progress-row-DFOvHAc5.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import{spark as a}from"./sparkline-Bkfzqe4x.js";import{resolveSiteId as o}from"./resolve-site-BUpzvcMz.js";import{DataTable as s}from"./data-table-BUyOP6Nc.js";import"./bar-C9stEeJd.js";import{runAnalyticalScreen as c}from"./analytical-screen-BpTK5dCY.js";import"./ui-BRls3_H3.js";import{Box as l,Text as u}from"ink";import d from"react";function f(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}async function p(p){let m=await e(),h=await t({strict:!1}),g=new n({config:m,cliVersion:p.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(p),b=p.limit??50,x=[{key:`startedAt`,label:`when`,width:6,format:e=>f(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:`aiScore`,label:`score`,width:5,align:`right`,format:e=>typeof e==`number`?String(Math.round(e)):`—`}];return c({cliVersion:p.cliVersion,title:`visitors · ${_}`,commandName:`visitors`,authToken:h?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>g.getVisitors(_,{limit:b},e),format:y,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}let n=[`startedAt`,`country`,`city`,`device`,`page`,`aiScore`];process.stdout.write(r(e.visitors,n,t))},panels:[{id:`live`,title:`Now`,render:e=>{let t=[...e.visitors].sort((e,t)=>(t.aiScore??0)-(e.aiScore??0)),n=t[0],r=Array(24*6).fill(0),i=Date.now();for(let t of e.visitors){let e=i-new Date(t.startedAt).getTime(),n=Math.floor(e/(10*60*1e3));n>=0&&n<r.length&&(r[r.length-1-n]+=1)}return d.createElement(l,{flexDirection:`column`},d.createElement(u,{bold:!0},e.total,` live`),d.createElement(u,{color:`gray`},a(r,40)),n?d.createElement(u,{color:`gray`},`top: `,n.city??n.country??`—`,` · `,n.page??`—`,` (score`,` `,typeof n.aiScore==`number`?Math.round(n.aiScore):`—`,`)`):null)}},{id:`visitors`,title:`Active sessions`,render:e=>{let t=[...e.visitors].sort((e,t)=>(t.aiScore??0)-(e.aiScore??0)).slice(0,b);return t.length===0?d.createElement(u,{color:`gray`},`— no visitors yet —`):d.createElement(s,{columns:x,data:t,headerStyle:`accent`})}}]})}export{p as visitorsCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{formatTabular as r,selectFormat as i}from"./formatter-mW0Yk3Nt.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import{resolveSiteId as a}from"./resolve-site-BUpzvcMz.js";import{DataTable as o}from"./data-table-BUyOP6Nc.js";import{runAnalyticalScreen as s}from"./analytical-screen-BpTK5dCY.js";import{Box as c,Text as l}from"ink";import u from"react";const d={lcp:{good:2500,poor:4e3},inp:{good:200,poor:500},cls:{good:.1,poor:.25},ttfb:{good:800,poor:1800},fcp:{good:1800,poor:3e3}};function f(e,t){let n=d[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function p(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function m(d){let m=await e(),h=await t({strict:!1}),g=new n({config:m,cliVersion:d.cliVersion,token:h}),_,v;try{({siteId:_,site:v}=await a(g,{explicit:d.siteId,headless:!!(d.json||d.csv||d.tsv||d.ndjson),cliVersion:d.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(d),b=[{key:`url`,label:`url`,width:32},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,label:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?p(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return s({cliVersion:d.cliVersion,title:`vitals · ${_}`,commandName:`vitals`,authToken:h?.accessToken??null,refreshIntervalMs:d.watch?5*6e4:0,fetcher:e=>g.getVitals(_,{url:d.url,device:d.device,window:d.window},e),format: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 u.createElement(c,{flexDirection:`column`},n.map(e=>{let n=t(e),r=f(e,n);return u.createElement(l,{key:e},u.createElement(l,{color:r.color},`● `),u.createElement(l,{bold:!0},e.toUpperCase().padEnd(5)),` `,u.createElement(l,null,p(e,n).padStart(8)),` `,u.createElement(l,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?u.createElement(l,{color:`gray`},`— no vitals data yet —`):u.createElement(o,{data:e.vitals.slice(0,15),columns:b,headerStyle:`accent`})}]})}export{m as vitalsCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{parseSseStream as r}from"./client-WzSy90dG.js";import"./formatter-mW0Yk3Nt.js";import{emit as i,isHeadless as a}from"./emit-DBbMG9mK.js";import{Panel as o}from"./panel-uygscwY5.js";import{Banner as s}from"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import{Keybar as c}from"./keybar-C7YkmK1U.js";import{spark as l}from"./sparkline-Bkfzqe4x.js";import{resolveSiteId as u}from"./resolve-site-BUpzvcMz.js";import{EmptyState as d}from"./empty-state-Dkho-_3J.js";import{Globe as f}from"./globe-BrlflaZ1.js";import{z as p}from"zod";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";import C from"ink-text-input";const w=p.object({siteId:p.string().optional(),window:p.string().optional(),totalVisitors:p.number().optional(),visitors:p.object({count:p.number().optional(),series:p.array(p.number()).optional()}).optional(),topPages:p.array(p.object({path:p.string(),views:p.number().optional(),count:p.number().optional()})).optional(),sources:p.array(p.object({source:p.string(),visitors:p.number()})).optional()}).passthrough();async function T(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}=g(y.createElement(E,{api:c,siteId:l,intervalMs:r.intervalMs??15e3,cliVersion:r.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,intervalMs:n,cliVersion:i,onExit:a})=>{let{exit:l}=_(),[u,p]=x(null),[g,C]=x(null),[T,E]=x(null),[P,F]=x([]),[I,L]=x(!0),[R,z]=x(null),[B,V]=x(1),[H,U]=x(!1),[W,G]=x(!1);v((e,t)=>{if(e===`q`){l(),a(0);return}if(e===`?`||e===`/`){G(e=>!e);return}if(e===`g`){U(e=>!e);return}if(t.tab){V(e=>{let n=t.shift?(e+4)%6+1:e%6+1;return n});return}(e===`1`||e===`2`||e===`3`||e===`4`||e===`5`||e===`6`)&&V(Number(e))});let[K,q]=x(!1);if(b(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=w.safeParse(n);if(!i.success){q(!0),L(!1);return}q(!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};p(o),e.getVitals(t).then(e=>{r||C(e)},()=>{}),e.getGoals(t).then(e=>{r||E(e)},()=>{}),L(!1),z(null)}catch(e){r||z(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),b(()=>{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`&&F(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),I)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}`}),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 snapshot…`))));if(R&&!u)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}`}),y.createElement(o,{title:`Error`,state:`err`},y.createElement(h,{color:`red`},R)));if(K&&!u)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}`}),y.createElement(d,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let J=process.stdout.columns??80,Y=Math.max(20,Math.floor(J/3)-1),X=[];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:i,subtitle:`watch · ${t}${H?` · globe`:``}`}),y.createElement(m,{flexDirection:`row`},y.createElement(m,{flexDirection:`column`},H?y.createElement(o,{title:`Live globe`,focused:B===1,width:Y},y.createElement(f,{data:X,width:Math.max(40,Y-4),height:12})):y.createElement(O,{snapshot:u,focused:B===1,width:Y}),y.createElement(j,{events:P,focused:B===4,width:Y})),y.createElement(m,{flexDirection:`column`},y.createElement(k,{snapshot:u,focused:B===2,width:Y}),y.createElement(M,{vitals:g,focused:B===5,width:Y})),y.createElement(m,{flexDirection:`column`},y.createElement(A,{snapshot:u,focused:B===3,width:Y}),y.createElement(N,{goals:T,focused:B===6,width:Y}))),W?y.createElement(D,{api:e,siteId:t,width:J-2}):null,y.createElement(c,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:H?`panels`:`globe`},{key:`?/`,label:W?`close chat`:`ai chat`},{key:`q`,label:`quit`}]}))},D=({api:e,siteId:t,width:n})=>{let[i,a]=x(``),[s,c]=x([]),[l,u]=x(!1),[d,f]=x(``),[p,g]=x(null),_=async n=>{let i=n.trim();if(!i||l)return;g(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`)g(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...o,{role:`assistant`,content:a}]),f(``)}catch(e){g(e instanceof Error?e.message:`chat failed`)}finally{u(!1)}};return y.createElement(m,{marginTop:1},y.createElement(o,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},y.createElement(m,{flexDirection:`column`},s.slice(-6).map((e,t)=>y.createElement(m,{key:t,flexDirection:`column`,marginBottom:1},y.createElement(h,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),y.createElement(h,null,e.content))),l&&d?y.createElement(m,{flexDirection:`column`,marginBottom:1},y.createElement(h,{color:`magenta`,bold:!0},`zenovay`),y.createElement(h,null,d)):null,p?y.createElement(h,{color:`red`},`✗ `,p):null,y.createElement(m,null,y.createElement(h,{color:`cyan`},l?`⠋ `:`▸ `),y.createElement(C,{value:i,onChange:a,onSubmit:_,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},O=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return y.createElement(o,{title:`Visitors`,focused:t,width:n},y.createElement(h,{bold:!0},r.toString()),y.createElement(h,{color:`gray`},i.length>0?l(i,Math.max(8,n-6)):`— no data —`))},k=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return y.createElement(o,{title:`Top pages`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.path},y.createElement(h,null,e.path.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.views))))},A=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return y.createElement(o,{title:`Sources`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.source},y.createElement(h,null,e.source.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.visitors))))},j=({events:e,focused:t,width:n})=>y.createElement(o,{title:`Events`,focused:t,width:n},e.length===0?y.createElement(h,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>y.createElement(h,{key:t},e.slice(0,n-4)))),M=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>y.createElement(m,{key:e},y.createElement(h,{bold:!0},e.padEnd(6)),y.createElement(h,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return y.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`))},N=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return y.createElement(o,{title:`Goals`,focused:t,width:n},r.length===0?y.createElement(h,{color:`gray`},`— no data —`):r.map(e=>y.createElement(m,{key:e.name},y.createElement(h,null,e.name.padEnd(n-10).slice(0,n-10)),y.createElement(h,{color:`gray`},` `,e.completions))))};export{T as watchCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{confirmDestructive as r}from"./confirm-D_aKHknn.js";function i(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}function a(e){return e?new Date(e).toISOString().slice(0,10):`—`}async function o(o){let s=await e(),c=await t({strict:!1}),l=new n({config:s,cliVersion:o.cliVersion,token:c});try{switch(o.action){case`list`:{let{webhooks:e}=await l.listWebhooks();if(o.json)return process.stdout.write(JSON.stringify({webhooks:e},null,2)+`
|
|
2
2
|
`),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)+`
|
|
3
3
|
`),process.stdout.write(r(n.map(e=>`─`.repeat(e)))+`
|
|
4
4
|
`);for(let t of e){let e=t.status===`disabled`?`○`:`●`,o=t.url.length>n[2]?`${t.url.slice(0,n[2]-1)}…`:t.url,s=t.events.join(`,`),c=s.length>n[3]?`${s.slice(0,n[3]-1)}…`:s;process.stdout.write(r([e,i(t.id),o,c,a(t.createdAt)])+`
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import{Panel as r}from"./panel-uygscwY5.js";import{Banner as i}from"./banner-BPQh2F8l.js";import"./progress-row-DFOvHAc5.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import"./sparkline-Bkfzqe4x.js";import"./data-table-BUyOP6Nc.js";import"./bar-C9stEeJd.js";import"./ui-BRls3_H3.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-CJ1Py9a8.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-Ci9DDRha.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ApiClient as e,ApiError as t,ensureFreshToken as n}from"./api-CCL4vKaK.js";import{z as r}from"zod";const i=r.object({id:r.string(),startedAt:r.string(),country:r.string().nullable().optional(),city:r.string().nullable().optional(),device:r.enum([`mobile`,`desktop`,`tablet`,`unknown`]).optional(),os:r.string().nullable().optional(),browser:r.string().nullable().optional(),page:r.string().optional(),referrer:r.string().nullable().optional(),utmSource:r.string().nullable().optional(),utmMedium:r.string().nullable().optional(),utmCampaign:r.string().nullable().optional(),aiScore:r.number().min(0).max(100).nullable().optional()}),a=r.object({visitors:r.array(i),total:r.number().int(),windowStart:r.string(),windowEnd:r.string()}),o=r.object({type:r.enum([`visitor.started`,`visitor.ended`,`visitor.heartbeat`]),visitor:i}),s=r.object({source:r.string(),channel:r.enum([`direct`,`organic`,`paid`,`social`,`referral`,`email`,`other`]).optional(),visitors:r.number().int(),conversions:r.number().int().optional(),revenue:r.number().int().optional(),delta:r.number().nullable().optional()}),c=r.object({sources:r.array(s),totalVisitors:r.number().int(),windowStart:r.string(),windowEnd:r.string()}),l=r.object({bucket:r.string(),amount:r.number().int(),currency:r.string(),transactions:r.number().int()}),u=r.object({series:r.array(l),totalAmount:r.number().int(),currency:r.string(),totalTransactions:r.number().int(),mrr:r.number().int().optional(),arpu:r.number().int().optional(),windowStart:r.string(),windowEnd:r.string()}),d=r.object({url:r.string(),device:r.enum([`mobile`,`desktop`]).optional(),lcp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),inp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),cls:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),ttfb:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),fcp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),samples:r.number().int()}),f=r.object({vitals:r.array(d),windowStart:r.string(),windowEnd:r.string()}),p=r.object({id:r.string(),name:r.string(),visitors:r.number().int(),conversions:r.number().int(),dropOff:r.number().min(0).max(1).optional()}),m=r.object({funnelId:r.string(),name:r.string(),steps:r.array(p),totalEntries:r.number().int(),totalCompletions:r.number().int(),conversionRate:r.number().min(0).max(1),windowStart:r.string(),windowEnd:r.string()}),h=r.object({id:r.string(),name:r.string(),stepCount:r.number().int(),lastEvaluatedAt:r.string().nullable().optional()}),g=r.object({funnels:r.array(h)}),_=r.object({visitors:r.number().int(),pageviews:r.number().int(),sessions:r.number().int(),bounceRate:r.number().min(0).max(1),avgSessionSec:r.number(),topPages:r.array(r.object({url:r.string(),views:r.number().int()})),topCountries:r.array(r.object({country:r.string(),visitors:r.number().int()})),windowStart:r.string(),windowEnd:r.string(),daily:r.array(r.object({date:r.string(),visitors:r.number().int(),pageviews:r.number().int()})).optional()}),v=r.object({id:r.string(),name:r.string(),type:r.enum([`event`,`pageview`,`revenue`]),conversions24h:r.number().int(),conversions7d:r.number().int()}),y=r.object({goals:r.array(v)}),b=r.object({id:r.string(),name:r.string(),domain:r.string().nullable().optional(),industry:r.string().nullable().optional(),employeeCount:r.number().int().nullable().optional(),visitorCount:r.number().int(),firstSeenAt:r.string(),lastSeenAt:r.string()}),x=r.object({type:r.enum([`company.identified`,`company.returning`]),company:b}),S=r.object({companies:r.array(b),total:r.number().int()}),C=r.object({type:r.literal(`error.captured`),id:r.string(),message:r.string(),stack:r.string().optional(),url:r.string().optional(),occurredAt:r.string(),count:r.number().int().optional(),spike:r.number().optional()}),w=r.object({id:r.string(),ts:r.string(),class:r.string(),message:r.string(),page:r.string().nullable(),device:r.string().nullable(),fingerprint:r.string().nullable()}),T=r.object({errors:r.array(w),total:r.number().int()}),E=r.object({id:r.string(),name:r.string(),domain:r.string().nullable(),industry:r.string().nullable(),employeeCount:r.number().int().nullable(),visitCount:r.number().int(),firstSeenAt:r.string(),lastSeenAt:r.string(),isNew:r.boolean()}),D=r.object({companies:r.array(E),total:r.number().int()}),O=r.object({columns:r.array(r.string()),rows:r.array(r.record(r.unknown())),row_count:r.number(),duration_ms:r.number(),truncated:r.boolean()}),k=r.object({id:r.string(),provider:r.literal(`github`),commit_sha:r.string(),commit_message:r.string().nullable(),commit_author:r.string().nullable(),branch:r.string().nullable(),repository:r.string().nullable(),commit_url:r.string().nullable(),pushed_at:r.string(),show_on_chart:r.boolean()}),A=r.object({deploys:r.array(k),total:r.number().int()}),j=r.object({id:r.string(),name:r.string(),domain:r.string().nullable(),tier:r.string(),pageviews24h:r.number().int(),isCurrent:r.boolean()}),M=r.object({projects:r.array(j)}),N=r.object({type:r.string(),bucket:r.string(),count:r.number().int()}),P=r.object({events:r.array(N),windowStart:r.string(),windowEnd:r.string()}),F=r.object({id:r.string(),receivedAt:r.string(),url:r.string(),method:r.string(),headers:r.record(r.string(),r.string()),body:r.string()}),I=r.object({columns:r.array(r.string()),rows:r.array(r.array(r.unknown())),rowCount:r.number().int(),durationMs:r.number(),truncated:r.boolean().optional()}),L=r.object({resource:r.string(),values:r.array(r.string()),cachedAt:r.string().optional()});function R(e,t){throw Error(`api-v2: ${e} not yet implemented; awaiting backend Wave ${t}`)}async function*z(e,t){R(e,t)}function B(e){switch(e){case`24h`:return 1;case`7d`:return 7;case`30d`:return 30;case`90d`:return 90;case`1y`:return 365;default:return 7}}var V=class extends e{v2Opts;v2Fetch;v2Token;constructor(e){super(e),this.v2Opts=e,this.v2Fetch=e.fetchImpl??fetch,this.v2Token=e.token??null}get v2ApiBase(){return this.v2Opts.config.apiBase}async v2Headers(e={}){let t=process.env.ZENOVAY_API_TOKEN;if(t&&t.trim())return{Accept:`application/json`,"User-Agent":`zenovay-cli/${this.v2Opts.cliVersion}`,"X-Zenovay-CLI-Version":this.v2Opts.cliVersion,Authorization:`Bearer ${t.trim()}`,...e};this.v2Token||=await n({apiBase:this.v2ApiBase});let r={Accept:`application/json`,"User-Agent":`zenovay-cli/${this.v2Opts.cliVersion}`,"X-Zenovay-CLI-Version":this.v2Opts.cliVersion,...e};return this.v2Token&&(r.Authorization=`${this.v2Token.tokenType} ${this.v2Token.accessToken}`),r}async v2Request(e,n,r={},i){let a=`${this.v2ApiBase}${e}`,o=await this.v2Headers(r.headers??{}),s=await this.v2Fetch(a,{...r,headers:o,signal:i});if(s.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers(r.headers??{});s=await this.v2Fetch(a,{...r,headers:e,signal:i})}if(!s.ok){let n=await s.text().catch(()=>``),i=n;try{i=JSON.parse(n)}catch{}throw new t(s.status,i,`${r.method??`GET`} ${e} → ${s.status}`)}let c=await s.json();return n.parse(c)}async v2RequestRaw(e,n={},r){let i=`${this.v2ApiBase}${e}`,a=await this.v2Headers(n.headers??{}),o=await this.v2Fetch(i,{...n,headers:a,signal:r});if(o.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers(n.headers??{});o=await this.v2Fetch(i,{...n,headers:e,signal:r})}if(!o.ok){let r=await o.text().catch(()=>``),i=r;try{i=JSON.parse(r)}catch{}throw new t(o.status,i,`${n.method??`GET`} ${e} → ${o.status}`)}let s=await o.json();return s?.data??s}async getVisitors(e,t,n){let r=new URLSearchParams({site_id:e});t?.since&&r.set(`since`,t.since),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/visitors?${r.toString()}`,{},n),o=new Date,s=new Date(Date.now()-24*3600*1e3),c=e=>{if(!e)return`unknown`;let t=e.toLowerCase();return t.includes(`mobile`)?`mobile`:t.includes(`tablet`)?`tablet`:t.includes(`desktop`)?`desktop`:`unknown`};return a.parse({total:i.liveCount??i.visitors?.length??0,visitors:(i.visitors??[]).map(e=>({id:e.sessionId,startedAt:e.lastSeen,country:e.country,city:null,device:c(e.device??null),page:e.currentPath??void 0,aiScore:typeof e.valueScore==`number`?Math.max(0,Math.min(100,e.valueScore)):null})),windowStart:s.toISOString(),windowEnd:o.toISOString()})}streamVisitors(e,t){return this.streamChannel(e,`visitors`,t)}async getSources(e,t=`30d`,n,r){let i=new URLSearchParams({site_id:e,period:t});n&&i.set(`compare`,n);let a=await this.v2RequestRaw(`/v1/cli/sources?${i.toString()}`,{},r),o=a.channels??[],s=a.top_utm_sources??[],l=o.reduce((e,t)=>e+t.visitors,0),u=new Set([`direct`,`organic`,`paid`,`social`,`referral`,`email`]),d=[...o.map(e=>({source:e.name,channel:u.has(e.name)?e.name:`other`,visitors:e.visitors,delta:typeof e.delta==`number`?e.delta/100:null})),...s.map(e=>({source:e.medium?`${e.source}/${e.medium}`:e.source,channel:`other`,visitors:e.visitors}))],f=new Date,p=new Date(Date.now()-B(t)*24*3600*1e3);return c.parse({sources:d,totalVisitors:l,windowStart:p.toISOString(),windowEnd:f.toISOString()})}async getRevenue(e,t=`30d`,n){let r=new URLSearchParams({site_id:e,window:t}),i=await this.v2RequestRaw(`/v1/cli/revenue?${r.toString()}`,{},n),a=(i.daily??[]).map(e=>({bucket:e.date,amount:e.cents,currency:i.currency??`USD`,transactions:e.transactions})),o=a.reduce((e,t)=>e+t.amount,0),s=a.reduce((e,t)=>e+t.transactions,0),c=new Date,l=new Date(Date.now()-B(t)*24*3600*1e3),d={series:a,totalAmount:o,currency:i.currency??`USD`,totalTransactions:s,windowStart:l.toISOString(),windowEnd:c.toISOString()};return typeof i.mrr_cents==`number`&&(d.mrr=i.mrr_cents),u.parse(d)}async getVitals(e,t,n){let r=new URLSearchParams({site_id:e});t?.url&&r.set(`url`,t.url),t?.device&&r.set(`device`,t.device),t?.window&&r.set(`window`,t.window);let i=await this.v2RequestRaw(`/v1/cli/vitals?${r.toString()}`,{},n),a=[];if(i.p75&&(i.sample_count??0)>0){let e=i.p75,n={url:`— site-wide aggregate —`,device:t?.device??void 0,samples:i.sample_count??0,...typeof e.lcp==`number`?{lcp:{p50:e.lcp,p75:e.lcp,p90:e.lcp}}:{},...typeof e.inp==`number`?{inp:{p50:e.inp,p75:e.inp,p90:e.inp}}:{},...typeof e.cls==`number`?{cls:{p50:e.cls,p75:e.cls,p90:e.cls}}:{},...typeof e.fcp==`number`?{fcp:{p50:e.fcp,p75:e.fcp,p90:e.fcp}}:{},...typeof e.ttfb==`number`?{ttfb:{p50:e.ttfb,p75:e.ttfb,p90:e.ttfb}}:{}};a.push(n)}for(let e of i.worst_pages??[])a.push({url:e.path,device:t?.device??void 0,samples:e.sample_count,lcp:{p50:e.lcp_p75,p75:e.lcp_p75,p90:e.lcp_p75}});let o=new Date,s=new Date(Date.now()-B(t?.window??`7d`)*24*3600*1e3);return f.parse({vitals:a,windowStart:s.toISOString(),windowEnd:o.toISOString()})}async getFunnel(e,t,n=`30d`,r){let i=new URLSearchParams({site_id:e,window:n}),a=await this.v2RequestRaw(`/v1/cli/funnels/${encodeURIComponent(t)}?${i.toString()}`,{},r),o=a.total_entries??0,s=(a.steps??[]).map(e=>({id:`step-${e.order}`,name:e.name,visitors:e.visitors,conversions:e.visitors,dropOff:Math.max(0,Math.min(1,e.dropoffPct/100))})),c=s[s.length-1],l=c?.visitors??0,u=o>0?Math.min(1,l/o):0,d=new Date,f=new Date(Date.now()-B(n)*24*3600*1e3);return m.parse({funnelId:a.id??t,name:a.name??t,steps:s,totalEntries:o,totalCompletions:l,conversionRate:u,windowStart:f.toISOString(),windowEnd:d.toISOString()})}async listFunnels(e,t){let n=new URLSearchParams({site_id:e}),r=await this.v2RequestRaw(`/v1/cli/funnels?${n.toString()}`,{},t);return g.parse({funnels:(r.funnels??[]).map(e=>({id:e.id,name:e.name,stepCount:e.step_count}))})}async getStats(e,t=`24h`,n){let r=new URLSearchParams({site_id:e,range:t}),i=await this.v2RequestRaw(`/v1/cli/stats?${r.toString()}`,{},n),a=i.visitors??0,o=i.pageviews??0,s=a,c=s>0?o/s:0,l=c>0?Math.max(0,Math.min(1,1/Math.max(1,c))):0,u=i.avgSessionSec??0,d=new Date,f=new Date(Date.now()-B(t)*24*3600*1e3);return _.parse({visitors:a,pageviews:o,sessions:s,bounceRate:l,avgSessionSec:u,topPages:i.topPage?[{url:i.topPage.path,views:i.topPage.views}]:[],topCountries:i.topSource?[{country:i.topSource.channel,visitors:i.topSource.visitors}]:[],windowStart:f.toISOString(),windowEnd:d.toISOString(),daily:i.daily})}async getGoals(e,t){let n=new URLSearchParams({site_id:e});return this.v2Request(`/v1/cli/goals?${n.toString()}`,y,{},t)}async getLive(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/live?${n.toString()}`,t)}async getPages(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/pages?${n.toString()}`,t)}async getDevices(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/devices?${n.toString()}`,t)}async getGeo(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/geo?${n.toString()}`,t)}async getRetention(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/retention?${n.toString()}`,t)}async getUptime(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/uptime?${n.toString()}`,t)}async getSessions(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/sessions?${n.toString()}`,t)}async getHeatmaps(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/heatmaps?${n.toString()}`,t)}async getJourneys(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/journeys?${n.toString()}`,t)}async getInsights(e,t){let n=new URLSearchParams({site_id:e});return await this.v2RawJson(`/v1/cli/insights?${n.toString()}`,t)}async v2RawJson(e,n){let r=`${this.v2ApiBase}${e}`,i=await this.v2Headers(),a=await this.v2Fetch(r,{headers:i,signal:n});if(a.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers();a=await this.v2Fetch(r,{headers:e,signal:n})}if(!a.ok){let n=await a.text().catch(()=>``),r=n;try{r=JSON.parse(n)}catch{}throw new t(a.status,r,`GET ${e} → ${a.status}`)}return a.json()}streamCompaniesV2(e,t){return this.streamChannel(e,`companies`,t)}streamCompanies(e,t){return z(`streamCompanies`,2)}async getCompanies(e){R(`getCompanies`,2)}async getCompaniesSnapshot(e,t,n){let r=new URLSearchParams({site_id:e});t?.window&&r.set(`window`,t.window),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/companies?${r.toString()}`,{},n);return D.parse(i)}async runSqlQuery(e,n,r,i){let a=`${this.v2ApiBase}/v1/cli/query`,o=await this.v2Headers({"Content-Type":`application/json`}),s=await this.v2Fetch(a,{method:`POST`,headers:o,signal:i,body:JSON.stringify({site_id:e,sql:n,...r?.maxRows?{max_rows:r.maxRows}:{}})});if(!s.ok){let e=await s.text().catch(()=>``),n=e;try{n=JSON.parse(e)}catch{}throw new t(s.status,n,`POST /v1/cli/query → ${s.status}`)}let c=await s.json();return O.parse(c.data??c)}async getDeploys(e,t,n){let r=new URLSearchParams({site_id:e});t?.since&&r.set(`since`,t.since),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit)),t?.branch&&r.set(`branch`,t.branch),t?.onChartOnly&&r.set(`on_chart_only`,`true`);let i=await this.v2RequestRaw(`/v1/cli/deploys?${r.toString()}`,{},n);return A.parse(i)}async getProjects(e,t){let n=new URLSearchParams({site_id:e}),r=await this.v2RequestRaw(`/v1/cli/projects?${n.toString()}`,{},t);return M.parse(r)}async getErrors(e,t,n){let r=new URLSearchParams({site_id:e});t?.window&&r.set(`window`,t.window),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/errors?${r.toString()}`,{},n);return T.parse(i)}streamErrorsV2(e,t){return this.streamChannel(e,`errors`,t)}streamErrors(e,t){return z(`streamErrors`,2)}async getEventsHistory(e,t){R(`getEventsHistory`,2)}forwardWebhook(e,t){return z(`forwardWebhook`,2)}async registerTunnel(e,t){R(`registerTunnel`,2)}async queryRaw(e,t,n){R(`queryRaw`,3)}async getCompletions(e,t){R(`getCompletions`,3)}async listApiKeys(e){return await this.v2RawJson(`/v1/cli/mutate/keys`,e)}async createApiKey(e,t){return await this.v2Mutate(`/v1/cli/mutate/keys`,`POST`,e,t)}async deleteApiKey(e,t){return await this.v2Mutate(`/v1/cli/mutate/keys/${encodeURIComponent(e)}`,`DELETE`,void 0,t)}async addDomain(e,t){return await this.v2Mutate(`/v1/cli/mutate/domains`,`POST`,e,t)}async deleteDomain(e,t){return await this.v2Mutate(`/v1/cli/mutate/domains/${encodeURIComponent(e)}`,`DELETE`,void 0,t)}async listTeam(e){return await this.v2RawJson(`/v1/cli/mutate/team`,e)}async inviteTeamMember(e,t){return await this.v2Mutate(`/v1/cli/mutate/team/invite`,`POST`,e,t)}async removeTeamMember(e,t){return await this.v2Mutate(`/v1/cli/mutate/team/members/${encodeURIComponent(e)}`,`DELETE`,void 0,t)}async updateTeamMemberRole(e,t,n){return await this.v2Mutate(`/v1/cli/mutate/team/members/${encodeURIComponent(e)}/role`,`PATCH`,{role:t},n)}async updateProfile(e,t){return await this.v2Mutate(`/v1/cli/mutate/profile`,`POST`,e,t)}async getPlanInfo(e){return await this.v2RawJson(`/v1/cli/mutate/plans/info`,e)}async upgradePlan(e,t){return await this.v2Mutate(`/v1/cli/mutate/plans/upgrade`,`POST`,{targetPlan:e},t)}async cancelPlan(e){return await this.v2Mutate(`/v1/cli/mutate/plans/cancel`,`POST`,{},e)}async getSettings(e){return await this.v2RawJson(`/v1/cli/mutate/settings`,e)}async getUsage(e){return await this.v2RawJson(`/v1/cli/mutate/usage`,e)}async setSetting(e,t,n){return await this.v2Mutate(`/v1/cli/mutate/settings`,`POST`,{key:e,value:t},n)}async listIntegrations(e){return await this.v2RawJson(`/v1/cli/mutate/integrations`,e)}async disconnectIntegration(e,t){return await this.v2Mutate(`/v1/cli/mutate/integrations/disconnect`,`POST`,{name:e},t)}async listGoals(e){return await this.v2RawJson(`/v1/cli/mutate/goals`,e)}async createGoal(e,t){return await this.v2Mutate(`/v1/cli/mutate/goals`,`POST`,e,t)}async deleteGoal(e,t){return await this.v2Mutate(`/v1/cli/mutate/goals/${encodeURIComponent(e)}`,`DELETE`,void 0,t)}async listNotes(e){return await this.v2RawJson(`/v1/cli/mutate/notes`,e)}async createNote(e,t){return await this.v2Mutate(`/v1/cli/mutate/notes`,`POST`,e,t)}async deleteNote(e,t){return await this.v2Mutate(`/v1/cli/mutate/notes/${encodeURIComponent(e)}`,`DELETE`,void 0,t)}async listAgencyClients(e){return await this.v2RawJson(`/v1/cli/mutate/agency/clients`,e)}async addAgencyClient(e,t){return await this.v2Mutate(`/v1/cli/mutate/agency/clients`,`POST`,e,t)}async removeAgencyClient(e,t){return await this.v2Mutate(`/v1/cli/mutate/agency/clients/${encodeURIComponent(e)}`,`DELETE`,void 0,t)}async sendAgencyReport(e,t){return await this.v2Mutate(`/v1/cli/mutate/agency/report/${encodeURIComponent(e)}`,`POST`,{},t)}async listWebhooks(e){return await this.v2RawJson(`/v1/cli/mutate/webhooks`,e)}async createWebhook(e,t){return await this.v2Mutate(`/v1/cli/mutate/webhooks`,`POST`,e,t)}async deleteWebhook(e,t){return await this.v2Mutate(`/v1/cli/mutate/webhooks/${encodeURIComponent(e)}`,`DELETE`,void 0,t)}async rotateWebhookSecret(e,t){return await this.v2Mutate(`/v1/cli/mutate/webhooks/${encodeURIComponent(e)}/rotate`,`POST`,{},t)}async testWebhook(e,t){return await this.v2Mutate(`/v1/cli/mutate/webhooks/${encodeURIComponent(e)}/test`,`POST`,{},t)}async getAuditLogs(e,t){let n=new URLSearchParams;e.since&&n.set(`since`,e.since),e.action&&n.set(`action`,e.action),e.actor&&n.set(`actor`,e.actor);let r=n.toString()?`/v1/cli/mutate/audit/logs?${n.toString()}`:`/v1/cli/mutate/audit/logs`;return await this.v2RawJson(r,t)}async exportAudit(e,n){let r=`${this.v2ApiBase}/v1/cli/mutate/audit/export?format=${encodeURIComponent(e.format)}`,i=await this.v2Headers(),a=await this.v2Fetch(r,{headers:i,signal:n});if(a.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers();a=await this.v2Fetch(r,{headers:e,signal:n})}if(!a.ok){let e=await a.text().catch(()=>``),n=e;try{n=JSON.parse(e)}catch{}throw new t(a.status,n,`GET /v1/cli/mutate/audit/export → ${a.status}`)}return a.text()}async getShare(e,t){let n=new URLSearchParams({siteId:e});return await this.v2RawJson(`/v1/cli/mutate/share?${n.toString()}`,t)}async enableShare(e,t){return await this.v2Mutate(`/v1/cli/mutate/share/enable`,`POST`,{siteId:e},t)}async disableShare(e,t){return await this.v2Mutate(`/v1/cli/mutate/share/disable`,`POST`,{siteId:e},t)}async v2Mutate(e,n,r,i){let a=`${this.v2ApiBase}${e}`,o=await this.v2Headers(r===void 0?{}:{"Content-Type":`application/json`}),s={method:n,headers:o,signal:i};r!==void 0&&(s.body=JSON.stringify(r));let c=await this.v2Fetch(a,s);if(c.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers(r===void 0?{}:{"Content-Type":`application/json`});c=await this.v2Fetch(a,{...s,headers:e})}if(!c.ok){let r=await c.text().catch(()=>``),i=r;try{i=JSON.parse(r)}catch{}throw new t(c.status,i,`${n} ${e} → ${c.status}`)}let l=c.headers.get(`content-type`)??``;return l.includes(`application/json`)?c.json():{}}async*streamChannel(e,t,n){let{connectWs:r}=await import(`./ws-client-_BBjvKCb.js`),i=this.v2ApiBase.replace(/^https:\/\//,`wss://`).replace(/^http:\/\//,`ws://`),a=`${i}/v1/cli/stream/${encodeURIComponent(e)}?channels=${t}`,o=this.v2Token?.accessToken;for await(let e of r({url:a,bearer:o,signal:n})){if(e.type!==`message`)continue;let t=e.data;if(t&&typeof t==`object`){let e=t;yield e.event??t}}}async createTunnel(e,n,r){let i=`${this.v2ApiBase}/v1/cli/tunnels`,a=await this.v2Headers({"Content-Type":`application/json`}),o=await this.v2Fetch(i,{method:`POST`,headers:a,signal:r,body:JSON.stringify({site_id:e,target_pattern:n})});if(!o.ok){let e=await o.text().catch(()=>``);throw new t(o.status,e,`POST /v1/cli/tunnels → ${o.status}`)}let s=await o.json(),c=s.data??{};if(!c.tunnel_key||!c.public_url||!c.ws_url)throw new t(500,s,`createTunnel: malformed response`);return{tunnelKey:c.tunnel_key,publicUrl:c.public_url,wsUrl:c.ws_url,siteId:c.site_id??e}}tunnelClient(e){let t=this.v2Token?.accessToken;return{start:async(n,r)=>{let{WsTunnelClient:i}=await import(`./ws-client-_BBjvKCb.js`),a=new i({url:e,bearer:t,signal:r});await a.start(n)}}}};export{V as ApiV2Client};
|
package/dist/config-CZ9IzjIH.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.boolean().default(!1),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()}),a={apiBase:`https://api.zenovay.com`,cliBase:`https://cli.zenovay.com`,region:`auto`,telemetry:!1,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{o as configDir,s as configPath,c as readConfig,u as updateConfig};
|
package/dist/health-C-IJCz_C.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CZ9IzjIH.js";import"./check-Comj8AkL.js";import"./api-CCL4vKaK.js";import"./formatter-mW0Yk3Nt.js";import"./emit-DBbMG9mK.js";import"./panel-uygscwY5.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-D46wF_MS.js";export{n as healthCommand};
|
package/dist/init-CB5pEWxF.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CZ9IzjIH.js";import"./api-CCL4vKaK.js";import{initCommand as e}from"./init-CBKB7q3L.js";import"./client-WzSy90dG.js";import"./formatter-mW0Yk3Nt.js";import"./emit-DBbMG9mK.js";import"./login-RMoGEnH-.js";import"./panel-uygscwY5.js";import"./banner-BPQh2F8l.js";import"./progress-row-DFOvHAc5.js";import"./prompt-BURfUNxp.js";import"./keybar-C7YkmK1U.js";import"./sparkline-Bkfzqe4x.js";export{e as initCommand};
|
package/dist/login-DyQhcTmH.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CZ9IzjIH.js";import"./api-CCL4vKaK.js";import"./formatter-mW0Yk3Nt.js";import"./emit-DBbMG9mK.js";import{loginCommand as e}from"./login-RMoGEnH-.js";export{e as loginCommand};
|
package/dist/profile-Diq5Srqj.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CZ9IzjIH.js";import{readToken as t}from"./api-CCL4vKaK.js";import{ApiV2Client as n}from"./api-v2-Ci9DDRha.js";async function r(r){let i=await e(),a=await t({strict:!1}),o=new n({config:i,cliVersion:r.cliVersion,token:a});try{switch(r.action){case`show`:{let e=await o.me();if(r.json)return process.stdout.write(JSON.stringify(e,null,2)+`
|
|
2
|
-
`),0;let t=[``,` email: ${e.user.email}`,` name: ${e.user.name??`—`}`,` user id: ${e.user.id}`];return e.team&&(t.push(` team: ${e.team.name} (${e.team.id})`),t.push(` plan: ${e.team.plan}`)),t.push(``),process.stdout.write(t.join(`
|
|
3
|
-
`)),0}case`edit`:{if(r.name===void 0&&r.notifications===void 0)return process.stderr.write("Error: pass --name <n> or --notifications <email|none> for `profile edit`.\n"),2;let e={};r.name!==void 0&&(e.name=r.name),r.notifications!==void 0&&(e.notifications=r.notifications);let t=await o.updateProfile(e);return r.json?(process.stdout.write(JSON.stringify(t,null,2)+`
|
|
4
|
-
`),0):(process.stdout.write(`✔ Profile updated.${t.name?` name → ${t.name}`:``}${t.notifications?` notifications → ${t.notifications}`:``}\n`),0)}}}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}}export{r as profileCommand};
|
|
File without changes
|