@zenovay/cli 1.0.0 → 1.0.1

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 (86) hide show
  1. package/README.md +1 -1
  2. package/dist/{agency-DHAyzKd-.js → agency-cNkRWBOo.js} +1 -1
  3. package/dist/{ai-xhCcy02q.js → ai-DDefS75j.js} +1 -1
  4. package/dist/{alerts-Be0XKEUX.js → alerts-BQ0EMdBT.js} +1 -1
  5. package/dist/{analytical-screen-BU2yCSg_.js → analytical-screen-B4xo6sII.js} +1 -1
  6. package/dist/{analytics-D7vhDrdG.js → analytics-ZCtpMy4v.js} +2 -2
  7. package/dist/{annotation-dveH657H.js → annotation-aMzsv1oV.js} +1 -1
  8. package/dist/{api-hWp9s3Y8.js → api-CdcB84ie.js} +1 -1
  9. package/dist/{api-keys-DKQX5aL9.js → api-keys-x_GGL61a.js} +1 -1
  10. package/dist/api-v2-Co0dWAP5.js +1 -0
  11. package/dist/{api-v2-DqKh6FgZ.js → api-v2-D0mvt__4.js} +1 -1
  12. package/dist/{audit-DgHopH-O.js → audit-VHsZwYPM.js} +1 -1
  13. package/dist/bin.js +7 -7
  14. package/dist/{chat-panel-PSN5hjlF.js → chat-panel-D9IjovCR.js} +1 -1
  15. package/dist/{companies-uScE2uHf.js → companies-BFUFJkEM.js} +1 -1
  16. package/dist/{completions-DKyjFPMK.js → completions-suqE20Pu.js} +1 -1
  17. package/dist/{config-DB3jF5gG.js → config-B72_Kfe0.js} +1 -1
  18. package/dist/{config--JRu_jFq.js → config-JVhBplSX.js} +1 -1
  19. package/dist/{deploys-BqQmCzVb.js → deploys-DLvmc21H.js} +1 -1
  20. package/dist/{devices-CUgpkbAC.js → devices-BMdSSO0o.js} +1 -1
  21. package/dist/{doctor-D1bGGwtN.js → doctor-BI6TF72T.js} +1 -1
  22. package/dist/{domains-iRmYn9G7.js → domains-CNv8-i1K.js} +1 -1
  23. package/dist/error-codes-BiKo9PGm.js +1 -0
  24. package/dist/{error-codes-D4XO4okw.js → error-codes-ByhvHx2M.js} +1 -1
  25. package/dist/{errors-CEIyrEgF.js → errors-DTs33lNs.js} +1 -1
  26. package/dist/{events-tail-CRgba_gO.js → events-tail-CzYtpjey.js} +1 -1
  27. package/dist/{export-Csl7rWLW.js → export-BAFQahzg.js} +1 -1
  28. package/dist/{funnel-B36lGX2i.js → funnel-CnkLL8HX.js} +1 -1
  29. package/dist/{geo-CPt2etQd.js → geo-B9TL_gUX.js} +1 -1
  30. package/dist/{globe-yy_-G4K8.js → globe-CnpFQ9iU.js} +1 -1
  31. package/dist/{goals-BTzgvDOK.js → goals-DQqxuANi.js} +1 -1
  32. package/dist/{health-RsLcvYTb.js → health-C6ZK4ZDk.js} +1 -1
  33. package/dist/{health-D26VB-iZ.js → health-Cg5Vtq-A.js} +1 -1
  34. package/dist/{heatmaps-D4o0Ghjn.js → heatmaps-BLVXNROm.js} +1 -1
  35. package/dist/{home-B8CoN9Hd.js → home-CcQ7J4RY.js} +1 -1
  36. package/dist/{init-Cee2-8Kd.js → init-CczZwsQf.js} +2 -2
  37. package/dist/init-DJbtwhvX.js +1 -0
  38. package/dist/{insights-B0L6kIxY.js → insights-J4kYprJu.js} +1 -1
  39. package/dist/{integrations-CJ9Pa-II.js → integrations-C3z-N73K.js} +1 -1
  40. package/dist/{journeys--jjaTA3C.js → journeys-BRqDOAqs.js} +1 -1
  41. package/dist/{live-CuVd6yRs.js → live-DJsNJ-fo.js} +1 -1
  42. package/dist/login-CDAP0iKS.js +1 -0
  43. package/dist/{login-CsQ7fPVu.js → login-DU1fY88U.js} +1 -1
  44. package/dist/{logout-C3KOOdIM.js → logout-u6BpGCg6.js} +1 -1
  45. package/dist/{notes-jV1DYMp_.js → notes-sFga-5H5.js} +1 -1
  46. package/dist/{pages-0DLiuGYc.js → pages-DXd2DGo6.js} +1 -1
  47. package/dist/{plans-D4o6-tbv.js → plans-BhicnNJA.js} +1 -1
  48. package/dist/{profile-Cm5RFs_L.js → profile-DsSj1vSw.js} +1 -1
  49. package/dist/{projects-BTTgnjOZ.js → projects-CTXvqzN8.js} +1 -1
  50. package/dist/{query-yn10M321.js → query-Ds3hjKZ8.js} +1 -1
  51. package/dist/{resolve-site-BLrtFOyW.js → resolve-site-BTVBMF1C.js} +1 -1
  52. package/dist/{retention-DpBuavgY.js → retention-DWQML_Jo.js} +1 -1
  53. package/dist/{revenue-Bv1Cqzjr.js → revenue-Dm4wls0K.js} +1 -1
  54. package/dist/{self-test-Cml0QXeA.js → self-test-CEclBRpu.js} +1 -1
  55. package/dist/{sessions-B0RwtHvP.js → sessions-KmEQ4zZp.js} +1 -1
  56. package/dist/{settings-i4TqMmAY.js → settings-1kdqZcWp.js} +1 -1
  57. package/dist/{share-DTHFqTzp.js → share-BsCpBNTV.js} +1 -1
  58. package/dist/{site-switcher-D_JBKFaR.js → site-switcher-B2L1-Pjd.js} +1 -1
  59. package/dist/{sources-B39BFFKF.js → sources-CJQtexqb.js} +1 -1
  60. package/dist/{stats-Dh9MQAXx.js → stats-ctt0SOlE.js} +1 -1
  61. package/dist/{status-agent-C3q7fOEs.js → status-agent-CMpp3zEX.js} +1 -1
  62. package/dist/{team-DZtvClMF.js → team-CyzZCg--.js} +1 -1
  63. package/dist/{teams-CqJFecKB.js → teams-DnOLx5tK.js} +1 -1
  64. package/dist/{telemetry-DRh10SvO.js → telemetry-BV-xvfdt.js} +1 -1
  65. package/dist/telemetry-Bbh6Vtst.js +1 -0
  66. package/dist/{telemetry-BdWnMaJC.js → telemetry-C-0DECLq.js} +1 -1
  67. package/dist/{tier-BneaO4vD.js → tier-DDIroQbc.js} +1 -1
  68. package/dist/{token-store-BQuGH0z2.js → token-store-BvSCse1t.js} +1 -1
  69. package/dist/token-store-QTNSg4TT.js +1 -0
  70. package/dist/{update-CoZzBsMu.js → update-C72vyFU1.js} +1 -1
  71. package/dist/{uptime-Ck1GdjRR.js → uptime-Dgi5KItw.js} +1 -1
  72. package/dist/{usage-BN_mEsal.js → usage-BOlapdBM.js} +1 -1
  73. package/dist/{use-NGqXzASp.js → use-DBiMOOkB.js} +1 -1
  74. package/dist/{visitors-BCz-O9rK.js → visitors-CbU2tXXG.js} +1 -1
  75. package/dist/{vitals-Dx_eY6tW.js → vitals-3NBHzH_m.js} +1 -1
  76. package/dist/{watch-CP-Klikt.js → watch-GUa_JTOS.js} +1 -1
  77. package/dist/{webhooks-BR1D3o5S.js → webhooks-CrE9paQf.js} +1 -1
  78. package/dist/{webhooks-forward-CpXm4GHn.js → webhooks-forward-CCd-RyJc.js} +1 -1
  79. package/dist/wizard-bin.js +1 -1
  80. package/package.json +1 -1
  81. package/dist/api-v2-C7-5GPx8.js +0 -1
  82. package/dist/error-codes-DpKbL-uM.js +0 -1
  83. package/dist/init-BrxmKAnU.js +0 -1
  84. package/dist/login-DeznxBjS.js +0 -1
  85. package/dist/telemetry-C1045t6Q.js +0 -1
  86. package/dist/token-store-TmBx42nv.js +0 -1
