@zenovay/cli 0.1.39 → 0.1.40
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-Ba8f5PMP.js → agency-DYMQrz5e.js} +1 -1
- package/dist/{ai-Dz_MAHHV.js → ai-DmxR_lNU.js} +1 -1
- package/dist/{alerts-Cxea5iYt.js → alerts-BTG9oRsv.js} +1 -1
- package/dist/{analytical-screen-BGMW3z_2.js → analytical-screen-D87giHuD.js} +1 -1
- package/dist/analytics-CVIGm-Pz.js +1 -0
- package/dist/{api-keys-DyFEtD2q.js → api-keys-Blt-bNJV.js} +1 -1
- package/dist/{api-v2-CfYUL93L.js → api-v2-CJiN4L_x.js} +1 -1
- package/dist/{api-v2-UJJ6ube8.js → api-v2-DJUWqNhW.js} +1 -1
- package/dist/{audit-DqPlGP-B.js → audit-hYEjdAXI.js} +1 -1
- package/dist/{banner-gVm7GaJF.js → banner-Cr0PV2pB.js} +1 -1
- package/dist/{bar-BPHTpgfb.js → bar-Cjia2R58.js} +1 -1
- package/dist/bin.js +5 -5
- package/dist/{commands-BrU-VT7M.js → commands-C10MYy2m.js} +1 -1
- package/dist/{companies-CH3F-hmU.js → companies-B_782axY.js} +1 -1
- package/dist/{completions-Ba0Zr-G3.js → completions-BfHvRZZt.js} +1 -1
- package/dist/{data-table-BnWXIW9M.js → data-table-D-JVXhZ7.js} +1 -1
- package/dist/{deploys-B79-S9yT.js → deploys-F-MoAZBr.js} +1 -1
- package/dist/{devices-BQnWRrD3.js → devices-D3IuyL3T.js} +1 -1
- package/dist/{doctor-DjmsSn5Z.js → doctor-BGMQ76yQ.js} +1 -1
- package/dist/{domains-B4WXSAV9.js → domains-BubAWKsJ.js} +1 -1
- package/dist/{emit-B8RbnBJe.js → emit-NkY7PE3R.js} +1 -1
- package/dist/{empty-state-BkS6DKWZ.js → empty-state-BbUJUNcp.js} +1 -1
- package/dist/error-codes-BIVN5Cs4.js +1 -0
- package/dist/{error-codes-Iig3PBVk.js → error-codes-Bc_l2RPJ.js} +1 -1
- package/dist/{errors-CmbIkaPX.js → errors-Bwq_VCFm.js} +1 -1
- package/dist/{events-tail-CE5QxNmF.js → events-tail-0phSCPj0.js} +1 -1
- package/dist/{export-BhWUB0S0.js → export-Bg9SHfGE.js} +1 -1
- package/dist/{funnel-4A9Q_ZCD.js → funnel-C4kZ79_s.js} +1 -1
- package/dist/{geo-BAXdGLKJ.js → geo-CMznGaqu.js} +1 -1
- package/dist/{globe-DMOyP2MN.js → globe-BZk_6dhW.js} +1 -1
- package/dist/{goals-CINA9D6R.js → goals-XCpWOdgc.js} +1 -1
- package/dist/{health-DAyE161Z.js → health-CizdEMSG.js} +1 -1
- package/dist/health-_zOoA0SB.js +1 -0
- package/dist/{heatmaps-DkY7BW0E.js → heatmaps-cV0tljvt.js} +1 -1
- package/dist/{home-DL_Ty0eK.js → home-1LkDaQxp.js} +1 -1
- package/dist/init-CiRjjHtt.js +1 -0
- package/dist/{init-C13-OX68.js → init-DR0qzfwC.js} +2 -2
- package/dist/{insights-BDxlGN5s.js → insights-CXhjRCIv.js} +1 -1
- package/dist/{integrations-Eu2LbV95.js → integrations-vXJWt6_W.js} +1 -1
- package/dist/{journeys-CQMP6cvE.js → journeys-nd4w7bqR.js} +1 -1
- package/dist/{keybar-BYQ2Bam1.js → keybar-Bh-y__tC.js} +1 -1
- package/dist/{live-BO8Wl0Q3.js → live-DEBxTrIq.js} +1 -1
- package/dist/login-351KgPLk.js +1 -0
- package/dist/{login-D2ll-nBp.js → login-DvZAZlYo.js} +1 -1
- package/dist/{logout-Cp7T5T1Y.js → logout-CRFdvKCc.js} +1 -1
- package/dist/{metric-card-DHIjVzNg.js → metric-card-qze7DsPv.js} +1 -1
- package/dist/{notes-BsegG0Q-.js → notes-BAACucyo.js} +1 -1
- package/dist/{pages-Bi57FO27.js → pages-lLziC-AS.js} +1 -1
- package/dist/{plans-BXm8QsVF.js → plans-yzESSjfK.js} +1 -1
- package/dist/{profile-GGQyYHdV.js → profile-BRvoBbuR.js} +1 -1
- package/dist/{progress-row-C7gQLX4T.js → progress-row-5G_PO8xL.js} +1 -1
- package/dist/{projects-t5f3WFmw.js → projects-C1Z-LtgN.js} +1 -1
- package/dist/{prompt-Db9Y7CVt.js → prompt-BS9qJvdR.js} +1 -1
- package/dist/{query-BmeQkD1w.js → query-CJn5YrPb.js} +1 -1
- package/dist/{resolve-site-CZEwJoBj.js → resolve-site-CoOL4KPZ.js} +1 -1
- package/dist/{retention-6HhdWwsd.js → retention-DgmJESlQ.js} +1 -1
- package/dist/{revenue-CdXv5fdi.js → revenue-B8czxlib.js} +1 -1
- package/dist/secrets-M60NENIa.js +1 -0
- package/dist/{self-test-CbW8hbCR.js → self-test-gNRwOvvZ.js} +3 -3
- package/dist/{sessions-CvSKjWsw.js → sessions-ii0FyaRs.js} +1 -1
- package/dist/{settings-CtEE3MFe.js → settings-B7iVOBd8.js} +1 -1
- package/dist/{share-5a0qKu3z.js → share-BHqYwW-L.js} +1 -1
- package/dist/{sources-Dtp05gd2.js → sources-DuXdHGqd.js} +1 -1
- package/dist/{stats-DRRgb-C3.js → stats-DvCE_0te.js} +1 -1
- package/dist/{team-q747Nwe6.js → team-PhCZG-T9.js} +1 -1
- package/dist/{teams-nDIrOaly.js → teams-C44Fpvgb.js} +1 -1
- package/dist/{themes-DVChFf6Y.js → themes-DXBgDytf.js} +1 -1
- package/dist/{tour-Dp2WmQUO.js → tour-CKGqvVm1.js} +1 -1
- package/dist/{update-DrsZLYAQ.js → update-BzrtEJGL.js} +1 -1
- package/dist/{uptime-Bmg-epd-.js → uptime-Cnsvl4uB.js} +1 -1
- package/dist/{usage-ZJK4hekT.js → usage-VhbOYHvU.js} +1 -1
- package/dist/{use-SGwWI1Rq.js → use-SKUDK4Ec.js} +1 -1
- package/dist/{visitors-D7FmGVz1.js → visitors-KH1Y7SJn.js} +1 -1
- package/dist/{vitals-CRE0nVgp.js → vitals-Bb_kw5k7.js} +1 -1
- package/dist/{watch-DeWYzdo4.js → watch-CvxGXxpw.js} +1 -1
- package/dist/{webhooks-CD7IvAxr.js → webhooks-DPs5-GwW.js} +1 -1
- package/dist/{webhooks-forward-X4iUnLrU.js → webhooks-forward-DBGxeHRT.js} +1 -1
- package/dist/wizard-bin.js +1 -1
- package/dist/{ws-client-Cp_nIj_N.js → ws-client-CUtNWrpp.js} +1 -1
- package/package.json +1 -1
- package/dist/analytics-5ztZSLLH.js +0 -1
- package/dist/health-CAnAYv9x.js +0 -1
- package/dist/init-C8KOSKzO.js +0 -1
- package/dist/login-CYaCSVUe.js +0 -1
- package/dist/secrets-A956dF9B.js +0 -1
- /package/dist/{client-CN2wyAL7.js → client-Ckr8RqMm.js} +0 -0
- /package/dist/{confirm-Dk3CEdpn.js → confirm-DvIRDrR9.js} +0 -0
- /package/dist/{examples-B8b7EpXo.js → examples-BZUH8Wow.js} +0 -0
- /package/dist/{fmt-CdJ3NqAG.js → fmt-BQF1s-Qd.js} +0 -0
- /package/dist/{formatter-KOe_hjhc.js → formatter-DDG2TSOz.js} +0 -0
- /package/dist/{globe-WYN8kVDK.js → globe-CWe_QkQI.js} +0 -0
- /package/dist/{panel-jycoT562.js → panel-CYsRlDSL.js} +0 -0
- /package/dist/{secrets-BszMfkn1.js → secrets-DPf_7SkN.js} +0 -0
- /package/dist/{sparkline-BlAQSlYZ.js → sparkline-DM2BGvjD.js} +0 -0
- /package/dist/{tier-uaU5pkTz.js → tier-ztFrvV9H.js} +0 -0
- /package/dist/{ui-hZ5oXnwY.js → ui-D0SbjI89.js} +0 -0
- /package/dist/{wrapper-Ce_PZUZ9.js → wrapper-BcFl_bdh.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CG7B8fR0.js";import"./api-CJnD6Auw.js";import{readToken as t}from"./token-store-C1AqhmDP.js";import{ApiV2Client as n}from"./api-v2-
|
|
1
|
+
import{readConfig as e}from"./config-CG7B8fR0.js";import"./api-CJnD6Auw.js";import{readToken as t}from"./token-store-C1AqhmDP.js";import{ApiV2Client as n}from"./api-v2-DJUWqNhW.js";import{parseSseStream as r}from"./client-Ckr8RqMm.js";import"./formatter-DDG2TSOz.js";import{emit as i,isHeadless as a}from"./emit-NkY7PE3R.js";import{Panel as o}from"./panel-CYsRlDSL.js";import{Banner as s}from"./banner-Cr0PV2pB.js";import"./prompt-BS9qJvdR.js";import{Keybar as c}from"./keybar-Bh-y__tC.js";import{spark as l}from"./sparkline-DM2BGvjD.js";import{resolveSiteId as u}from"./resolve-site-CoOL4KPZ.js";import{EmptyState as d}from"./empty-state-BbUJUNcp.js";import{Globe as f}from"./globe-CWe_QkQI.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-CG7B8fR0.js";import"./api-CJnD6Auw.js";import{readToken as t}from"./token-store-C1AqhmDP.js";import{emitErrorEnvelope as n}from"./error-codes-
|
|
1
|
+
import{readConfig as e}from"./config-CG7B8fR0.js";import"./api-CJnD6Auw.js";import{readToken as t}from"./token-store-C1AqhmDP.js";import{emitErrorEnvelope as n}from"./error-codes-Bc_l2RPJ.js";import{ApiV2Client as r}from"./api-v2-DJUWqNhW.js";import{confirmDestructive as i}from"./confirm-DvIRDrR9.js";import"./formatter-DDG2TSOz.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-NkY7PE3R.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-CG7B8fR0.js";import"./api-CJnD6Auw.js";import{readToken as t}from"./token-store-C1AqhmDP.js";import{ApiV2Client as n}from"./api-v2-
|
|
1
|
+
import{readConfig as e}from"./config-CG7B8fR0.js";import"./api-CJnD6Auw.js";import{readToken as t}from"./token-store-C1AqhmDP.js";import{ApiV2Client as n}from"./api-v2-DJUWqNhW.js";import{Panel as r}from"./panel-CYsRlDSL.js";import{Banner as i}from"./banner-Cr0PV2pB.js";import"./progress-row-5G_PO8xL.js";import"./prompt-BS9qJvdR.js";import"./keybar-Bh-y__tC.js";import"./sparkline-DM2BGvjD.js";import"./data-table-D-JVXhZ7.js";import"./bar-Cjia2R58.js";import"./ui-D0SbjI89.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-CiRjjHtt.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)});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=[500,1e3,2e3,4e3,8e3,16e3,32e3,6e4];let t=null;async function n(){if(t)return t;let e=globalThis.WebSocket;if(typeof e==`function`)return t=e,e;try{let e=await import(`./wrapper-
|
|
1
|
+
const e=[500,1e3,2e3,4e3,8e3,16e3,32e3,6e4];let t=null;async function n(){if(t)return t;let e=globalThis.WebSocket;if(typeof e==`function`)return t=e,e;try{let e=await import(`./wrapper-BcFl_bdh.js`),n=e.default??e.WebSocket;if(!n)throw Error(`ws package missing default export`);return t=n,n}catch(e){throw Error(`WebSocket unavailable: install Node 22+ or add the 'ws' dependency (${e.message})`)}}function r(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??Error(`aborted`));return}let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason??Error(`aborted`))};t?.addEventListener(`abort`,a,{once:!0})})}function i(t){return e[Math.min(t-1,e.length-1)]??6e4}function a(e,t){if(!t)return e;let n=e.includes(`?`)?`&`:`?`;return`${e}${n}access_token=${encodeURIComponent(t)}`}async function o(e,t,n,r){let i=a(e,n),o;try{o=n?new t(i,{headers:{Authorization:`Bearer ${n}`}}):new t(i)}catch(e){throw Error(`ws connect failed: ${e.message}`)}return await new Promise((e,t)=>{let n=!1,i=()=>{n||(n=!0,c(),e({socket:o,open:!0}))},a=e=>{if(n)return;n=!0,c();let r=e?.message??(typeof e==`string`?e:`ws connection error`);t(Error(r))},s=()=>{if(!n){n=!0,c();try{o.close()}catch{}t(r?.reason??Error(`aborted`))}},c=()=>{o.onopen=null,o.onerror=null,r?.removeEventListener(`abort`,s)};o.onopen=i,o.onerror=a,r?.addEventListener(`abort`,s,{once:!0})})}async function*s(e){let t=e.webSocketImpl??await n(),a=e.pingIntervalMs??3e4,s=e.maxReconnectAttempts??10,c=0;for(;;){if(e.signal?.aborted)return;let n;try{n=await o(e.url,t,e.bearer,e.signal)}catch(t){if(e.signal?.aborted)return;if(c++,c>s)throw t;let n=i(c);e.onReconnect?.(c,n);try{await r(n,e.signal)}catch{return}continue}yield{type:`open`};let l=[],u=[],d=!1,f=Date.now(),p=!1,m=e=>{f=Date.now();let t=u.shift();t?t(e):l.push(e)},h=()=>{if(!d)for(d=!0;u.length;)u.shift()(null)};n.socket.onmessage=e=>{m({type:`message`,data:e.data})},n.socket.onclose=()=>{m({type:`close`}),h()},n.socket.onerror=e=>{let t=e?.message??`ws error`;m({type:`error`,data:t})};let g=()=>{try{n.socket.close()}catch{}h()};e.signal?.addEventListener(`abort`,g,{once:!0});let _=null;a>0&&(_=setInterval(()=>{if(Date.now()-f>a*1.5){try{n.socket.close()}catch{}h()}},Math.max(1e3,Math.floor(a/2))));try{for(;;){if(e.signal?.aborted)return;let t;if(t=l.length>0?l.shift():d?null:await new Promise(e=>u.push(e)),t===null||(t.type===`message`&&(p=!0),yield t,t.type===`close`))break}}finally{_&&clearInterval(_),e.signal?.removeEventListener(`abort`,g);try{n.socket.close()}catch{}}if(e.signal?.aborted)return;if(p&&(c=0),c++,c>s)throw Error(`ws connection exceeded reconnect cap`);let v=i(c);e.onReconnect?.(c,v);try{await r(v,e.signal)}catch{return}}}var c=class{opts;ac=null;socket=null;running=!1;constructor(e){this.opts=e}async start(e){this.running=!0,this.ac=new AbortController;let t=l(this.ac.signal,this.opts.signal),a=this.opts.webSocketImpl??await n(),s=this.opts.maxReconnectAttempts??10,c=0;for(;this.running;){if(t.aborted)return;let n;try{n=await o(this.opts.url,a,this.opts.bearer,t)}catch(e){if(t.aborted)return;if(c++,c>s)throw e;let n=i(c);this.opts.onReconnect?.(c,n);try{await r(n,t)}catch{return}continue}this.socket=n.socket;let l=!1;if(await new Promise(r=>{n.socket.onmessage=t=>{l=!0;let r=typeof t.data==`string`?t.data:String(t.data),i=null;try{i=JSON.parse(r)}catch{return}!i||typeof i.correlationId!=`string`||e(i).then(e=>{let t={correlationId:i.correlationId,status:e.status,headers:e.headers,body:e.body};try{n.socket.send(JSON.stringify(t))}catch{}}).catch(e=>{let t={correlationId:i.correlationId,status:502,body:JSON.stringify({error:e.message})};try{n.socket.send(JSON.stringify(t))}catch{}})},n.socket.onclose=()=>r(),n.socket.onerror=()=>r(),t.addEventListener(`abort`,()=>{try{n.socket.close()}catch{}r()},{once:!0})}),this.socket=null,t.aborted||!this.running)return;if(l&&(c=0),c++,c>s)throw Error(`ws tunnel exceeded reconnect cap`);let u=i(c);this.opts.onReconnect?.(c,u);try{await r(u,t)}catch{return}}}async stop(){this.running=!1,this.ac?.abort();try{this.socket?.close()}catch{}this.socket=null}};function l(e,t){if(!t)return e;let n=new AbortController,r=()=>n.abort(e.reason),i=()=>n.abort(t.reason);return e.aborted?n.abort(e.reason):e.addEventListener(`abort`,r,{once:!0}),t.aborted?n.abort(t.reason):t.addEventListener(`abort`,i,{once:!0}),n.signal}export{c as WsTunnelClient,s as connectWs};
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-CG7B8fR0.js";import"./api-CJnD6Auw.js";import{readToken as t}from"./token-store-C1AqhmDP.js";import{ApiV2Client as n}from"./api-v2-UJJ6ube8.js";import"./formatter-KOe_hjhc.js";import{emit as r,isHeadless as i}from"./emit-B8RbnBJe.js";import{Panel as a}from"./panel-jycoT562.js";import{Banner as o}from"./banner-gVm7GaJF.js";import"./prompt-Db9Y7CVt.js";import{Keybar as s}from"./keybar-BYQ2Bam1.js";import"./sparkline-BlAQSlYZ.js";import{resolveSiteId as c}from"./resolve-site-CZEwJoBj.js";import{stripUrlPrefix as l}from"./fmt-CdJ3NqAG.js";import{DataTable as u}from"./data-table-BnWXIW9M.js";import{EmptyState as d}from"./empty-state-BkS6DKWZ.js";import{MetricCard as f}from"./metric-card-DHIjVzNg.js";import{Bar as p}from"./bar-BPHTpgfb.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";async function C(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await T(l,u,`24h`);return r({type:`overview.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:l,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}function w(e){return e===`24h`?`7d`:e}async function T(e,t,n){let[r,i,a,o,s]=await Promise.all([e.getStats(t,n).catch(()=>null),e.getPages(t).catch(()=>[]),e.getSources(t,w(n),`prev`).catch(()=>null),e.getGeo(t).catch(()=>null),e.getDevices(t).catch(()=>null)]),c=i.reduce((e,t)=>e+t.views,0),l=(r?.daily??[]).map(e=>e.visitors),u=(r?.daily??[]).map(e=>e.pageviews),d=Math.floor(l.length/2),f=l.slice(0,d).reduce((e,t)=>e+t,0),p=u.slice(0,d).reduce((e,t)=>e+t,0),m=(a?.sources??[]).filter(e=>e.channel!==`other`||!e.source.includes(`/`)).slice(0,6).map(e=>({name:e.source,visitors:e.visitors,delta:e.delta??null}));return{visitors:r?.visitors??0,pageviews:r?.pageviews??c,bounceRate:r?.bounceRate??null,avgSession:r?.avgSessionSec??null,series:l,pageviewsSeries:u,prevVisitors:f,prevPageviews:p,topPages:i.slice(0,10),channels:m,countries:(o?.countries??[]).slice(0,8),browsers:(s?.browsers??[]).slice(0,5),devices:(s?.devices??[]).slice(0,5)}}const E=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:c}=_(),[g,C]=x(null),[w,E]=x(!0),[D,O]=x(null),[k,A]=x(`24h`),[j,M]=x(t),[N,P]=x(n),[F,I]=x(!1),[L,R]=x([]);v(async t=>{if(t===`q`){c(),i(0);return}if(t===`1`){A(`24h`);return}if(t===`2`){A(`7d`);return}if(t===`3`){A(`30d`);return}if(t===`4`){A(`90d`);return}if(t===`s`){if(L.length===0)try{let t=await e.getSites();R(t)}catch{}I(e=>!e);return}}),b(()=>{let t=!1;return E(!0),(async()=>{try{let n=await T(e,j,k);t||(C(n),E(!1))}catch(e){t||(O(e.message),E(!1))}})(),()=>{t=!0}},[e,j,k]);let z=()=>y.createElement(a,{title:`Switch site`,state:`idle`},L.length===0?y.createElement(h,{color:`gray`},`Loading your sites…`):L.map(e=>y.createElement(m,{key:e.id},y.createElement(h,{color:e.id===j?`cyan`:`gray`},e.id===j?`› `:` `),y.createElement(h,{bold:e.id===j},e.name),y.createElement(h,{color:`gray`},` (`,e.url.replace(/^https?:\/\//,``).replace(/\/$/,``),`)`))),y.createElement(m,{marginTop:1},y.createElement(h,{color:`gray`},`Press `),y.createElement(h,{color:`cyan`},`[number]`),y.createElement(h,{color:`gray`},` to pick, `),y.createElement(h,{color:`cyan`},`[s]`),y.createElement(h,{color:`gray`},` to close.`)));v(e=>{if(!F)return;let t=Number(e);if(Number.isInteger(t)&&t>=1&&t<=L.length){let e=L[t-1];M(e.id),P(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),I(!1)}},{isActive:F});let B=`overview · ${N} · ${k}`,V=[{key:`q`,label:`quit`},{key:`s`,label:`site`},{key:`1-4`,label:`range (24h/7d/30d/90d)`}];if(w)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:B}),y.createElement(a,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`cyan`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching dashboard…`))),F?z():null);if(D)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:B}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:D}),F?z():null,y.createElement(s,{items:V}));if(!g||g.visitors===0&&g.pageviews===0&&g.topPages.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:B}),y.createElement(d,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event — or press [s] to switch to a different site, or [1-4] to widen the time range.`}),F?z():null,y.createElement(s,{items:V}));let H=process.stdout.columns??80,U=Math.max(18,Math.floor(H/4)-1),W=Math.max(28,Math.floor(H/2)-2),G=[{key:`path`,label:`path`,width:32,format:e=>l(String(e??``))},{key:`views`,label:`views`,align:`right`,width:8},{key:`uniqueVisitors`,label:`visitors`,align:`right`,width:8},{key:`avgTime`,label:`avg time`,align:`right`,width:9,format:e=>typeof e==`number`?`${Math.round(e/1e3)}s`:`—`},{key:`bounceRate`,label:`bounce`,align:`right`,width:7,format:e=>typeof e==`number`?`${(e*100).toFixed(0)}%`:`—`}],K=g.prevVisitors>0?(g.visitors-g.prevVisitors)/g.prevVisitors:void 0,q=g.prevPageviews>0?(g.pageviews-g.prevPageviews)/g.prevPageviews:void 0,J=Math.max(1,...g.channels.map(e=>e.visitors)),Y=Math.max(1,...g.countries.map(e=>e.visitors)),X=Math.max(1,...g.browsers.map(e=>e.visitors)),Z=Math.max(1,...g.devices.map(e=>e.visitors)),Q=Math.max(8,Math.floor(W/3));return y.createElement(m,{flexDirection:`column`},y.createElement(o,{version:r,subtitle:B}),y.createElement(m,{flexDirection:`row`},y.createElement(f,{title:`Visitors`,value:g.visitors,format:`number`,width:U,series:g.series,...typeof K==`number`?{delta:K}:{}}),y.createElement(f,{title:`Pageviews`,value:g.pageviews,format:`number`,width:U,series:g.pageviewsSeries,...typeof q==`number`?{delta:q}:{}}),y.createElement(f,{title:`Bounce rate`,value:g.bounceRate??``,emptyHint:`—`,format:`percent`,width:U}),y.createElement(f,{title:`Avg session`,value:g.avgSession??``,emptyHint:`—`,format:`duration`,width:U})),y.createElement(m,{flexDirection:`row`,flexWrap:`wrap`},y.createElement(m,{width:W,flexDirection:`column`},y.createElement(a,{title:`Channels`},g.channels.length===0?y.createElement(h,{color:`gray`},`No channel data yet.`):g.channels.map(e=>y.createElement(m,{key:e.name,flexDirection:`row`},y.createElement(m,{width:12},y.createElement(h,null,e.name)),y.createElement(p,{value:e.visitors,max:J,width:Q,showPercent:!1,...typeof e.delta==`number`?{delta:e.delta}:{}}),y.createElement(h,{color:`gray`},` `,e.visitors))))),y.createElement(m,{width:W,flexDirection:`column`},y.createElement(a,{title:`Top countries`},g.countries.length===0?y.createElement(h,{color:`gray`},`No geo data yet.`):g.countries.map(e=>y.createElement(m,{key:e.country,flexDirection:`row`},y.createElement(m,{width:5},y.createElement(h,null,e.country)),y.createElement(p,{value:e.visitors,max:Y,width:Q,showPercent:!1}),y.createElement(h,{color:`gray`},` `,e.visitors)))))),y.createElement(m,{flexDirection:`row`,flexWrap:`wrap`},y.createElement(m,{width:W,flexDirection:`column`},y.createElement(a,{title:`Top browsers`},g.browsers.length===0?y.createElement(h,{color:`gray`},`No browser data yet.`):g.browsers.map(e=>y.createElement(m,{key:e.name,flexDirection:`row`},y.createElement(m,{width:12},y.createElement(h,null,e.name)),y.createElement(p,{value:e.visitors,max:X,width:Q,showPercent:!1}),y.createElement(h,{color:`gray`},` `,e.visitors))))),y.createElement(m,{width:W,flexDirection:`column`},y.createElement(a,{title:`Top devices`},g.devices.length===0?y.createElement(h,{color:`gray`},`No device data yet.`):g.devices.map(e=>y.createElement(m,{key:e.name,flexDirection:`row`},y.createElement(m,{width:12},y.createElement(h,null,e.name)),y.createElement(p,{value:e.visitors,max:Z,width:Q,showPercent:!1}),y.createElement(h,{color:`gray`},` `,e.visitors)))))),y.createElement(a,{title:`Top pages (${k})`},g.topPages.length===0?y.createElement(h,{color:`gray`},`No pages with data in this window yet.`):y.createElement(u,{columns:G,data:g.topPages,zebra:!0})),F?z():null,y.createElement(s,{items:V}))};async function D(e){return C(e)}export{D as analyticsCommand};
|
package/dist/health-CAnAYv9x.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CG7B8fR0.js";import"./check-D9G0N7NB.js";import"./api-CJnD6Auw.js";import"./token-store-C1AqhmDP.js";import"./formatter-KOe_hjhc.js";import"./emit-B8RbnBJe.js";import"./panel-jycoT562.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-DAyE161Z.js";export{n as healthCommand};
|
package/dist/init-C8KOSKzO.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CG7B8fR0.js";import"./api-CJnD6Auw.js";import"./token-store-C1AqhmDP.js";import{initCommand as e}from"./init-C13-OX68.js";import"./client-CN2wyAL7.js";import"./formatter-KOe_hjhc.js";import"./emit-B8RbnBJe.js";import"./secrets-BszMfkn1.js";import"./login-D2ll-nBp.js";import"./panel-jycoT562.js";import"./banner-gVm7GaJF.js";import"./progress-row-C7gQLX4T.js";import"./prompt-Db9Y7CVt.js";import"./keybar-BYQ2Bam1.js";import"./sparkline-BlAQSlYZ.js";export{e as initCommand};
|
package/dist/login-CYaCSVUe.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-CG7B8fR0.js";import"./api-CJnD6Auw.js";import"./token-store-C1AqhmDP.js";import"./formatter-KOe_hjhc.js";import"./emit-B8RbnBJe.js";import{loginCommand as e}from"./login-D2ll-nBp.js";export{e as loginCommand};
|
package/dist/secrets-A956dF9B.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{SECRET_PATTERNS as e,scrubSecrets as t}from"./secrets-BszMfkn1.js";export{e as SECRET_PATTERNS,t as scrubSecrets};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|