@zenovay/cli 0.1.67 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agency-BxYMejNb.js → agency-DHAyzKd-.js} +1 -1
- package/dist/ai-xhCcy02q.js +3 -0
- package/dist/alerts-Be0XKEUX.js +3 -0
- package/dist/analytical-screen-BU2yCSg_.js +2 -0
- package/dist/analytics-D7vhDrdG.js +2 -0
- package/dist/annotation-dveH657H.js +8 -0
- package/dist/api-hWp9s3Y8.js +1 -0
- package/dist/{api-keys-lfjOVUIe.js → api-keys-DKQX5aL9.js} +1 -1
- package/dist/api-v2-C7-5GPx8.js +1 -0
- package/dist/api-v2-DqKh6FgZ.js +1 -0
- package/dist/{apply-B19bFTz0.js → apply-oUMOH7u2.js} +1 -1
- package/dist/{audit-DfKQdrug.js → audit-DgHopH-O.js} +1 -1
- package/dist/bar-NfgovYHe.js +1 -0
- package/dist/bin.js +7 -6
- package/dist/chat-panel-PSN5hjlF.js +12 -0
- package/dist/commands-BE8-kQ9U.js +2 -0
- package/dist/companies-uScE2uHf.js +2 -0
- package/dist/{completions-Bem7-lcb.js → completions-DKyjFPMK.js} +1 -1
- package/dist/csv-emit-C-9o-imN.js +1 -0
- package/dist/csv-emit-CmlDBfbA.js +1 -0
- package/dist/data-table-BhKjjiOS.js +1 -0
- package/dist/deploys-BqQmCzVb.js +2 -0
- package/dist/devices-CUgpkbAC.js +2 -0
- package/dist/{doctor-D5HWdhgv.js → doctor-D1bGGwtN.js} +1 -1
- package/dist/{domains-V4sD09io.js → domains-iRmYn9G7.js} +1 -1
- package/dist/{emit-C9vAopcy.js → emit-D4YlMlzk.js} +1 -1
- package/dist/empty-state-D-krMX62.js +1 -0
- package/dist/{error-codes-C5caZH9p.js → error-codes-D4XO4okw.js} +1 -1
- package/dist/{error-codes-fnm-9MRL.js → error-codes-DpKbL-uM.js} +1 -1
- package/dist/errors-CEIyrEgF.js +2 -0
- package/dist/events-tail-CRgba_gO.js +5 -0
- package/dist/export-Csl7rWLW.js +4 -0
- package/dist/funnel-B36lGX2i.js +3 -0
- package/dist/geo-CPt2etQd.js +2 -0
- package/dist/globe-yy_-G4K8.js +2 -0
- package/dist/{goals-CVRryIri.js → goals-BTzgvDOK.js} +1 -1
- package/dist/grid-CMwhs-Ms.js +1 -0
- package/dist/health-D26VB-iZ.js +2 -0
- package/dist/health-RsLcvYTb.js +1 -0
- package/dist/heatmaps-D4o0Ghjn.js +1 -0
- package/dist/home-B8CoN9Hd.js +2 -0
- package/dist/init-BrxmKAnU.js +1 -0
- package/dist/init-Cee2-8Kd.js +105 -0
- package/dist/insights-B0L6kIxY.js +1 -0
- package/dist/{integrations-CWPrMJfZ.js → integrations-CJ9Pa-II.js} +1 -1
- package/dist/journeys--jjaTA3C.js +1 -0
- package/dist/keybar-DO5OoZy9.js +1 -0
- package/dist/keybar-deep-link-B4VJn2ko.js +1 -0
- package/dist/live-CuVd6yRs.js +1 -0
- package/dist/{login-CaDs2Peq.js → login-CsQ7fPVu.js} +1 -1
- package/dist/login-DeznxBjS.js +1 -0
- package/dist/{logout-BkeT6Hke.js → logout-C3KOOdIM.js} +1 -1
- package/dist/metric-card-C4iqxdww.js +1 -0
- package/dist/{notes-C8cba6QA.js → notes-jV1DYMp_.js} +1 -1
- package/dist/pages-0DLiuGYc.js +2 -0
- package/dist/panel-CTtQ2ue6.js +1 -0
- package/dist/{plans-oxxMSOdB.js → plans-D4o6-tbv.js} +1 -1
- package/dist/{profile-CD9QVZ2I.js → profile-Cm5RFs_L.js} +1 -1
- package/dist/{progress-row-5ns2IsFh.js → progress-row-Afnt5Ng8.js} +1 -1
- package/dist/projects-BTTgnjOZ.js +2 -0
- package/dist/{prompt-B4s3o9G7.js → prompt-BXvg2B4R.js} +1 -1
- package/dist/query-yn10M321.js +8 -0
- package/dist/range-tabs-BbJdVWNV.js +1 -0
- package/dist/resolve-site-BLrtFOyW.js +2 -0
- package/dist/retention-DpBuavgY.js +1 -0
- package/dist/revenue-Bv1Cqzjr.js +2 -0
- package/dist/secrets-c-NB_plk.js +1 -0
- package/dist/{self-test-CSST_zHj.js → self-test-Cml0QXeA.js} +3 -3
- package/dist/sessions-B0RwtHvP.js +1 -0
- package/dist/{settings-CFFiWmGO.js → settings-i4TqMmAY.js} +1 -1
- package/dist/share-DTHFqTzp.js +6 -0
- package/dist/site-switcher-D_JBKFaR.js +1 -0
- package/dist/sources-B39BFFKF.js +2 -0
- package/dist/stats-Dh9MQAXx.js +2 -0
- package/dist/{status-agent-TIyEIKOj.js → status-agent-C3q7fOEs.js} +1 -1
- package/dist/{team-BRebgNMO.js → team-DZtvClMF.js} +1 -1
- package/dist/{teams-DhrkUkt8.js → teams-CqJFecKB.js} +1 -1
- package/dist/themes-6H0KlK3b.js +4 -0
- package/dist/tour-fOYY-mK0.js +8 -0
- package/dist/{update-BCgHj5O4.js → update-CoZzBsMu.js} +1 -1
- package/dist/uptime-Ck1GdjRR.js +1 -0
- package/dist/{usage-BFCTeA8E.js → usage-BN_mEsal.js} +1 -1
- package/dist/{use-baQFldqI.js → use-NGqXzASp.js} +2 -2
- package/dist/use-fullscreen-ucSyZkjO.js +1 -0
- package/dist/visitors-BCz-O9rK.js +2 -0
- package/dist/vitals-Dx_eY6tW.js +2 -0
- package/dist/watch-CP-Klikt.js +1 -0
- package/dist/{webhooks-PRWhMVgS.js → webhooks-BR1D3o5S.js} +1 -1
- package/dist/webhooks-forward-CpXm4GHn.js +2 -0
- package/dist/wizard-bin.js +1 -1
- package/dist/wrapper-Dl9i0Nh7.js +6 -0
- package/dist/ws-client-MoEdfqAO.js +1 -0
- package/package.json +9 -7
- package/dist/ai-DbtIo6k2.js +0 -1
- package/dist/alerts-DKQa_K77.js +0 -3
- package/dist/analytical-screen-B_wWUnT4.js +0 -2
- package/dist/analytics-BO22Zeas.js +0 -2
- package/dist/annotation-CL1q8mjr.js +0 -8
- package/dist/api-FCanTxsb.js +0 -1
- package/dist/api-v2-CPUUcP1i.js +0 -1
- package/dist/api-v2-D9N_2hdW.js +0 -1
- package/dist/banner-DdgwXGzt.js +0 -1
- package/dist/bar-C1Zrfe9H.js +0 -1
- package/dist/chat-panel-ZlKZ0W6J.js +0 -7
- package/dist/commands-NsH5CS-H.js +0 -2
- package/dist/companies-CtZ2vGQs.js +0 -2
- package/dist/csv-emit-BWWv60mT.js +0 -1
- package/dist/csv-emit-CVO5kebZ.js +0 -1
- package/dist/data-table-DJzT7bAr.js +0 -1
- package/dist/deploys-CUbSa8S5.js +0 -2
- package/dist/devices-CrkIxfde.js +0 -2
- package/dist/empty-state-DbToIL5T.js +0 -1
- package/dist/errors-D3fS1kYu.js +0 -2
- package/dist/events-tail-DGRZewwc.js +0 -5
- package/dist/export-FjEyji8r.js +0 -4
- package/dist/funnel-C7DmrdUC.js +0 -3
- package/dist/geo-C9OcRStg.js +0 -2
- package/dist/globe-PiPL3Bei.js +0 -2
- package/dist/health-DMiTjQ9Z.js +0 -2
- package/dist/health-vxoiMF8G.js +0 -1
- package/dist/heatmaps-G3Nf95tV.js +0 -1
- package/dist/home-CXwRtMge.js +0 -2
- package/dist/init-BuyESMBj.js +0 -79
- package/dist/init-WmEUW4Em.js +0 -1
- package/dist/insights-J99-8Rcu.js +0 -1
- package/dist/journeys-BLxqoeFu.js +0 -1
- package/dist/keybar-QgnmSion.js +0 -1
- package/dist/keybar-deep-link-DbmPjAEz.js +0 -1
- package/dist/live-CWSLgkC2.js +0 -1
- package/dist/login-wpGuU_Zm.js +0 -1
- package/dist/metric-card-bQ-j_G6l.js +0 -1
- package/dist/pages-CKs5X38q.js +0 -2
- package/dist/panel-B-XxdP-N.js +0 -1
- package/dist/projects-hIQqeDYq.js +0 -2
- package/dist/query-BLHvu1IF.js +0 -8
- package/dist/resolve-site-DQVcWhjG.js +0 -2
- package/dist/retention-B8bgiVux.js +0 -1
- package/dist/revenue-BiViSloE.js +0 -2
- package/dist/secrets-M60NENIa.js +0 -1
- package/dist/sessions-lUUiiNYc.js +0 -1
- package/dist/share-Cx62AEP-.js +0 -6
- package/dist/sources-D-KqX0Sg.js +0 -2
- package/dist/stats-BzTqFpJL.js +0 -2
- package/dist/themes-gluHmb6E.js +0 -4
- package/dist/tour-STZ66G7K.js +0 -8
- package/dist/uptime-CwG6bqir.js +0 -1
- package/dist/visitors-BtriXh9k.js +0 -2
- package/dist/vitals-BgAwONID.js +0 -2
- package/dist/watch-Cv4FtwSJ.js +0 -1
- package/dist/webhooks-forward-BDxi2TcF.js +0 -3
- package/dist/ws-client-BZMMGeRe.js +0 -1
- /package/dist/{client-Dm8uGVCy.js → client-ntsEXSVC.js} +0 -0
- /package/dist/{confirm-CIdxMt7N.js → confirm-DS5wux0g.js} +0 -0
- /package/dist/{examples-CFatZcPz.js → examples-DikBW-H2.js} +0 -0
- /package/dist/{formatter-DDG2TSOz.js → formatter-C4YSOKuq.js} +0 -0
- /package/dist/{open-url-BxXbZzWS.js → open-url-BtI5aLgL.js} +0 -0
- /package/dist/{secrets-DPf_7SkN.js → secrets-ApB7yh2A.js} +0 -0
- /package/dist/{telemetry-DC0Jw3JD.js → telemetry-BdWnMaJC.js} +0 -0
- /package/dist/{theme-BuGrQHax.js → theme-Brz9wK0w.js} +0 -0
- /package/dist/{tier-C4q8fJ8m.js → tier-BneaO4vD.js} +0 -0
- /package/dist/{ui-whccLLRv.js → ui-C5Te-OTJ.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{mocha as e}from"./theme-
|
|
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-
|
|
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-TmBx42nv.js`),{readConfig:r}=await import(`./config-DB3jF5gG.js`),{ApiV2Client:i}=await import(`./api-v2-C7-5GPx8.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
|
+
`).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-DikBW-H2.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
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{requireTier as r}from"./tier-BneaO4vD.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-BLrtFOyW.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-D_JBKFaR.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,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";function r(e){try{return JSON.parse(e)}catch{return e}}async function i(i){let a=await e(),o=await t({strict:!1}),s=new n({config:a,cliVersion:i.cliVersion,token:o});try{switch(i.action){case`get`:{let{settings:e}=await s.getSettings();if(i.key){let t=e[i.key];return t===void 0?(process.stderr.write(`Unknown setting: ${i.key}\n`),2):(i.json?process.stdout.write(JSON.stringify({[i.key]:t},null,2)+`
|
|
2
2
|
`):process.stdout.write(`${i.key} = ${t===null?`—`:JSON.stringify(t)}\n`),0)}if(i.json)return process.stdout.write(JSON.stringify({settings:e},null,2)+`
|
|
3
3
|
`),0;for(let[t,n]of Object.entries(e))process.stdout.write(`${t.padEnd(28)} ${n===null?`—`:JSON.stringify(n)}\n`);return 0}case`set`:{if(!i.key||i.value===void 0)return process.stderr.write("Error: usage `zenovay settings set <key> <value>`.\n"),2;let e=r(i.value),t=await s.setSetting(i.key,e);return i.json?(process.stdout.write(JSON.stringify(t,null,2)+`
|
|
4
4
|
`),0):(process.stdout.write(`✔ Set ${i.key} → ${JSON.stringify(e)}\n`),0)}}}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}}export{i as settingsCommand};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{confirmDestructive as r}from"./confirm-DS5wux0g.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{resolveSiteId as i}from"./resolve-site-BLrtFOyW.js";async function a(a){let o=await e(),s=await t({strict:!1}),c=new n({config:o,cliVersion:a.cliVersion,token:s}),l,u;try{({siteId:l,site:u}=await i(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let d=u?.url?u.url.replace(/^https?:\/\//,``).replace(/\/$/,``):u?.name??l;try{switch(a.action){case`enable`:{let e=await c.enableShare(l);if(a.json)return process.stdout.write(JSON.stringify(e,null,2)+`
|
|
2
|
+
`),0;let t=`═`.repeat(72);return process.stdout.write(`\n${t}\n Public dashboard sharing enabled\n url: ${e.url}\n${t}\n\n Anyone with this link can view your dashboard. Disable with\n \`zenovay share disable\` to invalidate the link immediately.\n\n`),0}case`disable`:{let e=await r({resource:`public share link`,name:d,yes:a.yes,destructive:!0});if(!e)return process.stdout.write(`Cancelled.
|
|
3
|
+
`),1;let t=await c.disableShare(l);return a.json?(process.stdout.write(JSON.stringify(t)+`
|
|
4
|
+
`),0):(process.stdout.write(`✔ Public sharing disabled. The previous link is no longer valid.
|
|
5
|
+
`),0)}case`url`:{let e=await c.getShare(l);return a.json?(process.stdout.write(JSON.stringify(e,null,2)+`
|
|
6
|
+
`),0):e.enabled?(process.stdout.write(`Public URL: ${e.url??`—`}\n`),0):(process.stdout.write("Public sharing is disabled. Enable with `zenovay share enable`.\n"),0)}}}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}}export{a as shareCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{updateConfig as e}from"./config--JRu_jFq.js";import{Panel as t,useTheme as n}from"./panel-CTtQ2ue6.js";import{Select as r}from"./prompt-BXvg2B4R.js";import{Box as i,Text as a}from"ink";import o,{useCallback as s,useState as c}from"react";function l(l,u,d){let{theme:f}=n(),[p,m]=c(!1),[h,g]=c([]),_=s(()=>{m(e=>{let t=!e;return t&&h.length===0&&l.getSites().then(e=>g(e)).catch(()=>{}),t})},[l,h.length]),v=s(()=>m(!1),[]),y=s(t=>{m(!1),e({defaultSiteId:t.id,defaultSiteName:t.name}),d(t)},[d]),b=p?o.createElement(i,{marginTop:1},o.createElement(t,{title:`Switch site`,state:`idle`},h.length===0?o.createElement(a,{color:f.muted},`Loading your sites…`):o.createElement(r,{items:h.map(e=>({label:`${e.name} · ${e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)}${e.id===u?` (current)`:``}`,value:e})),onSelect:y}),o.createElement(i,{marginTop:1},o.createElement(a,{color:f.dim},`[↑↓ navigate] · [enter] select — becomes your default everywhere · [s/esc] close`)))):null;return{open:p,toggle:_,close:v,overlay:b}}export{l as useSiteSwitcher};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.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-PSN5hjlF.js";import{resolveSiteId as s}from"./resolve-site-BLrtFOyW.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-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-BU2yCSg_.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
|
+
`);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};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.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-PSN5hjlF.js";import{resolveSiteId as o}from"./resolve-site-BLrtFOyW.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-BbJdVWNV.js";import{runAnalyticalScreen as l}from"./analytical-screen-BU2yCSg_.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
|
+
`);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,4 +1,4 @@
|
|
|
1
|
-
import{configPath as e,readConfig as t,writeConfig as n}from"./config--JRu_jFq.js";import"./api-
|
|
1
|
+
import{configPath as e,readConfig as t,writeConfig as n}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as r}from"./token-store-BQuGH0z2.js";import{emit as i}from"./telemetry-DRh10SvO.js";import{ApiV2Client as a}from"./api-v2-DqKh6FgZ.js";import{spawn as o}from"node:child_process";import s from"node:path";import{existsSync as c,mkdirSync as l,readFileSync as u,renameSync as d,unlinkSync as f,writeFileSync as p}from"node:fs";import{homedir as m}from"node:os";const h=6e4;function g(){return s.join(m(),`.zenovay`)}function _(){return s.join(g(),`status-agent.pid`)}function v(){return s.join(g(),`tmux-status`)}function y(){l(g(),{recursive:!0,mode:448})}function b(e){let t=_(),n=`${t}.tmp.${process.pid}`;p(n,String(e),{mode:384}),d(n,t)}function x(e){try{return process.kill(e,0),!0}catch{return!1}}function S(e){if(!e)return[];let t=[];for(let n of e.split(`,`).map(e=>e.trim()).filter(Boolean)){let e=n.match(/^([a-z_]+)\s*(>|<)\s*(-?\d+(?:\.\d+)?)$/i);if(!e)continue;t.push({key:(e[1]??``).toLowerCase(),op:e[2]??`>`,value:Number(e[3]??0)})}return t}function C(e,t,n,r=!1){let i=(t/1e5).toFixed(1),a=[`#[fg=colour141]● ${e} live`,`#[fg=colour114]▲ MRR $${i}k`,`#[fg=colour203]✗ ${n.toFixed(0)} err/s`].join(` `);return r?`#[reverse]${a}#[noreverse]`:a}const w=3e4,T=5*60*1e3,E=new Map;function D(e,t){let n=Math.floor(t/10),r=`${e}:${n}`,i=Date.now(),a=E.get(r);return a&&i-a<T?!1:(E.set(r,i),!0)}async function O(e,t){let n=process.platform;try{if(n===`darwin`){await new Promise((n,r)=>{let i=o(`terminal-notifier`,[`-title`,e,`-message`,t,`-group`,`zenovay`],{stdio:`ignore`});i.on(`error`,r),i.on(`exit`,()=>n())});return}if(n===`linux`){await new Promise((n,r)=>{let i=o(`notify-send`,[e,t],{stdio:`ignore`});i.on(`error`,r),i.on(`exit`,()=>n())});return}}catch{}process.stdout.write(`\x1b]9;${e} — ${t}\x07`)}function k(e,t){let n=[];for(let r of e){let e=t[r.key];if(typeof e!=`number`)continue;r.op===`>`&&e>r.value&&n.push({rule:r,actual:e}),r.op===`<`&&e<r.value&&n.push({rule:r,actual:e})}return n}async function A(e){let n=await t(),o=await r({strict:!1});if(!o)return process.stderr.write(`status-agent: not logged in
|
|
2
2
|
`),2;let s=new a({config:n,cliVersion:e.cliVersion,token:o}),c=e.siteId??n.defaultSiteId??``;if(!c)return process.stderr.write("status-agent: no site selected — pass --site-id or run `zenovay use <site>`\n"),2;y();let l=n.statusAgent?.notifyOn,u=n.statusAgent?.refreshIntervalMs,d=S(e.notifyOn??l),m=e.intervalMs??u??h,g=Date.now(),b=0;i(`status_agent.start`,{properties:{rule_count:d.length,interval_ms:m}});let x=null,T=!1,E=0,A=null,j=()=>{T=!0,A&&A()};for(process.on(`SIGTERM`,j),process.on(`SIGINT`,j);!T;){try{let[e,t,n]=await Promise.all([s.getLive(c).catch(()=>({activeVisitors:0,recentEvents:[]})),s.getErrors(c,{window:`24h`}).catch(()=>({errors:[],total:0})),s.getRevenue(c,`24h`).catch(()=>null)]),r=e.activeVisitors,a=n?.mrr??n?.totalAmount??0,o=t.total/86400,l=x&&x>0?(x-a)/x*100:0,u=k(d,{error_rate:o,revenue_drop:l}),f=!1;for(let e of u){if(!D(e.rule.key,e.actual))continue;f=!0,i(`status_agent.alert_fired`,{properties:{rule_key:e.rule.key,op:e.rule.op}}),await O(`Zenovay alert`,`${e.rule.key} ${e.rule.op} ${e.rule.value} (got ${e.actual.toFixed(2)})`)}f&&(E=Date.now());let m=E>0&&Date.now()-E<w;p(v(),C(r,a,o,m),{mode:420}),b+=1,b%10==0&&i(`status_agent.tick`,{properties:{tick:b,has_revenue:a>0,has_visitors:r>0,had_errors:o>0}}),x=a}catch(e){process.stderr.write(`status-agent tick failed: ${e.message}\n`)}await new Promise(e=>{let t=setTimeout(e,m);A=()=>{clearTimeout(t),e()}}),A=null}i(`status_agent.stop`,{duration_ms:Date.now()-g,properties:{ticks:b}});try{f(_())}catch{}return 0}function j(){return[`# Add to ~/.tmux.conf:`,`set -g status-right "#(cat ~/.zenovay/tmux-status) %H:%M"`,``,`# Then reload:`,`# $ tmux source ~/.tmux.conf`].join(`
|
|
3
3
|
`)}function M(){let e=process.argv[0]??`zenovay`;return[`[Unit]`,`Description=Zenovay status agent`,`After=network.target`,``,`[Service]`,`Type=simple`,`ExecStart=${e} status-agent --child`,`Restart=on-failure`,`RestartSec=10`,``,`[Install]`,`WantedBy=default.target`,``,`# Save as ~/.config/systemd/user/zenovay-status.service`,`# systemctl --user enable --now zenovay-status`].join(`
|
|
4
4
|
`)}function N(){let e=process.argv[0]??`zenovay`;return[`<?xml version="1.0" encoding="UTF-8"?>`,`<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">`,`<plist version="1.0">`,`<dict>`,` <key>Label</key><string>com.zenovay.status-agent</string>`,` <key>ProgramArguments</key>`,` <array>`,` <string>${e}</string>`,` <string>status-agent</string>`,` <string>--child</string>`,` </array>`,` <key>RunAtLoad</key><true/>`,` <key>KeepAlive</key><true/>`,`</dict>`,`</plist>`,``,`<!-- Save as ~/Library/LaunchAgents/com.zenovay.status-agent.plist -->`,`<!-- launchctl load ~/Library/LaunchAgents/com.zenovay.status-agent.plist -->`].join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{requireTier as r}from"./tier-BneaO4vD.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import{fmtDate as a,formatTable as o,shortId as s}from"./fmt-xxIPQJX-.js";async function c(c){let l=await e(),u=await t({strict:!1}),d=new n({config:l,cliVersion:c.cliVersion,token:u});try{await r(d,`pro`)}catch(e){return process.stderr.write(`✗ ${e.message}\n`),2}try{switch(c.action){case`list`:{let e=await d.listTeam();if(c.json)return process.stdout.write(JSON.stringify(e,null,2)+`
|
|
2
2
|
`),0;let t=[{key:`userId`,header:`user id`,width:14,format:e=>s(String(e))},{key:`email`,header:`email`,width:32,format:e=>String(e??`—`)},{key:`role`,header:`role`,width:8},{key:`joinedAt`,header:`joined`,width:10,format:e=>a(e)}],n=[{key:`id`,header:`invite id`,width:14,format:e=>s(String(e))},{key:`email`,header:`email`,width:32},{key:`role`,header:`role`,width:8},{key:`expiresAt`,header:`expires`,width:10,format:e=>a(e)}];return process.stdout.write(`\nMEMBERS (${e.members.length})\n`),e.members.length===0?process.stdout.write(` — none —
|
|
3
3
|
`):process.stdout.write(o({rows:e.members,cols:t})),process.stdout.write(`\nPENDING INVITES (${e.invites.length})\n`),e.invites.length===0?process.stdout.write(` — none —
|
|
4
4
|
`):process.stdout.write(o({rows:e.invites,cols:n})),process.stdout.write(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import"./api-
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as n}from"./token-store-BQuGH0z2.js";import{ApiV2Client as r}from"./api-v2-DqKh6FgZ.js";function i(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}async function a(a){let o=await e(),s=await n({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new r({config:o,cliVersion:a.cliVersion,token:s});try{switch(a.action){case`reset`:{let e=await t({currentTeamId:void 0,currentTeamName:void 0});return a.json?(process.stdout.write(JSON.stringify({reset:!0,currentTeamId:e.currentTeamId??null})+`
|
|
2
2
|
`),0):(process.stdout.write(`✔ Team override cleared. Future commands use the API key's default team.
|
|
3
3
|
`),0)}case`current`:{let e=await c.me(),t=e.teams?.find(e=>e.isCurrent)??(e.team?{id:e.team.id,name:e.team.name,plan:e.team.plan,role:`?`,siteCount:0,isCurrent:!0}:null);return a.json?(process.stdout.write(JSON.stringify({current:t,override:o.currentTeamId??null},null,2)+`
|
|
4
4
|
`),0):t?(process.stdout.write(`\n current team: ${t.name} (${i(t.id)})\n plan: ${t.plan}\n override? ${o.currentTeamId?"yes — set via `teams switch`":`no — using API key default`}\n\n`),0):(process.stdout.write(`No team currently bound.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./theme-Brz9wK0w.js";import{Banner as a,Panel as o,useTheme as s}from"./panel-CTtQ2ue6.js";import{promises as c}from"node:fs";import{Box as l,Text as u,render as d}from"ink";import f from"react";const p=13,m=8,h=20,g=9,_=p+m+h+g,v=[{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`}],y=[`name`,`bg`,`fg`,`muted`,`accent`,`accent2`,`success`,`warn`,`error`,`border`,`dim`];function b({name:e,theme:t,mode:n,isActive:r}){let{theme:i}=s(),a=[t.accent,t.accent2,t.success,t.warn,t.error];return f.createElement(l,{flexDirection:`row`,width:_},f.createElement(l,{width:p,flexShrink:0},f.createElement(u,{color:r?i.accent:i.fg,bold:!0,wrap:`truncate`},r?`› `:` `,e)),f.createElement(l,{width:m,flexShrink:0},f.createElement(u,{color:i.dim,wrap:`truncate`},n)),f.createElement(l,{width:h,flexShrink:0,flexDirection:`row`},a.map((e,t)=>f.createElement(u,{key:t,color:e},`███ `))),f.createElement(l,{width:g,flexShrink:0},f.createElement(u,{color:i.dim,wrap:`truncate`},t.bg)))}function x({themes:e,cliVersion:t}){let{theme:n}=s();return f.createElement(l,{flexDirection:`column`},f.createElement(a,{version:t,subtitle:`themes · ${e.length} palettes`,live:!1}),f.createElement(l,{marginTop:1},f.createElement(o,{title:`Available themes`},f.createElement(l,{flexDirection:`row`,width:_},f.createElement(l,{width:p,flexShrink:0},f.createElement(u,{color:n.dim,wrap:`truncate`},` NAME`)),f.createElement(l,{width:m,flexShrink:0},f.createElement(u,{color:n.dim,wrap:`truncate`},`MODE`)),f.createElement(l,{width:h,flexShrink:0},f.createElement(u,{color:n.dim,wrap:`truncate`},`SWATCH`)),f.createElement(l,{width:g,flexShrink:0},f.createElement(u,{color:n.dim,wrap:`truncate`},`BG`))),e.map(({name:e,theme:t,mode:r})=>f.createElement(b,{key:e,name:e,theme:t,mode:r,isActive:t.name===n.name})))),f.createElement(l,{marginTop:1},f.createElement(u,{color:n.dim},`Pass `,f.createElement(u,{color:n.accent},`--theme <name>`),` to any command, or set it in your config.`)))}async function S(e){if(e.validate){let t;try{let n=await c.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=y.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 (${y.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:v.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}=d(f.createElement(x,{themes:v,cliVersion:e.cliVersion}));return await t(),0}export{S as themesCommand};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import"./theme-Brz9wK0w.js";import{Banner as e,Panel as t,useTheme as n}from"./panel-CTtQ2ue6.js";import{Keybar as r}from"./keybar-DO5OoZy9.js";import{spawn as i}from"node:child_process";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";import p from"ink-spinner";const m=[{title:`Identify`,explainer:"Who you are and which team you’re acting on. CLI uses your saved bearer token from `zenovay login`.",command:`profile show`},{title:`Tracked sites`,explainer:`The websites your account can read.`,command:`domains list`},{title:`Today's analytics`,explainer:`What visitors did on your sites in the last 24 hours.`,command:`analytics`},{title:`Traffic sources`,explainer:`Where visitors come from — direct, organic, referrals.`,command:`sources --period 7d`},{title:`Recent sessions`,explainer:`Replay-style listing of recorded sessions (Pro+).`,command:`sessions`,tierGated:!0},{title:`Alert configs`,explainer:`Threshold-based alerts you’ve set up.`,command:`alerts list`,tierGated:!0},{title:`Export today`,explainer:`Bulk-export analytics data to CSV.`,command:`export analytics --range 7d --format csv`,csvPreview:!0},{title:`Self-test`,explainer:`One-command verification that everything works.`,command:`self-test --quick`,maxLines:24}],h=m.length;async function g(e){let t=process.argv[1]??process.execPath;return e.nonInteractive?_(t,e.cliVersion):new Promise(n=>{let{unmount:r}=s(u.createElement(b,{cliVersion:e.cliVersion,binPath:t,onDone:e=>{r(),n(e)}}))})}async function _(e,t){process.stdout.write(`Zenovay CLI v${t} — tour (non-interactive)\n`),process.stdout.write(`────────────────────────────────────────────────────
|
|
2
|
+
|
|
3
|
+
`);for(let t=0;t<m.length;t++){let n=m[t];process.stdout.write(`[${t+1}/${h}] ${n.title}\n`),process.stdout.write(` ${n.explainer}\n`),process.stdout.write(` $ zenovay ${n.command}\n\n`);let r=await y(e,n);if(r.tierSkipped){process.stdout.write(` → Skipping (requires Pro plan)
|
|
4
|
+
|
|
5
|
+
`);continue}let i=r.text.split(`
|
|
6
|
+
`),a=n.csvPreview?10:n.maxLines??12,o=i.slice(0,a);for(let e of o)process.stdout.write(` ${e}\n`);i.length>a&&process.stdout.write(` … (${i.length-a} more lines)\n`),process.stdout.write(`
|
|
7
|
+
`)}return process.stdout.write("Tour complete. Run `zenovay self-test` for full verification.\n"),0}const v=2e4;function y(e,t){return new Promise(n=>{let r=t.command.split(` `).filter(Boolean);t.csvPreview||r.push(`--json`);let a=i(`node`,[e,...r],{env:{...process.env,ZENOVAY_NO_UPDATE_CHECK:`1`,NO_COLOR:`1`},stdio:[`ignore`,`pipe`,`pipe`]}),o=``,s=``,c=setTimeout(()=>{try{a.kill(`SIGKILL`)}catch{}},v);a.stdout?.on(`data`,e=>{o+=e.toString(`utf8`),o.length>524288&&(o=o.slice(0,524288))}),a.stderr?.on(`data`,e=>{s+=e.toString(`utf8`),s.length>524288&&(s=s.slice(0,524288))}),a.on(`error`,e=>{clearTimeout(c),n({text:`[spawn error: ${e.message}]`,exitCode:-1,tierSkipped:!1})}),a.on(`close`,e=>{clearTimeout(c);let r=o||s,i=t.tierGated===!0&&/tier_insufficient/.test(o+s);n({text:r.trimEnd(),exitCode:e??0,tierSkipped:i})})})}const b=({cliVersion:t,binPath:r,onDone:i})=>{let[s,p]=f(0),[g,_]=f(null),[v,b]=f(!0),{exit:w}=c(),{theme:T}=n(),E=m[s];return d(()=>{if(!E){setTimeout(()=>{w(),i(0)},30);return}let e=!1;return b(!0),_(null),y(r,E).then(t=>{e||(_(t),b(!1))}),()=>{e=!0}},[s]),l((e,t)=>{if(t.return){v||p(e=>e+1);return}if(e===`s`||e===`S`){v||p(e=>e+1);return}(e===`q`||e===`Q`||t.escape||t.ctrl&&e===`c`)&&(w(),i(0))}),E?u.createElement(a,{flexDirection:`column`},u.createElement(e,{version:t,subtitle:`tour · step ${s+1} of ${h}`}),u.createElement(a,{flexDirection:`column`,marginTop:1},u.createElement(x,{index:s,step:E}),u.createElement(a,{marginTop:1},u.createElement(S,{step:E,output:g,running:v})),u.createElement(C,{running:v}))):u.createElement(a,{flexDirection:`column`},u.createElement(e,{version:t,subtitle:`tour · complete`,live:!1}),u.createElement(a,{marginTop:1},u.createElement(o,null,`All `,h,` steps done. Run `),u.createElement(o,{color:T.accent,bold:!0},`zenovay self-test`),u.createElement(o,null,` for the full verification suite.`)))},x=({index:e,step:t})=>{let{theme:r}=n();return u.createElement(a,{flexDirection:`column`},u.createElement(a,{flexDirection:`row`},u.createElement(o,{color:r.accent,bold:!0},`[`,e+1,`/`,h,`]`),u.createElement(o,null,` `),u.createElement(o,{color:r.fg,bold:!0},t.title)),u.createElement(a,null,u.createElement(o,{color:r.dim},t.explainer)),u.createElement(a,null,u.createElement(o,{color:r.dim},`$ `),u.createElement(o,{color:r.fg},`zenovay `,t.command)))},S=({step:e,output:r,running:i})=>{let{theme:s}=n();if(i||!r)return u.createElement(t,{title:`output`,state:`busy`},u.createElement(a,null,u.createElement(o,{color:s.accent},u.createElement(p,{type:`dots`})),u.createElement(o,null,` `),u.createElement(o,{color:s.dim},`running…`)));if(r.tierSkipped)return u.createElement(t,{title:`output`,state:`warn`,pillColor:s.warn},u.createElement(a,null,u.createElement(o,{color:s.warn},`→ Skipping (requires Pro plan)`)));let c=r.text.split(`
|
|
8
|
+
`),l=e.csvPreview?10:e.maxLines??12,d=process.stdout.rows??40,f=Math.max(4,d-14),m=Math.min(l,f),h=c.slice(0,m),g=c.length-m,_=r.exitCode===0?`ok`:`err`,v=r.exitCode===0?s.success:s.error;return u.createElement(t,{title:`output (exit ${r.exitCode})`,state:_,pillColor:v},h.map((e,t)=>u.createElement(a,{key:t},u.createElement(o,{color:s.fg},e||` `))),g>0?u.createElement(a,null,u.createElement(o,{color:s.dim},`… (`,g,` more lines)`)):null)},C=({running:e})=>{let{theme:t}=n();return e?u.createElement(a,{marginTop:1},u.createElement(o,{color:t.dim},`working… `),u.createElement(o,{color:t.muted},`[`),u.createElement(o,{color:t.accent},`q`),u.createElement(o,{color:t.muted},` quit]`)):u.createElement(r,{items:[{key:`Enter`,label:`continue`},{key:`s`,label:`skip`},{key:`q`,label:`quit`}]})};export{g as tourCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import{classifyBump as t,fetchManifest as n}from"./check-D9G0N7NB.js";import{applyUpdate as r}from"./apply-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import{classifyBump as t,fetchManifest as n}from"./check-D9G0N7NB.js";import{applyUpdate as r}from"./apply-oUMOH7u2.js";import"./formatter-C4YSOKuq.js";import{emit$1 as i,isHeadless as a}from"./emit-D4YlMlzk.js";async function o(o){let s=await e(),c=await n({cliBase:s.cliBase}),l=t(o.cliVersion,c.latest);if(o.check)return a({json:o.json})?i({type:`info`,message:`latest=${c.latest} current=${o.cliVersion} bump=${l}`}):process.stdout.write(`Current: ${o.cliVersion}\nLatest: ${c.latest}\nBump: ${l}\n`),{updated:!1,from:o.cliVersion,to:c.latest};if(l===`none`)return a({json:o.json})||process.stdout.write(`Already on latest (${o.cliVersion}).\n`),{updated:!1,from:o.cliVersion,to:c.latest};if(l===`downgrade`&&!o.forceDowngrade)throw Error(`Refused to downgrade ${o.cliVersion} → ${c.latest}. Pass --force-downgrade if you really want this.`);let u=await r({currentVersion:o.cliVersion,cliBase:s.cliBase,binaryPath:o.binaryPath,forceDowngrade:o.forceDowngrade});return a({json:o.json})?u.updated&&i({type:`update.applied`,from:u.from,to:u.to}):u.updated?process.stdout.write(`Updated ${u.from} → ${u.to}\n`):process.stdout.write(`Not updated (${u.reason??`unknown`}).\n`),u}export{o as updateCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{requireTier as r}from"./tier-BneaO4vD.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-BLrtFOyW.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-D_JBKFaR.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,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{fmtDate as r,fmtNumber as i}from"./fmt-xxIPQJX-.js";const a=1e8,o=e=>e<=0||e>=a;function s(e,t,n=24){if(o(t))return`─`.repeat(n);let r=Math.min(1,e/t),i=Math.round(r*n);return`█`.repeat(i)+`░`.repeat(Math.max(0,n-i))}function c(e,t){if(o(t))return`—`;let n=e/t*100;return`${n.toFixed(0)}%`}function l(e,t){if(o(t))return``;let n=e/t;return n>=1?`⚠ over limit`:n>=.8?`⚠ near limit`:``}function u(e,t){return o(e)?`∞`:t(e)}async function d(a){let o=await e(),d=await t({strict:!1});if(!d)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let f=new n({config:o,cliVersion:a.cliVersion,token:d}),p;try{p=await f.getUsage()}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}if(a.json)return process.stdout.write(JSON.stringify(p,null,2)+`
|
|
2
2
|
`),0;let m=[{label:`events this month`,used:p.events.thisMonth,limit:p.events.monthlyLimit,format:i},{label:`events today`,used:p.events.today,limit:p.events.dailyLimit,format:i},{label:`websites`,used:p.websites.used,limit:p.websites.limit},{label:`team members`,used:p.teamMembers.used,limit:p.teamMembers.limit}],h=18,g=8,_=9,v=[];v.push(``),v.push(` plan: ${p.plan}`),v.push(``);for(let e of m){let t=e.format??i,n=t(e.used).padStart(g),r=u(e.limit,t).padStart(_),a=s(e.used,e.limit),o=c(e.used,e.limit).padStart(5),d=l(e.used,e.limit);v.push(` ${e.label.padEnd(h)} ${n} / ${r} ${a} ${o} ${d}`.trimEnd())}return v.push(` ${`api keys`.padEnd(h)} ${i(p.apiKeys.used).padStart(g)} / ${`—`.padStart(_)} ${`─`.repeat(24)} ${`—`.padStart(5)}`),v.push(``),v.push(` data retention: ${p.dataRetentionDays} days`),v.push(` last event: ${r(p.events.lastEventAt,`datetime`)}`),v.push(``),process.stdout.write(v.join(`
|
|
3
3
|
`)),0}export{d as usageCommand};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import{ApiClient as n}from"./api-
|
|
2
|
-
`),0);if(!o.match||!o.match.trim()){let t=await e();if(t.defaultSiteId){let e={siteId:t.defaultSiteId,name:t.defaultSiteName??null,domain:t.defaultSiteName??null};return o.json?(i(a(e,`use.current`,{siteId:t.defaultSiteId})),0):(process.stdout.write(`Default site: ${e.name??e.siteId} (${t.defaultSiteId})\n`),0)}return o.json?(i(a(null,`use.current`,{})),0):(process.stdout.write("No default site set. Run `zenovay use <domain>` to set one.\n"),0)}let c=await e(),l=await r({strict:!1});if(!l&&!process.env.ZENOVAY_API_TOKEN)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:c,cliVersion:o.cliVersion,token:l}),d=o.match.trim().toLowerCase(),f=await u.getSites(),p=f.find(e=>e.id===o.match||e.trackingCode===o.match||e.url===o.match),m=p??f.find(e=>s(e.url).includes(d)||e.name.toLowerCase().includes(d));return m?(await t({defaultSiteId:m.id,defaultSiteName:m.name}),o.json?(i(a({siteId:m.id,name:m.name,domain:s(m.url)},`use.set`,{siteId:m.id})),0):(process.stdout.write(`Default site → ${m.name} (${m.url})\n`),0)):(process.stderr.write(`No site matched "${o.match}". Your sites:\n${f.map(e=>` ${e.name} — ${e.url} — ${e.id}`).join(`
|
|
1
|
+
import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import{ApiClient as n}from"./api-hWp9s3Y8.js";import{readToken as r}from"./token-store-BQuGH0z2.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as i,wrapSnapshot as a}from"./emit-D4YlMlzk.js";async function o(o){if(o.reset)return await t({defaultSiteId:void 0,defaultSiteName:void 0}),o.json?(i(a({reset:!0,defaultSiteId:null},`use.reset`)),0):(process.stdout.write(`Default site cleared.
|
|
2
|
+
`),0);if(!o.match||!o.match.trim()){let t=await e();if(t.defaultSiteId){let e={siteId:t.defaultSiteId,name:t.defaultSiteName??null,domain:t.defaultSiteName??null};return o.json?(i(a(e,`use.current`,{siteId:t.defaultSiteId})),0):(process.stdout.write(`Default site: ${e.name??e.siteId} (${t.defaultSiteId})\n`),0)}return o.json?(i(a(null,`use.current`,{})),0):(process.stdout.write("No default site set. Run `zenovay use <domain>` to set one.\n"),0)}let c=await e(),l=await r({strict:!1});if(!l&&!process.env.ZENOVAY_API_TOKEN)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:c,cliVersion:o.cliVersion,token:l}),d=o.match.trim().toLowerCase(),f=await u.getSites(),p=f.find(e=>e.id===o.match||e.trackingCode===o.match||e.url===o.match||s(e.url)===d||e.name.toLowerCase()===d),m=p??f.find(e=>s(e.url).includes(d)||e.name.toLowerCase().includes(d));return m?(await t({defaultSiteId:m.id,defaultSiteName:m.name}),o.json?(i(a({siteId:m.id,name:m.name,domain:s(m.url)},`use.set`,{siteId:m.id})),0):(process.stdout.write(`Default site → ${m.name} (${m.url})\n`),0)):(process.stderr.write(`No site matched "${o.match}". Your sites:\n${f.map(e=>` ${e.name} — ${e.url} — ${e.id}`).join(`
|
|
3
3
|
`)}\n`),2)}function s(e){return e.toLowerCase().replace(/^https?:\/\//,``).replace(/\/.*$/,``)}export{o as useCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useEffect as e}from"react";const t=`\x1B`;function n(){e(()=>{if(process.stdout.isTTY)return process.stdout.write(`${t}[?1049h${t}[H`),()=>{process.stdout.isTTY&&process.stdout.write(`${t}[?1049l`)}},[])}export{n as useFullscreen};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.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-PSN5hjlF.js";import{resolveSiteId as l}from"./resolve-site-BLrtFOyW.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-BbJdVWNV.js";import{runAnalyticalScreen as p}from"./analytical-screen-BU2yCSg_.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
|
+
`);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};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.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-PSN5hjlF.js";import{resolveSiteId as s}from"./resolve-site-BLrtFOyW.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-BbJdVWNV.js";import{runAnalyticalScreen as d}from"./analytical-screen-BU2yCSg_.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
|
+
`);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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.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-BLrtFOyW.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};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-DqKh6FgZ.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-D4YlMlzk.js";function c(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}function l(e){return e?new Date(e).toISOString().slice(0,10):`—`}async function u(u){let d=await e(),f=await t({strict:!1}),p=new r({config:d,cliVersion:u.cliVersion,token:f});try{switch(u.action){case`list`:{let{webhooks:e}=await p.listWebhooks();if(u.json)return a(s(e,`webhooks.list`),{legacyKey:`webhooks`,legacyValue:e}),0;if(e.length===0)return process.stdout.write("No webhooks yet. Add one with `zenovay webhooks add <https-url> --events <e1,e2>`.\n"),0;let t=[``,`id`,`url`,`events`,`created`],n=[1,14,40,28,10],r=e=>e.map((e,t)=>(e??``).padEnd(n[t])).join(` `);process.stdout.write(r(t)+`
|
|
2
2
|
`),process.stdout.write(r(n.map(e=>`─`.repeat(e)))+`
|
|
3
3
|
`);for(let t of e){let e=t.status===`disabled`?`○`:`●`,i=t.url.length>n[2]?`${t.url.slice(0,n[2]-1)}…`:t.url,a=t.events.join(`,`),o=a.length>n[3]?`${a.slice(0,n[3]-1)}…`:a;process.stdout.write(r([e,c(t.id),i,o,l(t.createdAt)])+`
|
|
4
4
|
`)}return process.stdout.write(`
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.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-BLrtFOyW.js";import"./data-table-BhKjjiOS.js";import"./bar-NfgovYHe.js";import"./ui-C5Te-OTJ.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;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-BrxmKAnU.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)});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{createRequire as e}from"module";var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),c=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},l=(e,r,i)=>(i=e==null?{}:t(a(e)),c(r||!e||!e.__esModule?n(i,`default`,{value:e,enumerable:!0}):i,e)),u=e(import.meta.url),d=s((exports,t)=>{let n=[`nodebuffer`,`arraybuffer`,`fragments`],r=typeof Blob<`u`;r&&n.push(`blob`),t.exports={BINARY_TYPES:n,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:`258EAFA5-E914-47DA-95CA-C5AB0DC85B11`,hasBlob:r,kForOnEventAttribute:Symbol(`kIsForOnEventAttribute`),kListener:Symbol(`kListener`),kStatusCode:Symbol(`status-code`),kWebSocket:Symbol(`websocket`),NOOP:()=>{}}}),f=s((exports,t)=>{let{EMPTY_BUFFER:n}=d(),r=Buffer[Symbol.species];function i(e,t){if(e.length===0)return n;if(e.length===1)return e[0];let i=Buffer.allocUnsafe(t),a=0;for(let t=0;t<e.length;t++){let n=e[t];i.set(n,a),a+=n.length}return a<t?new r(i.buffer,i.byteOffset,a):i}function a(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[a]^t[a&3]}function o(e,t){for(let n=0;n<e.length;n++)e[n]^=t[n&3]}function s(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)}function c(e){if(c.readOnly=!0,Buffer.isBuffer(e))return e;let t;return e instanceof ArrayBuffer?t=new r(e):ArrayBuffer.isView(e)?t=new r(e.buffer,e.byteOffset,e.byteLength):(t=Buffer.from(e),c.readOnly=!1),t}if(t.exports={concat:i,mask:a,toArrayBuffer:s,toBuffer:c,unmask:o},!process.env.WS_NO_BUFFER_UTIL)try{let e=u(`bufferutil`);t.exports.mask=function(t,n,r,i,o){o<48?a(t,n,r,i,o):e.mask(t,n,r,i,o)},t.exports.unmask=function(t,n){t.length<32?o(t,n):e.unmask(t,n)}}catch{}}),p=s((exports,t)=>{let n=Symbol(`kDone`),r=Symbol(`kRun`);var i=class{constructor(e){this[n]=()=>{this.pending--,this[r]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[r]()}[r](){if(this.pending!==this.concurrency&&this.jobs.length){let e=this.jobs.shift();this.pending++,e(this[n])}}};t.exports=i}),m=s((exports,t)=>{let n=u(`zlib`),r=f(),i=p(),{kStatusCode:a}=d(),o=Buffer[Symbol.species],s=Buffer.from([0,0,255,255]),c=Symbol(`permessage-deflate`),l=Symbol(`total-length`),m=Symbol(`callback`),h=Symbol(`buffers`),g=Symbol(`error`),_;var v=class{constructor(e){if(this._options=e||{},this._threshold=this._options.threshold===void 0?1024:this._options.threshold,this._maxPayload=this._options.maxPayload|0,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,!_){let e=this._options.concurrencyLimit===void 0?10:this._options.concurrencyLimit;_=new i(e)}}static get extensionName(){return`permessage-deflate`}offer(){let e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits??(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let e=this._deflate[m];this._deflate.close(),this._deflate=null,e&&e(Error(`The deflate stream was closed while data was being processed`))}}acceptAsServer(e){let t=this._options,n=e.find(e=>!(t.serverNoContextTakeover===!1&&e.server_no_context_takeover||e.server_max_window_bits&&(t.serverMaxWindowBits===!1||typeof t.serverMaxWindowBits==`number`&&t.serverMaxWindowBits>e.server_max_window_bits)||typeof t.clientMaxWindowBits==`number`&&!e.client_max_window_bits));if(!n)throw Error(`None of the extension offers can be accepted`);return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),typeof t.serverMaxWindowBits==`number`&&(n.server_max_window_bits=t.serverMaxWindowBits),typeof t.clientMaxWindowBits==`number`?n.client_max_window_bits=t.clientMaxWindowBits:(n.client_max_window_bits===!0||t.clientMaxWindowBits===!1)&&delete n.client_max_window_bits,n}acceptAsClient(e){let t=e[0];if(this._options.clientNoContextTakeover===!1&&t.client_no_context_takeover)throw Error(`Unexpected parameter "client_no_context_takeover"`);if(!t.client_max_window_bits)typeof this._options.clientMaxWindowBits==`number`&&(t.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits==`number`&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw Error(`Unexpected or invalid parameter "client_max_window_bits"`);return t}normalizeParams(e){return e.forEach(e=>{Object.keys(e).forEach(t=>{let n=e[t];if(n.length>1)throw Error(`Parameter "${t}" must have only a single value`);if(n=n[0],t===`client_max_window_bits`){if(n!==!0){let e=+n;if(!Number.isInteger(e)||e<8||e>15)throw TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw TypeError(`Invalid value for parameter "${t}": ${n}`)}else if(t===`server_max_window_bits`){let e=+n;if(!Number.isInteger(e)||e<8||e>15)throw TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(t===`client_no_context_takeover`||t===`server_no_context_takeover`){if(n!==!0)throw TypeError(`Invalid value for parameter "${t}": ${n}`)}else throw Error(`Unknown parameter "${t}"`);e[t]=n})}),e}decompress(e,t,n){_.add(r=>{this._decompress(e,t,(e,t)=>{r(),n(e,t)})})}compress(e,t,n){_.add(r=>{this._compress(e,t,(e,t)=>{r(),n(e,t)})})}_decompress(e,t,i){let a=this._isServer?`client`:`server`;if(!this._inflate){let e=`${a}_max_window_bits`,t=typeof this.params[e]==`number`?this.params[e]:n.Z_DEFAULT_WINDOWBITS;this._inflate=n.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[c]=this,this._inflate[l]=0,this._inflate[h]=[],this._inflate.on(`error`,x),this._inflate.on(`data`,b)}this._inflate[m]=i,this._inflate.write(e),t&&this._inflate.write(s),this._inflate.flush(()=>{let e=this._inflate[g];if(e){this._inflate.close(),this._inflate=null,i(e);return}let n=r.concat(this._inflate[h],this._inflate[l]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[l]=0,this._inflate[h]=[],t&&this.params[`${a}_no_context_takeover`]&&this._inflate.reset()),i(null,n)})}_compress(e,t,i){let a=this._isServer?`server`:`client`;if(!this._deflate){let e=`${a}_max_window_bits`,t=typeof this.params[e]==`number`?this.params[e]:n.Z_DEFAULT_WINDOWBITS;this._deflate=n.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[l]=0,this._deflate[h]=[],this._deflate.on(`data`,y)}this._deflate[m]=i,this._deflate.write(e),this._deflate.flush(n.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let e=r.concat(this._deflate[h],this._deflate[l]);t&&(e=new o(e.buffer,e.byteOffset,e.length-4)),this._deflate[m]=null,this._deflate[l]=0,this._deflate[h]=[],t&&this.params[`${a}_no_context_takeover`]&&this._deflate.reset(),i(null,e)})}};t.exports=v;function y(e){this[h].push(e),this[l]+=e.length}function b(e){if(this[l]+=e.length,this[c]._maxPayload<1||this[l]<=this[c]._maxPayload){this[h].push(e);return}this[g]=RangeError(`Max payload size exceeded`),this[g].code=`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`,this[g][a]=1009,this.removeListener(`data`,b),this.reset()}function x(e){if(this[c]._inflate=null,this[g]){this[m](this[g]);return}e[a]=1007,this[m](e)}}),h=s((exports,t)=>{let{isUtf8:n}=u(`buffer`),{hasBlob:r}=d(),i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function a(e){return e>=1e3&&e<=1014&&e!==1004&&e!==1005&&e!==1006||e>=3e3&&e<=4999}function o(e){let t=e.length,n=0;for(;n<t;)if(!(e[n]&128))n++;else if((e[n]&224)==192){if(n+1===t||(e[n+1]&192)!=128||(e[n]&254)==192)return!1;n+=2}else if((e[n]&240)==224){if(n+2>=t||(e[n+1]&192)!=128||(e[n+2]&192)!=128||e[n]===224&&(e[n+1]&224)==128||e[n]===237&&(e[n+1]&224)==160)return!1;n+=3}else if((e[n]&248)==240){if(n+3>=t||(e[n+1]&192)!=128||(e[n+2]&192)!=128||(e[n+3]&192)!=128||e[n]===240&&(e[n+1]&240)==128||e[n]===244&&e[n+1]>143||e[n]>244)return!1;n+=4}else return!1;return!0}function s(e){return r&&typeof e==`object`&&typeof e.arrayBuffer==`function`&&typeof e.type==`string`&&typeof e.stream==`function`&&(e[Symbol.toStringTag]===`Blob`||e[Symbol.toStringTag]===`File`)}if(t.exports={isBlob:s,isValidStatusCode:a,isValidUTF8:o,tokenChars:i},n)t.exports.isValidUTF8=function(e){return e.length<24?o(e):n(e)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let e=u(`utf-8-validate`);t.exports.isValidUTF8=function(t){return t.length<32?o(t):e(t)}}catch{}}),g=s((exports,t)=>{let{Writable:n}=u(`stream`),r=m(),{BINARY_TYPES:i,EMPTY_BUFFER:a,kStatusCode:o,kWebSocket:s}=d(),{concat:c,toArrayBuffer:l,unmask:p}=f(),{isValidStatusCode:g,isValidUTF8:_}=h(),v=Buffer[Symbol.species],y=0,b=1,x=2,S=3,C=4,w=5,T=6;var E=class extends n{constructor(e={}){super(),this._allowSynchronousEvents=e.allowSynchronousEvents===void 0?!0:e.allowSynchronousEvents,this._binaryType=e.binaryType||i[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=e.maxPayload|0,this._skipUTF8Validation=!!e.skipUTF8Validation,this[s]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=y}_write(e,t,n){if(this._opcode===8&&this._state==y)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){let t=this._buffers[0];return this._buffers[0]=new v(t.buffer,t.byteOffset+e,t.length-e),new v(t.buffer,t.byteOffset,e)}let t=Buffer.allocUnsafe(e);do{let n=this._buffers[0],r=t.length-e;e>=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=new v(n.buffer,n.byteOffset+e,n.length-e)),e-=n.length}while(e>0);return t}startLoop(e){this._loop=!0;do switch(this._state){case y:this.getInfo(e);break;case b:this.getPayloadLength16(e);break;case x:this.getPayloadLength64(e);break;case S:this.getMask();break;case C:this.getData(e);break;case w:case T:this._loop=!1;return}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2){this._loop=!1;return}let t=this.consume(2);if(t[0]&48){let t=this.createError(RangeError,`RSV2 and RSV3 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_2_3`);e(t);return}let n=(t[0]&64)==64;if(n&&!this._extensions[r.extensionName]){let t=this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`);e(t);return}if(this._fin=(t[0]&128)==128,this._opcode=t[0]&15,this._payloadLength=t[1]&127,this._opcode===0){if(n){let t=this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`);e(t);return}if(!this._fragmented){let t=this.createError(RangeError,`invalid opcode 0`,!0,1002,`WS_ERR_INVALID_OPCODE`);e(t);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let t=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,`WS_ERR_INVALID_OPCODE`);e(t);return}this._compressed=n}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let t=this.createError(RangeError,`FIN must be set`,!0,1002,`WS_ERR_EXPECTED_FIN`);e(t);return}if(n){let t=this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`);e(t);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let t=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,`WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH`);e(t);return}}else{let t=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,`WS_ERR_INVALID_OPCODE`);e(t);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(t[1]&128)==128,this._isServer){if(!this._masked){let t=this.createError(RangeError,`MASK must be set`,!0,1002,`WS_ERR_EXPECTED_MASK`);e(t);return}}else if(this._masked){let t=this.createError(RangeError,`MASK must be clear`,!0,1002,`WS_ERR_UNEXPECTED_MASK`);e(t);return}this._payloadLength===126?this._state=b:this._payloadLength===127?this._state=x:this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=!1;return}let t=this.consume(8),n=t.readUInt32BE(0);if(n>2**21-1){let t=this.createError(RangeError,`Unsupported WebSocket frame: payload length > 2^53 - 1`,!1,1009,`WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH`);e(t);return}this._payloadLength=n*2**32+t.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let t=this.createError(RangeError,`Max payload size exceeded`,!1,1009,`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`);e(t);return}this._masked?this._state=S:this._state=C}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=C}getData(e){let t=a;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}t=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&p(t,this._mask)}if(this._opcode>7){this.controlMessage(t,e);return}if(this._compressed){this._state=w,this.decompress(t,e);return}t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage(e)}decompress(e,t){let n=this._extensions[r.extensionName];n.decompress(e,this._fin,(e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let e=this.createError(RangeError,`Max payload size exceeded`,!1,1009,`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`);t(e);return}this._fragments.push(n)}this.dataMessage(t),this._state===y&&this.startLoop(t)})}dataMessage(e){if(!this._fin){this._state=y;return}let t=this._messageLength,n=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let r;r=this._binaryType===`nodebuffer`?c(n,t):this._binaryType===`arraybuffer`?l(c(n,t)):this._binaryType===`blob`?new Blob(n):n,this._allowSynchronousEvents?(this.emit(`message`,r,!0),this._state=y):(this._state=T,setImmediate(()=>{this.emit(`message`,r,!0),this._state=y,this.startLoop(e)}))}else{let r=c(n,t);if(!this._skipUTF8Validation&&!_(r)){let t=this.createError(Error,`invalid UTF-8 sequence`,!0,1007,`WS_ERR_INVALID_UTF8`);e(t);return}this._state===w||this._allowSynchronousEvents?(this.emit(`message`,r,!1),this._state=y):(this._state=T,setImmediate(()=>{this.emit(`message`,r,!1),this._state=y,this.startLoop(e)}))}}controlMessage(e,t){if(this._opcode===8){if(e.length===0)this._loop=!1,this.emit(`conclude`,1005,a),this.end();else{let n=e.readUInt16BE(0);if(!g(n)){let e=this.createError(RangeError,`invalid status code ${n}`,!0,1002,`WS_ERR_INVALID_CLOSE_CODE`);t(e);return}let r=new v(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!_(r)){let e=this.createError(Error,`invalid UTF-8 sequence`,!0,1007,`WS_ERR_INVALID_UTF8`);t(e);return}this._loop=!1,this.emit(`conclude`,n,r),this.end()}this._state=y;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?`ping`:`pong`,e),this._state=y):(this._state=T,setImmediate(()=>{this.emit(this._opcode===9?`ping`:`pong`,e),this._state=y,this.startLoop(t)}))}createError(e,t,n,r,i){this._loop=!1,this._errored=!0;let a=new e(n?`Invalid WebSocket frame: ${t}`:t);return Error.captureStackTrace(a,this.createError),a.code=i,a[o]=r,a}};t.exports=E}),_=s((exports,t)=>{let{Duplex:n}=u(`stream`),{randomFillSync:r}=u(`crypto`),i=m(),{EMPTY_BUFFER:a,kWebSocket:o,NOOP:s}=d(),{isBlob:c,isValidStatusCode:l}=h(),{mask:p,toBuffer:g}=f(),_=Symbol(`kByteLength`),v=Buffer.alloc(4),y=8*1024,b,x=y,S=0,C=1,w=2;var T=class e{constructor(e,t,n){this._extensions=t||{},n&&(this._generateMask=n,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=S,this.onerror=s,this[o]=void 0}static frame(e,t){let n,i=!1,a=2,o=!1;t.mask&&(n=t.maskBuffer||v,t.generateMask?t.generateMask(n):(x===y&&(b===void 0&&(b=Buffer.alloc(y)),r(b,0,y),x=0),n[0]=b[x++],n[1]=b[x++],n[2]=b[x++],n[3]=b[x++]),o=(n[0]|n[1]|n[2]|n[3])===0,a=6);let s;typeof e==`string`?(!t.mask||o)&&t[_]!==void 0?s=t[_]:(e=Buffer.from(e),s=e.length):(s=e.length,i=t.mask&&t.readOnly&&!o);let c=s;s>=65536?(a+=8,c=127):s>125&&(a+=2,c=126);let l=Buffer.allocUnsafe(i?s+a:a);return l[0]=t.fin?t.opcode|128:t.opcode,t.rsv1&&(l[0]|=64),l[1]=c,c===126?l.writeUInt16BE(s,2):c===127&&(l[2]=l[3]=0,l.writeUIntBE(s,4,6)),!t.mask||(l[1]|=128,l[a-4]=n[0],l[a-3]=n[1],l[a-2]=n[2],l[a-1]=n[3],o)?[l,e]:i?(p(e,n,l,a,s),[l]):(p(e,n,e,0,s),[l,e])}close(t,n,r,i){let o;if(t===void 0)o=a;else if(typeof t!=`number`||!l(t))throw TypeError(`First argument must be a valid error code number`);else if(n===void 0||!n.length)o=Buffer.allocUnsafe(2),o.writeUInt16BE(t,0);else{let e=Buffer.byteLength(n);if(e>123)throw RangeError(`The message must not be greater than 123 bytes`);o=Buffer.allocUnsafe(2+e),o.writeUInt16BE(t,0),typeof n==`string`?o.write(n,2):o.set(n,2)}let s={[_]:o.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state===S?this.sendFrame(e.frame(o,s),i):this.enqueue([this.dispatch,o,!1,s,i])}ping(t,n,r){let i,a;if(typeof t==`string`?(i=Buffer.byteLength(t),a=!1):c(t)?(i=t.size,a=!1):(t=g(t),i=t.length,a=g.readOnly),i>125)throw RangeError(`The data size must not be greater than 125 bytes`);let o={[_]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:9,readOnly:a,rsv1:!1};c(t)?this._state===S?this.getBlobData(t,!1,o,r):this.enqueue([this.getBlobData,t,!1,o,r]):this._state===S?this.sendFrame(e.frame(t,o),r):this.enqueue([this.dispatch,t,!1,o,r])}pong(t,n,r){let i,a;if(typeof t==`string`?(i=Buffer.byteLength(t),a=!1):c(t)?(i=t.size,a=!1):(t=g(t),i=t.length,a=g.readOnly),i>125)throw RangeError(`The data size must not be greater than 125 bytes`);let o={[_]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:10,readOnly:a,rsv1:!1};c(t)?this._state===S?this.getBlobData(t,!1,o,r):this.enqueue([this.getBlobData,t,!1,o,r]):this._state===S?this.sendFrame(e.frame(t,o),r):this.enqueue([this.dispatch,t,!1,o,r])}send(e,t,n){let r=this._extensions[i.extensionName],a=t.binary?2:1,o=t.compress,s,l;typeof e==`string`?(s=Buffer.byteLength(e),l=!1):c(e)?(s=e.size,l=!1):(e=g(e),s=e.length,l=g.readOnly),this._firstFragment?(this._firstFragment=!1,o&&r&&r.params[r._isServer?`server_no_context_takeover`:`client_no_context_takeover`]&&(o=s>=r._threshold),this._compress=o):(o=!1,a=0),t.fin&&(this._firstFragment=!0);let u={[_]:s,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:a,readOnly:l,rsv1:o};c(e)?this._state===S?this.getBlobData(e,this._compress,u,n):this.enqueue([this.getBlobData,e,this._compress,u,n]):this._state===S?this.dispatch(e,this._compress,u,n):this.enqueue([this.dispatch,e,this._compress,u,n])}getBlobData(t,n,r,i){this._bufferedBytes+=r[_],this._state=w,t.arrayBuffer().then(t=>{if(this._socket.destroyed){let e=Error(`The socket was closed while the blob was being read`);process.nextTick(E,this,e,i);return}this._bufferedBytes-=r[_];let a=g(t);n?this.dispatch(a,n,r,i):(this._state=S,this.sendFrame(e.frame(a,r),i),this.dequeue())}).catch(e=>{process.nextTick(D,this,e,i)})}dispatch(t,n,r,a){if(!n){this.sendFrame(e.frame(t,r),a);return}let o=this._extensions[i.extensionName];this._bufferedBytes+=r[_],this._state=C,o.compress(t,r.fin,(t,n)=>{if(this._socket.destroyed){let e=Error(`The socket was closed while data was being compressed`);E(this,e,a);return}this._bufferedBytes-=r[_],this._state=S,r.readOnly=!1,this.sendFrame(e.frame(n,r),a),this.dequeue()})}dequeue(){for(;this._state===S&&this._queue.length;){let e=this._queue.shift();this._bufferedBytes-=e[3][_],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][_],this._queue.push(e)}sendFrame(e,t){e.length===2?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],t),this._socket.uncork()):this._socket.write(e[0],t)}};t.exports=T;function E(e,t,n){typeof n==`function`&&n(t);for(let n=0;n<e._queue.length;n++){let r=e._queue[n],i=r[r.length-1];typeof i==`function`&&i(t)}}function D(e,t,n){E(e,t,n),e.onerror(t)}}),v=s((exports,t)=>{let{kForOnEventAttribute:n,kListener:r}=d(),i=Symbol(`kCode`),a=Symbol(`kData`),o=Symbol(`kError`),s=Symbol(`kMessage`),c=Symbol(`kReason`),l=Symbol(`kTarget`),u=Symbol(`kType`),f=Symbol(`kWasClean`);var p=class{constructor(e){this[l]=null,this[u]=e}get target(){return this[l]}get type(){return this[u]}};Object.defineProperty(p.prototype,`target`,{enumerable:!0}),Object.defineProperty(p.prototype,`type`,{enumerable:!0});var m=class extends p{constructor(e,t={}){super(e),this[i]=t.code===void 0?0:t.code,this[c]=t.reason===void 0?``:t.reason,this[f]=t.wasClean===void 0?!1:t.wasClean}get code(){return this[i]}get reason(){return this[c]}get wasClean(){return this[f]}};Object.defineProperty(m.prototype,`code`,{enumerable:!0}),Object.defineProperty(m.prototype,`reason`,{enumerable:!0}),Object.defineProperty(m.prototype,`wasClean`,{enumerable:!0});var h=class extends p{constructor(e,t={}){super(e),this[o]=t.error===void 0?null:t.error,this[s]=t.message===void 0?``:t.message}get error(){return this[o]}get message(){return this[s]}};Object.defineProperty(h.prototype,`error`,{enumerable:!0}),Object.defineProperty(h.prototype,`message`,{enumerable:!0});var g=class extends p{constructor(e,t={}){super(e),this[a]=t.data===void 0?null:t.data}get data(){return this[a]}};Object.defineProperty(g.prototype,`data`,{enumerable:!0});let _={addEventListener(e,t,i={}){for(let a of this.listeners(e))if(!i[n]&&a[r]===t&&!a[n])return;let a;if(e===`message`)a=function(e,n){let r=new g(`message`,{data:n?e:e.toString()});r[l]=this,v(t,this,r)};else if(e===`close`)a=function(e,n){let r=new m(`close`,{code:e,reason:n.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[l]=this,v(t,this,r)};else if(e===`error`)a=function(e){let n=new h(`error`,{error:e,message:e.message});n[l]=this,v(t,this,n)};else if(e===`open`)a=function(){let e=new p(`open`);e[l]=this,v(t,this,e)};else return;a[n]=!!i[n],a[r]=t,i.once?this.once(e,a):this.on(e,a)},removeEventListener(e,t){for(let i of this.listeners(e))if(i[r]===t&&!i[n]){this.removeListener(e,i);break}}};t.exports={CloseEvent:m,ErrorEvent:h,Event:p,EventTarget:_,MessageEvent:g};function v(e,t,n){typeof e==`object`&&e.handleEvent?e.handleEvent.call(e,n):e.call(t,n)}}),y=s((exports,t)=>{let{tokenChars:n}=h();function r(e,t,n){e[t]===void 0?e[t]=[n]:e[t].push(n)}function i(e){let t=Object.create(null),i=Object.create(null),a=!1,o=!1,s=!1,c,l,u=-1,d=-1,f=-1,p=0;for(;p<e.length;p++)if(d=e.charCodeAt(p),c===void 0)if(f===-1&&n[d]===1)u===-1&&(u=p);else if(p!==0&&(d===32||d===9))f===-1&&u!==-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p);let n=e.slice(u,f);d===44?(r(t,n,i),i=Object.create(null)):c=n,u=f=-1}else throw SyntaxError(`Unexpected character at index ${p}`);else if(l===void 0)if(f===-1&&n[d]===1)u===-1&&(u=p);else if(d===32||d===9)f===-1&&u!==-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p),r(i,e.slice(u,f),!0),d===44&&(r(t,c,i),i=Object.create(null),c=void 0),u=f=-1}else if(d===61&&u!==-1&&f===-1)l=e.slice(u,p),u=f=-1;else throw SyntaxError(`Unexpected character at index ${p}`);else if(o){if(n[d]!==1)throw SyntaxError(`Unexpected character at index ${p}`);u===-1?u=p:a||=!0,o=!1}else if(s)if(n[d]===1)u===-1&&(u=p);else if(d===34&&u!==-1)s=!1,f=p;else if(d===92)o=!0;else throw SyntaxError(`Unexpected character at index ${p}`);else if(d===34&&e.charCodeAt(p-1)===61)s=!0;else if(f===-1&&n[d]===1)u===-1&&(u=p);else if(u!==-1&&(d===32||d===9))f===-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p);let n=e.slice(u,f);a&&(n=n.replace(/\\/g,``),a=!1),r(i,l,n),d===44&&(r(t,c,i),i=Object.create(null),c=void 0),l=void 0,u=f=-1}else throw SyntaxError(`Unexpected character at index ${p}`);if(u===-1||s||d===32||d===9)throw SyntaxError(`Unexpected end of input`);f===-1&&(f=p);let m=e.slice(u,f);return c===void 0?r(t,m,i):(l===void 0?r(i,m,!0):a?r(i,l,m.replace(/\\/g,``)):r(i,l,m),r(t,c,i)),t}function a(e){return Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>[t].concat(Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>e===!0?t:`${t}=${e}`).join(`; `)})).join(`; `)).join(`, `)}).join(`, `)}t.exports={format:a,parse:i}}),b=s((exports,t)=>{let n=u(`events`),r=u(`https`),i=u(`http`),a=u(`net`),o=u(`tls`),{randomBytes:s,createHash:c}=u(`crypto`),{Duplex:l,Readable:p}=u(`stream`),{URL:b}=u(`url`),x=m(),S=g(),C=_(),{isBlob:w}=h(),{BINARY_TYPES:T,CLOSE_TIMEOUT:E,EMPTY_BUFFER:D,GUID:O,kForOnEventAttribute:k,kListener:A,kStatusCode:j,kWebSocket:M,NOOP:N}=d(),{EventTarget:{addEventListener:P,removeEventListener:F}}=v(),{format:ee,parse:te}=y(),{toBuffer:ne}=f(),I=Symbol(`kAborted`),L=[8,13],R=[`CONNECTING`,`OPEN`,`CLOSING`,`CLOSED`],z=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;var B=class e extends n{constructor(t,n,r){super(),this._binaryType=T[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=D,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol=``,this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,t===null?(this._autoPong=r.autoPong,this._closeTimeout=r.closeTimeout,this._isServer=!0):(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,n===void 0?n=[]:Array.isArray(n)||(typeof n==`object`&&n?(r=n,n=[]):n=[n]),V(this,t,n,r))}get binaryType(){return this._binaryType}set binaryType(e){T.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,n,r){let i=new S({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),a=new C(t,this._extensions,r.generateMask);this._receiver=i,this._sender=a,this._socket=t,i[M]=this,a[M]=this,t[M]=this,i.on(`conclude`,re),i.on(`drain`,ie),i.on(`error`,ae),i.on(`message`,oe),i.on(`ping`,se),i.on(`pong`,ce),a.onerror=le,t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),n.length>0&&t.unshift(n),t.on(`close`,X),t.on(`data`,Z),t.on(`end`,Q),t.on(`error`,$),this._readyState=e.OPEN,this.emit(`open`)}emitClose(){if(!this._socket){this._readyState=e.CLOSED,this.emit(`close`,this._closeCode,this._closeMessage);return}this._extensions[x.extensionName]&&this._extensions[x.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit(`close`,this._closeCode,this._closeMessage)}close(t,n){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){let e=`WebSocket was closed before the connection was established`;G(this,this._req,e);return}if(this.readyState===e.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=e.CLOSING,this._sender.close(t,n,!this._isServer,e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),Y(this)}}pause(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!0,this._socket.pause())}ping(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof t==`function`?(r=t,t=n=void 0):typeof n==`function`&&(r=n,n=void 0),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){K(this,t,r);return}n===void 0&&(n=!this._isServer),this._sender.ping(t||D,n,r)}pong(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof t==`function`?(r=t,t=n=void 0):typeof n==`function`&&(r=n,n=void 0),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){K(this,t,r);return}n===void 0&&(n=!this._isServer),this._sender.pong(t||D,n,r)}resume(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof n==`function`&&(r=n,n={}),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){K(this,t,r);return}let i={binary:typeof t!=`string`,mask:!this._isServer,compress:!0,fin:!0,...n};this._extensions[x.extensionName]||(i.compress=!1),this._sender.send(t||D,i,r)}terminate(){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){let e=`WebSocket was closed before the connection was established`;G(this,this._req,e);return}this._socket&&(this._readyState=e.CLOSING,this._socket.destroy())}}};Object.defineProperty(B,`CONNECTING`,{enumerable:!0,value:R.indexOf(`CONNECTING`)}),Object.defineProperty(B.prototype,`CONNECTING`,{enumerable:!0,value:R.indexOf(`CONNECTING`)}),Object.defineProperty(B,`OPEN`,{enumerable:!0,value:R.indexOf(`OPEN`)}),Object.defineProperty(B.prototype,`OPEN`,{enumerable:!0,value:R.indexOf(`OPEN`)}),Object.defineProperty(B,`CLOSING`,{enumerable:!0,value:R.indexOf(`CLOSING`)}),Object.defineProperty(B.prototype,`CLOSING`,{enumerable:!0,value:R.indexOf(`CLOSING`)}),Object.defineProperty(B,`CLOSED`,{enumerable:!0,value:R.indexOf(`CLOSED`)}),Object.defineProperty(B.prototype,`CLOSED`,{enumerable:!0,value:R.indexOf(`CLOSED`)}),[`binaryType`,`bufferedAmount`,`extensions`,`isPaused`,`protocol`,`readyState`,`url`].forEach(e=>{Object.defineProperty(B.prototype,e,{enumerable:!0})}),[`open`,`error`,`close`,`message`].forEach(e=>{Object.defineProperty(B.prototype,`on${e}`,{enumerable:!0,get(){for(let t of this.listeners(e))if(t[k])return t[A];return null},set(t){for(let t of this.listeners(e))if(t[k]){this.removeListener(e,t);break}typeof t==`function`&&this.addEventListener(e,t,{[k]:!0})}})}),B.prototype.addEventListener=P,B.prototype.removeEventListener=F,t.exports=B;function V(e,t,n,a){let o={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:E,protocolVersion:L[1],maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...a,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:`GET`,host:void 0,path:void 0,port:void 0};if(e._autoPong=o.autoPong,e._closeTimeout=o.closeTimeout,!L.includes(o.protocolVersion))throw RangeError(`Unsupported protocol version: ${o.protocolVersion} (supported versions: ${L.join(`, `)})`);let l;if(t instanceof b)l=t;else try{l=new b(t)}catch{throw SyntaxError(`Invalid URL: ${t}`)}l.protocol===`http:`?l.protocol=`ws:`:l.protocol===`https:`&&(l.protocol=`wss:`),e._url=l.href;let u=l.protocol===`wss:`,d=l.protocol===`ws+unix:`,f;if(l.protocol!==`ws:`&&!u&&!d?f=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:d&&!l.pathname?f=`The URL's pathname is empty`:l.hash&&(f=`The URL contains a fragment identifier`),f){let t=SyntaxError(f);if(e._redirects===0)throw t;H(e,t);return}let p=u?443:80,m=s(16).toString(`base64`),h=u?r.request:i.request,g=new Set,_;if(o.createConnection=o.createConnection||(u?W:U),o.defaultPort=o.defaultPort||p,o.port=l.port||p,o.host=l.hostname.startsWith(`[`)?l.hostname.slice(1,-1):l.hostname,o.headers={...o.headers,"Sec-WebSocket-Version":o.protocolVersion,"Sec-WebSocket-Key":m,Connection:`Upgrade`,Upgrade:`websocket`},o.path=l.pathname+l.search,o.timeout=o.handshakeTimeout,o.perMessageDeflate&&(_=new x({...o.perMessageDeflate,isServer:!1,maxPayload:o.maxPayload}),o.headers[`Sec-WebSocket-Extensions`]=ee({[x.extensionName]:_.offer()})),n.length){for(let e of n){if(typeof e!=`string`||!z.test(e)||g.has(e))throw SyntaxError(`An invalid or duplicated subprotocol was specified`);g.add(e)}o.headers[`Sec-WebSocket-Protocol`]=n.join(`,`)}if(o.origin&&(o.protocolVersion<13?o.headers[`Sec-WebSocket-Origin`]=o.origin:o.headers.Origin=o.origin),(l.username||l.password)&&(o.auth=`${l.username}:${l.password}`),d){let e=o.path.split(`:`);o.socketPath=e[0],o.path=e[1]}let v;if(o.followRedirects){if(e._redirects===0){e._originalIpc=d,e._originalSecure=u,e._originalHostOrSocketPath=d?o.socketPath:l.host;let t=a&&a.headers;if(a={...a,headers:{}},t)for(let[e,n]of Object.entries(t))a.headers[e.toLowerCase()]=n}else if(e.listenerCount(`redirect`)===0){let t=d?e._originalIpc?o.socketPath===e._originalHostOrSocketPath:!1:e._originalIpc?!1:l.host===e._originalHostOrSocketPath;(!t||e._originalSecure&&!u)&&(delete o.headers.authorization,delete o.headers.cookie,t||delete o.headers.host,o.auth=void 0)}o.auth&&!a.headers.authorization&&(a.headers.authorization=`Basic `+Buffer.from(o.auth).toString(`base64`)),v=e._req=h(o),e._redirects&&e.emit(`redirect`,e.url,v)}else v=e._req=h(o);o.timeout&&v.on(`timeout`,()=>{G(e,v,`Opening handshake has timed out`)}),v.on(`error`,t=>{v===null||v[I]||(v=e._req=null,H(e,t))}),v.on(`response`,r=>{let i=r.headers.location,s=r.statusCode;if(i&&o.followRedirects&&s>=300&&s<400){if(++e._redirects>o.maxRedirects){G(e,v,`Maximum redirects exceeded`);return}v.abort();let r;try{r=new b(i,t)}catch{let t=SyntaxError(`Invalid URL: ${i}`);H(e,t);return}V(e,r,n,a)}else e.emit(`unexpected-response`,v,r)||G(e,v,`Unexpected server response: ${r.statusCode}`)}),v.on(`upgrade`,(t,n,r)=>{if(e.emit(`upgrade`,t),e.readyState!==B.CONNECTING)return;v=e._req=null;let i=t.headers.upgrade;if(i===void 0||i.toLowerCase()!==`websocket`){G(e,n,`Invalid Upgrade header`);return}let a=c(`sha1`).update(m+O).digest(`base64`);if(t.headers[`sec-websocket-accept`]!==a){G(e,n,`Invalid Sec-WebSocket-Accept header`);return}let s=t.headers[`sec-websocket-protocol`],l;if(s===void 0?g.size&&(l=`Server sent no subprotocol`):g.size?g.has(s)||(l=`Server sent an invalid subprotocol`):l=`Server sent a subprotocol but none was requested`,l){G(e,n,l);return}s&&(e._protocol=s);let u=t.headers[`sec-websocket-extensions`];if(u!==void 0){if(!_){let t=`Server sent a Sec-WebSocket-Extensions header but no extension was requested`;G(e,n,t);return}let t;try{t=te(u)}catch{let t=`Invalid Sec-WebSocket-Extensions header`;G(e,n,t);return}let r=Object.keys(t);if(r.length!==1||r[0]!==x.extensionName){let t=`Server indicated an extension that was not requested`;G(e,n,t);return}try{_.accept(t[x.extensionName])}catch{let t=`Invalid Sec-WebSocket-Extensions header`;G(e,n,t);return}e._extensions[x.extensionName]=_}e.setSocket(n,r,{allowSynchronousEvents:o.allowSynchronousEvents,generateMask:o.generateMask,maxPayload:o.maxPayload,skipUTF8Validation:o.skipUTF8Validation})}),o.finishRequest?o.finishRequest(v,e):v.end()}function H(e,t){e._readyState=B.CLOSING,e._errorEmitted=!0,e.emit(`error`,t),e.emitClose()}function U(e){return e.path=e.socketPath,a.connect(e)}function W(e){return e.path=void 0,!e.servername&&e.servername!==``&&(e.servername=a.isIP(e.host)?``:e.host),o.connect(e)}function G(e,t,n){e._readyState=B.CLOSING;let r=Error(n);Error.captureStackTrace(r,G),t.setHeader?(t[I]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick(H,e,r)):(t.destroy(r),t.once(`error`,e.emit.bind(e,`error`)),t.once(`close`,e.emitClose.bind(e)))}function K(e,t,n){if(t){let n=w(t)?t.size:ne(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(n){let t=Error(`WebSocket is not open: readyState ${e.readyState} (${R[e.readyState]})`);process.nextTick(n,t)}}function re(e,t){let n=this[M];n._closeFrameReceived=!0,n._closeMessage=t,n._closeCode=e,n._socket[M]!==void 0&&(n._socket.removeListener(`data`,Z),process.nextTick(J,n._socket),e===1005?n.close():n.close(e,t))}function ie(){let e=this[M];e.isPaused||e._socket.resume()}function ae(e){let t=this[M];t._socket[M]!==void 0&&(t._socket.removeListener(`data`,Z),process.nextTick(J,t._socket),t.close(e[j])),t._errorEmitted||(t._errorEmitted=!0,t.emit(`error`,e))}function q(){this[M].emitClose()}function oe(e,t){this[M].emit(`message`,e,t)}function se(e){let t=this[M];t._autoPong&&t.pong(e,!this._isServer,N),t.emit(`ping`,e)}function ce(e){this[M].emit(`pong`,e)}function J(e){e.resume()}function le(e){let t=this[M];t.readyState!==B.CLOSED&&(t.readyState===B.OPEN&&(t._readyState=B.CLOSING,Y(t)),this._socket.end(),t._errorEmitted||(t._errorEmitted=!0,t.emit(`error`,e)))}function Y(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),e._closeTimeout)}function X(){let e=this[M];if(this.removeListener(`close`,X),this.removeListener(`data`,Z),this.removeListener(`end`,Q),e._readyState=B.CLOSING,!this._readableState.endEmitted&&!e._closeFrameReceived&&!e._receiver._writableState.errorEmitted&&this._readableState.length!==0){let t=this.read(this._readableState.length);e._receiver.write(t)}e._receiver.end(),this[M]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on(`error`,q),e._receiver.on(`finish`,q))}function Z(e){this[M]._receiver.write(e)||this.pause()}function Q(){let e=this[M];e._readyState=B.CLOSING,e._receiver.end(),this.end()}function $(){let e=this[M];this.removeListener(`error`,$),this.on(`error`,N),e&&(e._readyState=B.CLOSING,this.destroy())}}),x=l(b(),1),S=s((exports,t)=>{let n=b(),{Duplex:r}=u(`stream`);function i(e){e.emit(`close`)}function a(){!this.destroyed&&this._writableState.finished&&this.destroy()}function o(e){this.removeListener(`error`,o),this.destroy(),this.listenerCount(`error`)===0&&this.emit(`error`,e)}function s(e,t){let n=!0,s=new r({...t,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return e.on(`message`,function(t,n){let r=!n&&s._readableState.objectMode?t.toString():t;s.push(r)||e.pause()}),e.once(`error`,function(e){s.destroyed||(n=!1,s.destroy(e))}),e.once(`close`,function(){s.destroyed||s.push(null)}),s._destroy=function(t,r){if(e.readyState===e.CLOSED){r(t),process.nextTick(i,s);return}let a=!1;e.once(`error`,function(e){a=!0,r(e)}),e.once(`close`,function(){a||r(t),process.nextTick(i,s)}),n&&e.terminate()},s._final=function(t){if(e.readyState===e.CONNECTING){e.once(`open`,function(){s._final(t)});return}e._socket!==null&&(e._socket._writableState.finished?(t(),s._readableState.endEmitted&&s.destroy()):(e._socket.once(`finish`,function(){t()}),e.close()))},s._read=function(){e.isPaused&&e.resume()},s._write=function(t,n,r){if(e.readyState===e.CONNECTING){e.once(`open`,function(){s._write(t,n,r)});return}e.send(t,r)},s.on(`end`,a),s.on(`error`,o),s}t.exports=s}),C=s((exports,t)=>{let{tokenChars:n}=h();function r(e){let t=new Set,r=-1,i=-1,a=0;for(;a<e.length;a++){let o=e.charCodeAt(a);if(i===-1&&n[o]===1)r===-1&&(r=a);else if(a!==0&&(o===32||o===9))i===-1&&r!==-1&&(i=a);else if(o===44){if(r===-1)throw SyntaxError(`Unexpected character at index ${a}`);i===-1&&(i=a);let n=e.slice(r,i);if(t.has(n))throw SyntaxError(`The "${n}" subprotocol is duplicated`);t.add(n),r=i=-1}else throw SyntaxError(`Unexpected character at index ${a}`)}if(r===-1||i!==-1)throw SyntaxError(`Unexpected end of input`);let o=e.slice(r,a);if(t.has(o))throw SyntaxError(`The "${o}" subprotocol is duplicated`);return t.add(o),t}t.exports={parse:r}}),w=s((exports,t)=>{let n=u(`events`),r=u(`http`),{Duplex:i}=u(`stream`),{createHash:a}=u(`crypto`),o=y(),s=m(),c=C(),l=b(),{CLOSE_TIMEOUT:f,GUID:p,kWebSocket:h}=d(),g=/^[+/0-9A-Za-z]{22}==$/,_=0,v=1,x=2;var S=class extends n{constructor(e,t){if(super(),e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:f,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:l,...e},e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer)throw TypeError(`One and only one of the "port", "server", or "noServer" options must be specified`);if(e.port==null?e.server&&(this._server=e.server):(this._server=r.createServer((e,t)=>{let n=r.STATUS_CODES[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":`text/plain`}),t.end(n)}),this._server.listen(e.port,e.host,e.backlog,t)),this._server){let e=this.emit.bind(this,`connection`);this._removeListeners=w(this._server,{listening:this.emit.bind(this,`listening`),error:this.emit.bind(this,`error`),upgrade:(t,n,r)=>{this.handleUpgrade(t,n,r,e)}})}e.perMessageDeflate===!0&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=_}address(){if(this.options.noServer)throw Error(`The server is operating in "noServer" mode`);return this._server?this._server.address():null}close(e){if(this._state===x){e&&this.once(`close`,()=>{e(Error(`The server is not running`))}),process.nextTick(T,this);return}if(e&&this.once(`close`,e),this._state!==v)if(this._state=v,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(T,this);else{let e=this._server;this._removeListeners(),this._removeListeners=this._server=null,e.close(()=>{T(this)})}}shouldHandle(e){if(this.options.path){let t=e.url.indexOf(`?`),n=t===-1?e.url:e.url.slice(0,t);if(n!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on(`error`,E);let i=e.headers[`sec-websocket-key`],a=e.headers.upgrade,l=+e.headers[`sec-websocket-version`];if(e.method!==`GET`){let n=`Invalid HTTP method`;O(this,e,t,405,n);return}if(a===void 0||a.toLowerCase()!==`websocket`){let n=`Invalid Upgrade header`;O(this,e,t,400,n);return}if(i===void 0||!g.test(i)){let n=`Missing or invalid Sec-WebSocket-Key header`;O(this,e,t,400,n);return}if(l!==13&&l!==8){let n=`Missing or invalid Sec-WebSocket-Version header`;O(this,e,t,400,n,{"Sec-WebSocket-Version":`13, 8`});return}if(!this.shouldHandle(e)){D(t,400);return}let u=e.headers[`sec-websocket-protocol`],d=new Set;if(u!==void 0)try{d=c.parse(u)}catch{let n=`Invalid Sec-WebSocket-Protocol header`;O(this,e,t,400,n);return}let f=e.headers[`sec-websocket-extensions`],p={};if(this.options.perMessageDeflate&&f!==void 0){let n=new s({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let e=o.parse(f);e[s.extensionName]&&(n.accept(e[s.extensionName]),p[s.extensionName]=n)}catch{let n=`Invalid or unacceptable Sec-WebSocket-Extensions header`;O(this,e,t,400,n);return}}if(this.options.verifyClient){let a={origin:e.headers[`${l===8?`sec-websocket-origin`:`origin`}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(a,(a,o,s,c)=>{if(!a)return D(t,o||401,s,c);this.completeUpgrade(p,i,d,e,t,n,r)});return}if(!this.options.verifyClient(a))return D(t,401)}this.completeUpgrade(p,i,d,e,t,n,r)}completeUpgrade(e,t,n,r,i,c,l){if(!i.readable||!i.writable)return i.destroy();if(i[h])throw Error(`server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration`);if(this._state>_)return D(i,503);let u=a(`sha1`).update(t+p).digest(`base64`),d=[`HTTP/1.1 101 Switching Protocols`,`Upgrade: websocket`,`Connection: Upgrade`,`Sec-WebSocket-Accept: ${u}`],f=new this.options.WebSocket(null,void 0,this.options);if(n.size){let e=this.options.handleProtocols?this.options.handleProtocols(n,r):n.values().next().value;e&&(d.push(`Sec-WebSocket-Protocol: ${e}`),f._protocol=e)}if(e[s.extensionName]){let t=e[s.extensionName].params,n=o.format({[s.extensionName]:[t]});d.push(`Sec-WebSocket-Extensions: ${n}`),f._extensions=e}this.emit(`headers`,d,r),i.write(d.concat(`\r
|
|
2
|
+
`).join(`\r
|
|
3
|
+
`)),i.removeListener(`error`,E),f.setSocket(i,c,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(f),f.on(`close`,()=>{this.clients.delete(f),this._shouldEmitClose&&!this.clients.size&&process.nextTick(T,this)})),l(f,r)}};t.exports=S;function w(e,t){for(let n of Object.keys(t))e.on(n,t[n]);return function(){for(let n of Object.keys(t))e.removeListener(n,t[n])}}function T(e){e._state=x,e.emit(`close`)}function E(){this.destroy()}function D(e,t,n,i){n||=r.STATUS_CODES[t],i={Connection:`close`,"Content-Type":`text/html`,"Content-Length":Buffer.byteLength(n),...i},e.once(`finish`,e.destroy),e.end(`HTTP/1.1 ${t} ${r.STATUS_CODES[t]}\r\n`+Object.keys(i).map(e=>`${e}: ${i[e]}`).join(`\r
|
|
4
|
+
`)+`\r
|
|
5
|
+
\r
|
|
6
|
+
`+n)}function O(e,t,n,r,i,a){if(e.listenerCount(`wsClientError`)){let r=Error(i);Error.captureStackTrace(r,O),e.emit(`wsClientError`,r,n,t)}else D(n,r,i,a)}}),T=x.default,E=x.default;export{E as WebSocket,T as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=[500,1e3,2e3,4e3,8e3,16e3,32e3,6e4];let t=null;async function n(){if(t)return t;let e=globalThis.WebSocket;if(typeof e==`function`)return t=e,e;try{let e=await import(`./wrapper-Dl9i0Nh7.js`),n=e.default??e.WebSocket;if(!n)throw Error(`ws package missing default export`);return t=n,n}catch(e){throw Error(`WebSocket unavailable: install Node 22+ or add the 'ws' dependency (${e.message})`)}}function r(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??Error(`aborted`));return}let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason??Error(`aborted`))};t?.addEventListener(`abort`,a,{once:!0})})}function i(t){return e[Math.min(t-1,e.length-1)]??6e4}function a(e,t){if(!t)return e;let n=e.includes(`?`)?`&`:`?`;return`${e}${n}access_token=${encodeURIComponent(t)}`}async function o(e,t,n,r){let i=a(e,n),o;try{o=n?new t(i,{headers:{Authorization:`Bearer ${n}`}}):new t(i)}catch(e){throw Error(`ws connect failed: ${e.message}`)}return await new Promise((e,t)=>{let n=!1,i=()=>{n||(n=!0,c(),e({socket:o,open:!0}))},a=e=>{if(n)return;n=!0,c();let r=e?.message??(typeof e==`string`?e:`ws connection error`);t(Error(r))},s=()=>{if(!n){n=!0,c();try{o.close()}catch{}t(r?.reason??Error(`aborted`))}},c=()=>{o.onopen=null,o.onerror=null,r?.removeEventListener(`abort`,s)};o.onopen=i,o.onerror=a,r?.addEventListener(`abort`,s,{once:!0})})}async function*s(e){let t=e.webSocketImpl??await n(),a=e.pingIntervalMs??3e4,s=e.maxReconnectAttempts??10,c=0;for(;;){if(e.signal?.aborted)return;let n;try{n=await o(e.url,t,e.bearer,e.signal)}catch(t){if(e.signal?.aborted)return;if(c++,c>s)throw t;let n=i(c);e.onReconnect?.(c,n);try{await r(n,e.signal)}catch{return}continue}yield{type:`open`};let l=[],u=[],d=!1,f=Date.now(),p=!1,m=e=>{f=Date.now();let t=u.shift();t?t(e):l.push(e)},h=()=>{if(!d)for(d=!0;u.length;)u.shift()(null)};n.socket.onmessage=e=>{m({type:`message`,data:e.data})},n.socket.onclose=()=>{m({type:`close`}),h()},n.socket.onerror=e=>{let t=e?.message??`ws error`;m({type:`error`,data:t})};let g=()=>{try{n.socket.close()}catch{}h()};e.signal?.addEventListener(`abort`,g,{once:!0});let _=null;a>0&&(_=setInterval(()=>{if(Date.now()-f>a*1.5){try{n.socket.close()}catch{}h()}},Math.max(1e3,Math.floor(a/2))));try{for(;;){if(e.signal?.aborted)return;let t;if(t=l.length>0?l.shift():d?null:await new Promise(e=>u.push(e)),t===null||(t.type===`message`&&(p=!0),yield t,t.type===`close`))break}}finally{_&&clearInterval(_),e.signal?.removeEventListener(`abort`,g);try{n.socket.close()}catch{}}if(e.signal?.aborted)return;if(p&&(c=0),c++,c>s)throw Error(`ws connection exceeded reconnect cap`);let v=i(c);e.onReconnect?.(c,v);try{await r(v,e.signal)}catch{return}}}var c=class{opts;ac=null;socket=null;running=!1;constructor(e){this.opts=e}async start(e){this.running=!0,this.ac=new AbortController;let t=l(this.ac.signal,this.opts.signal),a=this.opts.webSocketImpl??await n(),s=this.opts.maxReconnectAttempts??10,c=0;for(;this.running;){if(t.aborted)return;let n;try{n=await o(this.opts.url,a,this.opts.bearer,t)}catch(e){if(t.aborted)return;if(c++,c>s)throw e;let n=i(c);this.opts.onReconnect?.(c,n);try{await r(n,t)}catch{return}continue}this.socket=n.socket;let l=!1;if(await new Promise(r=>{n.socket.onmessage=t=>{l=!0;let r=typeof t.data==`string`?t.data:String(t.data),i=null;try{i=JSON.parse(r)}catch{return}!i||typeof i.correlationId!=`string`||e(i).then(e=>{let t={correlationId:i.correlationId,status:e.status,headers:e.headers,body:e.body};try{n.socket.send(JSON.stringify(t))}catch{}}).catch(e=>{let t={correlationId:i.correlationId,status:502,body:JSON.stringify({error:e.message})};try{n.socket.send(JSON.stringify(t))}catch{}})},n.socket.onclose=()=>r(),n.socket.onerror=()=>r(),t.addEventListener(`abort`,()=>{try{n.socket.close()}catch{}r()},{once:!0})}),this.socket=null,t.aborted||!this.running)return;if(l&&(c=0),c++,c>s)throw Error(`ws tunnel exceeded reconnect cap`);let u=i(c);this.opts.onReconnect?.(c,u);try{await r(u,t)}catch{return}}}async stop(){this.running=!1,this.ac?.abort();try{this.socket?.close()}catch{}this.socket=null}};function l(e,t){if(!t)return e;let n=new AbortController,r=()=>n.abort(e.reason),i=()=>n.abort(t.reason);return e.aborted?n.abort(e.reason):e.addEventListener(`abort`,r,{once:!0}),t.aborted?n.abort(t.reason):t.addEventListener(`abort`,i,{once:!0}),n.signal}export{c as WsTunnelClient,s as connectWs};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenovay/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Zenovay CLI — AI install wizard + full terminal analytics dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -28,14 +28,12 @@
|
|
|
28
28
|
"test:smoke": "vitest run tests/smoke --testTimeout=60000",
|
|
29
29
|
"test:update-golden": "UPDATE_GOLDEN=1 vitest run tests/e2e",
|
|
30
30
|
"render:globe": "tsx scripts/render-globe.ts",
|
|
31
|
-
"smoke": "bash scripts/smoke-test.sh"
|
|
32
|
-
"prepare": "husky install"
|
|
31
|
+
"smoke": "bash scripts/smoke-test.sh"
|
|
33
32
|
},
|
|
34
33
|
"dependencies": {
|
|
35
|
-
"@hono/node-server": "^1.14.0",
|
|
36
34
|
"cac": "^6.7.14",
|
|
37
35
|
"chalk": "^5.4.1",
|
|
38
|
-
"diff": "^
|
|
36
|
+
"diff": "^8.0.3",
|
|
39
37
|
"globby": "^14.1.0",
|
|
40
38
|
"ink": "^5.1.0",
|
|
41
39
|
"ink-gradient": "^3.0.0",
|
|
@@ -45,12 +43,12 @@
|
|
|
45
43
|
"open": "^10.1.0",
|
|
46
44
|
"react": "^18.3.1",
|
|
47
45
|
"semver": "^7.6.3",
|
|
46
|
+
"string-width": "^7.2.0",
|
|
48
47
|
"ulid": "^2.3.0",
|
|
49
48
|
"zod": "^3.23.8"
|
|
50
49
|
},
|
|
51
50
|
"devDependencies": {
|
|
52
51
|
"@aws-sdk/client-s3": "^3.1036.0",
|
|
53
|
-
"@types/diff": "^7.0.0",
|
|
54
52
|
"@types/node": "^22.10.0",
|
|
55
53
|
"@types/react": "^18.3.12",
|
|
56
54
|
"@types/semver": "^7.5.8",
|
|
@@ -58,7 +56,6 @@
|
|
|
58
56
|
"@vitest/coverage-v8": "^2.1.8",
|
|
59
57
|
"csv-parse": "^6.2.1",
|
|
60
58
|
"eslint": "^9.16.0",
|
|
61
|
-
"husky": "^9.1.7",
|
|
62
59
|
"ink-testing-library": "^4.0.0",
|
|
63
60
|
"react-devtools-core": "^4.19.1",
|
|
64
61
|
"tsdown": "^0.9.0",
|
|
@@ -70,6 +67,11 @@
|
|
|
70
67
|
"node": ">=20.0.0"
|
|
71
68
|
},
|
|
72
69
|
"packageManager": "pnpm@9.15.9",
|
|
70
|
+
"pnpm": {
|
|
71
|
+
"overrides": {
|
|
72
|
+
"ws@>=8.0.0 <8.21.0": ">=8.21.0"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
73
75
|
"author": "Zenovay <cli@zenovay.com>",
|
|
74
76
|
"license": "SEE LICENSE IN LICENSE",
|
|
75
77
|
"homepage": "https://cli.zenovay.com",
|