package/dist/bin.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import{configDir as e,readConfig as t}from"./config--JRu_jFq.js";import{manifestSchema as n}from"./check-D9G0N7NB.js";import{applyManifest as r}from"./apply-oUMOH7u2.js";import"./api-hWp9s3Y8.js";import"./token-store-BQuGH0z2.js";import{normalizeError as i}from"./error-codes-D4XO4okw.js";import{emit as a,flush as o,initTelemetry as s}from"./telemetry-DRh10SvO.js";import{cac as c}from"cac";import{fork as l,spawn as u}from"node:child_process";import d from"node:path";import{fileURLToPath as ee}from"node:url";import{promises as f,readFileSync as p}from"node:fs";import{createInterface as te}from"node:readline";import m from"semver";import{z as h}from"zod";const g=2e3,_=3e4,ne=5e3,v=5e3,y=36e5,b=new Set([`update`,`health`,`doctor`,`--version`,`-v`]),x=h.object({checkedAt:h.number(),latest:h.string()});function S(){return d.join(e(),`update-cache.json`)}async function re(){try{let e=await f.readFile(S(),`utf8`),t=x.safeParse(JSON.parse(e));return t.success?t.data:null}catch{return null}}async function C(t){try{await f.mkdir(e(),{recursive:!0,mode:448}),await f.writeFile(S(),JSON.stringify(t),{mode:384})}catch{}}const w=h.object({latest:h.string(),minSupported:h.string().optional(),platforms:h.record(h.string(),h.unknown()).optional(),downloads:h.record(h.string(),h.unknown()).optional()});async function T(e){if(E(e.argv))return;let t=null,n=await re();if(n&&Date.now()-n.checkedAt<y)t={latest:n.latest,platforms:{}};else{try{t=await D()}catch(e){P(`update check failed: ${e.message}`);return}t&&await C({checkedAt:Date.now(),latest:t.latest})}if(!t||!m.valid(e.currentVersion)||!m.valid(t.latest)||m.eq(e.currentVersion,t.latest)||m.lt(t.latest,e.currentVersion))return;let r=m.diff(e.currentVersion,t.latest);if(!r)return;let i=O();if(r===`patch`||r===`prepatch`){let n=await k(t,e,i);if(n&&i===`npm-global`)return;n&&N(e.argv);return}if(r===`minor`||r===`preminor`||r===`major`||r===`premajor`||r===`prerelease`){let n=await M(t.latest);if(!n){process.stderr.write(`Continuing with ${e.currentVersion}.\n`);return}let r=await k(t,e,i);if(r&&i===`npm-global`)return;r&&N(e.argv);return}}function E(e){if(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`||e.includes(`--no-update-check`))return!0;let t=e[2];return!!(t&&b.has(t))}async function D(){let e=O();if(e===`npm-global`||e===`npm-local`||e===`unknown`)try{let e=await fetch(`https://registry.npmjs.org/@zenovay/cli/latest`,{signal:AbortSignal.timeout(g),headers:{Accept:`application/json`}});if(!e.ok)return null;let t=await e.json();return t.version?{latest:t.version,platforms:{}}:null}catch{return null}let r=await t(),i=`https://zenovay-cli-distribution.zenovay.workers.dev`,a=r.cliBase===i?[r.cliBase]:[r.cliBase,i];for(let e of a)try{let t=await fetch(`${e}/version`,{signal:AbortSignal.timeout(g)});if(!t.ok)continue;let r=await t.json(),i=n.safeParse(r);if(i.success)return i.data;let a=w.safeParse(r);if(a.success)return{latest:a.data.latest,minSupported:a.data.minSupported,platforms:{}}}catch{}return null}function O(){let e=process.argv[1]??``;if(!e)return`unknown`;let t=e.replace(/\\/g,`/`);return t.includes(`/_npx/`)?`npm-local`:t.includes(`/node_modules/@zenovay/cli/`)?`npm-global`:t.includes(`/node_modules/.bin/zenovay`)?`npm-local`:t.includes(`/node_modules/`)?`unknown`:`binary`}async function k(e,n,i){if(i===`npm-local`)return process.stderr.write(`Update available — \`npm i -g @zenovay/cli@${e.latest}\` to upgrade.\n`),!1;if(i===`unknown`)return P(`unknown install method; skipping auto-update (latest ${e.latest})`),!1;if(i===`npm-global`){if(process.env.ZENOVAY_AUTO_UPDATE!==`1`){if(!process.stdin.isTTY||!process.stderr.isTTY)return process.stderr.write(`Update available (${e.latest}). Run \`npm i -g @zenovay/cli@${e.latest}\` to upgrade, or set ZENOVAY_AUTO_UPDATE=1 for unattended updates.\n`),!1;let t=await A(e.latest);if(!t)return process.stderr.write(`Skipped. Run \`npm i -g @zenovay/cli@${e.latest}\` to upgrade later.\n`),!1}return await j(e.latest)}try{let i=await t(),a=await Promise.race([r({currentVersion:n.currentVersion,cliBase:i.cliBase,binaryPath:n.binaryPath,manifest:e}),new Promise((e,t)=>setTimeout(()=>t(Error(`patch install timeout`)),ne))]);return a.updated?!0:(P(`update skipped: ${a.reason??`unknown`}`),!1)}catch(e){return P(`update failed: ${e.message}`),!1}}function A(e){return new Promise(t=>{let n=te({input:process.stdin,output:process.stderr});n.question(`Update @zenovay/cli to ${e} via \`npm i -g\` (unverified npm install)? [y/N] `,e=>{n.close();let r=e.trim().toLowerCase();t(r===`y`||r===`yes`)})})}function j(e){return new Promise(t=>{process.stderr.write(` Updating @zenovay/cli to ${e}...\n`);let n=process.platform===`win32`?`npm.cmd`:`npm`,r=[`install`,`-g`,`@zenovay/cli@${e}`],i={stdio:[`ignore`,`ignore`,`pipe`]},a=``,o=!1,s=u(n,r,i),c=setTimeout(()=>{if(!o){o=!0;try{s.kill(`SIGKILL`)}catch{}P(`npm install timed out after ${_/1e3}s; continuing with current version`),t(!1)}},_);s.stderr?.on(`data`,e=>{a+=e.toString(`utf8`)}),s.on(`error`,e=>{o||(o=!0,clearTimeout(c),P(`npm install error: ${e.message}`),t(!1))}),s.on(`exit`,n=>{o||(o=!0,clearTimeout(c),n===0&&(process.stderr.write(` ✔ Updated to ${e}. Re-run your command to use the new version.\n`),process.exit(0)),/EACCES|permission denied/i.test(a)?process.stderr.write(`Auto-update needs sudo for the global npm prefix. Run: sudo npm i -g @zenovay/cli@${e}\n`):P(`npm install exited ${n}; continuing with current version`),t(!1))})})}function M(e){return new Promise(t=>{if(!process.stdin.isTTY||!process.stderr.isTTY){t(!0);return}process.stderr.write(`New version ${e} available. Update? [Y/n] (auto-yes 5s) `);let n=!1,r=e=>{if(n)return;let r=e.toString(`utf8`).trim().toLowerCase();n=!0,i(),process.stderr.write(`
2
+ import{configDir as e,readConfig as t}from"./config-JVhBplSX.js";import{manifestSchema as n}from"./check-D9G0N7NB.js";import{applyManifest as r}from"./apply-oUMOH7u2.js";import"./api-CdcB84ie.js";import"./token-store-BvSCse1t.js";import{normalizeError as i}from"./error-codes-ByhvHx2M.js";import{emit as a,flush as o,initTelemetry as s}from"./telemetry-BV-xvfdt.js";import{cac as c}from"cac";import{fork as l,spawn as u}from"node:child_process";import d from"node:path";import{fileURLToPath as ee}from"node:url";import{promises as f,readFileSync as p}from"node:fs";import{createInterface as te}from"node:readline";import m from"semver";import{z as h}from"zod";const g=2e3,_=3e4,ne=5e3,v=5e3,y=36e5,b=new Set([`update`,`health`,`doctor`,`--version`,`-v`]),x=h.object({checkedAt:h.number(),latest:h.string()});function S(){return d.join(e(),`update-cache.json`)}async function re(){try{let e=await f.readFile(S(),`utf8`),t=x.safeParse(JSON.parse(e));return t.success?t.data:null}catch{return null}}async function C(t){try{await f.mkdir(e(),{recursive:!0,mode:448}),await f.writeFile(S(),JSON.stringify(t),{mode:384})}catch{}}const w=h.object({latest:h.string(),minSupported:h.string().optional(),platforms:h.record(h.string(),h.unknown()).optional(),downloads:h.record(h.string(),h.unknown()).optional()});async function T(e){if(E(e.argv))return;let t=null,n=await re();if(n&&Date.now()-n.checkedAt<y)t={latest:n.latest,platforms:{}};else{try{t=await D()}catch(e){P(`update check failed: ${e.message}`);return}t&&await C({checkedAt:Date.now(),latest:t.latest})}if(!t||!m.valid(e.currentVersion)||!m.valid(t.latest)||m.eq(e.currentVersion,t.latest)||m.lt(t.latest,e.currentVersion))return;let r=m.diff(e.currentVersion,t.latest);if(!r)return;let i=O();if(r===`patch`||r===`prepatch`){let n=await k(t,e,i);if(n&&i===`npm-global`)return;n&&N(e.argv);return}if(r===`minor`||r===`preminor`||r===`major`||r===`premajor`||r===`prerelease`){let n=await M(t.latest);if(!n){process.stderr.write(`Continuing with ${e.currentVersion}.\n`);return}let r=await k(t,e,i);if(r&&i===`npm-global`)return;r&&N(e.argv);return}}function E(e){if(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`||e.includes(`--no-update-check`))return!0;let t=e[2];return!!(t&&b.has(t))}async function D(){let e=O();if(e===`npm-global`||e===`npm-local`||e===`unknown`)try{let e=await fetch(`https://registry.npmjs.org/@zenovay/cli/latest`,{signal:AbortSignal.timeout(g),headers:{Accept:`application/json`}});if(!e.ok)return null;let t=await e.json();return t.version?{latest:t.version,platforms:{}}:null}catch{return null}let r=await t(),i=`https://zenovay-cli-distribution.zenovay.workers.dev`,a=r.cliBase===i?[r.cliBase]:[r.cliBase,i];for(let e of a)try{let t=await fetch(`${e}/version`,{signal:AbortSignal.timeout(g)});if(!t.ok)continue;let r=await t.json(),i=n.safeParse(r);if(i.success)return i.data;let a=w.safeParse(r);if(a.success)return{latest:a.data.latest,minSupported:a.data.minSupported,platforms:{}}}catch{}return null}function O(){let e=process.argv[1]??``;if(!e)return`unknown`;let t=e.replace(/\\/g,`/`);return t.includes(`/_npx/`)?`npm-local`:t.includes(`/node_modules/@zenovay/cli/`)?`npm-global`:t.includes(`/node_modules/.bin/zenovay`)?`npm-local`:t.includes(`/node_modules/`)?`unknown`:`binary`}async function k(e,n,i){if(i===`npm-local`)return process.stderr.write(`Update available — \`npm i -g @zenovay/cli@${e.latest}\` to upgrade.\n`),!1;if(i===`unknown`)return P(`unknown install method; skipping auto-update (latest ${e.latest})`),!1;if(i===`npm-global`){if(process.env.ZENOVAY_AUTO_UPDATE!==`1`){if(!process.stdin.isTTY||!process.stderr.isTTY)return process.stderr.write(`Update available (${e.latest}). Run \`npm i -g @zenovay/cli@${e.latest}\` to upgrade, or set ZENOVAY_AUTO_UPDATE=1 for unattended updates.\n`),!1;let t=await A(e.latest);if(!t)return process.stderr.write(`Skipped. Run \`npm i -g @zenovay/cli@${e.latest}\` to upgrade later.\n`),!1}return await j(e.latest)}let a=`${process.platform}-${process.arch}`,o=e.platforms??{};if(!o[a])return process.stderr.write(`\nUpdate ${e.latest} is published to npm (no native binary for ${a} in this release).\nUpgrade with one of:\n npm i -g @zenovay/cli@${e.latest}\n curl -fsSL https://cli.zenovay.com/install.sh | sh\n\n`),!1;try{let i=await t(),a=await Promise.race([r({currentVersion:n.currentVersion,cliBase:i.cliBase,binaryPath:n.binaryPath,manifest:e}),new Promise((e,t)=>setTimeout(()=>t(Error(`patch install timeout`)),ne))]);return a.updated?!0:(P(`update skipped: ${a.reason??`unknown`}`),!1)}catch(e){return P(`update failed: ${e.message}`),!1}}function A(e){return new Promise(t=>{let n=te({input:process.stdin,output:process.stderr});n.question(`Update @zenovay/cli to ${e} via \`npm i -g\` (unverified npm install)? [y/N] `,e=>{n.close();let r=e.trim().toLowerCase();t(r===`y`||r===`yes`)})})}function j(e){return new Promise(t=>{process.stderr.write(` Updating @zenovay/cli to ${e}...\n`);let n=process.platform===`win32`?`npm.cmd`:`npm`,r=[`install`,`-g`,`@zenovay/cli@${e}`],i={stdio:[`ignore`,`ignore`,`pipe`]},a=``,o=!1,s=u(n,r,i),c=setTimeout(()=>{if(!o){o=!0;try{s.kill(`SIGKILL`)}catch{}P(`npm install timed out after ${_/1e3}s; continuing with current version`),t(!1)}},_);s.stderr?.on(`data`,e=>{a+=e.toString(`utf8`)}),s.on(`error`,e=>{o||(o=!0,clearTimeout(c),P(`npm install error: ${e.message}`),t(!1))}),s.on(`exit`,n=>{o||(o=!0,clearTimeout(c),n===0&&(process.stderr.write(` ✔ Updated to ${e}. Re-run your command to use the new version.\n`),process.exit(0)),/EACCES|permission denied/i.test(a)?process.stderr.write(`Auto-update needs sudo for the global npm prefix. Run: sudo npm i -g @zenovay/cli@${e}\n`):P(`npm install exited ${n}; continuing with current version`),t(!1))})})}function M(e){return new Promise(t=>{if(!process.stdin.isTTY||!process.stderr.isTTY){t(!0);return}process.stderr.write(`New version ${e} available. Update? [Y/n] (auto-yes 5s) `);let n=!1,r=e=>{if(n)return;let r=e.toString(`utf8`).trim().toLowerCase();n=!0,i(),process.stderr.write(`
3
3
  `),t(r===``||r===`y`||r===`yes`)},i=()=>{clearTimeout(a),process.stdin.off(`data`,r);try{process.stdin.pause()}catch{}},a=setTimeout(()=>{n||(n=!0,i(),process.stderr.write(`
4
- `),t(!0))},v);try{process.stdin.resume(),process.stdin.on(`data`,r)}catch{i(),t(!0)}})}function N(e){try{let t=e.slice(1),n=u(process.execPath,t,{stdio:`inherit`});n.on(`exit`,e=>{process.exit(typeof e==`number`?e:0)}),n.on(`error`,()=>{})}catch{}}function P(e){if(process.env.ZENOVAY_DEBUG_UPDATE===`1`)try{process.stderr.write(`zenovay: ${e}\n`)}catch{}}var F=`@zenovay/cli`,I=`1.0.0`,L=`Zenovay CLI — AI install wizard + full terminal analytics dashboard`,R=`module`,ie={zenovay:`dist/bin.js`,zv:`dist/bin.js`},z=[`dist/**/*.js`,`dist/**/*.cjs`,`dist/**/*.mjs`,`dist/**/*.d.ts`,`README.md`,`LICENSE`],B={dev:`tsx src/bin.ts`,build:`tsdown`,"build:binaries":`tsx scripts/build-binaries.ts`,typecheck:`tsc --noEmit`,lint:`eslint 'src/**/*.{ts,tsx}'`,test:`vitest run`,"test:watch":`vitest`,"test:all":`vitest run tests/unit tests/integration tests/security`,"test:release":`vitest run tests/e2e tests/update --testTimeout=600000`,"test:smoke":`vitest run tests/smoke --testTimeout=60000`,"test:update-golden":`UPDATE_GOLDEN=1 vitest run tests/e2e`,"render:globe":`tsx scripts/render-globe.ts`,smoke:`bash scripts/smoke-test.sh`},V={cac:`^6.7.14`,chalk:`^5.4.1`,diff:`^8.0.3`,globby:`^14.1.0`,ink:`^5.1.0`,"ink-gradient":`^3.0.0`,"ink-select-input":`^6.0.0`,"ink-spinner":`^5.0.0`,"ink-text-input":`^6.0.0`,open:`^10.1.0`,react:`^18.3.1`,semver:`^7.6.3`,"string-width":`^7.2.0`,ulid:`^2.3.0`,zod:`^3.23.8`},H={"@aws-sdk/client-s3":`^3.1036.0`,"@types/node":`^22.10.0`,"@types/react":`^18.3.12`,"@types/semver":`^7.5.8`,"@typescript-eslint/parser":`^8.61.0`,"@vitest/coverage-v8":`^2.1.8`,"csv-parse":`^6.2.1`,eslint:`^9.16.0`,"ink-testing-library":`^4.0.0`,"react-devtools-core":`^4.19.1`,tsdown:`^0.9.0`,tsx:`^4.19.2`,typescript:`^5.7.2`,vitest:`^2.1.8`},U={node:`>=20.0.0`},W=`pnpm@9.15.9`,G={overrides:{"ws@>=8.0.0 <8.21.0":`>=8.21.0`}},K=`Zenovay <cli@zenovay.com>`,q=`SEE LICENSE IN LICENSE`,J=`https://cli.zenovay.com`,Y={type:`git`,url:`https://github.com/zenovay/cli-zenovay.git`},ae={url:`https://cli.zenovay.com/feedback`},oe=[`zenovay`,`analytics`,`cli`,`tui`,`ai-agent`,`install-wizard`],se={name:F,version:I,description:L,type:R,bin:ie,files:z,scripts:B,dependencies:V,devDependencies:H,engines:U,packageManager:W,pnpm:G,author:K,license:q,homepage:J,repository:Y,bugs:ae,keywords:oe};const ce=d.dirname(ee(import.meta.url)),X=se.version,Z=process.argv[0]??`zenovay`;function le(){if(process.env.ZENOVAY_BACKGROUND_UPDATE===`1`&&!(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`))try{let e=d.join(ce,`lib`,`update`,`worker.js`),t=l(e,[],{detached:!0,stdio:`ignore`,env:{...process.env,ZENOVAY_UPDATE_WORKER_FORK:`1`}});t.unref()}catch{}}const Q=c(`zenovay`);Q.version(X),Q.help(e=>{let t=e.filter(e=>{let t=e.title??``;return!/for more info/i.test(t)});return t.push({body:"Run `zenovay <command> --help` for command-specific options and examples."}),t}),Q.option(`-q, --quiet`,`Suppress spinners + interactive UI; implies --json`),Q.option(`--team <name-or-id>`,"Team override for this command (alternative to `zenovay teams switch`)"),(process.argv.includes(`-q`)||process.argv.includes(`--quiet`))&&(process.env.ZENOVAY_FORMAT=`json`,process.argv.includes(`--json`)||process.argv.push(`--json`));const $=process.argv.findIndex(e=>e===`--team`);if($!==-1&&process.argv[$+1]&&(process.env.ZENOVAY_TEAM_ID=process.argv[$+1]),!process.env.ZENOVAY_TEAM_ID)try{let e=process.env.HOME??process.env.USERPROFILE??``,t=d.join(e,`.config`,`zenovay`,`config.json`),n=p(t,`utf8`),r=JSON.parse(n);r.currentTeamId&&(process.env.ZENOVAY_TEAM_ID=r.currentTeamId)}catch{}Q.command(`init`,`AI install wizard — add Zenovay tracking to your codebase`).option(`--json`,`Emit NDJSON events to stdout`).option(`--yes`,`Auto-approve all diffs (for CI)`).option(`--skip-mcp`,`Skip MCP client install`).option(`--skip-verify`,`Skip first-event verification`).option(`--site-id <id>`,`Install for a specific site id (skips the picker)`).action(async e=>{let{initCommand:t}=await import(`./init-BrxmKAnU.js`),n=await t({cliVersion:X,cwd:process.cwd(),json:e.json,yes:e.yes,skipMcp:e.skipMcp,skipVerify:e.skipVerify,siteId:e.siteId});process.exitCode=n}),Q.command(`login`,`Authenticate via OAuth device flow`).option(`--json`,`Emit NDJSON events`).option(`--no-browser`,`Skip opening the browser automatically`).action(async e=>{let{loginCommand:t}=await import(`./login-DeznxBjS.js`),n=await t({cliVersion:X,json:e.json,openBrowser:e.browser!==!1,onCode:e=>{process.stdout.write(`\n Open this URL to authorize the CLI:\n ${e.verificationUriComplete??e.verificationUri}\n Or enter code: ${e.userCode}\n\n`)}});!e.json&&n.email?process.stdout.write(`\n ✔ Logged in as ${n.email}\n Try \`zenovay overview\` to see your dashboard, or \`zenovay --help\` for the full command list.\n\n`):e.json||process.stdout.write(`
4
+ `),t(!0))},v);try{process.stdin.resume(),process.stdin.on(`data`,r)}catch{i(),t(!0)}})}function N(e){try{let t=e.slice(1),n=u(process.execPath,t,{stdio:`inherit`});n.on(`exit`,e=>{process.exit(typeof e==`number`?e:0)}),n.on(`error`,()=>{})}catch{}}function P(e){if(process.env.ZENOVAY_DEBUG_UPDATE===`1`)try{process.stderr.write(`zenovay: ${e}\n`)}catch{}}var F=`@zenovay/cli`,I=`1.0.1`,L=`Zenovay CLI — AI install wizard + full terminal analytics dashboard`,R=`module`,ie={zenovay:`dist/bin.js`,zv:`dist/bin.js`},z=[`dist/**/*.js`,`dist/**/*.cjs`,`dist/**/*.mjs`,`dist/**/*.d.ts`,`README.md`,`LICENSE`],B={dev:`tsx src/bin.ts`,build:`tsdown`,"build:binaries":`tsx scripts/build-binaries.ts`,typecheck:`tsc --noEmit`,lint:`eslint 'src/**/*.{ts,tsx}'`,test:`vitest run`,"test:watch":`vitest`,"test:all":`vitest run tests/unit tests/integration tests/security`,"test:release":`vitest run tests/e2e tests/update --testTimeout=600000`,"test:smoke":`vitest run tests/smoke --testTimeout=60000`,"test:update-golden":`UPDATE_GOLDEN=1 vitest run tests/e2e`,"render:globe":`tsx scripts/render-globe.ts`,smoke:`bash scripts/smoke-test.sh`},V={cac:`^6.7.14`,chalk:`^5.4.1`,diff:`^8.0.3`,globby:`^14.1.0`,ink:`^5.1.0`,"ink-gradient":`^3.0.0`,"ink-select-input":`^6.0.0`,"ink-spinner":`^5.0.0`,"ink-text-input":`^6.0.0`,open:`^10.1.0`,react:`^18.3.1`,semver:`^7.6.3`,"string-width":`^7.2.0`,ulid:`^2.3.0`,zod:`^3.23.8`},H={"@aws-sdk/client-s3":`^3.1036.0`,"@types/node":`^22.10.0`,"@types/react":`^18.3.12`,"@types/semver":`^7.5.8`,"@typescript-eslint/parser":`^8.61.0`,"@vitest/coverage-v8":`^2.1.8`,"csv-parse":`^6.2.1`,eslint:`^9.16.0`,"ink-testing-library":`^4.0.0`,"react-devtools-core":`^4.19.1`,tsdown:`^0.9.0`,tsx:`^4.19.2`,typescript:`^5.7.2`,vitest:`^2.1.8`},U={node:`>=20.0.0`},W=`pnpm@9.15.9`,G={overrides:{"ws@>=8.0.0 <8.21.0":`>=8.21.0`}},K=`Zenovay <cli@zenovay.com>`,q=`SEE LICENSE IN LICENSE`,J=`https://cli.zenovay.com`,Y={type:`git`,url:`https://github.com/zenovay/cli-zenovay.git`},ae={url:`https://cli.zenovay.com/feedback`},oe=[`zenovay`,`analytics`,`cli`,`tui`,`ai-agent`,`install-wizard`],se={name:F,version:I,description:L,type:R,bin:ie,files:z,scripts:B,dependencies:V,devDependencies:H,engines:U,packageManager:W,pnpm:G,author:K,license:q,homepage:J,repository:Y,bugs:ae,keywords:oe};const ce=d.dirname(ee(import.meta.url)),X=se.version,Z=process.argv[0]??`zenovay`;function le(){if(process.env.ZENOVAY_BACKGROUND_UPDATE===`1`&&!(process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`))try{let e=d.join(ce,`lib`,`update`,`worker.js`),t=l(e,[],{detached:!0,stdio:`ignore`,env:{...process.env,ZENOVAY_UPDATE_WORKER_FORK:`1`}});t.unref()}catch{}}const Q=c(`zenovay`);Q.version(X),Q.help(e=>{let t=e.filter(e=>{let t=e.title??``;return!/for more info/i.test(t)});return t.push({body:"Run `zenovay <command> --help` for command-specific options and examples."}),t}),Q.option(`-q, --quiet`,`Suppress spinners + interactive UI; implies --json`),Q.option(`--team <name-or-id>`,"Team override for this command (alternative to `zenovay teams switch`)"),(process.argv.includes(`-q`)||process.argv.includes(`--quiet`))&&(process.env.ZENOVAY_FORMAT=`json`,process.argv.includes(`--json`)||process.argv.push(`--json`));const $=process.argv.findIndex(e=>e===`--team`);if($!==-1&&process.argv[$+1]&&(process.env.ZENOVAY_TEAM_ID=process.argv[$+1]),!process.env.ZENOVAY_TEAM_ID)try{let e=process.env.HOME??process.env.USERPROFILE??``,t=d.join(e,`.config`,`zenovay`,`config.json`),n=p(t,`utf8`),r=JSON.parse(n);r.currentTeamId&&(process.env.ZENOVAY_TEAM_ID=r.currentTeamId)}catch{}Q.command(`init`,`AI install wizard — add Zenovay tracking to your codebase`).option(`--json`,`Emit NDJSON events to stdout`).option(`--yes`,`Auto-approve all diffs (for CI)`).option(`--skip-mcp`,`Skip MCP client install`).option(`--skip-verify`,`Skip first-event verification`).option(`--site-id <id>`,`Install for a specific site id (skips the picker)`).action(async e=>{let{initCommand:t}=await import(`./init-DJbtwhvX.js`),n=await t({cliVersion:X,cwd:process.cwd(),json:e.json,yes:e.yes,skipMcp:e.skipMcp,skipVerify:e.skipVerify,siteId:e.siteId});process.exitCode=n}),Q.command(`login`,`Authenticate via OAuth device flow`).option(`--json`,`Emit NDJSON events`).option(`--no-browser`,`Skip opening the browser automatically`).action(async e=>{let{loginCommand:t}=await import(`./login-CDAP0iKS.js`),n=await t({cliVersion:X,json:e.json,openBrowser:e.browser!==!1,onCode:e=>{process.stdout.write(`\n Open this URL to authorize the CLI:\n ${e.verificationUriComplete??e.verificationUri}\n Or enter code: ${e.userCode}\n\n`)}});!e.json&&n.email?process.stdout.write(`\n ✔ Logged in as ${n.email}\n Try \`zenovay overview\` to see your dashboard, or \`zenovay --help\` for the full command list.\n\n`):e.json||process.stdout.write(`
5
5
  ✔ Logged in.
6
6
 
7
- `)}),Q.command(`logout`,`Revoke current session and delete local auth`).option(`--json`,``).action(async e=>{let{logoutCommand:t}=await import(`./logout-C3KOOdIM.js`);await t({cliVersion:X,json:e.json})}),Q.command(`ai`,`3-mode AI assistant (install / chat / mcp)`).option(`--mode <mode>`,`install | chat | mcp`).option(`--json`,``).action(async e=>{let{aiCommand:t}=await import(`./ai-xhCcy02q.js`),n=await t({cliVersion:X,cwd:process.cwd(),mode:e.mode,json:e.json});process.exitCode=n}),Q.command(`watch`,"[ANALYTICS] Alias for `analytics` (dashboard summary)").option(`--site-id <id>`,`Site ID`).option(`--interval <ms>`,`Poll interval ms (legacy; ignored by analytics)`,{default:15e3}).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-D7vhDrdG.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`analytics [sub]`,`[ANALYTICS] Landing dashboard — visitors, pageviews, bounce, top pages. Subs: live | funnels | goals | insights | profiles | companies`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async(e,t)=>{switch(e){case void 0:{let{analyticsCommand:e}=await import(`./analytics-D7vhDrdG.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});return}case`live`:{let{liveCommand:e}=await import(`./live-CuVd6yRs.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}case`funnels`:{let{funnelCommand:e}=await import(`./funnel-B36lGX2i.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});return}case`goals`:{let{goalsCommand:e}=await import(`./goals-BTzgvDOK.js`);process.exitCode=await e({cliVersion:X,action:`list`,json:t.json});return}case`insights`:{let{insightsCommand:e}=await import(`./insights-B0L6kIxY.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}case`profiles`:{let{visitorsCommand:e}=await import(`./visitors-BCz-O9rK.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}case`companies`:{let{companiesCommand:e}=await import(`./companies-uScE2uHf.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}default:process.stderr.write(t.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown analytics sub-command: ${e}`,hint:`Valid: live | funnels | goals | insights | profiles | companies`})+`
8
- `:`\n✗ Unknown analytics sub-command: '${e}'\n Valid: live | funnels | goals | insights | profiles | companies. Run \`zenovay analytics --help\`\n`),process.exit(2)}}),Q.command(`overview`,"[ANALYTICS] Alias for `analytics`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-D7vhDrdG.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`home`,`[ACCOUNT] Top-level summary — sites + this-week deltas`).option(`--json`,``).action(async e=>{let{homeCommand:t}=await import(`./home-B8CoN9Hd.js`);process.exitCode=await t({cliVersion:X,json:e.json})}),Q.command(`live`,`[ANALYTICS] Real-time visitors + globe + recent events (2s polling)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-CuVd6yRs.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`pages`,`[ANALYTICS] Top pages by views — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit pages as CSV`).option(`--tsv`,`Emit pages as TSV`).option(`--ndjson`,`Emit pages as NDJSON (one row per line)`).action(async e=>{let{pagesCommand:t}=await import(`./pages-0DLiuGYc.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`devices`,`[ANALYTICS] Device / browser / OS breakdown — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit devices as CSV`).option(`--tsv`,`Emit devices as TSV`).option(`--ndjson`,`Emit devices as NDJSON (one row per line)`).action(async e=>{let{devicesCommand:t}=await import(`./devices-CUgpkbAC.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`geo`,`[ANALYTICS] Countries + cities + globe — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit countries as CSV`).option(`--tsv`,`Emit countries as TSV`).option(`--ndjson`,`Emit countries as NDJSON (one row per line)`).action(async e=>{let{geoCommand:t}=await import(`./geo-CPt2etQd.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`retention`,`[BEHAVIOR] Cohort retention heatmap — D1 / D7 / D30 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{retentionCommand:t}=await import(`./retention-DpBuavgY.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`uptime`,`[BEHAVIOR] Uptime monitors with status + p95 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{uptimeCommand:t}=await import(`./uptime-Ck1GdjRR.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`sessions`,`[BEHAVIOR] Recent session-replay list (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{sessionsCommand:t}=await import(`./sessions-B0RwtHvP.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`heatmaps`,`[BEHAVIOR] Recent heatmap captures (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{heatmapsCommand:t}=await import(`./heatmaps-D4o0Ghjn.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`journeys`,`[BEHAVIOR] Page-to-page transition flow (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{journeysCommand:t}=await import(`./journeys--jjaTA3C.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`insights`,`[INTELLIGENCE] AI-generated anomaly / trend / recommendation cards (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-B0L6kIxY.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`events [action]`,`[OPERATIONS] events tail [--filter --forward-to --replay-24h] — stream live events`).option(`--site-id <id>`,`Site ID`,{default:``}).option(`--filter <expr>`,`Filter expression (e.g. 'type=pageview AND country=US')`).option(`--forward-to <url>`,`POST each event to a webhook with HMAC-SHA256 signature`).option(`--replay-24h`,`Replay the last 24h before going live`).option(`--set-forward-secret <hex>`,`Persist the HMAC secret used by --forward-to`).option(`--json`,``).action(async(e,t)=>{e!==`tail`&&(process.stderr.write(t.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown events action: ${e??`(none)`}`,hint:`Usage: zenovay events tail`})+`
9
- `:`\n✗ Unknown events action: '${e??`(none)`}'\n Usage: zenovay events tail. Run \`zenovay events tail --help\`\n`),process.exit(2));let{eventsTailCommand:n}=await import(`./events-tail-CRgba_gO.js`),r=await n({cliVersion:X,siteId:t.siteId,json:t.json,filter:t.filter,forwardTo:t.forwardTo,replay24h:t.replay24h,setForwardSecret:t.setForwardSecret});process.exitCode=r}),Q.command(`health`,`Run self-diagnostic checks`).option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-RsLcvYTb.js`),n=await t({cliVersion:X,binaryPath:Z,json:e.json});process.exitCode=n}),Q.command(`annotation [action]`,`[OPERATIONS] annotation create [--type --message --occurred-at] (deploy / release / campaign / incident / custom)`).option(`--type <type>`,`One of: deploy, release, campaign, incident, custom`,{default:`custom`}).option(`--message <message>`,`Short description (1–500 chars)`,{default:``}).option(`--occurred-at <iso>`,`ISO 8601 timestamp (default: now)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async(e,t)=>{let n=e??`create`;if(n!==`create`){process.stderr.write(`Unknown annotation action: ${n}. Try: zenovay annotation create --type=deploy --message="..."\n`),process.exitCode=2;return}let{annotationCreateCommand:r}=await import(`./annotation-dveH657H.js`),i=await r({cliVersion:X,type:t.type,message:t.message,occurredAt:t.occurredAt,siteId:t.siteId,json:t.json});process.exitCode=i}),Q.command(`doctor`,`AI-assisted self-healing`).option(`--json`,``).action(async e=>{let{doctorCommand:t}=await import(`./doctor-D1bGGwtN.js`),n=await t({cliVersion:X,binaryPath:Z,json:e.json});process.exitCode=n}),Q.command(`stats`,`One-shot dashboard summary (scriptable by default)`).option(`--site-id <id>`,`Site ID`).option(`--range <range>`,`Time range: 24h | 7d | 30d`,{default:`24h`}).option(`--watch`,`Auto-refresh every 60s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{statsCommand:t}=await import(`./stats-Dh9MQAXx.js`),n=await t({cliVersion:X,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`sources`,`Traffic source breakdown with delta arrows`).option(`--site-id <id>`,`Site ID`).option(`--period <p>`,`Period: 7d | 30d | 90d | 1y`,{default:`30d`}).option(`--compare <c>`,`Comparison window (use "prev" for period-over-period)`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{sourcesCommand:t}=await import(`./sources-B39BFFKF.js`),n=await t({cliVersion:X,siteId:e.siteId,period:e.period,compare:e.compare,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`vitals`,`Core Web Vitals dashboard (LCP / INP / CLS / TTFB / FCP)`).option(`--site-id <id>`,`Site ID`).option(`--url <path>`,`Filter to a single URL`).option(`--device <type>`,`Filter by device: mobile | desktop`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`7d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{vitalsCommand:t}=await import(`./vitals-Dx_eY6tW.js`),n=await t({cliVersion:X,siteId:e.siteId,url:e.url,device:e.device,window:e.window,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`revenue`,`MRR / ARR / transaction series`).option(`--site-id <id>`,`Site ID`).option(`--range <r>`,`Time range: 24h | 7d | 30d | 1y`,{default:`30d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{revenueCommand:t}=await import(`./revenue-Bv1Cqzjr.js`),n=await t({cliVersion:X,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`funnels`,`List available funnels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-B36lGX2i.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`themes`,`List available themes with colored swatches`).option(`--validate <path>`,`Validate a custom theme JSON file`).option(`--json`,`Emit themes JSON to stdout`).action(async e=>{let{themesCommand:t}=await import(`./themes-6H0KlK3b.js`),n=await t({cliVersion:X,validate:e.validate,json:e.json});process.exitCode=n}),Q.command(`completions [shell] [valuesType]`,`Emit shell-completion script (bash | zsh | fish | nushell | pwsh)`).option(`--list`,`List supported shells`).action(async(e,t,n)=>{let{completionsCommand:r}=await import(`./completions-DKyjFPMK.js`),i=await r({shell:e,valuesType:t,list:n.list});process.exitCode=i}),Q.command(`query [sql]`,`Restricted SQL REPL over the analytics schema (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--max-rows <n>`,`Cap result row count`,{default:1e3}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{queryCommand:n}=await import(`./query-yn10M321.js`),r=await n({cliVersion:X,siteId:t.siteId,sql:e,maxRows:typeof t.maxRows==`string`?Number(t.maxRows):t.maxRows,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),Q.command(`companies`,`B2B identification feed (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max rows`,{default:100}).option(`--new-only`,`Show only newly identified companies (first-seen in last hour)`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-uScE2uHf.js`),n=await t({cliVersion:X,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,newOnly:e.newOnly,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`projects`,`List your tracked projects`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{projectsCommand:t}=await import(`./projects-BTTgnjOZ.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`deploys`,`[OPERATIONS] Recent deploy markers overlaid on charts`).option(`--site-id <id>`,`Site ID`).option(`--branch <name>`,`Filter to a single branch (e.g. main, develop)`).option(`--since <iso>`,`Only commits after this ISO timestamp`).option(`--limit <n>`,`Max rows`,{default:50}).option(`--connect`,`Print the GitHub-integration deep link in app.zenovay.com`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{deploysCommand:t}=await import(`./deploys-BqQmCzVb.js`),n=await t({cliVersion:X,siteId:e.siteId,branch:e.branch,since:e.since,limit:typeof e.limit==`string`?Number(e.limit):e.limit,connect:e.connect,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`errors`,`[BEHAVIOR] Recent JS / HTTP error snapshot`).alias(`error`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max errors to fetch`,{default:100}).option(`--search <q>`,`Filter by class or message substring`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{errorsCommand:t}=await import(`./errors-CEIyrEgF.js`),n=await t({cliVersion:X,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,search:e.search,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`funnel <id>`,`Funnel drop-off chart for a specific funnel`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 7d | 30d`,{default:`30d`}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{funnelCommand:n}=await import(`./funnel-B36lGX2i.js`),r=await n({cliVersion:X,siteId:t.siteId,funnelId:e,window:t.window,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),Q.command(`api-keys [action] [id]`,`[MANAGE] api-keys list | create [--name --scope] | delete <id>`).option(`--name <n>`,`Human-readable label (create)`).option(`--scope <scope>`,`read | write (create)`,{default:`read`}).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{apiKeysCommand:r}=await import(`./api-keys-DKQX5aL9.js`),i=e??`list`;process.exitCode=await r({cliVersion:X,action:i,id:t,name:n.name,scope:n.scope===`write`?`write`:`read`,yes:n.yes,json:n.json})}),Q.command(`domains [action] [arg]`,`[MANAGE] domains list | add <url> [--name] | delete <id>`).option(`--name <n>`,`Friendly project name (add; default: domain itself)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{domainsCommand:r}=await import(`./domains-iRmYn9G7.js`),i=e??`list`;process.exitCode=await r({cliVersion:X,action:i,url:i===`add`?t:void 0,id:i===`delete`?t:void 0,name:n.name,yes:n.yes,json:n.json})}),Q.command(`team [action] [arg] [arg2]`,`[MANAGE] team list | invite <email> [--role] | remove <userId> | role <userId> <admin|member> (Pro+)`).option(`--role <role>`,`admin | member (invite)`,{default:`member`}).option(`--yes`,`Skip confirmation (remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{teamCommand:i}=await import(`./team-DZtvClMF.js`),a=e??`list`,o;a===`role`?o=n===`admin`?`admin`:`member`:a===`invite`&&(o=r.role===`admin`?`admin`:`member`),process.exitCode=await i({cliVersion:X,action:a,email:a===`invite`?t:void 0,userId:a===`remove`||a===`role`?t:void 0,role:o,yes:r.yes,json:r.json})}),Q.command(`profile [action]`,`[ACCOUNT] profile show | edit [--name --notifications]`).option(`--name <n>`,`New display name (edit)`).option(`--notifications <pref>`,`email | none (edit)`).option(`--json`,``).action(async(e,t)=>{let n=e??`show`,r=t.notifications===`email`||t.notifications===`none`?t.notifications:void 0,{profileCommand:i}=await import(`./profile-Cm5RFs_L.js`);process.exitCode=await i({cliVersion:X,action:n,name:t.name,notifications:r,json:t.json})}),Q.command(`plans [action] [arg] [arg2]`,`[ACCOUNT] plans info | upgrade <pro|scale> | cancel --yes | payment update`).option(`--yes`,"Required for `cancel`").option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`info`,{plansCommand:a}=await import(`./plans-D4o6-tbv.js`),o;if(i===`upgrade`&&t){let e=String(t).toLowerCase();(e===`pro`||e===`scale`||e===`enterprise`)&&(o=e)}let s=i===`payment`&&t===`update`||i===`payment`?`update`:void 0;process.exitCode=await a({cliVersion:X,action:i,targetPlan:o,paymentAction:s,yes:r.yes,json:r.json})}),Q.command(`billing [action]`,"[ACCOUNT] Alias for `plans info`").option(`--json`,``).action(async(e,t)=>{let{plansCommand:n}=await import(`./plans-D4o6-tbv.js`);process.exitCode=await n({cliVersion:X,action:`info`,json:t.json})}),Q.command(`settings [action] [key] [value]`,`[ACCOUNT] settings get [key] | set <key> <value>`).option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`get`,{settingsCommand:a}=await import(`./settings-i4TqMmAY.js`);process.exitCode=await a({cliVersion:X,action:i,key:t||void 0,value:n||void 0,json:r.json})}),Q.command(`integrations [action] [name]`,`[ACCOUNT] integrations list | connect <gsc|github> | disconnect <gsc|github>`).option(`--yes`,`Skip confirmation (disconnect)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=t===`gsc`||t===`github`?t:void 0,{integrationsCommand:a}=await import(`./integrations-CJ9Pa-II.js`);process.exitCode=await a({cliVersion:X,action:r,name:i,yes:n.yes,json:n.json})}),Q.command(`goals [action] [id]`,`[ACCOUNT] goals list | create [--name --type --target] | delete <id> (Pro+)`).option(`--name <n>`,`Goal name (create)`).option(`--type <t>`,`pageview | event (create)`).option(`--target <v>`,`URL pattern or event name (create)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=n.type===`event`||n.type===`pageview`?n.type:void 0,{goalsCommand:a}=await import(`./goals-BTzgvDOK.js`);process.exitCode=await a({cliVersion:X,action:r,id:t,name:n.name,type:i,target:n.target,yes:n.yes,json:n.json})}),Q.command(`notes [action] [id]`,`[ACCOUNT] notes list | create [--content --site-id] | delete <id>`).option(`--content <text>`,`Note body (create)`).option(`--site-id <id>`,`Attach to a specific site (create; defaults to current)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{notesCommand:i}=await import(`./notes-jV1DYMp_.js`);process.exitCode=await i({cliVersion:X,action:r,id:t,content:n.content,siteId:n.siteId,yes:n.yes,json:n.json})}),Q.command(`agency [action] [arg] [arg2]`,`[ACCOUNT] agency clients list | clients add [--email --name] | clients remove <id> | report send <clientId> (Scale+)`).option(`--email <e>`,`Client contact email (clients add)`).option(`--name <n>`,`Client name (clients add)`).option(`--yes`,`Skip confirmation (clients remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{agencyCommand:i}=await import(`./agency-DHAyzKd-.js`),a=`clients-list`,o;e===`clients`?t===`add`?a=`clients-add`:t===`remove`?(a=`clients-remove`,o=n):a=`clients-list`:e===`report`&&t===`send`&&(a=`report-send`,o=n),process.exitCode=await i({cliVersion:X,action:a,id:o,email:r.email,name:r.name,yes:r.yes,json:r.json})}),Q.command(`use [site]`,`Set / show / reset your default site (used when --site-id is omitted)`).option(`--reset`,`Clear the stored default site`).option(`--show`,`Print the current default and exit`).option(`--json`,`Emit JSON`).action(async(e,t)=>{let{useCommand:n}=await import(`./use-NGqXzASp.js`),r=await n({cliVersion:X,match:e,reset:t.reset,show:t.show,json:t.json});process.exitCode=r}),Q.command(`update`,`Manually install the latest version`).option(`--check`,`Don't install — just print latest`).option(`--force-downgrade`,`Allow downgrading to an older version`).option(`--no-update-check`,`Disable auto-update for this invocation`).option(`--json`,``).action(async e=>{let{updateCommand:t}=await import(`./update-CoZzBsMu.js`);await t({cliVersion:X,binaryPath:Z,check:e.check,forceDowngrade:e.forceDowngrade,json:e.json})}),Q.command(`usage`,`[ACCOUNT] Current month events vs plan limits + headcounts`).option(`--json`,``).action(async e=>{let{usageCommand:t}=await import(`./usage-BN_mEsal.js`);process.exitCode=await t({cliVersion:X,json:e.json})}),Q.command(`globe`,`[ANALYTICS] Live 3D globe — visitors plotted on a Braille sphere`).option(`--site-id <id>`,`Site ID`).option(`--browser`,`Open the dashboard's Mapbox globe in your browser instead of the terminal version`).option(`--json`,``).action(async e=>{let{globeCommand:t}=await import(`./globe-yy_-G4K8.js`);process.exitCode=await t({cliVersion:X,siteId:e.siteId,browser:e.browser,json:e.json})}),Q.command(`webhooks [action] [arg]`,`[MANAGE] webhooks list | add <url> [--events] | delete <id> | rotate <id> | test <id> | forward [--to]`).option(`--events <list>`,`Comma-separated event types (add)`).option(`--yes`,`Skip confirmation (delete/rotate)`).option(`--to <url>`,`forward: local URL to POST events to (e.g. localhost:3000/webhook)`).option(`--site-id <id>`,`forward: Site ID`).option(`--sign`,`forward: HMAC-sign each forwarded request with X-Zenovay-Signature`).option(`--secret <hex>`,`forward: HMAC secret (auto-derived from tunnel key if --sign without --secret)`).option(`--max-retries <n>`,`forward: per-request retry count`,{default:3}).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`;if(r===`forward`){let{webhooksForwardCommand:e}=await import(`./webhooks-forward-CpXm4GHn.js`);process.exitCode=await e({cliVersion:X,to:n.to,siteId:n.siteId,sign:n.sign,secret:n.secret,maxRetries:typeof n.maxRetries==`string`?Number(n.maxRetries):n.maxRetries});return}let{webhooksCommand:i}=await import(`./webhooks-BR1D3o5S.js`);process.exitCode=await i({cliVersion:X,action:r,url:r===`add`?t:void 0,id:r===`delete`||r===`rotate`||r===`test`?t:void 0,events:n.events,yes:n.yes,json:n.json})}),Q.command(`audit [action]`,`[ACCOUNT] audit list [--since --action --actor] | export [--format --out] (Pro+)`).option(`--since <window>`,`Window like 24h, 7d, 30d (list)`,{default:`7d`}).option(`--action <pattern>`,`Filter by action string (list)`).option(`--actor <userId>`,`Filter by actor user ID (list)`).option(`--format <fmt>`,`ndjson | csv | json (export)`,{default:`ndjson`}).option(`--out <file>`,`Output file path (export). Defaults to stdout`).option(`--json`,``).action(async(e,t)=>{let n=e??`list`,r=t.format??`ndjson`,{auditCommand:i}=await import(`./audit-DgHopH-O.js`);process.exitCode=await i({cliVersion:X,action:n,since:t.since,filterAction:t.action,actor:t.actor,format:r,out:t.out,json:t.json})}),Q.command(`share [action]`,`[ACCOUNT] share enable | disable | url — public dashboard share for the current site`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--yes`,`Skip confirmation (disable)`).option(`--json`,``).action(async(e,t)=>{let n=e??`url`,{shareCommand:r}=await import(`./share-DTHFqTzp.js`);process.exitCode=await r({cliVersion:X,action:n,siteId:t.siteId,yes:t.yes,json:t.json})}),Q.command(`commands`,`Emit the machine-readable command tree (for AI agents and shell-completion regen)`).option(`--json`,``).action(async e=>{let{commandsCommand:t}=await import(`./commands-BE8-kQ9U.js`);process.exitCode=await t({cliVersion:X,json:e.json})}),Q.command(`teams [action] [arg]`,`[ACCOUNT] teams list | switch <name-or-id> | current | reset`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{teamsCommand:i}=await import(`./teams-CqJFecKB.js`);process.exitCode=await i({cliVersion:X,action:r,match:r===`switch`?t:void 0,json:n.json})}),Q.command(`self-test`,`[OPERATIONS] Functional smoke check across every read endpoint and your local install`).option(`--quick`,`Run a 10-test subset (faster)`).option(`--full`,`Include active security probes + CLI meta-tests (dev/CI use)`).option(`--verbose`,`Include full stdout/stderr per test`).option(`--parallel <n>`,`Concurrent subprocesses (default 4)`,{default:4}).option(`--json`,`Emit NDJSON one line per test result + final summary`).action(async e=>{let{selfTestCommand:t}=await import(`./self-test-Cml0QXeA.js`);process.exitCode=await t({cliVersion:X,full:!!e.full,quick:!!e.quick,verbose:!!e.verbose,parallel:Number(e.parallel)||4,json:!!e.json})}),Q.command(`tour`,`[OPERATIONS] Interactive 8-step walkthrough of the CLI`).option(`--non-interactive`,`Print all 8 steps as a flat document (no prompts)`).action(async e=>{let{tourCommand:t}=await import(`./tour-fOYY-mK0.js`);process.exitCode=await t({cliVersion:X,nonInteractive:!!(e[`non-interactive`]||e.nonInteractive)})}),Q.command(`alerts [action] [id]`,`[MANAGE] alerts list | create [--metric --op --threshold --window] | delete <id> (Pro+)`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--metric <name>`,`Metric to watch (visitors|pageviews|bounce_rate|errors|lcp|inp|cls|uptime|revenue)`).option(`--op <gt|lt>`,`Comparison operator`).option(`--threshold <num>`,`Numeric threshold`).option(`--window <e.g. 1h>`,`Rolling window (5m|1h|24h|7d)`).option(`--name <label>`,`Optional friendly label for the alert`).option(`--channel <chan>`,`Notification channel: in_app | email | webhook (default in_app)`).option(`--email <addr>`,`Notification email (required when --channel email)`).option(`--yes`,`Skip confirmation prompt on delete`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=new Set([`list`,`create`,`delete`]);i.has(r)||(process.stderr.write(n.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown alerts action: ${e}`,hint:`Run zenovay alerts --help`})+`
10
- `:`\n✗ Unknown action: '${e}'\n Valid: list | create | delete. Run \`zenovay alerts --help\`\n`),process.exit(2));let{alertsCommand:a}=await import(`./alerts-Be0XKEUX.js`);process.exitCode=await a({cliVersion:X,action:r,siteId:n[`site-id`]??n.siteId,metric:n.metric,op:n.op,threshold:n.threshold,window:n.window,name:n.name,channel:n.channel,email:n.email,id:t,yes:!!n.yes,json:!!n.json})}),Q.command(`export <type>`,`[OPERATIONS] Export data: analytics | sessions (Pro+) | heatmaps (Pro+)`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--range <range>`,`Time range: 7d | 30d | 90d`,{default:`30d`}).option(`--format <fmt>`,`Output format: csv | json`,{default:`csv`}).option(`--out <file>`,`Write to file instead of stdout`).option(`--json`,``).action(async(e,t)=>{let n=new Set([`analytics`,`sessions`,`heatmaps`]);n.has(e)||(process.stderr.write(t.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown export type: ${e}`,hint:`Valid: analytics | sessions | heatmaps`})+`
11
- `:`\n✗ Unknown export type: '${e}'\n Valid: analytics | sessions | heatmaps. Run \`zenovay export --help\`\n`),process.exit(2));let r=t.format??`csv`,{exportCommand:i}=await import(`./export-Csl7rWLW.js`);process.exitCode=await i({type:e,cliVersion:X,siteId:t[`site-id`]||t.siteId,range:t.range,format:r,out:t.out,json:!!t.json})}),Q.command(`visitors`,`[ANALYTICS] Live visitor table with sortable rows`).option(`--site-id <id>`,`Site ID`).option(`--min-duration <seconds>`,`Filter to sessions ≥ N seconds`,{default:0}).option(`--json`,``).option(`--csv`,`Emit visitors as CSV`).option(`--tsv`,`Emit visitors as TSV`).option(`--ndjson`,`Emit visitors as NDJSON (one row per line)`).action(async e=>{let{visitorsCommand:t}=await import(`./visitors-BCz-O9rK.js`);process.exitCode=await t({cliVersion:X,siteId:e.siteId,minDuration:Number(e[`min-duration`]||e.minDuration)||0,json:!!e.json,csv:!!e.csv,tsv:!!e.tsv,ndjson:!!e.ndjson})}),Q.command(`status`,"[OPERATIONS] Alias of `health` — self-diagnostic checks").option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-RsLcvYTb.js`);process.exitCode=await t({cliVersion:X,binaryPath:Z,json:!!e.json})}),Q.command(`telemetry [action]`,`[OPERATIONS] Manage anonymous CLI telemetry (on / off / status)`).option(`--json`,``).action(async(e,t)=>{let{telemetryCommand:n}=await import(`./telemetry-BdWnMaJC.js`);process.exitCode=await n({cliVersion:X,action:e,json:!!t.json})}),Q.command(`status-agent`,`[OPERATIONS] Background daemon → tmux status bar + threshold alerts`).option(`--daemonize`,`Fork detached child + write PID file`).option(`--child`,`Internal flag — actual polling loop (used by --daemonize)`).option(`--stop`,`Stop the running daemon (read PID file → SIGTERM)`).option(`--install-tmux`,`Print the tmux conf snippet`).option(`--install-systemd`,`Print a systemd user-unit template`).option(`--install-launchd`,`Print a macOS launchd plist template`).option(`--notify-on <rules>`,`Comma-separated threshold rules, e.g. "error_rate>5,revenue_drop>20"`).option(`--site-id <id>`,`Site to poll (defaults to your saved default site)`).option(`--interval-ms <ms>`,`Poll interval ms (default 60000)`,{type:[Number]}).option(`--save-config`,`Persist --notify-on + --interval-ms to ~/.config/zenovay/config.json`).option(`--show-config`,`Print the persisted statusAgent config + exit`).action(async e=>{let{statusAgentCommand:t}=await import(`./status-agent-C3q7fOEs.js`);process.exitCode=await t({cliVersion:X,daemonize:!!e.daemonize,child:!!e.child,stop:!!e.stop,installTmux:!!e.installTmux,installSystemd:!!e.installSystemd,installLaunchd:!!e.installLaunchd,saveConfig:!!e.saveConfig,showConfig:!!e.showConfig,notifyOn:e.notifyOn,siteId:e.siteId,intervalMs:Array.isArray(e.intervalMs)?e.intervalMs[0]:e.intervalMs})}),Q.parse(process.argv,{run:!1}),(async()=>{await T({binaryPath:Z,currentVersion:X,argv:process.argv}),le();let e,t;try{let t=process.env.HOME??process.env.USERPROFILE??``,n=d.join(t,`.config`,`zenovay`,`config.json`),r=p(n,`utf8`);e=JSON.parse(r).apiBase}catch{}try{let e=process.env.HOME??process.env.USERPROFILE??``,n=d.join(e,`.config`,`zenovay`,`auth.json`),r=p(n,`utf8`);t=JSON.parse(r).accessToken}catch{}await s({cliVersion:X,apiBase:e,token:t}).catch(()=>void 0);let n=Date.now(),r=(()=>{let e=Q.matchedCommand;return e?.name})();a(`cli.startup`,{command:r});try{let e=Q.matchedCommand,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`)),i=process.argv.includes(`--help`)||process.argv.includes(`-h`);if(!e&&t.length>0&&!i&&(process.stderr.write(`Unknown command: \`${t.join(` `)}\`\nRun \`zenovay --help\` to see all commands.\n`),a(`cli.exit`,{command:r,exit_code:2,duration_ms:Date.now()-n,error_code:`unknown_command`}),await o().catch(()=>void 0),process.exit(2)),!e&&t.length===0&&!i){Q.outputHelp(),a(`cli.exit`,{command:`help`,exit_code:0,duration_ms:Date.now()-n}),await o().catch(()=>void 0);return}await Q.runMatchedCommand(),a(`cli.exit`,{command:r,exit_code:typeof process.exitCode==`number`?process.exitCode:0,duration_ms:Date.now()-n}),await o().catch(()=>void 0)}catch(e){let t=i(e),s=process.env.ZENOVAY_FORMAT===`json`||process.argv.includes(`--json`)||process.argv.includes(`-q`)||process.argv.includes(`--quiet`);s?process.stderr.write(JSON.stringify(t)+`
7
+ `)}),Q.command(`logout`,`Revoke current session and delete local auth`).option(`--json`,``).action(async e=>{let{logoutCommand:t}=await import(`./logout-u6BpGCg6.js`);await t({cliVersion:X,json:e.json})}),Q.command(`ai`,`3-mode AI assistant (install / chat / mcp)`).option(`--mode <mode>`,`install | chat | mcp`).option(`--json`,``).action(async e=>{let{aiCommand:t}=await import(`./ai-DDefS75j.js`),n=await t({cliVersion:X,cwd:process.cwd(),mode:e.mode,json:e.json});process.exitCode=n}),Q.command(`watch`,"[ANALYTICS] Alias for `analytics` (dashboard summary)").option(`--site-id <id>`,`Site ID`).option(`--interval <ms>`,`Poll interval ms (legacy; ignored by analytics)`,{default:15e3}).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-ZCtpMy4v.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`analytics [sub]`,`[ANALYTICS] Landing dashboard — visitors, pageviews, bounce, top pages. Subs: live | funnels | goals | insights | profiles | companies`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async(e,t)=>{switch(e){case void 0:{let{analyticsCommand:e}=await import(`./analytics-ZCtpMy4v.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});return}case`live`:{let{liveCommand:e}=await import(`./live-DJsNJ-fo.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}case`funnels`:{let{funnelCommand:e}=await import(`./funnel-CnkLL8HX.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});return}case`goals`:{let{goalsCommand:e}=await import(`./goals-DQqxuANi.js`);process.exitCode=await e({cliVersion:X,action:`list`,json:t.json});return}case`insights`:{let{insightsCommand:e}=await import(`./insights-J4kYprJu.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}case`profiles`:{let{visitorsCommand:e}=await import(`./visitors-CbU2tXXG.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}case`companies`:{let{companiesCommand:e}=await import(`./companies-BFUFJkEM.js`);process.exitCode=await e({cliVersion:X,siteId:t.siteId,json:t.json});return}default:process.stderr.write(t.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown analytics sub-command: ${e}`,hint:`Valid: live | funnels | goals | insights | profiles | companies`})+`
8
+ `:`\n✗ Unknown analytics sub-command: '${e}'\n Valid: live | funnels | goals | insights | profiles | companies. Run \`zenovay analytics --help\`\n`),process.exit(2)}}),Q.command(`overview`,"[ANALYTICS] Alias for `analytics`").option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit top-pages as CSV`).option(`--tsv`,`Emit top-pages as TSV`).option(`--ndjson`,`Emit top-pages as NDJSON (one row per line)`).action(async e=>{let{analyticsCommand:t}=await import(`./analytics-ZCtpMy4v.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`home`,`[ACCOUNT] Top-level summary — sites + this-week deltas`).option(`--json`,``).action(async e=>{let{homeCommand:t}=await import(`./home-CcQ7J4RY.js`);process.exitCode=await t({cliVersion:X,json:e.json})}),Q.command(`live`,`[ANALYTICS] Real-time visitors + globe + recent events (2s polling)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{liveCommand:t}=await import(`./live-DJsNJ-fo.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`pages`,`[ANALYTICS] Top pages by views — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit pages as CSV`).option(`--tsv`,`Emit pages as TSV`).option(`--ndjson`,`Emit pages as NDJSON (one row per line)`).action(async e=>{let{pagesCommand:t}=await import(`./pages-DXd2DGo6.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`devices`,`[ANALYTICS] Device / browser / OS breakdown — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit devices as CSV`).option(`--tsv`,`Emit devices as TSV`).option(`--ndjson`,`Emit devices as NDJSON (one row per line)`).action(async e=>{let{devicesCommand:t}=await import(`./devices-BMdSSO0o.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`geo`,`[ANALYTICS] Countries + cities + globe — last 24h`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,`Emit countries as CSV`).option(`--tsv`,`Emit countries as TSV`).option(`--ndjson`,`Emit countries as NDJSON (one row per line)`).action(async e=>{let{geoCommand:t}=await import(`./geo-B9TL_gUX.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`retention`,`[BEHAVIOR] Cohort retention heatmap — D1 / D7 / D30 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{retentionCommand:t}=await import(`./retention-DWQML_Jo.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`uptime`,`[BEHAVIOR] Uptime monitors with status + p95 (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{uptimeCommand:t}=await import(`./uptime-Dgi5KItw.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`sessions`,`[BEHAVIOR] Recent session-replay list (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{sessionsCommand:t}=await import(`./sessions-KmEQ4zZp.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`heatmaps`,`[BEHAVIOR] Recent heatmap captures (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{heatmapsCommand:t}=await import(`./heatmaps-BLVXNROm.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`journeys`,`[BEHAVIOR] Page-to-page transition flow (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{journeysCommand:t}=await import(`./journeys-BRqDOAqs.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`insights`,`[INTELLIGENCE] AI-generated anomaly / trend / recommendation cards (Pro+)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async e=>{let{insightsCommand:t}=await import(`./insights-J4kYprJu.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json});process.exitCode=n}),Q.command(`events [action]`,`[OPERATIONS] events tail [--filter --forward-to --replay-24h] — stream live events`).option(`--site-id <id>`,`Site ID`,{default:``}).option(`--filter <expr>`,`Filter expression (e.g. 'type=pageview AND country=US')`).option(`--forward-to <url>`,`POST each event to a webhook with HMAC-SHA256 signature`).option(`--replay-24h`,`Replay the last 24h before going live`).option(`--set-forward-secret <hex>`,`Persist the HMAC secret used by --forward-to`).option(`--json`,``).action(async(e,t)=>{e!==`tail`&&(process.stderr.write(t.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown events action: ${e??`(none)`}`,hint:`Usage: zenovay events tail`})+`
9
+ `:`\n✗ Unknown events action: '${e??`(none)`}'\n Usage: zenovay events tail. Run \`zenovay events tail --help\`\n`),process.exit(2));let{eventsTailCommand:n}=await import(`./events-tail-CzYtpjey.js`),r=await n({cliVersion:X,siteId:t.siteId,json:t.json,filter:t.filter,forwardTo:t.forwardTo,replay24h:t.replay24h,setForwardSecret:t.setForwardSecret});process.exitCode=r}),Q.command(`health`,`Run self-diagnostic checks`).option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-C6ZK4ZDk.js`),n=await t({cliVersion:X,binaryPath:Z,json:e.json});process.exitCode=n}),Q.command(`annotation [action]`,`[OPERATIONS] annotation create [--type --message --occurred-at] (deploy / release / campaign / incident / custom)`).option(`--type <type>`,`One of: deploy, release, campaign, incident, custom`,{default:`custom`}).option(`--message <message>`,`Short description (1–500 chars)`,{default:``}).option(`--occurred-at <iso>`,`ISO 8601 timestamp (default: now)`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).action(async(e,t)=>{let n=e??`create`;if(n!==`create`){process.stderr.write(`Unknown annotation action: ${n}. Try: zenovay annotation create --type=deploy --message="..."\n`),process.exitCode=2;return}let{annotationCreateCommand:r}=await import(`./annotation-aMzsv1oV.js`),i=await r({cliVersion:X,type:t.type,message:t.message,occurredAt:t.occurredAt,siteId:t.siteId,json:t.json});process.exitCode=i}),Q.command(`doctor`,`AI-assisted self-healing`).option(`--json`,``).action(async e=>{let{doctorCommand:t}=await import(`./doctor-BI6TF72T.js`),n=await t({cliVersion:X,binaryPath:Z,json:e.json});process.exitCode=n}),Q.command(`stats`,`One-shot dashboard summary (scriptable by default)`).option(`--site-id <id>`,`Site ID`).option(`--range <range>`,`Time range: 24h | 7d | 30d`,{default:`24h`}).option(`--watch`,`Auto-refresh every 60s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{statsCommand:t}=await import(`./stats-ctt0SOlE.js`),n=await t({cliVersion:X,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`sources`,`Traffic source breakdown with delta arrows`).option(`--site-id <id>`,`Site ID`).option(`--period <p>`,`Period: 7d | 30d | 90d | 1y`,{default:`30d`}).option(`--compare <c>`,`Comparison window (use "prev" for period-over-period)`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{sourcesCommand:t}=await import(`./sources-CJQtexqb.js`),n=await t({cliVersion:X,siteId:e.siteId,period:e.period,compare:e.compare,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`vitals`,`Core Web Vitals dashboard (LCP / INP / CLS / TTFB / FCP)`).option(`--site-id <id>`,`Site ID`).option(`--url <path>`,`Filter to a single URL`).option(`--device <type>`,`Filter by device: mobile | desktop`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`7d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{vitalsCommand:t}=await import(`./vitals-3NBHzH_m.js`),n=await t({cliVersion:X,siteId:e.siteId,url:e.url,device:e.device,window:e.window,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`revenue`,`MRR / ARR / transaction series`).option(`--site-id <id>`,`Site ID`).option(`--range <r>`,`Time range: 24h | 7d | 30d | 1y`,{default:`30d`}).option(`--watch`,`Auto-refresh every 5 minutes`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{revenueCommand:t}=await import(`./revenue-Dm4wls0K.js`),n=await t({cliVersion:X,siteId:e.siteId,range:e.range,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`funnels`,`List available funnels`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{funnelCommand:t}=await import(`./funnel-CnkLL8HX.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`themes`,`List available themes with colored swatches`).option(`--validate <path>`,`Validate a custom theme JSON file`).option(`--json`,`Emit themes JSON to stdout`).action(async e=>{let{themesCommand:t}=await import(`./themes-6H0KlK3b.js`),n=await t({cliVersion:X,validate:e.validate,json:e.json});process.exitCode=n}),Q.command(`completions [shell] [valuesType]`,`Emit shell-completion script (bash | zsh | fish | nushell | pwsh)`).option(`--list`,`List supported shells`).action(async(e,t,n)=>{let{completionsCommand:r}=await import(`./completions-suqE20Pu.js`),i=await r({shell:e,valuesType:t,list:n.list});process.exitCode=i}),Q.command(`query [sql]`,`Restricted SQL REPL over the analytics schema (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--max-rows <n>`,`Cap result row count`,{default:1e3}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{queryCommand:n}=await import(`./query-Ds3hjKZ8.js`),r=await n({cliVersion:X,siteId:t.siteId,sql:e,maxRows:typeof t.maxRows==`string`?Number(t.maxRows):t.maxRows,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),Q.command(`companies`,`B2B identification feed (Scale+)`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max rows`,{default:100}).option(`--new-only`,`Show only newly identified companies (first-seen in last hour)`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{companiesCommand:t}=await import(`./companies-BFUFJkEM.js`),n=await t({cliVersion:X,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,newOnly:e.newOnly,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`projects`,`List your tracked projects`).option(`--site-id <id>`,`Site ID`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{projectsCommand:t}=await import(`./projects-CTXvqzN8.js`),n=await t({cliVersion:X,siteId:e.siteId,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`deploys`,`[OPERATIONS] Recent deploy markers overlaid on charts`).option(`--site-id <id>`,`Site ID`).option(`--branch <name>`,`Filter to a single branch (e.g. main, develop)`).option(`--since <iso>`,`Only commits after this ISO timestamp`).option(`--limit <n>`,`Max rows`,{default:50}).option(`--connect`,`Print the GitHub-integration deep link in app.zenovay.com`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{deploysCommand:t}=await import(`./deploys-DLvmc21H.js`),n=await t({cliVersion:X,siteId:e.siteId,branch:e.branch,since:e.since,limit:typeof e.limit==`string`?Number(e.limit):e.limit,connect:e.connect,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`errors`,`[BEHAVIOR] Recent JS / HTTP error snapshot`).alias(`error`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 24h | 7d | 30d | 90d`,{default:`24h`}).option(`--limit <n>`,`Max errors to fetch`,{default:100}).option(`--search <q>`,`Filter by class or message substring`).option(`--watch`,`Auto-refresh every 30s`).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async e=>{let{errorsCommand:t}=await import(`./errors-DTs33lNs.js`),n=await t({cliVersion:X,siteId:e.siteId,window:e.window,limit:typeof e.limit==`string`?Number(e.limit):e.limit,search:e.search,watch:e.watch,json:e.json,csv:e.csv,tsv:e.tsv,ndjson:e.ndjson});process.exitCode=n}),Q.command(`funnel <id>`,`Funnel drop-off chart for a specific funnel`).option(`--site-id <id>`,`Site ID`).option(`--window <w>`,`Time window: 7d | 30d`,{default:`30d`}).option(`--json`,``).option(`--csv`,``).option(`--tsv`,``).option(`--ndjson`,``).action(async(e,t)=>{let{funnelCommand:n}=await import(`./funnel-CnkLL8HX.js`),r=await n({cliVersion:X,siteId:t.siteId,funnelId:e,window:t.window,json:t.json,csv:t.csv,tsv:t.tsv,ndjson:t.ndjson});process.exitCode=r}),Q.command(`api-keys [action] [id]`,`[MANAGE] api-keys list | create [--name --scope] | delete <id>`).option(`--name <n>`,`Human-readable label (create)`).option(`--scope <scope>`,`read | write (create)`,{default:`read`}).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{apiKeysCommand:r}=await import(`./api-keys-x_GGL61a.js`),i=e??`list`;process.exitCode=await r({cliVersion:X,action:i,id:t,name:n.name,scope:n.scope===`write`?`write`:`read`,yes:n.yes,json:n.json})}),Q.command(`domains [action] [arg]`,`[MANAGE] domains list | add <url> [--name] | delete <id>`).option(`--name <n>`,`Friendly project name (add; default: domain itself)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let{domainsCommand:r}=await import(`./domains-CNv8-i1K.js`),i=e??`list`;process.exitCode=await r({cliVersion:X,action:i,url:i===`add`?t:void 0,id:i===`delete`?t:void 0,name:n.name,yes:n.yes,json:n.json})}),Q.command(`team [action] [arg] [arg2]`,`[MANAGE] team list | invite <email> [--role] | remove <userId> | role <userId> <admin|member> (Pro+)`).option(`--role <role>`,`admin | member (invite)`,{default:`member`}).option(`--yes`,`Skip confirmation (remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{teamCommand:i}=await import(`./team-CyzZCg--.js`),a=e??`list`,o;a===`role`?o=n===`admin`?`admin`:`member`:a===`invite`&&(o=r.role===`admin`?`admin`:`member`),process.exitCode=await i({cliVersion:X,action:a,email:a===`invite`?t:void 0,userId:a===`remove`||a===`role`?t:void 0,role:o,yes:r.yes,json:r.json})}),Q.command(`profile [action]`,`[ACCOUNT] profile show | edit [--name --notifications]`).option(`--name <n>`,`New display name (edit)`).option(`--notifications <pref>`,`email | none (edit)`).option(`--json`,``).action(async(e,t)=>{let n=e??`show`,r=t.notifications===`email`||t.notifications===`none`?t.notifications:void 0,{profileCommand:i}=await import(`./profile-DsSj1vSw.js`);process.exitCode=await i({cliVersion:X,action:n,name:t.name,notifications:r,json:t.json})}),Q.command(`plans [action] [arg] [arg2]`,`[ACCOUNT] plans info | upgrade <pro|scale> | cancel --yes | payment update`).option(`--yes`,"Required for `cancel`").option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`info`,{plansCommand:a}=await import(`./plans-BhicnNJA.js`),o;if(i===`upgrade`&&t){let e=String(t).toLowerCase();(e===`pro`||e===`scale`||e===`enterprise`)&&(o=e)}let s=i===`payment`&&t===`update`||i===`payment`?`update`:void 0;process.exitCode=await a({cliVersion:X,action:i,targetPlan:o,paymentAction:s,yes:r.yes,json:r.json})}),Q.command(`billing [action]`,"[ACCOUNT] Alias for `plans info`").option(`--json`,``).action(async(e,t)=>{let{plansCommand:n}=await import(`./plans-BhicnNJA.js`);process.exitCode=await n({cliVersion:X,action:`info`,json:t.json})}),Q.command(`settings [action] [key] [value]`,`[ACCOUNT] settings get [key] | set <key> <value>`).option(`--json`,``).action(async(e,t,n,r)=>{let i=e??`get`,{settingsCommand:a}=await import(`./settings-1kdqZcWp.js`);process.exitCode=await a({cliVersion:X,action:i,key:t||void 0,value:n||void 0,json:r.json})}),Q.command(`integrations [action] [name]`,`[ACCOUNT] integrations list | connect <gsc|github> | disconnect <gsc|github>`).option(`--yes`,`Skip confirmation (disconnect)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=t===`gsc`||t===`github`?t:void 0,{integrationsCommand:a}=await import(`./integrations-C3z-N73K.js`);process.exitCode=await a({cliVersion:X,action:r,name:i,yes:n.yes,json:n.json})}),Q.command(`goals [action] [id]`,`[ACCOUNT] goals list | create [--name --type --target] | delete <id> (Pro+)`).option(`--name <n>`,`Goal name (create)`).option(`--type <t>`,`pageview | event (create)`).option(`--target <v>`,`URL pattern or event name (create)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=n.type===`event`||n.type===`pageview`?n.type:void 0,{goalsCommand:a}=await import(`./goals-DQqxuANi.js`);process.exitCode=await a({cliVersion:X,action:r,id:t,name:n.name,type:i,target:n.target,yes:n.yes,json:n.json})}),Q.command(`notes [action] [id]`,`[ACCOUNT] notes list | create [--content --site-id] | delete <id>`).option(`--content <text>`,`Note body (create)`).option(`--site-id <id>`,`Attach to a specific site (create; defaults to current)`).option(`--yes`,`Skip confirmation (delete)`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{notesCommand:i}=await import(`./notes-sFga-5H5.js`);process.exitCode=await i({cliVersion:X,action:r,id:t,content:n.content,siteId:n.siteId,yes:n.yes,json:n.json})}),Q.command(`agency [action] [arg] [arg2]`,`[ACCOUNT] agency clients list | clients add [--email --name] | clients remove <id> | report send <clientId> (Scale+)`).option(`--email <e>`,`Client contact email (clients add)`).option(`--name <n>`,`Client name (clients add)`).option(`--yes`,`Skip confirmation (clients remove)`).option(`--json`,``).action(async(e,t,n,r)=>{let{agencyCommand:i}=await import(`./agency-cNkRWBOo.js`),a=`clients-list`,o;e===`clients`?t===`add`?a=`clients-add`:t===`remove`?(a=`clients-remove`,o=n):a=`clients-list`:e===`report`&&t===`send`&&(a=`report-send`,o=n),process.exitCode=await i({cliVersion:X,action:a,id:o,email:r.email,name:r.name,yes:r.yes,json:r.json})}),Q.command(`use [site]`,`Set / show / reset your default site (used when --site-id is omitted)`).option(`--reset`,`Clear the stored default site`).option(`--show`,`Print the current default and exit`).option(`--json`,`Emit JSON`).action(async(e,t)=>{let{useCommand:n}=await import(`./use-DBiMOOkB.js`),r=await n({cliVersion:X,match:e,reset:t.reset,show:t.show,json:t.json});process.exitCode=r}),Q.command(`update`,`Manually install the latest version`).option(`--check`,`Don't install — just print latest`).option(`--force-downgrade`,`Allow downgrading to an older version`).option(`--no-update-check`,`Disable auto-update for this invocation`).option(`--json`,``).action(async e=>{let{updateCommand:t}=await import(`./update-C72vyFU1.js`);await t({cliVersion:X,binaryPath:Z,check:e.check,forceDowngrade:e.forceDowngrade,json:e.json})}),Q.command(`usage`,`[ACCOUNT] Current month events vs plan limits + headcounts`).option(`--json`,``).action(async e=>{let{usageCommand:t}=await import(`./usage-BOlapdBM.js`);process.exitCode=await t({cliVersion:X,json:e.json})}),Q.command(`globe`,`[ANALYTICS] Live 3D globe — visitors plotted on a Braille sphere`).option(`--site-id <id>`,`Site ID`).option(`--browser`,`Open the dashboard's Mapbox globe in your browser instead of the terminal version`).option(`--json`,``).action(async e=>{let{globeCommand:t}=await import(`./globe-CnpFQ9iU.js`);process.exitCode=await t({cliVersion:X,siteId:e.siteId,browser:e.browser,json:e.json})}),Q.command(`webhooks [action] [arg]`,`[MANAGE] webhooks list | add <url> [--events] | delete <id> | rotate <id> | test <id> | forward [--to]`).option(`--events <list>`,`Comma-separated event types (add)`).option(`--yes`,`Skip confirmation (delete/rotate)`).option(`--to <url>`,`forward: local URL to POST events to (e.g. localhost:3000/webhook)`).option(`--site-id <id>`,`forward: Site ID`).option(`--sign`,`forward: HMAC-sign each forwarded request with X-Zenovay-Signature`).option(`--secret <hex>`,`forward: HMAC secret (auto-derived from tunnel key if --sign without --secret)`).option(`--max-retries <n>`,`forward: per-request retry count`,{default:3}).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`;if(r===`forward`){let{webhooksForwardCommand:e}=await import(`./webhooks-forward-CCd-RyJc.js`);process.exitCode=await e({cliVersion:X,to:n.to,siteId:n.siteId,sign:n.sign,secret:n.secret,maxRetries:typeof n.maxRetries==`string`?Number(n.maxRetries):n.maxRetries});return}let{webhooksCommand:i}=await import(`./webhooks-CrE9paQf.js`);process.exitCode=await i({cliVersion:X,action:r,url:r===`add`?t:void 0,id:r===`delete`||r===`rotate`||r===`test`?t:void 0,events:n.events,yes:n.yes,json:n.json})}),Q.command(`audit [action]`,`[ACCOUNT] audit list [--since --action --actor] | export [--format --out] (Pro+)`).option(`--since <window>`,`Window like 24h, 7d, 30d (list)`,{default:`7d`}).option(`--action <pattern>`,`Filter by action string (list)`).option(`--actor <userId>`,`Filter by actor user ID (list)`).option(`--format <fmt>`,`ndjson | csv | json (export)`,{default:`ndjson`}).option(`--out <file>`,`Output file path (export). Defaults to stdout`).option(`--json`,``).action(async(e,t)=>{let n=e??`list`,r=t.format??`ndjson`,{auditCommand:i}=await import(`./audit-VHsZwYPM.js`);process.exitCode=await i({cliVersion:X,action:n,since:t.since,filterAction:t.action,actor:t.actor,format:r,out:t.out,json:t.json})}),Q.command(`share [action]`,`[ACCOUNT] share enable | disable | url — public dashboard share for the current site`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--yes`,`Skip confirmation (disable)`).option(`--json`,``).action(async(e,t)=>{let n=e??`url`,{shareCommand:r}=await import(`./share-BsCpBNTV.js`);process.exitCode=await r({cliVersion:X,action:n,siteId:t.siteId,yes:t.yes,json:t.json})}),Q.command(`commands`,`Emit the machine-readable command tree (for AI agents and shell-completion regen)`).option(`--json`,``).action(async e=>{let{commandsCommand:t}=await import(`./commands-BE8-kQ9U.js`);process.exitCode=await t({cliVersion:X,json:e.json})}),Q.command(`teams [action] [arg]`,`[ACCOUNT] teams list | switch <name-or-id> | current | reset`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,{teamsCommand:i}=await import(`./teams-DnOLx5tK.js`);process.exitCode=await i({cliVersion:X,action:r,match:r===`switch`?t:void 0,json:n.json})}),Q.command(`self-test`,`[OPERATIONS] Functional smoke check across every read endpoint and your local install`).option(`--quick`,`Run a 10-test subset (faster)`).option(`--full`,`Include active security probes + CLI meta-tests (dev/CI use)`).option(`--verbose`,`Include full stdout/stderr per test`).option(`--parallel <n>`,`Concurrent subprocesses (default 4)`,{default:4}).option(`--json`,`Emit NDJSON one line per test result + final summary`).action(async e=>{let{selfTestCommand:t}=await import(`./self-test-CEclBRpu.js`);process.exitCode=await t({cliVersion:X,full:!!e.full,quick:!!e.quick,verbose:!!e.verbose,parallel:Number(e.parallel)||4,json:!!e.json})}),Q.command(`tour`,`[OPERATIONS] Interactive 8-step walkthrough of the CLI`).option(`--non-interactive`,`Print all 8 steps as a flat document (no prompts)`).action(async e=>{let{tourCommand:t}=await import(`./tour-fOYY-mK0.js`);process.exitCode=await t({cliVersion:X,nonInteractive:!!(e[`non-interactive`]||e.nonInteractive)})}),Q.command(`alerts [action] [id]`,`[MANAGE] alerts list | create [--metric --op --threshold --window] | delete <id> (Pro+)`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--metric <name>`,`Metric to watch (visitors|pageviews|bounce_rate|errors|lcp|inp|cls|uptime|revenue)`).option(`--op <gt|lt>`,`Comparison operator`).option(`--threshold <num>`,`Numeric threshold`).option(`--window <e.g. 1h>`,`Rolling window (5m|1h|24h|7d)`).option(`--name <label>`,`Optional friendly label for the alert`).option(`--channel <chan>`,`Notification channel: in_app | email | webhook (default in_app)`).option(`--email <addr>`,`Notification email (required when --channel email)`).option(`--yes`,`Skip confirmation prompt on delete`).option(`--json`,``).action(async(e,t,n)=>{let r=e??`list`,i=new Set([`list`,`create`,`delete`]);i.has(r)||(process.stderr.write(n.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown alerts action: ${e}`,hint:`Run zenovay alerts --help`})+`
10
+ `:`\n✗ Unknown action: '${e}'\n Valid: list | create | delete. Run \`zenovay alerts --help\`\n`),process.exit(2));let{alertsCommand:a}=await import(`./alerts-BQ0EMdBT.js`);process.exitCode=await a({cliVersion:X,action:r,siteId:n[`site-id`]??n.siteId,metric:n.metric,op:n.op,threshold:n.threshold,window:n.window,name:n.name,channel:n.channel,email:n.email,id:t,yes:!!n.yes,json:!!n.json})}),Q.command(`export <type>`,`[OPERATIONS] Export data: analytics | sessions (Pro+) | heatmaps (Pro+)`).option(`--site-id <id>`,`Site ID (defaults to your current default site)`).option(`--range <range>`,`Time range: 7d | 30d | 90d`,{default:`30d`}).option(`--format <fmt>`,`Output format: csv | json`,{default:`csv`}).option(`--out <file>`,`Write to file instead of stdout`).option(`--json`,``).action(async(e,t)=>{let n=new Set([`analytics`,`sessions`,`heatmaps`]);n.has(e)||(process.stderr.write(t.json?JSON.stringify({type:`error`,code:`validation_failed`,message:`Unknown export type: ${e}`,hint:`Valid: analytics | sessions | heatmaps`})+`
11
+ `:`\n✗ Unknown export type: '${e}'\n Valid: analytics | sessions | heatmaps. Run \`zenovay export --help\`\n`),process.exit(2));let r=t.format??`csv`,{exportCommand:i}=await import(`./export-BAFQahzg.js`);process.exitCode=await i({type:e,cliVersion:X,siteId:t[`site-id`]||t.siteId,range:t.range,format:r,out:t.out,json:!!t.json})}),Q.command(`visitors`,`[ANALYTICS] Live visitor table with sortable rows`).option(`--site-id <id>`,`Site ID`).option(`--min-duration <seconds>`,`Filter to sessions ≥ N seconds`,{default:0}).option(`--json`,``).option(`--csv`,`Emit visitors as CSV`).option(`--tsv`,`Emit visitors as TSV`).option(`--ndjson`,`Emit visitors as NDJSON (one row per line)`).action(async e=>{let{visitorsCommand:t}=await import(`./visitors-CbU2tXXG.js`);process.exitCode=await t({cliVersion:X,siteId:e.siteId,minDuration:Number(e[`min-duration`]||e.minDuration)||0,json:!!e.json,csv:!!e.csv,tsv:!!e.tsv,ndjson:!!e.ndjson})}),Q.command(`status`,"[OPERATIONS] Alias of `health` — self-diagnostic checks").option(`--json`,``).action(async e=>{let{healthCommand:t}=await import(`./health-C6ZK4ZDk.js`);process.exitCode=await t({cliVersion:X,binaryPath:Z,json:!!e.json})}),Q.command(`telemetry [action]`,`[OPERATIONS] Manage anonymous CLI telemetry (on / off / status)`).option(`--json`,``).action(async(e,t)=>{let{telemetryCommand:n}=await import(`./telemetry-C-0DECLq.js`);process.exitCode=await n({cliVersion:X,action:e,json:!!t.json})}),Q.command(`status-agent`,`[OPERATIONS] Background daemon → tmux status bar + threshold alerts`).option(`--daemonize`,`Fork detached child + write PID file`).option(`--child`,`Internal flag — actual polling loop (used by --daemonize)`).option(`--stop`,`Stop the running daemon (read PID file → SIGTERM)`).option(`--install-tmux`,`Print the tmux conf snippet`).option(`--install-systemd`,`Print a systemd user-unit template`).option(`--install-launchd`,`Print a macOS launchd plist template`).option(`--notify-on <rules>`,`Comma-separated threshold rules, e.g. "error_rate>5,revenue_drop>20"`).option(`--site-id <id>`,`Site to poll (defaults to your saved default site)`).option(`--interval-ms <ms>`,`Poll interval ms (default 60000)`,{type:[Number]}).option(`--save-config`,`Persist --notify-on + --interval-ms to ~/.config/zenovay/config.json`).option(`--show-config`,`Print the persisted statusAgent config + exit`).action(async e=>{let{statusAgentCommand:t}=await import(`./status-agent-CMpp3zEX.js`);process.exitCode=await t({cliVersion:X,daemonize:!!e.daemonize,child:!!e.child,stop:!!e.stop,installTmux:!!e.installTmux,installSystemd:!!e.installSystemd,installLaunchd:!!e.installLaunchd,saveConfig:!!e.saveConfig,showConfig:!!e.showConfig,notifyOn:e.notifyOn,siteId:e.siteId,intervalMs:Array.isArray(e.intervalMs)?e.intervalMs[0]:e.intervalMs})}),Q.parse(process.argv,{run:!1}),(async()=>{await T({binaryPath:Z,currentVersion:X,argv:process.argv}),le();let e,t;try{let t=process.env.HOME??process.env.USERPROFILE??``,n=d.join(t,`.config`,`zenovay`,`config.json`),r=p(n,`utf8`);e=JSON.parse(r).apiBase}catch{}try{let e=process.env.HOME??process.env.USERPROFILE??``,n=d.join(e,`.config`,`zenovay`,`auth.json`),r=p(n,`utf8`);t=JSON.parse(r).accessToken}catch{}await s({cliVersion:X,apiBase:e,token:t}).catch(()=>void 0);let n=Date.now(),r=(()=>{let e=Q.matchedCommand;return e?.name})();a(`cli.startup`,{command:r});try{let e=Q.matchedCommand,t=process.argv.slice(2).filter(e=>!e.startsWith(`-`)),i=process.argv.includes(`--help`)||process.argv.includes(`-h`);if(!e&&t.length>0&&!i&&(process.stderr.write(`Unknown command: \`${t.join(` `)}\`\nRun \`zenovay --help\` to see all commands.\n`),a(`cli.exit`,{command:r,exit_code:2,duration_ms:Date.now()-n,error_code:`unknown_command`}),await o().catch(()=>void 0),process.exit(2)),!e&&t.length===0&&!i){Q.outputHelp(),a(`cli.exit`,{command:`help`,exit_code:0,duration_ms:Date.now()-n}),await o().catch(()=>void 0);return}await Q.runMatchedCommand(),a(`cli.exit`,{command:r,exit_code:typeof process.exitCode==`number`?process.exitCode:0,duration_ms:Date.now()-n}),await o().catch(()=>void 0)}catch(e){let t=i(e),s=process.env.ZENOVAY_FORMAT===`json`||process.argv.includes(`--json`)||process.argv.includes(`-q`)||process.argv.includes(`--quiet`);s?process.stderr.write(JSON.stringify(t)+`
12
12
  `):(process.stderr.write(`\n✗ ${t.message}\n`),t.hint&&process.stderr.write(` ${t.hint}\n`)),a(`command.error`,{command:r,error_code:t.code??`unknown_error`,duration_ms:Date.now()-n}),a(`cli.exit`,{command:r,exit_code:1,duration_ms:Date.now()-n}),await o().catch(()=>void 0),process.exit(1)}})();
@@ -1,4 +1,4 @@
1
- import{emit as e}from"./telemetry-DRh10SvO.js";import{parseSseStream as t}from"./client-ntsEXSVC.js";import{Banner as n,Panel as r,useTheme as i}from"./panel-CTtQ2ue6.js";import{Keybar as a}from"./keybar-DO5OoZy9.js";import{Box as o,Static as s,Text as c,useApp as l,useInput as u}from"ink";import d,{useEffect as f,useRef as p,useState as m}from"react";import ee from"ink-spinner";const h=2048;async function*g(e){let n=[{role:`system`,content:_(e.context)},...e.transcript,{role:`user`,content:e.newUserMessage}],r;try{r=await e.api.openAiStream(`chat`,{messages:n,siteId:e.context.siteId},e.signal)}catch(e){yield{type:`error`,message:e.message??`request failed`};return}if(!r.ok){yield{type:`error`,message:`chat request failed (${r.status})`,code:String(r.status)};return}let i=parseInt(r.headers.get(`X-CLI-Queries-Today`)??`0`,10),a=parseInt(r.headers.get(`X-CLI-Queries-Daily-Limit`)??`0`,10),o=r.headers.get(`X-CLI-Tier`)??``;a>0&&(yield{type:`rate_limit`,used:i,limit:a,tier:o});let s=``;try{for await(let e of t(r))if(e.type===`delta`)s+=e.content,yield{type:`delta`,text:e.content};else if(e.type===`tool_start`)yield{type:`tool_start`,id:e.id,name:e.name};else if(e.type===`tool_result`)yield{type:`tool_result`,id:e.id,name:e.name,summary:e.summary,error:e.error};else if(e.type===`done`){yield{type:`done`,fullText:s};return}else if(e.type===`error`){yield{type:`error`,message:e.message,code:e.code};return}yield{type:`done`,fullText:s}}catch(e){if(e.name===`AbortError`){yield{type:`error`,message:`cancelled`,code:`aborted`};return}yield{type:`error`,message:e.message??`stream parse failed`}}}function _(e){let t=new Date().toISOString(),n=e.metricsSnapshot?v(e.metricsSnapshot,h):`(no live data yet)`,r=e.siteLabel?`${e.siteLabel}${e.siteId?` (id: ${e.siteId})`:``}`:e.siteId??`(no site)`;return[`You are the Zenovay AI assistant, embedded in the Zenovay terminal CLI.`,``,`The user is currently looking at the \`${e.commandName}\` view for their site ${r}.`,`They can ask questions about their analytics in plain English. Be concise`,`(≤200 words unless they ask for more). Cite specific numbers from the snapshot`,`below. Use plain text only — the terminal does not render markdown.`,``,`Current dashboard snapshot (live as of ${t}):`,n,``,`When you do not have enough data to answer, say so explicitly and tell`,`the user which command would surface that data (e.g. "run zenovay sources`,`--period 30d to get monthly trends"). Do NOT fabricate numbers.`].join(`
1
+ import{emit as e}from"./telemetry-BV-xvfdt.js";import{parseSseStream as t}from"./client-ntsEXSVC.js";import{Banner as n,Panel as r,useTheme as i}from"./panel-CTtQ2ue6.js";import{Keybar as a}from"./keybar-DO5OoZy9.js";import{Box as o,Static as s,Text as c,useApp as l,useInput as u}from"ink";import d,{useEffect as f,useRef as p,useState as m}from"react";import ee from"ink-spinner";const h=2048;async function*g(e){let n=[{role:`system`,content:_(e.context)},...e.transcript,{role:`user`,content:e.newUserMessage}],r;try{r=await e.api.openAiStream(`chat`,{messages:n,siteId:e.context.siteId},e.signal)}catch(e){yield{type:`error`,message:e.message??`request failed`};return}if(!r.ok){yield{type:`error`,message:`chat request failed (${r.status})`,code:String(r.status)};return}let i=parseInt(r.headers.get(`X-CLI-Queries-Today`)??`0`,10),a=parseInt(r.headers.get(`X-CLI-Queries-Daily-Limit`)??`0`,10),o=r.headers.get(`X-CLI-Tier`)??``;a>0&&(yield{type:`rate_limit`,used:i,limit:a,tier:o});let s=``;try{for await(let e of t(r))if(e.type===`delta`)s+=e.content,yield{type:`delta`,text:e.content};else if(e.type===`tool_start`)yield{type:`tool_start`,id:e.id,name:e.name};else if(e.type===`tool_result`)yield{type:`tool_result`,id:e.id,name:e.name,summary:e.summary,error:e.error};else if(e.type===`done`){yield{type:`done`,fullText:s};return}else if(e.type===`error`){yield{type:`error`,message:e.message,code:e.code};return}yield{type:`done`,fullText:s}}catch(e){if(e.name===`AbortError`){yield{type:`error`,message:`cancelled`,code:`aborted`};return}yield{type:`error`,message:e.message??`stream parse failed`}}}function _(e){let t=new Date().toISOString(),n=e.metricsSnapshot?v(e.metricsSnapshot,h):`(no live data yet)`,r=e.siteLabel?`${e.siteLabel}${e.siteId?` (id: ${e.siteId})`:``}`:e.siteId??`(no site)`;return[`You are the Zenovay AI assistant, embedded in the Zenovay terminal CLI.`,``,`The user is currently looking at the \`${e.commandName}\` view for their site ${r}.`,`They can ask questions about their analytics in plain English. Be concise`,`(≤200 words unless they ask for more). Cite specific numbers from the snapshot`,`below. Use plain text only — the terminal does not render markdown.`,``,`Current dashboard snapshot (live as of ${t}):`,n,``,`When you do not have enough data to answer, say so explicitly and tell`,`the user which command would surface that data (e.g. "run zenovay sources`,`--period 30d to get monthly trends"). Do NOT fabricate numbers.`].join(`
2
2
  `)}function v(e,t){let n=JSON.stringify(e);if(n.length<=t)return JSON.stringify(e,null,2);let r=JSON.parse(n);for(let e=0;e<5;e+=1){r=y(r,10-e*2);let n=JSON.stringify(r);if(n.length<=t)return JSON.stringify(r,null,2)}let i=JSON.stringify(r).slice(0,t-16);return i+`… [truncated]`}function y(e,t){if(Array.isArray(e))return e.length>t?[...e.slice(0,t),`… ${e.length-t} more elided`]:e.map(e=>y(e,t));if(e&&typeof e==`object`){let n={};for(let[r,i]of Object.entries(e))n[r]=y(i,t);return n}return e}const b=30,x=6e4,S=[`What’s my top page today?`,`Where are most visitors coming from?`,`Show me the bounce-rate trend this week`,`Which pages have the highest bounce rate?`];function C(e){return e.replace(/^ask_/,``).replace(/_/g,` `)}function w(){let e=process.stdout.columns;return typeof e==`number`&&e>0?e:80}function T(e,t,n){if(t<=0)return{body:``,clipped:0};let r=e.split(`
3
3
  `),i=[];for(let e of r)if(e.length<=n||n<=0)i.push(e);else for(let t=0;t<e.length;t+=n)i.push(e.slice(t,t+n));if(i.length<=t)return{body:e,clipped:0};let a=i.slice(i.length-t);return{body:a.join(`
4
4
  `),clipped:i.length-t}}function E(e,t){let n=t.replace(/\r\n?/g,`
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-PSN5hjlF.js";import{resolveSiteId as s}from"./resolve-site-BLrtFOyW.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as d}from"./analytical-screen-BU2yCSg_.js";import{Box as f,Text as p}from"ink";import m from"react";function h(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}function g(e){return e==null?`—`:e>=500?`Enterprise`:e>=50?`Growth`:`SMB`}function _({data:e}){let{theme:t}=o(),n=e.companies.filter(e=>e.isNew).length,r=e.companies.filter(e=>(e.employeeCount??0)>=500).length;return m.createElement(f,{flexDirection:`column`},m.createElement(p,null,m.createElement(p,{bold:!0},e.total),m.createElement(p,{color:t.muted},` companies`)),m.createElement(p,{color:t.muted},m.createElement(p,{color:t.success},`● `,n,` new`),` · `,r,` enterprise`))}function v({data:e,newOnly:t,columns:n}){let r=t?e.companies.filter(e=>e.isNew):e.companies;return r.length===0?m.createElement(l,{reason:`no-data`,headline:t?`No new companies yet`:`No identified companies yet`,hint:t?`No first-time companies visited in this window. Widen the window with [1-4].`:`No companies have been identified in this window. Widen the window with [1-4].`}):m.createElement(c,{data:r.slice(0,30),columns:n,headerStyle:`accent`})}async function y(o){let c=await e(),l=await t({strict:!1}),f=new n({config:c,cliVersion:o.cliVersion,token:l}),p,y;try{({siteId:p,site:y}=await s(f,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let b=i(o),x=o.window??`24h`,S=o.limit??100,C=y?.url?y.url.replace(/^https?:\/\//,``).replace(/\/$/,``):y?.name??p,w=[{key:`lastSeenAt`,label:`when`,width:6,format:e=>h(String(e))},{key:`name`,label:`company`,width:24,format:e=>String(e).slice(0,24)},{key:`employeeCount`,label:`tier`,width:11,format:e=>g(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 d({cliVersion:o.cliVersion,title:`companies · ${C}`,commandName:`companies`,ranges:!0,ai:{api:f,siteId:p,siteLabel:C},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?3e4:0,fetcher:(e,t)=>f.getCompaniesSnapshot(p,{window:t??x,limit:S},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`companies`,{siteId:p}))}}},headlessEmit:(e,t)=>{let n=o.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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{deepLinkFor as u}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as d}from"./analytical-screen-B4xo6sII.js";import{Box as f,Text as p}from"ink";import m from"react";function h(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}function g(e){return e==null?`—`:e>=500?`Enterprise`:e>=50?`Growth`:`SMB`}function _({data:e}){let{theme:t}=o(),n=e.companies.filter(e=>e.isNew).length,r=e.companies.filter(e=>(e.employeeCount??0)>=500).length;return m.createElement(f,{flexDirection:`column`},m.createElement(p,null,m.createElement(p,{bold:!0},e.total),m.createElement(p,{color:t.muted},` companies`)),m.createElement(p,{color:t.muted},m.createElement(p,{color:t.success},`● `,n,` new`),` · `,r,` enterprise`))}function v({data:e,newOnly:t,columns:n}){let r=t?e.companies.filter(e=>e.isNew):e.companies;return r.length===0?m.createElement(l,{reason:`no-data`,headline:t?`No new companies yet`:`No identified companies yet`,hint:t?`No first-time companies visited in this window. Widen the window with [1-4].`:`No companies have been identified in this window. Widen the window with [1-4].`}):m.createElement(c,{data:r.slice(0,30),columns:n,headerStyle:`accent`})}async function y(o){let c=await e(),l=await t({strict:!1}),f=new n({config:c,cliVersion:o.cliVersion,token:l}),p,y;try{({siteId:p,site:y}=await s(f,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let b=i(o),x=o.window??`24h`,S=o.limit??100,C=y?.url?y.url.replace(/^https?:\/\//,``).replace(/\/$/,``):y?.name??p,w=[{key:`lastSeenAt`,label:`when`,width:6,format:e=>h(String(e))},{key:`name`,label:`company`,width:24,format:e=>String(e).slice(0,24)},{key:`employeeCount`,label:`tier`,width:11,format:e=>g(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 d({cliVersion:o.cliVersion,title:`companies · ${C}`,commandName:`companies`,ranges:!0,ai:{api:f,siteId:p,siteLabel:C},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?3e4:0,fetcher:(e,t)=>f.getCompaniesSnapshot(p,{window:t??x,limit:S},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(u(`companies`,{siteId:p}))}}},headlessEmit:(e,t)=>{let n=o.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=>m.createElement(_,{data:e})},{id:`feed`,title:`Feed`,render:e=>m.createElement(v,{data:e,newOnly:!!o.newOnly,columns:w})}]})}export{y as companiesCommand};
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{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
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{getCachedTier as r}from"./tier-DDIroQbc.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
@@ -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--JRu_jFq.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-JVhBplSX.js";export{i as readConfig};
@@ -1 +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
+ 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(),n;try{n=await t.readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return a;throw e}try{let e=i.safeParse(JSON.parse(n));return e.success?e.data:a}catch{return a}}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,2 +1,2 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as a}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-PSN5hjlF.js";import{resolveSiteId as o}from"./resolve-site-BLrtFOyW.js";import{DataTable as s}from"./data-table-BhKjjiOS.js";import{EmptyState as c}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as l}from"./analytical-screen-BU2yCSg_.js";import{Box as u,Text as d}from"ink";import f from"react";function p(e){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 m(a){if(a.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 s=await e(),c=await t({strict:!1}),u=new n({config:s,cliVersion:a.cliVersion,token:c}),d,m;try{({siteId:d,site:m}=await o(u,{explicit:a.siteId,headless:!!(a.json||a.csv||a.tsv||a.ndjson),cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let _=i(a),v=a.limit??50,y=m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??d,b=[{key:`pushed_at`,label:`when`,width:6,format:e=>p(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 l({cliVersion:a.cliVersion,title:`deploys · ${y}`,commandName:`deploys`,ai:{api:u,siteId:d,siteLabel:y},authToken:c?.accessToken??null,refreshIntervalMs:0,fetcher:e=>u.getDeploys(d,{branch:a.branch,since:a.since,limit:v},e),format:_,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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as a}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as o}from"./resolve-site-BTVBMF1C.js";import{DataTable as s}from"./data-table-BhKjjiOS.js";import{EmptyState as c}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as l}from"./analytical-screen-B4xo6sII.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`}async function m(a){if(a.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 s=await e(),c=await t({strict:!1}),u=new n({config:s,cliVersion:a.cliVersion,token:c}),d,m;try{({siteId:d,site:m}=await o(u,{explicit:a.siteId,headless:!!(a.json||a.csv||a.tsv||a.ndjson),cliVersion:a.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let _=i(a),v=a.limit??50,y=m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??d,b=[{key:`pushed_at`,label:`when`,width:6,format:e=>p(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 l({cliVersion:a.cliVersion,title:`deploys · ${y}`,commandName:`deploys`,ai:{api:u,siteId:d,siteLabel:y},authToken:c?.accessToken??null,refreshIntervalMs:0,fetcher:e=>u.getDeploys(d,{branch:a.branch,since:a.since,limit:v},e),format:_,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=>f.createElement(h,{data:e,branch:a.branch})},{id:`list`,title:`Recent`,render:e=>f.createElement(g,{data:e,columns:b})}]})}const h=({data:e,branch:t})=>{let{theme:n}=a(),r=e.deploys.filter(e=>e.show_on_chart).length,i=new Set(e.deploys.map(e=>e.repository).filter(e=>!!e));return f.createElement(u,{flexDirection:`column`},f.createElement(d,null,f.createElement(d,{bold:!0},e.total),f.createElement(d,{color:n.muted},` commits`,t?` · branch=${t}`:``)),f.createElement(d,{color:n.muted},f.createElement(d,{color:n.accent},`● `,r,` on chart`),f.createElement(d,null,` · `),f.createElement(d,null,i.size,` `,i.size===1?`repo`:`repos`)))},g=({data:e,columns:t})=>e.deploys.length===0?f.createElement(c,{reason:`no-data`,headline:`No deploys yet`,hint:"Run `zenovay deploys --connect` to wire up the GitHub integration."}):f.createElement(s,{data:e.deploys.slice(0,30),columns:t,headerStyle:`accent`});export{m as deploysCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as l}from"./keybar-DO5OoZy9.js";import{resolveSiteId as u}from"./resolve-site-BLrtFOyW.js";import{DataTable as d}from"./data-table-BhKjjiOS.js";import{EmptyState as f}from"./empty-state-D-krMX62.js";import{ResponsiveGrid as p}from"./grid-CMwhs-Ms.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{RangeTabs as g,rangeForKey as _}from"./range-tabs-BbJdVWNV.js";import{useSiteSwitcher as v}from"./site-switcher-D_JBKFaR.js";import{Box as y,Text as b,render as x,useApp as S,useInput as C}from"ink";import w,{useEffect as T,useState as E}from"react";import D from"ink-spinner";async function O(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(i(a)){let e=await c.getDevices(l);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-CmlDBfbA.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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as l}from"./keybar-DO5OoZy9.js";import{resolveSiteId as u}from"./resolve-site-BTVBMF1C.js";import{DataTable as d}from"./data-table-BhKjjiOS.js";import{EmptyState as f}from"./empty-state-D-krMX62.js";import{ResponsiveGrid as p}from"./grid-CMwhs-Ms.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{RangeTabs as g,rangeForKey as _}from"./range-tabs-BbJdVWNV.js";import{useSiteSwitcher as v}from"./site-switcher-B2L1-Pjd.js";import{Box as y,Text as b,render as x,useApp as S,useInput as C}from"ink";import w,{useEffect as T,useState as E}from"react";import D from"ink-spinner";async function O(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(i(a)){let e=await c.getDevices(l);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-CmlDBfbA.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}=x(w.createElement(k,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const k=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:u}=S(),{theme:x}=c(),[O,k]=E(null),[A,j]=E(!0),[M,N]=E(null),[P,F]=E(`24h`),[I,L]=E(t),[R,z]=E(n),B=v(e,I,e=>{L(e.id),z(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),k(null)});C((e,t)=>{if(B.open){(t.escape||e===`s`)&&B.close();return}if(e===`o`||e===`O`){a(m(`devices`,{siteId:I}));return}if(e===`s`){B.toggle();return}let n=_(e);if(n){F(n);return}e===`q`&&(u(),i(0))}),T(()=>{let t=!1;return O===null&&j(!0),(async()=>{try{let n=await e.getDevices(I,P);t||(k(n),j(!1))}catch(e){t||(N(e.message),j(!1))}})(),()=>{t=!0}},[e,I,P]);let V=`devices · ${R} · ${P}`;if(A)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(s,{title:`Loading`,state:`busy`},w.createElement(y,null,w.createElement(b,{color:x.accent},w.createElement(D,{type:`dots`})),w.createElement(b,null,` Fetching breakdown…`))));if(M)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`error`,headline:`Failed to load`,hint:M}));let H=!O||O.devices.length===0&&O.browsers.length===0&&O.os.length===0;if(H)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`no-data`,headline:`No data in this window`,hint:`Press 1-4 to widen the range, [s] to switch site, or visit your site to send an event`}),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`q`,label:`quit`}],active:`s`}));let U=[{key:`name`,label:`name`,width:16},{key:`visitors`,label:`visitors`,align:`right`,width:8}],W=process.stdout.columns??80,G=[{key:`devices`,title:`Devices`,render:()=>O.devices.length===0?w.createElement(f,{reason:`no-data`,headline:`No devices yet`}):w.createElement(d,{columns:U,data:O.devices,zebra:!0})},{key:`browsers`,title:`Browsers`,render:()=>O.browsers.length===0?w.createElement(f,{reason:`no-data`,headline:`No browsers yet`}):w.createElement(d,{columns:U,data:O.browsers,zebra:!0})},{key:`os`,title:`OS`,render:()=>O.os.length===0?w.createElement(f,{reason:`no-data`,headline:`No OS data yet`}):w.createElement(d,{columns:U,data:O.os,zebra:!0})}];return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(y,{marginTop:1},w.createElement(p,{totalWidth:W,panels:G,minColWidth:26,maxCols:3,gap:2})),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}],active:`o`}))};export{O as devicesCommand};
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-hWp9s3Y8.js";import{readToken as n}from"./token-store-BQuGH0z2.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{parseSseStream as a}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import{detectInstallPaths as o,remediationHint as s,runHealthChecks as c}from"./health-D26VB-iZ.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(i(l))process.stdout.write(`${JSON.stringify({type:`doctor.agents`,agents:d})}\n`);else{process.stdout.write(`
1
+ import{readConfig as e}from"./config-JVhBplSX.js";import"./check-D9G0N7NB.js";import{ApiClient as t}from"./api-CdcB84ie.js";import{readToken as n}from"./token-store-BvSCse1t.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{parseSseStream as a}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import{detectInstallPaths as o,remediationHint as s,runHealthChecks as c}from"./health-Cg5Vtq-A.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(i(l))process.stdout.write(`${JSON.stringify({type:`doctor.agents`,agents:d})}\n`);else{process.stdout.write(`
2
2
  AI Agents:
3
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
4
  `)}let f=o(`zenovay`);if(f.paths.length>=2){let e=s(f,l.binaryPath);i(l)?process.stdout.write(`${JSON.stringify({type:`doctor.dual_binary`,info:f,hint:e})}\n`):(process.stdout.write(`
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-DqKh6FgZ.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-D4YlMlzk.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{resolveSiteId as c}from"./resolve-site-BLrtFOyW.js";import{fmtNumber as l,formatTable as u,shortId as d}from"./fmt-xxIPQJX-.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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{emitErrorEnvelope as n}from"./error-codes-ByhvHx2M.js";import{ApiV2Client as r}from"./api-v2-D0mvt__4.js";import{confirmDestructive as i}from"./confirm-DS5wux0g.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as a,wrapItem as o,wrapList as s}from"./emit-D4YlMlzk.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{resolveSiteId as c}from"./resolve-site-BTVBMF1C.js";import{fmtNumber as l,formatTable as u,shortId as d}from"./fmt-xxIPQJX-.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(`
@@ -0,0 +1 @@
1
+ import"./config-JVhBplSX.js";import"./api-CdcB84ie.js";import"./token-store-BvSCse1t.js";import{buildErrorEnvelope as e,emitErrorEnvelope as t,isJsonOutputMode as n,normalizeError as r}from"./error-codes-ByhvHx2M.js";export{t as emitErrorEnvelope};
@@ -1,2 +1,2 @@
1
- import{ApiError as e}from"./api-hWp9s3Y8.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-CdcB84ie.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};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{spark as s}from"./sparkline-CpoBjjlc.js";import"./chat-panel-PSN5hjlF.js";import{resolveSiteId as c}from"./resolve-site-BLrtFOyW.js";import{DataTable as l}from"./data-table-BhKjjiOS.js";import{EmptyState as u}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-BU2yCSg_.js";import"./ui-C5Te-OTJ.js";import{Box as p,Text as m}from"ink";import h from"react";function g(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}function _(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}const v=({filtered:e,window:t})=>{let{theme:n}=o(),r=new Map,i=Date.now(),a=60;for(let t of e){let e=new Date(t.ts).getTime(),n=Math.floor((i-e)/(60*1e3));if(n<0||n>=a)continue;let o=r.get(t.class)??Array(a).fill(0),s=a-1-n;o[s]+=1,r.set(t.class,o)}let c=[...r.entries()].sort((e,t)=>t[1].reduce((e,t)=>e+t,0)-e[1].reduce((e,t)=>e+t,0)).slice(0,6);return h.createElement(p,{flexDirection:`column`},h.createElement(m,null,h.createElement(m,{bold:!0},e.length),h.createElement(m,{color:n.muted},` errors in `,t)),c.length===0?null:h.createElement(p,{flexDirection:`column`,marginTop:1},c.map(([e,t])=>h.createElement(p,{key:e,flexDirection:`row`},h.createElement(p,{width:20,marginRight:1,flexShrink:0},h.createElement(m,{wrap:`truncate`},e)),h.createElement(m,{color:n.accent},s(t,30))))))},y=({filtered:e,search:t,columns:n})=>e.length===0?t?h.createElement(u,{reason:`no-data`,headline:`No matching errors`,hint:`Nothing matched "${t}" in this window — clear the filter or widen the range.`}):h.createElement(u,{reason:`no-data`,headline:`No errors in window`,hint:`No errors recorded for this site — widen the range with the time tabs above.`}):h.createElement(l,{data:e.slice(0,30),columns:n,headerStyle:`accent`});async function b(o){let s=await e(),l=await t({strict:!1}),u=new n({config:s,cliVersion:o.cliVersion,token:l}),p,m;try{({siteId:p,site:m}=await c(u,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let b=i(o),x=o.window??`24h`,S=o.limit??100,C=[{key:`ts`,label:`when`,width:6,format:e=>_(String(e))},{key:`class`,label:`class`,width:18,format:e=>String(e)},{key:`message`,label:`message`,width:42,format:e=>g(String(e??``),42)},{key:`page`,label:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:8,format:e=>String(e??`—`)}];return f({cliVersion:o.cliVersion,title:`errors · ${m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p}`,commandName:`errors`,ranges:!0,ai:{api:u,siteId:p,siteLabel:m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?3e4:0,fetcher:(e,t)=>u.getErrors(p,{window:t??x,limit:S},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`errors`,{siteId:p}))}}},headlessEmit:(e,t)=>{let n=o.search?e.errors.filter(e=>e.class.toLowerCase().includes(o.search.toLowerCase())||e.message.toLowerCase().includes(o.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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./progress-row-Afnt5Ng8.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import{spark as s}from"./sparkline-CpoBjjlc.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as c}from"./resolve-site-BTVBMF1C.js";import{DataTable as l}from"./data-table-BhKjjiOS.js";import{EmptyState as u}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-B4xo6sII.js";import"./ui-C5Te-OTJ.js";import{Box as p,Text as m}from"ink";import h from"react";function g(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}function _(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`}const v=({filtered:e,window:t})=>{let{theme:n}=o(),r=new Map,i=Date.now(),a=60;for(let t of e){let e=new Date(t.ts).getTime(),n=Math.floor((i-e)/(60*1e3));if(n<0||n>=a)continue;let o=r.get(t.class)??Array(a).fill(0),s=a-1-n;o[s]+=1,r.set(t.class,o)}let c=[...r.entries()].sort((e,t)=>t[1].reduce((e,t)=>e+t,0)-e[1].reduce((e,t)=>e+t,0)).slice(0,6);return h.createElement(p,{flexDirection:`column`},h.createElement(m,null,h.createElement(m,{bold:!0},e.length),h.createElement(m,{color:n.muted},` errors in `,t)),c.length===0?null:h.createElement(p,{flexDirection:`column`,marginTop:1},c.map(([e,t])=>h.createElement(p,{key:e,flexDirection:`row`},h.createElement(p,{width:20,marginRight:1,flexShrink:0},h.createElement(m,{wrap:`truncate`},e)),h.createElement(m,{color:n.accent},s(t,30))))))},y=({filtered:e,search:t,columns:n})=>e.length===0?t?h.createElement(u,{reason:`no-data`,headline:`No matching errors`,hint:`Nothing matched "${t}" in this window — clear the filter or widen the range.`}):h.createElement(u,{reason:`no-data`,headline:`No errors in window`,hint:`No errors recorded for this site — widen the range with the time tabs above.`}):h.createElement(l,{data:e.slice(0,30),columns:n,headerStyle:`accent`});async function b(o){let s=await e(),l=await t({strict:!1}),u=new n({config:s,cliVersion:o.cliVersion,token:l}),p,m;try{({siteId:p,site:m}=await c(u,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let b=i(o),x=o.window??`24h`,S=o.limit??100,C=[{key:`ts`,label:`when`,width:6,format:e=>_(String(e))},{key:`class`,label:`class`,width:18,format:e=>String(e)},{key:`message`,label:`message`,width:42,format:e=>g(String(e??``),42)},{key:`page`,label:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,label:`device`,width:8,format:e=>String(e??`—`)}];return f({cliVersion:o.cliVersion,title:`errors · ${m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p}`,commandName:`errors`,ranges:!0,ai:{api:u,siteId:p,siteLabel:m?.url?m.url.replace(/^https?:\/\//,``).replace(/\/$/,``):m?.name??p},authToken:l?.accessToken??null,refreshIntervalMs:o.watch?3e4:0,fetcher:(e,t)=>u.getErrors(p,{window:t??x,limit:S},e),format:b,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`errors`,{siteId:p}))}}},headlessEmit:(e,t)=>{let n=o.search?e.errors.filter(e=>e.class.toLowerCase().includes(o.search.toLowerCase())||e.message.toLowerCase().includes(o.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=o.search?e.errors.filter(e=>e.class.toLowerCase().includes(o.search.toLowerCase())||e.message.toLowerCase().includes(o.search.toLowerCase())):e.errors;return h.createElement(v,{filtered:t,window:x})}},{id:`table`,title:`Detail`,render:e=>{let t=o.search?e.errors.filter(e=>e.class.toLowerCase().includes(o.search.toLowerCase())||e.message.toLowerCase().includes(o.search.toLowerCase())):e.errors;return h.createElement(y,{filtered:t,search:o.search,columns:C})}}]})}export{b as errorsCommand};
@@ -1,4 +1,4 @@
1
- import{readConfig as e,updateConfig as t}from"./config--JRu_jFq.js";import{ApiClient as n}from"./api-hWp9s3Y8.js";import{readToken as r}from"./token-store-BQuGH0z2.js";import"./formatter-C4YSOKuq.js";import{isHeadless as i}from"./emit-D4YlMlzk.js";import{parseSseStream as a}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import{TextInput as l}from"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{stripUrlPrefix as d}from"./fmt-xxIPQJX-.js";import{DataTable as f}from"./data-table-BhKjjiOS.js";import{EmptyState as p}from"./empty-state-D-krMX62.js";import{useFullscreen as m}from"./use-fullscreen-ucSyZkjO.js";import h from"node:path";import{promises as g}from"node:fs";import _ from"node:os";import v from"node:crypto";import{Box as y,Text as b,render as x,useApp as S,useInput as ee}from"ink";import C,{useEffect as w,useRef as T,useState as E}from"react";const D=new Set([`type`,`page`,`country`,`device`,`user_id`,`sessionId`,`referrer`,`ts`,`url`,`method`,`status`]);function O(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 k(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function A(e,t,n){let r=e==null?``:String(e);switch(t){case`=`:return r===n;case`!=`:return r!==n;case`~`:{let e=new RegExp(k(n),`i`);return e.test(r)}case`!~`:{let e=new RegExp(k(n),`i`);return!e.test(r)}}}function j(e){return e.tokens[e.pos]}function M(e){let t=e.tokens[e.pos];return e.pos+=1,t}function N(e){let t=j(e);if(!t)throw Error(`filter: unexpected end of expression`);if(t.kind===`lparen`){M(e);let t=P(e),n=M(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}`);M(e);let n=t.value;if(!D.has(n))throw Error(`filter: unknown key "${n}". Allowed: ${[...D].join(`, `)}`);let r=M(e);if(!r||r.kind!==`op`)throw Error(`filter: expected operator after "${n}"`);let i=M(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=>A(e[n],a,o)}function P(e){let t=N(e);for(;;){let n=j(e);if(!n)break;if(n.kind===`and`){M(e);let n=N(e),r=t;t=e=>r(e)&&n(e);continue}if(n.kind===`or`){M(e);let n=N(e),r=t;t=e=>r(e)||n(e);continue}break}return t}function F(e){if(typeof e!=`string`||e.trim().length===0)throw Error(`filter: expression is empty`);let t=O(e);if(t.length===0)throw Error(`filter: expression is empty`);let n={tokens:t,pos:0},r=P(n);if(n.pos!==t.length){let e=n.tokens[n.pos];throw Error(`filter: unexpected trailing token "${I(e)}"`)}return r}function I(e){return e.kind===`ident`||e.kind===`string`||e.kind===`op`?e.value:e.kind}const L=10*1024*1024;var te=class{currentBytes=0;initialized=!1;writeQueue=Promise.resolve();constructor(e,t=L){this.filePath=e,this.maxBytes=t}async init(){if(!this.initialized){this.initialized=!0;try{await g.mkdir(h.dirname(this.filePath),{recursive:!0,mode:448})}catch{}try{let e=await g.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-JVhBplSX.js";import{ApiClient as n}from"./api-CdcB84ie.js";import{readToken as r}from"./token-store-BvSCse1t.js";import"./formatter-C4YSOKuq.js";import{isHeadless as i}from"./emit-D4YlMlzk.js";import{parseSseStream as a}from"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import{TextInput as l}from"./prompt-BXvg2B4R.js";import{Keybar as u}from"./keybar-DO5OoZy9.js";import{stripUrlPrefix as d}from"./fmt-xxIPQJX-.js";import{DataTable as f}from"./data-table-BhKjjiOS.js";import{EmptyState as p}from"./empty-state-D-krMX62.js";import{useFullscreen as m}from"./use-fullscreen-ucSyZkjO.js";import h from"node:path";import{promises as g}from"node:fs";import _ from"node:os";import v from"node:crypto";import{Box as y,Text as b,render as x,useApp as S,useInput as ee}from"ink";import C,{useEffect as w,useRef as T,useState as E}from"react";const D=new Set([`type`,`page`,`country`,`device`,`user_id`,`sessionId`,`referrer`,`ts`,`url`,`method`,`status`]);function O(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 k(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function A(e,t,n){let r=e==null?``:String(e);switch(t){case`=`:return r===n;case`!=`:return r!==n;case`~`:{let e=new RegExp(k(n),`i`);return e.test(r)}case`!~`:{let e=new RegExp(k(n),`i`);return!e.test(r)}}}function j(e){return e.tokens[e.pos]}function M(e){let t=e.tokens[e.pos];return e.pos+=1,t}function N(e){let t=j(e);if(!t)throw Error(`filter: unexpected end of expression`);if(t.kind===`lparen`){M(e);let t=P(e),n=M(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}`);M(e);let n=t.value;if(!D.has(n))throw Error(`filter: unknown key "${n}". Allowed: ${[...D].join(`, `)}`);let r=M(e);if(!r||r.kind!==`op`)throw Error(`filter: expected operator after "${n}"`);let i=M(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=>A(e[n],a,o)}function P(e){let t=N(e);for(;;){let n=j(e);if(!n)break;if(n.kind===`and`){M(e);let n=N(e),r=t;t=e=>r(e)&&n(e);continue}if(n.kind===`or`){M(e);let n=N(e),r=t;t=e=>r(e)||n(e);continue}break}return t}function F(e){if(typeof e!=`string`||e.trim().length===0)throw Error(`filter: expression is empty`);let t=O(e);if(t.length===0)throw Error(`filter: expression is empty`);let n={tokens:t,pos:0},r=P(n);if(n.pos!==t.length){let e=n.tokens[n.pos];throw Error(`filter: unexpected trailing token "${I(e)}"`)}return r}function I(e){return e.kind===`ident`||e.kind===`string`||e.kind===`op`?e.value:e.kind}const L=10*1024*1024;var te=class{currentBytes=0;initialized=!1;writeQueue=Promise.resolve();constructor(e,t=L){this.filePath=e,this.maxBytes=t}async init(){if(!this.initialized){this.initialized=!0;try{await g.mkdir(h.dirname(this.filePath),{recursive:!0,mode:448})}catch{}try{let e=await g.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 g.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=h.parse(this.filePath);return h.join(t.dir,`${t.name}.${e}${t.ext}`)};try{await g.unlink(e(3))}catch{}for(let t=2;t>=0;--t)try{await g.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 R=5e3,z=1e3,B=`─── replay end, live below ───`;async function V(a){if(a.setForwardSecret)return await t({forwardSecret:a.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:a.cliVersion,token:s}),l=null;if(a.filter)try{l=F(a.filter)}catch(e){return process.stderr.write(`Invalid --filter expression: ${e.message}\n`),2}if(i(a))return W(c,a,l,o.forwardSecret);let u=a.siteId;try{let e=(await c.getSites()).find(e=>e.id===a.siteId);e&&(u=e.url?e.url.replace(/^https?:\/\//,``).replace(/\/$/,``):e.name)}catch{}let d=a.scrollbackPath??h.join(_.homedir(),`.zenovay`,`events-scrollback.log`);return new Promise(e=>{let{unmount:t}=x(C.createElement(K,{api:c,opts:a,siteLabel:u,predicate:l,forwardSecret:o.forwardSecret,scrollbackPath:d,onExit:n=>{t(),e(n)}}))})}function H(e){return{raw:JSON.stringify(e),parsed:e}}async function U(e,t,n){let r=JSON.stringify(n),i=v.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 W(e,t,n,r){let i=new AbortController;process.on(`SIGINT`,()=>i.abort());let o=()=>new Date().toISOString();try{let s=await e.openEventsStream(t.siteId,i.signal);for await(let e of a(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 U(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}}function ne(e){let t=e?.ts??e?.timestamp??e?.created_at,n=typeof t==`string`||typeof t==`number`?new Date(t):new Date;return Number.isNaN(n.getTime())?new Date().toLocaleTimeString():n.toLocaleTimeString()}function G(e,t){if(!e)return``;for(let n of t){let t=e[n];if(t!=null&&t!==``)return String(t)}return``}const K=({api:e,opts:t,siteLabel:n,predicate:r,forwardSecret:i,scrollbackPath:h,onExit:_})=>{m();let{theme:v}=c(),{exit:x}=S(),D=T([]),O=T(null),[k,A]=E([]),[j,M]=E(0),[N,P]=E(null),[F,I]=E(!1),[L,R]=E(null),B=F||N!==null;O.current||=new te(h),ee(n=>{if(!F){if(N){P(null);return}if(n===`q`){x(),_(0);return}if(n===`f`){let e=D.current[D.current.length-1];e&&P(e);return}if(n===`w`){I(!0);return}if(n===`r`){J(e,t.siteId,D,R);return}}});let V=process.stdout.rows??40,W=Math.max(5,Math.min(24,V-12));w(()=>{if(B)return;let e=()=>{A(D.current.slice(-W)),M(D.current.length)};e();let t=setInterval(e,z);return()=>clearInterval(t)},[B,W]),w(()=>{let n=new AbortController,o=!1;return(async()=>{t.replay24h&&await J(e,t.siteId,D,R);try{let s=await e.openEventsStream(t.siteId,n.signal);for await(let e of a(s)){if(o)break;if(e.type===`error`){let t={raw:`[ERR ${e.code}] ${e.message}`};q(D,t),O.current?.append(t.raw);continue}if(e.type===`done`)break;let n=e;if(r&&!r(n))continue;let a=H(e);q(D,a),O.current?.append(a.raw),t.forwardTo&&i&&U(t.forwardTo,i,{event:e,ts:new Date().toISOString(),site_id:t.siteId})}}catch(e){let t={raw:`[DISCONNECT] ${e.message}`};q(D,t)}})(),()=>{o=!0,n.abort(),O.current?.close()}},[e,t.siteId,t.replay24h,t.forwardTo,r,i]);let K=async e=>{let t=e.trim()||`events.ndjson`;try{let e=D.current.map(e=>e.raw).join(`
4
4
  `)+`
@@ -1,4 +1,4 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{emitErrorEnvelope as n}from"./error-codes-D4XO4okw.js";import{ApiV2Client as r}from"./api-v2-DqKh6FgZ.js";import{requireTier as i}from"./tier-BneaO4vD.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as a,wrapItem as o}from"./emit-D4YlMlzk.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{resolveSiteId as s}from"./resolve-site-BLrtFOyW.js";import{toCsv as c}from"./csv-emit-C-9o-imN.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??`csv`;if(v!==`csv`&&v!==`json`){let e=`Unknown export format '${v}'. Use one of: csv, json.`;return c.json?n(Error(e),{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`Error: ${e}\n`),2)}let y=v,b=d(c.range),x=!!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 S;try{({siteId:S}=await s(_,{explicit:c.siteId,headless:x,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} ${b}...`,x);let{rows:e,columns:t}=await m(_,c.type,S,b),n=h(e,t,y),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:y,range:b,type:c.type},`export.completed`,{siteId:S,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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{emitErrorEnvelope as n}from"./error-codes-ByhvHx2M.js";import{ApiV2Client as r}from"./api-v2-D0mvt__4.js";import{requireTier as i}from"./tier-DDIroQbc.js";import"./formatter-C4YSOKuq.js";import{emitEnvelope as a,wrapItem as o}from"./emit-D4YlMlzk.js";import"./theme-Brz9wK0w.js";import"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{toCsv as c}from"./csv-emit-C-9o-imN.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??`csv`;if(v!==`csv`&&v!==`json`){let e=`Unknown export format '${v}'. Use one of: csv, json.`;return c.json?n(Error(e),{command:`export ${c.type}`,cliVersion:c.cliVersion}):(process.stderr.write(`Error: ${e}\n`),2)}let y=v,b=d(c.range),x=!!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 S;try{({siteId:S}=await s(_,{explicit:c.siteId,headless:x,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} ${b}...`,x);let{rows:e,columns:t}=await m(_,c.type,S,b),n=h(e,t,y),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:y,range:b,type:c.type},`export.completed`,{siteId:S,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:y,range:b,type:c.type},`export.completed`,{siteId:S,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--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import"./error-codes-D4XO4okw.js";import"./telemetry-DRh10SvO.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-PSN5hjlF.js";import{resolveSiteId as s}from"./resolve-site-BLrtFOyW.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{Bar as u}from"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-BU2yCSg_.js";import{Box as p,Text as m}from"ink";import h from"react";async function g(o){let l=await e(),u=await t({strict:!1}),p=new n({config:l,cliVersion:o.cliVersion,token:u}),m,g;try{({siteId:m,site:g}=await s(p,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=g?.url?g.url.replace(/^https?:\/\//,``).replace(/\/$/,``):g?.name??m,S=i(o);if(!o.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 f({cliVersion:o.cliVersion,title:`funnels · ${x}`,commandName:`funnels`,ai:{api:p,siteId:m,siteLabel:x},authToken:u?.accessToken??null,refreshIntervalMs:0,fetcher:e=>p.listFunnels(m,e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`funnel`,{siteId:m}))}}},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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import"./error-codes-ByhvHx2M.js";import"./telemetry-BV-xvfdt.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import{formatTabular as r,selectFormat as i}from"./formatter-C4YSOKuq.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./client-ntsEXSVC.js";import"./theme-Brz9wK0w.js";import{useTheme as o}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import"./keybar-DO5OoZy9.js";import"./chat-panel-D9IjovCR.js";import{resolveSiteId as s}from"./resolve-site-BTVBMF1C.js";import{DataTable as c}from"./data-table-BhKjjiOS.js";import{EmptyState as l}from"./empty-state-D-krMX62.js";import"./grid-CMwhs-Ms.js";import{Bar as u}from"./bar-NfgovYHe.js";import{deepLinkFor as d}from"./keybar-deep-link-B4VJn2ko.js";import"./use-fullscreen-ucSyZkjO.js";import"./range-tabs-BbJdVWNV.js";import{runAnalyticalScreen as f}from"./analytical-screen-B4xo6sII.js";import{Box as p,Text as m}from"ink";import h from"react";async function g(o){let l=await e(),u=await t({strict:!1}),p=new n({config:l,cliVersion:o.cliVersion,token:u}),m,g;try{({siteId:m,site:g}=await s(p,{explicit:o.siteId,headless:!!(o.json||o.csv||o.tsv||o.ndjson),cliVersion:o.cliVersion}))}catch(e){return process.stderr.write(`${e.message}\n`),2}let x=g?.url?g.url.replace(/^https?:\/\//,``).replace(/\/$/,``):g?.name??m,S=i(o);if(!o.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 f({cliVersion:o.cliVersion,title:`funnels · ${x}`,commandName:`funnels`,ai:{api:p,siteId:m,siteLabel:x},authToken:u?.accessToken??null,refreshIntervalMs:0,fetcher:e=>p.listFunnels(m,e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`funnel`,{siteId:m}))}}},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?h.createElement(_,null):h.createElement(c,{data:t.funnels,columns:e,headerStyle:`accent`})},{id:`hint`,title:`Next`,render:()=>h.createElement(v,null)}]})}let C=o.window??`30d`;return f({cliVersion:o.cliVersion,title:`funnel · ${o.funnelId} · ${x}`,commandName:`funnel`,ai:{api:p,siteId:m,siteLabel:x},authToken:u?.accessToken??null,refreshIntervalMs:0,ranges:{windows:[`7d`,`30d`]},fetcher:(e,t)=>p.getFunnel(m,o.funnelId,t===`7d`?`7d`:t?`30d`:C,e),format:S,keybindings:{o:{label:`open in browser`,handler:()=>{a(d(`funnel`,{siteId:m}))}}},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:`Overview`,render:e=>h.createElement(y,{data:e})},{id:`flow`,title:`Flow`,render:e=>h.createElement(b,{data:e})}]})}function _(){return h.createElement(l,{reason:`no-data`,headline:`No funnels defined yet`,hint:"Create a funnel in the dashboard, then run `zenovay funnel <id>` for drop-off detail."})}function v(){let{theme:e}=o();return h.createElement(m,{color:e.dim},"Run `zenovay funnel <id>` for drop-off detail.")}function y({data:e}){let{theme:t}=o();return h.createElement(p,{flexDirection:`column`},h.createElement(m,{bold:!0},e.name),h.createElement(m,{color:t.muted},e.totalEntries.toLocaleString(),` entries · `,e.totalCompletions.toLocaleString(),` completed (`,(e.conversionRate*100).toFixed(1),`%)`))}function b({data:e}){let{theme:t}=o(),n=e.totalEntries||1;if(e.steps.length===0)return h.createElement(l,{reason:`no-data`,headline:`No steps in this window`,hint:`Widen the time window (number keys) or check that the funnel has recorded traffic.`});let r=69;return h.createElement(p,{flexDirection:`column`},e.steps.map((i,a)=>{let o=i.visitors/n,s=e.steps[a-1],c=s?s.visitors-i.visitors:0,l=s?c/Math.max(1,s.visitors)*100:0;return h.createElement(p,{key:i.id,flexDirection:`column`},s?h.createElement(m,{color:t.error},` `,`↓ drop `,c.toLocaleString(),` (`,l.toFixed(1),`%)`):null,h.createElement(p,{flexDirection:`row`,width:r},h.createElement(p,{width:22,marginRight:1,flexShrink:0},h.createElement(m,{bold:!0,wrap:`truncate`},`${a+1}. ${i.name}`)),h.createElement(p,{flexShrink:0},h.createElement(u,{value:i.visitors,max:n,width:30,showPercent:!1,track:!0})),h.createElement(p,{width:6,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.fg},(o*100).toFixed(1),`%`)),h.createElement(p,{width:8,marginLeft:1,flexShrink:0,justifyContent:`flex-end`},h.createElement(m,{color:t.muted},i.visitors.toLocaleString()))))}))}export{g as funnelCommand};
@@ -1,2 +1,2 @@
1
- import{readConfig as e}from"./config--JRu_jFq.js";import"./api-hWp9s3Y8.js";import{readToken as t}from"./token-store-BQuGH0z2.js";import{ApiV2Client as n}from"./api-v2-DqKh6FgZ.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as l}from"./keybar-DO5OoZy9.js";import{resolveSiteId as u}from"./resolve-site-BLrtFOyW.js";import{DataTable as d}from"./data-table-BhKjjiOS.js";import{EmptyState as f}from"./empty-state-D-krMX62.js";import{ResponsiveGrid as p}from"./grid-CMwhs-Ms.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{RangeTabs as g,rangeForKey as _}from"./range-tabs-BbJdVWNV.js";import{useSiteSwitcher as v}from"./site-switcher-D_JBKFaR.js";import{Box as y,Text as b,render as x,useApp as S,useInput as C}from"ink";import w,{useEffect as T,useState as E}from"react";import D from"ink-spinner";async function O(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(i(a)){let e=await c.getGeo(l);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-CmlDBfbA.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-JVhBplSX.js";import"./api-CdcB84ie.js";import{readToken as t}from"./token-store-BvSCse1t.js";import{ApiV2Client as n}from"./api-v2-D0mvt__4.js";import"./formatter-C4YSOKuq.js";import{emit$1 as r,isHeadless as i}from"./emit-D4YlMlzk.js";import{openInBrowser as a}from"./open-url-BtI5aLgL.js";import"./theme-Brz9wK0w.js";import{Banner as o,Panel as s,useTheme as c}from"./panel-CTtQ2ue6.js";import"./prompt-BXvg2B4R.js";import{Keybar as l}from"./keybar-DO5OoZy9.js";import{resolveSiteId as u}from"./resolve-site-BTVBMF1C.js";import{DataTable as d}from"./data-table-BhKjjiOS.js";import{EmptyState as f}from"./empty-state-D-krMX62.js";import{ResponsiveGrid as p}from"./grid-CMwhs-Ms.js";import{deepLinkFor as m}from"./keybar-deep-link-B4VJn2ko.js";import{useFullscreen as h}from"./use-fullscreen-ucSyZkjO.js";import{RangeTabs as g,rangeForKey as _}from"./range-tabs-BbJdVWNV.js";import{useSiteSwitcher as v}from"./site-switcher-B2L1-Pjd.js";import{Box as y,Text as b,render as x,useApp as S,useInput as C}from"ink";import w,{useEffect as T,useState as E}from"react";import D from"ink-spinner";async function O(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(i(a)){let e=await c.getGeo(l);if(a.csv||a.tsv){let{writeCsv:t}=await import(`./csv-emit-CmlDBfbA.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}=x(w.createElement(k,{api:c,siteId:l,siteLabel:f,cliVersion:a.cliVersion,onExit:n=>{t(),e(n)}}))})}const k=({api:e,siteId:t,siteLabel:n,cliVersion:r,onExit:i})=>{h();let{exit:u}=S(),{theme:x}=c(),[O,k]=E(null),[A,j]=E(!0),[M,N]=E(null),[P,F]=E(`24h`),[I,L]=E(t),[R,z]=E(n),B=v(e,I,e=>{L(e.id),z(e.url.replace(/^https?:\/\//,``).replace(/\/$/,``)),k(null)});C((e,t)=>{if(B.open){(t.escape||e===`s`)&&B.close();return}if(e===`o`||e===`O`){a(m(`geo`,{siteId:I}));return}if(e===`s`){B.toggle();return}let n=_(e);if(n){F(n);return}e===`q`&&(u(),i(0))}),T(()=>{let t=!1;return O===null&&j(!0),(async()=>{try{let n=await e.getGeo(I,P);t||(k(n),j(!1))}catch(e){t||(N(e.message),j(!1))}})(),()=>{t=!0}},[e,I,P]);let V=`geo · ${R} · ${P}`;if(A)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(s,{title:`Loading`,state:`busy`},w.createElement(y,null,w.createElement(b,{color:x.accent},w.createElement(D,{type:`dots`})),w.createElement(b,null,` Fetching geo…`))));if(M)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`error`,headline:`Failed to load`,hint:M}));let H=!O||O.countries.length===0&&O.cities.length===0;if(H)return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(f,{reason:`no-data`,headline:`No data in this window`,hint:`Press 1-4 to widen the range, [s] to switch site, or visit your site to send an event`}),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`q`,label:`quit`}],active:`s`}));let U=[{key:`country`,label:`country`,width:18},{key:`visitors`,label:`visitors`,align:`right`,width:8}],W=[{key:`city`,label:`city`,width:18},{key:`country`,label:`country`,width:10},{key:`visitors`,label:`visitors`,align:`right`,width:8}],G=process.stdout.columns??80,K=process.stdout.rows??40,q=Math.max(5,K-15),J=O.countries,Y=O.cities,X=J.length-Math.min(J.length,q),Z=Y.length-Math.min(Y.length,q),Q=[{key:`countries`,title:`Countries (${J.length})`,render:()=>J.length===0?w.createElement(f,{reason:`no-data`,headline:`No countries yet`,hint:`Visit your site to send the first event`}):w.createElement(w.Fragment,null,w.createElement(d,{columns:U,data:J.slice(0,q),zebra:!0}),X>0?w.createElement(b,{color:x.dim},` +${X} more · --json`):null)},{key:`cities`,title:`Cities (${Y.length})`,render:()=>Y.length===0?w.createElement(f,{reason:`no-data`,headline:`No cities yet`,hint:`City data needs a few more visits`}):w.createElement(w.Fragment,null,w.createElement(d,{columns:W,data:Y.slice(0,q),zebra:!0}),Z>0?w.createElement(b,{color:x.dim},` +${Z} more · --json`):null)}];return w.createElement(y,{flexDirection:`column`},w.createElement(o,{version:r,subtitle:V}),w.createElement(g,{range:P}),w.createElement(y,{marginTop:1},w.createElement(p,{totalWidth:G,panels:Q,minColWidth:40,maxCols:2,gap:2})),B.overlay,w.createElement(l,{items:[{key:`1-4`,label:`range`},{key:`s`,label:`site`},{key:`o`,label:`browser`},{key:`q`,label:`quit`}],active:`o`}))};export{O as geoCommand};