@zenovay/cli 0.1.3 → 0.1.5

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 (60) hide show
  1. package/dist/ai-B9oPZs7h.js +11 -0
  2. package/dist/{analytical-screen-3XlrpJ98.js → analytical-screen-CS1ZL5Mo.js} +1 -1
  3. package/dist/api-D5XQeEDF.js +1 -0
  4. package/dist/api-v2-DP5YEHL_.js +1 -0
  5. package/dist/bin.js +1 -1
  6. package/dist/{companies-CErU-nIf.js → companies-DjAmRDgx.js} +3 -3
  7. package/dist/config-ZTGpKEWg.js +1 -0
  8. package/dist/deploys-CJVuTUqN.js +3 -0
  9. package/dist/{doctor-CB64Fu3x.js → doctor-DmQlQsg9.js} +1 -1
  10. package/dist/{emit-CbAMzl5f.js → emit-DIRc7UzM.js} +1 -1
  11. package/dist/errors-DYLYIh2G.js +3 -0
  12. package/dist/{events-tail-C-QUggqf.js → events-tail-DPyjak4s.js} +1 -1
  13. package/dist/formatter-DQ6l4sWM.js +10 -0
  14. package/dist/{funnel-CGk44IzM.js → funnel-KSMIsBXC.js} +4 -4
  15. package/dist/health-C6G6Mg6b.js +1 -0
  16. package/dist/health-CN35NYhE.js +1 -0
  17. package/dist/init-DPHxWL9F.js +1 -0
  18. package/dist/init-Y9vOEKM9.js +61 -0
  19. package/dist/{keybar-D2LIBUlF.js → keybar-D2OI-8rx.js} +1 -1
  20. package/dist/login-CgIfUP2O.js +1 -0
  21. package/dist/login-CxXnVN9s.js +1 -0
  22. package/dist/logout-2-GHLeZO.js +2 -0
  23. package/dist/{projects-Bdd36ZCo.js → projects-907FoPAg.js} +3 -3
  24. package/dist/{prompt-C1qNVY6f.js → prompt-hjzdzlyj.js} +1 -1
  25. package/dist/query-Bj9z5qK1.js +9 -0
  26. package/dist/revenue-BdxoWU-f.js +3 -0
  27. package/dist/{sources-B3DvpVMh.js → sources-vI6GlYbS.js} +3 -3
  28. package/dist/stats-BC2f1pG_.js +3 -0
  29. package/dist/{themes-C0wGEs1v.js → themes-F-HUBXpr.js} +1 -1
  30. package/dist/{ui-CvxpWJH-.js → ui-Bk5nl2yb.js} +1 -1
  31. package/dist/update-BPa-ewQo.js +1 -0
  32. package/dist/vitals-C1c_KHq2.js +3 -0
  33. package/dist/watch-BPCLHvIW.js +2 -0
  34. package/dist/webhooks-forward-But5AUF-.js +3 -0
  35. package/dist/wizard-bin.js +1 -1
  36. package/dist/wrapper-U9nLhCpo.js +6 -0
  37. package/dist/ws-client-DsIRZ_TX.js +1 -0
  38. package/package.json +1 -1
  39. package/dist/ai-ClBun79v.js +0 -11
  40. package/dist/api-B7QWXBbG.js +0 -1
  41. package/dist/api-v2-Ge4WrV8S.js +0 -1
  42. package/dist/errors-BQfQ3nQq.js +0 -3
  43. package/dist/formatter-CEeFGNXS.js +0 -10
  44. package/dist/health-QG3p1I4h.js +0 -1
  45. package/dist/health-mIabvurG.js +0 -1
  46. package/dist/init-PAKqEfEt.js +0 -61
  47. package/dist/init-fB_aCIAr.js +0 -1
  48. package/dist/login-BxbjwJpp.js +0 -1
  49. package/dist/login-CCbw5DxV.js +0 -1
  50. package/dist/logout-BXZDYs5A.js +0 -2
  51. package/dist/query-DviHIp7A.js +0 -9
  52. package/dist/revenue-Hy3Ds8Gr.js +0 -3
  53. package/dist/stats-BbWdAIxR.js +0 -3
  54. package/dist/update-CJ6RRor7.js +0 -1
  55. package/dist/vitals-jgl8TO5_.js +0 -3
  56. package/dist/watch-DT908IAi.js +0 -2
  57. /package/dist/{check-B7o0vbqr.js → check-S0ACFIfq.js} +0 -0
  58. /package/dist/{client-ClN0aAAQ.js → client-GAPcEws9.js} +0 -0
  59. /package/dist/{completions-DhdJEg8Q.js → completions-GDtTbG3B.js} +0 -0
  60. /package/dist/{panel-s0DHmKcg.js → panel-DglZ755S.js} +0 -0
