@zenovay/cli 0.1.29 → 0.1.31
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/bin.js +1 -1
- package/dist/globe-ictHskbW.js +1 -0
- package/package.json +2 -1
- package/dist/globe-b9L8CaxI.js +0 -1
package/dist/bin.js
CHANGED
|
@@ -4,5 +4,5 @@ import{configDir as e,readConfig as t}from"./config-Cmi_f_SY.js";import{manifest
|
|
|
4
4
|
`),t(!0))},_);try{process.stdin.resume(),process.stdin.on(`data`,r)}catch{i(),t(!0)}})}function M(e){try{let t=e.slice(1),n=s(process.execPath,t,{stdio:`inherit`});n.on(`exit`,e=>{process.exit(typeof e==`number`?e:0)}),n.on(`error`,()=>{})}catch{}}function N(e){if(process.env.ZENOVAY_DEBUG_UPDATE===`1`)try{process.stderr.write(`zenovay: ${e}\n`)}catch{}}function P(e){let t=process.env.HOME??process.env.USERPROFILE??``;return t&&e.includes(t)?e.split(t).join(`~`):e}function F(e){if(e instanceof i){let t=e.status,n=P(e.message),r=e.body,i=typeof r==`object`&&!!r&&(r.message??r.error)||void 0,a=i?P(String(i)):n;if(t===401){let e=/no\s+token|missing\s+(token|auth)|not\s+(logged|authenticated)/i.test(n);return{type:`error`,code:e?`auth_required`:`auth_invalid`,message:a,hint:e?"Run `zenovay login` to authenticate.":"Your session expired. Run `zenovay login` to re-authenticate."}}if(t===402){let e=r?.upgradeUrl??r?.upgrade_url??`https://app.zenovay.com/billing`;return{type:`error`,code:`tier_insufficient`,message:a,hint:`Upgrade your plan: ${e}`}}if(t===404)return{type:`error`,code:`not_found`,message:a};if(t===400||t===422)return{type:`error`,code:`validation_failed`,message:a,hint:`Check the command flags and arguments.`};if(t===429)return{type:`error`,code:`rate_limited`,message:a,hint:`You hit a rate limit. Wait a moment and retry.`};if(t===409){let e=/idempot/i.test(n)||/idempot/i.test(String(i??``));return e?{type:`error`,code:`idempotency_replay`,message:a,hint:`Same idempotency key was used for a different request body.`}:{type:`error`,code:`unknown`,message:a}}return t>=500&&t<600?{type:`error`,code:`server_error`,message:a,hint:`Server-side issue. Try again shortly or check status.zenovay.com.`}:{type:`error`,code:`unknown`,message:a}}let t=e,n=t?.code??t?.cause?.code;if(n===`ENOTFOUND`||n===`ECONNREFUSED`||n===`ETIMEDOUT`||n===`EAI_AGAIN`)return{type:`error`,code:`network_error`,message:P(String(t?.message??n)),hint:`Check your internet connection and try again.`};if(e instanceof Error){let t=P(e.message);return/abort/i.test(t),{type:`error`,code:`unknown`,message:t}}return{type:`error`,code:`unknown`,message:typeof e==`string`?P(e):`An unknown error occurred.`}}const I=c.dirname(l(import.meta.url)),L=c.join(I,`..`,`package.json`),R=JSON.parse(d(L,`utf8`)),z=R.version,B=process.argv[0]??`zenovay`;function V(){if(process.env.ZENOVAY_BACKGROUND_UPDATE===`1`&&!(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`))try{let e=c.join(I,`lib`,`update`,`worker.js`),t=o(e,[],{detached:!0,stdio:`ignore`});t.unref()}catch{}}const H=a(`zenovay`);H.version(z),H.help(),H.option(`-q, --quiet`,`Suppress spinners + interactive UI; implies --json`),H.option(`--team <name-or-id>`,"Team override for this command (alternative to `zenovay teams switch`)"),(process.argv.includes(`-q`)||process.argv.includes(`--quiet`))&&(process.env.ZENOVAY_FORMAT=`json`,process.argv.includes(`--json`)||process.argv.push(`--json`));const U=process.argv.findIndex(e=>e===`--team`);if(U!==-1&&process.argv[U+1]&&(process.env.ZENOVAY_TEAM_ID=process.argv[U+1]),!process.env.ZENOVAY_TEAM_ID)try{let e=process.env.HOME??process.env.USERPROFILE??``,t=c.join(e,`.config`,`zenovay`,`config.json`),n=d(t,`utf8`),r=JSON.parse(n);r.currentTeamId&&(process.env.ZENOVAY_TEAM_ID=r.currentTeamId)}catch{}H.command(`init`,`AI install wizard — add Zenovay tracking to your codebase`).option(`--json`,`Emit NDJSON events to stdout`).option(`--yes`,`Auto-approve all diffs (for CI)`).option(`--skip-mcp`,`Skip MCP client install`).option(`--skip-verify`,`Skip first-event verification`).action(async e=>{let{initCommand:t}=await import(`./init-CJ1Py9a8.js`),n=await t({cliVersion:z,cwd:process.cwd(),json:e.json,yes:e.yes,skipMcp:e.skipMcp,skipVerify:e.skipVerify});process.exitCode=n}),H.command(`login`,`Authenticate via OAuth device flow`).option(`--json`,`Emit NDJSON events`).option(`--no-browser`,`Skip opening the browser automatically`).action(async e=>{let{loginCommand:t}=await import(`./login-B_CW06vS.js`),n=await t({cliVersion:z,json:e.json,openBrowser:e.browser!==!1,onCode:e=>{process.stdout.write(`\n Open this URL to authorize the CLI:\n ${e.verificationUriComplete??e.verificationUri}\n Or enter code: ${e.userCode}\n\n`)}});!e.json&&n.email?process.stdout.write(`\n ✔ Logged in as ${n.email}\n Try \`zenovay overview\` to see your dashboard, or \`zenovay --help\` for the full command list.\n\n`):e.json||process.stdout.write(`
|
|
5
5
|
✔ Logged in.
|
|
6
6
|
|
|
7
|
-
`)}),H.command(`logout`,`Revoke current session and delete local auth`).option(`--json`,``).action(async e=>{let{logoutCommand:t}=await import(`./logout-1ohk4uie.js`);await t({cliVersion:z,json:e.json})}),H.command(`ai`,`3-mode AI assistant (install / chat / mcp)`).option(`--mode <mode>`,`install | chat | mcp`).option(`--json`,``).action(async e=>{let{aiCommand:t}=await import(`./ai-B8r28ZBm.js`),n=await t({cliVersion:z,cwd:process.cwd(),mode:e.mode,json:e.json});process.exitCode=n}),H.command(`watch`,"[ANALYTICS] Alias for `analytics` (dashboard summary)").option(`--site-id <id>`,`Site ID`).option(`--interval <ms>`,`Poll interval ms (legacy; ignored by analytics)`,{default:15e3}).option(`--json`,``).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-akHOj-51.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`analytics`,`[ANALYTICS] Landing dashboard — visitors, pageviews, bounce, top pages`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-akHOj-51.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`overview`,"[ANALYTICS] Alias for `analytics` (kept for back-compat with V1 scripts)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-akHOj-51.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`home`,`[ACCOUNT] Top-level summary — sites + this-week deltas`).option(`--json`,``).action(async e=>{let{homeCommand:t}=await import(`./home-CtsY-gj0.js`);process.exitCode=await t({cliVersion:z,json:e.json})}),H.command(`live`,`[ANALYTICS] Real-time visitors + globe + recent events (2s polling)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-k32y1phk.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`pages`,`[ANALYTICS] Top pages by views — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{pagesCommand:t}=await import(`./pages-CAYP4Abn.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`devices`,`[ANALYTICS] Device / browser / OS breakdown — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{devicesCommand:t}=await import(`./devices-C8xVqaBs.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`geo`,`[ANALYTICS] Countries + cities + globe — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{geoCommand:t}=await import(`./geo-BaCNZ7-S.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`retention`,`[BEHAVIOR] Cohort retention heatmap — D1 / D7 / D30 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{retentionCommand:t}=await import(`./retention-DQPI6wVN.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`uptime`,`[BEHAVIOR] Uptime monitors with status + p95 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{uptimeCommand:t}=await import(`./uptime-DACm8Hdh.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`sessions`,`[BEHAVIOR] Recent session-replay list (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{sessionsCommand:t}=await import(`./sessions-Dv-Z29cQ.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`heatmaps`,`[BEHAVIOR] Recent heatmap captures (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{heatmapsCommand:t}=await import(`./heatmaps-e1Q72VWJ.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`journeys`,`[BEHAVIOR] Page-to-page transition flow (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{journeysCommand:t}=await import(`./journeys-zPmCha98.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`insights`,`[INTELLIGENCE] AI-generated anomaly / trend / recommendation cards (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-wx3wIgGV.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`events tail`,`Stream live events`).option(`--site-id <id>`,`Site ID`,{default:``}).option(`--filter <expr>`,`Filter expression (e.g. 'type=pageview AND country=US')`).option(`--forward-to <url>`,`POST each event to a webhook with HMAC-SHA256 signature`).option(`--replay-24h`,`Replay the last 24h before going live`).option(`--set-forward-secret <hex>`,`Persist the HMAC secret used by --forward-to`).option(`--json`,``).action(async e=>{let{eventsTailCommand:t}=await import(`./events-tail-CXJUK5ka.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json,filter:e.filter,forwardTo:e.forwardTo,replay24h:e.replay24h,setForwardSecret:e.setForwardSecret});process.exitCode=n}),H.command(`health`,`Run self-diagnostic checks`).option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-DfgPNC1A.js`),n=await t({cliVersion:z,binaryPath:B,json:e.json});process.exitCode=n}),H.command(`doctor`,`AI-assisted self-healing`).option(`--json`,``).action(async e=>{let{doctorCommand:t}=await import(`./doctor-K37xh3M7.js`),n=await t({cliVersion:z,binaryPath:B,json:e.json});process.exitCode=n}),H.command(`stats`,`One-shot dashboard summary (scriptable by default)`).option(`--site-id <id>`,`Site ID`).option(`--range <range>`,`Time range: 24h | 7d | 30d`,{default:`24h`}).option(`--watch`,`Auto-refresh every 60s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{statsCommand:t}=await import(`./stats-DRy2d3At.js`),n=await t({cliVersion:z,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`sources`,`Traffic source breakdown with delta arrows`).option(`--site-id <id>`,`Site ID`).option(`--period <p>`,`Period: 7d | 30d | 90d | 1y`,{default:`30d`}).option(`--compare <c>`,`Comparison window (use "prev" for period-over-period)`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{sourcesCommand:t}=await import(`./sources-DL_o-kkA.js`),n=await t({cliVersion:z,siteId:e.siteId,period:e.period,compare:e.compare,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`vitals`,`Core Web Vitals dashboard (LCP / INP / CLS / TTFB / FCP)`).option(`--site-id <id>`,`Site ID`).option(`--url <path>`,`Filter to a single URL`).option(`--device <type>`,`Filter by device: mobile | desktop`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`7d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{vitalsCommand:t}=await import(`./vitals-lpeK0mbA.js`),n=await t({cliVersion:z,siteId:e.siteId,url:e.url,device:e.device,window:e.window,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`revenue`,`MRR / ARR / transaction series`).option(`--site-id <id>`,`Site ID`).option(`--range <r>`,`Time range: 24h | 7d | 30d | 1y`,{default:`30d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{revenueCommand:t}=await import(`./revenue-CD1YwoZj.js`),n=await t({cliVersion:z,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`funnels`,`List available funnels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-nm9X3Od7.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`themes`,`List available themes with colored swatches`).option(`--validate <path>`,`Validate a custom theme JSON file`).option(`--json`,`Emit themes JSON to stdout`).action(async e=>{let{themesCommand:t}=await import(`./themes-CRvhjrRx.js`),n=await t({cliVersion:z,validate:e.validate,json:e.json});process.exitCode=n}),H.command(`completions [shell]`,`Emit shell-completion script (bash | zsh | fish | nushell | pwsh)`).option(`--list`,`List supported shells`).action(async(e,t)=>{let{completionsCommand:n}=await import(`./completions-CXAOfyWo.js`),r=await n({shell:e,list:t.list});process.exitCode=r}),H.command(`query [sql]`,`Restricted SQL REPL over the analytics schema (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--max-rows <n>`,`Cap result row count`,{default:1e3}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{queryCommand:n}=await import(`./query-X38xyHCI.js`),r=await n({cliVersion:z,siteId:t.siteId,sql:e,maxRows:typeof t.maxRows==`string`?Number(t.maxRows):t.maxRows,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),H.command(`companies`,`B2B identification feed (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max rows`,{default:100}).option(`--new-only`,`Show only newly identified companies (first-seen in last hour)`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-BToqUnFi.js`),n=await t({cliVersion:z,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,newOnly:e.newOnly,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`projects`,`List your tracked projects`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{projectsCommand:t}=await import(`./projects-BC8pmo7u.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`deploys`,`Recent GitHub commits overlaid on charts (Wave 4 W5)`).option(`--site-id <id>`,`Site ID`).option(`--branch <name>`,`Filter to a single branch (e.g. main, develop)`).option(`--since <iso>`,`Only commits after this ISO timestamp`).option(`--limit <n>`,`Max rows`,{default:50}).option(`--connect`,`Print the GitHub-integration deep link in app.zenovay.com`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{deploysCommand:t}=await import(`./deploys-CgNr5r7M.js`),n=await t({cliVersion:z,siteId:e.siteId,branch:e.branch,since:e.since,limit:typeof e.limit==`string`?Number(e.limit):e.limit,connect:e.connect,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`webhooks forward`,`Forward webhook events to a local URL (stripe-listen-style; W3)`).option(`--to <url>`,`Local URL to POST events to (e.g. localhost:3000/webhook)`).option(`--site-id <id>`,`Site ID`).option(`--sign`,`HMAC-sign each forwarded request with X-Zenovay-Signature`).option(`--secret <hex>`,`HMAC secret (auto-derived from tunnel key if --sign without --secret)`).option(`--max-retries <n>`,`Per-request retry count`,{default:3}).action(async e=>{let{webhooksForwardCommand:t}=await import(`./webhooks-forward-BUoKx2Dz.js`),n=await t({cliVersion:z,to:e.to,siteId:e.siteId,sign:e.sign,secret:e.secret,maxRetries:typeof e.maxRetries==`string`?Number(e.maxRetries):e.maxRetries});process.exitCode=n}),H.command(`errors`,`Recent error snapshot (Wave 2 lead-in; SSE coming in V2.1)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max errors to fetch`,{default:100}).option(`--search <q>`,`Filter by class or message substring`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{errorsCommand:t}=await import(`./errors-BXwphY11.js`),n=await t({cliVersion:z,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,search:e.search,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`funnel <id>`,`Funnel drop-off chart for a specific funnel`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 7d | 30d`,{default:`30d`}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{funnelCommand:n}=await import(`./funnel-nm9X3Od7.js`),r=await n({cliVersion:z,siteId:t.siteId,funnelId:e,window:t.window,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),H.command(`api-keys [action] [id]`,`[MANAGE] api-keys list | create [--name --scope] | delete <id>`).option(`--name <n>`,`Human-readable label (create)`).option(`--scope <scope>`,`read | write (create)`,{default:`read`}).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{apiKeysCommand:r}=await import(`./api-keys-DsQR075b.js`),i=e??`list`;process.exitCode=await r({cliVersion:z,action:i,id:t,name:n.name,scope:n.scope===`write`?`write`:`read`,yes:n.yes,json:n.json})}),H.command(`domains [action] [arg]`,`[MANAGE] domains list | add <url> [--name] | delete <id>`).option(`--name <n>`,`Friendly project name (add; default: domain itself)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{domainsCommand:r}=await import(`./domains-Bfx2vdwv.js`),i=e??`list`;process.exitCode=await r({cliVersion:z,action:i,url:i===`add`?t:void 0,id:i===`delete`?t:void 0,name:n.name,yes:n.yes,json:n.json})}),H.command(`team [action] [arg] [arg2]`,`[MANAGE] team list | invite <email> [--role] | remove <userId> | role <userId> <admin|member> (Pro+)`).option(`--role <role>`,`admin | member (invite)`,{default:`member`}).option(`--yes`,`Skip confirmation (remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{teamCommand:i}=await import(`./team-Bg-ggtky.js`),a=e??`list`,o;a===`role`?o=n===`admin`?`admin`:`member`:a===`invite`&&(o=r.role===`admin`?`admin`:`member`),process.exitCode=await i({cliVersion:z,action:a,email:a===`invite`?t:void 0,userId:a===`remove`||a===`role`?t:void 0,role:o,yes:r.yes,json:r.json})}),H.command(`profile [action]`,`[ACCOUNT] profile show | edit [--name --notifications]`).option(`--name <n>`,`New display name (edit)`).option(`--notifications <pref>`,`email | none (edit)`).option(`--json`,``).action(async(e,t)=>{let n=e??`show`,r=t.notifications===`email`||t.notifications===`none`?t.notifications:void 0,{profileCommand:i}=await import(`./profile-DQJdZ-s_.js`);process.exitCode=await i({cliVersion:z,action:n,name:t.name,notifications:r,json:t.json})}),H.command(`plans [action] [arg] [arg2]`,`[ACCOUNT] plans info | upgrade <pro|scale> | cancel --yes | payment update`).option(`--yes`,"Required for `cancel`").option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`info`,{plansCommand:a}=await import(`./plans-D8aqF_lo.js`),o;if(i===`upgrade`&&t){let e=String(t).toLowerCase();(e===`pro`||e===`scale`||e===`enterprise`)&&(o=e)}let s=i===`payment`&&t===`update`||i===`payment`?`update`:void 0;process.exitCode=await a({cliVersion:z,action:i,targetPlan:o,paymentAction:s,yes:r.yes,json:r.json})}),H.command(`billing [action]`,"[ACCOUNT] Alias for `plans info`").option(`--json`,``).action(async(e,t)=>{let{plansCommand:n}=await import(`./plans-D8aqF_lo.js`);process.exitCode=await n({cliVersion:z,action:`info`,json:t.json})}),H.command(`settings [action] [key] [value]`,`[ACCOUNT] settings get [key] | set <key> <value>`).option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`get`,{settingsCommand:a}=await import(`./settings-BsczzB3M.js`);process.exitCode=await a({cliVersion:z,action:i,key:t||void 0,value:n||void 0,json:r.json})}),H.command(`integrations [action] [name]`,`[ACCOUNT] integrations list | connect <gsc|github> | disconnect <gsc|github>`).option(`--yes`,`Skip confirmation (disconnect)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=t===`gsc`||t===`github`?t:void 0,{integrationsCommand:a}=await import(`./integrations-B6IO1dM0.js`);process.exitCode=await a({cliVersion:z,action:r,name:i,yes:n.yes,json:n.json})}),H.command(`goals [action] [id]`,`[ACCOUNT] goals list | create [--name --type --target] | delete <id> (Pro+)`).option(`--name <n>`,`Goal name (create)`).option(`--type <t>`,`pageview | event (create)`).option(`--target <v>`,`URL pattern or event name (create)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=n.type===`event`||n.type===`pageview`?n.type:void 0,{goalsCommand:a}=await import(`./goals-D1qL286b.js`);process.exitCode=await a({cliVersion:z,action:r,id:t,name:n.name,type:i,target:n.target,yes:n.yes,json:n.json})}),H.command(`notes [action] [id]`,`[ACCOUNT] notes list | create [--content --site-id] | delete <id>`).option(`--content <text>`,`Note body (create)`).option(`--site-id <id>`,`Attach to a specific site (create; defaults to current)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{notesCommand:i}=await import(`./notes-Cepz-K00.js`);process.exitCode=await i({cliVersion:z,action:r,id:t,content:n.content,siteId:n.siteId,yes:n.yes,json:n.json})}),H.command(`agency [action] [arg] [arg2]`,`[ACCOUNT] agency clients list | clients add [--email --name] | clients remove <id> | report send <clientId> (Scale+)`).option(`--email <e>`,`Client contact email (clients add)`).option(`--name <n>`,`Client name (clients add)`).option(`--yes`,`Skip confirmation (clients remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{agencyCommand:i}=await import(`./agency-DEixFVRT.js`),a=`clients-list`,o;e===`clients`?t===`add`?a=`clients-add`:t===`remove`?(a=`clients-remove`,o=n):a=`clients-list`:e===`report`&&t===`send`&&(a=`report-send`,o=n),process.exitCode=await i({cliVersion:z,action:a,id:o,email:r.email,name:r.name,yes:r.yes,json:r.json})}),H.command(`analytics live`,"[ANALYTICS] Alias for `live`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-k32y1phk.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics funnels`,"[ANALYTICS] Alias for `funnels`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-nm9X3Od7.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics goals`,"[ANALYTICS] Alias for `goals list` (Pro+)").option(`--json`,``).action(async e=>{let{goalsCommand:t}=await import(`./goals-D1qL286b.js`);process.exitCode=await t({cliVersion:z,action:`list`,json:e.json})}),H.command(`analytics insights`,"[ANALYTICS] Alias for `insights` (Pro+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-wx3wIgGV.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics profiles`,"[ANALYTICS] User-profiles list (NOT `profile`, which is current-user)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{visitorsCommand:t}=await import(`./visitors-CrF-_BuG.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics companies`,"[ANALYTICS] Alias for `companies` (Scale+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-BToqUnFi.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`use [site]`,`Set / show / reset your default site (used when --site-id is omitted)`).option(`--reset`,`Clear the stored default site`).option(`--show`,`Print the current default and exit`).option(`--json`,`Emit JSON`).action(async(e,t)=>{let{useCommand:n}=await import(`./use-DJ0b_xNo.js`),r=await n({cliVersion:z,match:e,reset:t.reset,show:t.show,json:t.json});process.exitCode=r}),H.command(`update`,`Manually install the latest version`).option(`--check`,`Don't install — just print latest`).option(`--force-downgrade`,`Allow downgrading to an older version`).option(`--no-update-check`,`Disable auto-update for this invocation`).option(`--json`,``).action(async e=>{let{updateCommand:t}=await import(`./update-DWBRR_PD.js`);await t({cliVersion:z,binaryPath:B,check:e.check,forceDowngrade:e.forceDowngrade,json:e.json})}),H.command(`usage`,`[ACCOUNT] Current month events vs plan limits + headcounts`).option(`--json`,``).action(async e=>{let{usageCommand:t}=await import(`./usage-BhLXHEkY.js`);process.exitCode=await t({cliVersion:z,json:e.json})}),H.command(`globe`,`[ANALYTICS] Live globe — visitors plotted by country with flag labels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{globeCommand:t}=await import(`./globe-b9L8CaxI.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`webhooks [action] [arg]`,`[MANAGE] webhooks list | add <url> [--events] | delete <id> | rotate <id> | test <id>`).option(`--events <list>`,`Comma-separated event types (add)`).option(`--yes`,`Skip confirmation (delete/rotate)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{webhooksCommand:i}=await import(`./webhooks-Ddhz2P7n.js`);process.exitCode=await i({cliVersion:z,action:r,url:r===`add`?t:void 0,id:r===`delete`||r===`rotate`||r===`test`?t:void 0,events:n.events,yes:n.yes,json:n.json})}),H.command(`audit [action]`,`[ACCOUNT] audit list [--since --action --actor] | export [--format --out] (Pro+)`).option(`--since <window>`,`Window like 24h, 7d, 30d (list)`,{default:`7d`}).option(`--action <pattern>`,`Filter by action string (list)`).option(`--actor <userId>`,`Filter by actor user ID (list)`).option(`--format <fmt>`,`ndjson | csv | json (export)`,{default:`ndjson`}).option(`--out <file>`,`Output file path (export). Defaults to stdout`).option(`--json`,``).action(async(e,t)=>{let n=e??`list`,r=t.format===`csv`||t.format===`json`?t.format:`ndjson`,{auditCommand:i}=await import(`./audit-CfOJ3rNW.js`);process.exitCode=await i({cliVersion:z,action:n,since:t.since,filterAction:t.action,actor:t.actor,format:r,out:t.out,json:t.json})}),H.command(`share [action]`,`[ACCOUNT] share enable | disable | url — public dashboard share for the current site`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--yes`,`Skip confirmation (disable)`).option(`--json`,``).action(async(e,t)=>{let n=e??`url`,{shareCommand:r}=await import(`./share-BQjP_Anq.js`);process.exitCode=await r({cliVersion:z,action:n,siteId:t.siteId,yes:t.yes,json:t.json})}),H.command(`commands`,`Emit the machine-readable command tree (for AI agents and shell-completion regen)`).option(`--json`,``).action(async e=>{let{commandsCommand:t}=await import(`./commands-DbkdKFGz.js`);process.exitCode=await t({cliVersion:z,json:e.json})}),H.command(`teams [action] [arg]`,`[ACCOUNT] teams list | switch <name-or-id> | current | reset`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{teamsCommand:i}=await import(`./teams-Dvh7_Gkg.js`);process.exitCode=await i({cliVersion:z,action:r,match:r===`switch`?t:void 0,json:n.json})}),H.parse(process.argv,{run:!1}),(async()=>{await T({binaryPath:B,currentVersion:z,argv:process.argv}),V();try{let e=H.matchedCommand,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`));if(!e&&t.length>0&&(process.stderr.write(`Unknown command: \`${t.join(` `)}\`\nRun \`zenovay --help\` to see all commands.\n`),process.exit(2)),!e&&t.length===0&&!process.argv.includes(`--help`)&&!process.argv.includes(`-h`)){H.outputHelp();return}await H.runMatchedCommand()}catch(e){let t=F(e),n=process.env.ZENOVAY_FORMAT===`json`||process.argv.includes(`--json`)||process.argv.includes(`-q`)||process.argv.includes(`--quiet`);n?process.stderr.write(JSON.stringify(t)+`
|
|
7
|
+
`)}),H.command(`logout`,`Revoke current session and delete local auth`).option(`--json`,``).action(async e=>{let{logoutCommand:t}=await import(`./logout-1ohk4uie.js`);await t({cliVersion:z,json:e.json})}),H.command(`ai`,`3-mode AI assistant (install / chat / mcp)`).option(`--mode <mode>`,`install | chat | mcp`).option(`--json`,``).action(async e=>{let{aiCommand:t}=await import(`./ai-B8r28ZBm.js`),n=await t({cliVersion:z,cwd:process.cwd(),mode:e.mode,json:e.json});process.exitCode=n}),H.command(`watch`,"[ANALYTICS] Alias for `analytics` (dashboard summary)").option(`--site-id <id>`,`Site ID`).option(`--interval <ms>`,`Poll interval ms (legacy; ignored by analytics)`,{default:15e3}).option(`--json`,``).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-akHOj-51.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`analytics`,`[ANALYTICS] Landing dashboard — visitors, pageviews, bounce, top pages`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-akHOj-51.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`overview`,"[ANALYTICS] Alias for `analytics` (kept for back-compat with V1 scripts)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-akHOj-51.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`home`,`[ACCOUNT] Top-level summary — sites + this-week deltas`).option(`--json`,``).action(async e=>{let{homeCommand:t}=await import(`./home-CtsY-gj0.js`);process.exitCode=await t({cliVersion:z,json:e.json})}),H.command(`live`,`[ANALYTICS] Real-time visitors + globe + recent events (2s polling)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-k32y1phk.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`pages`,`[ANALYTICS] Top pages by views — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{pagesCommand:t}=await import(`./pages-CAYP4Abn.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`devices`,`[ANALYTICS] Device / browser / OS breakdown — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{devicesCommand:t}=await import(`./devices-C8xVqaBs.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`geo`,`[ANALYTICS] Countries + cities + globe — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{geoCommand:t}=await import(`./geo-BaCNZ7-S.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`retention`,`[BEHAVIOR] Cohort retention heatmap — D1 / D7 / D30 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{retentionCommand:t}=await import(`./retention-DQPI6wVN.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`uptime`,`[BEHAVIOR] Uptime monitors with status + p95 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{uptimeCommand:t}=await import(`./uptime-DACm8Hdh.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`sessions`,`[BEHAVIOR] Recent session-replay list (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{sessionsCommand:t}=await import(`./sessions-Dv-Z29cQ.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`heatmaps`,`[BEHAVIOR] Recent heatmap captures (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{heatmapsCommand:t}=await import(`./heatmaps-e1Q72VWJ.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`journeys`,`[BEHAVIOR] Page-to-page transition flow (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{journeysCommand:t}=await import(`./journeys-zPmCha98.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`insights`,`[INTELLIGENCE] AI-generated anomaly / trend / recommendation cards (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-wx3wIgGV.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json});process.exitCode=n}),H.command(`events tail`,`Stream live events`).option(`--site-id <id>`,`Site ID`,{default:``}).option(`--filter <expr>`,`Filter expression (e.g. 'type=pageview AND country=US')`).option(`--forward-to <url>`,`POST each event to a webhook with HMAC-SHA256 signature`).option(`--replay-24h`,`Replay the last 24h before going live`).option(`--set-forward-secret <hex>`,`Persist the HMAC secret used by --forward-to`).option(`--json`,``).action(async e=>{let{eventsTailCommand:t}=await import(`./events-tail-CXJUK5ka.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json,filter:e.filter,forwardTo:e.forwardTo,replay24h:e.replay24h,setForwardSecret:e.setForwardSecret});process.exitCode=n}),H.command(`health`,`Run self-diagnostic checks`).option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-DfgPNC1A.js`),n=await t({cliVersion:z,binaryPath:B,json:e.json});process.exitCode=n}),H.command(`doctor`,`AI-assisted self-healing`).option(`--json`,``).action(async e=>{let{doctorCommand:t}=await import(`./doctor-K37xh3M7.js`),n=await t({cliVersion:z,binaryPath:B,json:e.json});process.exitCode=n}),H.command(`stats`,`One-shot dashboard summary (scriptable by default)`).option(`--site-id <id>`,`Site ID`).option(`--range <range>`,`Time range: 24h | 7d | 30d`,{default:`24h`}).option(`--watch`,`Auto-refresh every 60s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{statsCommand:t}=await import(`./stats-DRy2d3At.js`),n=await t({cliVersion:z,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`sources`,`Traffic source breakdown with delta arrows`).option(`--site-id <id>`,`Site ID`).option(`--period <p>`,`Period: 7d | 30d | 90d | 1y`,{default:`30d`}).option(`--compare <c>`,`Comparison window (use "prev" for period-over-period)`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{sourcesCommand:t}=await import(`./sources-DL_o-kkA.js`),n=await t({cliVersion:z,siteId:e.siteId,period:e.period,compare:e.compare,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`vitals`,`Core Web Vitals dashboard (LCP / INP / CLS / TTFB / FCP)`).option(`--site-id <id>`,`Site ID`).option(`--url <path>`,`Filter to a single URL`).option(`--device <type>`,`Filter by device: mobile | desktop`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`7d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{vitalsCommand:t}=await import(`./vitals-lpeK0mbA.js`),n=await t({cliVersion:z,siteId:e.siteId,url:e.url,device:e.device,window:e.window,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`revenue`,`MRR / ARR / transaction series`).option(`--site-id <id>`,`Site ID`).option(`--range <r>`,`Time range: 24h | 7d | 30d | 1y`,{default:`30d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{revenueCommand:t}=await import(`./revenue-CD1YwoZj.js`),n=await t({cliVersion:z,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`funnels`,`List available funnels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-nm9X3Od7.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`themes`,`List available themes with colored swatches`).option(`--validate <path>`,`Validate a custom theme JSON file`).option(`--json`,`Emit themes JSON to stdout`).action(async e=>{let{themesCommand:t}=await import(`./themes-CRvhjrRx.js`),n=await t({cliVersion:z,validate:e.validate,json:e.json});process.exitCode=n}),H.command(`completions [shell]`,`Emit shell-completion script (bash | zsh | fish | nushell | pwsh)`).option(`--list`,`List supported shells`).action(async(e,t)=>{let{completionsCommand:n}=await import(`./completions-CXAOfyWo.js`),r=await n({shell:e,list:t.list});process.exitCode=r}),H.command(`query [sql]`,`Restricted SQL REPL over the analytics schema (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--max-rows <n>`,`Cap result row count`,{default:1e3}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{queryCommand:n}=await import(`./query-X38xyHCI.js`),r=await n({cliVersion:z,siteId:t.siteId,sql:e,maxRows:typeof t.maxRows==`string`?Number(t.maxRows):t.maxRows,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),H.command(`companies`,`B2B identification feed (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max rows`,{default:100}).option(`--new-only`,`Show only newly identified companies (first-seen in last hour)`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-BToqUnFi.js`),n=await t({cliVersion:z,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,newOnly:e.newOnly,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`projects`,`List your tracked projects`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{projectsCommand:t}=await import(`./projects-BC8pmo7u.js`),n=await t({cliVersion:z,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`deploys`,`Recent GitHub commits overlaid on charts (Wave 4 W5)`).option(`--site-id <id>`,`Site ID`).option(`--branch <name>`,`Filter to a single branch (e.g. main, develop)`).option(`--since <iso>`,`Only commits after this ISO timestamp`).option(`--limit <n>`,`Max rows`,{default:50}).option(`--connect`,`Print the GitHub-integration deep link in app.zenovay.com`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{deploysCommand:t}=await import(`./deploys-CgNr5r7M.js`),n=await t({cliVersion:z,siteId:e.siteId,branch:e.branch,since:e.since,limit:typeof e.limit==`string`?Number(e.limit):e.limit,connect:e.connect,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`webhooks forward`,`Forward webhook events to a local URL (stripe-listen-style; W3)`).option(`--to <url>`,`Local URL to POST events to (e.g. localhost:3000/webhook)`).option(`--site-id <id>`,`Site ID`).option(`--sign`,`HMAC-sign each forwarded request with X-Zenovay-Signature`).option(`--secret <hex>`,`HMAC secret (auto-derived from tunnel key if --sign without --secret)`).option(`--max-retries <n>`,`Per-request retry count`,{default:3}).action(async e=>{let{webhooksForwardCommand:t}=await import(`./webhooks-forward-BUoKx2Dz.js`),n=await t({cliVersion:z,to:e.to,siteId:e.siteId,sign:e.sign,secret:e.secret,maxRetries:typeof e.maxRetries==`string`?Number(e.maxRetries):e.maxRetries});process.exitCode=n}),H.command(`errors`,`Recent error snapshot (Wave 2 lead-in; SSE coming in V2.1)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max errors to fetch`,{default:100}).option(`--search <q>`,`Filter by class or message substring`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{errorsCommand:t}=await import(`./errors-BXwphY11.js`),n=await t({cliVersion:z,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,search:e.search,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),H.command(`funnel <id>`,`Funnel drop-off chart for a specific funnel`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 7d | 30d`,{default:`30d`}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{funnelCommand:n}=await import(`./funnel-nm9X3Od7.js`),r=await n({cliVersion:z,siteId:t.siteId,funnelId:e,window:t.window,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),H.command(`api-keys [action] [id]`,`[MANAGE] api-keys list | create [--name --scope] | delete <id>`).option(`--name <n>`,`Human-readable label (create)`).option(`--scope <scope>`,`read | write (create)`,{default:`read`}).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{apiKeysCommand:r}=await import(`./api-keys-DsQR075b.js`),i=e??`list`;process.exitCode=await r({cliVersion:z,action:i,id:t,name:n.name,scope:n.scope===`write`?`write`:`read`,yes:n.yes,json:n.json})}),H.command(`domains [action] [arg]`,`[MANAGE] domains list | add <url> [--name] | delete <id>`).option(`--name <n>`,`Friendly project name (add; default: domain itself)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{domainsCommand:r}=await import(`./domains-Bfx2vdwv.js`),i=e??`list`;process.exitCode=await r({cliVersion:z,action:i,url:i===`add`?t:void 0,id:i===`delete`?t:void 0,name:n.name,yes:n.yes,json:n.json})}),H.command(`team [action] [arg] [arg2]`,`[MANAGE] team list | invite <email> [--role] | remove <userId> | role <userId> <admin|member> (Pro+)`).option(`--role <role>`,`admin | member (invite)`,{default:`member`}).option(`--yes`,`Skip confirmation (remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{teamCommand:i}=await import(`./team-Bg-ggtky.js`),a=e??`list`,o;a===`role`?o=n===`admin`?`admin`:`member`:a===`invite`&&(o=r.role===`admin`?`admin`:`member`),process.exitCode=await i({cliVersion:z,action:a,email:a===`invite`?t:void 0,userId:a===`remove`||a===`role`?t:void 0,role:o,yes:r.yes,json:r.json})}),H.command(`profile [action]`,`[ACCOUNT] profile show | edit [--name --notifications]`).option(`--name <n>`,`New display name (edit)`).option(`--notifications <pref>`,`email | none (edit)`).option(`--json`,``).action(async(e,t)=>{let n=e??`show`,r=t.notifications===`email`||t.notifications===`none`?t.notifications:void 0,{profileCommand:i}=await import(`./profile-DQJdZ-s_.js`);process.exitCode=await i({cliVersion:z,action:n,name:t.name,notifications:r,json:t.json})}),H.command(`plans [action] [arg] [arg2]`,`[ACCOUNT] plans info | upgrade <pro|scale> | cancel --yes | payment update`).option(`--yes`,"Required for `cancel`").option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`info`,{plansCommand:a}=await import(`./plans-D8aqF_lo.js`),o;if(i===`upgrade`&&t){let e=String(t).toLowerCase();(e===`pro`||e===`scale`||e===`enterprise`)&&(o=e)}let s=i===`payment`&&t===`update`||i===`payment`?`update`:void 0;process.exitCode=await a({cliVersion:z,action:i,targetPlan:o,paymentAction:s,yes:r.yes,json:r.json})}),H.command(`billing [action]`,"[ACCOUNT] Alias for `plans info`").option(`--json`,``).action(async(e,t)=>{let{plansCommand:n}=await import(`./plans-D8aqF_lo.js`);process.exitCode=await n({cliVersion:z,action:`info`,json:t.json})}),H.command(`settings [action] [key] [value]`,`[ACCOUNT] settings get [key] | set <key> <value>`).option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`get`,{settingsCommand:a}=await import(`./settings-BsczzB3M.js`);process.exitCode=await a({cliVersion:z,action:i,key:t||void 0,value:n||void 0,json:r.json})}),H.command(`integrations [action] [name]`,`[ACCOUNT] integrations list | connect <gsc|github> | disconnect <gsc|github>`).option(`--yes`,`Skip confirmation (disconnect)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=t===`gsc`||t===`github`?t:void 0,{integrationsCommand:a}=await import(`./integrations-B6IO1dM0.js`);process.exitCode=await a({cliVersion:z,action:r,name:i,yes:n.yes,json:n.json})}),H.command(`goals [action] [id]`,`[ACCOUNT] goals list | create [--name --type --target] | delete <id> (Pro+)`).option(`--name <n>`,`Goal name (create)`).option(`--type <t>`,`pageview | event (create)`).option(`--target <v>`,`URL pattern or event name (create)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=n.type===`event`||n.type===`pageview`?n.type:void 0,{goalsCommand:a}=await import(`./goals-D1qL286b.js`);process.exitCode=await a({cliVersion:z,action:r,id:t,name:n.name,type:i,target:n.target,yes:n.yes,json:n.json})}),H.command(`notes [action] [id]`,`[ACCOUNT] notes list | create [--content --site-id] | delete <id>`).option(`--content <text>`,`Note body (create)`).option(`--site-id <id>`,`Attach to a specific site (create; defaults to current)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{notesCommand:i}=await import(`./notes-Cepz-K00.js`);process.exitCode=await i({cliVersion:z,action:r,id:t,content:n.content,siteId:n.siteId,yes:n.yes,json:n.json})}),H.command(`agency [action] [arg] [arg2]`,`[ACCOUNT] agency clients list | clients add [--email --name] | clients remove <id> | report send <clientId> (Scale+)`).option(`--email <e>`,`Client contact email (clients add)`).option(`--name <n>`,`Client name (clients add)`).option(`--yes`,`Skip confirmation (clients remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{agencyCommand:i}=await import(`./agency-DEixFVRT.js`),a=`clients-list`,o;e===`clients`?t===`add`?a=`clients-add`:t===`remove`?(a=`clients-remove`,o=n):a=`clients-list`:e===`report`&&t===`send`&&(a=`report-send`,o=n),process.exitCode=await i({cliVersion:z,action:a,id:o,email:r.email,name:r.name,yes:r.yes,json:r.json})}),H.command(`analytics live`,"[ANALYTICS] Alias for `live`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-k32y1phk.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics funnels`,"[ANALYTICS] Alias for `funnels`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-nm9X3Od7.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics goals`,"[ANALYTICS] Alias for `goals list` (Pro+)").option(`--json`,``).action(async e=>{let{goalsCommand:t}=await import(`./goals-D1qL286b.js`);process.exitCode=await t({cliVersion:z,action:`list`,json:e.json})}),H.command(`analytics insights`,"[ANALYTICS] Alias for `insights` (Pro+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-wx3wIgGV.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics profiles`,"[ANALYTICS] User-profiles list (NOT `profile`, which is current-user)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{visitorsCommand:t}=await import(`./visitors-CrF-_BuG.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`analytics companies`,"[ANALYTICS] Alias for `companies` (Scale+)").option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-BToqUnFi.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`use [site]`,`Set / show / reset your default site (used when --site-id is omitted)`).option(`--reset`,`Clear the stored default site`).option(`--show`,`Print the current default and exit`).option(`--json`,`Emit JSON`).action(async(e,t)=>{let{useCommand:n}=await import(`./use-DJ0b_xNo.js`),r=await n({cliVersion:z,match:e,reset:t.reset,show:t.show,json:t.json});process.exitCode=r}),H.command(`update`,`Manually install the latest version`).option(`--check`,`Don't install — just print latest`).option(`--force-downgrade`,`Allow downgrading to an older version`).option(`--no-update-check`,`Disable auto-update for this invocation`).option(`--json`,``).action(async e=>{let{updateCommand:t}=await import(`./update-DWBRR_PD.js`);await t({cliVersion:z,binaryPath:B,check:e.check,forceDowngrade:e.forceDowngrade,json:e.json})}),H.command(`usage`,`[ACCOUNT] Current month events vs plan limits + headcounts`).option(`--json`,``).action(async e=>{let{usageCommand:t}=await import(`./usage-BhLXHEkY.js`);process.exitCode=await t({cliVersion:z,json:e.json})}),H.command(`globe`,`[ANALYTICS] Live globe — visitors plotted by country with flag labels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{globeCommand:t}=await import(`./globe-ictHskbW.js`);process.exitCode=await t({cliVersion:z,siteId:e.siteId,json:e.json})}),H.command(`webhooks [action] [arg]`,`[MANAGE] webhooks list | add <url> [--events] | delete <id> | rotate <id> | test <id>`).option(`--events <list>`,`Comma-separated event types (add)`).option(`--yes`,`Skip confirmation (delete/rotate)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{webhooksCommand:i}=await import(`./webhooks-Ddhz2P7n.js`);process.exitCode=await i({cliVersion:z,action:r,url:r===`add`?t:void 0,id:r===`delete`||r===`rotate`||r===`test`?t:void 0,events:n.events,yes:n.yes,json:n.json})}),H.command(`audit [action]`,`[ACCOUNT] audit list [--since --action --actor] | export [--format --out] (Pro+)`).option(`--since <window>`,`Window like 24h, 7d, 30d (list)`,{default:`7d`}).option(`--action <pattern>`,`Filter by action string (list)`).option(`--actor <userId>`,`Filter by actor user ID (list)`).option(`--format <fmt>`,`ndjson | csv | json (export)`,{default:`ndjson`}).option(`--out <file>`,`Output file path (export). Defaults to stdout`).option(`--json`,``).action(async(e,t)=>{let n=e??`list`,r=t.format===`csv`||t.format===`json`?t.format:`ndjson`,{auditCommand:i}=await import(`./audit-CfOJ3rNW.js`);process.exitCode=await i({cliVersion:z,action:n,since:t.since,filterAction:t.action,actor:t.actor,format:r,out:t.out,json:t.json})}),H.command(`share [action]`,`[ACCOUNT] share enable | disable | url — public dashboard share for the current site`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--yes`,`Skip confirmation (disable)`).option(`--json`,``).action(async(e,t)=>{let n=e??`url`,{shareCommand:r}=await import(`./share-BQjP_Anq.js`);process.exitCode=await r({cliVersion:z,action:n,siteId:t.siteId,yes:t.yes,json:t.json})}),H.command(`commands`,`Emit the machine-readable command tree (for AI agents and shell-completion regen)`).option(`--json`,``).action(async e=>{let{commandsCommand:t}=await import(`./commands-DbkdKFGz.js`);process.exitCode=await t({cliVersion:z,json:e.json})}),H.command(`teams [action] [arg]`,`[ACCOUNT] teams list | switch <name-or-id> | current | reset`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{teamsCommand:i}=await import(`./teams-Dvh7_Gkg.js`);process.exitCode=await i({cliVersion:z,action:r,match:r===`switch`?t:void 0,json:n.json})}),H.parse(process.argv,{run:!1}),(async()=>{await T({binaryPath:B,currentVersion:z,argv:process.argv}),V();try{let e=H.matchedCommand,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`));if(!e&&t.length>0&&(process.stderr.write(`Unknown command: \`${t.join(` `)}\`\nRun \`zenovay --help\` to see all commands.\n`),process.exit(2)),!e&&t.length===0&&!process.argv.includes(`--help`)&&!process.argv.includes(`-h`)){H.outputHelp();return}await H.runMatchedCommand()}catch(e){let t=F(e),n=process.env.ZENOVAY_FORMAT===`json`||process.argv.includes(`--json`)||process.argv.includes(`-q`)||process.argv.includes(`--quiet`);n?process.stderr.write(JSON.stringify(t)+`
|
|
8
8
|
`):(process.stderr.write(`\n✗ ${t.message}\n`),t.hint&&process.stderr.write(` ${t.hint}\n`)),process.exit(1)}})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import"./formatter-mW0Yk3Nt.js";import{emit as r,isHeadless as i}from"./emit-DBbMG9mK.js";import{Panel as a,useTheme as o}from"./panel-uygscwY5.js";import{Banner as s}from"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import{Keybar as c}from"./keybar-C7YkmK1U.js";import{resolveSiteId as l}from"./resolve-site-BUpzvcMz.js";import{EmptyState as u}from"./empty-state-Dkho-_3J.js";import{Bar as d}from"./bar-BNmNGwlD.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useMemo as y,useRef as b,useState as x}from"react";import ee from"ink-spinner";const S={DZ:{lat:28.0339,lng:1.6596,name:`Algeria`,spread:8},EG:{lat:26.8206,lng:30.8025,name:`Egypt`,spread:6},ET:{lat:9.145,lng:40.4897,name:`Ethiopia`,spread:6},GH:{lat:7.9465,lng:-1.0232,name:`Ghana`,spread:3},KE:{lat:-.0236,lng:37.9062,name:`Kenya`,spread:4},MA:{lat:31.7917,lng:-7.0926,name:`Morocco`,spread:5},NG:{lat:9.082,lng:8.6753,name:`Nigeria`,spread:5},ZA:{lat:-30.5595,lng:22.9375,name:`South Africa`,spread:7},TZ:{lat:-6.369,lng:34.8888,name:`Tanzania`,spread:5},UG:{lat:1.3733,lng:32.2903,name:`Uganda`,spread:3},TN:{lat:33.8869,lng:9.5375,name:`Tunisia`,spread:3},SN:{lat:14.4974,lng:-14.4524,name:`Senegal`,spread:3},CI:{lat:7.54,lng:-5.5471,name:`Côte d'Ivoire`,spread:3},CM:{lat:7.3697,lng:12.3547,name:`Cameroon`,spread:4},AO:{lat:-11.2027,lng:17.8739,name:`Angola`,spread:6},MZ:{lat:-18.6657,lng:35.5296,name:`Mozambique`,spread:6},ZW:{lat:-19.0154,lng:29.1549,name:`Zimbabwe`,spread:4},ZM:{lat:-13.1339,lng:27.8493,name:`Zambia`,spread:5},RW:{lat:-1.9403,lng:29.8739,name:`Rwanda`,spread:1.5},MG:{lat:-18.7669,lng:46.8691,name:`Madagascar`,spread:5},LY:{lat:26.3351,lng:17.2283,name:`Libya`,spread:8},SD:{lat:12.8628,lng:30.2176,name:`Sudan`,spread:7},US:{lat:39.0902,lng:-98.5795,name:`United States`,spread:18},CA:{lat:56.1304,lng:-106.3468,name:`Canada`,spread:22},MX:{lat:23.6345,lng:-102.5528,name:`Mexico`,spread:9},BR:{lat:-10.235,lng:-51.9253,name:`Brazil`,spread:18},AR:{lat:-38.4161,lng:-63.6167,name:`Argentina`,spread:11},CL:{lat:-35.6751,lng:-71.543,name:`Chile`,spread:11},CO:{lat:4.5709,lng:-74.2973,name:`Colombia`,spread:6},PE:{lat:-9.19,lng:-75.0152,name:`Peru`,spread:7},VE:{lat:6.4238,lng:-66.5897,name:`Venezuela`,spread:6},EC:{lat:-1.8312,lng:-78.1834,name:`Ecuador`,spread:3},BO:{lat:-16.2902,lng:-63.5887,name:`Bolivia`,spread:6},UY:{lat:-32.5228,lng:-55.7658,name:`Uruguay`,spread:2.5},PY:{lat:-23.4425,lng:-58.4438,name:`Paraguay`,spread:4},GT:{lat:15.7835,lng:-90.2308,name:`Guatemala`,spread:2},CU:{lat:21.5218,lng:-77.7812,name:`Cuba`,spread:3},DO:{lat:18.7357,lng:-70.1627,name:`Dominican Republic`,spread:1.5},CR:{lat:9.7489,lng:-83.7534,name:`Costa Rica`,spread:1.2},PA:{lat:8.538,lng:-80.7821,name:`Panama`,spread:1.5},HN:{lat:15.2,lng:-86.2419,name:`Honduras`,spread:2},PR:{lat:18.2208,lng:-66.5901,name:`Puerto Rico`,spread:.6},JM:{lat:18.1096,lng:-77.2975,name:`Jamaica`,spread:.7},TT:{lat:10.6918,lng:-61.2225,name:`Trinidad and Tobago`,spread:.6},GB:{lat:55.3781,lng:-3.436,name:`United Kingdom`,spread:3},IE:{lat:53.4129,lng:-8.2439,name:`Ireland`,spread:2},FR:{lat:46.6034,lng:1.8883,name:`France`,spread:4},DE:{lat:51.1657,lng:10.4515,name:`Germany`,spread:3.5},IT:{lat:41.8719,lng:12.5674,name:`Italy`,spread:3.5},ES:{lat:40.4637,lng:-3.7492,name:`Spain`,spread:4},PT:{lat:39.3999,lng:-8.2245,name:`Portugal`,spread:2},NL:{lat:52.1326,lng:5.2913,name:`Netherlands`,spread:1.2},BE:{lat:50.5039,lng:4.4699,name:`Belgium`,spread:1},CH:{lat:46.8182,lng:8.2275,name:`Switzerland`,spread:1.4},AT:{lat:47.5162,lng:14.5501,name:`Austria`,spread:2},PL:{lat:51.9194,lng:19.1451,name:`Poland`,spread:3.5},CZ:{lat:49.8175,lng:15.473,name:`Czechia`,spread:1.8},SE:{lat:60.1282,lng:18.6435,name:`Sweden`,spread:5},NO:{lat:60.472,lng:8.4689,name:`Norway`,spread:5},FI:{lat:61.9241,lng:25.7482,name:`Finland`,spread:4},DK:{lat:56.2639,lng:9.5018,name:`Denmark`,spread:1.5},IS:{lat:64.9631,lng:-19.0208,name:`Iceland`,spread:3},GR:{lat:39.0742,lng:21.8243,name:`Greece`,spread:3},TR:{lat:38.9637,lng:35.2433,name:`Turkey`,spread:6},RO:{lat:45.9432,lng:24.9668,name:`Romania`,spread:3},HU:{lat:47.1625,lng:19.5033,name:`Hungary`,spread:2},UA:{lat:48.3794,lng:31.1656,name:`Ukraine`,spread:5},RU:{lat:61.524,lng:80,name:`Russia`,spread:28},BG:{lat:42.7339,lng:25.4858,name:`Bulgaria`,spread:2},HR:{lat:45.1,lng:15.2,name:`Croatia`,spread:2},RS:{lat:44.0165,lng:21.0059,name:`Serbia`,spread:2},SK:{lat:48.669,lng:19.699,name:`Slovakia`,spread:1.8},SI:{lat:46.1512,lng:14.9955,name:`Slovenia`,spread:1.2},LT:{lat:55.1694,lng:23.8813,name:`Lithuania`,spread:1.5},LV:{lat:56.8796,lng:24.6032,name:`Latvia`,spread:1.5},EE:{lat:58.5953,lng:25.0136,name:`Estonia`,spread:1.5},BY:{lat:53.7098,lng:27.9534,name:`Belarus`,spread:3},MD:{lat:47.4116,lng:28.3699,name:`Moldova`,spread:1.2},AL:{lat:41.1533,lng:20.1683,name:`Albania`,spread:1},MK:{lat:41.6086,lng:21.7453,name:`North Macedonia`,spread:1},BA:{lat:43.9159,lng:17.6791,name:`Bosnia and Herzegovina`,spread:1.2},ME:{lat:42.7087,lng:19.3744,name:`Montenegro`,spread:.8},XK:{lat:42.6026,lng:20.903,name:`Kosovo`,spread:.7},LU:{lat:49.8153,lng:6.1296,name:`Luxembourg`,spread:.4},MT:{lat:35.9375,lng:14.3754,name:`Malta`,spread:.3},CY:{lat:35.1264,lng:33.4299,name:`Cyprus`,spread:.6},CN:{lat:35.8617,lng:104.1954,name:`China`,spread:18},JP:{lat:36.2048,lng:138.2529,name:`Japan`,spread:5},KR:{lat:35.9078,lng:127.7669,name:`South Korea`,spread:2},IN:{lat:20.5937,lng:78.9629,name:`India`,spread:12},ID:{lat:-2.7893,lng:113.9213,name:`Indonesia`,spread:12},PH:{lat:12.8797,lng:121.774,name:`Philippines`,spread:5},VN:{lat:14.0583,lng:108.2772,name:`Vietnam`,spread:5},TH:{lat:15.87,lng:100.9925,name:`Thailand`,spread:4},MY:{lat:4.2105,lng:101.9758,name:`Malaysia`,spread:4},SG:{lat:1.3521,lng:103.8198,name:`Singapore`,spread:.3},PK:{lat:30.3753,lng:69.3451,name:`Pakistan`,spread:6},BD:{lat:23.685,lng:90.3563,name:`Bangladesh`,spread:3},LK:{lat:7.8731,lng:80.7718,name:`Sri Lanka`,spread:2},MM:{lat:21.9162,lng:95.956,name:`Myanmar`,spread:6},KH:{lat:12.5657,lng:104.991,name:`Cambodia`,spread:3},LA:{lat:19.8563,lng:102.4955,name:`Laos`,spread:3},NP:{lat:28.3949,lng:84.124,name:`Nepal`,spread:3},IR:{lat:32.4279,lng:53.688,name:`Iran`,spread:7},IQ:{lat:33.2232,lng:43.6793,name:`Iraq`,spread:4},IL:{lat:31.0461,lng:34.8516,name:`Israel`,spread:1},SA:{lat:23.8859,lng:45.0792,name:`Saudi Arabia`,spread:8},AE:{lat:23.4241,lng:53.8478,name:`UAE`,spread:2},QA:{lat:25.3548,lng:51.1839,name:`Qatar`,spread:.6},KW:{lat:29.3117,lng:47.4818,name:`Kuwait`,spread:.8},OM:{lat:21.4735,lng:55.9754,name:`Oman`,spread:4},JO:{lat:30.5852,lng:36.2384,name:`Jordan`,spread:2},LB:{lat:33.8547,lng:35.8623,name:`Lebanon`,spread:.7},SY:{lat:34.8021,lng:38.9968,name:`Syria`,spread:3},YE:{lat:15.5527,lng:48.5164,name:`Yemen`,spread:4},AF:{lat:33.9391,lng:67.71,name:`Afghanistan`,spread:5},KZ:{lat:48.0196,lng:66.9237,name:`Kazakhstan`,spread:13},UZ:{lat:41.3775,lng:64.5853,name:`Uzbekistan`,spread:5},TM:{lat:38.9697,lng:59.5563,name:`Turkmenistan`,spread:5},KG:{lat:41.2044,lng:74.7661,name:`Kyrgyzstan`,spread:3},TJ:{lat:38.861,lng:71.2761,name:`Tajikistan`,spread:3},AZ:{lat:40.1431,lng:47.5769,name:`Azerbaijan`,spread:2},GE:{lat:42.3154,lng:43.3569,name:`Georgia`,spread:2},AM:{lat:40.0691,lng:45.0382,name:`Armenia`,spread:1.2},HK:{lat:22.3193,lng:114.1694,name:`Hong Kong`,spread:.3},TW:{lat:23.6978,lng:120.9605,name:`Taiwan`,spread:1.5},AU:{lat:-25.2744,lng:133.7751,name:`Australia`,spread:18},NZ:{lat:-40.9006,lng:174.886,name:`New Zealand`,spread:5},PG:{lat:-6.314,lng:143.9555,name:`Papua New Guinea`,spread:5},FJ:{lat:-16.578,lng:179.4144,name:`Fiji`,spread:1}},C=Object.fromEntries(Object.entries(S).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function w(e){return!e||e.length!==2?null:S[e.toUpperCase()]??null}function T(e,t){let n=w(e);if(!n||t<=0)return[];let r=[],i=0;for(let t=0;t<e.length;t++)i=i*31+e.charCodeAt(t)>>>0;for(let e=0;e<t;e++){i=i+1831565813>>>0;let e=i;e=Math.imul(e^e>>>15,e|1)>>>0,e=(e^e+(Math.imul(e^e>>>7,e|61)>>>0))>>>0;let t=((e^e>>>14)>>>0)/4294967296;i=i+2246822507>>>0;let a=i;a=Math.imul(a^a>>>15,a|1)>>>0,a=(a^a+(Math.imul(a^a>>>7,a|61)>>>0))>>>0;let o=((a^a>>>14)>>>0)/4294967296,s=n.spread*Math.sqrt(t),c=o*2*Math.PI;r.push({lat:n.lat+s*Math.sin(c)*.7,lng:n.lng+s*Math.cos(c)/Math.max(.3,Math.cos(n.lat*Math.PI/180))})}return r}const E=360,D=180,O=new Uint8Array(E*D);function k(e){let t=(e%360+360)%360;return Math.floor(t)}function A(e){return Math.max(0,Math.min(D-1,Math.floor(90-e)))}function j(e,t){let n=A(e),r=k(t);O[n*E+r]=1}for(let e of Object.keys(S)){let t=S[e],n=Math.max(.5,t.spread*.85),r=Math.max(.25,Math.cos(t.lat*Math.PI/180)),i=Math.max(.5,t.spread/r),a=Math.floor(t.lat-n),o=Math.ceil(t.lat+n),s=Math.floor(t.lng-i),c=Math.ceil(t.lng+i);for(let e=a;e<=o;e++)for(let r=s;r<=c;r++){let a=(e-t.lat)/n,o=(r-t.lng)/i;o*o+a*a>1||j(e,r)}}const M=new Uint8Array(O);for(let e=1;e<D-1;e++)for(let t=0;t<E;t++){if(O[e*E+t])continue;let n=0;for(let r=-1;r<=1;r++)for(let i=-1;i<=1;i++){if(r===0&&i===0)continue;let a=(t+i+E)%E;O[(e+r)*E+a]&&n++}n>=4&&(M[e*E+t]=1)}O.set(M);function N(e,t){if(e<-90||e>90)return 0;let n=Math.max(0,Math.min(D-1,Math.floor(90-e))),r=(t%360+360)%360,i=Math.floor(r);return O[n*E+i]===1?1:0}function P(e){return e*Math.PI/180}function F(e,t){let n=P(e),r=P(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function I(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:n*e.x+r*e.z,y:e.y,z:-r*e.x+n*e.z}}function L(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:e.x,y:n*e.y-r*e.z,z:r*e.y+n*e.z}}function R(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function z(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function B(e,t,n,r){let i=r*r;for(let a=-r;a<=r;a++)for(let o=-r;o<=r;o++)o*o+a*a<=i&&z(e,Math.round(t+o),Math.round(n+a))}const V=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function H(e,t,n){let r=0;for(let i=0;i<V.length;i++){let[a,o]=V[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 U(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<=5?`○`:`●`}function W(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 G(e,t,n){if(e.z<0)return null;let r=t/2,i=n/2,a=Math.min(t,n/2)*.95;return{x:r+e.x*a,y:i-e.y*a}}function K(e){let t=e.dw/2,n=e.dh/2,r=Math.min(e.dw,e.dh/2)*.95,i=Math.round(2*Math.PI*r);for(let a=0;a<i;a++){let o=a/i*2*Math.PI,s=Math.round(t+r*Math.cos(o)),c=Math.round(n+r*Math.sin(o));z(e,s,c)}}function te(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=L(I(F(r,i),t),n),o=G(a,e.dw,e.dh);o&&z(e,Math.round(o.x),Math.round(o.y))}for(let r=-180;r<180;r+=30)for(let i=-85;i<=85;i+=4){let a=L(I(F(i,r),t),n),o=G(a,e.dw,e.dh);o&&z(e,Math.round(o.x),Math.round(o.y))}}function ne({visitors:e,highlight:t,width:n=50,height:r=25,rotationDeg:i=0,tiltDeg:a=20,gridlines:s=!0,asciiOnly:c}){let{theme:l}=o(),u=W(c),d=R(n,r),m=R(n,r),h=R(n,r),g=R(n,r),v=P(i),y=P(-a);K(d),s&&te(d,v,y);{let e=m.dw/2,t=m.dh/2,n=Math.min(m.dw,m.dh/2)*.95,r=Math.cos(v),i=Math.sin(v),a=Math.cos(y),o=Math.sin(y);for(let s=0;s<m.dh;s++){let c=(t-s)/n;if(!(c<-1||c>1))for(let t=0;t<m.dw;t++){let l=(t-e)/n,u=l*l+c*c;if(u>1)continue;let d=Math.sqrt(1-u),f=l,p=c,h=a*p+o*d,g=-o*p+a*d,_=r*f-i*g,v=i*f+r*g,y=Math.asin(h)*(180/Math.PI),b=Math.atan2(_,v)*(180/Math.PI);N(y,b)&&z(m,t,s)}}}for(let t of e){let e=L(I(F(t.lat,t.lng),v),y),n=G(e,h.dw,h.dh);if(!n)continue;let r=typeof t.freshness==`number`?t.freshness:.5;B(h,n.x,n.y,r>.7?2:1)}if(t&&t.length>0)for(let e of t){let t=L(I(F(e.lat,e.lng),v),y),n=G(t,g.dw,g.dh);if(!n)continue;B(g,n.x,n.y,2)}let b=[];for(let e=0;e<r;e++){let t=[],r=null,i=(e,n)=>{r&&r.color===e?r.text+=n:(r={color:e,text:n},t.push(r))};for(let r=0;r<n;r++){let n=u?U(g,r,e):H(g,r,e);if(n!==` `){i(l.warn,n);continue}let a=u?U(h,r,e):H(h,r,e);if(a!==` `){i(l.accent,a);continue}let o=u?U(m,r,e):H(m,r,e);if(o!==` `){i(l.success,o);continue}let s=u?U(d,r,e):H(d,r,e);if(s!==` `){i(l.muted,s);continue}let c=t.length>0?t[t.length-1]:void 0;i(c?c.color:l.muted,` `)}b.push(_.createElement(f,{key:e},_.createElement(p,null,t.map((e,t)=>_.createElement(p,{key:t,color:e.color,bold:!0},e.text)))))}return _.createElement(f,{flexDirection:`column`},b)}async function q(e,t,n){let r=await e.getGeo(t).catch(()=>({countries:[],cities:[]})),i=(r.countries??[]).map(e=>{let t=w(e.country),r=n.get(e.country)??0;return{code:e.country,visitors:e.visitors,lat:t?.lat,lng:t?.lng,freshness:e.visitors>r?1:.4}});return{countries:i,totalVisitors:i.reduce((e,t)=>e+t.visitors,0),unknownCount:i.filter(e=>typeof e.lat!=`number`).reduce((e,t)=>e+t.visitors,0),lastFetchedAt:Date.now()}}async function J(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}),u,d;try{({siteId:u,site:d}=await l(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await q(c,u,new Map);return r({type:`globe.snapshot`,data:{countries:e.countries,total:e.totalVisitors,unknownCount:e.unknownCount}}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(Z,{api:c,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const re=5e3,Y=60,X=1,ie=80,Z=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:l}=h(),{theme:m}=o(),[S,C]=x(null),[E,D]=x(!0),[O,k]=x(null),[A,j]=x(0),[M,N]=x(!1),[P,F]=x(20),[I,L]=x(1),[R,z]=x(0),B=b(new Map);g(n=>{if(n===`q`){l(),i(0);return}if(n===` `){N(e=>!e);return}if(n===`+`||n===`=`){L(e=>Math.min(1.6,e+.1));return}if(n===`-`||n===`_`){L(e=>Math.max(.7,e-.1));return}if(n===`t`){F(e=>(e+15)%60);return}if(n===`j`){z(e=>e+1);return}if(n===`k`){z(e=>Math.max(0,e-1));return}if(n===`o`&&S){let e=S.countries[R];e?.lng!==void 0&&(j(-e.lng),N(!0));return}n===`r`&&(async()=>{try{let n=await q(e,t,B.current);B.current=new Map(n.countries.map(e=>[e.code,e.visitors])),C(n)}catch(e){k(e.message)}})()}),v(()=>{let n=!1,r=null,i=async()=>{try{let r=await q(e,t,B.current);if(n)return;B.current=new Map(r.countries.map(e=>[e.code,e.visitors])),C(r),D(!1)}catch(e){n||(k(e.message),D(!1))}n||(r=setTimeout(i,re))};return i(),()=>{n=!0,r&&clearTimeout(r)}},[e,t]),v(()=>{if(M)return;let e=setInterval(()=>{j(e=>(e+X)%360)},Y);return()=>clearInterval(e)},[M]);let V=y(()=>{if(!S)return[];let e=[];for(let t of S.countries){if(typeof t.lat!=`number`||typeof t.lng!=`number`)continue;let n=Math.min(ie,Math.max(3,t.visitors*5));for(let r of T(t.code,n))e.push({lat:r.lat,lng:r.lng,freshness:t.freshness})}return e},[S]),H=y(()=>{if(!S)return[];let e=S.countries[Math.min(R,S.countries.length-1)];return!e||typeof e.lat!=`number`?[]:T(e.code,Math.min(80,Math.max(8,e.visitors*4)))},[S,R]),U=`globe · ${n} · live`,W=[{key:`q`,label:`quit`},{key:`j/k`,label:`select country`},{key:`o`,label:`orbit to selected`},{key:`space`,label:M?`resume`:`pause`},{key:`t`,label:`tilt ${P}°`},{key:`+/-`,label:`zoom`},{key:`r`,label:`refresh`}];if(E)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:U}),_.createElement(a,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`cyan`},_.createElement(ee,{type:`dots`})),_.createElement(p,null,` Spinning up Earth…`))));if(O)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:U}),_.createElement(u,{reason:`error`,headline:`Failed to load`,hint:O}),_.createElement(c,{items:W}));if(!S||S.countries.length===0&&S.unknownCount===0)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:U}),_.createElement(u,{reason:`no-data`,headline:`No geolocated visitors yet`,hint:`Visit your site to populate the map.`}),_.createElement(c,{items:W}));let G=process.stdout.columns??100,K=36,te=Math.max(40,Math.min(90,G-K-4)),J=Math.round(te*I),Z=Math.round(J*.5),Q=S.countries.slice(0,12),ae=Math.max(1,...Q.map(e=>e.visitors)),oe=Math.max(1,Math.floor((Date.now()-S.lastFetchedAt)/1e3)),$=S.countries[Math.min(R,S.countries.length-1)],se=$?w($.code):null;return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:U}),$?_.createElement(f,{flexDirection:`row`,marginBottom:1},_.createElement(f,{width:2}),_.createElement(f,{borderStyle:`round`,borderColor:m.warn,paddingX:1},_.createElement(p,{color:m.warn,bold:!0},se?.name??$.code),_.createElement(p,{color:m.dim},` · `),_.createElement(p,{color:m.fg},$.visitors,` visitor`,$.visitors===1?``:`s`))):null,_.createElement(f,{flexDirection:`row`},_.createElement(f,{flexDirection:`column`,marginRight:2},_.createElement(ne,{visitors:V,highlight:H,width:J,height:Z,rotationDeg:A,tiltDeg:P}),_.createElement(f,{marginTop:1},_.createElement(p,{color:m.dim},S.totalVisitors,` visitors · `,S.countries.length,` countries`,S.unknownCount>0?` · ${S.unknownCount} unmapped`:``,` · `,M?`rotation paused`:`↻ ${X}°/${Y}ms`,` · refreshed `,oe,`s ago`))),_.createElement(f,{flexDirection:`column`,width:K},_.createElement(a,{title:`Live by country`},Q.map((e,t)=>{let n=t===Math.min(R,S.countries.length-1),r=e.freshness>.7,i=n?m.warn:r?m.success:m.fg;return _.createElement(f,{key:e.code,flexDirection:`row`},_.createElement(f,{width:2},_.createElement(p,{color:m.warn},n?`›`:` `)),_.createElement(f,{width:3},_.createElement(p,{color:i,bold:n},e.code)),_.createElement(d,{value:e.visitors,max:ae,width:14,showPercent:!1}),_.createElement(f,{width:6},_.createElement(p,{color:m.muted},String(e.visitors).padStart(5))))})),S.countries.length>12?_.createElement(f,{marginTop:1},_.createElement(p,{color:m.muted},`+`,S.countries.length-12,` more (j/k to scroll)`)):null)),_.createElement(c,{items:W}))};export{J as globeCommand};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenovay/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.31",
|
|
4
4
|
"description": "Zenovay CLI — AI install wizard + full terminal analytics dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"test:release": "vitest run tests/e2e tests/update --testTimeout=600000",
|
|
25
25
|
"test:smoke": "vitest run tests/smoke --testTimeout=60000",
|
|
26
26
|
"test:update-golden": "UPDATE_GOLDEN=1 vitest run tests/e2e",
|
|
27
|
+
"render:globe": "tsx scripts/render-globe.ts",
|
|
27
28
|
"prepare": "husky install"
|
|
28
29
|
},
|
|
29
30
|
"dependencies": {
|
package/dist/globe-b9L8CaxI.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readConfig as e}from"./config-Cmi_f_SY.js";import{readToken as t}from"./api-CeB_9iPg.js";import{ApiV2Client as n}from"./api-v2-B_kZhVxd.js";import"./formatter-mW0Yk3Nt.js";import{emit as r,isHeadless as i}from"./emit-DBbMG9mK.js";import{Panel as a,useTheme as o}from"./panel-uygscwY5.js";import{Banner as s}from"./banner-BPQh2F8l.js";import"./prompt-BURfUNxp.js";import{Keybar as c}from"./keybar-C7YkmK1U.js";import{resolveSiteId as l}from"./resolve-site-BUpzvcMz.js";import{EmptyState as u}from"./empty-state-Dkho-_3J.js";import{Bar as d}from"./bar-BNmNGwlD.js";import{Box as f,Text as p,render as m,useApp as h,useInput as g}from"ink";import _,{useEffect as v,useMemo as y,useRef as b,useState as x}from"react";import S from"ink-spinner";function C(e){return e*Math.PI/180}function w(e,t){let n=C(e),r=C(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function T(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:n*e.x+r*e.z,y:e.y,z:-r*e.x+n*e.z}}function E(e,t){let n=Math.cos(t),r=Math.sin(t);return{x:e.x,y:n*e.y-r*e.z,z:r*e.y+n*e.z}}function D(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function O(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function k(e,t,n,r){let i=r*r;for(let a=-r;a<=r;a++)for(let o=-r;o<=r;o++)o*o+a*a<=i&&O(e,Math.round(t+o),Math.round(n+a))}const A=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function j(e,t,n){let r=0;for(let i=0;i<A.length;i++){let[a,o]=A[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 M(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<=5?`○`:`●`}function N(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 P(e,t,n){if(e.z<0)return null;let r=t/2,i=n/2,a=Math.min(t,n/2)*.95;return{x:r+e.x*a,y:i-e.y*a}}function F(e){let t=e.dw/2,n=e.dh/2,r=Math.min(e.dw,e.dh/2)*.95,i=Math.round(2*Math.PI*r);for(let a=0;a<i;a++){let o=a/i*2*Math.PI,s=Math.round(t+r*Math.cos(o)),c=Math.round(n+r*Math.sin(o));O(e,s,c)}}function I(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=E(T(w(r,i),t),n),o=P(a,e.dw,e.dh);o&&O(e,Math.round(o.x),Math.round(o.y))}for(let r=-180;r<180;r+=30)for(let i=-85;i<=85;i+=4){let a=E(T(w(i,r),t),n),o=P(a,e.dw,e.dh);o&&O(e,Math.round(o.x),Math.round(o.y))}}function L({landmarks:e,visitors:t,highlight:n,width:r=50,height:i=25,rotationDeg:a=0,tiltDeg:s=20,gridlines:c=!0,asciiOnly:l}){let{theme:u}=o(),d=N(l),m=D(r,i),h=D(r,i),g=D(r,i),v=D(r,i),y=C(a),b=C(-s);F(m),c&&I(m,y,b);for(let t of e){let e=E(T(w(t.lat,t.lng),y),b),n=P(e,h.dw,h.dh);if(!n)continue;k(h,n.x,n.y,0)}for(let e of t){let t=E(T(w(e.lat,e.lng),y),b),n=P(t,g.dw,g.dh);if(!n)continue;let r=typeof e.freshness==`number`?e.freshness:.5;k(g,n.x,n.y,r>.7?1:0)}if(n&&n.length>0)for(let e of n){let t=E(T(w(e.lat,e.lng),y),b),n=P(t,v.dw,v.dh);if(!n)continue;k(v,n.x,n.y,1)}let x=[];for(let e=0;e<i;e++){let t=``,n=``,i=``,a=``;for(let o=0;o<r;o++){let r=d?M(v,o,e):j(v,o,e),s=d?M(g,o,e):j(g,o,e),c=d?M(h,o,e):j(h,o,e),l=d?M(m,o,e):j(m,o,e);r===` `?s===` `?c===` `?(a+=` `,i+=` `,n+=` `,t+=l):(a+=` `,i+=` `,n+=c,t+=` `):(a+=` `,i+=s,n+=` `,t+=` `):(a+=r,i+=` `,n+=` `,t+=` `)}x.push(_.createElement(f,{key:e},_.createElement(p,null,_.createElement(p,{color:u.muted},t),_.createElement(p,{color:u.success,bold:!0},n),_.createElement(p,{color:u.accent,bold:!0},i),_.createElement(p,{color:u.warn,bold:!0},a))))}return _.createElement(f,{flexDirection:`column`},x)}const R={DZ:{lat:28.0339,lng:1.6596,name:`Algeria`,spread:8},EG:{lat:26.8206,lng:30.8025,name:`Egypt`,spread:6},ET:{lat:9.145,lng:40.4897,name:`Ethiopia`,spread:6},GH:{lat:7.9465,lng:-1.0232,name:`Ghana`,spread:3},KE:{lat:-.0236,lng:37.9062,name:`Kenya`,spread:4},MA:{lat:31.7917,lng:-7.0926,name:`Morocco`,spread:5},NG:{lat:9.082,lng:8.6753,name:`Nigeria`,spread:5},ZA:{lat:-30.5595,lng:22.9375,name:`South Africa`,spread:7},TZ:{lat:-6.369,lng:34.8888,name:`Tanzania`,spread:5},UG:{lat:1.3733,lng:32.2903,name:`Uganda`,spread:3},TN:{lat:33.8869,lng:9.5375,name:`Tunisia`,spread:3},SN:{lat:14.4974,lng:-14.4524,name:`Senegal`,spread:3},CI:{lat:7.54,lng:-5.5471,name:`Côte d'Ivoire`,spread:3},CM:{lat:7.3697,lng:12.3547,name:`Cameroon`,spread:4},AO:{lat:-11.2027,lng:17.8739,name:`Angola`,spread:6},MZ:{lat:-18.6657,lng:35.5296,name:`Mozambique`,spread:6},ZW:{lat:-19.0154,lng:29.1549,name:`Zimbabwe`,spread:4},ZM:{lat:-13.1339,lng:27.8493,name:`Zambia`,spread:5},RW:{lat:-1.9403,lng:29.8739,name:`Rwanda`,spread:1.5},MG:{lat:-18.7669,lng:46.8691,name:`Madagascar`,spread:5},LY:{lat:26.3351,lng:17.2283,name:`Libya`,spread:8},SD:{lat:12.8628,lng:30.2176,name:`Sudan`,spread:7},US:{lat:39.0902,lng:-98.5795,name:`United States`,spread:18},CA:{lat:56.1304,lng:-106.3468,name:`Canada`,spread:22},MX:{lat:23.6345,lng:-102.5528,name:`Mexico`,spread:9},BR:{lat:-10.235,lng:-51.9253,name:`Brazil`,spread:18},AR:{lat:-38.4161,lng:-63.6167,name:`Argentina`,spread:11},CL:{lat:-35.6751,lng:-71.543,name:`Chile`,spread:11},CO:{lat:4.5709,lng:-74.2973,name:`Colombia`,spread:6},PE:{lat:-9.19,lng:-75.0152,name:`Peru`,spread:7},VE:{lat:6.4238,lng:-66.5897,name:`Venezuela`,spread:6},EC:{lat:-1.8312,lng:-78.1834,name:`Ecuador`,spread:3},BO:{lat:-16.2902,lng:-63.5887,name:`Bolivia`,spread:6},UY:{lat:-32.5228,lng:-55.7658,name:`Uruguay`,spread:2.5},PY:{lat:-23.4425,lng:-58.4438,name:`Paraguay`,spread:4},GT:{lat:15.7835,lng:-90.2308,name:`Guatemala`,spread:2},CU:{lat:21.5218,lng:-77.7812,name:`Cuba`,spread:3},DO:{lat:18.7357,lng:-70.1627,name:`Dominican Republic`,spread:1.5},CR:{lat:9.7489,lng:-83.7534,name:`Costa Rica`,spread:1.2},PA:{lat:8.538,lng:-80.7821,name:`Panama`,spread:1.5},HN:{lat:15.2,lng:-86.2419,name:`Honduras`,spread:2},PR:{lat:18.2208,lng:-66.5901,name:`Puerto Rico`,spread:.6},JM:{lat:18.1096,lng:-77.2975,name:`Jamaica`,spread:.7},TT:{lat:10.6918,lng:-61.2225,name:`Trinidad and Tobago`,spread:.6},GB:{lat:55.3781,lng:-3.436,name:`United Kingdom`,spread:3},IE:{lat:53.4129,lng:-8.2439,name:`Ireland`,spread:2},FR:{lat:46.6034,lng:1.8883,name:`France`,spread:4},DE:{lat:51.1657,lng:10.4515,name:`Germany`,spread:3.5},IT:{lat:41.8719,lng:12.5674,name:`Italy`,spread:3.5},ES:{lat:40.4637,lng:-3.7492,name:`Spain`,spread:4},PT:{lat:39.3999,lng:-8.2245,name:`Portugal`,spread:2},NL:{lat:52.1326,lng:5.2913,name:`Netherlands`,spread:1.2},BE:{lat:50.5039,lng:4.4699,name:`Belgium`,spread:1},CH:{lat:46.8182,lng:8.2275,name:`Switzerland`,spread:1.4},AT:{lat:47.5162,lng:14.5501,name:`Austria`,spread:2},PL:{lat:51.9194,lng:19.1451,name:`Poland`,spread:3.5},CZ:{lat:49.8175,lng:15.473,name:`Czechia`,spread:1.8},SE:{lat:60.1282,lng:18.6435,name:`Sweden`,spread:5},NO:{lat:60.472,lng:8.4689,name:`Norway`,spread:5},FI:{lat:61.9241,lng:25.7482,name:`Finland`,spread:4},DK:{lat:56.2639,lng:9.5018,name:`Denmark`,spread:1.5},IS:{lat:64.9631,lng:-19.0208,name:`Iceland`,spread:3},GR:{lat:39.0742,lng:21.8243,name:`Greece`,spread:3},TR:{lat:38.9637,lng:35.2433,name:`Turkey`,spread:6},RO:{lat:45.9432,lng:24.9668,name:`Romania`,spread:3},HU:{lat:47.1625,lng:19.5033,name:`Hungary`,spread:2},UA:{lat:48.3794,lng:31.1656,name:`Ukraine`,spread:5},RU:{lat:61.524,lng:80,name:`Russia`,spread:28},BG:{lat:42.7339,lng:25.4858,name:`Bulgaria`,spread:2},HR:{lat:45.1,lng:15.2,name:`Croatia`,spread:2},RS:{lat:44.0165,lng:21.0059,name:`Serbia`,spread:2},SK:{lat:48.669,lng:19.699,name:`Slovakia`,spread:1.8},SI:{lat:46.1512,lng:14.9955,name:`Slovenia`,spread:1.2},LT:{lat:55.1694,lng:23.8813,name:`Lithuania`,spread:1.5},LV:{lat:56.8796,lng:24.6032,name:`Latvia`,spread:1.5},EE:{lat:58.5953,lng:25.0136,name:`Estonia`,spread:1.5},BY:{lat:53.7098,lng:27.9534,name:`Belarus`,spread:3},MD:{lat:47.4116,lng:28.3699,name:`Moldova`,spread:1.2},AL:{lat:41.1533,lng:20.1683,name:`Albania`,spread:1},MK:{lat:41.6086,lng:21.7453,name:`North Macedonia`,spread:1},BA:{lat:43.9159,lng:17.6791,name:`Bosnia and Herzegovina`,spread:1.2},ME:{lat:42.7087,lng:19.3744,name:`Montenegro`,spread:.8},XK:{lat:42.6026,lng:20.903,name:`Kosovo`,spread:.7},LU:{lat:49.8153,lng:6.1296,name:`Luxembourg`,spread:.4},MT:{lat:35.9375,lng:14.3754,name:`Malta`,spread:.3},CY:{lat:35.1264,lng:33.4299,name:`Cyprus`,spread:.6},CN:{lat:35.8617,lng:104.1954,name:`China`,spread:18},JP:{lat:36.2048,lng:138.2529,name:`Japan`,spread:5},KR:{lat:35.9078,lng:127.7669,name:`South Korea`,spread:2},IN:{lat:20.5937,lng:78.9629,name:`India`,spread:12},ID:{lat:-2.7893,lng:113.9213,name:`Indonesia`,spread:12},PH:{lat:12.8797,lng:121.774,name:`Philippines`,spread:5},VN:{lat:14.0583,lng:108.2772,name:`Vietnam`,spread:5},TH:{lat:15.87,lng:100.9925,name:`Thailand`,spread:4},MY:{lat:4.2105,lng:101.9758,name:`Malaysia`,spread:4},SG:{lat:1.3521,lng:103.8198,name:`Singapore`,spread:.3},PK:{lat:30.3753,lng:69.3451,name:`Pakistan`,spread:6},BD:{lat:23.685,lng:90.3563,name:`Bangladesh`,spread:3},LK:{lat:7.8731,lng:80.7718,name:`Sri Lanka`,spread:2},MM:{lat:21.9162,lng:95.956,name:`Myanmar`,spread:6},KH:{lat:12.5657,lng:104.991,name:`Cambodia`,spread:3},LA:{lat:19.8563,lng:102.4955,name:`Laos`,spread:3},NP:{lat:28.3949,lng:84.124,name:`Nepal`,spread:3},IR:{lat:32.4279,lng:53.688,name:`Iran`,spread:7},IQ:{lat:33.2232,lng:43.6793,name:`Iraq`,spread:4},IL:{lat:31.0461,lng:34.8516,name:`Israel`,spread:1},SA:{lat:23.8859,lng:45.0792,name:`Saudi Arabia`,spread:8},AE:{lat:23.4241,lng:53.8478,name:`UAE`,spread:2},QA:{lat:25.3548,lng:51.1839,name:`Qatar`,spread:.6},KW:{lat:29.3117,lng:47.4818,name:`Kuwait`,spread:.8},OM:{lat:21.4735,lng:55.9754,name:`Oman`,spread:4},JO:{lat:30.5852,lng:36.2384,name:`Jordan`,spread:2},LB:{lat:33.8547,lng:35.8623,name:`Lebanon`,spread:.7},SY:{lat:34.8021,lng:38.9968,name:`Syria`,spread:3},YE:{lat:15.5527,lng:48.5164,name:`Yemen`,spread:4},AF:{lat:33.9391,lng:67.71,name:`Afghanistan`,spread:5},KZ:{lat:48.0196,lng:66.9237,name:`Kazakhstan`,spread:13},UZ:{lat:41.3775,lng:64.5853,name:`Uzbekistan`,spread:5},TM:{lat:38.9697,lng:59.5563,name:`Turkmenistan`,spread:5},KG:{lat:41.2044,lng:74.7661,name:`Kyrgyzstan`,spread:3},TJ:{lat:38.861,lng:71.2761,name:`Tajikistan`,spread:3},AZ:{lat:40.1431,lng:47.5769,name:`Azerbaijan`,spread:2},GE:{lat:42.3154,lng:43.3569,name:`Georgia`,spread:2},AM:{lat:40.0691,lng:45.0382,name:`Armenia`,spread:1.2},HK:{lat:22.3193,lng:114.1694,name:`Hong Kong`,spread:.3},TW:{lat:23.6978,lng:120.9605,name:`Taiwan`,spread:1.5},AU:{lat:-25.2744,lng:133.7751,name:`Australia`,spread:18},NZ:{lat:-40.9006,lng:174.886,name:`New Zealand`,spread:5},PG:{lat:-6.314,lng:143.9555,name:`Papua New Guinea`,spread:5},FJ:{lat:-16.578,lng:179.4144,name:`Fiji`,spread:1}},z=Object.fromEntries(Object.entries(R).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function B(e){return!e||e.length!==2?null:R[e.toUpperCase()]??null}function V(e,t){let n=B(e);if(!n||t<=0)return[];let r=[],i=0;for(let t=0;t<e.length;t++)i=i*31+e.charCodeAt(t)>>>0;for(let e=0;e<t;e++){i=i+1831565813>>>0;let e=i;e=Math.imul(e^e>>>15,e|1)>>>0,e=(e^e+(Math.imul(e^e>>>7,e|61)>>>0))>>>0;let t=((e^e>>>14)>>>0)/4294967296;i=i+2246822507>>>0;let a=i;a=Math.imul(a^a>>>15,a|1)>>>0,a=(a^a+(Math.imul(a^a>>>7,a|61)>>>0))>>>0;let o=((a^a>>>14)>>>0)/4294967296,s=n.spread*Math.sqrt(t),c=o*2*Math.PI;r.push({lat:n.lat+s*Math.sin(c)*.7,lng:n.lng+s*Math.cos(c)/Math.max(.3,Math.cos(n.lat*Math.PI/180))})}return r}async function H(e,t,n){let r=await e.getGeo(t).catch(()=>({countries:[],cities:[]})),i=(r.countries??[]).map(e=>{let t=B(e.country),r=n.get(e.country)??0;return{code:e.country,visitors:e.visitors,lat:t?.lat,lng:t?.lng,freshness:e.visitors>r?1:.4}});return{countries:i,totalVisitors:i.reduce((e,t)=>e+t.visitors,0),unknownCount:i.filter(e=>typeof e.lat!=`number`).reduce((e,t)=>e+t.visitors,0),lastFetchedAt:Date.now()}}async function U(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}),u,d;try{({siteId:u,site:d}=await l(c,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await H(c,u,new Map);return r({type:`globe.snapshot`,data:{countries:e.countries,total:e.totalVisitors,unknownCount:e.unknownCount}}),0}return new Promise(e=>{let{unmount:t}=m(_.createElement(q,{api:c,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const W=5e3,G=200,K=2,ee=80,te=(()=>{let e=[];for(let t of Object.keys(R)){let n=R[t],r=Math.max(4,Math.min(120,Math.round(n.spread*n.spread*.8)));e.push(...V(t,r))}return e})(),q=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:l}=h(),{theme:m}=o(),[C,w]=x(null),[T,E]=x(!0),[D,O]=x(null),[k,A]=x(0),[j,M]=x(!1),[N,P]=x(20),[F,I]=x(1),[R,z]=x(0),U=b(new Map);g(n=>{if(n===`q`){l(),i(0);return}if(n===` `){M(e=>!e);return}if(n===`+`||n===`=`){I(e=>Math.min(1.6,e+.1));return}if(n===`-`||n===`_`){I(e=>Math.max(.7,e-.1));return}if(n===`t`){P(e=>(e+15)%60);return}if(n===`j`){z(e=>e+1);return}if(n===`k`){z(e=>Math.max(0,e-1));return}if(n===`o`&&C){let e=C.countries[R];e?.lng!==void 0&&(A(-e.lng),M(!0));return}n===`r`&&(async()=>{try{let n=await H(e,t,U.current);U.current=new Map(n.countries.map(e=>[e.code,e.visitors])),w(n)}catch(e){O(e.message)}})()}),v(()=>{let n=!1,r=null,i=async()=>{try{let r=await H(e,t,U.current);if(n)return;U.current=new Map(r.countries.map(e=>[e.code,e.visitors])),w(r),E(!1)}catch(e){n||(O(e.message),E(!1))}n||(r=setTimeout(i,W))};return i(),()=>{n=!0,r&&clearTimeout(r)}},[e,t]),v(()=>{if(j)return;let e=setInterval(()=>{A(e=>(e+K)%360)},G);return()=>clearInterval(e)},[j]);let q=y(()=>{if(!C)return[];let e=[];for(let t of C.countries){if(typeof t.lat!=`number`||typeof t.lng!=`number`)continue;let n=Math.min(ee,Math.max(3,t.visitors*5));for(let r of V(t.code,n))e.push({lat:r.lat,lng:r.lng,freshness:t.freshness})}return e},[C]),ne=y(()=>{if(!C)return[];let e=C.countries[Math.min(R,C.countries.length-1)];return!e||typeof e.lat!=`number`?[]:V(e.code,Math.min(80,Math.max(8,e.visitors*4)))},[C,R]),J=`globe · ${n} · live`,Y=[{key:`q`,label:`quit`},{key:`j/k`,label:`select country`},{key:`o`,label:`orbit to selected`},{key:`space`,label:j?`resume`:`pause`},{key:`t`,label:`tilt ${N}°`},{key:`+/-`,label:`zoom`},{key:`r`,label:`refresh`}];if(T)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:J}),_.createElement(a,{title:`Loading`,state:`busy`},_.createElement(f,null,_.createElement(p,{color:`cyan`},_.createElement(S,{type:`dots`})),_.createElement(p,null,` Spinning up Earth…`))));if(D)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:J}),_.createElement(u,{reason:`error`,headline:`Failed to load`,hint:D}),_.createElement(c,{items:Y}));if(!C||C.countries.length===0&&C.unknownCount===0)return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:J}),_.createElement(u,{reason:`no-data`,headline:`No geolocated visitors yet`,hint:`Visit your site to populate the map.`}),_.createElement(c,{items:Y}));let re=process.stdout.columns??100,X=36,ie=Math.max(40,Math.min(90,re-X-4)),Z=Math.round(ie*F),ae=Math.round(Z*.5),Q=C.countries.slice(0,12),oe=Math.max(1,...Q.map(e=>e.visitors)),se=Math.max(1,Math.floor((Date.now()-C.lastFetchedAt)/1e3)),$=C.countries[Math.min(R,C.countries.length-1)],ce=$?B($.code):null;return _.createElement(f,{flexDirection:`column`},_.createElement(s,{version:r,subtitle:J}),$?_.createElement(f,{flexDirection:`row`,marginBottom:1},_.createElement(f,{width:2}),_.createElement(f,{borderStyle:`round`,borderColor:m.warn,paddingX:1},_.createElement(p,{color:m.warn,bold:!0},ce?.name??$.code),_.createElement(p,{color:m.dim},` · `),_.createElement(p,{color:m.fg},$.visitors,` visitor`,$.visitors===1?``:`s`))):null,_.createElement(f,{flexDirection:`row`},_.createElement(f,{flexDirection:`column`,marginRight:2},_.createElement(L,{landmarks:te,visitors:q,highlight:ne,width:Z,height:ae,rotationDeg:k,tiltDeg:N}),_.createElement(f,{marginTop:1},_.createElement(p,{color:m.dim},C.totalVisitors,` visitors · `,C.countries.length,` countries`,C.unknownCount>0?` · ${C.unknownCount} unmapped`:``,` · `,j?`rotation paused`:`↻ ${K}°/${G}ms`,` · refreshed `,se,`s ago`))),_.createElement(f,{flexDirection:`column`,width:X},_.createElement(a,{title:`Live by country`},Q.map((e,t)=>{let n=t===Math.min(R,C.countries.length-1),r=e.freshness>.7,i=n?m.warn:r?m.success:m.fg;return _.createElement(f,{key:e.code,flexDirection:`row`},_.createElement(f,{width:2},_.createElement(p,{color:m.warn},n?`›`:` `)),_.createElement(f,{width:3},_.createElement(p,{color:i,bold:n},e.code)),_.createElement(d,{value:e.visitors,max:oe,width:14,showPercent:!1}),_.createElement(f,{width:6},_.createElement(p,{color:m.muted},String(e.visitors).padStart(5))))})),C.countries.length>12?_.createElement(f,{marginTop:1},_.createElement(p,{color:m.muted},`+`,C.countries.length-12,` more (j/k to scroll)`)):null)),_.createElement(c,{items:Y}))};export{U as globeCommand};
|