@zenovay/cli 0.1.64 → 0.1.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-eSlGP6ay.js +1 -0
- package/dist/alerts-CcKnqwmm.js +3 -0
- package/dist/analytical-screen-BrOFDrQ_.js +2 -0
- package/dist/analytics-B8yy7gjr.js +2 -0
- package/dist/{annotation-BuwTxCIH.js → annotation-BiviGSmz.js} +1 -1
- package/dist/{api-keys-CHRLCfrl.js → api-keys-DQob1q69.js} +1 -1
- package/dist/{apply-B19bFTz0.js → apply-oUMOH7u2.js} +1 -1
- package/dist/{audit-Demn5lBp.js → audit-B4a5u54T.js} +2 -3
- package/dist/banner-MAYlzjcP.js +1 -0
- package/dist/{bar-DWT-1xOE.js → bar-DG-MqgGx.js} +1 -1
- package/dist/bin.js +6 -5
- package/dist/chat-panel-dXLm3hUn.js +7 -0
- package/dist/{commands-BX5I2UyT.js → commands-B-NMyq2s.js} +1 -1
- package/dist/companies-CpDnB5NR.js +2 -0
- package/dist/csv-emit-DYTuKBke.js +1 -0
- package/dist/csv-emit-XJfJC5e2.js +1 -0
- package/dist/{data-table-BpbyyNSA.js → data-table-BvnWCG-w.js} +1 -1
- package/dist/deploys-CI88FRFO.js +2 -0
- package/dist/devices-DNkzamfH.js +2 -0
- package/dist/{doctor-C1O4DlbQ.js → doctor-DJbNKwdF.js} +5 -5
- package/dist/{domains-BCDiOFYb.js → domains-BoRRxWzR.js} +1 -1
- package/dist/{emit-DBYk96TD.js → emit-D4YlMlzk.js} +1 -1
- package/dist/{empty-state-CJxa1jUN.js → empty-state-DdLBcz4h.js} +1 -1
- package/dist/errors-BtGhPNBy.js +2 -0
- package/dist/events-tail-ig5nAsbQ.js +5 -0
- package/dist/export-CTI3xHqF.js +4 -0
- package/dist/funnel-DkcJHeX6.js +3 -0
- package/dist/geo-UBu3aUHh.js +2 -0
- package/dist/{globe-C_m7zGZM.js → globe-GU2r8P23.js} +2 -2
- package/dist/{goals-OQ1s7Vhq.js → goals-CcA4qOM5.js} +1 -1
- package/dist/health-C-efHHs0.js +1 -0
- package/dist/health-am28BgPf.js +2 -0
- package/dist/heatmaps-C6ynBgMW.js +1 -0
- package/dist/home-B0miYclo.js +2 -0
- package/dist/init-CqcqX8o5.js +79 -0
- package/dist/init-awEnG3zC.js +1 -0
- package/dist/insights-C8PBisLR.js +1 -0
- package/dist/{integrations-S-9EITZH.js → integrations-CS16nG51.js} +3 -3
- package/dist/journeys-DaqlziL4.js +1 -0
- package/dist/{keybar-DsYTkKZX.js → keybar-BcHUm3hI.js} +1 -1
- package/dist/keybar-deep-link-Dagnpllp.js +1 -0
- package/dist/live-cIPlpoWN.js +1 -0
- package/dist/login-CiJG9-gq.js +1 -0
- package/dist/login-RVU9FkAl.js +2 -0
- package/dist/{logout-eXZJMigi.js → logout-BSSOsDr7.js} +1 -1
- package/dist/{metric-card-COEIZmbN.js → metric-card-CaFIymSQ.js} +1 -1
- package/dist/open-url-dPoDcwsm.js +1 -0
- package/dist/pages-3tis8juF.js +2 -0
- package/dist/panel-DB1HLxAw.js +1 -0
- package/dist/{plans-CNWFx-qt.js → plans-DCon6c8N.js} +5 -5
- package/dist/progress-row-BS7fwhn_.js +3 -0
- package/dist/projects-B7xPHSK2.js +2 -0
- package/dist/{prompt-D-Uzz_GF.js → prompt-D7Ek9MYk.js} +1 -1
- package/dist/query-CC7wPhmz.js +8 -0
- package/dist/resolve-site-DYBsBK4c.js +2 -0
- package/dist/retention-DeG_P1-s.js +1 -0
- package/dist/revenue-Dobs3EQH.js +2 -0
- package/dist/secrets-BBaEWu03.js +1 -0
- package/dist/self-test-DKOYwgHD.js +16 -0
- package/dist/sessions-DM4XGC2N.js +1 -0
- package/dist/{share-BG5ipcQi.js → share-6Dt695rC.js} +1 -1
- package/dist/sources-BofnMkYR.js +2 -0
- package/dist/stats-DkrgaDDP.js +2 -0
- package/dist/{status-agent-Dej6dGvX.js → status-agent-CQ955HRn.js} +1 -1
- package/dist/{team-B1qfFxKA.js → team-N-Ycc7Mh.js} +1 -1
- package/dist/theme-Brz9wK0w.js +1 -0
- package/dist/themes-lGJ4GHVu.js +4 -0
- package/dist/{tour-Bwbv_E4Q.js → tour-BA4g04Qt.js} +1 -1
- package/dist/ui-DXrdVAc-.js +1 -0
- package/dist/{update-BDMLrzzb.js → update-CYLXsiSE.js} +1 -1
- package/dist/uptime-I3klxuzW.js +1 -0
- package/dist/{usage-kXVWbunU.js → usage-DIzd9nzk.js} +1 -1
- package/dist/{use-B8cSIrZL.js → use-DlyoJe6I.js} +1 -1
- package/dist/visitors-BFBitwBV.js +2 -0
- package/dist/vitals-Bq1y2LBt.js +2 -0
- package/dist/watch-BYIKjsGC.js +1 -0
- package/dist/{webhooks-BhZkT0SX.js → webhooks-DKBhl3fL.js} +1 -1
- package/dist/webhooks-forward-Cfzd9veV.js +3 -0
- package/dist/wizard-bin.js +1 -1
- package/package.json +3 -2
- package/dist/ai-CPogCNEQ.js +0 -7
- package/dist/alerts-DWVCFKlS.js +0 -3
- package/dist/analytical-screen-BasvNR-9.js +0 -1
- package/dist/analytics-C7mAE3gV.js +0 -2
- package/dist/banner-3iSWTDFy.js +0 -1
- package/dist/chat-panel-CqJaCIg3.js +0 -7
- package/dist/companies-DEdYd-bV.js +0 -2
- package/dist/csv-emit-BuRZNWYM.js +0 -1
- package/dist/csv-emit-Dn3c0RCG.js +0 -1
- package/dist/deploys-DTIU1Kqt.js +0 -2
- package/dist/devices-DK_o0JcI.js +0 -2
- package/dist/errors-Dig3nVCV.js +0 -2
- package/dist/events-tail-u_lwZas2.js +0 -5
- package/dist/export-DkAIRS9F.js +0 -4
- package/dist/funnel-Brtq8avo.js +0 -3
- package/dist/geo-c9hA42_9.js +0 -2
- package/dist/health-B5DBRP3C.js +0 -1
- package/dist/health-BttlLZWZ.js +0 -2
- package/dist/heatmaps-BPxqgMmV.js +0 -1
- package/dist/home-DGrXLbbO.js +0 -2
- package/dist/init-BIJkCrgc.js +0 -79
- package/dist/init-BhfcLbDE.js +0 -1
- package/dist/insights-CrUKfMD5.js +0 -1
- package/dist/journeys-BbySeXM2.js +0 -1
- package/dist/keybar-deep-link-DC31T3CP.js +0 -1
- package/dist/live-dcM0RwGp.js +0 -1
- package/dist/login-DgU__egg.js +0 -1
- package/dist/login-yhuXiFqh.js +0 -2
- package/dist/pages-Bk5gbJ2v.js +0 -1
- package/dist/panel-B_yDcIcn.js +0 -1
- package/dist/progress-row-BpAXjJPL.js +0 -3
- package/dist/projects-BOU9sd2x.js +0 -2
- package/dist/query-CFNNsz6m.js +0 -8
- package/dist/resolve-site-mj0esTrm.js +0 -2
- package/dist/retention-CYDhYbyf.js +0 -1
- package/dist/revenue-D8uN4mjW.js +0 -2
- package/dist/secrets-c-NB_plk.js +0 -1
- package/dist/self-test-Cc5PWB08.js +0 -16
- package/dist/sessions-DqTjJFcP.js +0 -1
- package/dist/sources-D0FxjzeB.js +0 -2
- package/dist/stats-DmkvUylD.js +0 -2
- package/dist/themes-Dqt--qhd.js +0 -4
- package/dist/ui-Cey-h6wI.js +0 -1
- package/dist/uptime-CNGVODGc.js +0 -1
- package/dist/visitors-D7Q6chjq.js +0 -2
- package/dist/vitals-DmMAuIdP.js +0 -2
- package/dist/watch-D5WeMSz2.js +0 -1
- package/dist/webhooks-forward-D9PZDQ77.js +0 -3
- /package/dist/{client-DTXWADkX.js → client-I4GTcUcm.js} +0 -0
- /package/dist/{completions-CaYLmArp.js → completions-Cy6kF9kp.js} +0 -0
- /package/dist/{examples-BtWVpY-G.js → examples-C0LrZPUl.js} +0 -0
- /package/dist/{fmt-gMsty5jy.js → fmt-iR2sYwsO.js} +0 -0
- /package/dist/{formatter-DutfcQAc.js → formatter-C4YSOKuq.js} +0 -0
- /package/dist/{notes-DUqpXghJ.js → notes-ZXJfqA4H.js} +0 -0
- /package/dist/{profile-CZm-_uy-.js → profile-CY1_dG5d.js} +0 -0
- /package/dist/{secrets-ApB7yh2A.js → secrets-DzueUVGL.js} +0 -0
- /package/dist/{settings-CTbX2BXa.js → settings-C_st_Aqq.js} +0 -0
- /package/dist/{sparkline-BZ0eMB-w.js → sparkline-8ucKVUV7.js} +0 -0
- /package/dist/{teams-BzLZoKsj.js → teams-BmzDAiAn.js} +0 -0
- /package/dist/{telemetry--Yk0J5zc.js → telemetry-Ckn12kyP.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{requireTier as r}from"./tier-BneaO4vD.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-mj0esTrm.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";function S(e){return e>=.6?`magenta`:e>=.4?`cyan`:e>=.2?`blue`:`gray`}function C(e){return!Number.isFinite(e)||e===0?` — `:` ${(e*100).toFixed(0).padStart(3)}% `}async function w(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(a(o)){let e=await u.getRetention(d);return i({type:`retention.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(T,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const T=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=g(),[l,h]=b(null),[w,T]=b(!0),[E,D]=b(null);return _(e=>{if(e===`o`||e===`O`){f(d(`retention`,{siteId:t}));return}e===`q`&&(a(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getRetention(t);n||(h(r.cohorts),T(!1))}catch(e){n||(D(e.message),T(!1))}})(),()=>{n=!0}},[e,t]),w?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(o,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Crunching cohorts…`)))):E?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:E})):!l||l.length===0?v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No retention data yet`,hint:`Retention needs at least 30 days of traffic`})):v.createElement(p,{flexDirection:`column`},v.createElement(s,{version:r,subtitle:`retention · ${n}`}),v.createElement(o,{title:`Cohort retention (D1 / D7 / D30)`},v.createElement(p,{flexDirection:`row`},v.createElement(m,{bold:!0},`cohort`.padEnd(12)),v.createElement(m,{bold:!0},` D1 `),v.createElement(m,{bold:!0},` D7 `),v.createElement(m,{bold:!0},` D30 `)),l.map(e=>v.createElement(p,{key:e.date,flexDirection:`row`},v.createElement(m,null,e.date.padEnd(12).slice(0,12)),v.createElement(m,{color:S(e.day1)},C(e.day1)),v.createElement(m,{color:S(e.day7)},C(e.day7)),v.createElement(m,{color:S(e.day30)},C(e.day30))))),v.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{w as retentionCommand};
|
package/dist/revenue-D8uN4mjW.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{spark as a}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as o}from"./resolve-site-mj0esTrm.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-BasvNR-9.js";import"./ui-Cey-h6wI.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e,t){let n=e/100,r=new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:0}).format(n),i=(t||`USD`).toUpperCase();return i===`USD`?`$${r}`:i===`EUR`?`€${r}`:i===`GBP`?`£${r}`:`${r} ${i}`}async function m(m){let h=await e(),g=await t({strict:!1}),_=new n({config:h,cliVersion:m.cliVersion,token:g}),v,y;try{({siteId:v,site:y}=await o(_,{explicit:m.siteId,headless:!!(m.json||m.csv||m.tsv||m.ndjson),cliVersion:m.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let b=i(m),x=m.range??`30d`;return l({cliVersion:m.cliVersion,title:`revenue · ${v} · ${x}`,commandName:`revenue`,ai:{api:_,siteId:v,siteLabel:y?.url?y.url.replace(/^https?:\/\//,``).replace(/\/$/,``):y?.name??v},authToken:g?.accessToken??null,refreshIntervalMs:m.watch?5*6e4:0,fetcher:e=>_.getRevenue(v,x,e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`revenue`,{siteId:v}))}}},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
|
-
`);return}process.stdout.write(r(e.series,[`bucket`,`amount`,`currency`,`transactions`],t))},panels:[{id:`totals`,title:`Top line`,render:e=>f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{color:`green`,bold:!0},p(e.totalAmount,e.currency)),` `,f.createElement(d,{color:`gray`},`total · `,e.totalTransactions,` transactions`)),typeof e.mrr==`number`?f.createElement(d,null,f.createElement(d,{bold:!0},`MRR `),f.createElement(d,{color:`magenta`},p(e.mrr,e.currency)),typeof e.arpu==`number`?f.createElement(d,{color:`gray`},` · ARPU `,p(e.arpu,e.currency)):null):null)},{id:`series`,title:`Daily (${x})`,render:e=>{let t=e.series.map(e=>e.amount);if(t.length===0)return f.createElement(d,{color:`gray`},`— no transactions —`);let n=Math.max(...t,1);return f.createElement(u,{flexDirection:`column`},f.createElement(d,{color:`magenta`},a(t,Math.min(60,t.length*2))),f.createElement(d,{color:`gray`},`peak: `,p(n,e.currency),` ·`,` `,`avg: `,p(e.totalAmount/Math.max(1,t.length),e.currency)))}},{id:`window`,title:`Window`,render:e=>f.createElement(d,{color:`gray`},new Date(e.windowStart).toISOString().slice(0,10),` →`,` `,new Date(e.windowEnd).toISOString().slice(0,10))}]})}export{m as revenueCommand};
|
package/dist/secrets-c-NB_plk.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{SECRET_PATTERNS as e,scrubSecrets as t}from"./secrets-ApB7yh2A.js";export{e as SECRET_PATTERNS,t as scrubSecrets};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import{spawn as e}from"node:child_process";import t from"chalk";const n=3e4,r=4,i=1e3;function a(e,t){let n=e.requires;if(!n)return null;if(n.auth!==!1&&!t.authenticated)return`not authenticated`;if(n.tier&&t.currentTier){let e={free:0,pro:1,scale:2,enterprise:3},r=e[t.currentTier]??0,i=e[n.tier]??99}return n.multipleTeams&&!t.hasMultipleTeams?`requires 2+ teams`:n.freeTeam&&!t.hasFreeTeam?`requires a Free-tier team`:null}function o(t,n,r,i){return new Promise(a=>{let o=/\.[mc]?js$/.test(t),s=o?`node`:t,c=o?[t,...n]:n,l=e(s,c,{env:{...process.env,ZENOVAY_NO_UPDATE_CHECK:`1`,...i},stdio:[`ignore`,`pipe`,`pipe`]}),u=``,d=``,f=!1,p=setTimeout(()=>{f=!0;try{l.kill(`SIGKILL`)}catch{}},r);l.stdout?.on(`data`,e=>{u+=e.toString(`utf8`),u.length>1048576&&(u=u.slice(0,1048576))}),l.stderr?.on(`data`,e=>{d+=e.toString(`utf8`),d.length>1048576&&(d=d.slice(0,1048576))}),l.on(`error`,e=>{clearTimeout(p),a({stdout:u,stderr:d+`\n[spawn error: ${e.message}]`,exitCode:-1,timedOut:f})}),l.on(`close`,e=>{clearTimeout(p),a({stdout:u,stderr:d,exitCode:e??0,timedOut:f})})})}async function s(e,t){let r=Date.now(),s=a(e,t.env);if(s)return{name:e.name,category:e.category,status:`skip`,durationMs:0,reason:s};if(e.inProcess)try{let t=await e.inProcess(),n=Date.now()-r;return t.ok?{name:e.name,category:e.category,status:`pass`,durationMs:n,...t.detail?{detail:t.detail}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:n,reason:t.reason}}catch(t){return{name:e.name,category:e.category,status:`fail`,durationMs:Date.now()-r,reason:t.message}}let c=e.name===`stack-leak.bad-net`?{ZENOVAY_API_BASE:`http://127.0.0.1:1`}:void 0,l=t.timeoutMs??n,u=await o(t.binPath,e.command,l,c),d=Date.now()-r;if(u.timedOut)return{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:`timeout (${Math.round(l/1e3)}s)`,...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}};let f;try{f=e.assert(u.stdout,u.stderr,u.exitCode)}catch(n){return{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:`assert threw: ${n.message}`,...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}}}return f.ok?{name:e.name,category:e.category,status:`pass`,durationMs:d,...f.detail?{detail:f.detail}:{},...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:f.reason,...t.verbose?{rawStdout:u.stdout.slice(0,i),rawStderr:u.stderr.slice(0,i)}:{}}}async function c(e,t){let n=Date.now(),i=Math.max(1,t.parallel??r),a=Array(e.length).fill(void 0),o=[];for(let n=0;n<e.length;n++){let r=e[n];r&&(t.quick&&!r.quick||o.push(n))}let c=0,l=[],u=async()=>{for(;;){let n=c;if(c+=1,n>=o.length)return;let r=o[n];if(r===void 0)return;let i=e[r];if(!i)continue;let l=await s(i,t);a[r]=l,t.onResult?.(l)}};for(let e=0;e<i;e++)l.push(u());await Promise.all(l);let d=[];for(let e of a)e&&d.push(e);let f=d.filter(e=>e.status===`pass`).length,p=d.filter(e=>e.status===`fail`).length,m=d.filter(e=>e.status===`skip`).length;return{results:d,total:d.length,pass:f,fail:p,skip:m,durationMs:Date.now()-n}}async function l(e){let t={currentTier:null,hasMultipleTeams:!1,hasFreeTeam:!1,authenticated:!1};try{let{readToken:n}=await import(`./token-store-TmBx42nv.js`),{readConfig:r}=await import(`./config-DB3jF5gG.js`),{ApiV2Client:i}=await import(`./api-v2-CTc_U2Gw.js`),a=await n({strict:!1}).catch(()=>null);if(!a)return t;t.authenticated=!0;let o=await r(),s=new i({config:o,cliVersion:e,token:a}),c=await s.me();if(c.team?.plan){let e=c.team.plan.toLowerCase();(e===`free`||e===`pro`||e===`scale`||e===`enterprise`)&&(t.currentTier=e)}c.teams&&c.teams.length>=2&&(t.hasMultipleTeams=!0),(c.teams&&c.teams.some(e=>e.plan?.toLowerCase()===`free`)||t.currentTier===`free`)&&(t.hasFreeTeam=!0)}catch{}return t}function u(e){let t=e.trim();if(!t)return{ok:!1,reason:`empty stdout`};try{return{ok:!0,value:JSON.parse(t)}}catch{let e=t.split(`
|
|
2
|
-
`).filter(e=>e.trim().startsWith(`{`)||e.trim().startsWith(`[`)).pop();if(e)try{return{ok:!0,value:JSON.parse(e)}}catch{}return{ok:!1,reason:`stdout not JSON (got ${t.length} bytes)`}}}function d(e,t,n){if(n!==0)return{ok:!1,reason:`exit ${n}`};let r=u(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function f(e,t,n){if(n!==0){let r=[e,t];for(let e of r)if(e.includes(`tier_insufficient`))return{ok:!0,detail:{gated:!0}};return{ok:!1,reason:`exit ${n} — ${(t||e).slice(0,80)}`}}let r=u(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function p(e){if(typeof e!=`object`||!e)return!1;let t=e;if(Array.isArray(t.items)||Array.isArray(t.rows)||Array.isArray(t.data))return!0;if(typeof t.data==`object`&&t.data!==null){let e=t.data;if(Array.isArray(e.items)||Array.isArray(e.rows))return!0}return!1}const m=[{name:`analytics`,category:`ANALYTICS`,command:[`analytics`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(!i.ok)return{ok:!1,reason:i.reason};let a=i.value,o=a.visitors??a.data?.visitors,s=a.pageviews??a.data?.pageviews;return{ok:!0,detail:{visitors:o??null,pageviews:s??null}}},quick:!0},{name:`overview`,category:`ANALYTICS`,command:[`overview`,`--json`],assert:d},{name:`pages`,category:`ANALYTICS`,command:[`pages`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(!i.ok)return{ok:!1,reason:i.reason};let a=i.value,o=a.items??a.data?.items;return{ok:!0,detail:{rows:o?.length??0}}},quick:!0},{name:`sources`,category:`ANALYTICS`,command:[`sources`,`--json`],assert:d,quick:!0},{name:`devices`,category:`ANALYTICS`,command:[`devices`,`--json`],assert:d},{name:`geo`,category:`ANALYTICS`,command:[`geo`,`--json`],assert:d},{name:`live`,category:`ANALYTICS`,command:[`live`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(i.ok&&typeof i.value==`object`&&i.value!==null){let e=i.value,t=e.bounceRate??e.data?.bounceRate;if(typeof t==`number`&&(t<0||t>1))return{ok:!1,reason:`bounceRate semantics violated (got ${t}, expected 0..1)`}}return{ok:!0}}},{name:`revenue`,category:`ANALYTICS`,command:[`revenue`,`--json`],assert:d},{name:`funnels`,category:`ANALYTICS`,command:[`funnels`,`--json`],assert:f,requires:{tier:`pro`}},{name:`home`,category:`ANALYTICS`,command:[`home`,`--json`],assert:d},{name:`usage`,category:`ANALYTICS`,command:[`usage`,`--json`],assert:d,quick:!0},{name:`stats`,category:`ANALYTICS`,command:[`stats`,`--json`],assert:d},{name:`retention`,category:`BEHAVIOR`,command:[`retention`,`--json`],assert:f,requires:{tier:`pro`}},{name:`uptime`,category:`BEHAVIOR`,command:[`uptime`,`--json`],assert:f,requires:{tier:`pro`}},{name:`sessions`,category:`BEHAVIOR`,command:[`sessions`,`--json`],assert:f,requires:{tier:`pro`}},{name:`heatmaps`,category:`BEHAVIOR`,command:[`heatmaps`,`--json`],assert:f,requires:{tier:`pro`}},{name:`journeys`,category:`BEHAVIOR`,command:[`journeys`,`--json`],assert:f,requires:{tier:`pro`}},{name:`insights`,category:`INTELLIGENCE`,command:[`insights`,`--json`],assert:f,requires:{tier:`pro`}},{name:`domains list`,category:`MANAGE`,command:[`domains`,`list`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);return!i.ok||!p(i.value)?{ok:!1,reason:`expected list shape ({items|rows|data})`}:{ok:!0}},quick:!0},{name:`api-keys list`,category:`MANAGE`,command:[`api-keys`,`list`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);return!i.ok||!p(i.value)?{ok:!1,reason:`expected list shape`}:{ok:!0}}},{name:`team list`,category:`MANAGE`,command:[`team`,`list`,`--json`],assert:f,requires:{tier:`pro`}},{name:`webhooks list`,category:`MANAGE`,command:[`webhooks`,`list`,`--json`],assert:d},{name:`profile show`,category:`ACCOUNT`,command:[`profile`,`show`,`--json`],assert:d,quick:!0},{name:`plans info`,category:`ACCOUNT`,command:[`plans`,`info`,`--json`],assert:d},{name:`settings get`,category:`ACCOUNT`,command:[`settings`,`get`,`--json`],assert:d},{name:`integrations list`,category:`ACCOUNT`,command:[`integrations`,`list`,`--json`],assert:d},{name:`goals list`,category:`ACCOUNT`,command:[`goals`,`list`,`--json`],assert:f,requires:{tier:`pro`}},{name:`notes list`,category:`ACCOUNT`,command:[`notes`,`list`,`--json`],assert:d},{name:`audit list`,category:`ACCOUNT`,command:[`audit`,`list`,`--json`],assert:f,requires:{tier:`pro`}},{name:`share url`,category:`ACCOUNT`,command:[`share`,`url`,`--json`],assert:(e,t,n)=>n!==0&&n!==1&&n!==2?{ok:!1,reason:`unexpected exit ${n}`}:{ok:!0}},{name:`teams list`,category:`ACCOUNT`,command:[`teams`,`list`,`--json`],assert:d},{name:`health`,category:`OPERATIONS`,command:[`health`,`--json`],assert:(e,t,n)=>{let r=u(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}},quick:!0},{name:`commands`,category:`OPERATIONS`,command:[`commands`,`--json`],assert:(e,t,n)=>{let r=d(e,t,n);if(!r.ok)return r;let i=u(e);if(!i.ok)return{ok:!1,reason:i.reason};let a=i.value,o=a.commands;return!Array.isArray(o)||o.length===0?{ok:!1,reason:`commands tree empty`}:{ok:!0,detail:{commands:o.length}}}},{name:`themes`,category:`OPERATIONS`,command:[`themes`,`--json`],assert:d},{name:`projects`,category:`OPERATIONS`,command:[`projects`,`--json`],assert:d},{name:`idor.cross-team`,category:`SECURITY`,command:[`domains`,`list`,`--site-id`,`00000000-0000-0000-0000-000000000001`,`--json`],assert:(e,t,n)=>{let r=e+t;return/forbidden|not_found|tier_insufficient|auth_required|auth_invalid/.test(r)?{ok:!0,detail:{rejected:!0}}:r.includes(`"items"`)||r.includes(`"rows"`)?{ok:!1,reason:`expected forbidden/not_found, got data`}:{ok:!0,detail:{rejected:`empty`}}},requires:{multipleTeams:!0},dev:!0},{name:`idor.bad-uuid`,category:`SECURITY`,command:[`analytics`,`--site-id`,`00000000-0000-0000-0000-000000000000`,`--json`],assert:(e,t,n)=>{let r=e+t;return/not_found|forbidden|auth_/.test(r)?{ok:!0,detail:{rejected:!0}}:/error|invalid|"code":/i.test(r)?{ok:!0,detail:{rejected:`error-shaped`}}:{ok:!1,reason:`silent zeros — expected not_found`}},quick:!0,dev:!0},{name:`tier-gate.retention`,category:`SECURITY`,command:[`retention`,`--json`],assert:(e,t,n)=>{let r=e+t;return r.includes(`tier_insufficient`)?{ok:!0,detail:{gated:`tier_insufficient`}}:/upgrade_required|tier_required/.test(r)?{ok:!0,detail:{gated:`legacy-or-transitional`}}:/"code":\s*"forbidden"/.test(r)&&/tier|upgrade|plan/i.test(r)?{ok:!0,detail:{gated:`forbidden+tier-message`}}:n===0&&!/"type"\s*:\s*"error"/.test(r)?{ok:!0,detail:{gated:`pass-through (Pro+ access)`}}:{ok:!1,reason:`gate did not behave as expected (no tier envelope and no clean pass-through)`}},dev:!0},{name:`stack-leak.bad-net`,category:`SECURITY`,command:[`analytics`,`--json`],assert:(e,t,n)=>{let r=e+t;return/\/Users\//.test(r)||/node:internal\//.test(r)?{ok:!1,reason:`stack trace leaked filesystem path`}:{ok:!0}},quick:!0},{name:`token-perms`,category:`SECURITY`,command:[],assert:()=>({ok:!1,reason:`should run in-process`}),inProcess:async()=>{let{stat:e}=await import(`node:fs/promises`),t=await import(`node:path`),n=process.env.HOME??process.env.USERPROFILE??``,r=process.env.XDG_CONFIG_HOME??t.join(n,`.config`),i=process.platform===`win32`?t.join(process.env.APPDATA??t.join(n,`AppData`,`Roaming`),`zenovay`,`auth.json`):t.join(r,`zenovay`,`auth.json`);try{let t=await e(i);if(process.platform===`win32`)return{ok:!0,detail:{mode:`win32-skip`}};let n=t.mode&511;return n===384?{ok:!0,detail:{mode:`0600`}}:{ok:!1,reason:`auth.json mode ${n.toString(8)} != 0600`}}catch(e){let t=e.code;return t===`ENOENT`?{ok:!0,detail:{mode:`no-auth-file`}}:{ok:!1,reason:e.message}}},quick:!0},{name:`secret-scrub`,category:`SECURITY`,command:[],assert:()=>({ok:!1,reason:`should run in-process`}),inProcess:async()=>{let{SECRET_PATTERNS:e,scrubSecrets:t}=await import(`./secrets-c-NB_plk.js`),n=[{name:`openai-proj`,sample:`sk-proj-abcdefghijklmnopqrstuvwxyz0123456789`},{name:`anthropic`,sample:`sk-ant-abcdefghijklmnopqrstuvwxyz0123456789`},{name:`openai-sk`,sample:`sk-abcdefghijklmnopqrstuvwxyz0123`},{name:`github-pat-new`,sample:`github_pat_`+`a`.repeat(82)},{name:`github-pat`,sample:`ghp_`+`a`.repeat(36)},{name:`github-oauth`,sample:`gho_`+`a`.repeat(36)},{name:`aws-access-key`,sample:`AKIAABCDEFGHIJKLMNOP`},{name:`stripe-live`,sample:`sk_live_`+`a`.repeat(28)},{name:`stripe-test`,sample:`pk_test_`+`a`.repeat(28)},{name:`stripe-restricted`,sample:`rk_live_`+`a`.repeat(28)},{name:`stripe-webhook`,sample:`whsec_`+`a`.repeat(28)},{name:`slack-bot`,sample:`xoxb-1234567890-abcdef`},{name:`google-api`,sample:`AIza`+`a`.repeat(35)},{name:`jwt`,sample:`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c`},{name:`private-key-rsa`,sample:`-----BEGIN RSA PRIVATE KEY-----`},{name:`private-key-pkcs8`,sample:`-----BEGIN PRIVATE KEY-----`},{name:`supabase-jwt`,sample:`eyJhbGciOi`+`a`.repeat(40)},{name:`resend-api`,sample:`re_`+`a`.repeat(20)},{name:`gitlab-pat`,sample:`glpat-`+`a`.repeat(20)},{name:`shopify`,sample:`shpat_`+`a`.repeat(32)},{name:`service-role-key`,sample:`service_role: "`+`a`.repeat(40)+`"`}],r=n.map(e=>`${e.name}=${e.sample}`).join(`
|
|
3
|
-
`),i=t(r),a=n.filter(e=>i.includes(`[REDACTED:${e.name}]`)).length,o=e.length,s=Math.max(18,o-4);return a>=s?{ok:!0,detail:{matched:a,total:o}}:{ok:!1,reason:`${a}/${o} patterns redacted (need >= ${s})`}},quick:!0},{name:`help-line-count`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=e.split(`
|
|
4
|
-
`).length;return r<90?{ok:!0,detail:{lines:r}}:{ok:!1,reason:`${r} lines (target < 90)`}},dev:!0},{name:`help-no-wave-markers`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=/\b(?:Wave\s*\d|W\d|V2\.1)\b/i,i=e.match(r);return i?{ok:!1,reason:`found marker: ${i[0]}`}:{ok:!0}},dev:!0},{name:`help-has-groups`,category:`DISCOVERABILITY`,command:[`--help`],assert:(e,t,n)=>{let r=[`ANALYTICS`,`BEHAVIOR`,`MANAGE`,`ACCOUNT`,`OPERATIONS`],i=r.filter(t=>!e.includes(t));return i.length===0?{ok:!0,detail:{found:r}}:{ok:!1,reason:`missing groups: ${i.join(`, `)}`}},dev:!0},{name:`examples-coverage`,category:`DISCOVERABILITY`,command:[],assert:()=>({ok:!1,reason:`should run in-process`}),inProcess:async()=>{let{EXAMPLES:e}=await import(`./examples-BtWVpY-G.js`),t=Object.keys(e).length;return t>=25?{ok:!0,detail:{commands:t}}:{ok:!1,reason:`${t} commands have examples (need >= 25)`}},dev:!0},{name:`envelope-shape`,category:`DISCOVERABILITY`,command:[`commands`,`--json`],assert:(e,t,n)=>{if(n!==0)return{ok:!1,reason:`exit ${n}`};let r=u(e);if(!r.ok)return{ok:!1,reason:r.reason};let i=r.value,a=typeof i.version==`string`&&Array.isArray(i.commands);return a?{ok:!0,detail:{commands:i.commands.length}}:{ok:!1,reason:`commands payload missing version+commands`}},dev:!0}],h=m.length;async function g(e){let t=(process.execPath||``).split(`/`).pop()||``,n=/^node(\.exe)?$/i.test(t),r=n?process.argv[1]??process.execPath:process.execPath,i=!!e.full||process.env.ZENOVAY_SELF_TEST_FULL===`1`,a=m.filter(e=>i||!e.dev);e.quick&&(a=a.filter(e=>e.quick));let o=await l(e.cliVersion);return e.json?_({...e,binPath:r,env:o,catalog:a}):b({...e,binPath:r,env:o,catalog:a})}async function _(e){let t=await c(e.catalog,{binPath:e.binPath,quick:e.quick??!1,verbose:e.verbose??!1,parallel:e.parallel,env:e.env,onResult:e=>{let t={type:`self-test.result`,name:e.name,category:e.category,status:e.status,durationMs:e.durationMs,...e.detail?{detail:e.detail}:{},...e.reason?{reason:e.reason}:{},...e.rawStdout?{rawStdout:e.rawStdout}:{},...e.rawStderr?{rawStderr:e.rawStderr}:{}};process.stdout.write(`${JSON.stringify(t)}\n`)}});return process.stdout.write(`${JSON.stringify({type:`self-test.summary`,total:t.total,pass:t.pass,fail:t.fail,skip:t.skip,durationMs:t.durationMs,cliVersion:e.cliVersion,env:e.env})}\n`),t.fail>0?1:0}const v=26,y=8;async function b(e){S(e.cliVersion,e.quick??!1,e.catalog.length);let t=new Map,n=0,r=null,i=new Map;for(let t of e.catalog)i.set(t.category,(i.get(t.category)??0)+1);let a=await c(e.catalog,{binPath:e.binPath,quick:e.quick??!1,verbose:e.verbose??!1,parallel:e.parallel,env:e.env,onResult:a=>{for(t.set(a.name,a);n<e.catalog.length;){let a=e.catalog[n];if(!a)break;let o=t.get(a.name);if(!o)break;r!==a.category&&(C(a.category,i.get(a.category)??0),r=a.category),w(a,o),t.delete(a.name),n+=1}}});return T(a),a.fail>0?1:0}function x(){return Math.max(60,process.stdout.columns??80)}function S(e,n,r){let i=Math.min(120,x()),a=i-2,o=`ZENOVAY · v${e}`,s=`self-test · ${n?`quick`:`full`} · ${r} test${r===1?``:`s`}`,c=`╭─ `+o+` `+`─`.repeat(Math.max(0,a-o.length-4))+`╮`,l=`│ `+s+` `.repeat(Math.max(0,a-s.length-2))+`│`,u=`╰`+`─`.repeat(a)+`╯`;process.stdout.write(t.cyan(c)+`
|
|
5
|
-
`),process.stdout.write(t.cyan(l)+`
|
|
6
|
-
`),process.stdout.write(t.cyan(u)+`
|
|
7
|
-
|
|
8
|
-
`)}function C(e,n){let r=e.padEnd(16,` `),i=`· ${n} test${n===1?``:`s`}`;process.stdout.write(t.bold(r)+t.dim(i)+`
|
|
9
|
-
`)}function w(e,n){let r=n.status===`pass`?t.green(`✓`):n.status===`skip`?t.gray(`○`):t.red(`✗`),i=E(e.name,v),a=n.status===`pass`||n.status===`fail`?`${(n.durationMs/1e3).toFixed(2)}s`:`—`,o=a.padEnd(y,` `),s=A(n),c=n.status===`fail`?``:t.dim(s);process.stdout.write(` ${r} ${i}${o}${c}\n`);let l=j(n);if(l){let e=n.status===`fail`?t.red:t.dim;process.stdout.write(` `+t.dim(`→ `)+e(l)+`
|
|
10
|
-
`)}}function T(e){let n=Math.min(120,x()),r=n-2,i=`${(e.durationMs/1e3).toFixed(1)}s`,a=e.fail===0,o=a?`all checks passed`:`${e.fail} failure${e.fail===1?``:`s`}`,s=a?t.green(o):t.red(o),c=Math.max(0,r-3-o.length),l=t.dim(`╭─ `)+s+t.dim(` `+`─`.repeat(c)+`╮`);process.stdout.write(`
|
|
11
|
-
`+l+`
|
|
12
|
-
`);let u=t.bold(`${e.pass} / ${e.total}`)+t.dim(` pass · `)+(e.fail>0?t.red(`${e.fail} fail`):t.dim(`${e.fail} fail`))+t.dim(` · ${e.skip} skip · ${i}`),d=D(u);process.stdout.write(t.dim(`│ `)+u+` `.repeat(Math.max(0,r-d-2))+t.dim(` │`)+`
|
|
13
|
-
`),process.stdout.write(t.dim(`│`+` `.repeat(r)+`│`)+`
|
|
14
|
-
`);let f=`Run with --json for machine-readable output, --verbose for full traces.`;process.stdout.write(t.dim(`│ `+f+` `.repeat(Math.max(0,r-f.length-4))+` │`)+`
|
|
15
|
-
`),process.stdout.write(t.dim(`╰`+`─`.repeat(r)+`╯`)+`
|
|
16
|
-
`)}function E(e,t){return e.length>t?e.slice(0,t-1)+`…`:e.padEnd(t,` `)}function D(e){return e.replace(/\x1b\[[0-9;]*m/g,``).length}const O=40,k=240;function A(e){if(e.status===`fail`||e.status===`skip`&&!e.detail||!e.detail)return``;let t=Object.entries(e.detail).filter(([,e])=>e!=null);if(t.length===0)return``;let n=t.map(([e,t])=>`${e}=${M(t)}`).join(` `);return n.length>O?n.slice(0,O-1)+`…`:n}function j(e){if(e.status===`fail`){let t=e.reason??`failed`;return t.length>k?t.slice(0,k-1)+`…`:t}return e.status===`skip`&&e.reason?e.reason.length>k?e.reason.slice(0,k-1)+`…`:e.reason:``}function M(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):e===null?`null`:JSON.stringify(e)}export{g as selfTestCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{requireTier as r}from"./tier-BneaO4vD.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-mj0esTrm.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";function C(e){if(!e||e<=0)return`—`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return`${n}m ${(t%60).toString().padStart(2,`0`)}s`}function w(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));return n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:`${Math.floor(n/86400)}d`}async function T(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(a(o)){let e=await u.getSessions(d);return i({type:`sessions.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[T,E]=x(!0),[D,O]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`sessions`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getSessions(t);n||(g(r),E(!1))}catch(e){n||(O(e.message),E(!1))}})(),()=>{n=!0}},[e,t]),T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching sessions…`))));if(D)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:D}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No replays yet`,hint:`Enable session replay in your site settings`}));let k=[{key:`id`,label:`session id`,width:24},{key:`visitor`,label:`visitor`,width:18},{key:`duration`,label:`duration`,align:`right`,width:9,format:e=>C(e)},{key:`startedAt`,label:`when`,align:`right`,width:6,format:e=>w(String(e))},{key:`pageCount`,label:`events`,align:`right`,width:7},{key:`deviceType`,label:`device`,width:8,format:e=>String(e??`—`)}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`sessions · ${n}`}),y.createElement(o,{title:`Recent sessions (${l.length})`},y.createElement(u,{columns:k,data:l,zebra:!0})),y.createElement(m,{marginTop:1},y.createElement(h,{color:`gray`},`Open any session for replay at https://app.zenovay.com/replay`)),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{T as sessionsCommand};
|
package/dist/sources-D0FxjzeB.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as a}from"./resolve-site-mj0esTrm.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-BasvNR-9.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e,t){let n=Math.round(e/100*t);return`█`.repeat(n)+`░`.repeat(Math.max(0,t-n))}function m(e){return e==null?{glyph:`·`,color:`gray`}:e>.5?{glyph:`▲`,color:`green`}:e<-.5?{glyph:`▼`,color:`red`}:{glyph:`→`,color:`gray`}}async function h(h){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:h.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:h.siteId,headless:!!(h.json||h.csv||h.tsv||h.ndjson),cliVersion:h.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(h),S=h.period??`30d`,C=[{key:`source`,label:`source`,width:22},{key:`channel`,label:`channel`,width:10,format:e=>String(e??`—`)},{key:`visitors`,label:`visitors`,width:8,align:`right`},{key:`delta`,label:`Δ`,width:6,align:`right`,format:e=>typeof e==`number`?`${e>0?`+`:``}${(e*100).toFixed(1)}%`:`—`}];return l({cliVersion:h.cliVersion,title:`sources · ${y} · ${S}`,commandName:`sources`,authToken:_?.accessToken??null,refreshIntervalMs:6e4,fetcher:e=>v.getSources(y,S,h.compare,e),format:x,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`sources`,{siteId:y}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
|
-
`);return}process.stdout.write(r(e.sources,[`source`,`channel`,`visitors`,`conversions`,`revenue`,`delta`],t))},panels:[{id:`summary`,title:`Total`,render:e=>f.createElement(d,null,f.createElement(d,{bold:!0},e.totalVisitors.toLocaleString()),` `,f.createElement(d,{color:`gray`},`visitors · `,e.sources.length,` sources`))},{id:`channels`,title:`By channel`,render:e=>{if(e.sources.length===0)return f.createElement(d,{color:`gray`},`— no source data —`);let t=e.totalVisitors||1,n=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return f.createElement(u,{flexDirection:`column`},n.map((e,n)=>{let r=e.visitors/t*100,i=m(e.delta);return f.createElement(u,{key:`${e.source}-${n}`},f.createElement(d,null,f.createElement(d,{color:`cyan`},e.source.padEnd(20).slice(0,20)),` `,f.createElement(d,{color:`magenta`},p(r,30)),` `,f.createElement(d,null,e.visitors.toString().padStart(6),` `),f.createElement(d,{color:`gray`},`(`,r.toFixed(1),`%)`),` `,f.createElement(d,{color:i.color},i.glyph)))}))}},{id:`table`,title:`Detail`,render:e=>e.sources.length===0?f.createElement(d,{color:`gray`},`— —`):f.createElement(o,{data:e.sources.slice(0,20),columns:C,headerStyle:`accent`})}]})}export{h as sourcesCommand};
|
package/dist/stats-DmkvUylD.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as a}from"./resolve-site-mj0esTrm.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-BasvNR-9.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`,ai:{api:g,siteId:_,siteLabel:v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_},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
|
-
`);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};
|
package/dist/themes-Dqt--qhd.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-B_yDcIcn.js";import{Banner as a}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-Cey-h6wI.js";import{promises as o}from"node:fs";import{Box as s,Text as c,render as l}from"ink";import u from"react";const d=[{name:`mocha`,theme:n,mode:`dark`},{name:`latte`,theme:t,mode:`light`},{name:`dracula`,theme:e,mode:`dark`},{name:`tokyoNight`,theme:i,mode:`dark`},{name:`nord`,theme:r,mode:`dark`}],f=[`name`,`bg`,`fg`,`muted`,`accent`,`accent2`,`success`,`warn`,`error`,`border`,`dim`];function p({name:e,theme:t,mode:n}){let r=[t.accent,t.accent2,t.success,t.warn,t.error];return u.createElement(s,{flexDirection:`row`},u.createElement(c,{bold:!0},e.padEnd(14)),u.createElement(c,{color:`gray`},n.padEnd(7)),r.map((e,t)=>u.createElement(c,{key:t,color:e},`████`,` `)),u.createElement(c,{color:`gray`},t.bg))}function m({themes:e}){return u.createElement(s,{flexDirection:`column`},u.createElement(a,{version:`themes`}),u.createElement(s,{marginTop:1,marginBottom:1},u.createElement(c,{color:`gray`},e.length,` themes — pass --theme <name> to any command, or set in your config.`)),u.createElement(s,{flexDirection:`column`},u.createElement(s,null,u.createElement(c,{bold:!0},`name`.padEnd(14)),u.createElement(c,{bold:!0},`mode`.padEnd(7)),u.createElement(c,{bold:!0},`swatch`.padEnd(28)),u.createElement(c,{bold:!0},`bg`)),e.map(({name:e,theme:t,mode:n})=>u.createElement(p,{key:e,name:e,theme:t,mode:n}))))}async function h(e){if(e.validate){let t;try{let n=await o.readFile(e.validate,`utf8`);t=JSON.parse(n)}catch(t){return process.stderr.write(`✗ Failed to read ${e.validate}: ${t.message}\n`),1}let n=f.filter(e=>t[e]==null);return n.length>0?(process.stderr.write(`✗ Missing required tokens: ${n.join(`, `)}\n`),e.json&&process.stdout.write(JSON.stringify({ok:!1,missing:n},null,2)+`
|
|
2
|
-
`),1):(process.stdout.write(`✔ Valid theme (${f.length} tokens present).\n`),e.json&&process.stdout.write(JSON.stringify({ok:!0,theme:t},null,2)+`
|
|
3
|
-
`),0)}if(e.json)return process.stdout.write(JSON.stringify({themes:d.map(({name:e,theme:t,mode:n})=>({name:e,mode:n,background:t.bg,foreground:t.fg,accent:t.accent}))},null,2)+`
|
|
4
|
-
`),0;let{waitUntilExit:t}=l(u.createElement(m,{themes:d}));return await t(),0}export{h as themesCommand};
|
package/dist/ui-Cey-h6wI.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Box as e,Text as t,useInput as n}from"ink";import r,{useMemo as i,useState as a}from"react";import"diff";
|
package/dist/uptime-CNGVODGc.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{requireTier as r}from"./tier-BneaO4vD.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-mj0esTrm.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";function C(e){return e===`up`?{glyph:`● up`,color:`green`}:e===`down`?{glyph:`● down`,color:`red`}:{glyph:`○ unknown`,color:`gray`}}function w(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return`—`;let n=Math.round((t-Date.now())/(1e3*60*60*24));return`${n}d`}async function T(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(a(o)){let e=await u.getUptime(d);return i({type:`uptime.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(E,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const E=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[T,E]=x(!0),[D,O]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`uptime`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getUptime(t);n||(g(r.monitors),E(!1))}catch(e){n||(O(e.message),E(!1))}})(),()=>{n=!0}},[e,t]),T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching monitors…`))));if(D)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:D}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No monitors configured`,hint:`Add one at app.zenovay.com/uptime`}));let k=[{key:`url`,label:`monitor`,width:36},{key:`status`,label:`status`,width:12,format:e=>C(String(e)).glyph},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:7,format:e=>w(e)}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`uptime · ${n}`}),y.createElement(o,{title:`Monitors (${l.length})`},y.createElement(u,{columns:k,data:l,zebra:!0})),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{T as uptimeCommand};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{brailleSpark as a,spark as o}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as s}from"./resolve-site-mj0esTrm.js";import{DataTable as c}from"./data-table-BpbyyNSA.js";import{deepLinkFor as l,openInBrowser as u}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as d}from"./analytical-screen-BasvNR-9.js";import{Box as f,Text as p}from"ink";import m from"react";function h(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}function g(e){let t=e,n=t.events??t.timeseries;return Array.isArray(n)&&n.length>0?o(n,8):`▁▁▁▁▁▁▁▁`}function _(e){let t=e;if(typeof t.sessionDurationSec==`number`)return t.sessionDurationSec;if(typeof t.sessionDurationMs==`number`)return Math.floor(t.sessionDurationMs/1e3);if(typeof t.durationMs==`number`)return Math.floor(t.durationMs/1e3);if(typeof t.duration==`number`)return Math.floor(t.duration/1e3);let n=Date.parse(e.startedAt);return Number.isNaN(n)?0:Math.max(0,Math.floor((Date.now()-n)/1e3))}async function v(o){let v=await e(),y=await t({strict:!1}),b=new n({config:v,cliVersion:o.cliVersion,token:y}),x,S;try{({siteId:x,site:S}=await s(b,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let C=i(o),w=o.limit??50,T=typeof o.minDuration==`number`&&o.minDuration>0?o.minDuration:0,E=e=>T<=0?e:e.filter(e=>_(e)>=T),D=6e4,O=e=>{let t=Date.parse(e.startedAt);return Number.isFinite(t)&&Date.now()-t<D},k=[{key:`startedAt`,label:``,width:5,format:(e,t)=>O(t)?`● new`:``},{key:`startedAt`,label:`when`,width:6,format:e=>h(String(e))},{key:`country`,label:`country`,width:7,format:e=>String(e??`—`)},{key:`city`,label:`city`,width:14,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`page`,label:`page`,width:26,format:e=>String(e??`—`)},{key:`id`,label:`24h`,width:8,format:(e,t)=>g(t)}];return d({cliVersion:o.cliVersion,title:`visitors · ${x}`,commandName:`visitors`,ai:{api:b,siteId:x,siteLabel:S?.url?S.url.replace(/^https?:\/\//,``).replace(/\/$/,``):S?.name??x},authToken:y?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>b.getVisitors(x,{limit:w},e),format:C,keybindings:{o:{label:`open in browser`,handler:()=>{u(l(`visitors`,{siteId:x}))}}},headlessEmit:(e,t)=>{let n={...e,visitors:E(e.visitors)};if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(n,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
|
-
`);return}let i=[`startedAt`,`country`,`city`,`device`,`page`];process.stdout.write(r(n.visitors,i,t))},panels:[{id:`live`,title:`Now`,render:e=>{let t=E(e.visitors),n=[...t].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)),r=n[0],i=Array(24*6).fill(0),o=Date.now();for(let e of t){let t=o-new Date(e.startedAt).getTime(),n=Math.floor(t/(10*60*1e3));n>=0&&n<i.length&&(i[i.length-1-n]+=1)}return m.createElement(f,{flexDirection:`column`},m.createElement(p,{bold:!0},t.length,` live`),m.createElement(p,{color:`gray`},a(i,40)),r?m.createElement(p,{color:`gray`},`top: `,r.city??r.country??`—`,` · `,r.page??`—`):null)}},{id:`visitors`,title:`Active sessions`,render:e=>{let t=E(e.visitors),n=[...t].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)).slice(0,w);return n.length===0?m.createElement(p,{color:`gray`},`— no visitors yet —`):m.createElement(c,{columns:k,data:n,headerStyle:`accent`})}}]})}export{v as visitorsCommand};
|
package/dist/vitals-DmMAuIdP.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as a}from"./resolve-site-mj0esTrm.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-BasvNR-9.js";import{Box as u,Text as d}from"ink";import f from"react";const p={lcp:{good:2500,poor:4e3},inp:{good:200,poor:500},cls:{good:.1,poor:.25},ttfb:{good:800,poor:1800},fcp:{good:1800,poor:3e3}};function m(e,t){let n=p[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function h(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function g(p){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:p.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:p.siteId,headless:!!(p.json||p.csv||p.tsv||p.ndjson),cliVersion:p.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(p),S=[{key:`url`,label:`url`,width:32},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,label:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?h(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return l({cliVersion:p.cliVersion,title:`vitals · ${y}`,commandName:`vitals`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:p.watch?5*6e4:0,fetcher:e=>v.getVitals(y,{url:p.url,device:p.device,window:p.window},e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`vitals`,{siteId:y}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
|
-
`);return}process.stdout.write(r(e.vitals,[`url`,`device`,`samples`],t))},panels:[{id:`summary`,title:`Site-wide p75`,render:e=>{let t=t=>{let n=0,r=0;for(let i of e.vitals){let e=i[t]?.p75;typeof e==`number`&&(n+=e*i.samples,r+=i.samples)}return r>0?n/r:0},n=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return f.createElement(u,{flexDirection:`column`},n.map(e=>{let n=t(e),r=m(e,n);return f.createElement(d,{key:e},f.createElement(d,{color:r.color},`● `),f.createElement(d,{bold:!0},e.toUpperCase().padEnd(5)),` `,f.createElement(d,null,h(e,n).padStart(8)),` `,f.createElement(d,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?f.createElement(d,{color:`gray`},`— no vitals data yet —`):f.createElement(o,{data:e.vitals.slice(0,15),columns:S,headerStyle:`accent`})}]})}export{g as vitalsCommand};
|
package/dist/watch-D5WeMSz2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{spark as l}from"./sparkline-BZ0eMB-w.js";import{resolveSiteId as u}from"./resolve-site-mj0esTrm.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{z as m}from"zod";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useState as S}from"react";import C from"ink-spinner";import w from"ink-text-input";const T=Math.PI*2;function E(e){let t=e,n=Math.PI*Math.sin(e);for(let e=0;e<6;e++){let e=2*t+Math.sin(2*t)-n,r=2+2*Math.cos(2*t);if(r===0)break;t-=e/r}return t}function D(e,t){if(e<-90||e>90||t<-180||t>180)return null;let n=e*Math.PI/180,r=t*Math.PI/180,i=E(n),a=r*Math.cos(i)/Math.PI,o=Math.sin(i);return{x:a,y:o}}function O(e){if(e)return!0;let t=process.env;if(t.NO_COLOR||t.ZENOVAY_GLOBE===`ascii`)return!0;let n=(t.LANG||t.LC_ALL||t.LC_CTYPE||``).toLowerCase();return!!(n&&!n.includes(`utf`))}function k(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function A(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function j(e){let t=e.dw/2,n=e.dh/2,r=e.dw/2-1,i=e.dh/2-1,a=Math.max(e.dw,e.dh)*2;for(let o=0;o<a;o++){let s=o/a*T,c=Math.round(t+r*Math.cos(s)),l=Math.round(n+i*Math.sin(s));A(e,c,l)}}function M(e){let t=Math.floor(e.dh/2);for(let n=0;n<e.dw;n+=4)A(e,n,t)}function N(e,t){let n=e.dw/2,r=e.dh/2,i=e.dw/2-1,a=e.dh/2-1;for(let o of t){let t=D(o.lat,o.lng);if(!t)continue;let s=Math.round(n+t.x*i),c=Math.round(r-t.y*a);A(e,s,c),A(e,s+1,c),A(e,s,c+1),A(e,s+1,c+1)}}const P=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function F(e,t,n){let r=0;for(let i=0;i<P.length;i++){let[a,o]=P[i],s=t*2+a,c=n*4+o;e.bits[c*e.dw+s]&&(r|=1<<i)}return r===0?` `:String.fromCodePoint(10240+r)}function I(e,t,n){let r=0;for(let i=0;i<4;i++)for(let a=0;a<2;a++){let o=t*2+a,s=n*4+i;e.bits[s*e.dw+o]&&r++}return r===0?` `:r<=2?`.`:r<=4?`:`:r<=6?`*`:`#`}function L({data:e,width:t=80,height:n=20,asciiOnly:r}){let i=O(r),a=k(t,n);j(a),M(a),N(a,e);let o=[];for(let e=0;e<n;e++){let n=``;for(let r=0;r<t;r++)n+=i?I(a,r,e):F(a,r,e);o.push(n)}return b.createElement(h,{flexDirection:`column`},o.map((e,t)=>b.createElement(g,{key:t,color:`magenta`},e)),b.createElement(g,{color:`gray`},e.length,` live · `,i?`ascii mode`:`braille mode`))}const R=m.object({siteId:m.string().optional(),window:m.string().optional(),totalVisitors:m.number().optional(),visitors:m.object({count:m.number().optional(),series:m.array(m.number()).optional()}).optional(),topPages:m.array(m.object({path:m.string(),views:m.number().optional(),count:m.number().optional()})).optional(),sources:m.array(m.object({source:m.string(),visitors:m.number()})).optional()}).passthrough();async function z(r){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:r.cliVersion,token:s}),l;try{({siteId:l}=await u(c,{explicit:r.siteId,headless:!!r.json,cliVersion:r.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(a(r)){let e=await c.getDashboardSnapshot(l);return i({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=_(b.createElement(B,{api:c,siteId:l,intervalMs:r.intervalMs??15e3,cliVersion:r.cliVersion,onExit:n=>{t(),e(n)}}))})}const B=({api:e,siteId:t,intervalMs:n,cliVersion:i,onExit:a})=>{let{exit:l}=v(),[u,m]=S(null),[_,w]=S(null),[T,E]=S(null),[D,O]=S([]),[k,A]=S(!0),[j,M]=S(null),[N,P]=S(1),[F,I]=S(!1),[z,B]=S(!1);y((e,n)=>{if(e===`o`||e===`O`){p(f(`watch`,{siteId:t}));return}if(e===`q`){l(),a(0);return}if(e===`?`||e===`/`){B(e=>!e);return}if(e===`g`){I(e=>!e);return}if(n.tab){P(e=>{let t=n.shift?(e+4)%6+1:e%6+1;return t});return}(e===`1`||e===`2`||e===`3`||e===`4`||e===`5`||e===`6`)&&P(Number(e))});let[J,Y]=S(!1);if(x(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=R.safeParse(n);if(!i.success){Y(!0),A(!1);return}Y(!1);let a=i.data,o={visitors:a.visitors??(typeof a.totalVisitors==`number`?{count:a.totalVisitors}:void 0),topPages:a.topPages?.map(e=>({path:e.path,views:e.views??e.count??0})),sources:a.sources};m(o),e.getVitals(t).then(e=>{r||w(e)},()=>{}),e.getGoals(t).then(e=>{r||E(e)},()=>{}),A(!1),M(null)}catch(e){r||M(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),x(()=>{let n=new AbortController;return(async()=>{try{let i=await e.openEventsStream(t,n.signal);for await(let e of r(i))e.type===`error`&&O(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),k)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(o,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:`magenta`},b.createElement(C,{type:`dots`})),b.createElement(g,null,` Fetching snapshot…`))));if(j&&!u)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(o,{title:`Error`,state:`err`},b.createElement(g,{color:`red`},j)));if(J&&!u)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}`}),b.createElement(d,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let X=process.stdout.columns??80,Z=Math.max(20,Math.floor(X/3)-1),Q=[];return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:i,subtitle:`watch · ${t}${F?` · globe`:``}`}),b.createElement(h,{flexDirection:`row`},b.createElement(h,{flexDirection:`column`},F?b.createElement(o,{title:`Live globe`,focused:N===1,width:Z},b.createElement(L,{data:Q,width:Math.max(40,Z-4),height:12})):b.createElement(H,{snapshot:u,focused:N===1,width:Z}),b.createElement(G,{events:D,focused:N===4,width:Z})),b.createElement(h,{flexDirection:`column`},b.createElement(U,{snapshot:u,focused:N===2,width:Z}),b.createElement(K,{vitals:_,focused:N===5,width:Z})),b.createElement(h,{flexDirection:`column`},b.createElement(W,{snapshot:u,focused:N===3,width:Z}),b.createElement(q,{goals:T,focused:N===6,width:Z}))),z?b.createElement(V,{api:e,siteId:t,width:X-2}):null,b.createElement(c,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:F?`panels`:`globe`},{key:`?/`,label:z?`close chat`:`ai chat`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))},V=({api:e,siteId:t,width:n})=>{let[i,a]=S(``),[s,c]=S([]),[l,u]=S(!1),[d,f]=S(``),[p,m]=S(null),_=async n=>{let i=n.trim();if(!i||l)return;m(null),a(``);let o=[...s,{role:`user`,content:i}];c(o),u(!0),f(``);try{let n=o.map(e=>({role:e.role,content:e.content})),i=await e.openAiStream(`chat`,{messages:n,siteId:t},void 0),a=``;for await(let e of r(i))if(e.type===`delta`)a+=e.content,f(a);else if(e.type===`error`)m(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...o,{role:`assistant`,content:a}]),f(``)}catch(e){m(e instanceof Error?e.message:`chat failed`)}finally{u(!1)}};return b.createElement(h,{marginTop:1},b.createElement(o,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},b.createElement(h,{flexDirection:`column`},s.slice(-6).map((e,t)=>b.createElement(h,{key:t,flexDirection:`column`,marginBottom:1},b.createElement(g,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),b.createElement(g,null,e.content))),l&&d?b.createElement(h,{flexDirection:`column`,marginBottom:1},b.createElement(g,{color:`magenta`,bold:!0},`zenovay`),b.createElement(g,null,d)):null,p?b.createElement(g,{color:`red`},`✗ `,p):null,b.createElement(h,null,b.createElement(g,{color:`cyan`},l?`⠋ `:`▸ `),b.createElement(w,{value:i,onChange:a,onSubmit:_,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},H=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return b.createElement(o,{title:`Visitors`,focused:t,width:n},b.createElement(g,{bold:!0},r.toString()),b.createElement(g,{color:`gray`},i.length>0?l(i,Math.max(8,n-6)):`— no data —`))},U=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return b.createElement(o,{title:`Top pages`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.path},b.createElement(g,null,e.path.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.views))))},W=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return b.createElement(o,{title:`Sources`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.source},b.createElement(g,null,e.source.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.visitors))))},G=({events:e,focused:t,width:n})=>b.createElement(o,{title:`Events`,focused:t,width:n},e.length===0?b.createElement(g,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>b.createElement(g,{key:t},e.slice(0,n-4)))),K=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>b.createElement(h,{key:e},b.createElement(g,{bold:!0},e.padEnd(6)),b.createElement(g,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return b.createElement(o,{title:`Vitals`,focused:t,width:n},r(`LCP`,e?.lcpP75,`ms`),r(`INP`,e?.inpP75,`ms`),r(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),r(`TTFB`,e?.ttfbP75,`ms`),r(`FCP`,e?.fcpP75,`ms`))},q=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return b.createElement(o,{title:`Goals`,focused:t,width:n},r.length===0?b.createElement(g,{color:`gray`},`— no data —`):r.map(e=>b.createElement(h,{key:e.name},b.createElement(g,null,e.name.padEnd(n-10).slice(0,n-10)),b.createElement(g,{color:`gray`},` `,e.completions))))};export{z as watchCommand};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{Panel as r}from"./panel-B_yDcIcn.js";import{Banner as i}from"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./sparkline-BZ0eMB-w.js";import"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import"./ui-Cey-h6wI.js";import{Box as a,Text as o,render as s,useApp as c,useInput as l}from"ink";import u,{useEffect as d,useState as f}from"react";async function p(e,t){let n=new TextEncoder,r=await crypto.subtle.importKey(`raw`,n.encode(e),{name:`HMAC`,hash:`SHA-256`},!1,[`sign`]),i=await crypto.subtle.sign(`HMAC`,r,n.encode(t));return Array.from(new Uint8Array(i),e=>e.toString(16).padStart(2,`0`)).join(``)}function m({stats:e}){return u.createElement(r,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},u.createElement(a,{flexDirection:`column`},u.createElement(o,null,u.createElement(o,{color:`gray`},`public URL `),u.createElement(o,{color:`cyan`},e.publicUrl)),u.createElement(o,null,u.createElement(o,{color:`gray`},`→ forwarding to `),u.createElement(o,{color:`magenta`},e.wsUrl)),u.createElement(o,null,e.connected?u.createElement(o,{color:`green`},`● connected`):u.createElement(o,{color:`yellow`},`○ connecting…`),u.createElement(o,{color:`gray`},` · `,e.total,` requests · `,e.ok,` ok · `),u.createElement(o,{color:e.err>0?`red`:`gray`},e.err,` err`),e.lastStatus===null?null:u.createElement(o,{color:`gray`},` · last: HTTP `,e.lastStatus)),e.lastError?u.createElement(o,{color:`red`},`last error: `,e.lastError.slice(0,80)):null))}async function h(r){let h=await e(),g=await t({strict:!1});if(!g?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;let _=r.siteId??g.teamId??``;if(!_)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
|
|
2
|
-
`),2;if(!r.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
|
|
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};
|
|
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
|