@@ -1,3 +1,3 @@
1
- import{formatTabular as e,readConfig as t,selectFormat as n}from"./formatter-CEeFGNXS.js";import{readToken as r}from"./api-B7QWXBbG.js";import"./panel-s0DHmKcg.js";import"./keybar-D2LIBUlF.js";import"./prompt-C1qNVY6f.js";import{runAnalyticalScreen as i}from"./analytical-screen-3XlrpJ98.js";import"./sparkline-CR_bzxwB.js";import{Table as a}from"./ui-CvxpWJH-.js";import{ApiV2Client as o}from"./api-v2-Ge4WrV8S.js";import{Box as s,Text as c}from"ink";import l from"react";function u(e,t){let n=Math.round(e/100*t);return`█`.repeat(n)+`░`.repeat(Math.max(0,t-n))}function d(e){return e==null?{glyph:`·`,color:`gray`}:e>.5?{glyph:`▲`,color:`green`}:e<-.5?{glyph:`▼`,color:`red`}:{glyph:`→`,color:`gray`}}async function f(f){let p=await t(),m=await r({strict:!1}),h=f.siteId??m?.teamId??``;if(!h)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
- `),2;let g=new o({config:p,cliVersion:f.cliVersion,token:m}),_=n(f),v=f.period??`30d`,y=[{key:`source`,header:`source`,width:22},{key:`channel`,header:`channel`,width:10,format:e=>String(e??`—`)},{key:`visitors`,header:`visitors`,width:8,align:`right`},{key:`delta`,header:`Δ`,width:6,align:`right`,format:e=>typeof e==`number`?`${e>0?`+`:``}${(e*100).toFixed(1)}%`:`—`}];return i({cliVersion:f.cliVersion,title:`sources · ${h} · ${v}`,commandName:`sources`,authToken:m?.accessToken??null,refreshIntervalMs:6e4,fetcher:e=>g.getSources(h,v,f.compare,e),format:_,headlessEmit:(t,n)=>{if(n===`json`||n===`ndjson`){process.stdout.write(JSON.stringify(t,null,n===`json`?2:0)),n===`ndjson`&&process.stdout.write(`
3
- `);return}process.stdout.write(e(t.sources,[`source`,`channel`,`visitors`,`conversions`,`revenue`,`delta`],n))},panels:[{id:`summary`,title:`Total`,render:e=>l.createElement(c,null,l.createElement(c,{bold:!0},e.totalVisitors.toLocaleString()),` `,l.createElement(c,{color:`gray`},`visitors · `,e.sources.length,` sources`))},{id:`channels`,title:`By channel`,render:e=>{if(e.sources.length===0)return l.createElement(c,{color:`gray`},`— no source data —`);let t=e.totalVisitors||1,n=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return l.createElement(s,{flexDirection:`column`},n.map((e,n)=>{let r=e.visitors/t*100,i=d(e.delta);return l.createElement(s,{key:`${e.source}-${n}`},l.createElement(c,null,l.createElement(c,{color:`cyan`},e.source.padEnd(20).slice(0,20)),` `,l.createElement(c,{color:`magenta`},u(r,30)),` `,l.createElement(c,null,e.visitors.toString().padStart(6),` `),l.createElement(c,{color:`gray`},`(`,r.toFixed(1),`%)`),` `,l.createElement(c,{color:i.color},i.glyph)))}))}},{id:`table`,title:`Detail`,render:e=>e.sources.length===0?l.createElement(c,{color:`gray`},`— —`):l.createElement(a,{data:e.sources.slice(0,20),columns:y})}]})}export{f as sourcesCommand};
1
+ import{readConfig as e}from"./config-ZTGpKEWg.js";import{readToken as t}from"./api-D5XQeEDF.js";import{formatTabular as n,selectFormat as r}from"./formatter-DQ6l4sWM.js";import"./panel-DglZ755S.js";import"./keybar-D2OI-8rx.js";import"./prompt-hjzdzlyj.js";import"./sparkline-CR_bzxwB.js";import{runAnalyticalScreen as i}from"./analytical-screen-CS1ZL5Mo.js";import{Table as a}from"./ui-Bk5nl2yb.js";import{ApiV2Client as o}from"./api-v2-DP5YEHL_.js";import{Box as s,Text as c}from"ink";import l from"react";function u(e,t){let n=Math.round(e/100*t);return`█`.repeat(n)+`░`.repeat(Math.max(0,t-n))}function d(e){return e==null?{glyph:`·`,color:`gray`}:e>.5?{glyph:`▲`,color:`green`}:e<-.5?{glyph:`▼`,color:`red`}:{glyph:`→`,color:`gray`}}async function f(f){let p=await e(),m=await t({strict:!1}),h=f.siteId??m?.teamId??``;if(!h)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
+ `),2;let g=new o({config:p,cliVersion:f.cliVersion,token:m}),_=r(f),v=f.period??`30d`,y=[{key:`source`,header:`source`,width:22},{key:`channel`,header:`channel`,width:10,format:e=>String(e??`—`)},{key:`visitors`,header:`visitors`,width:8,align:`right`},{key:`delta`,header:`Δ`,width:6,align:`right`,format:e=>typeof e==`number`?`${e>0?`+`:``}${(e*100).toFixed(1)}%`:`—`}];return i({cliVersion:f.cliVersion,title:`sources · ${h} · ${v}`,commandName:`sources`,authToken:m?.accessToken??null,refreshIntervalMs:6e4,fetcher:e=>g.getSources(h,v,f.compare,e),format:_,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
+ `);return}process.stdout.write(n(e.sources,[`source`,`channel`,`visitors`,`conversions`,`revenue`,`delta`],t))},panels:[{id:`summary`,title:`Total`,render:e=>l.createElement(c,null,l.createElement(c,{bold:!0},e.totalVisitors.toLocaleString()),` `,l.createElement(c,{color:`gray`},`visitors · `,e.sources.length,` sources`))},{id:`channels`,title:`By channel`,render:e=>{if(e.sources.length===0)return l.createElement(c,{color:`gray`},`— no source data —`);let t=e.totalVisitors||1,n=[...e.sources].sort((e,t)=>t.visitors-e.visitors).slice(0,12);return l.createElement(s,{flexDirection:`column`},n.map((e,n)=>{let r=e.visitors/t*100,i=d(e.delta);return l.createElement(s,{key:`${e.source}-${n}`},l.createElement(c,null,l.createElement(c,{color:`cyan`},e.source.padEnd(20).slice(0,20)),` `,l.createElement(c,{color:`magenta`},u(r,30)),` `,l.createElement(c,null,e.visitors.toString().padStart(6),` `),l.createElement(c,{color:`gray`},`(`,r.toFixed(1),`%)`),` `,l.createElement(c,{color:i.color},i.glyph)))}))}},{id:`table`,title:`Detail`,render:e=>e.sources.length===0?l.createElement(c,{color:`gray`},`— —`):l.createElement(a,{data:e.sources.slice(0,20),columns:y})}]})}export{f as sourcesCommand};
@@ -0,0 +1,3 @@
1
+ import{readConfig as e}from"./config-ZTGpKEWg.js";import{readToken as t}from"./api-D5XQeEDF.js";import{formatTabular as n,selectFormat as r}from"./formatter-DQ6l4sWM.js";import"./panel-DglZ755S.js";import"./keybar-D2OI-8rx.js";import"./prompt-hjzdzlyj.js";import"./sparkline-CR_bzxwB.js";import{runAnalyticalScreen as i}from"./analytical-screen-CS1ZL5Mo.js";import{Table as a}from"./ui-Bk5nl2yb.js";import{ApiV2Client as o}from"./api-v2-DP5YEHL_.js";import{Box as s,Text as c}from"ink";import l from"react";function u(e){return`${(e*100).toFixed(1)}%`}function d(e){return e<60?`${Math.round(e)}s`:e<3600?`${Math.floor(e/60)}m ${Math.round(e%60)}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}async function f(f){let p=await e(),m=await t({strict:!1}),h=f.siteId??m?.teamId??``;if(!h)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
+ `),2;let g=new o({config:p,cliVersion:f.cliVersion,token:m}),_=r(f),v=f.range??`24h`,y=[{key:`url`,header:`page`,width:40,format:e=>String(e??`—`)},{key:`views`,header:`views`,width:8,align:`right`}],b=[{key:`country`,header:`country`,width:8},{key:`visitors`,header:`visitors`,width:8,align:`right`}];return i({cliVersion:f.cliVersion,title:`stats · ${h} · ${v}`,commandName:`stats`,authToken:m?.accessToken??null,refreshIntervalMs:f.watch?6e4:0,fetcher:e=>g.getStats(h,v,e),format:_,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
+ `);return}process.stdout.write(n([{range:v,visitors:e.visitors,pageviews:e.pageviews,sessions:e.sessions,bounceRate:u(e.bounceRate),avgSession:d(e.avgSessionSec)}],[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSession`],t))},panels:[{id:`summary`,title:`Summary`,render:e=>l.createElement(s,{flexDirection:`column`},l.createElement(c,null,l.createElement(c,{bold:!0},e.visitors.toLocaleString()),l.createElement(c,{color:`gray`},` visitors `),l.createElement(c,{bold:!0},e.pageviews.toLocaleString()),l.createElement(c,{color:`gray`},` pageviews `),l.createElement(c,{bold:!0},e.sessions.toLocaleString()),l.createElement(c,{color:`gray`},` sessions`)),l.createElement(c,{color:`gray`},`bounce `,u(e.bounceRate),` · avg session `,d(e.avgSessionSec)))},{id:`pages`,title:`Top pages`,render:e=>e.topPages.length===0?l.createElement(c,{color:`gray`},`— no pages —`):l.createElement(a,{data:e.topPages.slice(0,10),columns:y})},{id:`countries`,title:`Top countries`,render:e=>e.topCountries.length===0?l.createElement(c,{color:`gray`},`— no country data —`):l.createElement(a,{data:e.topCountries.slice(0,10),columns:b})}]})}export{f as statsCommand};
@@ -1,4 +1,4 @@
1
- import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-s0DHmKcg.js";import{Banner as a}from"./keybar-D2LIBUlF.js";import"./prompt-C1qNVY6f.js";import"./sparkline-CR_bzxwB.js";import"./ui-CvxpWJH-.js";import{promises as o}from"node:fs";import{Box as s,Text as c,render as l}from"ink";import u from"react";const d=[{name:`mocha`,theme:n,mode:`dark`},{name:`latte`,theme:t,mode:`light`},{name:`dracula`,theme:e,mode:`dark`},{name:`tokyoNight`,theme:i,mode:`dark`},{name:`nord`,theme:r,mode:`dark`}],f=[`name`,`bg`,`fg`,`muted`,`accent`,`accent2`,`success`,`warn`,`error`,`border`,`dim`];function p({name:e,theme:t,mode:n}){let r=[t.accent,t.accent2,t.success,t.warn,t.error];return u.createElement(s,{flexDirection:`row`},u.createElement(c,{bold:!0},e.padEnd(14)),u.createElement(c,{color:`gray`},n.padEnd(7)),r.map((e,t)=>u.createElement(c,{key:t,color:e},`████`,` `)),u.createElement(c,{color:`gray`},t.bg))}function m({themes:e}){return u.createElement(s,{flexDirection:`column`},u.createElement(a,{version:`themes`}),u.createElement(s,{marginTop:1,marginBottom:1},u.createElement(c,{color:`gray`},e.length,` themes — pass --theme <name> to any command, or set in your config.`)),u.createElement(s,{flexDirection:`column`},u.createElement(s,null,u.createElement(c,{bold:!0},`name`.padEnd(14)),u.createElement(c,{bold:!0},`mode`.padEnd(7)),u.createElement(c,{bold:!0},`swatch`.padEnd(28)),u.createElement(c,{bold:!0},`bg`)),e.map(({name:e,theme:t,mode:n})=>u.createElement(p,{key:e,name:e,theme:t,mode:n}))))}async function h(e){if(e.validate){let t;try{let n=await o.readFile(e.validate,`utf8`);t=JSON.parse(n)}catch(t){return process.stderr.write(`✗ Failed to read ${e.validate}: ${t.message}\n`),1}let n=f.filter(e=>t[e]==null);return n.length>0?(process.stderr.write(`✗ Missing required tokens: ${n.join(`, `)}\n`),e.json&&process.stdout.write(JSON.stringify({ok:!1,missing:n},null,2)+`
1
+ import{dracula as e,latte as t,mocha as n,nord as r,tokyoNight as i}from"./panel-DglZ755S.js";import{Banner as a}from"./keybar-D2OI-8rx.js";import"./prompt-hjzdzlyj.js";import"./sparkline-CR_bzxwB.js";import"./ui-Bk5nl2yb.js";import{promises as o}from"node:fs";import{Box as s,Text as c,render as l}from"ink";import u from"react";const d=[{name:`mocha`,theme:n,mode:`dark`},{name:`latte`,theme:t,mode:`light`},{name:`dracula`,theme:e,mode:`dark`},{name:`tokyoNight`,theme:i,mode:`dark`},{name:`nord`,theme:r,mode:`dark`}],f=[`name`,`bg`,`fg`,`muted`,`accent`,`accent2`,`success`,`warn`,`error`,`border`,`dim`];function p({name:e,theme:t,mode:n}){let r=[t.accent,t.accent2,t.success,t.warn,t.error];return u.createElement(s,{flexDirection:`row`},u.createElement(c,{bold:!0},e.padEnd(14)),u.createElement(c,{color:`gray`},n.padEnd(7)),r.map((e,t)=>u.createElement(c,{key:t,color:e},`████`,` `)),u.createElement(c,{color:`gray`},t.bg))}function m({themes:e}){return u.createElement(s,{flexDirection:`column`},u.createElement(a,{version:`themes`}),u.createElement(s,{marginTop:1,marginBottom:1},u.createElement(c,{color:`gray`},e.length,` themes — pass --theme <name> to any command, or set in your config.`)),u.createElement(s,{flexDirection:`column`},u.createElement(s,null,u.createElement(c,{bold:!0},`name`.padEnd(14)),u.createElement(c,{bold:!0},`mode`.padEnd(7)),u.createElement(c,{bold:!0},`swatch`.padEnd(28)),u.createElement(c,{bold:!0},`bg`)),e.map(({name:e,theme:t,mode:n})=>u.createElement(p,{key:e,name:e,theme:t,mode:n}))))}async function h(e){if(e.validate){let t;try{let n=await o.readFile(e.validate,`utf8`);t=JSON.parse(n)}catch(t){return process.stderr.write(`✗ Failed to read ${e.validate}: ${t.message}\n`),1}let n=f.filter(e=>t[e]==null);return n.length>0?(process.stderr.write(`✗ Missing required tokens: ${n.join(`, `)}\n`),e.json&&process.stdout.write(JSON.stringify({ok:!1,missing:n},null,2)+`
2
2
  `),1):(process.stdout.write(`✔ Valid theme (${f.length} tokens present).\n`),e.json&&process.stdout.write(JSON.stringify({ok:!0,theme:t},null,2)+`
3
3
  `),0)}if(e.json)return process.stdout.write(JSON.stringify({themes:d.map(({name:e,theme:t,mode:n})=>({name:e,mode:n,background:t.bg,foreground:t.fg,accent:t.accent}))},null,2)+`
4
4
  `),0;let{waitUntilExit:t}=l(u.createElement(m,{themes:d}));return await t(),0}export{h as themesCommand};
@@ -1 +1 @@
1
- import{useTheme as e}from"./panel-s0DHmKcg.js";import{BrandGradient as t}from"./keybar-D2LIBUlF.js";import{Box as n,Text as r,useInput as i}from"ink";import a,{useMemo as o,useState as s}from"react";import"diff";function c(e,t){return e.length<=t?e:t<=1?e.slice(0,t):`${e.slice(0,t-1)}…`}function l(e,t,n){if(e.length>=t)return c(e,t);let r=t-e.length;if(n===`right`)return` `.repeat(r)+e;if(n===`center`){let t=Math.floor(r/2),n=r-t;return` `.repeat(t)+e+` `.repeat(n)}return e+` `.repeat(r)}function u(e,t){return e.map(e=>{if(typeof e.width==`number`&&e.width>0)return e.width;let n=e.header.length;for(let r of t){let t=r[e.key],i=e.format?e.format(t,r):String(t??``);i.length>n&&(n=i.length)}return Math.max(3,n)})}function d({columns:i,data:o,zebra:s=!1}){let{theme:c}=e(),d=u(i,o),f=d.reduce((e,t)=>e+t,0)+i.length*3+1,p=(e,t,n)=>{let r=e;return d.forEach((e,i)=>{r+=`─`.repeat(e+2),r+=i===d.length-1?n:t}),r},m=p(`╭`,`┬`,`╮`),h=p(`├`,`┼`,`┤`),g=p(`╰`,`┴`,`╯`),_=i.map((e,t)=>l(e.header,d[t]??e.header.length,e.align??`left`)).join(` │ `);return a.createElement(n,{flexDirection:`column`,width:f},a.createElement(r,{color:c.border},m),a.createElement(n,{flexDirection:`row`},a.createElement(r,{color:c.border},`│ `),a.createElement(t,null,_),a.createElement(r,{color:c.border},` │`)),a.createElement(r,{color:c.border},h),o.map((e,t)=>{let o=s&&t%2==1,u=o?c.muted:c.fg,f=i.map((t,n)=>{let r=e[t.key],i=t.format?t.format(r,e):String(r??``);return l(i,d[n]??i.length,t.align??`left`)}).join(` │ `);return a.createElement(n,{key:t,flexDirection:`row`},a.createElement(r,{color:c.border},`│ `),a.createElement(r,{color:u},f),a.createElement(r,{color:c.border},` │`))}),a.createElement(r,{color:c.border},g))}export{d as Table};
1
+ import{useTheme as e}from"./panel-DglZ755S.js";import{BrandGradient as t}from"./keybar-D2OI-8rx.js";import{Box as n,Text as r,useInput as i}from"ink";import a,{useMemo as o,useState as s}from"react";import"diff";function c(e,t){return e.length<=t?e:t<=1?e.slice(0,t):`${e.slice(0,t-1)}…`}function l(e,t,n){if(e.length>=t)return c(e,t);let r=t-e.length;if(n===`right`)return` `.repeat(r)+e;if(n===`center`){let t=Math.floor(r/2),n=r-t;return` `.repeat(t)+e+` `.repeat(n)}return e+` `.repeat(r)}function u(e,t){return e.map(e=>{if(typeof e.width==`number`&&e.width>0)return e.width;let n=e.header.length;for(let r of t){let t=r[e.key],i=e.format?e.format(t,r):String(t??``);i.length>n&&(n=i.length)}return Math.max(3,n)})}function d({columns:i,data:o,zebra:s=!1}){let{theme:c}=e(),d=u(i,o),f=d.reduce((e,t)=>e+t,0)+i.length*3+1,p=(e,t,n)=>{let r=e;return d.forEach((e,i)=>{r+=`─`.repeat(e+2),r+=i===d.length-1?n:t}),r},m=p(`╭`,`┬`,`╮`),h=p(`├`,`┼`,`┤`),g=p(`╰`,`┴`,`╯`),_=i.map((e,t)=>l(e.header,d[t]??e.header.length,e.align??`left`)).join(` │ `);return a.createElement(n,{flexDirection:`column`,width:f},a.createElement(r,{color:c.border},m),a.createElement(n,{flexDirection:`row`},a.createElement(r,{color:c.border},`│ `),a.createElement(t,null,_),a.createElement(r,{color:c.border},` │`)),a.createElement(r,{color:c.border},h),o.map((e,t)=>{let o=s&&t%2==1,u=o?c.muted:c.fg,f=i.map((t,n)=>{let r=e[t.key],i=t.format?t.format(r,e):String(r??``);return l(i,d[n]??i.length,t.align??`left`)}).join(` │ `);return a.createElement(n,{key:t,flexDirection:`row`},a.createElement(r,{color:c.border},`│ `),a.createElement(r,{color:u},f),a.createElement(r,{color:c.border},` │`))}),a.createElement(r,{color:c.border},g))}export{d as Table};
@@ -0,0 +1 @@
1
+ import{readConfig as e}from"./config-ZTGpKEWg.js";import"./formatter-DQ6l4sWM.js";import{emit as t,isHeadless as n}from"./emit-DIRc7UzM.js";import{classifyBump as r,fetchManifest as i,platformKey as a}from"./check-S0ACFIfq.js";import o from"node:path";import{promises as s}from"node:fs";import c from"node:os";import l from"node:crypto";import u from"semver";const d=`AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=`;async function f(e){let t=await i({cliBase:e.cliBase,fetchImpl:e.fetchImpl});return p({...e,manifest:t})}async function p(e){let{manifest:t,currentVersion:n,forceDowngrade:i}=e,o=r(n,t.latest);if(o===`none`)return{updated:!1,from:n,to:t.latest,reason:`already-latest`};if(o===`downgrade`&&!i)return{updated:!1,from:n,to:t.latest,reason:`downgrade-blocked`};t.minSupported&&u.lt(n,t.minSupported);let c=a(),l=t.platforms[c];if(!l)throw Error(`No release binary for platform ${c}`);let d=await m(l,e.fetchImpl);try{return await h(d,l.sha256),await g(l,t.latest,c),await _(d,e.binaryPath),{updated:!0,from:n,to:t.latest}}catch(e){throw await s.unlink(d).catch(()=>void 0),e}}async function m(e,t=fetch){let n=await t(e.url);if(!n.ok)throw Error(`Download failed: ${n.status}`);let r=Buffer.from(await n.arrayBuffer()),i=await s.mkdtemp(o.join(c.tmpdir(),`zenovay-update-`)),a=o.join(i,`zenovay.new`);return await s.writeFile(a,r,{mode:493}),a}async function h(e,t){let n=await s.readFile(e),r=l.createHash(`sha256`).update(n).digest(`hex`);if(r.toLowerCase()!==t.toLowerCase())throw Error(`Checksum mismatch: expected ${t}, got ${r}. Update REFUSED.`)}async function g(e,t,n){let r=Buffer.from(d,`base64`);if(r.length!==32)throw Error(`Invalid release public key — update REFUSED.`);let i=Buffer.from(`${e.sha256}|${t}|${n}`),a=Buffer.from(e.sig,`base64`),o=l.createPublicKey({key:Buffer.concat([Buffer.from(`302a300506032b6570032100`,`hex`),r]),format:`der`,type:`spki`}),s=l.verify(null,i,o,a);if(!s)throw Error(`Signature verification FAILED. Update REFUSED.`)}async function _(e,t){let n=`${t}.old-${Date.now()}`;try{await s.rename(t,n)}catch(e){if(e.code!==`ENOENT`)throw e}try{await s.rename(e,t),process.platform!==`win32`&&await s.chmod(t,493),await s.unlink(n).catch(()=>void 0)}catch(e){try{await s.rename(n,t)}catch{}throw e}}async function v(a){let o=await e(),s=await i({cliBase:o.cliBase}),c=r(a.cliVersion,s.latest);if(a.check)return n({json:a.json})?t({type:`info`,message:`latest=${s.latest} current=${a.cliVersion} bump=${c}`}):process.stdout.write(`Current: ${a.cliVersion}\nLatest: ${s.latest}\nBump: ${c}\n`),{updated:!1,from:a.cliVersion,to:s.latest};if(c===`none`)return n({json:a.json})||process.stdout.write(`Already on latest (${a.cliVersion}).\n`),{updated:!1,from:a.cliVersion,to:s.latest};if(c===`downgrade`&&!a.forceDowngrade)throw Error(`Refused to downgrade ${a.cliVersion} → ${s.latest}. Pass --force-downgrade if you really want this.`);let l=await f({currentVersion:a.cliVersion,cliBase:o.cliBase,binaryPath:a.binaryPath,forceDowngrade:a.forceDowngrade});return n({json:a.json})?l.updated&&t({type:`update.applied`,from:l.from,to:l.to}):l.updated?process.stdout.write(`Updated ${l.from} → ${l.to}\n`):process.stdout.write(`Not updated (${l.reason??`unknown`}).\n`),l}export{v as updateCommand};
@@ -0,0 +1,3 @@
1
+ import{readConfig as e}from"./config-ZTGpKEWg.js";import{readToken as t}from"./api-D5XQeEDF.js";import{formatTabular as n,selectFormat as r}from"./formatter-DQ6l4sWM.js";import"./panel-DglZ755S.js";import"./keybar-D2OI-8rx.js";import"./prompt-hjzdzlyj.js";import"./sparkline-CR_bzxwB.js";import{runAnalyticalScreen as i}from"./analytical-screen-CS1ZL5Mo.js";import{Table as a}from"./ui-Bk5nl2yb.js";import{ApiV2Client as o}from"./api-v2-DP5YEHL_.js";import{Box as s,Text as c}from"ink";import l from"react";const u={lcp:{good:2500,poor:4e3},inp:{good:200,poor:500},cls:{good:.1,poor:.25},ttfb:{good:800,poor:1800},fcp:{good:1800,poor:3e3}};function d(e,t){let n=u[e];return t<=n.good?{label:`good`,color:`green`}:t<=n.poor?{label:`needs`,color:`yellow`}:{label:`poor`,color:`red`}}function f(e,t){return e===`cls`?t.toFixed(3):t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}async function p(u){let p=await e(),m=await t({strict:!1}),h=u.siteId??m?.teamId??``;if(!h)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
+ `),2;let g=new o({config:p,cliVersion:u.cliVersion,token:m}),_=r(u),v=[{key:`url`,header:`url`,width:32},{key:`device`,header:`device`,width:7,format:e=>String(e??`—`)},{key:`lcp`,header:`LCP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?f(`lcp`,e.p75):`—`},{key:`inp`,header:`INP p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?f(`inp`,e.p75):`—`},{key:`cls`,header:`CLS p75`,width:9,align:`right`,format:e=>e&&typeof e==`object`&&`p75`in e?f(`cls`,e.p75):`—`},{key:`samples`,header:`n`,width:6,align:`right`}];return i({cliVersion:u.cliVersion,title:`vitals · ${h}`,commandName:`vitals`,authToken:m?.accessToken??null,refreshIntervalMs:u.watch?5*6e4:0,fetcher:e=>g.getVitals(h,{url:u.url,device:u.device,window:u.window},e),format:_,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
+ `);return}process.stdout.write(n(e.vitals,[`url`,`device`,`samples`],t))},panels:[{id:`summary`,title:`Site-wide p75`,render:e=>{let t=t=>{let n=0,r=0;for(let i of e.vitals){let e=i[t]?.p75;typeof e==`number`&&(n+=e*i.samples,r+=i.samples)}return r>0?n/r:0},n=[`lcp`,`inp`,`cls`,`ttfb`,`fcp`];return l.createElement(s,{flexDirection:`column`},n.map(e=>{let n=t(e),r=d(e,n);return l.createElement(c,{key:e},l.createElement(c,{color:r.color},`● `),l.createElement(c,{bold:!0},e.toUpperCase().padEnd(5)),` `,l.createElement(c,null,f(e,n).padStart(8)),` `,l.createElement(c,{color:r.color},r.label))}))}},{id:`pages`,title:`Per-page`,render:e=>e.vitals.length===0?l.createElement(c,{color:`gray`},`— no vitals data yet —`):l.createElement(a,{data:e.vitals.slice(0,15),columns:v})}]})}export{p as vitalsCommand};
@@ -0,0 +1,2 @@
1
+ import{readConfig as e}from"./config-ZTGpKEWg.js";import{ApiClient as t,readToken as n}from"./api-D5XQeEDF.js";import{parseSseStream as r}from"./client-GAPcEws9.js";import"./formatter-DQ6l4sWM.js";import{emit as i,isHeadless as a}from"./emit-DIRc7UzM.js";import{Panel as o}from"./panel-DglZ755S.js";import{Banner as s,Keybar as c}from"./keybar-D2OI-8rx.js";import{spark as l}from"./sparkline-CR_bzxwB.js";import{Box as u,Text as d,render as f,useApp as p,useInput as m}from"ink";import h,{useEffect as g,useState as _}from"react";import v from"ink-spinner";import y from"ink-text-input";const b=Math.PI*2;function x(e){let t=e,n=Math.PI*Math.sin(e);for(let e=0;e<6;e++){let e=2*t+Math.sin(2*t)-n,r=2+2*Math.cos(2*t);if(r===0)break;t-=e/r}return t}function S(e,t){if(e<-90||e>90||t<-180||t>180)return null;let n=e*Math.PI/180,r=t*Math.PI/180,i=x(n),a=r*Math.cos(i)/Math.PI,o=Math.sin(i);return{x:a,y:o}}function C(e){if(e)return!0;let t=process.env;if(t.NO_COLOR||t.ZENOVAY_GLOBE===`ascii`)return!0;let n=(t.LANG||t.LC_ALL||t.LC_CTYPE||``).toLowerCase();return!!(n&&!n.includes(`utf`))}function w(e,t){let n=e*2,r=t*4;return{dw:n,dh:r,bits:new Uint8Array(n*r)}}function T(e,t,n){t<0||t>=e.dw||n<0||n>=e.dh||(e.bits[n*e.dw+t]=1)}function E(e){let t=e.dw/2,n=e.dh/2,r=e.dw/2-1,i=e.dh/2-1,a=Math.max(e.dw,e.dh)*2;for(let o=0;o<a;o++){let s=o/a*b,c=Math.round(t+r*Math.cos(s)),l=Math.round(n+i*Math.sin(s));T(e,c,l)}}function D(e){let t=Math.floor(e.dh/2);for(let n=0;n<e.dw;n+=4)T(e,n,t)}function O(e,t){let n=e.dw/2,r=e.dh/2,i=e.dw/2-1,a=e.dh/2-1;for(let o of t){let t=S(o.lat,o.lng);if(!t)continue;let s=Math.round(n+t.x*i),c=Math.round(r-t.y*a);T(e,s,c),T(e,s+1,c),T(e,s,c+1),T(e,s+1,c+1)}}const k=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[0,3],[1,3]];function A(e,t,n){let r=0;for(let i=0;i<k.length;i++){let[a,o]=k[i],s=t*2+a,c=n*4+o;e.bits[c*e.dw+s]&&(r|=1<<i)}return r===0?` `:String.fromCodePoint(10240+r)}function j(e,t,n){let r=0;for(let i=0;i<4;i++)for(let a=0;a<2;a++){let o=t*2+a,s=n*4+i;e.bits[s*e.dw+o]&&r++}return r===0?` `:r<=2?`.`:r<=4?`:`:r<=6?`*`:`#`}function M({data:e,width:t=80,height:n=20,asciiOnly:r}){let i=C(r),a=w(t,n);E(a),D(a),O(a,e);let o=[];for(let e=0;e<n;e++){let n=``;for(let r=0;r<t;r++)n+=i?j(a,r,e):A(a,r,e);o.push(n)}return h.createElement(u,{flexDirection:`column`},o.map((e,t)=>h.createElement(d,{key:t,color:`magenta`},e)),h.createElement(d,{color:`gray`},e.length,` live · `,i?`ascii mode`:`braille mode`))}async function N(r){let o=await e(),s=await n({strict:!1});if(!s)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let c=new t({config:o,cliVersion:r.cliVersion,token:s}),l=r.siteId??s.teamId;if(!l)return process.stderr.write(`No site selected — pass --site-id.
2
+ `),2;if(a(r)){let e=await c.getDashboardSnapshot(l);return i({type:`watch.tick`,snapshot:e}),0}return new Promise(e=>{let{unmount:t}=f(h.createElement(P,{api:c,siteId:l,intervalMs:r.intervalMs??15e3,cliVersion:r.cliVersion,onExit:n=>{t(),e(n)}}))})}const P=({api:e,siteId:t,intervalMs:n,cliVersion:i,onExit:a})=>{let{exit:l}=p(),[f,y]=_(null),[b,x]=_(null),[S,C]=_(null),[w,T]=_([]),[E,D]=_(!0),[O,k]=_(null),[A,j]=_(1),[N,P]=_(!1),[H,U]=_(!1);if(m((e,t)=>{if(e===`q`){l(),a(0);return}if(e===`?`||e===`/`){U(e=>!e);return}if(e===`g`){P(e=>!e);return}if(t.tab){j(e=>{let n=t.shift?(e+4)%6+1:e%6+1;return n});return}(e===`1`||e===`2`||e===`3`||e===`4`||e===`5`||e===`6`)&&j(Number(e))}),g(()=>{let r=!1,i=async()=>{try{let n=await e.getDashboardSnapshot(t);if(r)return;y(n);let i=e.getVitals;typeof i==`function`&&i.call(e,t).then(e=>{r||x(e)},()=>{});let a=e.getGoals;typeof a==`function`&&a.call(e,t).then(e=>{r||C(e)},()=>{}),D(!1),k(null)}catch(e){r||k(e.message)}};i();let a=setInterval(i,n);return()=>{r=!0,clearInterval(a)}},[e,t,n]),g(()=>{let n=new AbortController;return(async()=>{try{let i=await e.openEventsStream(t,n.signal);for await(let e of r(i))e.type===`error`&&T(t=>[...t,`[ERR ${e.code}] ${e.message}`].slice(-10))}catch{}})(),()=>n.abort()},[e,t]),E)return h.createElement(u,{flexDirection:`column`},h.createElement(s,{version:i,subtitle:`watch · ${t}`}),h.createElement(o,{title:`Loading`,state:`busy`},h.createElement(u,null,h.createElement(d,{color:`magenta`},h.createElement(v,{type:`dots`})),h.createElement(d,null,` Fetching snapshot…`))));if(O&&!f)return h.createElement(u,{flexDirection:`column`},h.createElement(s,{version:i,subtitle:`watch · ${t}`}),h.createElement(o,{title:`Error`,state:`err`},h.createElement(d,{color:`red`},O)));let W=process.stdout.columns??80,G=Math.max(20,Math.floor(W/3)-1),K=N?(f?.recent??[]).map(e=>typeof e.lat==`number`&&typeof e.lng==`number`?{lat:e.lat,lng:e.lng}:null).filter(e=>e!==null):[];return h.createElement(u,{flexDirection:`column`},h.createElement(s,{version:i,subtitle:`watch · ${t}${N?` · globe`:``}`}),h.createElement(u,{flexDirection:`row`},h.createElement(u,{flexDirection:`column`},N?h.createElement(o,{title:`Live globe`,focused:A===1,width:G},h.createElement(M,{data:K,width:Math.max(40,G-4),height:12})):h.createElement(I,{snapshot:f,focused:A===1,width:G}),h.createElement(z,{events:w,focused:A===4,width:G})),h.createElement(u,{flexDirection:`column`},h.createElement(L,{snapshot:f,focused:A===2,width:G}),h.createElement(B,{vitals:b,focused:A===5,width:G})),h.createElement(u,{flexDirection:`column`},h.createElement(R,{snapshot:f,focused:A===3,width:G}),h.createElement(V,{goals:S,focused:A===6,width:G}))),H?h.createElement(F,{api:e,siteId:t,width:W-2}):null,h.createElement(c,{items:[{key:`tab`,label:`next`},{key:`1-6`,label:`jump`},{key:`g`,label:N?`panels`:`globe`},{key:`?/`,label:H?`close chat`:`ai chat`},{key:`q`,label:`quit`}]}))},F=({api:e,siteId:t,width:n})=>{let[i,a]=_(``),[s,c]=_([]),[l,f]=_(!1),[p,m]=_(``),[g,v]=_(null),b=async n=>{let i=n.trim();if(!i||l)return;v(null),a(``);let o=[...s,{role:`user`,content:i}];c(o),f(!0),m(``);try{let n=o.map(e=>({role:e.role,content:e.content})),i=await e.openAiStream(`chat`,{messages:n,siteId:t},void 0),a=``;for await(let e of r(i))if(e.type===`delta`)a+=e.content,m(a);else if(e.type===`error`)v(`${e.code}: ${e.message}`);else if(e.type===`done`)break;c([...o,{role:`assistant`,content:a}]),m(``)}catch(e){v(e instanceof Error?e.message:`chat failed`)}finally{f(!1)}};return h.createElement(u,{marginTop:1},h.createElement(o,{title:`AI chat (esc / ?/ to close)`,focused:!0,width:n},h.createElement(u,{flexDirection:`column`},s.slice(-6).map((e,t)=>h.createElement(u,{key:t,flexDirection:`column`,marginBottom:1},h.createElement(d,{color:e.role===`user`?`cyan`:`magenta`,bold:!0},e.role===`user`?`you`:`zenovay`),h.createElement(d,null,e.content))),l&&p?h.createElement(u,{flexDirection:`column`,marginBottom:1},h.createElement(d,{color:`magenta`,bold:!0},`zenovay`),h.createElement(d,null,p)):null,g?h.createElement(d,{color:`red`},`✗ `,g):null,h.createElement(u,null,h.createElement(d,{color:`cyan`},l?`⠋ `:`▸ `),h.createElement(y,{value:i,onChange:a,onSubmit:b,placeholder:l?`streaming…`:`ask anything about your analytics`})))))},I=({snapshot:e,focused:t,width:n})=>{let r=e?.visitors?.count??0,i=e?.visitors?.series??[];return h.createElement(o,{title:`Visitors`,focused:t,width:n},h.createElement(d,{bold:!0},r.toString()),h.createElement(d,{color:`gray`},i.length>0?l(i,Math.max(8,n-6)):`— no data —`))},L=({snapshot:e,focused:t,width:n})=>{let r=e?.topPages?.slice(0,5)??[];return h.createElement(o,{title:`Top pages`,focused:t,width:n},r.length===0?h.createElement(d,{color:`gray`},`— no data —`):r.map(e=>h.createElement(u,{key:e.path},h.createElement(d,null,e.path.padEnd(n-10).slice(0,n-10)),h.createElement(d,{color:`gray`},` `,e.views))))},R=({snapshot:e,focused:t,width:n})=>{let r=e?.sources?.slice(0,5)??[];return h.createElement(o,{title:`Sources`,focused:t,width:n},r.length===0?h.createElement(d,{color:`gray`},`— no data —`):r.map(e=>h.createElement(u,{key:e.source},h.createElement(d,null,e.source.padEnd(n-10).slice(0,n-10)),h.createElement(d,{color:`gray`},` `,e.visitors))))},z=({events:e,focused:t,width:n})=>h.createElement(o,{title:`Events`,focused:t,width:n},e.length===0?h.createElement(d,{color:`gray`},`— waiting —`):e.slice(-10).map((e,t)=>h.createElement(d,{key:t},e.slice(0,n-4)))),B=({vitals:e,focused:t,width:n})=>{let r=(e,t,n)=>h.createElement(u,{key:e},h.createElement(d,{bold:!0},e.padEnd(6)),h.createElement(d,{color:`gray`},typeof t==`number`?`${t.toFixed(0)}${n}`:`—`));return h.createElement(o,{title:`Vitals`,focused:t,width:n},r(`LCP`,e?.lcpP75,`ms`),r(`INP`,e?.inpP75,`ms`),r(`CLS`,e?.clsP75?e.clsP75*1e3:void 0,`/1k`),r(`TTFB`,e?.ttfbP75,`ms`),r(`FCP`,e?.fcpP75,`ms`))},V=({goals:e,focused:t,width:n})=>{let r=e?.goals?.slice(0,5)??[];return h.createElement(o,{title:`Goals`,focused:t,width:n},r.length===0?h.createElement(d,{color:`gray`},`— no data —`):r.map(e=>h.createElement(u,{key:e.name},h.createElement(d,null,e.name.padEnd(n-10).slice(0,n-10)),h.createElement(d,{color:`gray`},` `,e.completions))))};export{N as watchCommand};
@@ -0,0 +1,3 @@
1
+ import{readConfig as e}from"./config-ZTGpKEWg.js";import{readToken as t}from"./api-D5XQeEDF.js";import{Panel as n}from"./panel-DglZ755S.js";import{Banner as r}from"./keybar-D2OI-8rx.js";import"./prompt-hjzdzlyj.js";import"./sparkline-CR_bzxwB.js";import"./ui-Bk5nl2yb.js";import{ApiV2Client as i}from"./api-v2-DP5YEHL_.js";import{Box as a,Text as o,render as s,useApp as c,useInput as l}from"ink";import u,{useEffect as d,useState as f}from"react";async function p(e,t){let n=new TextEncoder,r=await crypto.subtle.importKey(`raw`,n.encode(e),{name:`HMAC`,hash:`SHA-256`},!1,[`sign`]),i=await crypto.subtle.sign(`HMAC`,r,n.encode(t));return Array.from(new Uint8Array(i),e=>e.toString(16).padStart(2,`0`)).join(``)}function m({stats:e}){return u.createElement(n,{title:`webhooks forward`,state:e.connected?`ok`:`busy`},u.createElement(a,{flexDirection:`column`},u.createElement(o,null,u.createElement(o,{color:`gray`},`public URL `),u.createElement(o,{color:`cyan`},e.publicUrl)),u.createElement(o,null,u.createElement(o,{color:`gray`},`→ forwarding to `),u.createElement(o,{color:`magenta`},e.wsUrl)),u.createElement(o,null,e.connected?u.createElement(o,{color:`green`},`● connected`):u.createElement(o,{color:`yellow`},`○ connecting…`),u.createElement(o,{color:`gray`},` · `,e.total,` requests · `,e.ok,` ok · `),u.createElement(o,{color:e.err>0?`red`:`gray`},e.err,` err`),e.lastStatus===null?null:u.createElement(o,{color:`gray`},` · last: HTTP `,e.lastStatus)),e.lastError?u.createElement(o,{color:`red`},`last error: `,e.lastError.slice(0,80)):null))}async function h(n){let h=await e(),g=await t({strict:!1});if(!g?.accessToken)return process.stderr.write("Not authenticated. Run `zenovay login` first.\n"),2;let _=n.siteId??g.teamId??``;if(!_)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
+ `),2;if(!n.to)return process.stderr.write(`Missing --to <url> (e.g. --to localhost:3000/webhook).
3
+ `),2;let v=n.to.match(/^https?:\/\//)?n.to:`http://${n.to}`,y=new i({config:h,cliVersion:n.cliVersion,token:g}),b;try{b=await y.createTunnel(_,n.to)}catch(e){return process.stderr.write(`Failed to register tunnel: ${e.message}\n`),1}let x=n.sign?n.secret??b.tunnelKey:null,S=()=>{let{exit:e}=c(),[t,i]=f({total:0,ok:0,err:0,lastStatus:null,lastError:null,publicUrl:b.publicUrl,wsUrl:b.wsUrl,connected:!1});return l((t,n)=>{(t===`q`||n.escape)&&e()}),d(()=>{let e=new AbortController,t=async e=>{try{let t={...e.headers};delete t.host,delete t[`content-length`],x&&(t[`X-Zenovay-Signature`]=`sha256=${await p(x,e.body)}`);let n=await fetch(v,{method:e.method,headers:t,body:e.method===`GET`||e.method===`HEAD`?void 0:e.body}),r=await n.text(),a={};return n.headers.forEach((e,t)=>{a[t]=e}),i(e=>({...e,total:e.total+1,ok:e.ok+(n.ok?1:0),err:e.err+(n.ok?0:1),lastStatus:n.status,lastError:n.ok?null:`HTTP ${n.status}`})),{status:n.status,headers:a,body:r}}catch(e){let t=e instanceof Error?e.message:String(e);return i(e=>({...e,total:e.total+1,err:e.err+1,lastError:t})),{status:502,body:JSON.stringify({error:`cli_local_failed`,detail:t})}}};return(async()=>{let n=y.tunnelClient(b.wsUrl);i(e=>({...e,connected:!0}));try{await n.start(t,e.signal)}catch(e){i(t=>({...t,connected:!1,lastError:e.message}))}})(),()=>{e.abort()}},[]),u.createElement(a,{flexDirection:`column`},u.createElement(r,{version:`webhooks forward`}),u.createElement(m,{stats:t}),u.createElement(o,{color:`gray`},`target: `,v,` `,n.sign?`· HMAC-signed`:``),u.createElement(o,{color:`gray`},`[q | Esc] quit`))},{waitUntilExit:C}=s(u.createElement(S,null));return await C(),0}export{h as webhooksForwardCommand};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import(`./init-fB_aCIAr.js`).then(async({initCommand:e})=>{let{readFileSync:t}=await import(`node:fs`),n=await import(`node:path`),{fileURLToPath:r}=await import(`node:url`),i=n.dirname(r(import.meta.url)),a=JSON.parse(t(n.join(i,`..`,`package.json`),`utf8`)),o=process.argv.slice(2),s=o.includes(`--json`),c=o.includes(`--yes`),l=o.includes(`--skip-mcp`),u=o.includes(`--skip-verify`),d=await e({cliVersion:a.version,cwd:process.cwd(),json:s,yes:c,skipMcp:l,skipVerify:u});process.exit(d)});
2
+ import(`./init-DPHxWL9F.js`).then(async({initCommand:e})=>{let{readFileSync:t}=await import(`node:fs`),n=await import(`node:path`),{fileURLToPath:r}=await import(`node:url`),i=n.dirname(r(import.meta.url)),a=JSON.parse(t(n.join(i,`..`,`package.json`),`utf8`)),o=process.argv.slice(2),s=o.includes(`--json`),c=o.includes(`--yes`),l=o.includes(`--skip-mcp`),u=o.includes(`--skip-verify`),d=await e({cliVersion:a.version,cwd:process.cwd(),json:s,yes:c,skipMcp:l,skipVerify:u});process.exit(d)});
@@ -0,0 +1,6 @@
1
+ import{createRequire as e}from"module";var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),c=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},l=(e,r,i)=>(i=e==null?{}:t(a(e)),c(r||!e||!e.__esModule?n(i,`default`,{value:e,enumerable:!0}):i,e)),u=e(import.meta.url),d=s((exports,t)=>{let n=[`nodebuffer`,`arraybuffer`,`fragments`],r=typeof Blob<`u`;r&&n.push(`blob`),t.exports={BINARY_TYPES:n,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:`258EAFA5-E914-47DA-95CA-C5AB0DC85B11`,hasBlob:r,kForOnEventAttribute:Symbol(`kIsForOnEventAttribute`),kListener:Symbol(`kListener`),kStatusCode:Symbol(`status-code`),kWebSocket:Symbol(`websocket`),NOOP:()=>{}}}),f=s((exports,t)=>{let{EMPTY_BUFFER:n}=d(),r=Buffer[Symbol.species];function i(e,t){if(e.length===0)return n;if(e.length===1)return e[0];let i=Buffer.allocUnsafe(t),a=0;for(let t=0;t<e.length;t++){let n=e[t];i.set(n,a),a+=n.length}return a<t?new r(i.buffer,i.byteOffset,a):i}function a(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[a]^t[a&3]}function o(e,t){for(let n=0;n<e.length;n++)e[n]^=t[n&3]}function s(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)}function c(e){if(c.readOnly=!0,Buffer.isBuffer(e))return e;let t;return e instanceof ArrayBuffer?t=new r(e):ArrayBuffer.isView(e)?t=new r(e.buffer,e.byteOffset,e.byteLength):(t=Buffer.from(e),c.readOnly=!1),t}if(t.exports={concat:i,mask:a,toArrayBuffer:s,toBuffer:c,unmask:o},!process.env.WS_NO_BUFFER_UTIL)try{let e=u(`bufferutil`);t.exports.mask=function(t,n,r,i,o){o<48?a(t,n,r,i,o):e.mask(t,n,r,i,o)},t.exports.unmask=function(t,n){t.length<32?o(t,n):e.unmask(t,n)}}catch{}}),p=s((exports,t)=>{let n=Symbol(`kDone`),r=Symbol(`kRun`);var i=class{constructor(e){this[n]=()=>{this.pending--,this[r]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[r]()}[r](){if(this.pending!==this.concurrency&&this.jobs.length){let e=this.jobs.shift();this.pending++,e(this[n])}}};t.exports=i}),m=s((exports,t)=>{let n=u(`zlib`),r=f(),i=p(),{kStatusCode:a}=d(),o=Buffer[Symbol.species],s=Buffer.from([0,0,255,255]),c=Symbol(`permessage-deflate`),l=Symbol(`total-length`),m=Symbol(`callback`),h=Symbol(`buffers`),g=Symbol(`error`),_;var v=class{constructor(e){if(this._options=e||{},this._threshold=this._options.threshold===void 0?1024:this._options.threshold,this._maxPayload=this._options.maxPayload|0,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,!_){let e=this._options.concurrencyLimit===void 0?10:this._options.concurrencyLimit;_=new i(e)}}static get extensionName(){return`permessage-deflate`}offer(){let e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits??(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let e=this._deflate[m];this._deflate.close(),this._deflate=null,e&&e(Error(`The deflate stream was closed while data was being processed`))}}acceptAsServer(e){let t=this._options,n=e.find(e=>!(t.serverNoContextTakeover===!1&&e.server_no_context_takeover||e.server_max_window_bits&&(t.serverMaxWindowBits===!1||typeof t.serverMaxWindowBits==`number`&&t.serverMaxWindowBits>e.server_max_window_bits)||typeof t.clientMaxWindowBits==`number`&&!e.client_max_window_bits));if(!n)throw Error(`None of the extension offers can be accepted`);return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),typeof t.serverMaxWindowBits==`number`&&(n.server_max_window_bits=t.serverMaxWindowBits),typeof t.clientMaxWindowBits==`number`?n.client_max_window_bits=t.clientMaxWindowBits:(n.client_max_window_bits===!0||t.clientMaxWindowBits===!1)&&delete n.client_max_window_bits,n}acceptAsClient(e){let t=e[0];if(this._options.clientNoContextTakeover===!1&&t.client_no_context_takeover)throw Error(`Unexpected parameter "client_no_context_takeover"`);if(!t.client_max_window_bits)typeof this._options.clientMaxWindowBits==`number`&&(t.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits==`number`&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw Error(`Unexpected or invalid parameter "client_max_window_bits"`);return t}normalizeParams(e){return e.forEach(e=>{Object.keys(e).forEach(t=>{let n=e[t];if(n.length>1)throw Error(`Parameter "${t}" must have only a single value`);if(n=n[0],t===`client_max_window_bits`){if(n!==!0){let e=+n;if(!Number.isInteger(e)||e<8||e>15)throw TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw TypeError(`Invalid value for parameter "${t}": ${n}`)}else if(t===`server_max_window_bits`){let e=+n;if(!Number.isInteger(e)||e<8||e>15)throw TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(t===`client_no_context_takeover`||t===`server_no_context_takeover`){if(n!==!0)throw TypeError(`Invalid value for parameter "${t}": ${n}`)}else throw Error(`Unknown parameter "${t}"`);e[t]=n})}),e}decompress(e,t,n){_.add(r=>{this._decompress(e,t,(e,t)=>{r(),n(e,t)})})}compress(e,t,n){_.add(r=>{this._compress(e,t,(e,t)=>{r(),n(e,t)})})}_decompress(e,t,i){let a=this._isServer?`client`:`server`;if(!this._inflate){let e=`${a}_max_window_bits`,t=typeof this.params[e]==`number`?this.params[e]:n.Z_DEFAULT_WINDOWBITS;this._inflate=n.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[c]=this,this._inflate[l]=0,this._inflate[h]=[],this._inflate.on(`error`,x),this._inflate.on(`data`,b)}this._inflate[m]=i,this._inflate.write(e),t&&this._inflate.write(s),this._inflate.flush(()=>{let e=this._inflate[g];if(e){this._inflate.close(),this._inflate=null,i(e);return}let n=r.concat(this._inflate[h],this._inflate[l]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[l]=0,this._inflate[h]=[],t&&this.params[`${a}_no_context_takeover`]&&this._inflate.reset()),i(null,n)})}_compress(e,t,i){let a=this._isServer?`server`:`client`;if(!this._deflate){let e=`${a}_max_window_bits`,t=typeof this.params[e]==`number`?this.params[e]:n.Z_DEFAULT_WINDOWBITS;this._deflate=n.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[l]=0,this._deflate[h]=[],this._deflate.on(`data`,y)}this._deflate[m]=i,this._deflate.write(e),this._deflate.flush(n.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let e=r.concat(this._deflate[h],this._deflate[l]);t&&(e=new o(e.buffer,e.byteOffset,e.length-4)),this._deflate[m]=null,this._deflate[l]=0,this._deflate[h]=[],t&&this.params[`${a}_no_context_takeover`]&&this._deflate.reset(),i(null,e)})}};t.exports=v;function y(e){this[h].push(e),this[l]+=e.length}function b(e){if(this[l]+=e.length,this[c]._maxPayload<1||this[l]<=this[c]._maxPayload){this[h].push(e);return}this[g]=RangeError(`Max payload size exceeded`),this[g].code=`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`,this[g][a]=1009,this.removeListener(`data`,b),this.reset()}function x(e){if(this[c]._inflate=null,this[g]){this[m](this[g]);return}e[a]=1007,this[m](e)}}),h=s((exports,t)=>{let{isUtf8:n}=u(`buffer`),{hasBlob:r}=d(),i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function a(e){return e>=1e3&&e<=1014&&e!==1004&&e!==1005&&e!==1006||e>=3e3&&e<=4999}function o(e){let t=e.length,n=0;for(;n<t;)if(!(e[n]&128))n++;else if((e[n]&224)==192){if(n+1===t||(e[n+1]&192)!=128||(e[n]&254)==192)return!1;n+=2}else if((e[n]&240)==224){if(n+2>=t||(e[n+1]&192)!=128||(e[n+2]&192)!=128||e[n]===224&&(e[n+1]&224)==128||e[n]===237&&(e[n+1]&224)==160)return!1;n+=3}else if((e[n]&248)==240){if(n+3>=t||(e[n+1]&192)!=128||(e[n+2]&192)!=128||(e[n+3]&192)!=128||e[n]===240&&(e[n+1]&240)==128||e[n]===244&&e[n+1]>143||e[n]>244)return!1;n+=4}else return!1;return!0}function s(e){return r&&typeof e==`object`&&typeof e.arrayBuffer==`function`&&typeof e.type==`string`&&typeof e.stream==`function`&&(e[Symbol.toStringTag]===`Blob`||e[Symbol.toStringTag]===`File`)}if(t.exports={isBlob:s,isValidStatusCode:a,isValidUTF8:o,tokenChars:i},n)t.exports.isValidUTF8=function(e){return e.length<24?o(e):n(e)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let e=u(`utf-8-validate`);t.exports.isValidUTF8=function(t){return t.length<32?o(t):e(t)}}catch{}}),g=s((exports,t)=>{let{Writable:n}=u(`stream`),r=m(),{BINARY_TYPES:i,EMPTY_BUFFER:a,kStatusCode:o,kWebSocket:s}=d(),{concat:c,toArrayBuffer:l,unmask:p}=f(),{isValidStatusCode:g,isValidUTF8:_}=h(),v=Buffer[Symbol.species],y=0,b=1,x=2,S=3,C=4,w=5,T=6;var E=class extends n{constructor(e={}){super(),this._allowSynchronousEvents=e.allowSynchronousEvents===void 0?!0:e.allowSynchronousEvents,this._binaryType=e.binaryType||i[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=e.maxPayload|0,this._skipUTF8Validation=!!e.skipUTF8Validation,this[s]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=y}_write(e,t,n){if(this._opcode===8&&this._state==y)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){let t=this._buffers[0];return this._buffers[0]=new v(t.buffer,t.byteOffset+e,t.length-e),new v(t.buffer,t.byteOffset,e)}let t=Buffer.allocUnsafe(e);do{let n=this._buffers[0],r=t.length-e;e>=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=new v(n.buffer,n.byteOffset+e,n.length-e)),e-=n.length}while(e>0);return t}startLoop(e){this._loop=!0;do switch(this._state){case y:this.getInfo(e);break;case b:this.getPayloadLength16(e);break;case x:this.getPayloadLength64(e);break;case S:this.getMask();break;case C:this.getData(e);break;case w:case T:this._loop=!1;return}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2){this._loop=!1;return}let t=this.consume(2);if(t[0]&48){let t=this.createError(RangeError,`RSV2 and RSV3 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_2_3`);e(t);return}let n=(t[0]&64)==64;if(n&&!this._extensions[r.extensionName]){let t=this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`);e(t);return}if(this._fin=(t[0]&128)==128,this._opcode=t[0]&15,this._payloadLength=t[1]&127,this._opcode===0){if(n){let t=this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`);e(t);return}if(!this._fragmented){let t=this.createError(RangeError,`invalid opcode 0`,!0,1002,`WS_ERR_INVALID_OPCODE`);e(t);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let t=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,`WS_ERR_INVALID_OPCODE`);e(t);return}this._compressed=n}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let t=this.createError(RangeError,`FIN must be set`,!0,1002,`WS_ERR_EXPECTED_FIN`);e(t);return}if(n){let t=this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`);e(t);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let t=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,`WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH`);e(t);return}}else{let t=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,`WS_ERR_INVALID_OPCODE`);e(t);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(t[1]&128)==128,this._isServer){if(!this._masked){let t=this.createError(RangeError,`MASK must be set`,!0,1002,`WS_ERR_EXPECTED_MASK`);e(t);return}}else if(this._masked){let t=this.createError(RangeError,`MASK must be clear`,!0,1002,`WS_ERR_UNEXPECTED_MASK`);e(t);return}this._payloadLength===126?this._state=b:this._payloadLength===127?this._state=x:this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=!1;return}let t=this.consume(8),n=t.readUInt32BE(0);if(n>2**21-1){let t=this.createError(RangeError,`Unsupported WebSocket frame: payload length > 2^53 - 1`,!1,1009,`WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH`);e(t);return}this._payloadLength=n*2**32+t.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let t=this.createError(RangeError,`Max payload size exceeded`,!1,1009,`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`);e(t);return}this._masked?this._state=S:this._state=C}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=C}getData(e){let t=a;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}t=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&p(t,this._mask)}if(this._opcode>7){this.controlMessage(t,e);return}if(this._compressed){this._state=w,this.decompress(t,e);return}t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage(e)}decompress(e,t){let n=this._extensions[r.extensionName];n.decompress(e,this._fin,(e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let e=this.createError(RangeError,`Max payload size exceeded`,!1,1009,`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`);t(e);return}this._fragments.push(n)}this.dataMessage(t),this._state===y&&this.startLoop(t)})}dataMessage(e){if(!this._fin){this._state=y;return}let t=this._messageLength,n=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let r;r=this._binaryType===`nodebuffer`?c(n,t):this._binaryType===`arraybuffer`?l(c(n,t)):this._binaryType===`blob`?new Blob(n):n,this._allowSynchronousEvents?(this.emit(`message`,r,!0),this._state=y):(this._state=T,setImmediate(()=>{this.emit(`message`,r,!0),this._state=y,this.startLoop(e)}))}else{let r=c(n,t);if(!this._skipUTF8Validation&&!_(r)){let t=this.createError(Error,`invalid UTF-8 sequence`,!0,1007,`WS_ERR_INVALID_UTF8`);e(t);return}this._state===w||this._allowSynchronousEvents?(this.emit(`message`,r,!1),this._state=y):(this._state=T,setImmediate(()=>{this.emit(`message`,r,!1),this._state=y,this.startLoop(e)}))}}controlMessage(e,t){if(this._opcode===8){if(e.length===0)this._loop=!1,this.emit(`conclude`,1005,a),this.end();else{let n=e.readUInt16BE(0);if(!g(n)){let e=this.createError(RangeError,`invalid status code ${n}`,!0,1002,`WS_ERR_INVALID_CLOSE_CODE`);t(e);return}let r=new v(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!_(r)){let e=this.createError(Error,`invalid UTF-8 sequence`,!0,1007,`WS_ERR_INVALID_UTF8`);t(e);return}this._loop=!1,this.emit(`conclude`,n,r),this.end()}this._state=y;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?`ping`:`pong`,e),this._state=y):(this._state=T,setImmediate(()=>{this.emit(this._opcode===9?`ping`:`pong`,e),this._state=y,this.startLoop(t)}))}createError(e,t,n,r,i){this._loop=!1,this._errored=!0;let a=new e(n?`Invalid WebSocket frame: ${t}`:t);return Error.captureStackTrace(a,this.createError),a.code=i,a[o]=r,a}};t.exports=E}),_=s((exports,t)=>{let{Duplex:n}=u(`stream`),{randomFillSync:r}=u(`crypto`),i=m(),{EMPTY_BUFFER:a,kWebSocket:o,NOOP:s}=d(),{isBlob:c,isValidStatusCode:l}=h(),{mask:p,toBuffer:g}=f(),_=Symbol(`kByteLength`),v=Buffer.alloc(4),y=8*1024,b,x=y,S=0,C=1,w=2;var T=class e{constructor(e,t,n){this._extensions=t||{},n&&(this._generateMask=n,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=S,this.onerror=s,this[o]=void 0}static frame(e,t){let n,i=!1,a=2,o=!1;t.mask&&(n=t.maskBuffer||v,t.generateMask?t.generateMask(n):(x===y&&(b===void 0&&(b=Buffer.alloc(y)),r(b,0,y),x=0),n[0]=b[x++],n[1]=b[x++],n[2]=b[x++],n[3]=b[x++]),o=(n[0]|n[1]|n[2]|n[3])===0,a=6);let s;typeof e==`string`?(!t.mask||o)&&t[_]!==void 0?s=t[_]:(e=Buffer.from(e),s=e.length):(s=e.length,i=t.mask&&t.readOnly&&!o);let c=s;s>=65536?(a+=8,c=127):s>125&&(a+=2,c=126);let l=Buffer.allocUnsafe(i?s+a:a);return l[0]=t.fin?t.opcode|128:t.opcode,t.rsv1&&(l[0]|=64),l[1]=c,c===126?l.writeUInt16BE(s,2):c===127&&(l[2]=l[3]=0,l.writeUIntBE(s,4,6)),!t.mask||(l[1]|=128,l[a-4]=n[0],l[a-3]=n[1],l[a-2]=n[2],l[a-1]=n[3],o)?[l,e]:i?(p(e,n,l,a,s),[l]):(p(e,n,e,0,s),[l,e])}close(t,n,r,i){let o;if(t===void 0)o=a;else if(typeof t!=`number`||!l(t))throw TypeError(`First argument must be a valid error code number`);else if(n===void 0||!n.length)o=Buffer.allocUnsafe(2),o.writeUInt16BE(t,0);else{let e=Buffer.byteLength(n);if(e>123)throw RangeError(`The message must not be greater than 123 bytes`);o=Buffer.allocUnsafe(2+e),o.writeUInt16BE(t,0),typeof n==`string`?o.write(n,2):o.set(n,2)}let s={[_]:o.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state===S?this.sendFrame(e.frame(o,s),i):this.enqueue([this.dispatch,o,!1,s,i])}ping(t,n,r){let i,a;if(typeof t==`string`?(i=Buffer.byteLength(t),a=!1):c(t)?(i=t.size,a=!1):(t=g(t),i=t.length,a=g.readOnly),i>125)throw RangeError(`The data size must not be greater than 125 bytes`);let o={[_]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:9,readOnly:a,rsv1:!1};c(t)?this._state===S?this.getBlobData(t,!1,o,r):this.enqueue([this.getBlobData,t,!1,o,r]):this._state===S?this.sendFrame(e.frame(t,o),r):this.enqueue([this.dispatch,t,!1,o,r])}pong(t,n,r){let i,a;if(typeof t==`string`?(i=Buffer.byteLength(t),a=!1):c(t)?(i=t.size,a=!1):(t=g(t),i=t.length,a=g.readOnly),i>125)throw RangeError(`The data size must not be greater than 125 bytes`);let o={[_]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:10,readOnly:a,rsv1:!1};c(t)?this._state===S?this.getBlobData(t,!1,o,r):this.enqueue([this.getBlobData,t,!1,o,r]):this._state===S?this.sendFrame(e.frame(t,o),r):this.enqueue([this.dispatch,t,!1,o,r])}send(e,t,n){let r=this._extensions[i.extensionName],a=t.binary?2:1,o=t.compress,s,l;typeof e==`string`?(s=Buffer.byteLength(e),l=!1):c(e)?(s=e.size,l=!1):(e=g(e),s=e.length,l=g.readOnly),this._firstFragment?(this._firstFragment=!1,o&&r&&r.params[r._isServer?`server_no_context_takeover`:`client_no_context_takeover`]&&(o=s>=r._threshold),this._compress=o):(o=!1,a=0),t.fin&&(this._firstFragment=!0);let u={[_]:s,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:a,readOnly:l,rsv1:o};c(e)?this._state===S?this.getBlobData(e,this._compress,u,n):this.enqueue([this.getBlobData,e,this._compress,u,n]):this._state===S?this.dispatch(e,this._compress,u,n):this.enqueue([this.dispatch,e,this._compress,u,n])}getBlobData(t,n,r,i){this._bufferedBytes+=r[_],this._state=w,t.arrayBuffer().then(t=>{if(this._socket.destroyed){let e=Error(`The socket was closed while the blob was being read`);process.nextTick(E,this,e,i);return}this._bufferedBytes-=r[_];let a=g(t);n?this.dispatch(a,n,r,i):(this._state=S,this.sendFrame(e.frame(a,r),i),this.dequeue())}).catch(e=>{process.nextTick(D,this,e,i)})}dispatch(t,n,r,a){if(!n){this.sendFrame(e.frame(t,r),a);return}let o=this._extensions[i.extensionName];this._bufferedBytes+=r[_],this._state=C,o.compress(t,r.fin,(t,n)=>{if(this._socket.destroyed){let e=Error(`The socket was closed while data was being compressed`);E(this,e,a);return}this._bufferedBytes-=r[_],this._state=S,r.readOnly=!1,this.sendFrame(e.frame(n,r),a),this.dequeue()})}dequeue(){for(;this._state===S&&this._queue.length;){let e=this._queue.shift();this._bufferedBytes-=e[3][_],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][_],this._queue.push(e)}sendFrame(e,t){e.length===2?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],t),this._socket.uncork()):this._socket.write(e[0],t)}};t.exports=T;function E(e,t,n){typeof n==`function`&&n(t);for(let n=0;n<e._queue.length;n++){let r=e._queue[n],i=r[r.length-1];typeof i==`function`&&i(t)}}function D(e,t,n){E(e,t,n),e.onerror(t)}}),v=s((exports,t)=>{let{kForOnEventAttribute:n,kListener:r}=d(),i=Symbol(`kCode`),a=Symbol(`kData`),o=Symbol(`kError`),s=Symbol(`kMessage`),c=Symbol(`kReason`),l=Symbol(`kTarget`),u=Symbol(`kType`),f=Symbol(`kWasClean`);var p=class{constructor(e){this[l]=null,this[u]=e}get target(){return this[l]}get type(){return this[u]}};Object.defineProperty(p.prototype,`target`,{enumerable:!0}),Object.defineProperty(p.prototype,`type`,{enumerable:!0});var m=class extends p{constructor(e,t={}){super(e),this[i]=t.code===void 0?0:t.code,this[c]=t.reason===void 0?``:t.reason,this[f]=t.wasClean===void 0?!1:t.wasClean}get code(){return this[i]}get reason(){return this[c]}get wasClean(){return this[f]}};Object.defineProperty(m.prototype,`code`,{enumerable:!0}),Object.defineProperty(m.prototype,`reason`,{enumerable:!0}),Object.defineProperty(m.prototype,`wasClean`,{enumerable:!0});var h=class extends p{constructor(e,t={}){super(e),this[o]=t.error===void 0?null:t.error,this[s]=t.message===void 0?``:t.message}get error(){return this[o]}get message(){return this[s]}};Object.defineProperty(h.prototype,`error`,{enumerable:!0}),Object.defineProperty(h.prototype,`message`,{enumerable:!0});var g=class extends p{constructor(e,t={}){super(e),this[a]=t.data===void 0?null:t.data}get data(){return this[a]}};Object.defineProperty(g.prototype,`data`,{enumerable:!0});let _={addEventListener(e,t,i={}){for(let a of this.listeners(e))if(!i[n]&&a[r]===t&&!a[n])return;let a;if(e===`message`)a=function(e,n){let r=new g(`message`,{data:n?e:e.toString()});r[l]=this,v(t,this,r)};else if(e===`close`)a=function(e,n){let r=new m(`close`,{code:e,reason:n.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[l]=this,v(t,this,r)};else if(e===`error`)a=function(e){let n=new h(`error`,{error:e,message:e.message});n[l]=this,v(t,this,n)};else if(e===`open`)a=function(){let e=new p(`open`);e[l]=this,v(t,this,e)};else return;a[n]=!!i[n],a[r]=t,i.once?this.once(e,a):this.on(e,a)},removeEventListener(e,t){for(let i of this.listeners(e))if(i[r]===t&&!i[n]){this.removeListener(e,i);break}}};t.exports={CloseEvent:m,ErrorEvent:h,Event:p,EventTarget:_,MessageEvent:g};function v(e,t,n){typeof e==`object`&&e.handleEvent?e.handleEvent.call(e,n):e.call(t,n)}}),y=s((exports,t)=>{let{tokenChars:n}=h();function r(e,t,n){e[t]===void 0?e[t]=[n]:e[t].push(n)}function i(e){let t=Object.create(null),i=Object.create(null),a=!1,o=!1,s=!1,c,l,u=-1,d=-1,f=-1,p=0;for(;p<e.length;p++)if(d=e.charCodeAt(p),c===void 0)if(f===-1&&n[d]===1)u===-1&&(u=p);else if(p!==0&&(d===32||d===9))f===-1&&u!==-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p);let n=e.slice(u,f);d===44?(r(t,n,i),i=Object.create(null)):c=n,u=f=-1}else throw SyntaxError(`Unexpected character at index ${p}`);else if(l===void 0)if(f===-1&&n[d]===1)u===-1&&(u=p);else if(d===32||d===9)f===-1&&u!==-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p),r(i,e.slice(u,f),!0),d===44&&(r(t,c,i),i=Object.create(null),c=void 0),u=f=-1}else if(d===61&&u!==-1&&f===-1)l=e.slice(u,p),u=f=-1;else throw SyntaxError(`Unexpected character at index ${p}`);else if(o){if(n[d]!==1)throw SyntaxError(`Unexpected character at index ${p}`);u===-1?u=p:a||=!0,o=!1}else if(s)if(n[d]===1)u===-1&&(u=p);else if(d===34&&u!==-1)s=!1,f=p;else if(d===92)o=!0;else throw SyntaxError(`Unexpected character at index ${p}`);else if(d===34&&e.charCodeAt(p-1)===61)s=!0;else if(f===-1&&n[d]===1)u===-1&&(u=p);else if(u!==-1&&(d===32||d===9))f===-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p);let n=e.slice(u,f);a&&(n=n.replace(/\\/g,``),a=!1),r(i,l,n),d===44&&(r(t,c,i),i=Object.create(null),c=void 0),l=void 0,u=f=-1}else throw SyntaxError(`Unexpected character at index ${p}`);if(u===-1||s||d===32||d===9)throw SyntaxError(`Unexpected end of input`);f===-1&&(f=p);let m=e.slice(u,f);return c===void 0?r(t,m,i):(l===void 0?r(i,m,!0):a?r(i,l,m.replace(/\\/g,``)):r(i,l,m),r(t,c,i)),t}function a(e){return Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>[t].concat(Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>e===!0?t:`${t}=${e}`).join(`; `)})).join(`; `)).join(`, `)}).join(`, `)}t.exports={format:a,parse:i}}),b=s((exports,t)=>{let n=u(`events`),r=u(`https`),i=u(`http`),a=u(`net`),o=u(`tls`),{randomBytes:s,createHash:c}=u(`crypto`),{Duplex:l,Readable:p}=u(`stream`),{URL:b}=u(`url`),x=m(),S=g(),C=_(),{isBlob:w}=h(),{BINARY_TYPES:T,CLOSE_TIMEOUT:E,EMPTY_BUFFER:D,GUID:O,kForOnEventAttribute:k,kListener:A,kStatusCode:j,kWebSocket:M,NOOP:N}=d(),{EventTarget:{addEventListener:P,removeEventListener:F}}=v(),{format:ee,parse:te}=y(),{toBuffer:ne}=f(),I=Symbol(`kAborted`),L=[8,13],R=[`CONNECTING`,`OPEN`,`CLOSING`,`CLOSED`],z=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;var B=class e extends n{constructor(t,n,r){super(),this._binaryType=T[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=D,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol=``,this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,t===null?(this._autoPong=r.autoPong,this._closeTimeout=r.closeTimeout,this._isServer=!0):(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,n===void 0?n=[]:Array.isArray(n)||(typeof n==`object`&&n?(r=n,n=[]):n=[n]),V(this,t,n,r))}get binaryType(){return this._binaryType}set binaryType(e){T.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,n,r){let i=new S({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),a=new C(t,this._extensions,r.generateMask);this._receiver=i,this._sender=a,this._socket=t,i[M]=this,a[M]=this,t[M]=this,i.on(`conclude`,re),i.on(`drain`,ie),i.on(`error`,ae),i.on(`message`,oe),i.on(`ping`,se),i.on(`pong`,ce),a.onerror=le,t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),n.length>0&&t.unshift(n),t.on(`close`,X),t.on(`data`,Z),t.on(`end`,Q),t.on(`error`,$),this._readyState=e.OPEN,this.emit(`open`)}emitClose(){if(!this._socket){this._readyState=e.CLOSED,this.emit(`close`,this._closeCode,this._closeMessage);return}this._extensions[x.extensionName]&&this._extensions[x.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit(`close`,this._closeCode,this._closeMessage)}close(t,n){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){let e=`WebSocket was closed before the connection was established`;G(this,this._req,e);return}if(this.readyState===e.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=e.CLOSING,this._sender.close(t,n,!this._isServer,e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),Y(this)}}pause(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!0,this._socket.pause())}ping(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof t==`function`?(r=t,t=n=void 0):typeof n==`function`&&(r=n,n=void 0),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){K(this,t,r);return}n===void 0&&(n=!this._isServer),this._sender.ping(t||D,n,r)}pong(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof t==`function`?(r=t,t=n=void 0):typeof n==`function`&&(r=n,n=void 0),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){K(this,t,r);return}n===void 0&&(n=!this._isServer),this._sender.pong(t||D,n,r)}resume(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof n==`function`&&(r=n,n={}),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){K(this,t,r);return}let i={binary:typeof t!=`string`,mask:!this._isServer,compress:!0,fin:!0,...n};this._extensions[x.extensionName]||(i.compress=!1),this._sender.send(t||D,i,r)}terminate(){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){let e=`WebSocket was closed before the connection was established`;G(this,this._req,e);return}this._socket&&(this._readyState=e.CLOSING,this._socket.destroy())}}};Object.defineProperty(B,`CONNECTING`,{enumerable:!0,value:R.indexOf(`CONNECTING`)}),Object.defineProperty(B.prototype,`CONNECTING`,{enumerable:!0,value:R.indexOf(`CONNECTING`)}),Object.defineProperty(B,`OPEN`,{enumerable:!0,value:R.indexOf(`OPEN`)}),Object.defineProperty(B.prototype,`OPEN`,{enumerable:!0,value:R.indexOf(`OPEN`)}),Object.defineProperty(B,`CLOSING`,{enumerable:!0,value:R.indexOf(`CLOSING`)}),Object.defineProperty(B.prototype,`CLOSING`,{enumerable:!0,value:R.indexOf(`CLOSING`)}),Object.defineProperty(B,`CLOSED`,{enumerable:!0,value:R.indexOf(`CLOSED`)}),Object.defineProperty(B.prototype,`CLOSED`,{enumerable:!0,value:R.indexOf(`CLOSED`)}),[`binaryType`,`bufferedAmount`,`extensions`,`isPaused`,`protocol`,`readyState`,`url`].forEach(e=>{Object.defineProperty(B.prototype,e,{enumerable:!0})}),[`open`,`error`,`close`,`message`].forEach(e=>{Object.defineProperty(B.prototype,`on${e}`,{enumerable:!0,get(){for(let t of this.listeners(e))if(t[k])return t[A];return null},set(t){for(let t of this.listeners(e))if(t[k]){this.removeListener(e,t);break}typeof t==`function`&&this.addEventListener(e,t,{[k]:!0})}})}),B.prototype.addEventListener=P,B.prototype.removeEventListener=F,t.exports=B;function V(e,t,n,a){let o={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:E,protocolVersion:L[1],maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...a,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:`GET`,host:void 0,path:void 0,port:void 0};if(e._autoPong=o.autoPong,e._closeTimeout=o.closeTimeout,!L.includes(o.protocolVersion))throw RangeError(`Unsupported protocol version: ${o.protocolVersion} (supported versions: ${L.join(`, `)})`);let l;if(t instanceof b)l=t;else try{l=new b(t)}catch{throw SyntaxError(`Invalid URL: ${t}`)}l.protocol===`http:`?l.protocol=`ws:`:l.protocol===`https:`&&(l.protocol=`wss:`),e._url=l.href;let u=l.protocol===`wss:`,d=l.protocol===`ws+unix:`,f;if(l.protocol!==`ws:`&&!u&&!d?f=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:d&&!l.pathname?f=`The URL's pathname is empty`:l.hash&&(f=`The URL contains a fragment identifier`),f){let t=SyntaxError(f);if(e._redirects===0)throw t;H(e,t);return}let p=u?443:80,m=s(16).toString(`base64`),h=u?r.request:i.request,g=new Set,_;if(o.createConnection=o.createConnection||(u?W:U),o.defaultPort=o.defaultPort||p,o.port=l.port||p,o.host=l.hostname.startsWith(`[`)?l.hostname.slice(1,-1):l.hostname,o.headers={...o.headers,"Sec-WebSocket-Version":o.protocolVersion,"Sec-WebSocket-Key":m,Connection:`Upgrade`,Upgrade:`websocket`},o.path=l.pathname+l.search,o.timeout=o.handshakeTimeout,o.perMessageDeflate&&(_=new x({...o.perMessageDeflate,isServer:!1,maxPayload:o.maxPayload}),o.headers[`Sec-WebSocket-Extensions`]=ee({[x.extensionName]:_.offer()})),n.length){for(let e of n){if(typeof e!=`string`||!z.test(e)||g.has(e))throw SyntaxError(`An invalid or duplicated subprotocol was specified`);g.add(e)}o.headers[`Sec-WebSocket-Protocol`]=n.join(`,`)}if(o.origin&&(o.protocolVersion<13?o.headers[`Sec-WebSocket-Origin`]=o.origin:o.headers.Origin=o.origin),(l.username||l.password)&&(o.auth=`${l.username}:${l.password}`),d){let e=o.path.split(`:`);o.socketPath=e[0],o.path=e[1]}let v;if(o.followRedirects){if(e._redirects===0){e._originalIpc=d,e._originalSecure=u,e._originalHostOrSocketPath=d?o.socketPath:l.host;let t=a&&a.headers;if(a={...a,headers:{}},t)for(let[e,n]of Object.entries(t))a.headers[e.toLowerCase()]=n}else if(e.listenerCount(`redirect`)===0){let t=d?e._originalIpc?o.socketPath===e._originalHostOrSocketPath:!1:e._originalIpc?!1:l.host===e._originalHostOrSocketPath;(!t||e._originalSecure&&!u)&&(delete o.headers.authorization,delete o.headers.cookie,t||delete o.headers.host,o.auth=void 0)}o.auth&&!a.headers.authorization&&(a.headers.authorization=`Basic `+Buffer.from(o.auth).toString(`base64`)),v=e._req=h(o),e._redirects&&e.emit(`redirect`,e.url,v)}else v=e._req=h(o);o.timeout&&v.on(`timeout`,()=>{G(e,v,`Opening handshake has timed out`)}),v.on(`error`,t=>{v===null||v[I]||(v=e._req=null,H(e,t))}),v.on(`response`,r=>{let i=r.headers.location,s=r.statusCode;if(i&&o.followRedirects&&s>=300&&s<400){if(++e._redirects>o.maxRedirects){G(e,v,`Maximum redirects exceeded`);return}v.abort();let r;try{r=new b(i,t)}catch{let t=SyntaxError(`Invalid URL: ${i}`);H(e,t);return}V(e,r,n,a)}else e.emit(`unexpected-response`,v,r)||G(e,v,`Unexpected server response: ${r.statusCode}`)}),v.on(`upgrade`,(t,n,r)=>{if(e.emit(`upgrade`,t),e.readyState!==B.CONNECTING)return;v=e._req=null;let i=t.headers.upgrade;if(i===void 0||i.toLowerCase()!==`websocket`){G(e,n,`Invalid Upgrade header`);return}let a=c(`sha1`).update(m+O).digest(`base64`);if(t.headers[`sec-websocket-accept`]!==a){G(e,n,`Invalid Sec-WebSocket-Accept header`);return}let s=t.headers[`sec-websocket-protocol`],l;if(s===void 0?g.size&&(l=`Server sent no subprotocol`):g.size?g.has(s)||(l=`Server sent an invalid subprotocol`):l=`Server sent a subprotocol but none was requested`,l){G(e,n,l);return}s&&(e._protocol=s);let u=t.headers[`sec-websocket-extensions`];if(u!==void 0){if(!_){let t=`Server sent a Sec-WebSocket-Extensions header but no extension was requested`;G(e,n,t);return}let t;try{t=te(u)}catch{let t=`Invalid Sec-WebSocket-Extensions header`;G(e,n,t);return}let r=Object.keys(t);if(r.length!==1||r[0]!==x.extensionName){let t=`Server indicated an extension that was not requested`;G(e,n,t);return}try{_.accept(t[x.extensionName])}catch{let t=`Invalid Sec-WebSocket-Extensions header`;G(e,n,t);return}e._extensions[x.extensionName]=_}e.setSocket(n,r,{allowSynchronousEvents:o.allowSynchronousEvents,generateMask:o.generateMask,maxPayload:o.maxPayload,skipUTF8Validation:o.skipUTF8Validation})}),o.finishRequest?o.finishRequest(v,e):v.end()}function H(e,t){e._readyState=B.CLOSING,e._errorEmitted=!0,e.emit(`error`,t),e.emitClose()}function U(e){return e.path=e.socketPath,a.connect(e)}function W(e){return e.path=void 0,!e.servername&&e.servername!==``&&(e.servername=a.isIP(e.host)?``:e.host),o.connect(e)}function G(e,t,n){e._readyState=B.CLOSING;let r=Error(n);Error.captureStackTrace(r,G),t.setHeader?(t[I]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick(H,e,r)):(t.destroy(r),t.once(`error`,e.emit.bind(e,`error`)),t.once(`close`,e.emitClose.bind(e)))}function K(e,t,n){if(t){let n=w(t)?t.size:ne(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(n){let t=Error(`WebSocket is not open: readyState ${e.readyState} (${R[e.readyState]})`);process.nextTick(n,t)}}function re(e,t){let n=this[M];n._closeFrameReceived=!0,n._closeMessage=t,n._closeCode=e,n._socket[M]!==void 0&&(n._socket.removeListener(`data`,Z),process.nextTick(J,n._socket),e===1005?n.close():n.close(e,t))}function ie(){let e=this[M];e.isPaused||e._socket.resume()}function ae(e){let t=this[M];t._socket[M]!==void 0&&(t._socket.removeListener(`data`,Z),process.nextTick(J,t._socket),t.close(e[j])),t._errorEmitted||(t._errorEmitted=!0,t.emit(`error`,e))}function q(){this[M].emitClose()}function oe(e,t){this[M].emit(`message`,e,t)}function se(e){let t=this[M];t._autoPong&&t.pong(e,!this._isServer,N),t.emit(`ping`,e)}function ce(e){this[M].emit(`pong`,e)}function J(e){e.resume()}function le(e){let t=this[M];t.readyState!==B.CLOSED&&(t.readyState===B.OPEN&&(t._readyState=B.CLOSING,Y(t)),this._socket.end(),t._errorEmitted||(t._errorEmitted=!0,t.emit(`error`,e)))}function Y(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),e._closeTimeout)}function X(){let e=this[M];if(this.removeListener(`close`,X),this.removeListener(`data`,Z),this.removeListener(`end`,Q),e._readyState=B.CLOSING,!this._readableState.endEmitted&&!e._closeFrameReceived&&!e._receiver._writableState.errorEmitted&&this._readableState.length!==0){let t=this.read(this._readableState.length);e._receiver.write(t)}e._receiver.end(),this[M]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on(`error`,q),e._receiver.on(`finish`,q))}function Z(e){this[M]._receiver.write(e)||this.pause()}function Q(){let e=this[M];e._readyState=B.CLOSING,e._receiver.end(),this.end()}function $(){let e=this[M];this.removeListener(`error`,$),this.on(`error`,N),e&&(e._readyState=B.CLOSING,this.destroy())}}),x=l(b(),1),S=s((exports,t)=>{let n=b(),{Duplex:r}=u(`stream`);function i(e){e.emit(`close`)}function a(){!this.destroyed&&this._writableState.finished&&this.destroy()}function o(e){this.removeListener(`error`,o),this.destroy(),this.listenerCount(`error`)===0&&this.emit(`error`,e)}function s(e,t){let n=!0,s=new r({...t,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return e.on(`message`,function(t,n){let r=!n&&s._readableState.objectMode?t.toString():t;s.push(r)||e.pause()}),e.once(`error`,function(e){s.destroyed||(n=!1,s.destroy(e))}),e.once(`close`,function(){s.destroyed||s.push(null)}),s._destroy=function(t,r){if(e.readyState===e.CLOSED){r(t),process.nextTick(i,s);return}let a=!1;e.once(`error`,function(e){a=!0,r(e)}),e.once(`close`,function(){a||r(t),process.nextTick(i,s)}),n&&e.terminate()},s._final=function(t){if(e.readyState===e.CONNECTING){e.once(`open`,function(){s._final(t)});return}e._socket!==null&&(e._socket._writableState.finished?(t(),s._readableState.endEmitted&&s.destroy()):(e._socket.once(`finish`,function(){t()}),e.close()))},s._read=function(){e.isPaused&&e.resume()},s._write=function(t,n,r){if(e.readyState===e.CONNECTING){e.once(`open`,function(){s._write(t,n,r)});return}e.send(t,r)},s.on(`end`,a),s.on(`error`,o),s}t.exports=s}),C=s((exports,t)=>{let{tokenChars:n}=h();function r(e){let t=new Set,r=-1,i=-1,a=0;for(;a<e.length;a++){let o=e.charCodeAt(a);if(i===-1&&n[o]===1)r===-1&&(r=a);else if(a!==0&&(o===32||o===9))i===-1&&r!==-1&&(i=a);else if(o===44){if(r===-1)throw SyntaxError(`Unexpected character at index ${a}`);i===-1&&(i=a);let n=e.slice(r,i);if(t.has(n))throw SyntaxError(`The "${n}" subprotocol is duplicated`);t.add(n),r=i=-1}else throw SyntaxError(`Unexpected character at index ${a}`)}if(r===-1||i!==-1)throw SyntaxError(`Unexpected end of input`);let o=e.slice(r,a);if(t.has(o))throw SyntaxError(`The "${o}" subprotocol is duplicated`);return t.add(o),t}t.exports={parse:r}}),w=s((exports,t)=>{let n=u(`events`),r=u(`http`),{Duplex:i}=u(`stream`),{createHash:a}=u(`crypto`),o=y(),s=m(),c=C(),l=b(),{CLOSE_TIMEOUT:f,GUID:p,kWebSocket:h}=d(),g=/^[+/0-9A-Za-z]{22}==$/,_=0,v=1,x=2;var S=class extends n{constructor(e,t){if(super(),e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:f,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:l,...e},e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer)throw TypeError(`One and only one of the "port", "server", or "noServer" options must be specified`);if(e.port==null?e.server&&(this._server=e.server):(this._server=r.createServer((e,t)=>{let n=r.STATUS_CODES[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":`text/plain`}),t.end(n)}),this._server.listen(e.port,e.host,e.backlog,t)),this._server){let e=this.emit.bind(this,`connection`);this._removeListeners=w(this._server,{listening:this.emit.bind(this,`listening`),error:this.emit.bind(this,`error`),upgrade:(t,n,r)=>{this.handleUpgrade(t,n,r,e)}})}e.perMessageDeflate===!0&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=_}address(){if(this.options.noServer)throw Error(`The server is operating in "noServer" mode`);return this._server?this._server.address():null}close(e){if(this._state===x){e&&this.once(`close`,()=>{e(Error(`The server is not running`))}),process.nextTick(T,this);return}if(e&&this.once(`close`,e),this._state!==v)if(this._state=v,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(T,this);else{let e=this._server;this._removeListeners(),this._removeListeners=this._server=null,e.close(()=>{T(this)})}}shouldHandle(e){if(this.options.path){let t=e.url.indexOf(`?`),n=t===-1?e.url:e.url.slice(0,t);if(n!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on(`error`,E);let i=e.headers[`sec-websocket-key`],a=e.headers.upgrade,l=+e.headers[`sec-websocket-version`];if(e.method!==`GET`){let n=`Invalid HTTP method`;O(this,e,t,405,n);return}if(a===void 0||a.toLowerCase()!==`websocket`){let n=`Invalid Upgrade header`;O(this,e,t,400,n);return}if(i===void 0||!g.test(i)){let n=`Missing or invalid Sec-WebSocket-Key header`;O(this,e,t,400,n);return}if(l!==13&&l!==8){let n=`Missing or invalid Sec-WebSocket-Version header`;O(this,e,t,400,n,{"Sec-WebSocket-Version":`13, 8`});return}if(!this.shouldHandle(e)){D(t,400);return}let u=e.headers[`sec-websocket-protocol`],d=new Set;if(u!==void 0)try{d=c.parse(u)}catch{let n=`Invalid Sec-WebSocket-Protocol header`;O(this,e,t,400,n);return}let f=e.headers[`sec-websocket-extensions`],p={};if(this.options.perMessageDeflate&&f!==void 0){let n=new s({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let e=o.parse(f);e[s.extensionName]&&(n.accept(e[s.extensionName]),p[s.extensionName]=n)}catch{let n=`Invalid or unacceptable Sec-WebSocket-Extensions header`;O(this,e,t,400,n);return}}if(this.options.verifyClient){let a={origin:e.headers[`${l===8?`sec-websocket-origin`:`origin`}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(a,(a,o,s,c)=>{if(!a)return D(t,o||401,s,c);this.completeUpgrade(p,i,d,e,t,n,r)});return}if(!this.options.verifyClient(a))return D(t,401)}this.completeUpgrade(p,i,d,e,t,n,r)}completeUpgrade(e,t,n,r,i,c,l){if(!i.readable||!i.writable)return i.destroy();if(i[h])throw Error(`server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration`);if(this._state>_)return D(i,503);let u=a(`sha1`).update(t+p).digest(`base64`),d=[`HTTP/1.1 101 Switching Protocols`,`Upgrade: websocket`,`Connection: Upgrade`,`Sec-WebSocket-Accept: ${u}`],f=new this.options.WebSocket(null,void 0,this.options);if(n.size){let e=this.options.handleProtocols?this.options.handleProtocols(n,r):n.values().next().value;e&&(d.push(`Sec-WebSocket-Protocol: ${e}`),f._protocol=e)}if(e[s.extensionName]){let t=e[s.extensionName].params,n=o.format({[s.extensionName]:[t]});d.push(`Sec-WebSocket-Extensions: ${n}`),f._extensions=e}this.emit(`headers`,d,r),i.write(d.concat(`\r
2
+ `).join(`\r
3
+ `)),i.removeListener(`error`,E),f.setSocket(i,c,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(f),f.on(`close`,()=>{this.clients.delete(f),this._shouldEmitClose&&!this.clients.size&&process.nextTick(T,this)})),l(f,r)}};t.exports=S;function w(e,t){for(let n of Object.keys(t))e.on(n,t[n]);return function(){for(let n of Object.keys(t))e.removeListener(n,t[n])}}function T(e){e._state=x,e.emit(`close`)}function E(){this.destroy()}function D(e,t,n,i){n||=r.STATUS_CODES[t],i={Connection:`close`,"Content-Type":`text/html`,"Content-Length":Buffer.byteLength(n),...i},e.once(`finish`,e.destroy),e.end(`HTTP/1.1 ${t} ${r.STATUS_CODES[t]}\r\n`+Object.keys(i).map(e=>`${e}: ${i[e]}`).join(`\r
4
+ `)+`\r
5
+ \r
6
+ `+n)}function O(e,t,n,r,i,a){if(e.listenerCount(`wsClientError`)){let r=Error(i);Error.captureStackTrace(r,O),e.emit(`wsClientError`,r,n,t)}else D(n,r,i,a)}}),T=x.default,E=x.default;export{E as WebSocket,T as default};
@@ -0,0 +1 @@
1
+ const e=[500,1e3,2e3,4e3,8e3,16e3,32e3,6e4];let t=null;async function n(){if(t)return t;let e=globalThis.WebSocket;if(typeof e==`function`)return t=e,e;try{let e=await import(`./wrapper-U9nLhCpo.js`),n=e.default??e.WebSocket;if(!n)throw Error(`ws package missing default export`);return t=n,n}catch(e){throw Error(`WebSocket unavailable: install Node 22+ or add the 'ws' dependency (${e.message})`)}}function r(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??Error(`aborted`));return}let i=setTimeout(()=>{t?.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(t?.reason??Error(`aborted`))};t?.addEventListener(`abort`,a,{once:!0})})}function i(t){return e[Math.min(t-1,e.length-1)]??6e4}function a(e,t){if(!t)return e;let n=e.includes(`?`)?`&`:`?`;return`${e}${n}access_token=${encodeURIComponent(t)}`}async function o(e,t,n,r){let i=a(e,n),o;try{o=n?new t(i,{headers:{Authorization:`Bearer ${n}`}}):new t(i)}catch(e){throw Error(`ws connect failed: ${e.message}`)}return await new Promise((e,t)=>{let n=!1,i=()=>{n||(n=!0,c(),e({socket:o,open:!0}))},a=e=>{if(n)return;n=!0,c();let r=e?.message??(typeof e==`string`?e:`ws connection error`);t(Error(r))},s=()=>{if(!n){n=!0,c();try{o.close()}catch{}t(r?.reason??Error(`aborted`))}},c=()=>{o.onopen=null,o.onerror=null,r?.removeEventListener(`abort`,s)};o.onopen=i,o.onerror=a,r?.addEventListener(`abort`,s,{once:!0})})}async function*s(e){let t=e.webSocketImpl??await n(),a=e.pingIntervalMs??3e4,s=e.maxReconnectAttempts??10,c=0;for(;;){if(e.signal?.aborted)return;let n;try{n=await o(e.url,t,e.bearer,e.signal)}catch(t){if(e.signal?.aborted)return;if(c++,c>s)throw t;let n=i(c);e.onReconnect?.(c,n);try{await r(n,e.signal)}catch{return}continue}yield{type:`open`};let l=[],u=[],d=!1,f=Date.now(),p=!1,m=e=>{f=Date.now();let t=u.shift();t?t(e):l.push(e)},h=()=>{if(!d)for(d=!0;u.length;)u.shift()(null)};n.socket.onmessage=e=>{m({type:`message`,data:e.data})},n.socket.onclose=()=>{m({type:`close`}),h()},n.socket.onerror=e=>{let t=e?.message??`ws error`;m({type:`error`,data:t})};let g=()=>{try{n.socket.close()}catch{}h()};e.signal?.addEventListener(`abort`,g,{once:!0});let _=null;a>0&&(_=setInterval(()=>{if(Date.now()-f>a*1.5){try{n.socket.close()}catch{}h()}},Math.max(1e3,Math.floor(a/2))));try{for(;;){if(e.signal?.aborted)return;let t;if(t=l.length>0?l.shift():d?null:await new Promise(e=>u.push(e)),t===null||(t.type===`message`&&(p=!0),yield t,t.type===`close`))break}}finally{_&&clearInterval(_),e.signal?.removeEventListener(`abort`,g);try{n.socket.close()}catch{}}if(e.signal?.aborted)return;if(p&&(c=0),c++,c>s)throw Error(`ws connection exceeded reconnect cap`);let v=i(c);e.onReconnect?.(c,v);try{await r(v,e.signal)}catch{return}}}var c=class{opts;ac=null;socket=null;running=!1;constructor(e){this.opts=e}async start(e){this.running=!0,this.ac=new AbortController;let t=l(this.ac.signal,this.opts.signal),a=this.opts.webSocketImpl??await n(),s=this.opts.maxReconnectAttempts??10,c=0;for(;this.running;){if(t.aborted)return;let n;try{n=await o(this.opts.url,a,this.opts.bearer,t)}catch(e){if(t.aborted)return;if(c++,c>s)throw e;let n=i(c);this.opts.onReconnect?.(c,n);try{await r(n,t)}catch{return}continue}this.socket=n.socket;let l=!1;if(await new Promise(r=>{n.socket.onmessage=t=>{l=!0;let r=typeof t.data==`string`?t.data:String(t.data),i=null;try{i=JSON.parse(r)}catch{return}!i||typeof i.correlationId!=`string`||e(i).then(e=>{let t={correlationId:i.correlationId,status:e.status,headers:e.headers,body:e.body};try{n.socket.send(JSON.stringify(t))}catch{}}).catch(e=>{let t={correlationId:i.correlationId,status:502,body:JSON.stringify({error:e.message})};try{n.socket.send(JSON.stringify(t))}catch{}})},n.socket.onclose=()=>r(),n.socket.onerror=()=>r(),t.addEventListener(`abort`,()=>{try{n.socket.close()}catch{}r()},{once:!0})}),this.socket=null,t.aborted||!this.running)return;if(l&&(c=0),c++,c>s)throw Error(`ws tunnel exceeded reconnect cap`);let u=i(c);this.opts.onReconnect?.(c,u);try{await r(u,t)}catch{return}}}async stop(){this.running=!1,this.ac?.abort();try{this.socket?.close()}catch{}this.socket=null}};function l(e,t){if(!t)return e;let n=new AbortController,r=()=>n.abort(e.reason),i=()=>n.abort(t.reason);return e.aborted?n.abort(e.reason):e.addEventListener(`abort`,r,{once:!0}),t.aborted?n.abort(t.reason):t.addEventListener(`abort`,i,{once:!0}),n.signal}export{c as WsTunnelClient,s as connectWs};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenovay/cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Zenovay CLI — AI install wizard + full terminal analytics dashboard",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,11 +0,0 @@
1
- import{readConfig as e}from"./formatter-CEeFGNXS.js";import{ApiClient as t,readToken as n}from"./api-B7QWXBbG.js";import{parseSseStream as r}from"./client-ClN0aAAQ.js";import{emit as i,isHeadless as a}from"./emit-CbAMzl5f.js";import{initCommand as o}from"./init-PAKqEfEt.js";import"./login-CCbw5DxV.js";import{Panel as s}from"./panel-s0DHmKcg.js";import"./keybar-D2LIBUlF.js";import{Select as c}from"./prompt-C1qNVY6f.js";import l from"node:path";import{promises as u}from"node:fs";import{Box as d,Text as f,render as p}from"ink";import m from"react";import{globby as h}from"globby";const g=[`@zenovay/tracker`,`@zenovay/next`,`@zenovay/nuxt`,`@zenovay/svelte`,`@zenovay/astro`,`@zenovay/remix`,`@zenovay/node`],_=[`zenovay.config.ts`,`zenovay.config.js`,`zenovay.config.mjs`,`zenovay.config.json`],v=/api\.zenovay\.com\/z\.js|cdn\.zenovay\.com\/t\.js/,y=/data-zenovay-site|data-id\s*=\s*"ZV_/;async function b(e){let t=[],n={installed:!1,reasons:t};try{let r=await u.readFile(l.join(e,`package.json`),`utf8`),i=JSON.parse(r),a={...i.dependencies,...i.devDependencies};for(let e of g)if(e in a){t.push(`dep:${e}`),n.packageMarker=e,n.installed=!0;break}}catch{}for(let r of _)try{await u.access(l.join(e,r)),t.push(`config:${r}`),n.configFile=r,n.installed=!0;break}catch{}try{let r=await h([`**/*.{html,htm,tsx,jsx,vue,svelte,astro,ts,js,mjs}`,`!node_modules/**`,`!.git/**`,`!dist/**`,`!.next/**`,`!.nuxt/**`,`!build/**`,`!.output/**`],{cwd:e,gitignore:!0,deep:4,absolute:!0});for(let i of r.slice(0,200))try{let r=await u.readFile(i,`utf8`);if(v.test(r)||y.test(r)){t.push(`script:${l.relative(e,i)}`),n.scriptFile=l.relative(e,i),n.installed=!0;break}}catch{}}catch{}return n}async function x(e){let t=await b(e.cwd),n;if(e.mode)n=e.mode;else if(!t.installed)n=`install`;else if(a(e))return i({type:`error`,code:`no_mode`,message:`Headless mode requires --mode chat|mcp|install`}),2;else n=await S(t);return n===`install`?o({cliVersion:e.cliVersion,cwd:e.cwd,json:e.json}):n===`chat`?C(e):w(e)}async function S(e){return new Promise(t=>{let n=[{label:`Chat with your analytics`,value:`chat`,description:`Ask natural-language questions about your data`},{label:`Manage via MCP`,value:`mcp`,description:`Create goals, funnels, sites, etc. in plain English`},{label:`Re-run install / repair`,value:`install`,description:`Run the install wizard again`}],{unmount:r}=p(m.createElement(d,{flexDirection:`column`},m.createElement(s,{title:`Zenovay detected${e.packageMarker?` (${e.packageMarker})`:``}`,state:`idle`},m.createElement(f,null,`What do you want to do?`)),m.createElement(c,{items:n,onSelect:e=>{r(),t(e)}})))})}async function C(i){let a=await e(),o=await n({strict:!1});if(!o)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new t({config:a,cliVersion:i.cliVersion,token:o});process.stdout.write(`
2
- Zenovay · chat mode — type your question then press Enter. Ctrl-C to exit.
3
-
4
- > `);let c=await T();if(!c)return 0;let l=await s.openAiStream(`chat`,{messages:[{role:`user`,content:c}]});for await(let e of r(l)){if(e.type===`delta`&&process.stdout.write(e.content),e.type===`done`){process.stdout.write(`
5
- `);break}if(e.type===`error`)return process.stderr.write(`\n[${e.code}] ${e.message}\n`),1}return 0}async function w(i){let a=await e(),o=await n({strict:!1});if(!o)return process.stderr.write("Not logged in — run `zenovay login` first.\n"),2;let s=new t({config:a,cliVersion:i.cliVersion,token:o});process.stdout.write(`
6
- Zenovay · MCP mode — describe what you want to create or change. Ctrl-C to exit.
7
-
8
- > `);let c=await T();if(!c)return 0;let l=await s.openAiStream(`mcp`,{messages:[{role:`user`,content:c}]});for await(let e of r(l)){if(e.type===`delta`&&process.stdout.write(e.content),e.type===`tool_start`&&process.stdout.write(`\n[tool: ${e.name}] `),e.type===`tool_result`&&process.stdout.write(`
9
- [result]`),e.type===`done`){process.stdout.write(`
10
- `);break}if(e.type===`error`)return process.stderr.write(`\n[${e.code}] ${e.message}\n`),1}return 0}function T(){return new Promise(e=>{let t=``,n=r=>{let i=r.toString(`utf8`);i.includes(`
11
- `)||i.includes(`\r`)?(t+=i.replace(/[\r\n]/g,``),process.stdin.off(`data`,n),process.stdin.pause(),e(t)):t+=i};process.stdin.resume(),process.stdin.on(`data`,n)})}export{x as aiCommand};
@@ -1 +0,0 @@
1
- import{configDir as e}from"./formatter-CEeFGNXS.js";import t from"node:path";import{promises as n}from"node:fs";import{z as r}from"zod";const i=r.object({accessToken:r.string().min(1),refreshToken:r.string().min(1),expiresAt:r.number(),tokenType:r.literal(`Bearer`).default(`Bearer`),scope:r.string().optional(),userId:r.string().optional(),teamId:r.string().optional(),email:r.string().email().optional(),region:r.string().optional(),cliVersionAtIssue:r.string().optional()});function a(){return t.join(e(),`auth.json`)}async function o(e){let r=a(),o;try{o=await n.stat(r)}catch(e){if(e.code===`ENOENT`)return null;throw e}if(process.platform!==`win32`){let n=o.mode&511;if(n&63){let i=e?.strict??!0;if(i)throw Error(`Refusing to read ${r}: file has insecure permissions ${n.toString(8).padStart(3,`0`)} (expected 600). Fix: chmod 600 "${r}" && chmod 700 "${t.dirname(r)}"`)}}let s=await n.readFile(r,`utf8`),c;try{c=JSON.parse(s)}catch{throw Error(`Auth file at ${r} is not valid JSON. Run \`zenovay login\` again.`)}let l=i.safeParse(c);if(!l.success)throw Error(`Auth file at ${r} is malformed. Run \`zenovay login\` again.`);return l.data}async function s(t){let r=e();await n.mkdir(r,{recursive:!0,mode:448});let o=a(),s=i.parse(t),c=JSON.stringify(s,null,2);if(await n.writeFile(o,c,{mode:384}),process.platform!==`win32`){await n.chmod(o,384);try{await n.chmod(r,448)}catch{}}}async function c(){try{await n.unlink(a())}catch(e){if(e.code!==`ENOENT`)throw e}}function l(e,t=3e4){return Date.now()>=e.expiresAt-t}const u=r.object({device_code:r.string(),user_code:r.string(),verification_uri:r.string().url(),verification_uri_complete:r.string().url().optional(),expires_in:r.number().int().positive(),interval:r.number().int().positive().default(5)}),d=r.object({access_token:r.string(),refresh_token:r.string(),token_type:r.literal(`Bearer`).default(`Bearer`),expires_in:r.number().int().positive(),scope:r.string().optional()}),f=r.object({error:r.enum([`authorization_pending`,`slow_down`,`access_denied`,`expired_token`,`invalid_client`,`invalid_grant`,`invalid_scope`]),error_description:r.string().optional()});async function p(e){let{apiBase:t,clientId:n=`cli-zenovay`,scope:r=`cli:full`}=e,i=e.fetchImpl??fetch,a=new URLSearchParams({client_id:n,scope:r}),o=await i(`${t}/oauth/device_authorization`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:a.toString()});if(!o.ok){let e=await o.text();throw Error(`Device authorization failed: ${o.status} ${e}`)}let s=await o.json();return u.parse(s)}async function m(e){let{apiBase:t,deviceCode:n,clientId:r=`cli-zenovay`,expiresIn:i}=e,a=e.fetchImpl??fetch,o=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),s=e.interval,c=Date.now(),l=c+i*1e3;for(;Date.now()<l;){if(e.signal?.aborted)throw Error(`Polling aborted`);await o(s*1e3),e.onTick?.(Date.now()-c);let i=new URLSearchParams({grant_type:`urn:ietf:params:oauth:grant-type:device_code`,device_code:n,client_id:r}),l=await a(`${t}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:i.toString()}),u=await l.json().catch(()=>({}));if(l.ok){let e=d.parse(u);return{accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:Date.now()+e.expires_in*1e3,tokenType:`Bearer`,scope:e.scope}}let p=f.safeParse(u);if(!p.success)throw Error(`Token poll failed (${l.status}): ${JSON.stringify(u)}`);let{error:m}=p.data;if(m!==`authorization_pending`){if(m===`slow_down`){s=Math.min(s*2,30);continue}throw m===`access_denied`?Error(`Device authorization denied by user.`):m===`expired_token`?Error("Device code expired — run `zenovay login` again."):Error(`Device token error: ${m}`)}}throw Error("Device code expired — run `zenovay login` again.")}async function h(e){let t=await o({strict:!0});return t?l(t)?g(t,e):t:null}async function g(e,t){let{apiBase:n,clientId:r=`cli-zenovay`}=t,i=t.fetchImpl??fetch,a=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e.refreshToken,client_id:r}),o=await i(`${n}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:a.toString()}),l=await o.json().catch(()=>({}));if(!o.ok){let e=l&&typeof l==`object`&&`error`in l?l.error:String(l);throw e===`invalid_grant`?(await c(),Error("Refresh token rejected by server — your session has been revoked. Run `zenovay login` again.")):Error(`Token refresh failed (${o.status}): ${JSON.stringify(l)}`)}let u=d.parse(l),f={...e,accessToken:u.access_token,refreshToken:u.refresh_token,expiresAt:Date.now()+u.expires_in*1e3,tokenType:`Bearer`,scope:u.scope??e.scope};return await s(f),f}const _=r.object({id:r.string(),name:r.string(),url:r.string().url(),trackingCode:r.string().optional(),lastActiveAt:r.string().nullable().optional()}),v=r.object({user:r.object({id:r.string(),email:r.string().email(),name:r.string().optional()}),team:r.object({id:r.string(),name:r.string(),plan:r.string()}).optional()});var y=class extends Error{constructor(e,t,n){super(n),this.status=e,this.body=t,this.name=`ApiError`}},b=class{fetchImpl;token;constructor(e){this.opts=e,this.fetchImpl=e.fetchImpl??fetch,this.token=e.token??null}get apiBase(){return this.opts.config.apiBase}async authedHeaders(e={}){let t=process.env.ZENOVAY_API_TOKEN;if(t&&t.trim())return{Accept:`application/json`,"User-Agent":`zenovay-cli/${this.opts.cliVersion}`,"X-Zenovay-CLI-Version":this.opts.cliVersion,Authorization:`Bearer ${t.trim()}`,...e};this.token||=await h({apiBase:this.apiBase});let n={Accept:`application/json`,"User-Agent":`zenovay-cli/${this.opts.cliVersion}`,"X-Zenovay-CLI-Version":this.opts.cliVersion,...e};return this.token&&(n.Authorization=`${this.token.tokenType} ${this.token.accessToken}`),n}async request(e,t){let n=`${this.apiBase}${e}`,r=await this.fetchImpl(n,{...t,headers:{...await this.authedHeaders(),...t.headers}});if(r.status===401&&this.token&&(this.token=null,r=await this.fetchImpl(n,{...t,headers:{...await this.authedHeaders(),...t.headers}})),!r.ok){let n=await r.text().catch(()=>``);throw new y(r.status,n,`${t.method??`GET`} ${e} → ${r.status}`)}let i=await r.json();return t.schema.parse(i)}async getSites(){return this.request(`/v1/cli/sites`,{schema:r.array(_)})}async createSite(e){return this.request(`/v1/cli/sites`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),schema:r.object({id:r.string()})})}async getFirstEvent(e){let t=new URLSearchParams({site_id:e.siteId,since:String(e.since)});return this.request(`/v1/cli/first-event?${t.toString()}`,{schema:r.object({received:r.boolean(),event:r.unknown().optional()})})}async me(){return this.request(`/v1/cli/me`,{schema:v})}async revokeCurrentToken(){this.token&&await this.fetchImpl(`${this.apiBase}/oauth/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`,...await this.authedHeaders()},body:new URLSearchParams({token:this.token.refreshToken,token_type_hint:`refresh_token`,client_id:`cli-zenovay`}).toString()})}async openAiStream(e,t,n){let r=await this.authedHeaders({"Content-Type":`application/json`,Accept:`text/event-stream`}),i=await this.fetchImpl(`${this.apiBase}/ai/cli/${e}`,{method:`POST`,headers:r,body:JSON.stringify(t),signal:n});if(!i.ok){let t=await i.text().catch(()=>``);throw new y(i.status,t,`POST /ai/cli/${e} → ${i.status}`)}return i}async openEventsStream(e,t){let n=await this.authedHeaders({Accept:`text/event-stream`}),r=await this.fetchImpl(`${this.apiBase}/v1/cli/events/tail?site_id=${e}`,{method:`GET`,headers:n,signal:t});if(!r.ok){let e=await r.text().catch(()=>``);throw new y(r.status,e,`GET events tail → ${r.status}`)}return r}async getDashboardSnapshot(e){return this.request(`/v1/cli/dashboard?site_id=${e}`,{schema:r.unknown()})}async ping(){let e=Date.now(),t=await this.fetchImpl(`${this.apiBase}/v1/cli/ping`,{headers:await this.authedHeaders()});if(!t.ok)throw new y(t.status,await t.text().catch(()=>``),`ping failed`);return{ok:!0,latencyMs:Date.now()-e}}};export{b as ApiClient,y as ApiError,c as clearToken,h as ensureFreshToken,m as pollDeviceToken,o as readToken,p as startDeviceAuthorization,s as writeToken};
@@ -1 +0,0 @@
1
- import{ApiClient as e,ApiError as t,ensureFreshToken as n}from"./api-B7QWXBbG.js";import{z as r}from"zod";const i=r.object({id:r.string(),startedAt:r.string(),country:r.string().nullable().optional(),city:r.string().nullable().optional(),device:r.enum([`mobile`,`desktop`,`tablet`,`unknown`]).optional(),os:r.string().nullable().optional(),browser:r.string().nullable().optional(),page:r.string().optional(),referrer:r.string().nullable().optional(),utmSource:r.string().nullable().optional(),utmMedium:r.string().nullable().optional(),utmCampaign:r.string().nullable().optional(),aiScore:r.number().min(0).max(100).nullable().optional()}),a=r.object({visitors:r.array(i),total:r.number().int(),windowStart:r.string(),windowEnd:r.string()}),o=r.object({type:r.enum([`visitor.started`,`visitor.ended`,`visitor.heartbeat`]),visitor:i}),s=r.object({source:r.string(),channel:r.enum([`direct`,`organic`,`paid`,`social`,`referral`,`email`,`other`]).optional(),visitors:r.number().int(),conversions:r.number().int().optional(),revenue:r.number().int().optional(),delta:r.number().nullable().optional()}),c=r.object({sources:r.array(s),totalVisitors:r.number().int(),windowStart:r.string(),windowEnd:r.string()}),l=r.object({bucket:r.string(),amount:r.number().int(),currency:r.string(),transactions:r.number().int()}),u=r.object({series:r.array(l),totalAmount:r.number().int(),currency:r.string(),totalTransactions:r.number().int(),mrr:r.number().int().optional(),arpu:r.number().int().optional(),windowStart:r.string(),windowEnd:r.string()}),d=r.object({url:r.string(),device:r.enum([`mobile`,`desktop`]).optional(),lcp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),inp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),cls:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),ttfb:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),fcp:r.object({p50:r.number(),p75:r.number(),p90:r.number()}).optional(),samples:r.number().int()}),f=r.object({vitals:r.array(d),windowStart:r.string(),windowEnd:r.string()}),p=r.object({id:r.string(),name:r.string(),visitors:r.number().int(),conversions:r.number().int(),dropOff:r.number().min(0).max(1).optional()}),m=r.object({funnelId:r.string(),name:r.string(),steps:r.array(p),totalEntries:r.number().int(),totalCompletions:r.number().int(),conversionRate:r.number().min(0).max(1),windowStart:r.string(),windowEnd:r.string()}),h=r.object({id:r.string(),name:r.string(),stepCount:r.number().int(),lastEvaluatedAt:r.string().nullable().optional()}),g=r.object({funnels:r.array(h)}),_=r.object({visitors:r.number().int(),pageviews:r.number().int(),sessions:r.number().int(),bounceRate:r.number().min(0).max(1),avgSessionSec:r.number(),topPages:r.array(r.object({url:r.string(),views:r.number().int()})),topCountries:r.array(r.object({country:r.string(),visitors:r.number().int()})),windowStart:r.string(),windowEnd:r.string()}),v=r.object({id:r.string(),name:r.string(),type:r.enum([`event`,`pageview`,`revenue`]),conversions24h:r.number().int(),conversions7d:r.number().int()}),y=r.object({goals:r.array(v)}),b=r.object({id:r.string(),name:r.string(),domain:r.string().nullable().optional(),industry:r.string().nullable().optional(),employeeCount:r.number().int().nullable().optional(),visitorCount:r.number().int(),firstSeenAt:r.string(),lastSeenAt:r.string()}),x=r.object({type:r.enum([`company.identified`,`company.returning`]),company:b}),S=r.object({companies:r.array(b),total:r.number().int()}),C=r.object({type:r.literal(`error.captured`),id:r.string(),message:r.string(),stack:r.string().optional(),url:r.string().optional(),occurredAt:r.string(),count:r.number().int().optional(),spike:r.number().optional()}),w=r.object({id:r.string(),ts:r.string(),class:r.string(),message:r.string(),page:r.string().nullable(),device:r.string().nullable(),fingerprint:r.string().nullable()}),T=r.object({errors:r.array(w),total:r.number().int()}),E=r.object({id:r.string(),name:r.string(),domain:r.string().nullable(),industry:r.string().nullable(),employeeCount:r.number().int().nullable(),visitCount:r.number().int(),firstSeenAt:r.string(),lastSeenAt:r.string(),isNew:r.boolean()}),D=r.object({companies:r.array(E),total:r.number().int()}),O=r.object({columns:r.array(r.string()),rows:r.array(r.record(r.unknown())),row_count:r.number(),duration_ms:r.number(),truncated:r.boolean()}),k=r.object({id:r.string(),name:r.string(),domain:r.string().nullable(),tier:r.string(),pageviews24h:r.number().int(),isCurrent:r.boolean()}),A=r.object({projects:r.array(k)}),j=r.object({type:r.string(),bucket:r.string(),count:r.number().int()}),M=r.object({events:r.array(j),windowStart:r.string(),windowEnd:r.string()}),N=r.object({id:r.string(),receivedAt:r.string(),url:r.string(),method:r.string(),headers:r.record(r.string(),r.string()),body:r.string()}),P=r.object({columns:r.array(r.string()),rows:r.array(r.array(r.unknown())),rowCount:r.number().int(),durationMs:r.number(),truncated:r.boolean().optional()}),F=r.object({resource:r.string(),values:r.array(r.string()),cachedAt:r.string().optional()});function I(e,t){throw Error(`api-v2: ${e} not yet implemented; awaiting backend Wave ${t}`)}async function*L(e,t){I(e,t)}function R(e){switch(e){case`24h`:return 1;case`7d`:return 7;case`30d`:return 30;case`90d`:return 90;case`1y`:return 365;default:return 7}}var z=class extends e{v2Opts;v2Fetch;v2Token;constructor(e){super(e),this.v2Opts=e,this.v2Fetch=e.fetchImpl??fetch,this.v2Token=e.token??null}get v2ApiBase(){return this.v2Opts.config.apiBase}async v2Headers(e={}){let t=process.env.ZENOVAY_API_TOKEN;if(t&&t.trim())return{Accept:`application/json`,"User-Agent":`zenovay-cli/${this.v2Opts.cliVersion}`,"X-Zenovay-CLI-Version":this.v2Opts.cliVersion,Authorization:`Bearer ${t.trim()}`,...e};this.v2Token||=await n({apiBase:this.v2ApiBase});let r={Accept:`application/json`,"User-Agent":`zenovay-cli/${this.v2Opts.cliVersion}`,"X-Zenovay-CLI-Version":this.v2Opts.cliVersion,...e};return this.v2Token&&(r.Authorization=`${this.v2Token.tokenType} ${this.v2Token.accessToken}`),r}async v2Request(e,n,r={},i){let a=`${this.v2ApiBase}${e}`,o=await this.v2Headers(r.headers??{}),s=await this.v2Fetch(a,{...r,headers:o,signal:i});if(s.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers(r.headers??{});s=await this.v2Fetch(a,{...r,headers:e,signal:i})}if(!s.ok){let n=await s.text().catch(()=>``),i=n;try{i=JSON.parse(n)}catch{}throw new t(s.status,i,`${r.method??`GET`} ${e} → ${s.status}`)}let c=await s.json();return n.parse(c)}async v2RequestRaw(e,n={},r){let i=`${this.v2ApiBase}${e}`,a=await this.v2Headers(n.headers??{}),o=await this.v2Fetch(i,{...n,headers:a,signal:r});if(o.status===401&&this.v2Token){this.v2Token=null;let e=await this.v2Headers(n.headers??{});o=await this.v2Fetch(i,{...n,headers:e,signal:r})}if(!o.ok){let r=await o.text().catch(()=>``),i=r;try{i=JSON.parse(r)}catch{}throw new t(o.status,i,`${n.method??`GET`} ${e} → ${o.status}`)}let s=await o.json();return s?.data??s}async getVisitors(e,t,n){let r=new URLSearchParams({site_id:e});t?.since&&r.set(`since`,t.since),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/visitors?${r.toString()}`,{},n),o=new Date,s=new Date(Date.now()-24*3600*1e3),c=e=>{if(!e)return`unknown`;let t=e.toLowerCase();return t.includes(`mobile`)?`mobile`:t.includes(`tablet`)?`tablet`:t.includes(`desktop`)?`desktop`:`unknown`};return a.parse({total:i.liveCount??i.visitors?.length??0,visitors:(i.visitors??[]).map(e=>({id:e.sessionId,startedAt:e.lastSeen,country:e.country,city:null,device:c(e.device??null),page:e.currentPath??void 0,aiScore:typeof e.valueScore==`number`?Math.max(0,Math.min(100,e.valueScore)):null})),windowStart:s.toISOString(),windowEnd:o.toISOString()})}streamVisitors(e,t){return L(`streamVisitors`,1)}async getSources(e,t=`30d`,n,r){let i=new URLSearchParams({site_id:e,period:t});n&&i.set(`compare`,n);let a=await this.v2RequestRaw(`/v1/cli/sources?${i.toString()}`,{},r),o=a.channels??[],s=a.top_utm_sources??[],l=o.reduce((e,t)=>e+t.visitors,0),u=new Set([`direct`,`organic`,`paid`,`social`,`referral`,`email`]),d=[...o.map(e=>({source:e.name,channel:u.has(e.name)?e.name:`other`,visitors:e.visitors,delta:typeof e.delta==`number`?e.delta/100:null})),...s.map(e=>({source:e.medium?`${e.source}/${e.medium}`:e.source,channel:`other`,visitors:e.visitors}))],f=new Date,p=new Date(Date.now()-R(t)*24*3600*1e3);return c.parse({sources:d,totalVisitors:l,windowStart:p.toISOString(),windowEnd:f.toISOString()})}async getRevenue(e,t=`30d`,n){let r=new URLSearchParams({site_id:e,window:t}),i=await this.v2RequestRaw(`/v1/cli/revenue?${r.toString()}`,{},n),a=(i.daily??[]).map(e=>({bucket:e.date,amount:e.cents,currency:i.currency??`USD`,transactions:e.transactions})),o=a.reduce((e,t)=>e+t.amount,0),s=a.reduce((e,t)=>e+t.transactions,0),c=new Date,l=new Date(Date.now()-R(t)*24*3600*1e3),d={series:a,totalAmount:o,currency:i.currency??`USD`,totalTransactions:s,windowStart:l.toISOString(),windowEnd:c.toISOString()};return typeof i.mrr_cents==`number`&&(d.mrr=i.mrr_cents),u.parse(d)}async getVitals(e,t,n){let r=new URLSearchParams({site_id:e});t?.url&&r.set(`url`,t.url),t?.device&&r.set(`device`,t.device),t?.window&&r.set(`window`,t.window);let i=await this.v2RequestRaw(`/v1/cli/vitals?${r.toString()}`,{},n),a=[];if(i.p75&&(i.sample_count??0)>0){let e=i.p75,n={url:`— site-wide aggregate —`,device:t?.device??void 0,samples:i.sample_count??0,...typeof e.lcp==`number`?{lcp:{p50:e.lcp,p75:e.lcp,p90:e.lcp}}:{},...typeof e.inp==`number`?{inp:{p50:e.inp,p75:e.inp,p90:e.inp}}:{},...typeof e.cls==`number`?{cls:{p50:e.cls,p75:e.cls,p90:e.cls}}:{},...typeof e.fcp==`number`?{fcp:{p50:e.fcp,p75:e.fcp,p90:e.fcp}}:{},...typeof e.ttfb==`number`?{ttfb:{p50:e.ttfb,p75:e.ttfb,p90:e.ttfb}}:{}};a.push(n)}for(let e of i.worst_pages??[])a.push({url:e.path,device:t?.device??void 0,samples:e.sample_count,lcp:{p50:e.lcp_p75,p75:e.lcp_p75,p90:e.lcp_p75}});let o=new Date,s=new Date(Date.now()-R(t?.window??`7d`)*24*3600*1e3);return f.parse({vitals:a,windowStart:s.toISOString(),windowEnd:o.toISOString()})}async getFunnel(e,t,n=`30d`,r){let i=new URLSearchParams({site_id:e,window:n}),a=await this.v2RequestRaw(`/v1/cli/funnels/${encodeURIComponent(t)}?${i.toString()}`,{},r),o=a.total_entries??0,s=(a.steps??[]).map(e=>({id:`step-${e.order}`,name:e.name,visitors:e.visitors,conversions:e.visitors,dropOff:Math.max(0,Math.min(1,e.dropoffPct/100))})),c=s[s.length-1],l=c?.visitors??0,u=o>0?Math.min(1,l/o):0,d=new Date,f=new Date(Date.now()-R(n)*24*3600*1e3);return m.parse({funnelId:a.id??t,name:a.name??t,steps:s,totalEntries:o,totalCompletions:l,conversionRate:u,windowStart:f.toISOString(),windowEnd:d.toISOString()})}async listFunnels(e,t){let n=new URLSearchParams({site_id:e}),r=await this.v2RequestRaw(`/v1/cli/funnels?${n.toString()}`,{},t);return g.parse({funnels:(r.funnels??[]).map(e=>({id:e.id,name:e.name,stepCount:e.step_count}))})}async getStats(e,t=`24h`,n){let r=new URLSearchParams({site_id:e,range:t}),i=await this.v2RequestRaw(`/v1/cli/stats?${r.toString()}`,{},n),a=i.visitors??0,o=i.pageviews??0,s=a,c=s>0?o/s:0,l=c>0?Math.max(0,Math.min(1,1/Math.max(1,c))):0,u=0,d=new Date,f=new Date(Date.now()-R(t)*24*3600*1e3);return _.parse({visitors:a,pageviews:o,sessions:s,bounceRate:l,avgSessionSec:u,topPages:i.topPage?[{url:i.topPage.path,views:i.topPage.views}]:[],topCountries:i.topSource?[{country:i.topSource.channel,visitors:i.topSource.visitors}]:[],windowStart:f.toISOString(),windowEnd:d.toISOString()})}async getGoals(e,t){let n=new URLSearchParams({site_id:e});return this.v2Request(`/v1/cli/goals?${n.toString()}`,y,{},t)}streamCompanies(e,t){return L(`streamCompanies`,2)}async getCompanies(e){I(`getCompanies`,2)}async getCompaniesSnapshot(e,t,n){let r=new URLSearchParams({site_id:e});t?.window&&r.set(`window`,t.window),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/companies?${r.toString()}`,{},n);return D.parse(i)}async runSqlQuery(e,n,r,i){let a=`${this.v2ApiBase}/v1/cli/query`,o=await this.v2Headers({"Content-Type":`application/json`}),s=await this.v2Fetch(a,{method:`POST`,headers:o,signal:i,body:JSON.stringify({site_id:e,sql:n,...r?.maxRows?{max_rows:r.maxRows}:{}})});if(!s.ok){let e=await s.text().catch(()=>``),n=e;try{n=JSON.parse(e)}catch{}throw new t(s.status,n,`POST /v1/cli/query → ${s.status}`)}let c=await s.json();return O.parse(c.data??c)}async getProjects(e,t){let n=new URLSearchParams({site_id:e}),r=await this.v2RequestRaw(`/v1/cli/projects?${n.toString()}`,{},t);return A.parse(r)}async getErrors(e,t,n){let r=new URLSearchParams({site_id:e});t?.window&&r.set(`window`,t.window),typeof t?.limit==`number`&&r.set(`limit`,String(t.limit));let i=await this.v2RequestRaw(`/v1/cli/errors?${r.toString()}`,{},n);return T.parse(i)}streamErrors(e,t){return L(`streamErrors`,2)}async getEventsHistory(e,t){I(`getEventsHistory`,2)}forwardWebhook(e,t){return L(`forwardWebhook`,2)}async registerTunnel(e,t){I(`registerTunnel`,2)}async queryRaw(e,t,n){I(`queryRaw`,3)}async getCompletions(e,t){I(`getCompletions`,3)}};export{z as ApiV2Client};
@@ -1,3 +0,0 @@
1
- import{formatTabular as e,readConfig as t,selectFormat as n}from"./formatter-CEeFGNXS.js";import{readToken as r}from"./api-B7QWXBbG.js";import"./panel-s0DHmKcg.js";import"./keybar-D2LIBUlF.js";import"./prompt-C1qNVY6f.js";import{runAnalyticalScreen as i}from"./analytical-screen-3XlrpJ98.js";import{spark as a}from"./sparkline-CR_bzxwB.js";import{Table as o}from"./ui-CvxpWJH-.js";import{ApiV2Client as s}from"./api-v2-Ge4WrV8S.js";import{Box as c,Text as l}from"ink";import u from"react";function d(e,t){return e.length<=t?e:e.slice(0,t-1)+`…`}function f(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 p(p){let m=await t(),h=await r({strict:!1}),g=p.siteId??h?.teamId??``;if(!g)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
- `),2;let _=new s({config:m,cliVersion:p.cliVersion,token:h}),v=n(p),y=p.window??`24h`,b=p.limit??100,x=[{key:`ts`,header:`when`,width:6,format:e=>f(String(e))},{key:`class`,header:`class`,width:18,format:e=>String(e)},{key:`message`,header:`message`,width:42,format:e=>d(String(e??``),42)},{key:`page`,header:`page`,width:24,format:e=>String(e??`—`)},{key:`device`,header:`device`,width:8,format:e=>String(e??`—`)}];return i({cliVersion:p.cliVersion,title:`errors · ${g} · ${y}`,commandName:`errors`,authToken:h?.accessToken??null,refreshIntervalMs:p.watch?3e4:0,fetcher:e=>_.getErrors(g,{window:y,limit:b},e),format:v,headlessEmit:(t,n)=>{let r=p.search?t.errors.filter(e=>e.class.toLowerCase().includes(p.search.toLowerCase())||e.message.toLowerCase().includes(p.search.toLowerCase())):t.errors;if(n===`json`||n===`ndjson`){if(n===`ndjson`)for(let e of r)process.stdout.write(JSON.stringify(e)+`
3
- `);else process.stdout.write(JSON.stringify({errors:r,total:r.length},null,2));return}process.stdout.write(e(r,[`ts`,`class`,`message`,`page`,`device`,`fingerprint`],n))},panels:[{id:`summary`,title:`Recent errors`,render:e=>{let t=p.search?e.errors.filter(e=>e.class.toLowerCase().includes(p.search.toLowerCase())||e.message.toLowerCase().includes(p.search.toLowerCase())):e.errors,n=new Map,r=Date.now(),i=60;for(let e of t){let t=new Date(e.ts).getTime(),a=Math.floor((r-t)/(60*1e3));if(a<0||a>=i)continue;let o=n.get(e.class)??Array(i).fill(0),s=i-1-a;o[s]+=1,n.set(e.class,o)}let o=[...n.entries()].sort((e,t)=>t[1].reduce((e,t)=>e+t,0)-e[1].reduce((e,t)=>e+t,0)).slice(0,6);return u.createElement(c,{flexDirection:`column`},u.createElement(l,null,u.createElement(l,{bold:!0},t.length),u.createElement(l,{color:`gray`},` errors in `,y)),o.length===0?null:u.createElement(c,{flexDirection:`column`,marginTop:1},o.map(([e,t])=>u.createElement(l,{key:e},u.createElement(l,{color:`red`},e.padEnd(20).slice(0,20)),` `,u.createElement(l,{color:`gray`},a(t,30))))))}},{id:`table`,title:`Detail`,render:e=>{let t=p.search?e.errors.filter(e=>e.class.toLowerCase().includes(p.search.toLowerCase())||e.message.toLowerCase().includes(p.search.toLowerCase())):e.errors;return t.length===0?u.createElement(l,{color:`gray`},`— no errors `,p.search?`matching "${p.search}"`:`in window`,` —`):u.createElement(o,{data:t.slice(0,30),columns:x})}}]})}export{p as errorsCommand};
@@ -1,10 +0,0 @@
1
- import e from"node:path";import{promises as t}from"node:fs";import n from"node:os";import{z as r}from"zod";const i=r.object({theme:r.string().optional(),apiBase:r.string().url().default(`https://api.zenovay.com`),cliBase:r.string().url().default(`https://cli.zenovay.com`),region:r.enum([`us`,`eu`,`auto`]).default(`auto`),telemetry:r.boolean().default(!1),noUpdateCheck:r.boolean().default(!1),lastUpdateNotice:r.number().optional(),forwardSecret:r.string().optional()}),a={apiBase:`https://api.zenovay.com`,cliBase:`https://cli.zenovay.com`,region:`auto`,telemetry:!1,noUpdateCheck:!1};function o(){if(process.platform===`win32`){let t=process.env.APPDATA??e.join(n.homedir(),`AppData`,`Roaming`);return e.join(t,`zenovay`)}let t=process.env.XDG_CONFIG_HOME??e.join(n.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}function d(e={}){if(e.format){let t=e.format.toLowerCase();if(t===`json`||t===`csv`||t===`tsv`||t===`ndjson`)return t}if(e.json)return`json`;if(e.csv)return`csv`;if(e.tsv)return`tsv`;if(e.ndjson)return`ndjson`;let t=process.env.ZENOVAY_FORMAT;if(t){let e=t.toLowerCase();if(e===`json`||e===`csv`||e===`tsv`||e===`ndjson`)return e}return process.env.CI===`true`||process.env.CI===`1`||!process.stdout.isTTY?`ndjson`:null}function f(e){if(e==null)return``;if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);try{return JSON.stringify(e)}catch{return String(e)}}function p(e){let t=e.includes(`,`)||e.includes(`"`)||e.includes(`
2
- `)||e.includes(`\r`);return t?`"${e.replace(/"/g,`""`)}"`:e}function m(e){return e.replace(/\\/g,`\\\\`).replace(/\t/g,`\\t`).replace(/\r/g,`\\r`).replace(/\n/g,`\\n`)}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)}if(n===`ndjson`){if(e.length===0)return``;let n=[];for(let r of e){let e={};for(let n of t)e[String(n)]=r[n];n.push(JSON.stringify(e))}return n.join(`
3
- `)+`
4
- `}let r=n===`tsv`,i=r?` `:`,`,a=r?m:p,o=t.map(e=>a(String(e))).join(i);if(e.length===0)return o+`
5
- `;let s=[o];for(let n of e){let e=t.map(e=>a(f(n[e])));s.push(e.join(i))}return s.join(`
6
- `)+`
7
- `}function g(e,t){if(t===`ndjson`)return JSON.stringify(e)+`
8
- `;if(t===`json`)return JSON.stringify(e,null,2);let n=t===`tsv`,r=n?` `:`,`,i=n?m:p;if(typeof e==`object`&&e&&!Array.isArray(e)){let t=Object.entries(e);return t.map(([,e])=>i(f(e))).join(r)+`
9
- `}return i(f(e))+`
10
- `}export{o as configDir,s as configPath,g as formatEvent,h as formatTabular,c as readConfig,d as selectFormat,u as updateConfig};
@@ -1 +0,0 @@
1
- import{configPath as e,readConfig as t}from"./formatter-CEeFGNXS.js";import{ApiClient as n,readToken as r}from"./api-B7QWXBbG.js";import{isHeadless as i}from"./emit-CbAMzl5f.js";import{Panel as a}from"./panel-s0DHmKcg.js";import{fetchManifest as o}from"./check-B7o0vbqr.js";import s from"node:path";import{promises as c}from"node:fs";import{Box as l,Text as u,render as d}from"ink";import f from"react";import p from"node:os";const m=6*60*60*1e3;function h(){return s.join(p.homedir(),`.zenovay`,`update.json`)}async function g(){try{let e=await c.readFile(h(),`utf8`);return JSON.parse(e)}catch{return null}}async function _(e){let t=h();await c.mkdir(s.dirname(t),{recursive:!0,mode:448}),await c.writeFile(t,JSON.stringify(e,null,2))}async function v(){let e=await t();if(e.noUpdateCheck||process.env.ZENOVAY_NO_UPDATE_CHECK===`1`||process.env.CI===`true`)return null;let n=await g();if(n&&Date.now()-n.fetchedAt<m)return n;try{let t=await o({cliBase:e.cliBase}),r={manifest:t,fetchedAt:Date.now(),lastNoticeAt:n?.lastNoticeAt};return await _(r),r}catch{return n}}async function y(){try{await v()}catch{}process.exit(0)}import.meta.url===`file://${process.argv[1]}`&&y();const b=2e3,x=5e3;async function S(e,t){let n=`${e}/mcp`,r=Date.now(),i=new AbortController,a=setTimeout(()=>i.abort(),b);try{let a=await t(n,{method:`GET`,signal:i.signal}),o=Date.now()-r;return a.ok?{name:`MCP server`,status:`pass`,detail:`${e}/mcp · ${o}ms`,latencyMs:o}:{name:`MCP server`,status:`fail`,detail:`HTTP ${a.status}`,latencyMs:o}}catch(e){return{name:`MCP server`,status:`fail`,detail:e.message}}finally{clearTimeout(a)}}async function C(){try{let t=await c.readFile(e(),`utf8`),n=JSON.parse(t),r=n.openaiApiKey;return typeof r==`string`&&r.trim().length>0?{name:`OpenAI key`,status:`pass`,detail:`configured`}:{name:`OpenAI key`,status:`warn`,detail:"not set (run `zenovay ai` to configure)"}}catch(e){return e.code===`ENOENT`?{name:`OpenAI key`,status:`warn`,detail:`no config file`}:{name:`OpenAI key`,status:`warn`,detail:`unreadable config`}}}async function w(){let e=p.homedir(),t=[s.join(e,`.zshrc`),s.join(e,`.bashrc`),s.join(e,`.config`,`fish`,`completions`,`zenovay.fish`)],n=[];for(let e of t)try{let t=await c.readFile(e,`utf8`);(/zenovay\s+(complet|--?complet)/i.test(t)||/_zenovay/.test(t)||/complete\s+-c\s+zenovay/.test(t))&&n.push(s.basename(e))}catch{}return n.length>0?{name:`Completions`,status:`pass`,detail:n.join(`, `)}:{name:`Completions`,status:`warn`,detail:"not installed (run `zenovay completions` after Wave 3)"}}async function T(e,t,n,r){if(!e||!t)return{name:`Events stream`,status:`skip`,detail:`not authenticated`};let i=new AbortController,a=setTimeout(()=>i.abort(),x),o=Date.now();try{let t=await e.openEventsStream(`probe`,i.signal),r=t.body?.getReader();if(r){let e=Promise.race([r.read().then(()=>`first`),new Promise(e=>setTimeout(()=>e(`timeout`),1500))]);await e;try{r.cancel()}catch{}}let a=Date.now()-o;return{name:`Events stream`,status:`pass`,detail:`${n}/v1/cli/events/tail · ${a}ms`,latencyMs:a}}catch(e){let t=e.message;return/40\d/.test(t)?{name:`Events stream`,status:`pass`,detail:`endpoint reachable (auth-gated)`}:{name:`Events stream`,status:`fail`,detail:t}}finally{clearTimeout(a)}}async function E(i){let a=i.fetchImpl??fetch,o=[],s=await t().catch(()=>null);o.push({name:`Binary`,status:`pass`,detail:`v${i.cliVersion} (${i.binaryPath})`}),o.push({name:`Config file`,status:s?`pass`:`warn`,detail:e()});let c=await r({strict:!1}).catch(()=>null);o.push({name:`Auth`,status:c?`pass`:`fail`,detail:c?`logged in${c.email?` as ${c.email}`:``}`:`not logged in`});let l=null;if(s)try{l=new n({config:s,cliVersion:i.cliVersion,token:c,fetchImpl:a});let e=await l.ping();o.push({name:`API connection`,status:`pass`,detail:`${s.apiBase.replace(/^https?:\/\//,``)} · ${e.latencyMs}ms`,latencyMs:e.latencyMs})}catch(e){o.push({name:`API connection`,status:`fail`,detail:`${e.message}`})}let u=await g().catch(()=>null);o.push({name:`Auto-update`,status:s?.noUpdateCheck?`warn`:`pass`,detail:s?.noUpdateCheck?`disabled`:u?`latest=${u.manifest.latest}`:`manifest not yet fetched`});let d=s?.apiBase??`https://api.zenovay.com`;return o.push(await S(d,a)),o.push(await C()),o.push(await w()),o.push(await T(l,!!c,d,a)),o}function D(e){return e.some(e=>e.status===`fail`)?1:0}async function O(e){let t=await E(e),n=D(t),r=n===0;return i({json:e.json})?(process.stdout.write(`${JSON.stringify({checks:t,passed:r})}\n`),n):new Promise(e=>{let{unmount:r}=d(f.createElement(k,{checks:t}),{exitOnCtrlC:!0});setImmediate(()=>{r(),e(n)})})}const k=({checks:e})=>f.createElement(a,{title:`Zenovay CLI health check`,state:`idle`},e.map(e=>f.createElement(l,{key:e.name},f.createElement(u,{color:j(e.status)},A(e.status)),f.createElement(u,null,` `),f.createElement(u,{bold:!0},e.name.padEnd(18)),f.createElement(u,{color:`gray`},e.detail))));function A(e){return e===`pass`?`✔`:e===`warn`?`⚠`:e===`skip`?`∼`:`✗`}function j(e){return e===`pass`?`green`:e===`warn`?`yellow`:e===`skip`?`gray`:`red`}export{k as HealthReport,D as exitCodeFor,O as healthCommand,E as runHealthChecks};
@@ -1 +0,0 @@
1
- import"./formatter-CEeFGNXS.js";import"./api-B7QWXBbG.js";import"./emit-CbAMzl5f.js";import"./panel-s0DHmKcg.js";import"./check-B7o0vbqr.js";import{HealthReport as e,exitCodeFor as t,healthCommand as n,runHealthChecks as r}from"./health-QG3p1I4h.js";export{n as healthCommand};
@@ -1,61 +0,0 @@
1
- import{readConfig as e}from"./formatter-CEeFGNXS.js";import{ApiClient as t,readToken as n}from"./api-B7QWXBbG.js";import{parseSseStream as r}from"./client-ClN0aAAQ.js";import{emit as i,isHeadless as a}from"./emit-CbAMzl5f.js";import{loginCommand as o}from"./login-CCbw5DxV.js";import{Panel as s}from"./panel-s0DHmKcg.js";import{Banner as c,BrandGradient as l,Keybar as u}from"./keybar-D2LIBUlF.js";import{Select as d}from"./prompt-C1qNVY6f.js";import f from"node:path";import{promises as p}from"node:fs";import{Box as m,Text as h,render as g,useApp as ee}from"ink";import _,{useEffect as v,useRef as te,useState as y}from"react";import b from"node:os";import{z as x}from"zod";import{globby as S}from"globby";import C from"ink-spinner";import w from"node:crypto";import{ulid as T}from"ulid";import{applyPatch as E}from"diff";const D=[{name:`openai-proj`,regex:/\bsk-proj-[A-Za-z0-9_-]{20,}\b/g},{name:`anthropic`,regex:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{name:`openai-sk`,regex:/\bsk-[A-Za-z0-9]{20,}\b/g},{name:`github-pat-new`,regex:/\bgithub_pat_[A-Za-z0-9_]{82}\b/g},{name:`github-pat`,regex:/\bghp_[A-Za-z0-9]{36}\b/g},{name:`github-oauth`,regex:/\bgho_[A-Za-z0-9]{36}\b/g},{name:`aws-access-key`,regex:/\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/g},{name:`stripe-live`,regex:/\b(?:sk|pk)_live_[A-Za-z0-9]{24,}\b/g},{name:`stripe-test`,regex:/\b(?:sk|pk)_test_[A-Za-z0-9]{24,}\b/g},{name:`stripe-restricted`,regex:/\brk_(?:live|test)_[A-Za-z0-9]{24,}\b/g},{name:`stripe-webhook`,regex:/\bwhsec_[A-Za-z0-9]{24,}\b/g},{name:`slack-bot`,regex:/\bxox[bpoa]-[A-Za-z0-9-]{10,}\b/g},{name:`google-api`,regex:/\bAIza[0-9A-Za-z_-]{35}\b/g},{name:`jwt`,regex:/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{name:`private-key-rsa`,regex:/-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP) PRIVATE KEY(?: BLOCK)?-----/g},{name:`private-key-pkcs8`,regex:/-----BEGIN PRIVATE KEY-----/g}];function O(e){let t=e;for(let e of D){let n=new RegExp(e.regex.source,e.regex.flags);t=t.replace(n,`[REDACTED:${e.name}]`)}return t}const ne=[/^package\.json$/,/^package-lock\.json$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^bun\.lock$/,/^tsconfig.*\.json$/,/^(next|nuxt|vite|astro|remix|svelte|tailwind|postcss)\.config\.(ts|mts|cts|js|mjs|cjs)$/,/^app\/.*\.(tsx|ts|jsx|js|svelte|astro|vue)$/,/^pages\/.*\.(tsx|ts|jsx|js)$/,/^public\/index\.html$/,/^index\.html$/,/^src\/main\.(tsx|ts|jsx|js)$/,/^src\/App\.(tsx|ts|jsx|js|svelte|vue)$/,/^src\/routes\/\+layout\.(svelte|ts|js)$/,/^src\/routes\/root\..*$/,/^src\/layouts\/.*\.(astro|svelte|vue)$/,/^\.env\.example$/,/^README\.md$/,/^\.gitignore$/,/^nuxt\.config\.(ts|js|mjs)$/,/^plugins\/.*\.(ts|js)$/],re=[/(^|\/)\.env($|\.(?!example$)[^/]+$)/,/(^|\/)\.git(\/|$)/,/(^|\/)node_modules\//,/(^|\/)\.ssh\//,/(^|\/)\.aws\//,/\.pem$/,/\.key$/,/(^|\/)id_rsa($|\.)/,/(^|\/)\.npmrc$/,/(^|\/)credentials(\.|$)/],k=256*1024,A=50,j=20,M=40;var N=class extends Error{constructor(e,t){super(t),this.code=e,this.name=`SandboxError`}},P=class{sessionId;cwd;cwdReal;undoRoot;readCount=0;writeCount=0;roundCount=0;constructor(e){this.sessionId=e.sessionId??T(),this.cwd=e.cwd,this.cwdReal=p.realpath(e.cwd),this.undoRoot=e.undoRoot??f.join(b.homedir(),`.zenovay`,`undo`)}incrementRound(){if(this.roundCount++,this.roundCount>M)throw new N(`round-cap`,`Tool-call recursion cap (${M}) exceeded.`)}stats(){return{sessionId:this.sessionId,reads:this.readCount,writes:this.writeCount,rounds:this.roundCount}}async resolveForRead(e){return this.resolveSafe(e,`read`)}async resolveForWrite(e){return this.resolveSafe(e,`write`)}async resolveSafe(e,t){if(typeof e!=`string`||e.length===0)throw new N(`escape`,`Path must be a non-empty string.`);if(e.includes(`\0`))throw new N(`escape`,`Null byte in path.`);if(/^\\\\[?.]\\/.test(e)||/^\\\\[A-Za-z0-9]/.test(e))throw new N(`escape`,`Windows special path prefix: ${e}`);if(/%/.test(e))try{let t=decodeURIComponent(e);if(/%[0-9A-Fa-f]{2}/.test(t))throw new N(`escape`,`Double-encoded path: ${e}`);e=t}catch(t){throw t instanceof N?t:new N(`escape`,`Malformed percent-encoding: ${e}`)}if(e.includes(`\0`))throw new N(`escape`,`Null byte in decoded path.`);if(e.includes(`\\`))throw new N(`escape`,`Backslash in path (Windows-style separator not accepted): ${e}`);let n=await this.cwdReal,r=f.isAbsolute(e)?e:f.join(n,e),i=f.normalize(r),a=i;try{a=await p.realpath(i)}catch(e){if(e.code!==`ENOENT`)throw new N(`escape`,`realpath failed: ${e.message}`);let t=f.dirname(i);try{let e=await p.realpath(t);a=f.join(e,f.basename(i))}catch{}}if(!this.isWithin(a,n))throw new N(`escape`,`Path escapes cwd: ${e}`);let o=f.relative(n,a);for(let e of re)if(e.test(o)){if(t===`read`&&/(^|\/)node_modules\//.test(o))continue;throw new N(`blocklisted`,`Path is on the hard blocklist: ${o}`)}if(t===`write`){let e=ne.some(e=>e.test(o));if(!e&&!/^\.env(\.local)?$/.test(o)&&!/^\.claude\//.test(o)&&!/^\.cursor\//.test(o))throw new N(`not-allowlisted`,`Write path not on allowlist: ${o}`)}return a}isWithin(e,t){let n=f.relative(t,e);return!n.startsWith(`..`)&&!f.isAbsolute(n)}async safeRead(e){if(this.readCount>=A)throw new N(`read-cap`,`Read cap (${A}) reached.`);let t=await this.resolveForRead(e),n=await p.stat(t);if(n.size>k)throw new N(`too-large`,`File exceeds ${k}B: ${e} (${n.size}B)`);let r=await p.readFile(t),i=r.subarray(0,Math.min(r.length,8192));if(i.includes(0))throw new N(`binary-rejected`,`Binary content in ${e}.`);return this.readCount++,r.toString(`utf8`)}async safeWrite(e,t){if(this.writeCount>=j)throw new N(`write-cap`,`Write cap (${j}) reached.`);if(t.length>k)throw new N(`too-large`,`Write exceeds ${k}B: ${e}`);let n=await this.resolveForWrite(e),r=await this.journalBackup(n);return await p.mkdir(f.dirname(n),{recursive:!0}),await p.writeFile(n,t,`utf8`),this.writeCount++,{backupPath:r}}async journalBackup(e){let t=await p.readFile(e).catch(e=>{if(e.code===`ENOENT`)return null;throw e}),n=f.join(this.undoRoot,this.sessionId);await p.mkdir(n,{recursive:!0,mode:448});let r=w.createHash(`sha256`).update(e).digest(`hex`).slice(0,16),i=f.join(n,`${r}.bak`),a=f.join(n,`manifest.jsonl`);t&&await p.writeFile(i,t,{mode:384});let o=JSON.stringify({abs:e,backupPath:t?i:null,ts:Date.now()});return await p.appendFile(a,o+`
2
- `,{mode:384}),t?i:null}static wrapForModel(e,t){let n=w.createHash(`sha256`).update(t).digest(`hex`).slice(0,16),r=t.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`);return`<FILE path="${e}" sha256="${n}">\n${r}\n</FILE>`}static scrubSecrets(e){return O(e)}};const ie=[`astro.config.ts`,`astro.config.mjs`,`astro.config.js`];async function ae(e){for(let t of ie)if(await e.exists(t))return{matched:!0,confidence:.95,reason:`Detected Astro via \`${t}\`.`};let t=await e.readFile(`package.json`);if(t)try{let e=JSON.parse(t);if(e.dependencies?.astro??e.devDependencies?.astro)return{matched:!0,confidence:.8,reason:"Detected Astro via `astro` dependency."}}catch{}return{matched:!1,confidence:0,reason:"No astro.config.* or `astro` dependency found."}}function oe(e){let t=e.trackingCode??e.siteId??``,n=`<script defer data-id="${t}" data-allow-localhost="true" src="https://api.zenovay.com/z.js" is:inline></script>`;return[{targetPath:`src/layouts/Layout.astro`,anchorKind:`head-tag`,code:n,description:`Inject the Zenovay tracker inside <head> of the primary layout.`},{targetPath:`src/layouts/BaseHead.astro`,anchorKind:`head-tag`,code:n,description:"Fallback target when the project uses a dedicated `BaseHead.astro`."}]}const se={id:`astro`,displayName:`Astro`,detect:ae,files:[{path:`src/layouts/Layout.astro`,kind:`mutate`,required:!1},{path:`src/layouts/BaseHead.astro`,kind:`mutate`,required:!1},{path:`.env`,kind:`create`,required:!0}],envVarName:`PUBLIC_ZENOVAY_SITE`,buildSnippets:oe},ce=[`app/layout.tsx`,`app/layout.ts`,`app/layout.jsx`,`app/layout.js`];async function le(e){for(let t of ce)if(await e.exists(t))return t;return null}async function F(e){let t=await e.readFile(`package.json`);if(!t)return!1;try{let e=JSON.parse(t);return!!(e.dependencies?.next??e.devDependencies?.next)}catch{return!1}}async function I(e){let t=await F(e),n=await e.exists(`app`),r=await le(e);return t?n?r?{matched:!0,confidence:.95,reason:`Detected Next.js App Router via \`next\` dep + \`${r}\`.`}:{matched:!1,confidence:.4,reason:"Found `app/` but no root layout file (layout.tsx/ts/jsx/js)."}:{matched:!1,confidence:0,reason:"No `app/` directory found — not an App Router project."}:{matched:!1,confidence:0,reason:"package.json does not list `next` as a dependency."}}function L(e){let t=`app/layout.tsx`,n=e.trackingCode??e.siteId??``;return[{targetPath:t,anchorKind:`after-imports`,code:`import Script from 'next/script';`,description:`Import next/script to inject the Zenovay tracker.`},{targetPath:t,anchorKind:`wrap-children`,code:`<Script
3
- defer
4
- data-id="${n}"
5
- data-allow-localhost="true"
6
- src="https://api.zenovay.com/z.js"
7
- strategy="afterInteractive"
8
- />
9
- {children}`,description:`Add the Zenovay tracker <Script> next to children in the root layout.`}]}const R={id:`next-app-router`,displayName:`Next.js (App Router)`,detect:I,files:[{path:`app/layout.tsx`,kind:`mutate`,required:!0}],envVarName:`NEXT_PUBLIC_ZENOVAY_SITE`,buildSnippets:L},z=[`pages/_app.tsx`,`pages/_app.ts`,`pages/_app.jsx`,`pages/_app.js`,`src/pages/_app.tsx`,`src/pages/_app.ts`,`src/pages/_app.jsx`,`src/pages/_app.js`];async function B(e){for(let t of z)if(await e.exists(t))return t;return null}async function V(e){let t=await e.readFile(`package.json`);if(!t)return!1;try{let e=JSON.parse(t);return!!(e.dependencies?.next??e.devDependencies?.next)}catch{return!1}}async function H(e){let t=await V(e);if(!t)return{matched:!1,confidence:0,reason:"package.json does not list `next` as a dependency."};let n=await B(e);if(n)return{matched:!0,confidence:.9,reason:`Detected Next.js Pages Router via \`${n}\`.`};let r=await e.exists(`app`),i=await e.glob(`pages/**/*.{tsx,ts,jsx,js}`);return i.length>0&&!r?{matched:!0,confidence:.7,reason:"Found `pages/` directory with route files but no `_app` — will create one."}:{matched:!1,confidence:.2,reason:`Next.js detected, but no pages-router entry point found.`}}function U(e){let t=`pages/_app.tsx`,n=e.trackingCode??e.siteId??``,r=`import type { AppProps } from 'next/app';
10
- import Script from 'next/script';
11
-
12
- export default function App({ Component, pageProps }: AppProps) {
13
- return (
14
- <>
15
- <Script
16
- defer
17
- data-id="${n}"
18
- data-allow-localhost="true"
19
- src="https://api.zenovay.com/z.js"
20
- strategy="afterInteractive"
21
- />
22
- <Component {...pageProps} />
23
- </>
24
- );
25
- }
26
- `;return[{targetPath:t,anchorKind:`after-imports`,code:`import Script from 'next/script';`,description:"Import next/script in `_app`."},{targetPath:t,anchorKind:`wrap-children`,code:`<><Script defer data-id="${n}" data-allow-localhost="true" src="https://api.zenovay.com/z.js" strategy="afterInteractive" /><Component {...pageProps} /></>`,description:`Render the Zenovay tracker alongside the page component.`},{targetPath:t,anchorKind:`replace-file`,code:r,description:"Full replacement when `_app` does not exist yet."}]}const W={id:`next-pages-router`,displayName:`Next.js (Pages Router)`,detect:H,files:[{path:`pages/_app.tsx`,kind:`mutate`,required:!0}],envVarName:`NEXT_PUBLIC_ZENOVAY_SITE`,buildSnippets:U},ue=x.object({modules:x.array(x.string()).optional(),runtimeConfig:x.object({public:x.record(x.string(),x.unknown()).optional()}).optional()}).passthrough();async function de(e){let t=await e.readFile(`package.json`);if(!t)return{matched:!1,confidence:0,reason:`No package.json found.`};try{let e=JSON.parse(t),n=!!(e.dependencies?.nuxt??e.devDependencies?.nuxt??e.dependencies?.nuxt3??e.devDependencies?.nuxt3);if(n)return{matched:!0,confidence:.95,reason:"Detected Nuxt via `nuxt` / `nuxt3` dependency."}}catch{}let n=await e.exists(`nuxt.config.ts`)||await e.exists(`nuxt.config.js`)||await e.exists(`nuxt.config.mjs`);return n?{matched:!0,confidence:.6,reason:"Found `nuxt.config.*` but no explicit dependency listing."}:{matched:!1,confidence:0,reason:`No Nuxt dependency or config detected.`}}function fe(e){let t=e.trackingCode??e.siteId??``,n=` app: {
27
- head: {
28
- script: [
29
- {
30
- defer: true,
31
- src: 'https://api.zenovay.com/z.js',
32
- 'data-id': '${t}',
33
- 'data-allow-localhost': 'true',
34
- },
35
- ],
36
- },
37
- },`;return[{targetPath:`nuxt.config.ts`,anchorKind:`head-tag`,code:n,description:"Add the Zenovay tracker to Nuxt's `app.head.script` so every page loads it."}]}const pe={id:`nuxt`,displayName:`Nuxt`,detect:de,files:[{path:`nuxt.config.ts`,kind:`mutate`,required:!0}],envVarName:`NUXT_PUBLIC_ZENOVAY_SITE`,buildSnippets:fe},me=[`index.html`,`public/index.html`,`dist/index.html`];async function he(e){for(let t of me)if(await e.exists(t))return{matched:!0,confidence:.5,reason:`Detected plain HTML project via \`${t}\`.`};let t=await e.glob(`**/*.html`);return t.length>0?{matched:!0,confidence:.3,reason:`Found ${t.length} HTML file(s); plain-HTML adapter is usable as fallback.`}:{matched:!1,confidence:0,reason:`No HTML files found in the project.`}}function ge(e){let t=e.siteId??``,n=`<script defer\n data-id="${t}"\n data-allow-localhost="true"\n src="https://api.zenovay.com/z.js">\n</script>`;return[{targetPath:`index.html`,anchorKind:`head-tag`,code:n,description:`Inject the Zenovay tracker inside <head>. Repeat for every HTML file that contains a <head>.`}]}const _e={id:`plain-html`,displayName:`Plain HTML`,detect:he,files:[{path:`index.html`,kind:`mutate`,required:!0}],envVarName:`PUBLIC_ZENOVAY_SITE`,buildSnippets:ge};async function ve(e){let t=await e.readFile(`package.json`);if(t)try{let e=JSON.parse(t),n={...e.dependencies??{},...e.devDependencies??{}},r=Object.keys(n).some(e=>e.startsWith(`@remix-run/`));if(r)return{matched:!0,confidence:.95,reason:"Detected Remix via `@remix-run/*` dependencies."}}catch{}return await e.exists(`remix.config.js`)||await e.exists(`remix.config.ts`)?{matched:!0,confidence:.8,reason:"Detected Remix via `remix.config.*`."}:{matched:!1,confidence:0,reason:`No Remix dependency or config detected.`}}function ye(e){let t=e.trackingCode??e.siteId??``;return[{targetPath:`app/root.tsx`,anchorKind:`head-tag`,code:`<script defer data-id="${t}" data-allow-localhost="true" src="https://api.zenovay.com/z.js"></script>`,description:`Inline the Zenovay tracker <script> inside the document <head>.`}]}const be={id:`remix`,displayName:`Remix`,detect:ve,files:[{path:`app/root.tsx`,kind:`mutate`,required:!0}],envVarName:`PUBLIC_ZENOVAY_SITE`,buildSnippets:ye};async function xe(e){let t=await e.readFile(`package.json`);if(!t)return{matched:!1,confidence:0,reason:`No package.json found.`};try{let e=JSON.parse(t),n=!!(e.dependencies?.[`@sveltejs/kit`]??e.devDependencies?.[`@sveltejs/kit`]);return n?{matched:!0,confidence:.95,reason:"Detected SvelteKit via `@sveltejs/kit` dependency."}:{matched:!1,confidence:0,reason:"`@sveltejs/kit` not in dependencies."}}catch{return{matched:!1,confidence:0,reason:`package.json is not valid JSON.`}}}function Se(e){let t=e.trackingCode??e.siteId??``,n=`<svelte:head>
38
- <script defer data-id="${t}" data-allow-localhost="true" src="https://api.zenovay.com/z.js"></script>
39
- </svelte:head>
40
-
41
- <slot />
42
- `;return[{targetPath:`src/routes/+layout.svelte`,anchorKind:`replace-file`,code:n,description:`Root layout that loads the Zenovay tracker in every route via <svelte:head>.`}]}const Ce={id:`sveltekit`,displayName:`SvelteKit`,detect:xe,files:[{path:`src/routes/+layout.svelte`,kind:`mutate`,required:!0}],envVarName:`PUBLIC_ZENOVAY_SITE`,buildSnippets:Se},we=[R,W,pe,Ce,se,be,_e];async function G(e){let t=[];for(let n of we){let r=await n.detect(e);t.push({adapter:n,result:r})}let n=[...t].sort((e,t)=>t.result.confidence-e.result.confidence),r=n[0],i=r&&r.result.matched?r.adapter:null;return{adapter:i,ranked:n}}function K(e){let t=t=>f.resolve(e,t);return{cwd:e,async readFile(e){try{return await p.readFile(t(e),`utf8`)}catch(e){let t=e.code;if(t===`ENOENT`||t===`EISDIR`)return null;throw e}},async exists(e){try{return await p.access(t(e)),!0}catch{return!1}},async glob(t){return S(t,{cwd:e,dot:!1,gitignore:!0,onlyFiles:!0,followSymbolicLinks:!1})}}}async function q(e,t){let n=K(e),{adapter:r,ranked:i}=await G(n),a=i[0];return r&&a&&a.result.confidence>=.7?r:t?t.pickInteractively(i):r}function Te(e,t){let n=/[\s"'#=]/.test(t)||t===``,r=n?`"${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`:t;return`${e}=${r}`}function Ee(e){let t=new Set;for(let n of e.split(/\r?\n/)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(i)&&t.add(i)}return t}async function J(e,t,n={}){let r=n.filename??`.env.local`,i=f.resolve(e,r),a=``,o=!0;try{a=await p.readFile(i,`utf8`)}catch(e){if(e.code===`ENOENT`)o=!1;else throw e}let s=o?Ee(a):new Set,c=[],l=[],u=[];for(let[e,n]of Object.entries(t)){if(s.has(e)){l.push(e);continue}u.push(Te(e,n)),c.push(e)}if(c.length===0)return{created:!1,existing:o,addedKeys:c,skippedKeys:l};let d=`# Added by Zenovay CLI`,m;if(o){let e=a.length>0&&!a.endsWith(`
43
- `);m=a+(e?`
44
- `:``)+`
45
- `+d+`
46
- `+u.join(`
47
- `)+`
48
- `}else m=d+`
49
- `+u.join(`
50
- `)+`
51
- `;if(o)await p.writeFile(i,m,`utf8`);else{let e=await p.open(i,`w`,384);try{await e.writeFile(m,`utf8`)}finally{await e.close()}}return{created:!o,existing:o,addedKeys:c,skippedKeys:l}}const De=`https://api.zenovay.com/mcp`,Oe=x.object({url:x.string().url(),headers:x.record(x.string(),x.string()).optional()}),ke=x.object({mcpServers:x.record(x.string(),Oe).optional()}).passthrough();function Ae(e){return e.HOME??e.USERPROFILE??b.homedir()}function je(e){return e.APPDATA??null}function Me(e,t){let n=Ae(t),r=je(t),i=[];return i.push({id:`cursor`,displayName:`Cursor`,configPath:f.join(n,`.cursor`,`mcp.json`)}),e===`win32`&&r&&i.push({id:`cursor`,displayName:`Cursor (AppData)`,configPath:f.join(r,`Cursor`,`User`,`globalStorage`,`cursor.mcp`,`mcp.json`)}),e===`darwin`?i.push({id:`claude-desktop`,displayName:`Claude Desktop`,configPath:f.join(n,`Library`,`Application Support`,`Claude`,`claude_desktop_config.json`)}):e===`win32`&&r?i.push({id:`claude-desktop`,displayName:`Claude Desktop`,configPath:f.join(r,`Claude`,`claude_desktop_config.json`)}):i.push({id:`claude-desktop`,displayName:`Claude Desktop`,configPath:f.join(n,`.config`,`Claude`,`claude_desktop_config.json`)}),i.push({id:`vscode`,displayName:`VS Code`,configPath:f.join(n,`.vscode`,`mcp.json`)}),i}async function Ne(e){try{return await p.access(e),!0}catch{return!1}}async function Pe(e){try{let t=await p.readFile(e,`utf8`);if(t.trim().length===0)return{};let n=JSON.parse(t),r=ke.safeParse(n);return r.success?r.data:n&&typeof n==`object`?n:{}}catch{return{}}}function Fe(e){return{url:De,headers:{Authorization:`Bearer ${e}`}}}async function Ie(e){let t=e.env??process.env,n=e.platform??process.platform,r=new Set(e.skip??[]),i=[],a=[],o=[],s=new Set,c=Fe(e.accessToken);for(let e of Me(n,t)){if(r.has(e.id)){a.push(e.displayName);continue}if(s.has(e.configPath))continue;s.add(e.configPath);try{let t=await Ne(e.configPath);if(!t){a.push(e.displayName);continue}let n=await Pe(e.configPath),r=`${e.configPath}.bak`;await p.copyFile(e.configPath,r);let o={...n,mcpServers:{...n.mcpServers??{},zenovay:c}};await p.mkdir(f.dirname(e.configPath),{recursive:!0}),await p.writeFile(e.configPath,JSON.stringify(o,null,2)+`
52
- `,`utf8`),i.push(e.displayName)}catch(t){o.push({client:e.displayName,message:t instanceof Error?t.message:String(t)})}}return{installed:i,skipped:a,errors:o}}async function Le(e,t,n){let r=n.timeoutMs??18e4,i=n.pollIntervalMs??2e3,a=n.now??(()=>Date.now()),o=n.sleep??(e=>new Promise(t=>setTimeout(t,e))),s=a(),c=s+r;for(n.onTick?.(0);;){let l=await n.api.getFirstEvent({siteId:e,since:t});if(l.received)return{received:!0,event:l.event};let u=a()-s;if(u>=r)return{received:!1};let d=c-a(),f=Math.min(i,Math.max(0,d));if(f<=0)return{received:!1};await o(f),n.onTick?.(a()-s)}}const Re=x.object({path:x.string().min(1)}),ze=x.object({path:x.string().min(1),content:x.string(),reason:x.string().min(1)}),Be=x.object({path:x.string().min(1),patch:x.string().min(1),reason:x.string().min(1)}),Ve=x.object({}),He=x.object({question:x.string().min(1),choices:x.array(x.string()).optional()});async function Ue(e,t){let n=Re.safeParse(t);if(!n.success)return{ok:!1,content:null,error:`invalid_args`};try{let t=await e.safeRead(n.data.path),r=P.scrubSecrets(t);return{ok:!0,content:P.wrapForModel(n.data.path,r)}}catch(e){return{ok:!1,content:null,error:e.message}}}async function Y(e,t,n){let r=ze.safeParse(t);if(!r.success)return{ok:!1,content:null,error:`invalid_args`};let{path:i,content:a,reason:o}=r.data,s=``;try{s=await e.safeRead(i)}catch{s=``}let c=await n.approve({path:i,oldContent:s,newContent:a,reason:o});if(c===`n`)return{ok:!1,content:null,error:`skipped_by_user`};if(c===`e`)return{ok:!1,content:null,error:`deferred_to_user_edit`};try{let{backupPath:t}=await e.safeWrite(i,a);return{ok:!0,content:{path:i,backupPath:t}}}catch(e){return{ok:!1,content:null,error:e.message}}}async function We(e,t,n){let r=Be.safeParse(t);if(!r.success)return{ok:!1,content:null,error:`invalid_args`};let{path:i,patch:a,reason:o}=r.data,s;try{s=await e.safeRead(i)}catch(e){return{ok:!1,content:null,error:e.message}}let c=E(s,a);return c===!1||typeof c!=`string`?{ok:!1,content:null,error:`patch_did_not_apply_cleanly`}:Y(e,{path:i,content:c,reason:o},n)}async function X(e){try{let t=K(e),{adapter:n,ranked:r}=await G(t);return{ok:!0,content:{matched:n!==null,adapter:n?.id,displayName:n?.displayName,ranked:r.map(e=>({id:e.adapter.id,confidence:e.result.confidence,reason:e.result.reason}))}}}catch(e){return{ok:!1,content:null,error:e.message}}}async function Ge(e,t){let n=He.safeParse(t);if(!n.success)return{ok:!1,content:null,error:`invalid_args`};try{let t=await e.ask(n.data);return{ok:!0,content:{answer:t}}}catch(e){return{ok:!1,content:null,error:e.message}}}async function Ke(e){let{api:t,sandbox:n,approval:i,prompter:a,handlers:o}=e,s=[...e.initialMessages],c=``,l=0;for(;l<M;){n.incrementRound(),l++;let e=await t.openAiStream(`install`,{messages:s,cwd_fingerprint:n.sessionId}),u=[],d=``;for await(let t of r(e))switch(t.type){case`delta`:d+=t.content,o?.onDelta?.(t.content);break;case`tool_start`:o?.onToolStart?.({id:t.id,name:t.name});break;case`tool_call`:{let e=await qe(t.name,t.arguments,{sandbox:n,cwd:n.cwd,approval:i,prompter:a});u.push({id:t.id,content:e}),o?.onToolResult?.({id:t.id,name:t.name,result:e});break}case`usage`:o?.onUsage?.(t);break;case`error`:throw o?.onError?.(t),Error(`[${t.code}] ${t.message}`);case`done`:break}if(d&&(c+=d),u.length===0){d&&s.push({role:`assistant`,content:d});break}d&&s.push({role:`assistant`,content:d});for(let e of u)s.push({role:`tool`,toolCallId:e.id,content:JSON.stringify(e.content)})}return{finalText:c,rounds:l}}async function qe(e,t,n){switch(e){case`read_file`:return Ue(n.sandbox,t);case`write_file`:return Y(n.sandbox,t,n.approval);case`patch_file`:return We(n.sandbox,t,n.approval);case`detect_framework`:return X(n.cwd);case`ask_user`:return Ge(n.prompter,t);default:return{ok:!1,content:null,error:`unknown_tool:${e}`}}}async function Je(e){return a(e)?Ye(e):new Promise(t=>{let{unmount:n,waitUntilExit:r}=g(_.createElement(Xe,{opts:e,onExit:e=>{n(),t(e)}}));r().catch(()=>t(1))})}async function Ye(r){try{let a=await e(),o=await q(r.cwd);if(!o)return i({type:`error`,code:`no_framework`,message:`Could not detect framework (headless mode has no picker).`}),2;i({type:`framework.detected`,framework:o.id,confidence:1});let s=await n({strict:!1});if(!s&&!process.env.ZENOVAY_API_TOKEN)return i({type:`error`,code:`not_logged_in`,message:"Run `zenovay login` first (or set ZENOVAY_API_TOKEN)."}),2;let c=new t({config:a,cliVersion:r.cliVersion,token:s}),l=await c.getSites(),u=r.siteId?l.find(e=>e.id===r.siteId):l[0];if(!u&&r.siteId)return i({type:`error`,code:`site_not_found`,message:`Site ${r.siteId} not found.`}),2;if(!u)return i({type:`error`,code:`no_site`,message:`No sites exist; create one at app.zenovay.com or re-run interactively.`}),2;i({type:`info`,message:`Using site ${u.id} (${u.name}) trackingCode=${u.trackingCode??u.id}`});let d=await J(r.cwd,{[o.envVarName]:u.trackingCode??u.id});return i({type:`info`,message:`env vars added: ${d.addedKeys.join(`,`)}`}),i({type:`done`,command:`init`,exitCode:0}),0}catch(e){return i({type:`error`,code:`init_failed`,message:e.message}),1}}const Xe=({opts:r,onExit:i})=>{let{exit:a}=ee(),[l,d]=y(`intro`),[f,p]=y(null),[g,b]=y([]),[x,S]=y(null),[w,T]=y(null),[E,D]=y(null),O=te(!1);return v(()=>{O.current||(O.current=!0,(async()=>{try{d(`detecting`);let i=await q(r.cwd);if(!i){D(`Could not detect your framework. Supported: Next.js, Nuxt, SvelteKit, Astro, Remix, plain HTML.`),d(`error`);return}p(i);let a=await n({strict:!1});!process.env.ZENOVAY_API_TOKEN&&!a&&(d(`login`),await o({cliVersion:r.cliVersion})),d(`loading-sites`);let s=await e(),c=await n({strict:!1}),l=new t({config:s,cliVersion:r.cliVersion,token:c}),u=await l.getSites(),f=await tt(r.cwd),m=Q(u,f);if(b(u),S(f),u.length===0){d(`create-site`);return}if(r.siteId){let e=u.find(e=>e.id===r.siteId);if(!e){D(`Site ${r.siteId} not found in your account.`),d(`error`);return}T(e),Z(e,i,r,{setPhase:d,setErrorMsg:D});return}if(r.yes&&m){T(m),Z(m,i,r,{setPhase:d,setErrorMsg:D});return}d(`site-picker`)}catch(e){D(e.message),d(`error`)}})())},[]),v(()=>{l===`success`&&setTimeout(()=>{a(),i(0)},1500),l===`error`&&setTimeout(()=>{a(),i(1)},8e3)},[l]),_.createElement(m,{flexDirection:`column`},_.createElement(c,{version:r.cliVersion,subtitle:`AI install wizard`}),l===`intro`&&_.createElement(Ze,null),l===`detecting`&&_.createElement(s,{title:`Scanning`,state:`busy`},_.createElement(m,null,_.createElement(h,{color:`magenta`},_.createElement(C,{type:`dots`})),_.createElement(h,null,` Detecting framework…`))),l===`login`&&_.createElement(s,{title:`Authenticating`,state:`busy`},_.createElement(h,null,`Opening browser for login… (paste ZENOVAY_API_TOKEN env var to skip)`)),l===`loading-sites`&&_.createElement(s,{title:`Loading your sites`,state:`busy`},_.createElement(m,null,_.createElement(h,{color:`magenta`},_.createElement(C,{type:`dots`})),_.createElement(h,null,` Fetching your Zenovay sites…`))),l===`site-picker`&&f&&_.createElement(Qe,{sites:g,preselectHint:x,onPick:e=>{if(e===`create-new`){d(`create-site`);return}T(e),Z(e,f,r,{setPhase:d,setErrorMsg:D})}}),l===`create-site`&&_.createElement(s,{title:`Create a new site`,state:`warn`},_.createElement(h,{color:`yellow`},"No site picked (or none exist yet). Visit https://app.zenovay.com/websites to create one, then re-run `zenovay init`."),_.createElement(h,{color:`gray`},`(Inline site creation from the CLI is scheduled for V1.1 — it requires a plan-limit check.)`)),l===`agent`&&f&&w&&_.createElement(s,{title:`Installing into ${f.displayName}`,state:`busy`},_.createElement(m,null,_.createElement(h,{color:`magenta`},_.createElement(C,{type:`dots`})),_.createElement(h,null,` Agent writing tracker into your project…`)),_.createElement(h,{color:`gray`},`Site: `,w.name,` · code: `,w.trackingCode??w.id)),l===`verify`&&_.createElement(s,{title:`Waiting for first event`,state:`busy`},_.createElement(m,null,_.createElement(h,{color:`magenta`},_.createElement(C,{type:`dots`})),_.createElement(h,null,` Start your dev server and visit any page…`))),l===`success`&&f&&w&&_.createElement($e,{adapter:f,site:w}),l===`error`&&_.createElement(s,{title:`Install failed`,state:`err`},_.createElement(h,{color:`red`},E??`Unknown error`)),_.createElement(u,{items:[{key:`q`,label:`quit`},{key:`ctrl-c`,label:`abort`}]}))};async function Z(r,i,a,o){try{o.setPhase(`agent`);let s=await e(),c=await n({strict:!1}),l=new t({config:s,cliVersion:a.cliVersion,token:c}),u=new P({cwd:a.cwd}),d=r.trackingCode??r.id,f=i.buildSnippets({trackingCode:d,siteId:r.id}),p=`Install Zenovay tracking into this ${i.displayName} project.\nSite: ${r.name} (trackingCode: ${d}).\n1. Call detect_framework to confirm the framework.\n2. Read the entry file(s) for this framework:\n`+i.files.map(e=>` - ${e.path}`).join(`
53
- `)+`
54
- 3. Insert the tracker using the snippet below.
55
- 4. Confirm the change with a diff before writing.
56
-
57
- Snippet reference (anchored by anchorKind — adapt to the actual file):
58
- `+f.map(e=>` ${e.anchorKind} @ ${e.targetPath}:\n ${e.code.replace(/\n/g,`
59
- `)}`).join(`
60
-
61
- `),m=null;try{await Ke({api:l,sandbox:u,approval:{async approve(){return`y`}},prompter:{async ask({question:e}){return e}},initialMessages:[{role:`user`,content:p}]})}catch(e){m=e}let h=u.stats();if(h.writes===0){let e=m?`Agent error: ${m.message}`:`Agent returned without writing any files (${h.reads} reads, ${h.rounds} rounds). The model may have refused or the AI Gateway may be misconfigured. Check api.zenovay.com logs.`;throw Error(e)}await J(a.cwd,{[i.envVarName]:d}),!a.skipMcp&&c&&(o.setPhase(`mcp-install`),await Ie({accessToken:c.accessToken}).catch(()=>void 0)),a.skipVerify||(o.setPhase(`verify`),await Le(r.id,Date.now(),{api:l,timeoutMs:12e4}).catch(()=>void 0)),o.setPhase(`success`)}catch(e){o.setErrorMsg(e.message),o.setPhase(`error`)}}const Ze=()=>_.createElement(s,{title:`Zenovay wants to set up your project`,state:`idle`},_.createElement(h,null,`We'll use AI to analyze your codebase and add the Zenovay tracker.`),_.createElement(h,{color:`gray`},`.env* contents stay on your machine. Only framework metadata reaches api.zenovay.com.`)),Qe=({sites:e,preselectHint:t,onPick:n})=>{let r=Q(e,t),i=e.filter(e=>e.id!==r?.id),a=r?[r,...i]:i,o=[...a.map(e=>({label:et(e,e.id===r?.id),value:e,description:e.trackingCode?`trackingCode: ${e.trackingCode}`:void 0})),{label:`+ Create new site on app.zenovay.com`,value:`create-new`,description:`Open the dashboard to add a new website`}];return _.createElement(s,{title:t?`Pick a site (best match: ${t})`:`Pick a site`,state:`idle`},_.createElement(d,{items:o,onSelect:n}))},$e=({adapter:e,site:t})=>_.createElement(s,{title:`You're live on Zenovay`,state:`ok`},_.createElement(h,null,_.createElement(l,null,`✔ Installed successfully`)),_.createElement(h,null,`Framework: `,e.displayName),_.createElement(h,null,`Site: `,t.name,` (`,t.url,`)`),t.trackingCode?_.createElement(h,{color:`gray`},`Tracker code: `,t.trackingCode):null,_.createElement(h,{color:`gray`},`Dashboard: https://app.zenovay.com/sites/`,t.id),_.createElement(h,{color:`gray`},"Next: `zenovay watch` for a live TUI."));function et(e,t){let n=`${e.name}`.padEnd(30,` `).slice(0,30),r=e.url.replace(/^https?:\/\//,``).padEnd(28,` `).slice(0,28),i=t?` ← best match`:``;return`${n} ${r}${i}`}async function tt(e){try{let t=await p.readFile(f.join(e,`package.json`),`utf8`),n=JSON.parse(t);if(n.name)return String(n.name).replace(/^@[^/]+\//,``)}catch{}try{let t=await p.readFile(f.join(e,`.git`,`config`),`utf8`),n=t.match(/url\s*=\s*.*[/:]([^/]+?)(?:\.git)?\s*$/m);if(n&&n[1])return n[1]}catch{}return f.basename(e)}function Q(e,t){if(!t||e.length===0)return e[0]??null;let n=$(t),r=e.find(e=>$(e.name)===n);if(r)return r;let i=e.find(e=>{let t=e.url.replace(/^https?:\/\//,``).replace(/\/.*$/,``),[r]=t.split(`.`);return $(r??``)===n});if(i)return i;let a=e.find(e=>$(e.name).includes(n)||$(e.url).includes(n));return a??e[0]??null}function $(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}export{Je as initCommand};
@@ -1 +0,0 @@
1
- import"./formatter-CEeFGNXS.js";import"./api-B7QWXBbG.js";import"./client-ClN0aAAQ.js";import"./emit-CbAMzl5f.js";import{initCommand as e}from"./init-PAKqEfEt.js";import"./login-CCbw5DxV.js";import"./panel-s0DHmKcg.js";import"./keybar-D2LIBUlF.js";import"./prompt-C1qNVY6f.js";export{e as initCommand};
@@ -1 +0,0 @@
1
- import"./formatter-CEeFGNXS.js";import"./api-B7QWXBbG.js";import"./emit-CbAMzl5f.js";import{loginCommand as e}from"./login-CCbw5DxV.js";export{e as loginCommand};
@@ -1 +0,0 @@
1
- import{readConfig as e}from"./formatter-CEeFGNXS.js";import{ApiClient as t,pollDeviceToken as n,startDeviceAuthorization as r,writeToken as i}from"./api-B7QWXBbG.js";import{emit as a,isHeadless as o}from"./emit-CbAMzl5f.js";import s from"open";async function c(c){let l=await e(),u=o({json:c.json}),d=await r({apiBase:l.apiBase}),f=d.verification_uri_complete??d.verification_uri;u?a({type:`info`,message:`Open ${f} and enter code ${d.user_code}`}):c.onCode?c.onCode({userCode:d.user_code,verificationUri:d.verification_uri,verificationUriComplete:d.verification_uri_complete}):process.stdout.write(`\n Open this URL to authorize the CLI:\n ${f}\n Or enter code: ${d.user_code}\n\n`);let p=c.openBrowser??!u;if(p)try{await s(f)}catch{}let m=await n({apiBase:l.apiBase,deviceCode:d.device_code,interval:d.interval,expiresIn:d.expires_in});await i(m);let h=new t({config:l,cliVersion:c.cliVersion,token:m}),g=await h.me().catch(()=>null);if(g){let e={...m,userId:g.user.id,teamId:g.team?.id,email:g.user.email};await i(e)}return u&&a({type:`done`,command:`login`,exitCode:0}),{email:g?.user.email}}export{c as loginCommand};
@@ -1,2 +0,0 @@
1
- import{readConfig as e}from"./formatter-CEeFGNXS.js";import{ApiClient as t,clearToken as n,readToken as r}from"./api-B7QWXBbG.js";import{emit as i,isHeadless as a}from"./emit-CbAMzl5f.js";async function o(o){let s=await e(),c=await r({strict:!1}).catch(()=>null);if(c)try{let e=new t({config:s,cliVersion:o.cliVersion,token:c});await e.revokeCurrentToken()}catch{}await n(),a({json:o.json})?i({type:`done`,command:`logout`,exitCode:0}):process.stdout.write(`Logged out.
2
- `)}export{o as logoutCommand};
@@ -1,9 +0,0 @@
1
- import{formatTabular as e,readConfig as t,selectFormat as n}from"./formatter-CEeFGNXS.js";import{readToken as r}from"./api-B7QWXBbG.js";import{Panel as i}from"./panel-s0DHmKcg.js";import{Banner as a}from"./keybar-D2LIBUlF.js";import"./prompt-C1qNVY6f.js";import"./sparkline-CR_bzxwB.js";import{Table as o}from"./ui-CvxpWJH-.js";import{ApiV2Client as s}from"./api-v2-Ge4WrV8S.js";import{Box as c,Text as l,useApp as u,useInput as d}from"ink";import f,{useMemo as p,useState as m}from"react";import h from"ink-text-input";function g({api:e,siteId:t,maxRows:n}){let{exit:r}=u(),[s,g]=m(``),[_,v]=m(null),[y,b]=m(null),[x,S]=m(!1),[C,w]=m([]);d((e,t)=>{t.escape&&r()});let T=async i=>{if(i.trim()){if(i.trim()===`\\q`||i.trim()===`exit`||i.trim()===`quit`){r();return}w(e=>[...e,i]),S(!0),b(null);try{let r=await e.runSqlQuery(t,i,{maxRows:n});v(r)}catch(e){b(e.message),v(null)}finally{S(!1),g(``)}}},E=p(()=>_?_.columns.map(e=>({key:e,header:e,width:18,format:e=>e==null?`∅`:String(e).slice(0,18)})):[],[_]);return f.createElement(c,{flexDirection:`column`},f.createElement(a,{version:`query`}),f.createElement(i,{title:`History`,state:`idle`},C.length===0?f.createElement(l,{color:`gray`},`— no queries yet — Esc or \\q to exit —`):C.slice(-5).map((e,t)=>f.createElement(l,{key:t,color:`gray`},`> ${e.slice(0,80)}${e.length>80?`…`:``}`))),f.createElement(c,null,f.createElement(l,{color:`magenta`},`sql`,`>`,` `),f.createElement(h,{value:s,onChange:g,onSubmit:T})),x?f.createElement(l,{color:`gray`},`running…`):null,y?f.createElement(i,{title:`Error`,state:`err`},f.createElement(l,{color:`red`},y)):null,_?f.createElement(i,{title:`${_.row_count} rows · ${_.duration_ms}ms${_.truncated?` · truncated`:``}`,state:`ok`},_.row_count===0?f.createElement(l,{color:`gray`},`— empty —`):f.createElement(o,{data:_.rows.slice(0,50),columns:E})):null)}async function _(i){let a=await t(),o=await r({strict:!1}),c=i.siteId??o?.teamId??``;if(!c)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
- `),2;let l=new s({config:a,cliVersion:i.cliVersion,token:o}),u=i.maxRows??1e3,d=n(i);if(i.sql)try{let t=await l.runSqlQuery(c,i.sql,{maxRows:u});if(d===`json`)process.stdout.write(JSON.stringify(t,null,2)),process.stdout.write(`
3
- `);else if(d===`ndjson`)for(let e of t.rows)process.stdout.write(JSON.stringify(e)+`
4
- `);else if(d===`csv`||d===`tsv`)process.stdout.write(e(t.rows,t.columns,d));else{let e=t.columns.map(e=>Math.max(e.length,...t.rows.map(t=>String(t[e]??``).length))),n=`+`+e.map(e=>`-`.repeat(e+2)).join(`+`)+`+`;process.stdout.write(n+`
5
- `),process.stdout.write(`|`+t.columns.map((t,n)=>` ${t.padEnd(e[n]??0)} `).join(`|`)+`|
6
- `),process.stdout.write(n+`
7
- `);for(let n of t.rows.slice(0,200))process.stdout.write(`|`+t.columns.map((t,r)=>` ${String(n[t]??``).padEnd(e[r]??0)} `).join(`|`)+`|
8
- `);process.stdout.write(n+`
9
- `),process.stdout.write(`${t.row_count} rows · ${t.duration_ms}ms${t.truncated?` · truncated`:``}\n`)}return 0}catch(e){return process.stderr.write(`✗ ${e.message}\n`),1}let{render:p}=await import(`ink`);return await p(f.createElement(g,{api:l,siteId:c,maxRows:u})).waitUntilExit(),0}export{_ as queryCommand};
@@ -1,3 +0,0 @@
1
- import{formatTabular as e,readConfig as t,selectFormat as n}from"./formatter-CEeFGNXS.js";import{readToken as r}from"./api-B7QWXBbG.js";import"./panel-s0DHmKcg.js";import"./keybar-D2LIBUlF.js";import"./prompt-C1qNVY6f.js";import{runAnalyticalScreen as i}from"./analytical-screen-3XlrpJ98.js";import{spark as a}from"./sparkline-CR_bzxwB.js";import"./ui-CvxpWJH-.js";import{ApiV2Client as o}from"./api-v2-Ge4WrV8S.js";import{Box as s,Text as c}from"ink";import l from"react";function u(e,t){let n=e/100,r=new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:0}).format(n),i=(t||`USD`).toUpperCase();return i===`USD`?`$${r}`:i===`EUR`?`€${r}`:i===`GBP`?`£${r}`:`${r} ${i}`}async function d(d){let f=await t(),p=await r({strict:!1}),m=d.siteId??p?.teamId??``;if(!m)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
- `),2;let h=new o({config:f,cliVersion:d.cliVersion,token:p}),g=n(d),_=d.range??`30d`;return i({cliVersion:d.cliVersion,title:`revenue · ${m} · ${_}`,commandName:`revenue`,authToken:p?.accessToken??null,refreshIntervalMs:d.watch?5*6e4:0,fetcher:e=>h.getRevenue(m,_,e),format:g,headlessEmit:(t,n)=>{if(n===`json`||n===`ndjson`){process.stdout.write(JSON.stringify(t,null,n===`json`?2:0)),n===`ndjson`&&process.stdout.write(`
3
- `);return}process.stdout.write(e(t.series,[`bucket`,`amount`,`currency`,`transactions`],n))},panels:[{id:`totals`,title:`Top line`,render:e=>l.createElement(s,{flexDirection:`column`},l.createElement(c,null,l.createElement(c,{color:`green`,bold:!0},u(e.totalAmount,e.currency)),` `,l.createElement(c,{color:`gray`},`total · `,e.totalTransactions,` transactions`)),typeof e.mrr==`number`?l.createElement(c,null,l.createElement(c,{bold:!0},`MRR `),l.createElement(c,{color:`magenta`},u(e.mrr,e.currency)),typeof e.arpu==`number`?l.createElement(c,{color:`gray`},` · ARPU `,u(e.arpu,e.currency)):null):null)},{id:`series`,title:`Daily (${_})`,render:e=>{let t=e.series.map(e=>e.amount);if(t.length===0)return l.createElement(c,{color:`gray`},`— no transactions —`);let n=Math.max(...t,1);return l.createElement(s,{flexDirection:`column`},l.createElement(c,{color:`magenta`},a(t,Math.min(60,t.length*2))),l.createElement(c,{color:`gray`},`peak: `,u(n,e.currency),` ·`,` `,`avg: `,u(e.totalAmount/Math.max(1,t.length),e.currency)))}},{id:`window`,title:`Window`,render:e=>l.createElement(c,{color:`gray`},new Date(e.windowStart).toISOString().slice(0,10),` →`,` `,new Date(e.windowEnd).toISOString().slice(0,10))}]})}export{d as revenueCommand};
@@ -1,3 +0,0 @@
1
- import{formatTabular as e,readConfig as t,selectFormat as n}from"./formatter-CEeFGNXS.js";import{readToken as r}from"./api-B7QWXBbG.js";import"./panel-s0DHmKcg.js";import"./keybar-D2LIBUlF.js";import"./prompt-C1qNVY6f.js";import{runAnalyticalScreen as i}from"./analytical-screen-3XlrpJ98.js";import"./sparkline-CR_bzxwB.js";import{Table as a}from"./ui-CvxpWJH-.js";import{ApiV2Client as o}from"./api-v2-Ge4WrV8S.js";import{Box as s,Text as c}from"ink";import l from"react";function u(e){return`${(e*100).toFixed(1)}%`}function d(e){return e<60?`${Math.round(e)}s`:e<3600?`${Math.floor(e/60)}m ${Math.round(e%60)}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}async function f(f){let p=await t(),m=await r({strict:!1}),h=f.siteId??m?.teamId??``;if(!h)return process.stderr.write(`No site selected — pass --site-id or set ZENOVAY_SITE.
2
- `),2;let g=new o({config:p,cliVersion:f.cliVersion,token:m}),_=n(f),v=f.range??`24h`,y=[{key:`url`,header:`page`,width:40,format:e=>String(e??`—`)},{key:`views`,header:`views`,width:8,align:`right`}],b=[{key:`country`,header:`country`,width:8},{key:`visitors`,header:`visitors`,width:8,align:`right`}];return i({cliVersion:f.cliVersion,title:`stats · ${h} · ${v}`,commandName:`stats`,authToken:m?.accessToken??null,refreshIntervalMs:f.watch?6e4:0,fetcher:e=>g.getStats(h,v,e),format:_,headlessEmit:(t,n)=>{if(n===`json`||n===`ndjson`){process.stdout.write(JSON.stringify(t,null,n===`json`?2:0)),n===`ndjson`&&process.stdout.write(`
3
- `);return}process.stdout.write(e([{range:v,visitors:t.visitors,pageviews:t.pageviews,sessions:t.sessions,bounceRate:u(t.bounceRate),avgSession:d(t.avgSessionSec)}],[`range`,`visitors`,`pageviews`,`sessions`,`bounceRate`,`avgSession`],n))},panels:[{id:`summary`,title:`Summary`,render:e=>l.createElement(s,{flexDirection:`column`},l.createElement(c,null,l.createElement(c,{bold:!0},e.visitors.toLocaleString()),l.createElement(c,{color:`gray`},` visitors `),l.createElement(c,{bold:!0},e.pageviews.toLocaleString()),l.createElement(c,{color:`gray`},` pageviews `),l.createElement(c,{bold:!0},e.sessions.toLocaleString()),l.createElement(c,{color:`gray`},` sessions`)),l.createElement(c,{color:`gray`},`bounce `,u(e.bounceRate),` · avg session `,d(e.avgSessionSec)))},{id:`pages`,title:`Top pages`,render:e=>e.topPages.length===0?l.createElement(c,{color:`gray`},`— no pages —`):l.createElement(a,{data:e.topPages.slice(0,10),columns:y})},{id:`countries`,title:`Top countries`,render:e=>e.topCountries.length===0?l.createElement(c,{color:`gray`},`— no country data —`):l.createElement(a,{data:e.topCountries.slice(0,10),columns:b})}]})}export{f as statsCommand};