@zenovay/cli 0.1.60 → 0.1.62

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.
Files changed (91) hide show
  1. package/dist/{agency-Jld-6MFj.js → agency-C69JHza5.js} +1 -1
  2. package/dist/{ai-C-GanomY.js → ai-CPogCNEQ.js} +1 -1
  3. package/dist/{alerts-CPFSBaVU.js → alerts-DWVCFKlS.js} +1 -1
  4. package/dist/{analytical-screen-CRn5UoFi.js → analytical-screen-BasvNR-9.js} +1 -1
  5. package/dist/{analytics-Dg7UtCHo.js → analytics-C7mAE3gV.js} +2 -2
  6. package/dist/{annotation-GkAYwvze.js → annotation-BuwTxCIH.js} +1 -1
  7. package/dist/{api-BD_nTdOq.js → api-FCanTxsb.js} +1 -1
  8. package/dist/{api-keys-DphyO-_Y.js → api-keys-CHRLCfrl.js} +1 -1
  9. package/dist/{api-v2-q-vnosdb.js → api-v2-CI5hxW-O.js} +1 -1
  10. package/dist/api-v2-CTc_U2Gw.js +1 -0
  11. package/dist/{audit-5ImaVfEy.js → audit-Demn5lBp.js} +1 -1
  12. package/dist/bin.js +5 -5
  13. package/dist/{chat-panel-C_yjPXnw.js → chat-panel-CqJaCIg3.js} +1 -1
  14. package/dist/{companies-COJh5d6p.js → companies-DEdYd-bV.js} +1 -1
  15. package/dist/{completions-C_hmoEps.js → completions-CaYLmArp.js} +1 -1
  16. package/dist/config--JRu_jFq.js +1 -0
  17. package/dist/{config-i0nb93yX.js → config-DB3jF5gG.js} +1 -1
  18. package/dist/{deploys-D044xeG7.js → deploys-DTIU1Kqt.js} +1 -1
  19. package/dist/{devices-CKVbnV06.js → devices-DK_o0JcI.js} +1 -1
  20. package/dist/doctor-m0z3A2RU.js +20 -0
  21. package/dist/{domains-2z51Uxcq.js → domains-BCDiOFYb.js} +1 -1
  22. package/dist/{error-codes-BohPg7wr.js → error-codes-C5caZH9p.js} +1 -1
  23. package/dist/error-codes-fnm-9MRL.js +1 -0
  24. package/dist/{errors-CX-BTLp1.js → errors-Dig3nVCV.js} +1 -1
  25. package/dist/{events-tail-pDYhVzFg.js → events-tail-u_lwZas2.js} +1 -1
  26. package/dist/{export-DCbp6_Ae.js → export-DkAIRS9F.js} +1 -1
  27. package/dist/{funnel-CBYMcT0x.js → funnel-Brtq8avo.js} +1 -1
  28. package/dist/{geo-CZGN3jMJ.js → geo-c9hA42_9.js} +1 -1
  29. package/dist/{globe-BesYTdf0.js → globe-C_m7zGZM.js} +1 -1
  30. package/dist/{goals-xzqn8Yvu.js → goals-OQ1s7Vhq.js} +1 -1
  31. package/dist/health-Blmhw_tk.js +1 -0
  32. package/dist/health-hG9EHf7v.js +2 -0
  33. package/dist/{heatmaps-Dbw4tjvl.js → heatmaps-BPxqgMmV.js} +1 -1
  34. package/dist/{home-DAjqGgZH.js → home-DGrXLbbO.js} +1 -1
  35. package/dist/{init-J3iobD6o.js → init-BIJkCrgc.js} +2 -2
  36. package/dist/init-BhfcLbDE.js +1 -0
  37. package/dist/{insights-mWJUgQim.js → insights-CrUKfMD5.js} +1 -1
  38. package/dist/{integrations-eq4v-lwT.js → integrations-S-9EITZH.js} +1 -1
  39. package/dist/{journeys-DYHyPzD3.js → journeys-BbySeXM2.js} +1 -1
  40. package/dist/{live-BV3Ke3Pe.js → live-dcM0RwGp.js} +1 -1
  41. package/dist/login-DgU__egg.js +1 -0
  42. package/dist/{login-C9V2iVUx.js → login-yhuXiFqh.js} +1 -1
  43. package/dist/{logout-BiMIjAoN.js → logout-eXZJMigi.js} +1 -1
  44. package/dist/{notes-Cbj12dSg.js → notes-DUqpXghJ.js} +1 -1
  45. package/dist/{pages-B3Va-Uv4.js → pages-Bk5gbJ2v.js} +1 -1
  46. package/dist/{plans-JCNd2VsV.js → plans-CNWFx-qt.js} +1 -1
  47. package/dist/{profile-BywGL64A.js → profile-CZm-_uy-.js} +1 -1
  48. package/dist/{projects-0DoM_DNY.js → projects-BOU9sd2x.js} +1 -1
  49. package/dist/{query-Cvxg7VGc.js → query-CFNNsz6m.js} +1 -1
  50. package/dist/{resolve-site-DSJR9vuz.js → resolve-site-mj0esTrm.js} +1 -1
  51. package/dist/{retention-C6UOSoTA.js → retention-CYDhYbyf.js} +1 -1
  52. package/dist/{revenue-BoCu83Qb.js → revenue-D8uN4mjW.js} +1 -1
  53. package/dist/{self-test-C2breHMW.js → self-test-Cc5PWB08.js} +2 -2
  54. package/dist/{sessions-bW9Zq9Ie.js → sessions-DqTjJFcP.js} +1 -1
  55. package/dist/{settings-goNP_z8b.js → settings-CTbX2BXa.js} +1 -1
  56. package/dist/{share-DGMIOBqH.js → share-BG5ipcQi.js} +1 -1
  57. package/dist/{sources-COk75RfB.js → sources-D0FxjzeB.js} +1 -1
  58. package/dist/{stats-Cljlonha.js → stats-DmkvUylD.js} +1 -1
  59. package/dist/status-agent-Dej6dGvX.js +10 -0
  60. package/dist/{team-DVMA4G7x.js → team-B1qfFxKA.js} +1 -1
  61. package/dist/{teams-k4OJgxiP.js → teams-BzLZoKsj.js} +1 -1
  62. package/dist/{telemetry-DVyGPeIl.js → telemetry--Yk0J5zc.js} +1 -1
  63. package/dist/telemetry-C1045t6Q.js +1 -0
  64. package/dist/{telemetry-urcJlNpJ.js → telemetry-DRh10SvO.js} +1 -1
  65. package/dist/{tier-DST3Yt2-.js → tier-BneaO4vD.js} +1 -1
  66. package/dist/{token-store-DWXh9r3Z.js → token-store-BQuGH0z2.js} +1 -1
  67. package/dist/token-store-TmBx42nv.js +1 -0
  68. package/dist/{update-DV3UrhdN.js → update-CyyvYJPz.js} +1 -1
  69. package/dist/{uptime-B50oSlpy.js → uptime-CNGVODGc.js} +1 -1
  70. package/dist/{usage-Ck3nnMro.js → usage-kXVWbunU.js} +1 -1
  71. package/dist/{use-DKqiTC6X.js → use-B8cSIrZL.js} +1 -1
  72. package/dist/{visitors-BhAgZwqV.js → visitors-D7Q6chjq.js} +1 -1
  73. package/dist/{vitals-BfCdH0Um.js → vitals-DmMAuIdP.js} +1 -1
  74. package/dist/{watch-C3s26qCL.js → watch-D5WeMSz2.js} +1 -1
  75. package/dist/{webhooks-TMX618nq.js → webhooks-BhZkT0SX.js} +1 -1
  76. package/dist/{webhooks-forward-Dijs9bUk.js → webhooks-forward-D9PZDQ77.js} +1 -1
  77. package/dist/wizard-bin.js +1 -1
  78. package/package.json +1 -1
  79. package/dist/api-v2-BlZLQy11.js +0 -1
  80. package/dist/binaries/zenovay-darwin-arm64 +0 -0
  81. package/dist/binaries/zenovay-darwin-arm64.sha256 +0 -1
  82. package/dist/config-Dn_Cl0cD.js +0 -1
  83. package/dist/doctor-CF3D4SXm.js +0 -16
  84. package/dist/error-codes-BeJw1P4i.js +0 -1
  85. package/dist/health-9O6q4lla.js +0 -1
  86. package/dist/health-lTPnKNY9.js +0 -1
  87. package/dist/init-DJ7cYn-0.js +0 -1
  88. package/dist/login-CxdKhA-o.js +0 -1
  89. package/dist/status-agent-C2184gQB.js +0 -10
  90. package/dist/telemetry-BHyqKLqh.js +0 -1
  91. package/dist/token-store-BliA7lF_.js +0 -1
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-CRn5UoFi.js";import{Box as u,Text as d}from"ink";import f from"react";function p(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 m(e){return e==null?`—`:e>=500?`Enterprise`:e>=50?`Growth`:`SMB`}async function h(h){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:h.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:h.siteId,headless:!!(h.json||h.csv||h.tsv||h.ndjson),cliVersion:h.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(h),S=h.window??`24h`,C=h.limit??100,w=[{key:`lastSeenAt`,label:`when`,width:6,format:e=>p(String(e))},{key:`name`,label:`company`,width:24,format:e=>String(e).slice(0,24)},{key:`employeeCount`,label:`tier`,width:11,format:e=>m(typeof e==`number`?e:null)},{key:`industry`,label:`industry`,width:18,format:e=>String(e??`—`).slice(0,18)},{key:`visitCount`,label:`visits`,width:6,align:`right`},{key:`isNew`,label:``,width:5,format:e=>e?`NEW`:``}];return l({cliVersion:h.cliVersion,title:`companies · ${y} · ${S}`,commandName:`companies`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:h.watch?3e4:0,fetcher:e=>v.getCompaniesSnapshot(y,{window:S,limit:C},e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`companies`,{siteId:y}))}}},headlessEmit:(e,t)=>{let n=h.newOnly?e.companies.filter(e=>e.isNew):e.companies;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of n)process.stdout.write(JSON.stringify(e)+`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as a}from"./resolve-site-mj0esTrm.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-BasvNR-9.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e){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 m(e){return e==null?`—`:e>=500?`Enterprise`:e>=50?`Growth`:`SMB`}async function h(h){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:h.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:h.siteId,headless:!!(h.json||h.csv||h.tsv||h.ndjson),cliVersion:h.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(h),S=h.window??`24h`,C=h.limit??100,w=[{key:`lastSeenAt`,label:`when`,width:6,format:e=>p(String(e))},{key:`name`,label:`company`,width:24,format:e=>String(e).slice(0,24)},{key:`employeeCount`,label:`tier`,width:11,format:e=>m(typeof e==`number`?e:null)},{key:`industry`,label:`industry`,width:18,format:e=>String(e??`—`).slice(0,18)},{key:`visitCount`,label:`visits`,width:6,align:`right`},{key:`isNew`,label:``,width:5,format:e=>e?`NEW`:``}];return l({cliVersion:h.cliVersion,title:`companies · ${y} · ${S}`,commandName:`companies`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:h.watch?3e4:0,fetcher:e=>v.getCompaniesSnapshot(y,{window:S,limit:C},e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`companies`,{siteId:y}))}}},headlessEmit:(e,t)=>{let n=h.newOnly?e.companies.filter(e=>e.isNew):e.companies;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of n)process.stdout.write(JSON.stringify(e)+`
2
2
  `);else process.stdout.write(JSON.stringify({companies:n,total:n.length},null,2));return}process.stdout.write(r(n,[`name`,`domain`,`industry`,`employeeCount`,`visitCount`,`firstSeenAt`,`lastSeenAt`,`isNew`],t))},panels:[{id:`summary`,title:`Now`,render:e=>{let t=e.companies.filter(e=>e.isNew).length,n=e.companies.filter(e=>(e.employeeCount??0)>=500).length;return f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{bold:!0},e.total),f.createElement(d,{color:`gray`},` companies in `,S)),f.createElement(d,{color:`gray`},f.createElement(d,{color:`green`},`● `,t,` new`),` · `,n,` enterprise`))}},{id:`feed`,title:`Feed`,render:e=>{let t=h.newOnly?e.companies.filter(e=>e.isNew):e.companies;return t.length===0?f.createElement(d,{color:`gray`},`— no `,h.newOnly?`new `:``,`companies in window —`):f.createElement(o,{data:t.slice(0,30),columns:w,headerStyle:`accent`})}}]})}export{h as companiesCommand};
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{getCachedTier as r}from"./tier-DST3Yt2-.js";import i from"node:path";import{promises as a}from"node:fs";import o from"node:os";const s=[{name:`init`,description:`AI install wizard`},{name:`login`,description:`Authenticate via OAuth device flow`},{name:`logout`,description:`Revoke session and clear local auth`},{name:`ai`,description:`3-mode AI assistant`},{name:`watch`,description:`Live TUI dashboard`},{name:`events`,description:`Stream live events`},{name:`health`,description:`Self-diagnostic checks`},{name:`doctor`,description:`AI-assisted self-healing`},{name:`update`,description:`Install latest version`},{name:`visitors`,description:`Live visitor table`},{name:`sources`,description:`Traffic source breakdown`},{name:`vitals`,description:`Core Web Vitals dashboard`},{name:`revenue`,description:`MRR / ARR / transaction series`},{name:`funnel`,description:`Funnel drop-off chart`},{name:`funnels`,description:`List funnels`},{name:`stats`,description:`One-shot dashboard summary`},{name:`errors`,description:`Recent error snapshot`},{name:`companies`,description:`B2B identification feed`},{name:`projects`,description:`List tracked projects`},{name:`query`,description:`SQL REPL over analytics schema`},{name:`completions`,description:`Emit shell-completion script`},{name:`export`,description:`Bulk-export analytics / sessions / heatmaps`}],c=`--site-id.--json.--csv.--tsv.--ndjson.--watch.--limit.--window.--period.--range.--device.--url.--compare.--max-rows.--filter.--forward-to.--replay-24h.--search.--new-only.--min-duration.--out.--format.--type.--funnel-id.--help.--version`.split(`.`),l=[`catppuccin-mocha`,`catppuccin-latte`,`dracula`,`tokyo-night`,`nord`],u=[`pageview`,`click`,`scroll`,`form_submit`,`purchase`,`goal_completed`,`error`],d=[`funnel`,`session`,`page`,`site`,`saved-query`,`theme`,`event-type`,`country`];function f(){let e=s.map(e=>e.name).join(` `),t=c.join(` `);return`# zenovay bash completion
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{getCachedTier as r}from"./tier-BneaO4vD.js";import i from"node:path";import{promises as a}from"node:fs";import o from"node:os";const s=[{name:`init`,description:`AI install wizard`},{name:`login`,description:`Authenticate via OAuth device flow`},{name:`logout`,description:`Revoke session and clear local auth`},{name:`ai`,description:`3-mode AI assistant`},{name:`watch`,description:`Live TUI dashboard`},{name:`events`,description:`Stream live events`},{name:`health`,description:`Self-diagnostic checks`},{name:`doctor`,description:`AI-assisted self-healing`},{name:`update`,description:`Install latest version`},{name:`visitors`,description:`Live visitor table`},{name:`sources`,description:`Traffic source breakdown`},{name:`vitals`,description:`Core Web Vitals dashboard`},{name:`revenue`,description:`MRR / ARR / transaction series`},{name:`funnel`,description:`Funnel drop-off chart`},{name:`funnels`,description:`List funnels`},{name:`stats`,description:`One-shot dashboard summary`},{name:`errors`,description:`Recent error snapshot`},{name:`companies`,description:`B2B identification feed`},{name:`projects`,description:`List tracked projects`},{name:`query`,description:`SQL REPL over analytics schema`},{name:`completions`,description:`Emit shell-completion script`},{name:`export`,description:`Bulk-export analytics / sessions / heatmaps`},{name:`annotation`,description:`Chart annotations — mark deploys / releases / campaigns`}],c=`--site-id.--json.--csv.--tsv.--ndjson.--watch.--limit.--window.--period.--range.--device.--url.--compare.--max-rows.--filter.--forward-to.--replay-24h.--search.--new-only.--min-duration.--out.--format.--type.--funnel-id.--help.--version`.split(`.`),l=[`catppuccin-mocha`,`catppuccin-latte`,`dracula`,`tokyo-night`,`nord`],u=[`pageview`,`click`,`scroll`,`form_submit`,`purchase`,`goal_completed`,`error`],d=[`funnel`,`session`,`page`,`site`,`saved-query`,`theme`,`event-type`,`country`];function f(){let e=s.map(e=>e.name).join(` `),t=c.join(` `);return`# zenovay bash completion
2
2
  # Install: zenovay completions bash > /usr/local/etc/bash_completion.d/zenovay
3
3
  _zenovay() {
4
4
  local cur prev opts
@@ -0,0 +1 @@
1
+ import e from"node:path";import{promises as t}from"node:fs";import{z as n}from"zod";import r from"node:os";const i=n.object({theme:n.string().optional(),apiBase:n.string().url().default(`https://api.zenovay.com`),cliBase:n.string().url().default(`https://cli.zenovay.com`),region:n.enum([`us`,`eu`,`auto`]).default(`auto`),telemetry:n.union([n.boolean(),n.object({enabled:n.boolean(),disclosed_at:n.number().optional()})]).optional(),noUpdateCheck:n.boolean().default(!1),lastUpdateNotice:n.number().optional(),forwardSecret:n.string().optional(),defaultSiteId:n.string().optional(),defaultSiteName:n.string().optional(),cachedTier:n.string().optional(),cachedTierAt:n.number().optional(),currentTeamId:n.string().optional(),currentTeamName:n.string().optional(),statusAgent:n.object({refreshIntervalMs:n.number().int().min(5e3).max(36e5).default(6e4),notifyOn:n.string().optional(),notifierPlatform:n.enum([`auto`,`macos`,`linux`,`windows`,`osc9`]).default(`auto`)}).optional()}),a={apiBase:`https://api.zenovay.com`,cliBase:`https://cli.zenovay.com`,region:`auto`,noUpdateCheck:!1};function o(){if(process.platform===`win32`){let t=process.env.APPDATA??e.join(r.homedir(),`AppData`,`Roaming`);return e.join(t,`zenovay`)}let t=process.env.XDG_CONFIG_HOME??e.join(r.homedir(),`.config`);return e.join(t,`zenovay`)}function s(){return e.join(o(),`config.json`)}async function c(){let e=s();try{let n=await t.readFile(e,`utf8`),r=i.safeParse(JSON.parse(n));return r.success?r.data:a}catch(e){if(e.code===`ENOENT`)return a;throw e}}async function l(e){let n=o();await t.mkdir(n,{recursive:!0,mode:448});let r=s();await t.writeFile(r,JSON.stringify(e,null,2),{mode:384}),process.platform!==`win32`&&await t.chmod(r,384)}async function u(e){let t=await c(),n=i.parse({...t,...e});return await l(n),n}export{a as DEFAULT_CONFIG,o as configDir,s as configPath,i as configSchema,c as readConfig,u as updateConfig,l as writeConfig};
@@ -1 +1 @@
1
- import{DEFAULT_CONFIG as e,configDir as t,configPath as n,configSchema as r,readConfig as i,updateConfig as a,writeConfig as o}from"./config-Dn_Cl0cD.js";export{i as readConfig};
1
+ import{DEFAULT_CONFIG as e,configDir as t,configPath as n,configSchema as r,readConfig as i,updateConfig as a,writeConfig as o}from"./config--JRu_jFq.js";export{i as readConfig};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-CRn5UoFi.js";import{Box as c,Text as l}from"ink";import u from"react";function d(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`}async function f(f){if(f.connect){let t=await e(),n=t.apiBase.replace(`api.zenovay.com`,`app.zenovay.com`),r=`${n}/settings/integrations/github`;return process.stdout.write(`\n Connect GitHub to Zenovay:\n ${r}\n\n Open this URL in your browser. Zenovay re-uses the same GitHub\n OAuth app you already authorized for login (auth-zenovay), so\n no separate "Zenovay Deploys" app is needed. Pick the repos you\n want to track and deploys will appear here automatically.\n\n`),0}let p=await e(),m=await t({strict:!1}),h=new n({config:p,cliVersion:f.cliVersion,token:m}),g,_;try{({siteId:g,site:_}=await a(h,{explicit:f.siteId,headless:!!(f.json||f.csv||f.tsv||f.ndjson),cliVersion:f.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let v=i(f),y=f.limit??50,b=[{key:`pushed_at`,label:`when`,width:6,format:e=>d(String(e))},{key:`branch`,label:`branch`,width:14,format:e=>String(e??`—`).slice(0,14)},{key:`commit_sha`,label:`commit`,width:9,format:e=>String(e).slice(0,8)},{key:`commit_author`,label:`author`,width:16,format:e=>String(e??`—`).slice(0,16)},{key:`commit_message`,label:`message`,width:40,format:e=>String(e??`—`).slice(0,40)},{key:`show_on_chart`,label:`chart`,width:5,format:e=>e?`●`:`○`}];return s({cliVersion:f.cliVersion,title:`deploys · ${g}`,commandName:`deploys`,ai:{api:h,siteId:g,siteLabel:_?.url?_.url.replace(/^https?:\/\//,``).replace(/\/$/,``):_?.name??g},authToken:m?.accessToken??null,refreshIntervalMs:0,fetcher:e=>h.getDeploys(g,{branch:f.branch,since:f.since,limit:y},e),format:v,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let t of e.deploys)process.stdout.write(JSON.stringify(t)+`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as a}from"./resolve-site-mj0esTrm.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{runAnalyticalScreen as s}from"./analytical-screen-BasvNR-9.js";import{Box as c,Text as l}from"ink";import u from"react";function d(e){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`}async function f(f){if(f.connect){let t=await e(),n=t.apiBase.replace(`api.zenovay.com`,`app.zenovay.com`),r=`${n}/settings/integrations/github`;return process.stdout.write(`\n Connect GitHub to Zenovay:\n ${r}\n\n Open this URL in your browser. Zenovay re-uses the same GitHub\n OAuth app you already authorized for login (auth-zenovay), so\n no separate "Zenovay Deploys" app is needed. Pick the repos you\n want to track and deploys will appear here automatically.\n\n`),0}let p=await e(),m=await t({strict:!1}),h=new n({config:p,cliVersion:f.cliVersion,token:m}),g,_;try{({siteId:g,site:_}=await a(h,{explicit:f.siteId,headless:!!(f.json||f.csv||f.tsv||f.ndjson),cliVersion:f.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let v=i(f),y=f.limit??50,b=[{key:`pushed_at`,label:`when`,width:6,format:e=>d(String(e))},{key:`branch`,label:`branch`,width:14,format:e=>String(e??`—`).slice(0,14)},{key:`commit_sha`,label:`commit`,width:9,format:e=>String(e).slice(0,8)},{key:`commit_author`,label:`author`,width:16,format:e=>String(e??`—`).slice(0,16)},{key:`commit_message`,label:`message`,width:40,format:e=>String(e??`—`).slice(0,40)},{key:`show_on_chart`,label:`chart`,width:5,format:e=>e?`●`:`○`}];return s({cliVersion:f.cliVersion,title:`deploys · ${g}`,commandName:`deploys`,ai:{api:h,siteId:g,siteLabel:_?.url?_.url.replace(/^https?:\/\//,``).replace(/\/$/,``):_?.name??g},authToken:m?.accessToken??null,refreshIntervalMs:0,fetcher:e=>h.getDeploys(g,{branch:f.branch,since:f.since,limit:y},e),format:v,headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let t of e.deploys)process.stdout.write(JSON.stringify(t)+`
2
2
  `);else process.stdout.write(JSON.stringify(e,null,2));return}process.stdout.write(r(e.deploys,[`pushed_at`,`branch`,`commit_sha`,`commit_author`,`commit_message`,`repository`,`commit_url`,`show_on_chart`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>{let t=e.deploys.filter(e=>e.show_on_chart).length,n=new Set(e.deploys.map(e=>e.repository).filter(e=>!!e));return u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{bold:!0},e.total),u.createElement(l,{color:`gray`},` commits`,f.branch?` · branch=${f.branch}`:``)),u.createElement(l,{color:`gray`},u.createElement(l,{color:`magenta`},`● `,t,` on chart`),u.createElement(l,null,` · `),u.createElement(l,null,n.size,` `,n.size===1?`repo`:`repos`)))}},{id:`list`,title:`Recent`,render:e=>e.deploys.length===0?u.createElement(c,{flexDirection:`column`},u.createElement(l,{color:`gray`},`— no commits yet —`),u.createElement(l,{color:`gray`},"Run `zenovay deploys --connect` to wire up the GitHub integration.")):u.createElement(o,{data:e.deploys.slice(0,30),columns:b,headerStyle:`accent`})}]})}export{f as deploysCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getDevices(u);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-BuRZNWYM.js`);return t(e.devices,[`name`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.devices)process.stdout.write(JSON.stringify(t)+`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-mj0esTrm.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getDevices(u);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-BuRZNWYM.js`);return t(e.devices,[`name`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.devices)process.stdout.write(JSON.stringify(t)+`
2
2
  `);return 0}return r({type:`devices.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(C,{api:l,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:c}=g(),[h,S]=b(null),[C,w]=b(!0),[T,E]=b(null);if(_(e=>{if(e===`o`||e===`O`){f(d(`devices`,{siteId:t}));return}e===`q`&&(c(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getDevices(t);n||(S(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(a,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Fetching breakdown…`))));if(T)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:T}));let D=!h||h.devices.length===0&&h.browsers.length===0&&h.os.length===0;if(D)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let O=[{key:`name`,label:`name`,width:16},{key:`visitors`,label:`visitors`,align:`right`,width:8}];return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`devices · ${n}`}),v.createElement(p,{flexDirection:`row`},v.createElement(a,{title:`Devices`},h.devices.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:O,data:h.devices,zebra:!0})),v.createElement(a,{title:`Browsers`},h.browsers.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:O,data:h.browsers,zebra:!0})),v.createElement(a,{title:`OS`},h.os.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:O,data:h.os,zebra:!0}))),v.createElement(s,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{S as devicesCommand};
@@ -0,0 +1,20 @@
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-FCanTxsb.js";import{readToken as n}from"./token-store-BQuGH0z2.js";import{parseSseStream as r}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{detectInstallPaths as o,remediationHint as s,runHealthChecks as c}from"./health-hG9EHf7v.js";import{join as l}from"node:path";import{homedir as u,platform as d}from"node:os";import{stat as f}from"node:fs/promises";async function p(){let e=u(),t=d()===`darwin`,n=[{name:`Claude Code`,path:l(e,`.claude`)},{name:`Cursor`,path:t?l(e,`Library`,`Application Support`,`Cursor`):l(e,`.config`,`Cursor`)},{name:`Windsurf`,path:t?l(e,`Library`,`Application Support`,`Windsurf`):l(e,`.config`,`Windsurf`)},{name:`VS Code`,path:l(e,`.vscode`)}];return Promise.all(n.map(async e=>{try{return await f(e.path),{name:e.name,installed:!0,configPath:e.path}}catch{return{name:e.name,installed:!1}}}))}async function m(l){let u=await c({cliVersion:l.cliVersion,binaryPath:l.binaryPath}),d=await p();if(a(l))process.stdout.write(`${JSON.stringify({type:`doctor.agents`,agents:d})}\n`);else{process.stdout.write(`
2
+ AI Agents:
3
+ `);for(let e of d){let t=e.installed?`\x1B[32m✔\x1B[0m`:`\x1B[2m✗\x1B[0m`,n=e.installed&&e.configPath?` \x1b[2m${e.configPath}\x1b[0m`:``;process.stdout.write(` ${t} ${e.name}${n}\n`)}process.stdout.write(`
4
+ `)}let f=o(`zenovay`);if(f.paths.length>=2){let e=s(f,l.binaryPath);a(l)?process.stdout.write(`${JSON.stringify({type:`doctor.dual_binary`,info:f,hint:e})}\n`):(process.stdout.write(`
5
+ \x1B[33m⚠\x1B[0m Install path conflict
6
+ `),process.stdout.write(e+`
7
+
8
+ `))}let m=u.filter(e=>e.status===`fail`);if(m.length===0)return a(l)||process.stdout.write(`All checks pass — no healing needed.
9
+ `),0;let h=await e(),g=await n({strict:!1});if(!g){for(let e of m)process.stderr.write(`[${e.name}] ${e.detail}\n`);return process.stderr.write(`
10
+ Log in with \`zenovay login\` for AI-assisted diagnosis.
11
+ `),1}let _=new t({config:h,cliVersion:l.cliVersion,token:g}),v={platform:process.platform,arch:process.arch,node:process.version,cliVersion:l.cliVersion},y=`The Zenovay CLI failed the following health checks. Diagnose and propose a fix.
12
+
13
+ Environment: ${JSON.stringify(v)}
14
+ Failed checks: ${JSON.stringify(m,null,2)}
15
+
16
+ Respond with (1) a one-paragraph diagnosis, (2) a proposed fix command if applicable. Do not invent commands that could affect unrelated files. If the fix is system-level (e.g., chmod), print the exact command so the user can copy it.`,b=await _.openAiStream(`chat`,{messages:[{role:`user`,content:y}]});a(l)||process.stdout.write(`
17
+ Zenovay doctor — AI diagnosis:
18
+
19
+ `);for await(let e of r(b)){if(e.type===`delta`&&(a(l)?i({type:`ai.token`,mode:`chat`,content:e.content}):process.stdout.write(e.content)),e.type===`error`)return a(l)?i({type:`error`,code:e.code,message:e.message}):process.stderr.write(`\n[${e.code}] ${e.message}\n`),1;if(e.type===`done`)break}return a(l)||process.stdout.write(`
20
+ `),0}export{m as doctorCommand};
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emitErrorEnvelope as n}from"./error-codes-BohPg7wr.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{fmtNumber as l,formatTable as u,shortId as d}from"./fmt-gMsty5jy.js";async function f(i){let o=await e(),f=await t({strict:!1});if(!f)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let p=new r({config:o,cliVersion:i.cliVersion,token:f}),m;try{({siteId:m}=await c(p,{explicit:void 0,headless:!0,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let h;try{h=await p.getProjects(m)}catch(e){return n(e,{command:`domains list`})}let g=h.projects??[];if(i.json)return a(s(g,`domains.list`),{legacyKey:`domains`,legacyValue:g}),0;if(g.length===0)return process.stdout.write(`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-C5caZH9p.js";import{ApiV2Client as r}from"./api-v2-CI5hxW-O.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{resolveSiteId as c}from"./resolve-site-mj0esTrm.js";import{fmtNumber as l,formatTable as u,shortId as d}from"./fmt-gMsty5jy.js";async function f(i){let o=await e(),f=await t({strict:!1});if(!f)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let p=new r({config:o,cliVersion:i.cliVersion,token:f}),m;try{({siteId:m}=await c(p,{explicit:void 0,headless:!0,cliVersion:i.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let h;try{h=await p.getProjects(m)}catch(e){return n(e,{command:`domains list`})}let g=h.projects??[];if(i.json)return a(s(g,`domains.list`),{legacyKey:`domains`,legacyValue:g}),0;if(g.length===0)return process.stdout.write(`
2
2
  No domains tracked yet — add one with \`zenovay domains add <url>\`.
3
3
 
4
4
  `),0;let _=[{key:`isCurrent`,header:``,width:1,format:e=>e?`*`:` `},{key:`name`,header:`name`,width:18,format:e=>String(e??`—`)},{key:`domain`,header:`domain`,width:28,format:e=>String(e??`—`)},{key:`tier`,header:`tier`,width:6,format:e=>String(e??`—`)},{key:`pageviews24h`,header:`24h pv`,width:8,align:`right`,format:e=>l(Number(e??0))},{key:`id`,header:`id`,width:14,format:e=>d(String(e))}];return process.stdout.write(`
@@ -1,2 +1,2 @@
1
- import{ApiError as e}from"./api-BD_nTdOq.js";function t(e){let t=process.env.HOME??process.env.USERPROFILE??``;return t&&e.includes(t)?e.split(t).join(`~`):e}function n(n){if(n instanceof e){let e=n.status,r=t(n.message),i=n.body,a=(()=>{if(!(typeof i!=`object`||!i)){if(typeof i.message==`string`&&i.message.length>0)return i.message;if(typeof i.error==`string`&&i.error.length>0)return i.error;if(typeof i.error==`object`&&i.error!==null&&typeof i.error.message==`string`&&i.error.message.length>0)return i.error.message}})(),o=a?t(a):r,s=new Set([`auth_required`,`auth_invalid`,`tier_insufficient`,`forbidden`,`not_found`,`validation_failed`,`rate_limited`,`idempotency_replay`,`network_error`,`server_error`,`unknown`]);if(i?.type===`error`&&typeof i.code==`string`&&s.has(i.code))return{type:`error`,code:i.code,message:o,...i.hint?{hint:t(String(i.hint))}:{}};if(e===401){let e=/no\s+token|missing\s+(token|auth)|not\s+(logged|authenticated)/i.test(r);return{type:`error`,code:e?`auth_required`:`auth_invalid`,message:o,hint:e?"Run `zenovay login` to authenticate.":"Your session expired. Run `zenovay login` to re-authenticate."}}if(e===402){let e=i?.upgradeUrl??i?.upgrade_url??`https://app.zenovay.com/billing`;return{type:`error`,code:`tier_insufficient`,message:o,hint:`Upgrade your plan: ${e}`}}if(e===403)return{type:`error`,code:`forbidden`,message:o,hint:`You do not have permission for this action.`};if(e===404)return{type:`error`,code:`not_found`,message:o};if(e===400||e===422)return{type:`error`,code:`validation_failed`,message:o,hint:`Check the command flags and arguments.`};if(e===429)return{type:`error`,code:`rate_limited`,message:o,hint:`You hit a rate limit. Wait a moment and retry.`};if(e===409){let e=/idempot/i.test(r)||/idempot/i.test(String(a??``));return e?{type:`error`,code:`idempotency_replay`,message:o,hint:`Same idempotency key was used for a different request body.`}:{type:`error`,code:`unknown`,message:o}}return e>=500&&e<600?{type:`error`,code:`server_error`,message:o,hint:`Server-side issue. Try again shortly or check status.zenovay.com.`}:{type:`error`,code:`unknown`,message:o}}let r=n,i=r?.code??r?.cause?.code;if(i===`ENOTFOUND`||i===`ECONNREFUSED`||i===`ETIMEDOUT`||i===`EAI_AGAIN`)return{type:`error`,code:`network_error`,message:t(String(r?.message??i)),hint:`Check your internet connection and try again.`};if(n instanceof Error){let e=t(n.message);return n.name===`ValidationError`?{type:`error`,code:`validation_failed`,message:e,hint:`Check the command flags and arguments.`}:(/abort/i.test(e),{type:`error`,code:`unknown`,message:e})}return{type:`error`,code:`unknown`,message:typeof n==`string`?t(n):`An unknown error occurred.`}}function r(){let e=process.env.ZENOVAY_CLI_VERSION??`0`,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`)),n=t.join(` `)||`unknown`;return{cliVersion:e,command:n}}function i(e,t){let i=n(e),a=r(),o={cliVersion:t?.cliVersion??a.cliVersion,command:t?.command??a.command,...t};return{...i,ts:new Date().toISOString(),meta:o}}function a(){return!!(process.argv.includes(`--json`)||process.argv.includes(`-q`)||process.argv.includes(`--quiet`)||process.env.ZENOVAY_FORMAT===`json`||process.env.ZENOVAY_FORMAT===`ndjson`||!process.stdout.isTTY||process.env.CI===`true`||process.env.CI===`1`)}function o(e,t){let n=i(e,t);return a()?process.stderr.write(JSON.stringify(n)+`
1
+ import{ApiError as e}from"./api-FCanTxsb.js";function t(e){let t=process.env.HOME??process.env.USERPROFILE??``;return t&&e.includes(t)?e.split(t).join(`~`):e}function n(n){if(n instanceof e){let e=n.status,r=t(n.message),i=n.body,a=(()=>{if(!(typeof i!=`object`||!i)){if(typeof i.message==`string`&&i.message.length>0)return i.message;if(typeof i.error==`string`&&i.error.length>0)return i.error;if(typeof i.error==`object`&&i.error!==null&&typeof i.error.message==`string`&&i.error.message.length>0)return i.error.message}})(),o=a?t(a):r,s=new Set([`auth_required`,`auth_invalid`,`tier_insufficient`,`forbidden`,`not_found`,`validation_failed`,`rate_limited`,`idempotency_replay`,`network_error`,`server_error`,`unknown`]);if(i?.type===`error`&&typeof i.code==`string`&&s.has(i.code))return{type:`error`,code:i.code,message:o,...i.hint?{hint:t(String(i.hint))}:{}};if(e===401){let e=/no\s+token|missing\s+(token|auth)|not\s+(logged|authenticated)/i.test(r);return{type:`error`,code:e?`auth_required`:`auth_invalid`,message:o,hint:e?"Run `zenovay login` to authenticate.":"Your session expired. Run `zenovay login` to re-authenticate."}}if(e===402){let e=i?.upgradeUrl??i?.upgrade_url??`https://app.zenovay.com/billing`;return{type:`error`,code:`tier_insufficient`,message:o,hint:`Upgrade your plan: ${e}`}}if(e===403)return{type:`error`,code:`forbidden`,message:o,hint:`You do not have permission for this action.`};if(e===404)return{type:`error`,code:`not_found`,message:o};if(e===400||e===422)return{type:`error`,code:`validation_failed`,message:o,hint:`Check the command flags and arguments.`};if(e===429)return{type:`error`,code:`rate_limited`,message:o,hint:`You hit a rate limit. Wait a moment and retry.`};if(e===409){let e=/idempot/i.test(r)||/idempot/i.test(String(a??``));return e?{type:`error`,code:`idempotency_replay`,message:o,hint:`Same idempotency key was used for a different request body.`}:{type:`error`,code:`unknown`,message:o}}return e>=500&&e<600?{type:`error`,code:`server_error`,message:o,hint:`Server-side issue. Try again shortly or check status.zenovay.com.`}:{type:`error`,code:`unknown`,message:o}}let r=n,i=r?.code??r?.cause?.code;if(i===`ENOTFOUND`||i===`ECONNREFUSED`||i===`ETIMEDOUT`||i===`EAI_AGAIN`)return{type:`error`,code:`network_error`,message:t(String(r?.message??i)),hint:`Check your internet connection and try again.`};if(n instanceof Error){let e=t(n.message);return n.name===`ValidationError`?{type:`error`,code:`validation_failed`,message:e,hint:`Check the command flags and arguments.`}:(/abort/i.test(e),{type:`error`,code:`unknown`,message:e})}return{type:`error`,code:`unknown`,message:typeof n==`string`?t(n):`An unknown error occurred.`}}function r(){let e=process.env.ZENOVAY_CLI_VERSION??`0`,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`)),n=t.join(` `)||`unknown`;return{cliVersion:e,command:n}}function i(e,t){let i=n(e),a=r(),o={cliVersion:t?.cliVersion??a.cliVersion,command:t?.command??a.command,...t};return{...i,ts:new Date().toISOString(),meta:o}}function a(){return!!(process.argv.includes(`--json`)||process.argv.includes(`-q`)||process.argv.includes(`--quiet`)||process.env.ZENOVAY_FORMAT===`json`||process.env.ZENOVAY_FORMAT===`ndjson`||!process.stdout.isTTY||process.env.CI===`true`||process.env.CI===`1`)}function o(e,t){let n=i(e,t);return a()?process.stderr.write(JSON.stringify(n)+`
2
2
  `):(process.stderr.write(`\n✗ ${n.message}\n`),n.hint&&process.stderr.write(` ${n.hint}\n`)),n.code===`validation_failed`||n.code===`auth_required`?2:1}export{i as buildErrorEnvelope,o as emitErrorEnvelope,a as isJsonOutputMode,n as normalizeError};
@@ -0,0 +1 @@
1
+ import"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import"./token-store-BQuGH0z2.js";import{buildErrorEnvelope as e,emitErrorEnvelope as t,isJsonOutputMode as n,normalizeError as r}from"./error-codes-C5caZH9p.js";export{t as emitErrorEnvelope};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{spark as a}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as o}from"./resolve-site-DSJR9vuz.js";import{DataTable as s}from"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import{deepLinkFor as c,openInBrowser as l}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as u}from"./analytical-screen-CRn5UoFi.js";import"./ui-Cey-h6wI.js";import{Box as d,Text as f}from"ink";import p from"react";function m(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}function h(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}async function g(g){let _=await e(),v=await t({strict:!1}),y=new n({config:_,cliVersion:g.cliVersion,token:v}),b,x;try{({siteId:b,site:x}=await o(y,{explicit:g.siteId,headless:!!(g.json||g.csv||g.tsv||g.ndjson),cliVersion:g.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let S=i(g),C=g.window??`24h`,w=g.limit??100,T=[{key:`ts`,label:`when`,width:6,format:e=>h(String(e))},{key:`class`,label:`class`,width:18,format:e=>String(e)},{key:`message`,label:`message`,width:42,format:e=>m(String(e??``),42)},{key:`page`,label:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:8,format:e=>String(e??`—`)}];return u({cliVersion:g.cliVersion,title:`errors · ${b} · ${C}`,commandName:`errors`,ai:{api:y,siteId:b,siteLabel:x?.url?x.url.replace(/^https?:\/\//,``).replace(/\/$/,``):x?.name??b},authToken:v?.accessToken??null,refreshIntervalMs:g.watch?3e4:0,fetcher:e=>y.getErrors(b,{window:C,limit:w},e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{l(c(`errors`,{siteId:b}))}}},headlessEmit:(e,t)=>{let n=g.search?e.errors.filter(e=>e.class.toLowerCase().includes(g.search.toLowerCase())||e.message.toLowerCase().includes(g.search.toLowerCase())):e.errors;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of n)process.stdout.write(JSON.stringify(e)+`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./progress-row-BpAXjJPL.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import{spark as a}from"./sparkline-BZ0eMB-w.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as o}from"./resolve-site-mj0esTrm.js";import{DataTable as s}from"./data-table-BpbyyNSA.js";import"./bar-DWT-1xOE.js";import{deepLinkFor as c,openInBrowser as l}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as u}from"./analytical-screen-BasvNR-9.js";import"./ui-Cey-h6wI.js";import{Box as d,Text as f}from"ink";import p from"react";function m(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}function h(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}async function g(g){let _=await e(),v=await t({strict:!1}),y=new n({config:_,cliVersion:g.cliVersion,token:v}),b,x;try{({siteId:b,site:x}=await o(y,{explicit:g.siteId,headless:!!(g.json||g.csv||g.tsv||g.ndjson),cliVersion:g.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let S=i(g),C=g.window??`24h`,w=g.limit??100,T=[{key:`ts`,label:`when`,width:6,format:e=>h(String(e))},{key:`class`,label:`class`,width:18,format:e=>String(e)},{key:`message`,label:`message`,width:42,format:e=>m(String(e??``),42)},{key:`page`,label:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:8,format:e=>String(e??`—`)}];return u({cliVersion:g.cliVersion,title:`errors · ${b} · ${C}`,commandName:`errors`,ai:{api:y,siteId:b,siteLabel:x?.url?x.url.replace(/^https?:\/\//,``).replace(/\/$/,``):x?.name??b},authToken:v?.accessToken??null,refreshIntervalMs:g.watch?3e4:0,fetcher:e=>y.getErrors(b,{window:C,limit:w},e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{l(c(`errors`,{siteId:b}))}}},headlessEmit:(e,t)=>{let n=g.search?e.errors.filter(e=>e.class.toLowerCase().includes(g.search.toLowerCase())||e.message.toLowerCase().includes(g.search.toLowerCase())):e.errors;if(t===`json`||t===`ndjson`){if(t===`ndjson`)for(let e of n)process.stdout.write(JSON.stringify(e)+`
2
2
  `);else process.stdout.write(JSON.stringify({errors:n,total:n.length},null,2));return}process.stdout.write(r(n,[`ts`,`class`,`message`,`page`,`device`,`fingerprint`],t))},panels:[{id:`summary`,title:`Recent errors`,render:e=>{let t=g.search?e.errors.filter(e=>e.class.toLowerCase().includes(g.search.toLowerCase())||e.message.toLowerCase().includes(g.search.toLowerCase())):e.errors,n=new Map,r=Date.now(),i=60;for(let e of t){let t=new Date(e.ts).getTime(),a=Math.floor((r-t)/(60*1e3));if(a<0||a>=i)continue;let o=n.get(e.class)??Array(i).fill(0),s=i-1-a;o[s]+=1,n.set(e.class,o)}let o=[...n.entries()].sort((e,t)=>t[1].reduce((e,t)=>e+t,0)-e[1].reduce((e,t)=>e+t,0)).slice(0,6);return p.createElement(d,{flexDirection:`column`},p.createElement(f,null,p.createElement(f,{bold:!0},t.length),p.createElement(f,{color:`gray`},` errors in `,C)),o.length===0?null:p.createElement(d,{flexDirection:`column`,marginTop:1},o.map(([e,t])=>p.createElement(f,{key:e},p.createElement(f,{color:`red`},e.padEnd(20).slice(0,20)),` `,p.createElement(f,{color:`gray`},a(t,30))))))}},{id:`table`,title:`Detail`,render:e=>{let t=g.search?e.errors.filter(e=>e.class.toLowerCase().includes(g.search.toLowerCase())||e.message.toLowerCase().includes(g.search.toLowerCase())):e.errors;return t.length===0?p.createElement(f,{color:`gray`},`— no errors `,g.search?`matching "${g.search}"`:`in window`,` —`):p.createElement(s,{data:t.slice(0,30),columns:T,headerStyle:`accent`})}}]})}export{g as errorsCommand};
@@ -1,4 +1,4 @@
1
- import{readConfig as e,updateConfig as t}from"./config-Dn_Cl0cD.js";import{ApiClient as n}from"./api-BD_nTdOq.js";import{readToken as r}from"./token-store-DWXh9r3Z.js";import{parseSseStream as i}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import{TextInput as c}from"./prompt-D-Uzz_GF.js";import{Keybar as l}from"./keybar-DsYTkKZX.js";import u from"node:path";import{promises as d}from"node:fs";import f from"node:os";import p from"node:crypto";import{Box as m,Static as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useRef as S,useState as C}from"react";const w=new Set([`type`,`page`,`country`,`device`,`user_id`,`sessionId`,`referrer`,`ts`,`url`,`method`,`status`]);function T(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(/\s/.test(r)){n+=1;continue}if(r===`(`){t.push({kind:`lparen`}),n+=1;continue}if(r===`)`){t.push({kind:`rparen`}),n+=1;continue}if(r===`"`||r===`'`){let i=r,a=n+1,o=``;for(;a<e.length&&e[a]!==i;)e[a]===`\\`&&a+1<e.length?(o+=e[a+1],a+=2):(o+=e[a],a+=1);if(a>=e.length)throw Error(`filter: unterminated string starting at column ${n+1}`);t.push({kind:`string`,value:o}),n=a+1;continue}if(r===`!`&&e[n+1]===`=`){t.push({kind:`op`,value:`!=`}),n+=2;continue}if(r===`!`&&e[n+1]===`~`){t.push({kind:`op`,value:`!~`}),n+=2;continue}if(r===`=`){t.push({kind:`op`,value:`=`}),n+=1;continue}if(r===`~`){t.push({kind:`op`,value:`~`}),n+=1;continue}let i=n;for(;n<e.length&&!/[\s()=!~]/.test(e[n])&&e[n]!==`"`&&e[n]!==`'`;)n+=1;let a=e.slice(i,n);if(a.length===0)throw Error(`filter: unexpected character at column ${i+1}`);let o=a.toUpperCase();o===`AND`?t.push({kind:`and`}):o===`OR`?t.push({kind:`or`}):t.push({kind:`ident`,value:a})}return t}function E(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function D(e,t,n){let r=e==null?``:String(e);switch(t){case`=`:return r===n;case`!=`:return r!==n;case`~`:{let e=new RegExp(E(n),`i`);return e.test(r)}case`!~`:{let e=new RegExp(E(n),`i`);return!e.test(r)}}}function O(e){return e.tokens[e.pos]}function k(e){let t=e.tokens[e.pos];return e.pos+=1,t}function A(e){let t=O(e);if(!t)throw Error(`filter: unexpected end of expression`);if(t.kind===`lparen`){k(e);let t=j(e),n=k(e);if(!n||n.kind!==`rparen`)throw Error(`filter: missing closing ")"`);return t}if(t.kind!==`ident`)throw Error(`filter: expected key, got ${t.kind}`);k(e);let n=t.value;if(!w.has(n))throw Error(`filter: unknown key "${n}". Allowed: ${[...w].join(`, `)}`);let r=k(e);if(!r||r.kind!==`op`)throw Error(`filter: expected operator after "${n}"`);let i=k(e);if(!i||i.kind!==`ident`&&i.kind!==`string`)throw Error(`filter: expected value after operator "${r.value}"`);let a=r.value,o=i.value;return e=>D(e[n],a,o)}function j(e){let t=A(e);for(;;){let n=O(e);if(!n)break;if(n.kind===`and`){k(e);let n=A(e),r=t;t=e=>r(e)&&n(e);continue}if(n.kind===`or`){k(e);let n=A(e),r=t;t=e=>r(e)||n(e);continue}break}return t}function M(e){if(typeof e!=`string`||e.trim().length===0)throw Error(`filter: expression is empty`);let t=T(e);if(t.length===0)throw Error(`filter: expression is empty`);let n={tokens:t,pos:0},r=j(n);if(n.pos!==t.length){let e=n.tokens[n.pos];throw Error(`filter: unexpected trailing token "${N(e)}"`)}return r}function N(e){return e.kind===`ident`||e.kind===`string`||e.kind===`op`?e.value:e.kind}const P=10*1024*1024;var F=class{currentBytes=0;initialized=!1;writeQueue=Promise.resolve();constructor(e,t=P){this.filePath=e,this.maxBytes=t}async init(){if(!this.initialized){this.initialized=!0;try{await d.mkdir(u.dirname(this.filePath),{recursive:!0,mode:448})}catch{}try{let e=await d.stat(this.filePath);this.currentBytes=e.size}catch{this.currentBytes=0}}}append(e){let t=(async()=>{await this.init();let t=e.endsWith(`
1
+ import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import{ApiClient as n}from"./api-FCanTxsb.js";import{readToken as r}from"./token-store-BQuGH0z2.js";import{parseSseStream as i}from"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import{TextInput as c}from"./prompt-D-Uzz_GF.js";import{Keybar as l}from"./keybar-DsYTkKZX.js";import u from"node:path";import{promises as d}from"node:fs";import f from"node:os";import p from"node:crypto";import{Box as m,Static as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useRef as S,useState as C}from"react";const w=new Set([`type`,`page`,`country`,`device`,`user_id`,`sessionId`,`referrer`,`ts`,`url`,`method`,`status`]);function T(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(/\s/.test(r)){n+=1;continue}if(r===`(`){t.push({kind:`lparen`}),n+=1;continue}if(r===`)`){t.push({kind:`rparen`}),n+=1;continue}if(r===`"`||r===`'`){let i=r,a=n+1,o=``;for(;a<e.length&&e[a]!==i;)e[a]===`\\`&&a+1<e.length?(o+=e[a+1],a+=2):(o+=e[a],a+=1);if(a>=e.length)throw Error(`filter: unterminated string starting at column ${n+1}`);t.push({kind:`string`,value:o}),n=a+1;continue}if(r===`!`&&e[n+1]===`=`){t.push({kind:`op`,value:`!=`}),n+=2;continue}if(r===`!`&&e[n+1]===`~`){t.push({kind:`op`,value:`!~`}),n+=2;continue}if(r===`=`){t.push({kind:`op`,value:`=`}),n+=1;continue}if(r===`~`){t.push({kind:`op`,value:`~`}),n+=1;continue}let i=n;for(;n<e.length&&!/[\s()=!~]/.test(e[n])&&e[n]!==`"`&&e[n]!==`'`;)n+=1;let a=e.slice(i,n);if(a.length===0)throw Error(`filter: unexpected character at column ${i+1}`);let o=a.toUpperCase();o===`AND`?t.push({kind:`and`}):o===`OR`?t.push({kind:`or`}):t.push({kind:`ident`,value:a})}return t}function E(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function D(e,t,n){let r=e==null?``:String(e);switch(t){case`=`:return r===n;case`!=`:return r!==n;case`~`:{let e=new RegExp(E(n),`i`);return e.test(r)}case`!~`:{let e=new RegExp(E(n),`i`);return!e.test(r)}}}function O(e){return e.tokens[e.pos]}function k(e){let t=e.tokens[e.pos];return e.pos+=1,t}function A(e){let t=O(e);if(!t)throw Error(`filter: unexpected end of expression`);if(t.kind===`lparen`){k(e);let t=j(e),n=k(e);if(!n||n.kind!==`rparen`)throw Error(`filter: missing closing ")"`);return t}if(t.kind!==`ident`)throw Error(`filter: expected key, got ${t.kind}`);k(e);let n=t.value;if(!w.has(n))throw Error(`filter: unknown key "${n}". Allowed: ${[...w].join(`, `)}`);let r=k(e);if(!r||r.kind!==`op`)throw Error(`filter: expected operator after "${n}"`);let i=k(e);if(!i||i.kind!==`ident`&&i.kind!==`string`)throw Error(`filter: expected value after operator "${r.value}"`);let a=r.value,o=i.value;return e=>D(e[n],a,o)}function j(e){let t=A(e);for(;;){let n=O(e);if(!n)break;if(n.kind===`and`){k(e);let n=A(e),r=t;t=e=>r(e)&&n(e);continue}if(n.kind===`or`){k(e);let n=A(e),r=t;t=e=>r(e)||n(e);continue}break}return t}function M(e){if(typeof e!=`string`||e.trim().length===0)throw Error(`filter: expression is empty`);let t=T(e);if(t.length===0)throw Error(`filter: expression is empty`);let n={tokens:t,pos:0},r=j(n);if(n.pos!==t.length){let e=n.tokens[n.pos];throw Error(`filter: unexpected trailing token "${N(e)}"`)}return r}function N(e){return e.kind===`ident`||e.kind===`string`||e.kind===`op`?e.value:e.kind}const P=10*1024*1024;var F=class{currentBytes=0;initialized=!1;writeQueue=Promise.resolve();constructor(e,t=P){this.filePath=e,this.maxBytes=t}async init(){if(!this.initialized){this.initialized=!0;try{await d.mkdir(u.dirname(this.filePath),{recursive:!0,mode:448})}catch{}try{let e=await d.stat(this.filePath);this.currentBytes=e.size}catch{this.currentBytes=0}}}append(e){let t=(async()=>{await this.init();let t=e.endsWith(`
2
2
  `)?e:`${e}\n`,n=Buffer.byteLength(t,`utf8`);this.currentBytes+n>this.maxBytes&&await this.rotate();try{await d.appendFile(this.filePath,t,{mode:384}),this.currentBytes+=n}catch(e){process.stderr.write(`[scrollback] append failed: ${e.message}\n`)}})();return this.writeQueue=this.writeQueue.then(()=>t,()=>t),t}async rotate(){let e=e=>{if(e===0)return this.filePath;let t=u.parse(this.filePath);return u.join(t.dir,`${t.name}.${e}${t.ext}`)};try{await d.unlink(e(3))}catch{}for(let t=2;t>=0;--t)try{await d.rename(e(t),e(t+1))}catch(n){n.code!==`ENOENT`&&process.stderr.write(`[scrollback] rotate ${e(t)} failed: ${n.message}\n`)}this.currentBytes=0}async close(){await this.writeQueue}};const I=5e3,L=33,R=`─── replay end, live below ───`;async function z(i){if(i.setForwardSecret)return await t({forwardSecret:i.setForwardSecret}),process.stdout.write(`Forward secret saved.
3
3
  `),0;let o=await e(),s=await r({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new n({config:o,cliVersion:i.cliVersion,token:s}),l=null;if(i.filter)try{l=M(i.filter)}catch(e){return process.stderr.write(`Invalid --filter expression: ${e.message}\n`),2}if(a(i))return H(c,i,l,o.forwardSecret);let d=i.scrollbackPath??u.join(f.homedir(),`.zenovay`,`events-scrollback.log`);return new Promise(e=>{let{unmount:t}=_(b.createElement(U,{api:c,opts:i,predicate:l,forwardSecret:o.forwardSecret,scrollbackPath:d,onExit:n=>{t(),e(n)}}))})}function B(e){return{raw:JSON.stringify(e),parsed:e}}async function V(e,t,n){let r=JSON.stringify(n),i=p.createHmac(`sha256`,t).update(r).digest(`hex`);try{await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Zenovay-Signature":`sha256=${i}`},body:r})}catch{}}async function H(e,t,n,r){let a=new AbortController;process.on(`SIGINT`,()=>a.abort());let o=()=>new Date().toISOString();try{let s=await e.openEventsStream(t.siteId,a.signal);for await(let e of i(s)){if(e.type===`error`)return process.stdout.write(`${JSON.stringify({ts:o(),type:`error`,code:e.code,message:e.message})}\n`),1;if(e.type===`done`)return 0;let i=e;if(n&&!n(i))continue;process.stdout.write(`${JSON.stringify({ts:o(),...i})}\n`),t.forwardTo&&r&&await V(t.forwardTo,r,{event:e,ts:o(),site_id:t.siteId})}return 0}catch(e){return process.stdout.write(`${JSON.stringify({ts:o(),type:`error`,code:`stream_failed`,message:e.message})}\n`),1}}const U=({api:e,opts:t,predicate:n,forwardSecret:r,scrollbackPath:a,onExit:u})=>{let{exit:f}=v(),p=S([]),_=S(null),[w,T]=C([]),[E,D]=C(null),[O,k]=C(!1),[A,j]=C(null);_.current||=new F(a),y(n=>{if(!O){if(E){D(null);return}if(n===`q`){f(),u(0);return}if(n===`f`){let e=p.current[p.current.length-1];e&&D(e);return}if(n===`w`){k(!0);return}if(n===`r`){G(e,t.siteId,p,j);return}}}),x(()=>{let e=setInterval(()=>{let e=p.current.slice(-100);T(e)},L);return()=>clearInterval(e)},[]),x(()=>{let a=new AbortController,o=!1;return(async()=>{t.replay24h&&await G(e,t.siteId,p,j);try{let s=await e.openEventsStream(t.siteId,a.signal);for await(let e of i(s)){if(o)break;if(e.type===`error`){let t={raw:`[ERR ${e.code}] ${e.message}`};W(p,t),_.current?.append(t.raw);continue}if(e.type===`done`)break;let i=e;if(n&&!n(i))continue;let a=B(e);W(p,a),_.current?.append(a.raw),t.forwardTo&&r&&V(t.forwardTo,r,{event:e,ts:new Date().toISOString(),site_id:t.siteId})}}catch(e){let t={raw:`[DISCONNECT] ${e.message}`};W(p,t)}})(),()=>{o=!0,a.abort(),_.current?.close()}},[e,t.siteId,t.replay24h,t.forwardTo,n,r]);let M=async e=>{let t=e.trim()||`events.ndjson`;try{let e=p.current.map(e=>e.raw).join(`
4
4
  `)+`
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emitErrorEnvelope as n}from"./error-codes-BohPg7wr.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{requireTier as i}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{resolveSiteId as s}from"./resolve-site-DSJR9vuz.js";import{toCsv as c}from"./csv-emit-Dn3c0RCG.js";import{resolve as l}from"node:path";import{writeFile as u}from"node:fs/promises";function d(e){let t=(e??`30d`).toLowerCase();return t===`7d`||t===`30d`||t===`90d`?t:`30d`}function f(e,t){t||process.stderr.isTTY&&process.stderr.write(`${e}\n`)}async function p(c){let p=await e(),g=await t({strict:!1}),_=new r({config:p,cliVersion:c.cliVersion,token:g});if(c.type!==`analytics`&&c.type!==`sessions`&&c.type!==`heatmaps`){let e=`Unknown export type '${c.type}'. Use one of: analytics, sessions, heatmaps.`;return c.json?n(Error(e),{command:`export`,cliVersion:c.cliVersion}):(process.stderr.write(`Error: ${e}\n`),2)}let v=c.format===`json`?`json`:`csv`,y=d(c.range),b=!!c.json;if(c.type===`sessions`||c.type===`heatmaps`)try{await i(_,`pro`)}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}let x;try{({siteId:x}=await s(_,{explicit:c.siteId,headless:b,cliVersion:c.cliVersion}))}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}try{f(`→ Fetching ${c.type} ${y}...`,b);let{rows:e,columns:t}=await m(_,c.type,x,y),n=h(e,t,v),r=c.out?l(process.cwd(),c.out):null;return r?(await u(r,n,`utf8`),c.json?(a(o({rowsWritten:e.length,file:r,format:v,range:y,type:c.type},`export.completed`,{siteId:x,command:`export ${c.type}`,cliVersion:c.cliVersion})),0):(process.stdout.write(`✓ Exported ${e.length} rows to ${r}\n`),0)):(process.stdout.write(n),n.endsWith(`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-C5caZH9p.js";import{ApiV2Client as r}from"./api-v2-CI5hxW-O.js";import{requireTier as i}from"./tier-BneaO4vD.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as a,wrapItem as o}from"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{resolveSiteId as s}from"./resolve-site-mj0esTrm.js";import{toCsv as c}from"./csv-emit-Dn3c0RCG.js";import{resolve as l}from"node:path";import{writeFile as u}from"node:fs/promises";function d(e){let t=(e??`30d`).toLowerCase();return t===`7d`||t===`30d`||t===`90d`?t:`30d`}function f(e,t){t||process.stderr.isTTY&&process.stderr.write(`${e}\n`)}async function p(c){let p=await e(),g=await t({strict:!1}),_=new r({config:p,cliVersion:c.cliVersion,token:g});if(c.type!==`analytics`&&c.type!==`sessions`&&c.type!==`heatmaps`){let e=`Unknown export type '${c.type}'. Use one of: analytics, sessions, heatmaps.`;return c.json?n(Error(e),{command:`export`,cliVersion:c.cliVersion}):(process.stderr.write(`Error: ${e}\n`),2)}let v=c.format===`json`?`json`:`csv`,y=d(c.range),b=!!c.json;if(c.type===`sessions`||c.type===`heatmaps`)try{await i(_,`pro`)}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}let x;try{({siteId:x}=await s(_,{explicit:c.siteId,headless:b,cliVersion:c.cliVersion}))}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`${e.message}\n`),2)}try{f(`→ Fetching ${c.type} ${y}...`,b);let{rows:e,columns:t}=await m(_,c.type,x,y),n=h(e,t,v),r=c.out?l(process.cwd(),c.out):null;return r?(await u(r,n,`utf8`),c.json?(a(o({rowsWritten:e.length,file:r,format:v,range:y,type:c.type},`export.completed`,{siteId:x,command:`export ${c.type}`,cliVersion:c.cliVersion})),0):(process.stdout.write(`✓ Exported ${e.length} rows to ${r}\n`),0)):(process.stdout.write(n),n.endsWith(`
2
2
  `)||process.stdout.write(`
3
3
  `),c.json&&a(o({rowsWritten:e.length,file:null,format:v,range:y,type:c.type},`export.completed`,{siteId:x,command:`export ${c.type}`,cliVersion:c.cliVersion})),0)}catch(e){return c.json?n(e,{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`✗ ${e.message}\n`),1)}}async function m(e,t,n,r){if(t===`analytics`){let t=await e.getStats(n,r);if(t.daily&&t.daily.length>0){let e=t.daily.map(e=>({date:e.date,visitors:e.visitors,pageviews:e.pageviews}));return{rows:e,columns:[`date`,`visitors`,`pageviews`]}}let i=[{range:r,visitors:t.visitors,pageviews:t.pageviews,sessions:t.sessions,bounceRate:t.bounceRate,avgSessionSec:t.avgSessionSec,windowStart:t.windowStart,windowEnd:t.windowEnd}];return{rows:i,columns:[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSessionSec`,`windowStart`,`windowEnd`]}}if(t===`sessions`){let t=await e.getSessions(n),r=t.map(e=>({id:e.id,visitor:e.visitor,durationMs:e.duration,startedAt:e.startedAt,pageCount:e.pageCount,deviceType:e.deviceType??``}));return{rows:r,columns:[`id`,`visitor`,`durationMs`,`startedAt`,`pageCount`,`deviceType`]}}let i=await e.getHeatmaps(n),a=i.map(e=>({id:e.id,url:e.url,type:e.type,captureCount:e.captureCount,createdAt:e.createdAt}));return{rows:a,columns:[`id`,`url`,`type`,`captureCount`,`createdAt`]}}function h(e,t,n){if(n===`json`){let n=e.map(e=>{let n={};for(let r of t)n[String(r)]=e[r];return n});return JSON.stringify(n,null,2)+`
4
4
  `}return c(e,t,`csv`)}export{p as exportCommand};
@@ -1,3 +1,3 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-C_yjPXnw.js";import{resolveSiteId as a}from"./resolve-site-DSJR9vuz.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-CRn5UoFi.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e,t){let n=Math.round(e*t);return`█`.repeat(Math.max(0,Math.min(t,n)))+`░`.repeat(Math.max(0,t-n))}async function m(m){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:m.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:m.siteId,headless:!!(m.json||m.csv||m.tsv||m.ndjson),cliVersion:m.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(m);if(!m.funnelId){let e=[{key:`name`,label:`name`,width:30},{key:`stepCount`,label:`steps`,width:6,align:`right`},{key:`id`,label:`id`,width:36,format:e=>String(e).slice(0,36)}];return l({cliVersion:m.cliVersion,title:`funnels · ${y}`,commandName:`funnels`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:0,fetcher:e=>v.listFunnels(y,e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`funnel`,{siteId:y}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import{formatTabular as r,selectFormat as i}from"./formatter-DutfcQAc.js";import"./panel-B_yDcIcn.js";import"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import"./keybar-DsYTkKZX.js";import"./chat-panel-CqJaCIg3.js";import{resolveSiteId as a}from"./resolve-site-mj0esTrm.js";import{DataTable as o}from"./data-table-BpbyyNSA.js";import{deepLinkFor as s,openInBrowser as c}from"./keybar-deep-link-DC31T3CP.js";import{runAnalyticalScreen as l}from"./analytical-screen-BasvNR-9.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e,t){let n=Math.round(e*t);return`█`.repeat(Math.max(0,Math.min(t,n)))+`░`.repeat(Math.max(0,t-n))}async function m(m){let g=await e(),_=await t({strict:!1}),v=new n({config:g,cliVersion:m.cliVersion,token:_}),y,b;try{({siteId:y,site:b}=await a(v,{explicit:m.siteId,headless:!!(m.json||m.csv||m.tsv||m.ndjson),cliVersion:m.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=i(m);if(!m.funnelId){let e=[{key:`name`,label:`name`,width:30},{key:`stepCount`,label:`steps`,width:6,align:`right`},{key:`id`,label:`id`,width:36,format:e=>String(e).slice(0,36)}];return l({cliVersion:m.cliVersion,title:`funnels · ${y}`,commandName:`funnels`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:0,fetcher:e=>v.listFunnels(y,e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`funnel`,{siteId:y}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
2
2
  `);return}process.stdout.write(r(e.funnels,[`id`,`name`,`stepCount`],t))},panels:[{id:`funnels`,title:`Funnels`,render:t=>t.funnels.length===0?f.createElement(d,{color:`gray`},`— no funnels defined —`):f.createElement(o,{data:t.funnels,columns:e,headerStyle:`accent`})},{id:`hint`,title:`Next`,render:()=>f.createElement(d,{color:`gray`},"Run `zenovay funnel <id>` for drop-off detail.")}]})}let S=m.window??`30d`;return l({cliVersion:m.cliVersion,title:`funnel · ${m.funnelId} · ${S}`,commandName:`funnel`,ai:{api:v,siteId:y,siteLabel:b?.url?b.url.replace(/^https?:\/\//,``).replace(/\/$/,``):b?.name??y},authToken:_?.accessToken??null,refreshIntervalMs:0,fetcher:e=>v.getFunnel(y,m.funnelId,S,e),format:x,keybindings:{o:{label:`open in browser`,handler:()=>{c(s(`funnel`,{siteId:y}))}}},headlessEmit:(e,t)=>{if(t===`json`||t===`ndjson`){process.stdout.write(JSON.stringify(e,null,t===`json`?2:0)),t===`ndjson`&&process.stdout.write(`
3
3
  `);return}process.stdout.write(r(e.steps,[`id`,`name`,`visitors`,`conversions`],t))},panels:[{id:`overview`,title:h(`Overview`),render:e=>f.createElement(u,{flexDirection:`column`},f.createElement(d,{bold:!0},e.name),f.createElement(d,{color:`gray`},e.totalEntries.toLocaleString(),` entries · `,e.totalCompletions.toLocaleString(),` completed (`,(e.conversionRate*100).toFixed(1),`%)`))},{id:`flow`,title:`Flow`,render:e=>{let t=e.totalEntries||1;return f.createElement(u,{flexDirection:`column`},e.steps.map((n,r)=>{let i=n.visitors/t,a=e.steps[r-1],o=a?a.visitors-n.visitors:0,s=a?o/Math.max(1,a.visitors)*100:0;return f.createElement(u,{key:n.id,flexDirection:`column`},a?f.createElement(d,{color:`red`},` `,`↓ drop `,o.toLocaleString(),` (`,s.toFixed(1),`%)`):null,f.createElement(d,null,f.createElement(d,{bold:!0},`${r+1}. ${n.name}`.padEnd(22).slice(0,22)),` `,f.createElement(d,{color:`magenta`},p(i,30)),` `,f.createElement(d,null,(i*100).toFixed(1).padStart(5),`% `),f.createElement(d,{color:`gray`},n.visitors.toLocaleString())))}))}}]})}function h(e){return e}export{m as funnelCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-DSJR9vuz.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getGeo(u);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-BuRZNWYM.js`);return t(e.countries,[`country`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.countries)process.stdout.write(JSON.stringify(t)+`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a}from"./panel-B_yDcIcn.js";import{Banner as o}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as s}from"./keybar-DsYTkKZX.js";import{resolveSiteId as c}from"./resolve-site-mj0esTrm.js";import{DataTable as l}from"./data-table-BpbyyNSA.js";import{EmptyState as u}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as d,openInBrowser as f}from"./keybar-deep-link-DC31T3CP.js";import{Box as p,Text as m,render as h,useApp as g,useInput as _}from"ink";import v,{useEffect as y,useState as b}from"react";import x from"ink-spinner";async function S(a){let o=await e(),s=await t({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let l=new n({config:o,cliVersion:a.cliVersion,token:s}),u,d;try{({siteId:u,site:d}=await c(l,{explicit:a.siteId,headless:!!a.json,cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let f=d?.url?d.url.replace(/^https?:\/\//,``).replace(/\/$/,``):d?.name??u;if(i(a)){let e=await l.getGeo(u);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-BuRZNWYM.js`);return t(e.countries,[`country`,`visitors`],a.tsv?`tsv`:`csv`)}if(a.ndjson){for(let t of e.countries)process.stdout.write(JSON.stringify(t)+`
2
2
  `);return 0}return r({type:`geo.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=h(v.createElement(C,{api:l,siteId:u,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const C=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:c}=g(),[h,S]=b(null),[C,w]=b(!0),[T,E]=b(null);if(_(e=>{if(e===`o`||e===`O`){f(d(`geo`,{siteId:t}));return}e===`q`&&(c(),i(0))}),y(()=>{let n=!1;return(async()=>{try{let r=await e.getGeo(t);n||(S(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`geo · ${n}`}),v.createElement(a,{title:`Loading`,state:`busy`},v.createElement(p,null,v.createElement(m,{color:`magenta`},v.createElement(x,{type:`dots`})),v.createElement(m,null,` Fetching geo…`))));if(T)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`geo · ${n}`}),v.createElement(u,{reason:`error`,headline:`Failed to load`,hint:T}));let D=!h||h.countries.length===0&&h.cities.length===0;if(D)return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`geo · ${n}`}),v.createElement(u,{reason:`no-data`,headline:`No data yet`,hint:`Visit your site to send the first event`}));let O=[{key:`country`,label:`country`,width:18},{key:`visitors`,label:`visitors`,align:`right`,width:8}],k=[{key:`city`,label:`city`,width:20},{key:`country`,label:`country`,width:12},{key:`visitors`,label:`visitors`,align:`right`,width:8}],A=process.stdout.columns??80;return v.createElement(p,{flexDirection:`column`},v.createElement(o,{version:r,subtitle:`geo · ${n}`}),v.createElement(a,{title:`Countries`},h.countries.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:O,data:h.countries.slice(0,15),zebra:!0})),v.createElement(a,{title:`Cities`},h.cities.length===0?v.createElement(m,{color:`gray`},`— —`):v.createElement(l,{columns:k,data:h.cities.slice(0,20),zebra:!0})),v.createElement(s,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{S as geoCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import"./telemetry-urcJlNpJ.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a,useTheme as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{ChatPanel as l}from"./chat-panel-C_yjPXnw.js";import{resolveSiteId as u}from"./resolve-site-DSJR9vuz.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{Bar as f}from"./bar-DWT-1xOE.js";import{deepLinkFor as p,openInBrowser as m}from"./keybar-deep-link-DC31T3CP.js";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useMemo as ee,useRef as te,useState as S}from"react";import ne from"ink-spinner";const C={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}},re=Object.fromEntries(Object.entries(C).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function w(e){return!e||e.length!==2?null:C[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),k=new Uint8Array(E*D),A=[`__OCEAN__`];function j(e){let t=(e%360+360)%360;return Math.floor(t)}function M(e){return Math.max(0,Math.min(D-1,Math.floor(90-e)))}function N(e,t,n){let r=M(e),i=j(t);O[r*E+i]=1,k[r*E+i]=n}for(let e of Object.keys(C)){let t=C[e];A.push(e);let n=A.length-1,r=Math.max(.5,t.spread*.85),i=Math.max(.25,Math.cos(t.lat*Math.PI/180)),a=Math.max(.5,t.spread/i),o=Math.floor(t.lat-r),s=Math.ceil(t.lat+r),c=Math.floor(t.lng-a),l=Math.ceil(t.lng+a);for(let e=o;e<=s;e++)for(let i=c;i<=l;i++){let o=(e-t.lat)/r,s=(i-t.lng)/a;s*s+o*o>1||N(e,i,n)}}const P=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,r=0;for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){if(i===0&&a===0)continue;let o=(t+a+E)%E;O[(e+i)*E+o]&&(n++,r||=k[(e+i)*E+o]??0)}n>=4&&(P[e*E+t]=1,k[e*E+t]=r)}O.set(P);const F=new Uint8Array(E*D);for(let e=0;e<D;e++)for(let t=0;t<E;t++){let n=k[e*E+t];if(!n)continue;let r=e>0?k[(e-1)*E+t]:0,i=e<D-1?k[(e+1)*E+t]:0,a=k[e*E+(t-1+E)%E],o=k[e*E+(t+1)%E];(r!==n||i!==n||a!==n||o!==n)&&(F[e*E+t]=1)}function I(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 L(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 F[n*E+i]===1?1:0}function R(e){return e*Math.PI/180}function z(e,t){let n=R(e),r=R(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function B(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 V(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 H(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function U(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function W(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&&U(e,Math.round(t+o),Math.round(n+a))}const G=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function K(e,t,n){let r=0;for(let i=0;i<G.length;i++){let[a,o]=G[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 q(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 J(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 Y(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 X(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));U(e,s,c)}}function ie(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=V(B(z(r,i),t),n),o=Y(a,e.dw,e.dh);o&&U(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=V(B(z(i,r),t),n),o=Y(a,e.dw,e.dh);o&&U(e,Math.round(o.x),Math.round(o.y))}}function ae({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=J(c),d=H(n,r),f=H(n,r),p=H(n,r),m=H(n,r),_=H(n,r),v=R(i),y=R(-a);X(d),s&&ie(d,v,y);{let e=f.dw/2,t=f.dh/2,n=Math.min(f.dw,f.dh/2)*.95,r=Math.cos(v),i=Math.sin(v),a=Math.cos(y),o=Math.sin(y);for(let s=0;s<f.dh;s++){let c=(t-s)/n;if(!(c<-1||c>1))for(let t=0;t<f.dw;t++){let l=(t-e)/n,u=l*l+c*c;if(u>1)continue;let d=Math.sqrt(1-u),m=l,h=c,g=a*h+o*d,_=-o*h+a*d,v=r*m-i*_,y=i*m+r*_,b=Math.asin(g)*(180/Math.PI),x=Math.atan2(v,y)*(180/Math.PI);I(b,x)&&(U(f,t,s),L(b,x)&&U(p,t,s))}}}for(let t of e){let e=V(B(z(t.lat,t.lng),v),y),n=Y(e,m.dw,m.dh);if(!n)continue;let r=typeof t.freshness==`number`?t.freshness:.5;W(m,n.x,n.y,r>.7?2:1)}if(t&&t.length>0)for(let e of t){let t=V(B(z(e.lat,e.lng),v),y),n=Y(t,_.dw,_.dh);if(!n)continue;W(_,n.x,n.y,2)}let x=[];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?q(_,r,e):K(_,r,e);if(n!==` `){i(l.warn,n);continue}let a=u?q(m,r,e):K(m,r,e);if(a!==` `){i(l.accent,a);continue}let o=u?q(p,r,e):K(p,r,e);if(o!==` `){i(l.fg,o);continue}let s=u?q(f,r,e):K(f,r,e);if(s!==` `){i(l.success,s);continue}let c=u?q(d,r,e):K(d,r,e);if(c!==` `){i(l.muted,c);continue}let h=t.length>0?t[t.length-1]:void 0;i(h?h.color:l.muted,` `)}x.push(b.createElement(h,{key:e},b.createElement(g,null,t.map((e,t)=>b.createElement(g,{key:t,color:e.color,bold:!0},e.text)))))}return b.createElement(h,{flexDirection:`column`},x)}async function Z(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 Q(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,d;try{({siteId:l,site:d}=await u(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??l;if(a.browser){let e=p(`globe`,{siteId:l});a.json?process.stdout.write(JSON.stringify({openedUrl:e})+`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./client-DTXWADkX.js";import"./formatter-DutfcQAc.js";import{emit$1 as r,isHeadless as i}from"./emit-DBYk96TD.js";import{Panel as a,useTheme as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{ChatPanel as l}from"./chat-panel-CqJaCIg3.js";import{resolveSiteId as u}from"./resolve-site-mj0esTrm.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{Bar as f}from"./bar-DWT-1xOE.js";import{deepLinkFor as p,openInBrowser as m}from"./keybar-deep-link-DC31T3CP.js";import{Box as h,Text as g,render as _,useApp as v,useInput as y}from"ink";import b,{useEffect as x,useMemo as ee,useRef as te,useState as S}from"react";import ne from"ink-spinner";const C={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}},re=Object.fromEntries(Object.entries(C).map(([e,t])=>[e,{lat:t.lat,lng:t.lng}]));function w(e){return!e||e.length!==2?null:C[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),k=new Uint8Array(E*D),A=[`__OCEAN__`];function j(e){let t=(e%360+360)%360;return Math.floor(t)}function M(e){return Math.max(0,Math.min(D-1,Math.floor(90-e)))}function N(e,t,n){let r=M(e),i=j(t);O[r*E+i]=1,k[r*E+i]=n}for(let e of Object.keys(C)){let t=C[e];A.push(e);let n=A.length-1,r=Math.max(.5,t.spread*.85),i=Math.max(.25,Math.cos(t.lat*Math.PI/180)),a=Math.max(.5,t.spread/i),o=Math.floor(t.lat-r),s=Math.ceil(t.lat+r),c=Math.floor(t.lng-a),l=Math.ceil(t.lng+a);for(let e=o;e<=s;e++)for(let i=c;i<=l;i++){let o=(e-t.lat)/r,s=(i-t.lng)/a;s*s+o*o>1||N(e,i,n)}}const P=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,r=0;for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){if(i===0&&a===0)continue;let o=(t+a+E)%E;O[(e+i)*E+o]&&(n++,r||=k[(e+i)*E+o]??0)}n>=4&&(P[e*E+t]=1,k[e*E+t]=r)}O.set(P);const F=new Uint8Array(E*D);for(let e=0;e<D;e++)for(let t=0;t<E;t++){let n=k[e*E+t];if(!n)continue;let r=e>0?k[(e-1)*E+t]:0,i=e<D-1?k[(e+1)*E+t]:0,a=k[e*E+(t-1+E)%E],o=k[e*E+(t+1)%E];(r!==n||i!==n||a!==n||o!==n)&&(F[e*E+t]=1)}function I(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 L(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 F[n*E+i]===1?1:0}function R(e){return e*Math.PI/180}function z(e,t){let n=R(e),r=R(t);return{x:Math.cos(n)*Math.sin(r),y:Math.sin(n),z:Math.cos(n)*Math.cos(r)}}function B(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 V(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 H(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function U(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function W(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&&U(e,Math.round(t+o),Math.round(n+a))}const G=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function K(e,t,n){let r=0;for(let i=0;i<G.length;i++){let[a,o]=G[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 q(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 J(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 Y(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 X(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));U(e,s,c)}}function ie(e,t,n){for(let r of[-60,-30,0,30,60])for(let i=-180;i<=180;i+=4){let a=V(B(z(r,i),t),n),o=Y(a,e.dw,e.dh);o&&U(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=V(B(z(i,r),t),n),o=Y(a,e.dw,e.dh);o&&U(e,Math.round(o.x),Math.round(o.y))}}function ae({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=J(c),d=H(n,r),f=H(n,r),p=H(n,r),m=H(n,r),_=H(n,r),v=R(i),y=R(-a);X(d),s&&ie(d,v,y);{let e=f.dw/2,t=f.dh/2,n=Math.min(f.dw,f.dh/2)*.95,r=Math.cos(v),i=Math.sin(v),a=Math.cos(y),o=Math.sin(y);for(let s=0;s<f.dh;s++){let c=(t-s)/n;if(!(c<-1||c>1))for(let t=0;t<f.dw;t++){let l=(t-e)/n,u=l*l+c*c;if(u>1)continue;let d=Math.sqrt(1-u),m=l,h=c,g=a*h+o*d,_=-o*h+a*d,v=r*m-i*_,y=i*m+r*_,b=Math.asin(g)*(180/Math.PI),x=Math.atan2(v,y)*(180/Math.PI);I(b,x)&&(U(f,t,s),L(b,x)&&U(p,t,s))}}}for(let t of e){let e=V(B(z(t.lat,t.lng),v),y),n=Y(e,m.dw,m.dh);if(!n)continue;let r=typeof t.freshness==`number`?t.freshness:.5;W(m,n.x,n.y,r>.7?2:1)}if(t&&t.length>0)for(let e of t){let t=V(B(z(e.lat,e.lng),v),y),n=Y(t,_.dw,_.dh);if(!n)continue;W(_,n.x,n.y,2)}let x=[];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?q(_,r,e):K(_,r,e);if(n!==` `){i(l.warn,n);continue}let a=u?q(m,r,e):K(m,r,e);if(a!==` `){i(l.accent,a);continue}let o=u?q(p,r,e):K(p,r,e);if(o!==` `){i(l.fg,o);continue}let s=u?q(f,r,e):K(f,r,e);if(s!==` `){i(l.success,s);continue}let c=u?q(d,r,e):K(d,r,e);if(c!==` `){i(l.muted,c);continue}let h=t.length>0?t[t.length-1]:void 0;i(h?h.color:l.muted,` `)}x.push(b.createElement(h,{key:e},b.createElement(g,null,t.map((e,t)=>b.createElement(g,{key:t,color:e.color,bold:!0},e.text)))))}return b.createElement(h,{flexDirection:`column`},x)}async function Z(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 Q(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,d;try{({siteId:l,site:d}=await u(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??l;if(a.browser){let e=p(`globe`,{siteId:l});a.json?process.stdout.write(JSON.stringify({openedUrl:e})+`
2
2
  `):process.stdout.write(`\n Opening Mapbox globe in your default browser:\n ${e}\n\n`);try{await m(e)}catch{}return 0}if(i(a)){let e=await Z(c,l,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}=_(b.createElement(ue,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const oe=5e3,se=60,ce=1,le=80,ue=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:u}=v(),{theme:_}=o(),[C,re]=S(null),[E,D]=S(!0),[O,k]=S(null),[A,j]=S(0),[M,N]=S(!1),[P,F]=S(20),[I,L]=S(1),[R,z]=S(0),B=te(new Map),[V,H]=S(!1);y(n=>{if(!V){if(n===`/`){H(!0);return}if(n===`q`){u(),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`||n===`O`||n===`w`){m(p(`globe`,{siteId:t}));return}if(n===`c`&&C){let e=C.countries[R];e?.lng!==void 0&&(j(-e.lng),N(!0));return}n===`r`&&(async()=>{try{let n=await Z(e,t,B.current);B.current=new Map(n.countries.map(e=>[e.code,e.visitors])),re(n)}catch(e){k(e.message)}})()}}),x(()=>{let n=!1,r=null,i=async()=>{try{let r=await Z(e,t,B.current);if(n)return;B.current=new Map(r.countries.map(e=>[e.code,e.visitors])),re(r),D(!1)}catch(e){n||(k(e.message),D(!1))}n||(r=setTimeout(i,oe))};return i(),()=>{n=!0,r&&clearTimeout(r)}},[e,t]),x(()=>{if(M)return;let e=setInterval(()=>{j(e=>(e+ce)%360)},se);return()=>clearInterval(e)},[M]);let U=ee(()=>{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(le,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},[C]),W=ee(()=>{if(!C)return[];let e=C.countries[Math.min(R,C.countries.length-1)];return!e||typeof e.lat!=`number`?[]:T(e.code,Math.min(80,Math.max(8,e.visitors*4)))},[C,R]),G=`globe · ${n} · live`,K=[{key:`q`,label:`quit`},{key:`j/k`,label:`select country`},{key:`c`,label:`center on selected`},{key:`space`,label:M?`resume`:`pause`},{key:`t`,label:`tilt ${P}°`},{key:`+/-`,label:`zoom`},{key:`o`,label:`open web globe`},{key:`r`,label:`refresh`},{key:`/`,label:`ask AI`}];if(V)return b.createElement(l,{cliVersion:r,api:e,dashboardContext:{commandName:`globe`,siteId:t,siteLabel:n,metricsSnapshot:C},onClose:()=>H(!1)});if(E)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),b.createElement(a,{title:`Loading`,state:`busy`},b.createElement(h,null,b.createElement(g,{color:`cyan`},b.createElement(ne,{type:`dots`})),b.createElement(g,null,` Spinning up Earth…`))));if(O)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),b.createElement(d,{reason:`error`,headline:`Failed to load`,hint:O}),b.createElement(c,{items:K}));if(!C||C.countries.length===0&&C.unknownCount===0)return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),b.createElement(d,{reason:`no-data`,headline:`No geolocated visitors yet`,hint:`Visit your site to populate the map.`}),b.createElement(c,{items:K}));let q=process.stdout.columns??100,J=36,Y=Math.max(40,Math.min(90,q-J-4)),X=Math.round(Y*I),ie=Math.round(X*.5),Q=C.countries.slice(0,12),ue=Math.max(1,...Q.map(e=>e.visitors)),de=Math.max(1,Math.floor((Date.now()-C.lastFetchedAt)/1e3)),$=C.countries[Math.min(R,C.countries.length-1)],fe=$?w($.code):null;return b.createElement(h,{flexDirection:`column`},b.createElement(s,{version:r,subtitle:G}),$?b.createElement(h,{flexDirection:`row`,marginBottom:1},b.createElement(h,{width:2}),b.createElement(h,{borderStyle:`round`,borderColor:_.warn,paddingX:1},b.createElement(g,{color:_.warn,bold:!0},fe?.name??$.code),b.createElement(g,{color:_.dim},` · `),b.createElement(g,{color:_.fg},$.visitors,` visitor`,$.visitors===1?``:`s`))):null,b.createElement(h,{flexDirection:`row`},b.createElement(h,{flexDirection:`column`,marginRight:2},b.createElement(ae,{visitors:U,highlight:W,width:X,height:ie,rotationDeg:A,tiltDeg:P}),b.createElement(h,{marginTop:1},b.createElement(g,{color:_.dim},C.totalVisitors,` visitors · `,C.countries.length,` countries`,C.unknownCount>0?` · ${C.unknownCount} unmapped`:``,` · `,M?`rotation paused`:`↻ ${ce}°/${se}ms`,` · refreshed `,de,`s ago`))),b.createElement(h,{flexDirection:`column`,width:J},b.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?_.warn:r?_.success:_.fg;return b.createElement(h,{key:e.code,flexDirection:`row`},b.createElement(h,{width:2},b.createElement(g,{color:_.warn},n?`›`:` `)),b.createElement(h,{width:3},b.createElement(g,{color:i,bold:n},e.code)),b.createElement(f,{value:e.visitors,max:ue,width:14,showPercent:!1}),b.createElement(h,{width:6},b.createElement(g,{color:_.muted},String(e.visitors).padStart(5))))})),C.countries.length>12?b.createElement(h,{marginTop:1},b.createElement(g,{color:_.muted},`+`,C.countries.length-12,` more (j/k to scroll)`)):null)),b.createElement(c,{items:K}))};export{Q as globeCommand};
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{emitErrorEnvelope as n}from"./error-codes-BohPg7wr.js";import{ApiV2Client as r}from"./api-v2-q-vnosdb.js";import{requireTier as i}from"./tier-DST3Yt2-.js";import{confirmDestructive as a}from"./confirm-DS5wux0g.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as o,wrapItem as s,wrapList as c}from"./emit-DBYk96TD.js";function l(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}function u(e){return e?new Date(e).toISOString().slice(0,10):`—`}async function d(d){let f=await e(),p=await t({strict:!1}),m=new r({config:f,cliVersion:d.cliVersion,token:p});try{await i(m,`pro`)}catch(e){return n(e,{command:`goals ${d.action}`})}try{switch(d.action){case`list`:{let{goals:e}=await m.listGoals();if(d.json)return o(c(e,`goals.list`),{legacyKey:`goals`,legacyValue:e}),0;if(e.length===0)return process.stdout.write("No goals yet. Create one with `zenovay goals create --name <n> --type <pageview|event> --target <url-or-event>`.\n"),0;let t=[14,24,10,30,10],n=e=>e.map((e,n)=>(e??``).padEnd(t[n])).join(` `);process.stdout.write(`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-C5caZH9p.js";import{ApiV2Client as r}from"./api-v2-CI5hxW-O.js";import{requireTier as i}from"./tier-BneaO4vD.js";import{confirmDestructive as a}from"./confirm-DS5wux0g.js";import"./formatter-DutfcQAc.js";import{emitEnvelope as o,wrapItem as s,wrapList as c}from"./emit-DBYk96TD.js";function l(e){return e.length>12?`${e.slice(0,8)}…${e.slice(-4)}`:e}function u(e){return e?new Date(e).toISOString().slice(0,10):`—`}async function d(d){let f=await e(),p=await t({strict:!1}),m=new r({config:f,cliVersion:d.cliVersion,token:p});try{await i(m,`pro`)}catch(e){return n(e,{command:`goals ${d.action}`})}try{switch(d.action){case`list`:{let{goals:e}=await m.listGoals();if(d.json)return o(c(e,`goals.list`),{legacyKey:`goals`,legacyValue:e}),0;if(e.length===0)return process.stdout.write("No goals yet. Create one with `zenovay goals create --name <n> --type <pageview|event> --target <url-or-event>`.\n"),0;let t=[14,24,10,30,10],n=e=>e.map((e,n)=>(e??``).padEnd(t[n])).join(` `);process.stdout.write(`
2
2
  `+n([`id`,`name`,`type`,`target`,`created`])+`
3
3
  `),process.stdout.write(n(t.map(e=>`─`.repeat(e)))+`
4
4
  `);for(let r of e)process.stdout.write(n([l(r.id),(r.name??``).slice(0,t[1]),r.type,(r.target??`—`).slice(0,t[3]),u(r.createdAt)])+`
@@ -0,0 +1 @@
1
+ import"./config--JRu_jFq.js";import"./check-D9G0N7NB.js";import"./api-FCanTxsb.js";import"./token-store-BQuGH0z2.js";import"./formatter-DutfcQAc.js";import"./emit-DBYk96TD.js";import"./panel-B_yDcIcn.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-hG9EHf7v.js";export{n as healthCommand};
@@ -0,0 +1,2 @@
1
+ import{configPath as e,readConfig as t}from"./config--JRu_jFq.js";import{fetchManifest as n}from"./check-D9G0N7NB.js";import{ApiClient as r}from"./api-FCanTxsb.js";import{readToken as i}from"./token-store-BQuGH0z2.js";import{isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{spawnSync as s}from"node:child_process";import c from"node:path";import{existsSync as l,promises as u,statSync as d}from"node:fs";import f from"node:os";import{Box as p,Text as m,render as h}from"ink";import g from"react";const _=6*60*60*1e3;function v(){return c.join(f.homedir(),`.zenovay`,`update.json`)}async function y(){try{let e=await u.readFile(v(),`utf8`);return JSON.parse(e)}catch{return null}}async function b(e){let t=v();await u.mkdir(c.dirname(t),{recursive:!0,mode:448}),await u.writeFile(t,JSON.stringify(e,null,2))}async function x(){let e=await t();if(e.noUpdateCheck||process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`)return null;let r=await y();if(r&&Date.now()-r.fetchedAt<_)return r;try{let t=await n({cliBase:e.cliBase}),i={manifest:t,fetchedAt:Date.now(),lastNoticeAt:r?.lastNoticeAt};return await b(i),i}catch{return r}}async function S(){try{await x()}catch{}process.exit(0)}const C=process.argv[1]??``,w=/\bworker\.(js|ts|cjs|mjs)$/.test(C);w&&S();function T(e){return e.includes(`/Cellar/`)||e.includes(`/opt/homebrew/`)||e.includes(`/usr/local/Cellar/`)?`brew`:e.includes(`.npm-global`)||e.includes(`node_modules/.bin`)||e.includes(`npm/bin`)?`npm-global`:e.endsWith(`/.local/bin/zenovay`)||e.endsWith(`\\.local\\bin\\zenovay.exe`)?`curl-installer`:e.includes(`/lib/node_modules/`)||e.includes(`\\nodejs\\`)?`npm-prefix`:`unknown`}function E(e){let t=process.platform===`win32`,n=t?`where`:`which`,r=t?[e]:[`-a`,e];try{let e=s(n,r,{encoding:`utf8`,timeout:3e3});if(e.status!==0||!e.stdout)return[];let t=e.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);return[...new Set(t)]}catch{return[]}}function D(e){let t=process.platform===`win32`,n=t?`;`:`:`,r=(process.env.PATH??``).split(n).filter(Boolean),i=t?[`.exe`,`.cmd`,``]:[``],a=[];for(let t of r)for(let n of i){let r=c.join(t,e+n);if(l(r))try{let e=d(r);e.isFile()&&a.push(r)}catch{}}return[...new Set(a)]}function O(e=`zenovay`){let t=E(e);t.length===0&&(t=D(e));let n=t.map(e=>({path:e,kind:T(e)})),r=t[0]??null;return{paths:t,active:r,kinds:n}}function k(e,t){if(e.paths.length<2)return``;let n=[];n.push(`Multiple zenovay binaries detected on PATH:`);for(let r of e.kinds){let i=r.path===e.active,a=t&&r.path===t,o=[i&&`(first on PATH)`,a&&`(currently running)`].filter(Boolean).join(` `);n.push(` • ${r.path} [${r.kind}] ${o}`)}n.push(``),n.push(`Pick one and uninstall the others to avoid version drift:`);let r=new Set(e.kinds.map(e=>e.kind));return r.has(`npm-global`)&&n.push(` npm uninstall -g @zenovay/cli # remove the npm-installed one`),r.has(`brew`)&&n.push(` brew uninstall zenovay # remove the Homebrew-installed one`),r.has(`curl-installer`)&&n.push(` rm ~/.local/bin/zenovay # remove the curl-installer one`),n.join(`
2
+ `)}const A=2e3,j=5e3;async function M(e,t){let n=`${e}/mcp`,r=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),A);try{let a=await t(n,{method:`GET`,signal:i.signal}),o=Date.now()-r;return a.ok?{name:`MCP server`,status:`pass`,detail:`${e}/mcp · ${o}ms`,latencyMs:o}:{name:`MCP server`,status:`fail`,detail:`HTTP ${a.status}`,latencyMs:o}}catch(e){return{name:`MCP server`,status:`fail`,detail:e.message}}finally{clearTimeout(a)}}async function N(){try{let t=await u.readFile(e(),`utf8`),n=JSON.parse(t),r=n.openaiApiKey;return typeof r==`string`&&r.trim().length>0?{name:`OpenAI key`,status:`pass`,detail:`configured`}:{name:`OpenAI key`,status:`warn`,detail:"not set (run `zenovay ai` to configure)"}}catch(e){return e.code===`ENOENT`?{name:`OpenAI key`,status:`warn`,detail:`no config file`}:{name:`OpenAI key`,status:`warn`,detail:`unreadable config`}}}async function P(){let e=f.homedir(),t=[c.join(e,`.zshrc`),c.join(e,`.bashrc`),c.join(e,`.config`,`fish`,`completions`,`zenovay.fish`)],n=[];for(let e of t)try{let t=await u.readFile(e,`utf8`);(/zenovay\s+(complet|--?complet)/i.test(t)||/_zenovay/.test(t)||/complete\s+-c\s+zenovay/.test(t))&&n.push(c.basename(e))}catch{}return n.length>0?{name:`Completions`,status:`pass`,detail:n.join(`, `)}:{name:`Completions`,status:`warn`,detail:"not installed (run `zenovay completions` after Wave 3)"}}async function F(e,t,n,r){if(!e||!t)return{name:`Events stream`,status:`skip`,detail:`not authenticated`};let i=new AbortController,a=setTimeout(()=>i.abort(),j),o=Date.now();try{let t=await e.openEventsStream(`probe`,i.signal),r=t.body?.getReader();if(r){let e=Promise.race([r.read().then(()=>`first`),new Promise(e=>setTimeout(()=>e(`timeout`),1500))]);await e;try{r.cancel()}catch{}}let a=Date.now()-o;return{name:`Events stream`,status:`pass`,detail:`${n}/v1/cli/events/tail · ${a}ms`,latencyMs:a}}catch(e){let t=e.message;return/40\d/.test(t)?{name:`Events stream`,status:`pass`,detail:`endpoint reachable (auth-gated)`}:{name:`Events stream`,status:`fail`,detail:t}}finally{clearTimeout(a)}}async function I(n){let a=n.fetchImpl??fetch,o=[],s=await t().catch(()=>null);o.push({name:`Binary`,status:`pass`,detail:`v${n.cliVersion} (${n.binaryPath})`});let c=O(`zenovay`);if(c.paths.length>=2){let e=c.kinds.map(e=>e.kind).join(` + `);o.push({name:`Install paths`,status:`warn`,detail:`${c.paths.length} binaries on PATH (${e}). Active: ${c.active}. Run \`zenovay doctor\` for cleanup.`})}else o.push({name:`Install paths`,status:`pass`,detail:c.active??`no zenovay on PATH`});o.push({name:`Config file`,status:s?`pass`:`warn`,detail:e()});let l=await i({strict:!1}).catch(()=>null);o.push({name:`Auth`,status:l?`pass`:`fail`,detail:l?`logged in${l.email?` as ${l.email}`:``}`:`not logged in`});let u=null;if(s)try{u=new r({config:s,cliVersion:n.cliVersion,token:l,fetchImpl:a});let e=await u.ping();o.push({name:`API connection`,status:`pass`,detail:`${s.apiBase.replace(/^https?:\/\//,``)} · ${e.latencyMs}ms`,latencyMs:e.latencyMs})}catch(e){o.push({name:`API connection`,status:`fail`,detail:`${e.message}`})}let d=await y().catch(()=>null);o.push({name:`Auto-update`,status:s?.noUpdateCheck?`warn`:`pass`,detail:s?.noUpdateCheck?`disabled`:d?`latest=${d.manifest.latest}`:`manifest not yet fetched`});let f=s?.apiBase??`https://api.zenovay.com`;return o.push(await M(f,a)),o.push(await N()),o.push(await P()),o.push(await F(u,!!l,f,a)),o}function L(e){return e.some(e=>e.status===`fail`)?1:0}async function R(e){let t=await I(e),n=L(t),r=n===0;return a({json:e.json})?(process.stdout.write(`${JSON.stringify({checks:t,passed:r})}\n`),n):new Promise(e=>{let{unmount:r}=h(g.createElement(z,{checks:t}),{exitOnCtrlC:!0});setImmediate(()=>{r(),e(n)})})}const z=({checks:e})=>g.createElement(o,{title:`Zenovay CLI health check`,state:`idle`},e.map(e=>g.createElement(p,{key:e.name},g.createElement(m,{color:V(e.status)},B(e.status)),g.createElement(m,null,` `),g.createElement(m,{bold:!0},e.name.padEnd(18)),g.createElement(m,{color:`gray`},e.detail))));function B(e){return e===`pass`?`✔`:e===`warn`?`⚠`:e===`skip`?`∼`:`✗`}function V(e){return e===`pass`?`green`:e===`warn`?`yellow`:e===`skip`?`gray`:`red`}export{z as HealthReport,O as detectInstallPaths,L as exitCodeFor,R as healthCommand,k as remediationHint,I as runHealthChecks};
@@ -1 +1 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import{requireTier as r}from"./tier-DST3Yt2-.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-DSJR9vuz.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";async function C(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(a(o)){let e=await u.getHeatmaps(d);return i({type:`heatmaps.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(w,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[C,w]=x(!0),[T,E]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`heatmaps`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getHeatmaps(t);n||(g(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching heatmaps…`))));if(T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:T}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No heatmaps yet`,hint:`Enable heatmaps in your site settings`}));let D=[{key:`url`,label:`page`,width:36},{key:`type`,label:`type`,width:12},{key:`captureCount`,label:`captures`,align:`right`,width:10},{key:`createdAt`,label:`first seen`,width:24}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(o,{title:`Heatmaps (${l.length})`},y.createElement(u,{columns:D,data:l,zebra:!0})),y.createElement(m,{marginTop:1},y.createElement(h,{color:`gray`},`Open any heatmap at https://app.zenovay.com/heatmaps`)),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{C as heatmapsCommand};
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import{requireTier as r}from"./tier-BneaO4vD.js";import"./formatter-DutfcQAc.js";import{emit$1 as i,isHeadless as a}from"./emit-DBYk96TD.js";import{Panel as o}from"./panel-B_yDcIcn.js";import{Banner as s}from"./banner-3iSWTDFy.js";import"./prompt-D-Uzz_GF.js";import{Keybar as c}from"./keybar-DsYTkKZX.js";import{resolveSiteId as l}from"./resolve-site-mj0esTrm.js";import{DataTable as u}from"./data-table-BpbyyNSA.js";import{EmptyState as d}from"./empty-state-CJxa1jUN.js";import{deepLinkFor as f,openInBrowser as p}from"./keybar-deep-link-DC31T3CP.js";import{Box as m,Text as h,render as g,useApp as _,useInput as v}from"ink";import y,{useEffect as b,useState as x}from"react";import S from"ink-spinner";async function C(o){let s=await e(),c=await t({strict:!1});if(!c)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let u=new n({config:s,cliVersion:o.cliVersion,token:c});try{await r(u,`pro`)}catch(e){return process.stderr.write(`${e.message}\n`),2}let d,f;try{({siteId:d,site:f}=await l(u,{explicit:o.siteId,headless:!!o.json,cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let p=f?.url?f.url.replace(/^https?:\/\//,``).replace(/\/$/,``):f?.name??d;if(a(o)){let e=await u.getHeatmaps(d);return i({type:`heatmaps.snapshot`,data:e}),0}return new Promise(e=>{let{unmount:t}=g(y.createElement(w,{api:u,siteId:d,siteLabel:p,cliVersion:o.cliVersion,onExit:n=>{t(),e(n)}}))})}const w=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{let{exit:a}=_(),[l,g]=x(null),[C,w]=x(!0),[T,E]=x(null);if(v(e=>{if(e===`o`||e===`O`){p(f(`heatmaps`,{siteId:t}));return}e===`q`&&(a(),i(0))}),b(()=>{let n=!1;return(async()=>{try{let r=await e.getHeatmaps(t);n||(g(r),w(!1))}catch(e){n||(E(e.message),w(!1))}})(),()=>{n=!0}},[e,t]),C)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(o,{title:`Loading`,state:`busy`},y.createElement(m,null,y.createElement(h,{color:`magenta`},y.createElement(S,{type:`dots`})),y.createElement(h,null,` Fetching heatmaps…`))));if(T)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(d,{reason:`error`,headline:`Failed to load`,hint:T}));if(!l||l.length===0)return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(d,{reason:`no-data`,headline:`No heatmaps yet`,hint:`Enable heatmaps in your site settings`}));let D=[{key:`url`,label:`page`,width:36},{key:`type`,label:`type`,width:12},{key:`captureCount`,label:`captures`,align:`right`,width:10},{key:`createdAt`,label:`first seen`,width:24}];return y.createElement(m,{flexDirection:`column`},y.createElement(s,{version:r,subtitle:`heatmaps · ${n}`}),y.createElement(o,{title:`Heatmaps (${l.length})`},y.createElement(u,{columns:D,data:l,zebra:!0})),y.createElement(m,{marginTop:1},y.createElement(h,{color:`gray`},`Open any heatmap at https://app.zenovay.com/heatmaps`)),y.createElement(c,{items:[{key:`o`,label:`open in browser`},{key:`q`,label:`quit`}]}))};export{C as heatmapsCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config-Dn_Cl0cD.js";import"./api-BD_nTdOq.js";import{readToken as t}from"./token-store-DWXh9r3Z.js";import{ApiV2Client as n}from"./api-v2-q-vnosdb.js";import"./formatter-DutfcQAc.js";import{isHeadless as r}from"./emit-DBYk96TD.js";import{Panel as i}from"./panel-B_yDcIcn.js";import{Banner as a}from"./banner-3iSWTDFy.js";import{Keybar as o}from"./keybar-DsYTkKZX.js";import{DataTable as s}from"./data-table-BpbyyNSA.js";import{EmptyState as c}from"./empty-state-CJxa1jUN.js";import{Box as l,Text as u,render as d,useApp as f,useInput as p}from"ink";import m,{useEffect as h,useState as g}from"react";import _ from"ink-spinner";function v(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toISOString().slice(0,10)}async function y(e){let t=await e.me().catch(()=>null),n=t?.user.name?.trim()||t?.user.email||`you`,r=await e.getSites().catch(()=>[]),i=r.map(e=>({id:e.id,name:e.name,domain:e.url.replace(/^https?:\/\//,``).replace(/\/$/,``),lastActive:e.lastActiveAt??null})),a={visitors:0,pageviews:0,deltaPct:null};if(r.length>0){let t=r[0].id,[n,i]=await Promise.all([e.getStats(t,`7d`).catch(()=>null),e.getSources(t,`7d`,`prev`).catch(()=>null)]);n&&(a.visitors=n.visitors,a.pageviews=n.pageviews);let o=i?.sources?.filter(e=>typeof e.delta==`number`)??[];if(o.length>0){let e=o.reduce((e,t)=>e+(t.delta??0),0);a.deltaPct=e/o.length*100}}return{sites:i,weekly:a,userLabel:n}}async function b(i){let a=await e(),o=await t({strict:!1});if(!o)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new n({config:a,cliVersion:i.cliVersion,token:o});if(r(i))try{let e=await y(s);return process.stdout.write(JSON.stringify({sites:e.sites,weekly:{visitors:e.weekly.visitors,pageviews:e.weekly.pageviews,deltaPct:e.weekly.deltaPct}},null,2)+`
1
+ import{readConfig as e}from"./config--JRu_jFq.js";import"./api-FCanTxsb.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-CI5hxW-O.js";import"./formatter-DutfcQAc.js";import{isHeadless as r}from"./emit-DBYk96TD.js";import{Panel as i}from"./panel-B_yDcIcn.js";import{Banner as a}from"./banner-3iSWTDFy.js";import{Keybar as o}from"./keybar-DsYTkKZX.js";import{DataTable as s}from"./data-table-BpbyyNSA.js";import{EmptyState as c}from"./empty-state-CJxa1jUN.js";import{Box as l,Text as u,render as d,useApp as f,useInput as p}from"ink";import m,{useEffect as h,useState as g}from"react";import _ from"ink-spinner";function v(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toISOString().slice(0,10)}async function y(e){let t=await e.me().catch(()=>null),n=t?.user.name?.trim()||t?.user.email||`you`,r=await e.getSites().catch(()=>[]),i=r.map(e=>({id:e.id,name:e.name,domain:e.url.replace(/^https?:\/\//,``).replace(/\/$/,``),lastActive:e.lastActiveAt??null})),a={visitors:0,pageviews:0,deltaPct:null};if(r.length>0){let t=r[0].id,[n,i]=await Promise.all([e.getStats(t,`7d`).catch(()=>null),e.getSources(t,`7d`,`prev`).catch(()=>null)]);n&&(a.visitors=n.visitors,a.pageviews=n.pageviews);let o=i?.sources?.filter(e=>typeof e.delta==`number`)??[];if(o.length>0){let e=o.reduce((e,t)=>e+(t.delta??0),0);a.deltaPct=e/o.length*100}}return{sites:i,weekly:a,userLabel:n}}async function b(i){let a=await e(),o=await t({strict:!1});if(!o)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new n({config:a,cliVersion:i.cliVersion,token:o});if(r(i))try{let e=await y(s);return process.stdout.write(JSON.stringify({sites:e.sites,weekly:{visitors:e.weekly.visitors,pageviews:e.weekly.pageviews,deltaPct:e.weekly.deltaPct}},null,2)+`
2
2
  `),0}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}return new Promise(e=>{let{unmount:t}=d(m.createElement(x,{api:s,cliVersion:i.cliVersion,onExit:n=>{t(),e(n)}}))})}const x=({api:e,cliVersion:t,onExit:n})=>{let{exit:r}=f(),[d,b]=g(null),[x,S]=g(!0),[C,w]=g(null);p(e=>{e===`q`&&(r(),n(0))}),h(()=>{let t=!1;return(async()=>{try{let n=await y(e);t||(b(n),S(!1))}catch(e){t||(w(e.message),S(!1))}})(),()=>{t=!0}},[e]);let T=`home · ${d?.userLabel??`…`}`,E=[{key:`q`,label:`quit`}];if(x)return m.createElement(l,{flexDirection:`column`},m.createElement(a,{version:t,subtitle:T}),m.createElement(i,{title:`Loading`,state:`busy`},m.createElement(l,null,m.createElement(u,{color:`cyan`},m.createElement(_,{type:`dots`})),m.createElement(u,null,` Fetching your home dashboard…`))));if(C)return m.createElement(l,{flexDirection:`column`},m.createElement(a,{version:t,subtitle:T}),m.createElement(c,{reason:`error`,headline:`Failed to load`,hint:C}),m.createElement(o,{items:E}));if(!d)return m.createElement(l,{flexDirection:`column`},m.createElement(a,{version:t,subtitle:T}),m.createElement(c,{reason:`no-data`,headline:`No data`}),m.createElement(o,{items:E}));let D=[{key:`name`,label:`site`,width:24},{key:`domain`,label:`domain`,width:32},{key:`lastActive`,label:`last active`,width:12,format:e=>v(e)}],O=d.weekly.deltaPct===null?`—`:`${d.weekly.deltaPct>=0?`+`:``}${d.weekly.deltaPct.toFixed(1)}%`;return m.createElement(l,{flexDirection:`column`},m.createElement(a,{version:t,subtitle:T}),m.createElement(i,{title:`Your sites (${d.sites.length})`},d.sites.length===0?m.createElement(u,{color:`gray`},"No sites yet — run `zenovay init` to add one."):m.createElement(s,{columns:D,data:d.sites,zebra:!0})),m.createElement(i,{title:`This week`},m.createElement(u,null,m.createElement(u,{color:`cyan`},`Visitors`),` `,d.weekly.visitors.toLocaleString(),` `,m.createElement(u,{color:`cyan`},`Pageviews`),` `,d.weekly.pageviews.toLocaleString(),` `,m.createElement(u,{color:`cyan`},`Δ vs last week`),` `,O)),m.createElement(o,{items:E}))};export{b as homeCommand};