@zenovay/cli 1.0.1 → 1.0.2
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-DDefS75j.js → ai-BkP3oeh2.js} +1 -1
- package/dist/{analytical-screen-B4xo6sII.js → analytical-screen-BvQa8oH6.js} +1 -1
- package/dist/analytics-S6AFt20R.js +1 -0
- package/dist/bin.js +5 -5
- package/dist/{companies-BFUFJkEM.js → companies-Cpb3yv2Q.js} +1 -1
- package/dist/{csv-emit-CmlDBfbA.js → csv-emit-B-5km-O-.js} +1 -1
- package/dist/{deploys-DLvmc21H.js → deploys-DZ0IR9Re.js} +1 -1
- package/dist/{devices-BMdSSO0o.js → devices-C_NjBY89.js} +1 -1
- package/dist/{doctor-BI6TF72T.js → doctor-BsEuqZTb.js} +1 -1
- package/dist/{errors-DTs33lNs.js → errors-DPRcy7WT.js} +1 -1
- package/dist/{export-BAFQahzg.js → export-DhSRfpg_.js} +1 -1
- package/dist/{funnel-CnkLL8HX.js → funnel-Cb4-3RJB.js} +1 -1
- package/dist/{geo-B9TL_gUX.js → geo-ReUNKl3F.js} +1 -1
- package/dist/{health-C6ZK4ZDk.js → health-DTR77eQW.js} +1 -1
- package/dist/{heatmaps-BLVXNROm.js → heatmaps-B-As729q.js} +1 -1
- package/dist/{init-CczZwsQf.js → init-igNlvq0N.js} +6 -6
- package/dist/{init-DJbtwhvX.js → init-x1CXZTzr.js} +1 -1
- package/dist/{insights-J4kYprJu.js → insights-BiqMftak.js} +1 -1
- package/dist/{journeys-BRqDOAqs.js → journeys-CogDUObU.js} +1 -1
- package/dist/{live-DJsNJ-fo.js → live-BNX4HBCf.js} +1 -1
- package/dist/{analytics-ZCtpMy4v.js → overview-CmTIumZy.js} +2 -2
- package/dist/overview-L8jqiSuU.js +1 -0
- package/dist/{pages-DXd2DGo6.js → pages-BYVz90uO.js} +1 -1
- package/dist/{projects-CTXvqzN8.js → projects-BdRZaLg8.js} +1 -1
- package/dist/{retention-DWQML_Jo.js → retention-DQHXVSG0.js} +1 -1
- package/dist/{revenue-Dm4wls0K.js → revenue-CitFZ4DN.js} +1 -1
- package/dist/{self-test-CEclBRpu.js → self-test-BcCqMRQ9.js} +1 -1
- package/dist/{sessions-KmEQ4zZp.js → sessions-dPZ32wpz.js} +1 -1
- package/dist/{sources-CJQtexqb.js → sources-lvpcvTTz.js} +1 -1
- package/dist/{stats-ctt0SOlE.js → stats-EeSDu70A.js} +1 -1
- package/dist/{uptime-Dgi5KItw.js → uptime-BA8vRzJQ.js} +1 -1
- package/dist/{visitors-CbU2tXXG.js → visitors-mjvSIKkI.js} +1 -1
- package/dist/{vitals-3NBHzH_m.js → vitals-D3sMQksQ.js} +1 -1
- package/dist/{webhooks-forward-CCd-RyJc.js → webhooks-forward-B8nnKB4f.js} +1 -1
- package/dist/wizard-bin.js +1 -1
- package/package.json +1 -1
- package/dist/watch-GUa_JTOS.js +0 -1
- /package/dist/{annotation-aMzsv1oV.js → annotation-CZ2bEuyD.js} +0 -0
- /package/dist/{api-keys-x_GGL61a.js → api-keys-CLol-4YC.js} +0 -0
- /package/dist/{audit-VHsZwYPM.js → audit-CFlSb0g5.js} +0 -0
- /package/dist/{commands-BE8-kQ9U.js → commands-DVRYYbbn.js} +0 -0
- /package/dist/{completions-suqE20Pu.js → completions-XLznfo7H.js} +0 -0
- /package/dist/{csv-emit-C-9o-imN.js → csv-emit-BiRGo6SK.js} +0 -0
- /package/dist/{domains-CNv8-i1K.js → domains-ByXV1O4R.js} +0 -0
- /package/dist/{events-tail-CzYtpjey.js → events-tail-DEdVkmT0.js} +0 -0
- /package/dist/{examples-DikBW-H2.js → examples-CsQBLv9W.js} +0 -0
- /package/dist/{globe-CnpFQ9iU.js → globe-DwaTDQns.js} +0 -0
- /package/dist/{goals-DQqxuANi.js → goals-Ds0QZ4H6.js} +0 -0
- /package/dist/{health-Cg5Vtq-A.js → health-D6w7hF5q.js} +0 -0
- /package/dist/{home-CcQ7J4RY.js → home-DGYBSPWi.js} +0 -0
- /package/dist/{integrations-C3z-N73K.js → integrations-CCvt4xb_.js} +0 -0
- /package/dist/{logout-u6BpGCg6.js → logout-BoUfEnN9.js} +0 -0
- /package/dist/{notes-sFga-5H5.js → notes-BrY4efpr.js} +0 -0
- /package/dist/{plans-BhicnNJA.js → plans-DT8hilXl.js} +0 -0
- /package/dist/{profile-DsSj1vSw.js → profile-CDY3kFEq.js} +0 -0
- /package/dist/{query-Ds3hjKZ8.js → query-DLC0vi-K.js} +0 -0
- /package/dist/{range-tabs-BbJdVWNV.js → range-tabs-CH2cEXOf.js} +0 -0
- /package/dist/{settings-1kdqZcWp.js → settings-DO8UOasX.js} +0 -0
- /package/dist/{share-BsCpBNTV.js → share-BkvKZuPo.js} +0 -0
- /package/dist/{site-switcher-B2L1-Pjd.js → site-switcher-BAoYWp18.js} +0 -0
- /package/dist/{status-agent-CMpp3zEX.js → status-agent-BLIJc81G.js} +0 -0
- /package/dist/{team-CyzZCg--.js → team-Bw6dcpI2.js} +0 -0
- /package/dist/{teams-DnOLx5tK.js → teams-cwzXaqBH.js} +0 -0
- /package/dist/{telemetry-C-0DECLq.js → telemetry-CgyMy4hV.js} +0 -0
- /package/dist/{themes-6H0KlK3b.js → themes-BC8U4Od4.js} +0 -0
- /package/dist/{tour-fOYY-mK0.js → tour-ChHRo89U.js} +0 -0
- /package/dist/{ui-C5Te-OTJ.js → ui-BTnLAro-.js} +0 -0
- /package/dist/{update-C72vyFU1.js → update-DkMxLJbM.js} +0 -0
- /package/dist/{usage-BOlapdBM.js → usage-CkyXScnm.js} +0 -0
- /package/dist/{use-DBiMOOkB.js → use-BW8rVPgW.js} +0 -0
- /package/dist/{webhooks-CrE9paQf.js → webhooks-D1PNfhgJ.js} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{spark as s}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as c}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./bar-NfgovYHe.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{spark as s}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as c}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./bar-NfgovYHe.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as d}from"./analytical-screen-BvQa8oH6.js";import"./ui-BTnLAro-.js";import{Box as f,Text as p}from"ink";import m from"react";function h(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}`}function g({data:e}){let{theme:t}=o();return m.createElement(f,{flexDirection:`column`},m.createElement(p,null,m.createElement(p,{color:t.accent,bold:!0},h(e.totalAmount,e.currency)),` `,m.createElement(p,{color:t.muted},`total · `,e.totalTransactions,` transactions`)),typeof e.mrr==`number`?m.createElement(p,null,m.createElement(p,{bold:!0},`MRR `),m.createElement(p,{color:t.accent},h(e.mrr,e.currency)),typeof e.arpu==`number`?m.createElement(p,{color:t.muted},` · ARPU `,h(e.arpu,e.currency)):null):null)}function _({data:e}){let{theme:t}=o(),n=e.series.map(e=>e.amount);if(n.length===0)return m.createElement(l,{reason:`no-data`,headline:`No transactions yet`,hint:`Connect a payment provider or widen the window with the 30d / 90d tabs.`});let r=Math.max(...n,1);return m.createElement(f,{flexDirection:`column`},m.createElement(p,{color:t.accent},s(n,Math.min(60,n.length*2))),m.createElement(p,{color:t.muted},`peak: `,h(r,e.currency),` ·`,` `,`avg: `,h(e.totalAmount/Math.max(1,n.length),e.currency)))}function v({data:e}){let{theme:t}=o();return m.createElement(p,{color:t.muted},new Date(e.windowStart).toISOString().slice(0,10),` →`,` `,new Date(e.windowEnd).toISOString().slice(0,10))}async function y(o){let s=await e(),l=await t({strict:!1}),f=new n({config:s,cliVersion:o.cliVersion,token:l}),p,h;try{({siteId:p,site:h}=await c(f,{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 y=i(o),b=o.range??`30d`;return d({cliVersion:o.cliVersion,title:`revenue · ${h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p}`,commandName:`revenue`,ai:{api:f,siteId:p,siteLabel:h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?5*6e4:0,ranges:{windows:[`7d`,`30d`,`90d`]},fetcher:(e,t)=>f.getRevenue(p,t?t===`90d`?`1y`:t:b,e),format:y,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`revenue`,{siteId:p}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}process.stdout.write(r(e.series,[`bucket`,`amount`,`currency`,`transactions`],t))},panels:[{id:`totals`,title:`Top line`,render:e=>m.createElement(g,{data:e})},{id:`series`,title:`Daily`,render:e=>m.createElement(_,{data:e})},{id:`window`,title:`Window`,render:e=>m.createElement(v,{data:e})}]})}export{y as revenueCommand};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import{mocha as e}from"./theme-Brz9wK0w.js";import{spawn as t}from"node:child_process";import n from"chalk";const r=3e4,i=4,a=1e3;function o(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 s(e,n,r,i){return new Promise(a=>{let o=/\.[mc]?js$/.test(e),s=o?`node`:e,c=o?[e,...n]:n,l=t(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 c(e,t){let n=Date.now(),i=o(e,t.env);if(i)return{name:e.name,category:e.category,status:`skip`,durationMs:0,reason:i};if(e.inProcess)try{let t=await e.inProcess(),r=Date.now()-n;return t.ok?{name:e.name,category:e.category,status:`pass`,durationMs:r,...t.detail?{detail:t.detail}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:r,reason:t.reason}}catch(t){return{name:e.name,category:e.category,status:`fail`,durationMs:Date.now()-n,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??r,u=await s(t.binPath,e.command,l,c),d=Date.now()-n;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,a),rawStderr:u.stderr.slice(0,a)}:{}};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,a),rawStderr:u.stderr.slice(0,a)}:{}}}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,a),rawStderr:u.stderr.slice(0,a)}:{}}:{name:e.name,category:e.category,status:`fail`,durationMs:d,reason:f.reason,...t.verbose?{rawStdout:u.stdout.slice(0,a),rawStderr:u.stderr.slice(0,a)}:{}}}async function l(e,t){let n=Date.now(),r=Math.max(1,t.parallel??i),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 s=0,l=[],u=async()=>{for(;;){let n=s;if(s+=1,n>=o.length)return;let r=o[n];if(r===void 0)return;let i=e[r];if(!i)continue;let l=await c(i,t);a[r]=l,t.onResult?.(l)}};for(let e=0;e<r;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 u(e){let t={currentTier:null,hasMultipleTeams:!1,hasFreeTeam:!1,authenticated:!1};try{let{readToken:n}=await import(`./token-store-QTNSg4TT.js`),{readConfig:r}=await import(`./config-B72_Kfe0.js`),{ApiV2Client:i}=await import(`./api-v2-Co0dWAP5.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 d(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
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 f(e,t,n){if(n!==0)return{ok:!1,reason:`exit ${n}`};let r=d(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function p(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=d(e);return r.ok?{ok:!0}:{ok:!1,reason:r.reason}}function m(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 h=[{name:`analytics`,category:`ANALYTICS`,command:[`analytics`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(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:f},{name:`pages`,category:`ANALYTICS`,command:[`pages`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(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:f,quick:!0},{name:`devices`,category:`ANALYTICS`,command:[`devices`,`--json`],assert:f},{name:`geo`,category:`ANALYTICS`,command:[`geo`,`--json`],assert:f},{name:`live`,category:`ANALYTICS`,command:[`live`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(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:f},{name:`funnels`,category:`ANALYTICS`,command:[`funnels`,`--json`],assert:p,requires:{tier:`pro`}},{name:`home`,category:`ANALYTICS`,command:[`home`,`--json`],assert:f},{name:`usage`,category:`ANALYTICS`,command:[`usage`,`--json`],assert:f,quick:!0},{name:`stats`,category:`ANALYTICS`,command:[`stats`,`--json`],assert:f},{name:`retention`,category:`BEHAVIOR`,command:[`retention`,`--json`],assert:p,requires:{tier:`pro`}},{name:`uptime`,category:`BEHAVIOR`,command:[`uptime`,`--json`],assert:p,requires:{tier:`pro`}},{name:`sessions`,category:`BEHAVIOR`,command:[`sessions`,`--json`],assert:p,requires:{tier:`pro`}},{name:`heatmaps`,category:`BEHAVIOR`,command:[`heatmaps`,`--json`],assert:p,requires:{tier:`pro`}},{name:`journeys`,category:`BEHAVIOR`,command:[`journeys`,`--json`],assert:p,requires:{tier:`pro`}},{name:`insights`,category:`INTELLIGENCE`,command:[`insights`,`--json`],assert:p,requires:{tier:`pro`}},{name:`domains list`,category:`MANAGE`,command:[`domains`,`list`,`--json`],assert:(e,t,n)=>{let r=f(e,t,n);if(!r.ok)return r;let i=d(e);return!i.ok||!m(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=f(e,t,n);if(!r.ok)return r;let i=d(e);return!i.ok||!m(i.value)?{ok:!1,reason:`expected list shape`}:{ok:!0}}},{name:`team list`,category:`MANAGE`,command:[`team`,`list`,`--json`],assert:p,requires:{tier:`pro`}},{name:`webhooks list`,category:`MANAGE`,command:[`webhooks`,`list`,`--json`],assert:f},{name:`profile show`,category:`ACCOUNT`,command:[`profile`,`show`,`--json`],assert:f,quick:!0},{name:`plans info`,category:`ACCOUNT`,command:[`plans`,`info`,`--json`],assert:f},{name:`settings get`,category:`ACCOUNT`,command:[`settings`,`get`,`--json`],assert:f},{name:`integrations list`,category:`ACCOUNT`,command:[`integrations`,`list`,`--json`],assert:f},{name:`goals list`,category:`ACCOUNT`,command:[`goals`,`list`,`--json`],assert:p,requires:{tier:`pro`}},{name:`notes list`,category:`ACCOUNT`,command:[`notes`,`list`,`--json`],assert:f},{name:`audit list`,category:`ACCOUNT`,command:[`audit`,`list`,`--json`],assert:p,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:f},{name:`health`,category:`OPERATIONS`,command:[`health`,`--json`],assert:(e,t,n)=>{let r=d(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=f(e,t,n);if(!r.ok)return r;let i=d(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:f},{name:`projects`,category:`OPERATIONS`,command:[`projects`,`--json`],assert:f},{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
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-
|
|
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-CsQBLv9W.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=d(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}],g=h.length,_={accent:n.hex(e.accent),success:n.hex(e.success),error:n.hex(e.error),muted:n.hex(e.muted)};async function v(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=h.filter(e=>i||!e.dev);e.quick&&(a=a.filter(e=>e.quick));let o=await u(e.cliVersion);return e.json?y({...e,binPath:r,env:o,catalog:a}):S({...e,binPath:r,env:o,catalog:a})}async function y(e){let t=await l(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 b=26,x=8;async function S(e){w(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 l(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&&(T(a.category,i.get(a.category)??0),r=a.category),E(a,o),t.delete(a.name),n+=1}}});return D(a),a.fail>0?1:0}function C(){return Math.max(60,process.stdout.columns??80)}function w(e,t,n){let r=Math.min(120,C()),i=r-2,a=`ZENOVAY · v${e}`,o=`self-test · ${t?`quick`:`full`} · ${n} test${n===1?``:`s`}`,s=`╭─ `+a+` `+`─`.repeat(Math.max(0,i-a.length-4))+`╮`,c=`│ `+o+` `.repeat(Math.max(0,i-o.length-2))+`│`,l=`╰`+`─`.repeat(i)+`╯`;process.stdout.write(_.accent(s)+`
|
|
5
5
|
`),process.stdout.write(_.accent(c)+`
|
|
6
6
|
`),process.stdout.write(_.accent(l)+`
|
|
7
7
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{DataTable as f}from"./data-table-BhKjjiOS.js";import{EmptyState as p}from"./empty-state-D-krMX62.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as g}from"./site-switcher-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{DataTable as f}from"./data-table-BhKjjiOS.js";import{EmptyState as p}from"./empty-state-D-krMX62.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as g}from"./site-switcher-BAoYWp18.js";import{Box as _,Text as v,render as y,useApp as b,useInput as x}from"ink";import S,{useEffect as C,useState as w}from"react";import T from"ink-spinner";function E(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 D(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 O(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 l=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await d(l,{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??u;if(a(o)){let e=await l.getSessions(u);return i({type:`sessions.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=y(S.createElement(k,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const k=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:a}=b(),{theme:d}=l(),[y,O]=w(null),[k,A]=w(!0),[j,M]=w(null),[N,P]=w(t),[F,I]=w(n),L=g(e,N,e=>{P(e.id),I(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),O(null)});if(x((e,t)=>{if(L.open){(t.escape||e===`s`)&&L.close();return}if(e===`o`||e===`O`){o(m(`sessions`,{siteId:N}));return}if(e===`s`){L.toggle();return}e===`q`&&(a(),i(0))}),C(()=>{let t=!1;return(async()=>{try{let n=await e.getSessions(N);t||(O(n),A(!1))}catch(e){t||(M(e.message),A(!1))}})(),()=>{t=!0}},[e,N]),k)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(c,{title:`Loading`,state:`busy`},S.createElement(_,null,S.createElement(v,{color:d.accent},S.createElement(T,{type:`dots`})),S.createElement(v,null,` Fetching sessions…`))));if(j)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(p,{reason:`error`,headline:`Failed to load`,hint:j}),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}));if(!y||y.length===0)return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(p,{reason:`no-data`,headline:`No replays yet`,hint:`Enable session replay in your site settings, press [s] to switch site, then revisit your site to capture one.`}),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}));let R=[{key:`id`,label:`session id`,width:24},{key:`visitor`,label:`visitor`,width:18},{key:`duration`,label:`duration`,align:`right`,width:9,format:e=>E(e)},{key:`startedAt`,label:`when`,align:`right`,width:6,format:e=>D(String(e))},{key:`pageCount`,label:`events`,align:`right`,width:7},{key:`deviceType`,label:`device`,width:8,format:e=>String(e??`—`)}],z=process.stdout.rows??40,B=Math.max(4,z-15),V=y.slice(0,B),H=y.length-V.length;return S.createElement(_,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`sessions · ${F}`}),S.createElement(c,{title:`Recent sessions (${y.length})`},S.createElement(f,{columns:R,data:V,zebra:!0}),H>0?S.createElement(v,{color:d.dim},` +${H} more · run with --json for all`):null),S.createElement(_,{marginTop:1},S.createElement(v,{color:d.dim},`Open any session for replay at https://app.zenovay.com/replay`)),L.overlay,S.createElement(u,{items:[{key:`s`,label:`site`},{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}],active:`o`}))};export{O as sessionsCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{Bar as u}from"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{Bar as u}from"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as f}from"./analytical-screen-BvQa8oH6.js";import{Box as p,Text as m}from"ink";import h from"react";function g(e){return e==null?{glyph:`·`,tone:`neutral`}:e>.5?{glyph:`▲`,tone:`up`}:e<-.5?{glyph:`▼`,tone:`down`}:{glyph:`→`,tone:`neutral`}}function _({data:e}){let{theme:t}=o();return h.createElement(m,null,h.createElement(m,{bold:!0},e.totalVisitors.toLocaleString()),` `,h.createElement(m,{color:t.muted},`visitors · `,e.sources.length,` sources`))}function v({data:e}){let{theme:t}=o();if(e.sources.length===0)return h.createElement(l,{reason:`no-data`,headline:`No source data yet`,hint:`Visit your site so referrers can be attributed, or widen the window with the number keys.`});let n={up:t.success,down:t.accent2,neutral:t.muted},r=e.totalVisitors||1,i=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return h.createElement(p,{flexDirection:`column`},i.map((e,i)=>{let a=e.visitors/r*100,o=g(e.delta);return h.createElement(p,{key:`${e.source}-${i}`,flexDirection:`row`},h.createElement(p,{width:20,marginRight:1,flexShrink:0},h.createElement(m,{wrap:`truncate`},e.source)),h.createElement(p,{flexShrink:0},h.createElement(u,{value:e.visitors,max:r,width:30,showPercent:!1,track:!0})),h.createElement(p,{width:7,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.fg},e.visitors.toLocaleString())),h.createElement(p,{width:8,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.muted},a.toFixed(1),`%`)),h.createElement(p,{width:2,marginLeft:1,flexShrink:0},h.createElement(m,{color:n[o.tone]},o.glyph)))}))}function y({data:e,columns:t}){return e.sources.length===0?h.createElement(l,{reason:`no-data`,headline:`No source data yet`,hint:`Visit your site so referrers can be attributed, or widen the window with [1-4].`}):h.createElement(c,{data:e.sources.slice(0,20),columns:t,headerStyle:`accent`})}async function b(o){let c=await e(),l=await t({strict:!1}),u=new n({config:c,cliVersion:o.cliVersion,token:l}),p,m;try{({siteId:p,site:m}=await s(u,{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 g=i(o),b=o.period??`30d`,x=[{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 f({cliVersion:o.cliVersion,title:`sources · ${m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p}`,commandName:`sources`,authToken:l?.accessToken??null,refreshIntervalMs:6e4,ranges:{windows:[`7d`,`30d`,`90d`]},fetcher:(e,t)=>u.getSources(p,t&&t!==`24h`?t:b,o.compare,e),format:g,ai:{api:u,siteId:p,siteLabel:m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p},keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`sources`,{siteId:p}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}process.stdout.write(r(e.sources,[`source`,`channel`,`visitors`,`conversions`,`revenue`,`delta`],t))},panels:[{id:`summary`,title:`Total`,render:e=>h.createElement(_,{data:e})},{id:`channels`,title:`By channel`,render:e=>h.createElement(v,{data:e})},{id:`table`,title:`Detail`,render:e=>h.createElement(y,{data:e,columns:x})}]})}export{b as sourcesCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as a}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as o}from"./resolve-site-BTVBMF1C.js";import{DataTable as s}from"./data-table-BhKjjiOS.js";import{EmptyState as c}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as a}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as o}from"./resolve-site-BTVBMF1C.js";import{DataTable as s}from"./data-table-BhKjjiOS.js";import{EmptyState as c}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as l}from"./analytical-screen-BvQa8oH6.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e){return`${(e*100).toFixed(1)}%`}function m(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`}const h=({data:e})=>{let{theme:t}=a();return f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{bold:!0},e.visitors.toLocaleString()),f.createElement(d,{color:t.muted},` visitors `),f.createElement(d,{bold:!0},e.pageviews.toLocaleString()),f.createElement(d,{color:t.muted},` pageviews `),f.createElement(d,{bold:!0},e.sessions.toLocaleString()),f.createElement(d,{color:t.muted},` sessions`)),f.createElement(d,{color:t.muted},`bounce `,p(e.bounceRate),` · avg session `,m(e.avgSessionSec)))};async function g(a){let u=await e(),d=await t({strict:!1}),g=new n({config:u,cliVersion:a.cliVersion,token:d}),_,v;try{({siteId:_,site:v}=await o(g,{explicit:a.siteId,headless:!!(a.json||a.csv||a.tsv||a.ndjson),cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let y=i(a),b=a.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 l({cliVersion:a.cliVersion,title:`stats · ${v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_}`,commandName:`stats`,ranges:{windows:[`24h`,`7d`,`30d`]},ai:{api:g,siteId:_,siteLabel:v?.url?v.url.replace(/^https?:\/\//,``).replace(/\/$/,``):v?.name??_},authToken:d?.accessToken??null,refreshIntervalMs:a.watch?6e4:0,fetcher:(e,t)=>g.getStats(_,t??b,e),format:y,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}process.stdout.write(r([{range:b,visitors:e.visitors,pageviews:e.pageviews,sessions:e.sessions,bounceRate:p(e.bounceRate),avgSession:m(e.avgSessionSec)}],[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSession`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>f.createElement(h,{data:e})},{id:`pages`,title:`Top pages`,render:e=>e.topPages.length===0?f.createElement(c,{reason:`no-data`,headline:`No pages yet`,hint:`No page views in the ${b} window.`}):f.createElement(s,{data:e.topPages.slice(0,10),columns:x,headerStyle:`accent`})},{id:`countries`,title:`Top countries`,render:e=>e.topCountries.length===0?f.createElement(c,{reason:`no-data`,headline:`No country data yet`,hint:`No located visitors in the ${b} window.`}):f.createElement(s,{data:e.topCountries.slice(0,10),columns:S,headerStyle:`accent`})}]})}export{g as statsCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{stripUrlPrefix as f}from"./fmt-xxIPQJX-.js";import{DataTable as p}from"./data-table-BhKjjiOS.js";import{EmptyState as m}from"./empty-state-D-krMX62.js";import{deepLinkFor as h}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as g}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as _}from"./site-switcher-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{requireTier as r}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";import{openInBrowser as o}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{resolveSiteId as d}from"./resolve-site-BTVBMF1C.js";import{stripUrlPrefix as f}from"./fmt-xxIPQJX-.js";import{DataTable as p}from"./data-table-BhKjjiOS.js";import{EmptyState as m}from"./empty-state-D-krMX62.js";import{deepLinkFor as h}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as g}from"./use-fullscreen-ucSyZkjO.js";import{useSiteSwitcher as _}from"./site-switcher-BAoYWp18.js";import{Box as v,Text as y,render as b,useApp as x,useInput as S}from"ink";import C,{useEffect as w,useState as T}from"react";import E from"ink-spinner";function D(e){return e===`up`?`● up`:e===`down`?`● down`:`○ unknown`}function O(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`}function k(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function A(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 l=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(l,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let u,f;try{({siteId:u,site:f}=await d(l,{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??u;if(a(o)){let e=await l.getUptime(u);return i({type:`uptime.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=b(C.createElement(j,{api:l,siteId:u,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const j=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{g();let{exit:a}=x(),{theme:d}=l(),[b,A]=T(null),[j,M]=T(!0),[N,P]=T(null),[ee,F]=T(0),[I,L]=T(!1),[R,z]=T(null),[B,V]=T(()=>Date.now()),[H,U]=T(t),[W,G]=T(n),K=_(e,H,e=>{U(e.id),G(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),A(null)}),q=[{key:`r`,label:`refresh`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}];if(S((e,t)=>{if(K.open){(t.escape||e===`s`)&&K.close();return}if(e===`r`||e===`R`){F(e=>e+1);return}if(e===`s`){K.toggle();return}if(e===`o`||e===`O`){o(h(`uptime`,{siteId:H}));return}e===`q`&&(a(),i(0))}),w(()=>{let e=setInterval(()=>V(Date.now()),5e3),t=setInterval(()=>F(e=>e+1),3e4);return()=>{clearInterval(e),clearInterval(t)}},[]),w(()=>{let t=!1;return b===null?M(!0):L(!0),(async()=>{try{let n=await e.getUptime(H);if(t)return;A(n.monitors),M(!1),L(!1),z(Date.now())}catch(e){t||(P(e.message),M(!1),L(!1))}})(),()=>{t=!0}},[e,H,ee]),j)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(c,{title:`Loading`,state:`busy`},C.createElement(v,null,C.createElement(y,{color:d.accent},C.createElement(E,{type:`dots`})),C.createElement(y,null,` Fetching monitors…`))));if(N)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(m,{reason:`error`,headline:`Couldn't load monitors`,hint:N}),C.createElement(u,{items:q,active:`r`}));if(!b||b.length===0)return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!1}),C.createElement(m,{reason:`no-data`,headline:`No monitors configured`,hint:`Add an uptime monitor at app.zenovay.com/uptime, press [s] to switch site, then re-run.`}),K.overlay,C.createElement(u,{items:q,active:`r`}));let J=[{key:`url`,label:`monitor`,width:36,format:e=>f(String(e??``))},{key:`status`,label:`status`,width:11,format:e=>D(String(e))},{key:`p95ms`,label:`p95 ms`,align:`right`,width:8,format:e=>typeof e==`number`?String(e):`—`},{key:`sslExpiry`,label:`ssl exp`,align:`right`,width:8,format:e=>O(e)}],Y=process.stdout.rows??40,X=Math.max(4,Y-16),Z=b.slice(0,X),Q=b.length-Z.length,$=b.filter(e=>e.status===`down`).length,te=b.filter(e=>e.status===`up`).length;return C.createElement(v,{flexDirection:`column`},C.createElement(s,{version:r,subtitle:`uptime · ${W}`,live:!0}),C.createElement(v,{marginTop:1,flexDirection:`row`},C.createElement(y,{color:d.success},te,` up`),C.createElement(y,{color:d.dim},` · `),C.createElement(y,{color:$>0?d.error:d.dim},$,` down`)),C.createElement(v,{marginTop:1},C.createElement(c,{title:`Monitors (${b.length})`},C.createElement(p,{columns:J,data:Z,zebra:!0}),Q>0?C.createElement(y,{color:d.dim},` +${Q} more · run with --json for all`):null)),C.createElement(v,{marginTop:1},C.createElement(y,{color:d.dim},I?`↻ refreshing…`:R===null?``:`↻ updated ${k(R,B)} · [r] refresh`)),K.overlay,C.createElement(u,{items:q,active:`r`}))};export{A as uptimeCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{brailleSpark as s,spark as c}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as l}from"./resolve-site-BTVBMF1C.js";import{DataTable as u}from"./data-table-BhKjjiOS.js";import{EmptyState as d}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as f}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{brailleSpark as s,spark as c}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as l}from"./resolve-site-BTVBMF1C.js";import{DataTable as u}from"./data-table-BhKjjiOS.js";import{EmptyState as d}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as f}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as p}from"./analytical-screen-BvQa8oH6.js";import{Box as m,Text as h}from"ink";import g from"react";function _(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 v(e){let t=e,n=t.events??t.timeseries;return Array.isArray(n)&&n.length>0?c(n,8):`▁▁▁▁▁▁▁▁`}function y(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 b(o){let s=await e(),c=await t({strict:!1}),u=new n({config:s,cliVersion:o.cliVersion,token:c}),d,m;try{({siteId:d,site:m}=await l(u,{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 h=m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??d,b=i(o),C=o.limit??50,w=typeof o.minDuration==`number`&&o.minDuration>0?o.minDuration:0,T=e=>w<=0?e:e.filter(e=>y(e)>=w),E=6e4,D=e=>{let t=Date.parse(e.startedAt);return Number.isFinite(t)&&Date.now()-t<E},O=[{key:`startedAt`,label:``,width:5,format:(e,t)=>D(t)?`● new`:``},{key:`startedAt`,label:`when`,width:6,format:e=>_(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)=>v(t)}];return p({cliVersion:o.cliVersion,title:`visitors · ${h}`,commandName:`visitors`,ai:{api:u,siteId:d,siteLabel:h},authToken:c?.accessToken??null,refreshIntervalMs:1e4,fetcher:e=>u.getVisitors(d,{limit:C},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(f(`visitors`,{siteId:d}))}}},headlessEmit:(e,t)=>{let n={...e,visitors:T(e.visitors)};if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(n,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}let i=[`startedAt`,`country`,`city`,`device`,`page`];process.stdout.write(r(n.visitors,i,t))},panels:[{id:`live`,title:`Now`,render:e=>g.createElement(x,{visitors:T(e.visitors)})},{id:`visitors`,title:`Active sessions`,render:e=>g.createElement(S,{visitors:T(e.visitors),limit:C,columns:O})}]})}const x=({visitors:e})=>{let{theme:t}=o(),n=[...e].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)),r=n[0],i=Array(24*6).fill(0),a=Date.now();for(let t of e){let e=a-new Date(t.startedAt).getTime(),n=Math.floor(e/(10*60*1e3));n>=0&&n<i.length&&(i[i.length-1-n]+=1)}return g.createElement(m,{flexDirection:`column`},g.createElement(h,{bold:!0},e.length,` live`),g.createElement(h,{color:t.muted},s(i,40)),r?g.createElement(h,{color:t.muted},`top: `,r.city??r.country??`—`,` · `,r.page??`—`):null)},S=({visitors:e,limit:t,columns:n})=>{let r=[...e].sort((e,t)=>Date.parse(t.startedAt)-Date.parse(e.startedAt)).slice(0,t);return r.length===0?g.createElement(d,{reason:`no-data`,headline:`No active sessions yet`,hint:`Visitors appear here as they browse — this view polls every 10s.`}):g.createElement(u,{columns:n,data:r,headerStyle:`accent`})};export{b as visitorsCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-CH2cEXOf.js";import{runAnalyticalScreen as d}from"./analytical-screen-BvQa8oH6.js";import{Box as f,Text as p}from"ink";import m from"react";const h={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 g(e,t){let n=h[e];return t<=n.good?{label:`good`,tone:`good`}:t<=n.poor?{label:`needs`,tone:`needs`}:{label:`poor`,tone:`poor`}}function _(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function v({data:e}){let{theme:t}=o(),n={good:t.success,needs:t.warn,poor:t.error},r=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},i=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return m.createElement(f,{flexDirection:`column`},i.map(e=>{let t=r(e),i=g(e,t);return m.createElement(p,{key:e},m.createElement(p,{color:n[i.tone]},`● `),m.createElement(p,{bold:!0},e.toUpperCase().padEnd(5)),` `,m.createElement(p,null,_(e,t).padStart(8)),` `,m.createElement(p,{color:n[i.tone]},i.label))}))}function y({data:e,columns:t}){return e.vitals.length===0?m.createElement(l,{reason:`no-data`,headline:`No vitals data yet`,hint:`Core Web Vitals appear once real visitors load instrumented pages.`}):m.createElement(c,{data:e.vitals.slice(0,15),columns:t,headerStyle:`accent`})}async function b(o){let c=await e(),l=await t({strict:!1}),f=new n({config:c,cliVersion:o.cliVersion,token:l}),p,h;try{({siteId:p,site:h}=await s(f,{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 g=i(o),b=[{key:`url`,label:`url`,width:32},{key:`device`,label:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,label:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?_(`lcp`,e.p75):`—`},{key:`inp`,label:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?_(`inp`,e.p75):`—`},{key:`cls`,label:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?_(`cls`,e.p75):`—`},{key:`samples`,label:`n`,width:6,align:`right`}];return d({cliVersion:o.cliVersion,title:`vitals · ${h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p}`,commandName:`vitals`,ai:{api:f,siteId:p,siteLabel:h?.url?h.url.replace(/^https?:\/\//,``).replace(/\/$/,``):h?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?5*6e4:0,ranges:!0,fetcher:(e,t)=>f.getVitals(p,{url:o.url,device:o.device,window:t??o.window},e),format:g,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`vitals`,{siteId:p}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
|
|
2
2
|
`);return}process.stdout.write(r(e.vitals,[`url`,`device`,`samples`],t))},panels:[{id:`summary`,title:`Site-wide p75`,render:e=>m.createElement(v,{data:e})},{id:`pages`,title:`Per-page`,render:e=>m.createElement(y,{data:e,columns:b})}]})}export{b as vitalsCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./theme-Brz9wK0w.js";import{Banner as r,Panel as i,useTheme as a}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import{Keybar as o}from"./keybar-DO5OoZy9.js";import"./sparkline-CpoBjjlc.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import"./bar-NfgovYHe.js";import"./ui-
|
|
1
|
+
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./theme-Brz9wK0w.js";import{Banner as r,Panel as i,useTheme as a}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import{Keybar as o}from"./keybar-DO5OoZy9.js";import"./sparkline-CpoBjjlc.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import"./data-table-BhKjjiOS.js";import"./bar-NfgovYHe.js";import"./ui-BTnLAro-.js";import{Box as c,Text as l,render as u,useApp as d,useInput as f}from"ink";import p,{useEffect as m,useState as h}from"react";function g(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}async function _(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 v({label:e,value:t,valueColor:n}){let{theme:r}=a();return p.createElement(c,{flexDirection:`row`},p.createElement(c,{width:14},p.createElement(l,{color:r.dim},e.toUpperCase())),p.createElement(c,{flexGrow:1},p.createElement(l,{color:n??r.fg,wrap:`truncate`},t)))}function y({stats:e,target:t}){let{theme:n}=a();return p.createElement(i,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},p.createElement(v,{label:`public url`,value:e.publicUrl,valueColor:n.accent}),p.createElement(v,{label:`forwarding to`,value:t}),p.createElement(c,{flexDirection:`row`,marginTop:1},e.connected?p.createElement(l,{color:n.success},`● connected`):p.createElement(l,{color:n.warn},`○ connecting…`),p.createElement(l,{color:n.muted},` · `,e.total,` requests · `),p.createElement(l,{color:n.success},e.ok,` ok`),p.createElement(l,{color:n.muted},` · `),p.createElement(l,{color:e.err>0?n.error:n.muted},e.err,` err`),e.lastStatus===null?null:p.createElement(l,{color:n.muted},` · last HTTP `,e.lastStatus)),e.lastError?p.createElement(c,{flexDirection:`row`},p.createElement(l,{color:n.error,wrap:`truncate`},`last error: `,e.lastError)):null)}async function b(i){let v=await e(),b=await t({strict:!1});if(!b?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;if(!i.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
|
|
2
2
|
`),2;let x=i.to.match(/^https?:\/\//)?i.to:`http://${i.to}`,S=new n({config:v,cliVersion:i.cliVersion,token:b}),C,w;try{({siteId:C,site:w}=await s(S,{explicit:i.siteId,headless:!1,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let T=w?.url?w.url.replace(/^https?:\/\//,``).replace(/\/$/,``):w?.name??C,E;try{E=await S.createTunnel(C,i.to)}catch(e){return process.stderr.write(`Failed to register tunnel: ${e.message}\n`),1}let D=i.sign?i.secret??E.tunnelKey:null,O=()=>{let{theme:e}=a(),{exit:t}=d(),[n,s]=h({total:0,ok:0,err:0,lastStatus:null,lastError:null,lastForwardedAt:null,publicUrl:E.publicUrl,wsUrl:E.wsUrl,connected:!1}),[u,v]=h(()=>Date.now());m(()=>{let e=setInterval(()=>v(Date.now()),5e3);return()=>clearInterval(e)},[]),f((e,n)=>{(e===`q`||n.escape)&&t()}),m(()=>{let e=new AbortController,t=async e=>{try{let t={...e.headers};delete t.host,delete t[`content-length`],D&&(t[`X-Zenovay-Signature`]=`sha256=${await _(D,e.body)}`);let n=await fetch(x,{method:e.method,headers:t,body:e.method===`GET`||e.method===`HEAD`?void 0:e.body}),r=await n.text(),i={};return n.headers.forEach((e,t)=>{i[t]=e}),s(e=>({...e,total:e.total+1,ok:e.ok+(n.ok?1:0),err:e.err+(n.ok?0:1),lastStatus:n.status,lastError:n.ok?null:`HTTP ${n.status}`,lastForwardedAt:Date.now()})),{status:n.status,headers:i,body:r}}catch(e){let t=e instanceof Error?e.message:String(e);return s(e=>({...e,total:e.total+1,err:e.err+1,lastError:t,lastForwardedAt:Date.now()})),{status:502,body:JSON.stringify({error:`cli_local_failed`,detail:t})}}};return(async()=>{let n=S.tunnelClient(E.wsUrl);s(e=>({...e,connected:!0}));try{await n.start(t,e.signal)}catch(e){s(t=>({...t,connected:!1,lastError:e.message}))}})(),()=>{e.abort()}},[]);let b=n.lastForwardedAt===null?n.connected?`↻ live · waiting for first webhook`:`↻ connecting…`:`↻ last forward ${g(n.lastForwardedAt,u)}`;return p.createElement(c,{flexDirection:`column`},p.createElement(r,{version:i.cliVersion,subtitle:`webhooks forward · ${T} · ${n.connected?`live`:`connecting`}`,live:n.connected}),p.createElement(y,{stats:n,target:`${x}${i.sign?` · HMAC-signed`:``}`}),p.createElement(c,{marginTop:1},p.createElement(l,{color:e.dim},b)),p.createElement(o,{items:[{key:`q`,label:`quit`},{key:`esc`,label:`quit`}]}))},{waitUntilExit:k}=u(p.createElement(O,null));return await k(),0}export{b as webhooksForwardCommand};
|
package/dist/wizard-bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import(`./init-
|
|
2
|
+
import(`./init-x1CXZTzr.js`).then(async({initCommand:e})=>{let{readFileSync:t}=await import(`node:fs`),n=await import(`node:path`),{fileURLToPath:r}=await import(`node:url`),i=n.dirname(r(import.meta.url)),a=JSON.parse(t(n.join(i,`..`,`package.json`),`utf8`)),o=process.argv.slice(2),s=o.includes(`--json`),c=o.includes(`--yes`),l=o.includes(`--skip-mcp`),u=o.includes(`--skip-verify`),d=await e({cliVersion:a.version,cwd:process.cwd(),json:s,yes:c,skipMcp:l,skipVerify:u});process.exit(d)});
|
package/package.json
CHANGED
package/dist/watch-GUa_JTOS.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import{parseSseStream as o}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{Banner as s,Panel as c,useTheme as l}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{spark as d}from"./sparkline-CpoBjjlc.js";import{resolveSiteId as f}from"./resolve-site-BTVBMF1C.js";import{stripUrlPrefix as p}from"./fmt-xxIPQJX-.js";import{EmptyState as m}from"./empty-state-D-krMX62.js";import{tileWidths as h}from"./grid-CMwhs-Ms.js";import{deepLinkFor as g}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as _}from"./use-fullscreen-ucSyZkjO.js";import{z as v}from"zod";import{Box as y,Text as b,render as x,useApp as ee,useInput as te}from"ink";import S,{useEffect as C,useState as w}from"react";import ne from"ink-spinner";import T from"ink-text-input";const E=Math.PI*2;function D(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 O(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=D(n),a=r*Math.cos(i)/Math.PI,o=Math.sin(i);return{x:a,y:o}}function k(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 A(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function j(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function M(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*E,c=Math.round(t+r*Math.cos(s)),l=Math.round(n+i*Math.sin(s));j(e,c,l)}}function N(e){let t=Math.floor(e.dh/2);for(let n=0;n<e.dw;n+=4)j(e,n,t)}function P(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=O(o.lat,o.lng);if(!t)continue;let s=Math.round(n+t.x*i),c=Math.round(r-t.y*a);j(e,s,c),j(e,s+1,c),j(e,s,c+1),j(e,s+1,c+1)}}const F=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function I(e,t,n){let r=0;for(let i=0;i<F.length;i++){let[a,o]=F[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 L(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 re({data:e,width:t=80,height:n=20,asciiOnly:r}){let{theme:i}=l(),a=k(r),o=A(t,n);M(o),N(o),P(o,e);let s=[];for(let e=0;e<n;e++){let n=``;for(let r=0;r<t;r++)n+=a?L(o,r,e):I(o,r,e);s.push(n)}return S.createElement(y,{flexDirection:`column`},s.map((e,t)=>S.createElement(b,{key:t,color:i.accent},e)),S.createElement(b,{color:i.muted},e.length,` live · `,a?`ascii mode`:`braille mode`))}function ie(e,t){let n=Math.max(0,Math.round((t-e)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}const ae=v.object({siteId:v.string().optional(),window:v.string().optional(),totalVisitors:v.number().optional(),visitors:v.object({count:v.number().optional(),series:v.array(v.number()).optional()}).optional(),topPages:v.array(v.object({path:v.string(),views:v.number().optional(),count:v.number().optional()})).optional(),sources:v.array(v.object({source:v.string(),visitors:v.number()})).optional()}).passthrough();async function R(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:a.cliVersion,token:s}),l;try{({siteId:l}=await f(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}if(i(a)){let e=await c.getDashboardSnapshot(l);return r({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=x(S.createElement(z,{api:c,siteId:l,intervalMs:a.intervalMs??15e3,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const z=({api:e,siteId:t,intervalMs:n,cliVersion:r,onExit:i})=>{_();let{theme:d}=l(),{exit:f}=ee(),[p,v]=w(null),[x,T]=w(null),[E,D]=w(null),[O,k]=w([]),[A,j]=w(!0),[M,N]=w(null),[P,F]=w(1),[I,L]=w(!1),[R,z]=w(!1),[B,W]=w(null),[ue,de]=w(()=>Date.now());te((e,n)=>{if(e===`o`||e===`O`){a(g(`watch`,{siteId:t}));return}if(e===`q`){f(),i(0);return}if(e===`?`||e===`/`){z(e=>!e);return}if(e===`g`){L(e=>!e);return}if(n.tab){F(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`)&&F(Number(e))});let[fe,G]=w(!1);if(C(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;let i=ae.safeParse(n);if(!i.success){G(!0),j(!1);return}G(!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};v(o),e.getVitals(t).then(e=>{r||T(e)},()=>{}),e.getGoals(t).then(e=>{r||D(e)},()=>{}),j(!1),N(null),W(Date.now())}catch(e){r||N(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),C(()=>{if(R)return;let e=setInterval(()=>de(Date.now()),5e3);return()=>clearInterval(e)},[R]),C(()=>{let n=new AbortController;return(async()=>{try{let r=await e.openEventsStream(t,n.signal);for await(let e of o(r))e.type===`error`&&k(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),A)return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}`,live:!1}),S.createElement(c,{title:`Loading`,state:`busy`},S.createElement(y,null,S.createElement(b,{color:d.accent},S.createElement(ne,{type:`dots`})),S.createElement(b,null,` Fetching snapshot…`))));if(M&&!p)return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}`,live:!1}),S.createElement(m,{reason:`error`,headline:`Failed to load`,hint:M}));if(fe&&!p)return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}`,live:!1}),S.createElement(m,{reason:`error`,headline:`Couldn't load dashboard`,hint:"The server returned an unexpected shape. Try `zenovay update` to refresh the CLI."}));let K=process.stdout.columns??80,q=2,J=h(K,3,q),[Y,X,Z]=[J[0]??20,J[1]??20,J[2]??20],Q=process.stdout.rows??40,pe=Math.max(4,Q-16),$=Math.max(2,Math.min(8,Math.floor(pe/2))),me=[],he=(p?.visitors?.count??0)>0||(p?.topPages?.length??0)>0||(p?.sources?.length??0)>0;return S.createElement(y,{flexDirection:`column`},S.createElement(s,{version:r,subtitle:`watch · ${t}${I?` · globe`:``}`,live:he}),S.createElement(y,{flexDirection:`row`,width:K},S.createElement(y,{flexDirection:`column`,flexShrink:0,width:Y,marginRight:q},I?S.createElement(c,{title:`Live globe`,focused:P===1,width:Y},S.createElement(re,{data:me,width:Math.max(8,Y-4),height:Math.max(8,Math.min(12,$*2))})):S.createElement(se,{snapshot:p,focused:P===1,width:Y}),S.createElement(V,{events:O,focused:P===4,width:Y,rows:$})),S.createElement(y,{flexDirection:`column`,flexShrink:0,width:X,marginRight:q},S.createElement(ce,{snapshot:p,focused:P===2,width:X,rows:$}),S.createElement(H,{vitals:x,focused:P===5,width:X})),S.createElement(y,{flexDirection:`column`,flexShrink:0,width:Z},S.createElement(le,{snapshot:p,focused:P===3,width:Z,rows:$}),S.createElement(U,{goals:E,focused:P===6,width:Z,rows:$}))),R?S.createElement(oe,{api:e,siteId:t,width:K}):null,S.createElement(y,{marginTop:1},S.createElement(b,{color:d.dim},B===null?``:`↻ updated ${ie(B,ue)}`,` · watch is deprecated — use `,S.createElement(b,{color:d.accent},`zenovay overview`))),S.createElement(u,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:I?`panels`:`globe`},{key:`?/`,label:R?`close chat`:`ai chat`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}]}))},oe=({api:e,siteId:t,width:n})=>{let{theme:r}=l(),[i,a]=w(``),[s,u]=w([]),[d,f]=w(!1),[p,m]=w(``),[h,g]=w(null),_=async n=>{let r=n.trim();if(!r||d)return;g(null),a(``);let i=[...s,{role:`user`,content:r}];u(i),f(!0),m(``);try{let n=i.map(e=>({role:e.role,content:e.content})),r=await e.openAiStream(`chat`,{messages:n,siteId:t},void 0),a=``;for await(let e of o(r))if(e.type===`delta`)a+=e.content,m(a);else if(e.type===`error`)g(`${e.code}: ${e.message}`);else if(e.type===`done`)break;u([...i,{role:`assistant`,content:a}]),m(``)}catch(e){g(e instanceof Error?e.message:`chat failed`)}finally{f(!1)}};return S.createElement(y,{marginTop:1},S.createElement(c,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},S.createElement(y,{flexDirection:`column`},s.slice(-6).map((e,t)=>S.createElement(y,{key:t,flexDirection:`column`,marginBottom:1},S.createElement(b,{color:e.role===`user`?r.accent:r.info,bold:!0},e.role===`user`?`you`:`zenovay`),S.createElement(b,null,e.content))),d&&p?S.createElement(y,{flexDirection:`column`,marginBottom:1},S.createElement(b,{color:r.info,bold:!0},`zenovay`),S.createElement(b,null,p)):null,h?S.createElement(b,{color:r.error},`✗ `,h):null,S.createElement(y,null,S.createElement(b,{color:r.accent},d?`⠋ `:`▸ `),S.createElement(T,{value:i,onChange:a,onSubmit:_,placeholder:d?`streaming…`:`ask anything about your analytics`})))))},B=({label:e,value:t})=>{let{theme:n}=l();return S.createElement(y,{flexDirection:`row`},S.createElement(y,{flexGrow:1,flexShrink:1,marginRight:1},S.createElement(b,{wrap:`truncate`},e)),S.createElement(y,{width:t.length,flexShrink:0},S.createElement(b,{color:n.fg},t)))},se=({snapshot:e,focused:t,width:n})=>{let{theme:r}=l(),i=e?.visitors?.count??0,a=e?.visitors?.series??[];return S.createElement(c,{title:`Visitors`,focused:t,width:n},S.createElement(b,{color:r.typography.headline.color,bold:r.typography.headline.bold},i.toLocaleString()),a.length>0?S.createElement(b,{color:r.accent},d(a,Math.max(8,n-6))):S.createElement(b,{color:r.dim},`no data yet`))},ce=({snapshot:e,focused:t,width:n,rows:r=5})=>{let i=e?.topPages??[],a=i.slice(0,r),o=i.length-a.length;return S.createElement(c,{title:`Top pages`,focused:t,width:n},i.length===0?S.createElement(m,{reason:`no-data`,headline:`No pages yet`}):S.createElement(S.Fragment,null,a.map(e=>S.createElement(B,{key:e.path,label:p(e.path),value:(e.views??0).toLocaleString()})),o>0?S.createElement(W,{count:o}):null))},le=({snapshot:e,focused:t,width:n,rows:r=5})=>{let i=e?.sources??[],a=i.slice(0,r),o=i.length-a.length;return S.createElement(c,{title:`Sources`,focused:t,width:n},i.length===0?S.createElement(m,{reason:`no-data`,headline:`No sources yet`}):S.createElement(S.Fragment,null,a.map(e=>S.createElement(B,{key:e.source,label:e.source,value:e.visitors.toLocaleString()})),o>0?S.createElement(W,{count:o}):null))},V=({events:e,focused:t,width:n,rows:r=5})=>{let{theme:i}=l(),a=e.slice(-r);return S.createElement(c,{title:`Errors`,focused:t,width:n},e.length===0?S.createElement(b,{color:i.dim},`no errors — stream healthy`):a.map((e,t)=>S.createElement(b,{key:t,wrap:`truncate`},e)))},H=({vitals:e,focused:t,width:n})=>{let{theme:r}=l(),i=(e,t,n)=>S.createElement(y,{key:e,flexDirection:`row`},S.createElement(y,{width:6},S.createElement(b,{color:r.dim},e)),S.createElement(y,{flexGrow:1,justifyContent:`flex-end`},S.createElement(b,{color:r.fg},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`)));return S.createElement(c,{title:`Vitals`,focused:t,width:n},i(`LCP`,e?.lcpP75,`ms`),i(`INP`,e?.inpP75,`ms`),i(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),i(`TTFB`,e?.ttfbP75,`ms`),i(`FCP`,e?.fcpP75,`ms`))},U=({goals:e,focused:t,width:n,rows:r=5})=>{let i=e?.goals??[],a=i.slice(0,r),o=i.length-a.length;return S.createElement(c,{title:`Goals`,focused:t,width:n},i.length===0?S.createElement(m,{reason:`no-data`,headline:`No goals yet`}):S.createElement(S.Fragment,null,a.map(e=>S.createElement(B,{key:e.name,label:e.name,value:e.completions.toLocaleString()})),o>0?S.createElement(W,{count:o}):null))},W=({count:e})=>{let{theme:t}=l();return S.createElement(b,{color:t.dim},` +${e} more`)};export{R as watchCommand};
|
|
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
|
|
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
|
|
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
|