@vee_stack/cli 6.3.19 → 6.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,224 +1,226 @@
1
1
  #!/usr/bin/env node
2
- import {createRequire}from'module';import {config}from'dotenv';import*as ie from'path';import {dirname,join,resolve,basename}from'path';import {fileURLToPath}from'url';import*as U from'fs';import {existsSync,readFileSync,statSync,writeFileSync}from'fs';import g from'chalk';import {Command}from'commander';import {execSync}from'child_process';import*as z from'crypto';import z__default from'crypto';import en from'ora';import {glob}from'glob';import on from'cli-progress';import*as le from'os';import {homedir}from'os';import {VERSION,TOKEN_SALT}from'@vee_stack/utils';import*as b from'fs/promises';import {configEnv,validateEnvironment}from'@vee_stack/config';import Lt from'prompts';import Sn from'readline';import {gzipSync}from'zlib';import xn from'open';import Pr from'omelette';globalThis.require = createRequire(import.meta.url); globalThis.CLI_VERSION = "6.3.19"; globalThis.SNAPSHOT_VERSION = "6.0.0"; globalThis.ENGINE_TARGET = "6.0.0"; globalThis.AUDIT_VERSION = "6.0"; globalThis.SESSION_PAYLOAD_VERSION = "6.0.0"; globalThis.RULES_VERSION = "6.0.0"; globalThis.ANALYSIS_VERSION = "6.0.0"; globalThis.API_VERSION = "v6"; globalThis.MIN_NODE = 20;
3
- var lo=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,o)=>(typeof require<"u"?require:t)[o]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var uo=[/^--token[=\s]/i,/^-t[=\s]/i,/^--api-key[=\s]/i,/^--apikey[=\s]/i,/^--key[=\s]/i,/^--auth[=\s]/i,/^--bearer[=\s]/i,/token[=:]\s*[a-zA-Z0-9_-]{10,}/i,/api[_-]?key[=:]\s*[a-zA-Z0-9_-]{10,}/i],ae=/vs_[a-zA-Z0-9_-]{20,}/i;function pt(){let e=process.argv.slice(2);for(let t of e){for(let o of uo)o.test(t)&&(console.error(g.red(`
4
- \u274C Security Error: Token detected in command line arguments`)),console.error(g.yellow(`
5
- Passing tokens via CLI arguments is not allowed.`)),console.error(g.yellow("This prevents tokens from being saved in shell history (~/.bash_history, ~/.zsh_history)")),console.error(g.gray(`
6
- Instead, use:`)),console.error(g.cyan(" veestack login")),console.error(g.gray(`
7
- Or set via environment variable:`)),console.error(g.cyan(" export VEESTACK_API_KEY=your_key")),console.error(g.gray(`
2
+ import {createRequire}from'module';import Go,{config}from'dotenv';import*as rt from'path';import {dirname,join,resolve,basename}from'path';import {fileURLToPath}from'url';import*as ie from'fs';import {existsSync,readFileSync,statSync,writeFileSync}from'fs';import v from'chalk';import {Command}from'commander';import {execSync}from'child_process';import*as ge from'crypto';import ge__default from'crypto';import gi from'ora';import {glob}from'glob';import hi from'cli-progress';import*as gt from'os';import {homedir}from'os';import*as V from'fs/promises';import Cr from'prompts';import Pi from'readline';import {gzipSync}from'zlib';import Mi from'open';import Fa from'omelette';globalThis.require = createRequire(import.meta.url); globalThis.CLI_VERSION = "6.3.19"; globalThis.SNAPSHOT_VERSION = "6.0.0"; globalThis.ENGINE_TARGET = "6.0.0"; globalThis.AUDIT_VERSION = "6.0"; globalThis.SESSION_PAYLOAD_VERSION = "6.0.0"; globalThis.RULES_VERSION = "6.0.0"; globalThis.ANALYSIS_VERSION = "6.0.0"; globalThis.API_VERSION = "v6"; globalThis.MIN_NODE = 20;
3
+ var es=Object.defineProperty;var be=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var ts=(t,e)=>{for(var n in e)es(t,n,{get:e[n],enumerable:true});};var ns=[/^--token[=\s]/i,/^-t[=\s]/i,/^--api-key[=\s]/i,/^--apikey[=\s]/i,/^--key[=\s]/i,/^--auth[=\s]/i,/^--bearer[=\s]/i,/token[=:]\s*[a-zA-Z0-9_-]{10,}/i,/api[_-]?key[=:]\s*[a-zA-Z0-9_-]{10,}/i],st=/vs_[a-zA-Z0-9_-]{20,}/i;function zn(){let t=process.argv.slice(2);for(let e of t){for(let n of ns)n.test(e)&&(console.error(v.red(`
4
+ \u274C Security Error: Token detected in command line arguments`)),console.error(v.yellow(`
5
+ Passing tokens via CLI arguments is not allowed.`)),console.error(v.yellow("This prevents tokens from being saved in shell history (~/.bash_history, ~/.zsh_history)")),console.error(v.gray(`
6
+ Instead, use:`)),console.error(v.cyan(" veestack login")),console.error(v.gray(`
7
+ Or set via environment variable:`)),console.error(v.cyan(" export VEESTACK_API_KEY=your_key")),console.error(v.gray(`
8
8
  Your token has been detected and blocked for your security.
9
- `)),process.exit(1));ae.test(t)&&(console.error(g.red(`
10
- \u274C Security Error: VeeStack token detected in command line`)),console.error(g.yellow(`
11
- Tokens should never be passed as command arguments.`)),console.error(g.gray(`
12
- Use login instead:`)),console.error(g.cyan(" veestack login")),process.exit(1));}}function ft(){for(let e=0;e<process.argv.length;e++){let t=process.argv[e];ae.test(t)&&(process.argv[e]="[REDACTED_TOKEN]"),/authorization[:\s]/i.test(t)&&(process.argv[e]="[REDACTED_AUTH_HEADER]");}}function mt(){let e=console.error,t=console.log,o=console.warn,n=r=>r.map(s=>typeof s=="string"?s.replace(ae,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]"):s);console.log=(...r)=>t(...n(r)),console.error=(...r)=>e(...n(r)),console.warn=(...r)=>o(...n(r));}function ht(){process.on("uncaughtException",e=>{console.error(`
13
- \u274C Fatal Error occurred`);let t=e.message||"Unknown error";if(t=t.replace(ae,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]").replace(/Authorization[:\s][^\s]*/gi,"Authorization: [REDACTED]"),console.error(`Error: ${t}`),e.stack){let o=e.stack.split(`
14
- `).map(n=>n.replace(ae,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]")).join(`
9
+ `)),process.exit(1));st.test(e)&&(console.error(v.red(`
10
+ \u274C Security Error: VeeStack token detected in command line`)),console.error(v.yellow(`
11
+ Tokens should never be passed as command arguments.`)),console.error(v.gray(`
12
+ Use login instead:`)),console.error(v.cyan(" veestack login")),process.exit(1));}}function Hn(){for(let t=0;t<process.argv.length;t++){let e=process.argv[t];st.test(e)&&(process.argv[t]="[REDACTED_TOKEN]"),/authorization[:\s]/i.test(e)&&(process.argv[t]="[REDACTED_AUTH_HEADER]");}}function Jn(){let t=console.error,e=console.log,n=console.warn,r=s=>s.map(o=>typeof o=="string"?o.replace(st,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]"):o);console.log=(...s)=>e(...r(s)),console.error=(...s)=>t(...r(s)),console.warn=(...s)=>n(...r(s));}function Kn(){process.on("uncaughtException",t=>{console.error(`
13
+ \u274C Fatal Error occurred`);let e=t.message||"Unknown error";if(e=e.replace(st,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]").replace(/Authorization[:\s][^\s]*/gi,"Authorization: [REDACTED]"),console.error(`Error: ${e}`),t.stack){let n=t.stack.split(`
14
+ `).map(r=>r.replace(st,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]")).join(`
15
15
  `);process.env.DEBUG||process.env.VEESTACK_DEBUG?console.error(`
16
- Stack trace:`,o):console.error(`
17
- Run with DEBUG=veestack for full stack trace (sanitized)`);}process.exit(1);}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:new Error(String(e));console.error(`
18
- \u274C Unhandled Promise Rejection`);let o=t.message||"Unknown error";o=o.replace(ae,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]"),console.error(`Error: ${o}`),process.exit(1);});}var ce=["veestack-tools","@vee_stack/cli"],po=["veestack","veestack-cli","veestacktool","veestack-tool","vee-stack","veestack-cli-tool","veestack-scanner","veestack-analyzer"],fo=[/veestak/i,/veestac/i,/veestackk/i,/veestackh/i,/vvestack/i,/veee/i,/veestack-cli-hack/i,/veestack-free/i,/veestack-pro-free/i];function yt(){try{let e=fileURLToPath(import.meta.url),o=ie.dirname(e);for(let n=0;n<5;n++){let r=ie.join(o,"package.json");if(U.existsSync(r))return JSON.parse(U.readFileSync(r,"utf-8")).name||"unknown";let s=ie.dirname(o);if(s===o)break;o=s;}}catch{}return "unknown"}function mo(){let e=yt(),t=[];if(ce.includes(e))return {isOfficial:true,warnings:[]};if(po.includes(e))return t.push(`\u26A0\uFE0F WARNING: You are using "${e}" which is NOT the official VeeStack CLI.`),t.push(`The official package is: ${g.cyan(ce[0])}`),t.push("Unofficial packages may contain malware or steal your data."),{isOfficial:false,warnings:t};for(let o of fo)if(o.test(e))return t.push(`\u26A0\uFE0F WARNING: Package name "${e}" looks suspicious.`),t.push("This might be a typosquatting attack."),t.push(`The official package is: ${g.cyan(ce[0])}`),{isOfficial:false,warnings:t};return t.push(`\u26A0\uFE0F WARNING: Unofficial package "${e}" detected.`),t.push(`The official package is: ${g.cyan(ce[0])}`),{isOfficial:false,warnings:t}}function kt(){let{isOfficial:e,warnings:t}=mo();if(!e){console.log(g.red(`
19
- `+"\u2550".repeat(60))),console.log(g.red.bold(`\u{1F6A8} SECURITY WARNING
20
- `));for(let o of t)console.log(g.yellow(o));console.log(g.gray(`
21
- To install the official CLI:`)),console.log(g.cyan(" npm install -g veestack-tools")),console.log(g.red("\u2550".repeat(60)+`
22
- `)),process.exit(1);}process.env.VEESTACK_DEBUG==="true"&&console.log(g.gray(`\u2713 Official package verified: ${ce.join(" or ")}`));}function je(){let e=yt(),t=ce.includes(e);return {packageName:e,isOfficial:t,homepage:"https://www.veestack.com",repository:"https://github.com/Mohmed-ElZehiry/VeeStack"}}var ho=[".env",".env.local",".env.development",".env.production",".env.test",".env.example",".envrc",".env.*","id_rsa","id_rsa.pub","id_dsa","id_dsa.pub","id_ecdsa","id_ecdsa.pub","id_ed25519","id_ed25519.pub","*.pem","*.key","*.p12","*.pfx","*.crt","*.cer","*.der","credentials",".aws/credentials",".aws/config",".docker/config.json","kubeconfig","*.kubeconfig",".npmrc",".yarnrc",".pnpmrc",".git-credentials","*.sqlite","*.sqlite3","*.db","secrets/","secret/",".secrets/","config.json","settings.json","local.settings.json"],yo=["veestack.config.json","package.json","tsconfig.json","jsconfig.json",".eslintrc.json",".prettierrc.json","README.md"],ko=[{name:"AWS Access Key ID",pattern:/AKIA[0-9A-Z]{16}/g,severity:"critical",description:"AWS Access Key ID detected"},{name:"AWS Secret Access Key",pattern:/['"\s][A-Za-z0-9/+=]{40}['"\s]/g,severity:"critical",description:"Potential AWS Secret Key detected"},{name:"Private Key",pattern:/-----BEGIN (RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/g,severity:"critical",description:"Private key detected"},{name:"JWT Token",pattern:/eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*/g,severity:"high",description:"JWT token detected"},{name:"Bearer Token",pattern:/Bearer\s+[a-zA-Z0-9_-]{20,}/gi,severity:"high",description:"Bearer token detected"},{name:"API Key",pattern:/(?:api[_-]?key|apikey|api_token|apiToken)['"\s]*[:=]\s*['"][a-zA-Z0-9_-]{16,}['"]/gi,severity:"high",description:"API key detected"},{name:"Password in URL",pattern:/[a-zA-Z]+:\/\/[^\s:@]+:[^\s:@]+@[^\s]+/g,severity:"high",description:"Password in URL detected"},{name:"Password Assignment",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"][^'"]{8,}['"]/gi,severity:"medium",description:"Password assignment detected"},{name:"GitHub Token",pattern:/gh[pousr]_[A-Za-z0-9_]{36,}/g,severity:"critical",description:"GitHub token detected"},{name:"Slack Token",pattern:/xox[baprs]-[0-9]{10,13}-[0-9]{10,13}(-[a-zA-Z0-9]{24})?/g,severity:"critical",description:"Slack token detected"},{name:"Generic Secret",pattern:/(?:secret|token|key)\s*[=:]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,severity:"medium",description:"Potential secret detected"},{name:"Connection String",pattern:/(?:mongodb|postgres|mysql|redis|amqp):\/\/[^\s]+/gi,severity:"high",description:"Database connection string detected"},{name:"VeeStack Token",pattern:/vs_[a-zA-Z0-9_-]{20,}/g,severity:"critical",description:"VeeStack token detected"}];function wt(e){let t=e.replace(/\\/g,"/").toLowerCase(),o=ie.basename(t);for(let n of yo)if(o===n.toLowerCase())return false;for(let n of ho){if(o===n.toLowerCase())return true;if(n.includes("*")){let r=n.toLowerCase().replace(/\./g,"\\.").replace(/\*/g,".*"),s=new RegExp(r);if(s.test(o)||s.test(t))return true}if(t.includes(n.toLowerCase().replace("*","")))return true}return false}function wo(e,t){let o=[],n=t.split(`
23
- `);for(let r of ko){r.pattern.lastIndex=0;for(let s=0;s<n.length;s++){let a=n[s],i;for(;(i=r.pattern.exec(a))!==null;)o.push({filePath:e,type:"secret_content",secretName:r.name,severity:r.severity,description:r.description,lineNumber:s+1,match:i[0].substring(0,20)+"..."});r.pattern.lastIndex=0;}}return o}async function So(e){let t=[];if(wt(e))return t.push({filePath:e,type:"sensitive_file",secretName:"Sensitive File",severity:"critical",description:`Sensitive file type detected: ${ie.basename(e)}`}),t;try{if(U.statSync(e).size>1024*1024)return t;let n=U.readFileSync(e,"utf-8"),r=wo(e,n);t.push(...r);}catch{}return t}async function St(e,t){let o=[];for(let i of t){let c=ie.join(e,i),l=await So(c);for(let u of l)u.filePath=i,o.push(u);}let n=o.filter(i=>i.severity==="critical").length,r=o.filter(i=>i.severity==="high").length,s=o.filter(i=>i.severity==="medium").length,a=o.filter(i=>i.severity==="low").length;return {totalFiles:t.length,secretsFound:o.length,criticalCount:n,highCount:r,mediumCount:s,lowCount:a,results:o}}function vt(e){let t=[],o=[];for(let n of e)wt(n)?o.push(n):t.push(n);return {safe:t,blocked:o}}var Ao={TOKEN_BINDING_SALT:TOKEN_SALT};function Tt(e,t){let o=`${e}:${t}:${Ao.TOKEN_BINDING_SALT}`;return z.createHash("sha256").update(o).digest("hex")}function bt(e,t,o,n,r="cli"){let s=new Date().toISOString(),a=Io(),i=Eo(e,t,o,s,a),c=Co(s,r,i),l=xo(n,s,r,c);return {signature:l,timestamp:s,nonce:a,headers:{"X-Signature":l,"X-Timestamp":s,"X-Nonce":a,"X-Signed-Headers":"host;x-timestamp;x-nonce"}}}function Eo(e,t,o,n,r){let s=z.createHash("sha256").update(o).digest("hex");return [e.toUpperCase(),t,"",`host:www.veestack.com
24
- `,`x-timestamp:${n}
25
- `,`x-nonce:${r}
26
- `,"host;x-timestamp;x-nonce",s].join(`
27
- `)}function Co(e,t,o){let n=e.substring(0,10).replace(/-/g,""),r=z.createHash("sha256").update(o).digest("hex");return ["VEESTACK-HMAC-SHA256",e,`${n}/veestack/${t}/veestack_request`,r].join(`
28
- `)}function xo(e,t,o,n){let r=t.substring(0,10).replace(/-/g,""),s=Te("VEESTACK"+e,r),a=Te(s,"veestack"),i=Te(a,o),c=Te(i,"veestack_request");return Te(c,n,"hex")}function Te(e,t,o){return z.createHmac("sha256",e).update(t).digest(o||"hex")}function Io(){return z.randomBytes(16).toString("hex")}var $e=null;async function Le(){if($e)return $e;try{return $e=await import('keytar'),$e}catch{return null}}var Ee=ie.join(le.homedir(),".veestack"),H=ie.join(Ee,"tokens.enc"),At=ie.join(Ee,"salt"),Et=ie.join(Ee,".key"),Ve="VeeStack CLI",Fe="auth_tokens",_o=1e5,Po=32,Ro=16;function Oe(){return process.env.DEBUG?.includes("veestack")||process.env.DEBUG?.includes("*")||process.env.NODE_ENV==="development"||process.env.VEESTACK_DEBUG==="true"}async function Do(){try{let t=await b.readFile(At).catch(()=>null);if(t)return t}catch{}let e=z.randomBytes(32);return await b.mkdir(Ee,{recursive:true,mode:448}),await b.writeFile(At,e,{mode:384}),e}async function Ct(){try{let n=await b.readFile(Et,"utf-8").catch(()=>null);if(n){let r=Buffer.from(n,"hex");return await b.unlink(Et).catch(()=>{}),r}}catch{}let e=`${le.userInfo().username}@${le.hostname()}`,t=await Do();return z.pbkdf2Sync(e,t,_o,Po,"sha256")}function be(e){Buffer.isBuffer(e)&&e.fill(0);}async function Ce(e){let t=await Le();if(t)try{let l=JSON.stringify(e);await t.setPassword(Ve,Fe,l),Oe()&&console.log(" Tokens saved to OS Keychain");return}catch(l){Oe()&&console.log(" Keychain failed, falling back to encrypted file:",l);}let o=await Ct(),n=z.randomBytes(Ro),r=z.createCipheriv("aes-256-gcm",o,n),s=JSON.stringify(e),a=Buffer.concat([r.update(s,"utf8"),r.final()]),i=r.getAuthTag(),c={iv:n.toString("hex"),data:a.toString("hex"),authTag:i.toString("hex"),timestamp:Date.now(),version:2};await b.mkdir(Ee,{recursive:true,mode:448}),await b.writeFile(H,JSON.stringify(c),{mode:384}),be(o),Oe()&&console.log(" Tokens saved to encrypted file (AES-256-GCM)");}async function xt(){let e=await Le();if(e)try{let t=await e.getPassword(Ve,Fe);if(t)return JSON.parse(t)}catch(t){Oe()&&console.log("\u26A0\uFE0F Keychain read failed, trying encrypted file:",t);}try{let t=await b.readFile(H,"utf-8"),o=JSON.parse(t);if(o.version===1)return await jo(o);let n=await Ct(),r=null;try{let s=Buffer.from(o.iv,"hex"),a=Buffer.from(o.data,"hex"),i=Buffer.from(o.authTag,"hex"),c=z.createDecipheriv("aes-256-gcm",n,s);c.setAuthTag(i),r=Buffer.concat([c.update(a),c.final()]);let l=JSON.parse(r.toString("utf8"));return be(r),be(n),l}catch(s){throw r&&be(r),be(n),s}}catch{return null}}async function jo(e){try{return console.log("\u{1F510} Migrating from legacy encryption format..."),await b.unlink(H).catch(()=>{}),null}catch{return null}}async function ue(){try{return await b.access(H),!0}catch{return false}}async function ee(){try{let e=await b.stat(H).catch(()=>null);if(!e)return;let t=e.size,o=3;for(let r=0;r<o;r++){let s=z.randomBytes(t);await b.writeFile(H,s);}await b.unlink(H);let n=await Le();n&&await n.deletePassword(Ve,Fe).catch(()=>{});}catch{}}async function Ue(){let e=await Le(),t=!!e,o=false;if(e)try{o=!!await e.getPassword(Ve,Fe);}catch{}let n=false,r,s,a=0;try{let i=await b.stat(H);n=!0,r=i.mode.toString(8),s=i.size;let c=await b.readFile(H,"utf-8");a=JSON.parse(c).version||1;}catch{}return {keychainAvailable:t,keychainHasTokens:o,fileExists:n,filePermissions:r,fileSize:s,encryptionVersion:a}}var No=[{name:"bearer_token",regex:/Bearer\s+[a-zA-Z0-9_-]{20,}/gi,replacement:"Bearer [REDACTED]"},{name:"api_key",regex:/api[_-]?key['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"api_key: [REDACTED]"},{name:"access_token",regex:/access[_-]?token['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"access_token: [REDACTED]"},{name:"refresh_token",regex:/refresh[_-]?token['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"refresh_token: [REDACTED]"},{name:"auth_token",regex:/auth[_-]?token['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"auth_token: [REDACTED]"},{name:"password",regex:/password['"\s]*[:=]\s*['"]?([^'"\s]{8,})/gi,replacement:"password: [REDACTED]"},{name:"secret",regex:/secret['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"secret: [REDACTED]"},{name:"private_key",regex:/private[_-]?key['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"private_key: [REDACTED]"},{name:"jwt_token",regex:/eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*/g,replacement:"[REDACTED_JWT]"},{name:"supabase_key",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g,replacement:"[REDACTED_SUPABASE_KEY]"}];function te(e){if(!e||typeof e!="string")return e;let t=e;for(let o of No)t=t.replace(o.regex,o.replacement);return t}function Ye(e){return e instanceof Error?te(e.message).slice(0,500):typeof e=="string"?te(e).slice(0,500):te(String(e)).slice(0,500)}function Be(e){if(!e||typeof e!="object")return e;let t=["token","accessToken","refreshToken","apiKey","api_key","secret","password","privateKey","private_key","authToken","auth_token","jwt","credential","credentials"];if(Array.isArray(e))return e.map(n=>Be(n));let o={};for(let[n,r]of Object.entries(e)){let s=n.toLowerCase();t.some(a=>s.includes(a))?o[n]="[REDACTED]":typeof r=="object"&&r!==null?o[n]=Be(r):typeof r=="string"?o[n]=te(r):o[n]=r;}return o}function xe(e,t,...o){let n=te(t),r=o.map(s=>typeof s=="string"?te(s):typeof s=="object"&&s!==null?Be(s):s);console[e](n,...r);}var q={log:(e,...t)=>xe("log",e,...t),error:(e,...t)=>xe("error",e,...t),warn:(e,...t)=>xe("warn",e,...t),info:(e,...t)=>xe("info",e,...t),debug:(e,...t)=>xe("debug",e,...t)};configEnv.NODE_ENV==="development";var j=configEnv.VEESTACK_API_URL,ge=configEnv.VEESTACK_WEB_URL,K=`${j}/api/cli`,W={device:`${K}/device`,authorize:`${K}/authorize`,token:`${K}/token`,refresh:`${K}/refresh`,logout:`${K}/logout`,whoami:`${K}/whoami`,status:`${K}/status`,createAuth:`${K}/device`,verifyCode:`${K}/token`,projects:`${j}/api/projects`,upload:`${j}/api/upload`};function _t(){let e=validateEnvironment(configEnv);return {environment:configEnv.NODE_ENV,apiVersion:"unversioned",apiBaseUrl:j,webBaseUrl:ge,cliApiBase:K,endpoints:W,validated:e.ok,warnings:e.warnings}}function Pt(){let e=validateEnvironment(configEnv);return {valid:e.ok,errors:e.errors}}var $o=globalThis,Rt=$o.CLI_VERSION,Nt=ie.join(le.homedir(),".veestack"),Me=ie.join(Nt,"config.json");async function Lo(){try{if(!U.existsSync(Me))return;let e=U.readFileSync(Me,"utf-8"),t=JSON.parse(e);if(await ue()){try{U.unlinkSync(Me);}catch{}return}let o={token:t.token,refreshToken:t.refreshToken,tokenType:t.tokenType,tokenExpiresAt:t.tokenExpiresAt,device:t.device,user:t.user,subscription:t.subscription,lastLoginAt:t.lastLoginAt,apiKey:t.apiKey};await Ce(o);try{U.unlinkSync(Me);}catch{}q.info("\u{1F510} Authentication migrated to encrypted storage");}catch{}}async function N(){await Lo();let e=await xt();return e?{token:e.token,tokenType:e.tokenType,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,device:e.device,user:e.user,subscription:e.subscription,lastLoginAt:e.lastLoginAt,apiKey:e.apiKey}:null}async function Y(){let e=await N();if(!e)return false;let t=e.token!==void 0&&e.token.length>0,o=e.apiKey!==void 0&&e.apiKey.length>0;return t||o}async function Vo(){let e=await N();return e&&(e.token||e.apiKey)||null}async function Fo(){let e=await N();return {id:e?.device?.id,fingerprint:e?.device?.fingerprint}}async function G(e="GET",t="",o="",n=["project:read"]){let r=await Vo();if(!r)return {};let s=await N(),a=await Fo();if(!a.id||!a.fingerprint||!s?.refreshToken)return {};let i=Tt(s.refreshToken,a.fingerprint),c=bt(e,t,o,s.refreshToken,"cli");return {Authorization:`Bearer ${r}`,"Content-Type":"application/json","X-Device-ID":a.id,"X-CLI-Version":Rt||"unknown","X-Device-Fingerprint":a.fingerprint,"X-Token-Binding":i,"X-Signature":c.signature,"X-Timestamp":c.timestamp,"X-Nonce":c.nonce,"X-Scope":n.join(","),"X-Security-Version":Rt||"unknown"}}function Xe(e){if(!e.tokenExpiresAt)return true;let t=new Date(e.tokenExpiresAt),o=300*1e3;return Date.now()>=t.getTime()-o}async function Uo(e){if(!e.refreshToken)return null;try{let t={"Content-Type":"application/json"},o=W.refresh,n=JSON.stringify({refresh_token:e.refreshToken,device_id:e.device?.id,device_fingerprint:e.device?.fingerprint}),r=await fetch(o,{method:"POST",headers:t,body:n});if(r.status===401){let i=await r.json().catch(()=>({}));throw i.code==="device_mismatch"&&(await ee(),console.log(g.red(`
29
- \u274C Security Alert: Device mismatch`)),console.log(g.yellow(`
30
- Your token was used from a different device.`)),console.log(g.gray("This could indicate a token theft attempt.")),console.log(g.gray("Please login again:")),console.log(g.cyan(" veestack login")),process.exit(1)),i.code==="device_revoked"&&(await ee(),console.log(g.red(`
31
- \u274C Device authorization revoked`)),console.log(g.yellow(`
32
- Your device was removed from authorized devices.`)),console.log(g.gray("Please login again:")),console.log(g.cyan(" veestack login")),process.exit(1)),(i.code==="token_invalid"||i.code==="session_expired")&&(await ee(),console.log(g.red(`
33
- \u274C Session expired`)),console.log(g.yellow(`
34
- Your session has expired or your password was changed.`)),console.log(g.gray("Please login again:")),console.log(g.cyan(" veestack login")),process.exit(1)),new Error("Token refresh failed: Unauthorized")}if(!r.ok)throw new Error("Token refresh failed");let s=await r.json(),a={...e,token:s.access_token,tokenExpiresAt:new Date(Date.now()+s.expires_in*1e3).toISOString()};return s.refresh_token&&(a.refreshToken=s.refresh_token),await Ce({token:a.token,refreshToken:a.refreshToken,tokenType:a.tokenType,tokenExpiresAt:a.tokenExpiresAt,device:a.device,user:a.user,subscription:a.subscription,lastLoginAt:a.lastLoginAt,apiKey:a.apiKey}),a}catch(t){return t instanceof Error&&t.message.includes("fetch")&&(q.warn(`
35
- \u26A0\uFE0F Network error`),q.info("Could not connect to authentication server."),q.info("Please check your connection and try again.")),null}}async function Q(){let e=await N();if(!e)return console.log(g.yellow(`
36
- \u26A0\uFE0F You are not logged in`)),console.log(g.gray(`
37
- Login to enable:`)),console.log(g.gray(" \u2022 Cloud reports")),console.log(g.gray(" \u2022 Team dashboard")),console.log(g.gray(` \u2022 Historical scans
38
- `)),console.log(g.gray("Run:")),console.log(g.cyan(" veestack login")),null;if(e.refreshToken&&Xe(e)){console.log(g.yellow("Token expired, refreshing..."));let t=await Uo(e);return t?(console.log(g.green("\u2713 Token refreshed")),t):(await ee(),console.log(g.red(`
39
- \u274C Session expired`)),console.log(g.yellow("Your refresh token has expired.")),console.log(g.gray("Run: veestack login")),null)}return e}async function ze(){let e=await N();return !e||!e.subscription?"free":e.subscription.tier||"free"}async function $t(){let e=await N();return !e||!e.subscription||e.subscription.tier==="free"?true:e.subscription.expiresAt?new Date(e.subscription.expiresAt)>new Date&&e.subscription.isActive:e.subscription.isActive}function Ot(e){if(e.user)try{let t=join(Nt,"accounts"),o=lo("fs");o.mkdirSync(t,{recursive:!0});let n=join(t,`${e.user.id}.json`);o.writeFileSync(n,JSON.stringify(e,null,2),{mode:384});}catch{}}async function Ut(){try{let e=await fetch(`${j}/v1/cli/version`,{method:"GET",headers:{Accept:"application/json"}});if(e.ok){let o=(await e.json()).version;o&&o!==VERSION&&(console.log(g.yellow(`
40
- \u2728 New version available: ${g.bold(o)} (current: ${VERSION})`)),console.log(g.gray(` Run: ${g.cyan("veestack upgrade")} to update
41
- `)));}}catch{}}async function Mo(){let e=process.cwd(),t=join(e,"package.json"),o=[{name:"Next.js",files:["next.config.js","next.config.ts","next.config.mjs"]},{name:"Nuxt.js",files:["nuxt.config.js","nuxt.config.ts"]},{name:"Vue CLI",files:["vue.config.js"]},{name:"Angular",files:["angular.json"]},{name:"SvelteKit",files:["svelte.config.js","svelte.config.ts"]},{name:"Vite",files:["vite.config.js","vite.config.ts"]},{name:"Remix",files:["remix.config.js"]},{name:"Gatsby",files:["gatsby-config.js","gatsby-config.ts"]},{name:"Astro",files:["astro.config.mjs","astro.config.js"]}];for(let n of o)for(let r of n.files)if(existsSync(join(e,r)))return {name:n.name,confidence:95};if(!existsSync(t)){if(existsSync(join(e,"requirements.txt"))){let n=readFileSync(join(e,"requirements.txt"),"utf-8").toLowerCase();if(n.includes("django"))return {name:"Django",confidence:85};if(n.includes("flask"))return {name:"Flask",confidence:85}}return existsSync(join(e,"Gemfile"))&&readFileSync(join(e,"Gemfile"),"utf-8").toLowerCase().includes("rails")?{name:"Ruby on Rails",confidence:85}:existsSync(join(e,"pom.xml"))&&readFileSync(join(e,"pom.xml"),"utf-8").toLowerCase().includes("spring-boot")?{name:"Spring Boot",confidence:85}:{name:"unknown",confidence:0}}try{let n=JSON.parse(readFileSync(t,"utf-8")),r={...n.dependencies,...n.devDependencies},s=[{name:"Next.js",primary:["next"],secondary:["next/core-web-vitals","@next/bundle-analyzer"],indicators:["app","pages"]},{name:"React",primary:["react","react-dom"],secondary:["@types/react","react-scripts","create-react-app"],indicators:["src/components","src/App.js","src/App.tsx"]},{name:"Vue",primary:["vue"],secondary:["vue-router","vuex","pinia","@vue/cli-service"],indicators:["src/views","src/components"]},{name:"Angular",primary:["@angular/core"],secondary:["@angular/cli","@angular/common","@angular/router"],indicators:["src/app"]},{name:"Svelte",primary:["svelte"],secondary:["svelte-check","@sveltejs/kit"],indicators:["src/routes"]},{name:"Express",primary:["express"],secondary:["cors","helmet","morgan","body-parser"],indicators:["routes","controllers"]},{name:"NestJS",primary:["@nestjs/core"],secondary:["@nestjs/common","@nestjs/platform-express"],indicators:["src/modules"]},{name:"Fastify",primary:["fastify"],secondary:["@fastify/cors","@fastify/helmet"],indicators:["routes"]}];for(let a of s){let i=0;for(let l of a.primary)if(r[l]){i+=70;break}let c=0;for(let l of a.secondary)r[l]&&c<2&&(i+=10,c++);for(let l of a.indicators)existsSync(join(e,l))&&(i+=10);if(i>=60)return a.name==="Next.js"&&r.next?{name:a.name,confidence:100}:{name:a.name,confidence:Math.min(i,95)}}return r.astro?{name:"Astro",confidence:80}:r.remix?{name:"Remix",confidence:80}:r.gatsby?{name:"Gatsby",confidence:80}:r.nuxt?{name:"Nuxt.js",confidence:80}:r["@sveltejs/kit"]?{name:"SvelteKit",confidence:85}:{name:"unknown",confidence:0}}catch{return {name:"unknown",confidence:0}}}async function zo(e,t){try{let o=await G(),n=await fetch(`${j}/v1/projects`,{method:"POST",headers:o,body:JSON.stringify({name:e,framework:t,source:"cli-init"})});if(!n.ok){let r=await n.json().catch(()=>({error:"Unknown error"}));throw new Error(r.error||`HTTP ${n.status}`)}return await n.json()}catch(o){return q.error("Failed to create project:",o instanceof Error?o.message:String(o)),null}}function Ft(e){let t={"Next.js":["**/*.{js,jsx,ts,tsx,json,mjs,cjs}"],React:["**/*.{js,jsx,ts,tsx,json}"],Vue:["**/*.{js,jsx,ts,tsx,vue,json}"],Angular:["**/*.{ts,html,json}"],Svelte:["**/*.{js,ts,svelte,json}"],Express:["**/*.{js,ts,json}"],NestJS:["**/*.{ts,json}"],unknown:["**/*.{js,ts,jsx,tsx,json,py,go,rs,rb,php,cs,cpp,c,h}"]};return t[e]||t.unknown}function Ko(){return ["node_modules/**/*",".git/**/*","dist/**/*","build/**/*",".next/**/*","coverage/**/*","*.test.ts","*.spec.ts","*.min.js"]}function Jo(e){let t=join(process.cwd(),"veestack.config.json");writeFileSync(t,JSON.stringify(e,null,2));}function Go(){let e=join(process.cwd(),"veestack.config.json");if(existsSync(e))try{return JSON.parse(readFileSync(e,"utf-8"))}catch{return null}return null}function Ho(e){let t=process.cwd(),o=[],n=["src","app","lib","components","pages","routes","controllers","models","utils"];for(let r of n){let s=join(t,r);existsSync(s)&&o.push(`${r}/**/*`);}return o}function qo(){let e=process.cwd(),t=join(e,".git");return existsSync(t)}function Wo(){let e=process.cwd();return existsSync(join(e,"pnpm-lock.yaml"))?"pnpm":existsSync(join(e,"yarn.lock"))?"yarn":existsSync(join(e,"package-lock.json"))?"npm":existsSync(join(e,"bun.lockb"))?"bun":"npm"}function Yo(){return `Node ${process.version}`}async function pe(e){e?.skipAuthCheck||console.log(g.bold.cyan(`
16
+ Stack trace:`,n):console.error(`
17
+ Run with DEBUG=veestack for full stack trace (sanitized)`);}process.exit(1);}),process.on("unhandledRejection",t=>{let e=t instanceof Error?t:new Error(String(t));console.error(`
18
+ \u274C Unhandled Promise Rejection`);let n=e.message||"Unknown error";n=n.replace(st,"[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9_-]+/gi,"Bearer [REDACTED]"),console.error(`Error: ${n}`),process.exit(1);});}var ot=["veestack-tools","@vee_stack/cli"],ss=["veestack","veestack-cli","veestacktool","veestack-tool","vee-stack","veestack-cli-tool","veestack-scanner","veestack-analyzer"],os=[/veestak/i,/veestac/i,/veestackk/i,/veestackh/i,/vvestack/i,/veee/i,/veestack-cli-hack/i,/veestack-free/i,/veestack-pro-free/i];function Gn(){try{let t=fileURLToPath(import.meta.url),n=rt.dirname(t);for(let r=0;r<5;r++){let s=rt.join(n,"package.json");if(ie.existsSync(s))return JSON.parse(ie.readFileSync(s,"utf-8")).name||"unknown";let o=rt.dirname(n);if(o===n)break;n=o;}}catch{}return "unknown"}function is(){let t=Gn(),e=[];if(ot.includes(t))return {isOfficial:true,warnings:[]};if(ss.includes(t))return e.push(`\u26A0\uFE0F WARNING: You are using "${t}" which is NOT the official VeeStack CLI.`),e.push(`The official package is: ${v.cyan(ot[0])}`),e.push("Unofficial packages may contain malware or steal your data."),{isOfficial:false,warnings:e};for(let n of os)if(n.test(t))return e.push(`\u26A0\uFE0F WARNING: Package name "${t}" looks suspicious.`),e.push("This might be a typosquatting attack."),e.push(`The official package is: ${v.cyan(ot[0])}`),{isOfficial:false,warnings:e};return e.push(`\u26A0\uFE0F WARNING: Unofficial package "${t}" detected.`),e.push(`The official package is: ${v.cyan(ot[0])}`),{isOfficial:false,warnings:e}}function Zn(){let{isOfficial:t,warnings:e}=is();if(!t){console.log(v.red(`
19
+ `+"\u2550".repeat(60))),console.log(v.red.bold(`\u{1F6A8} SECURITY WARNING
20
+ `));for(let n of e)console.log(v.yellow(n));console.log(v.gray(`
21
+ To install the official CLI:`)),console.log(v.cyan(" npm install -g veestack-tools")),console.log(v.red("\u2550".repeat(60)+`
22
+ `)),process.exit(1);}process.env.VEESTACK_DEBUG==="true"&&console.log(v.gray(`\u2713 Official package verified: ${ot.join(" or ")}`));}function Bt(){let t=Gn(),e=ot.includes(t);return {packageName:t,isOfficial:e,homepage:"https://www.veestack.com",repository:"https://github.com/Mohmed-ElZehiry/VeeStack"}}var as=[".env",".env.local",".env.development",".env.production",".env.test",".env.example",".envrc",".env.*","id_rsa","id_rsa.pub","id_dsa","id_dsa.pub","id_ecdsa","id_ecdsa.pub","id_ed25519","id_ed25519.pub","*.pem","*.key","*.p12","*.pfx","*.crt","*.cer","*.der","credentials",".aws/credentials",".aws/config",".docker/config.json","kubeconfig","*.kubeconfig",".npmrc",".yarnrc",".pnpmrc",".git-credentials","*.sqlite","*.sqlite3","*.db","secrets/","secret/",".secrets/","config.json","settings.json","local.settings.json"],cs=["veestack.config.json","package.json","tsconfig.json","jsconfig.json",".eslintrc.json",".prettierrc.json","README.md"],ls=[{name:"AWS Access Key ID",pattern:/AKIA[0-9A-Z]{16}/g,severity:"critical",description:"AWS Access Key ID detected"},{name:"AWS Secret Access Key",pattern:/['"\s][A-Za-z0-9/+=]{40}['"\s]/g,severity:"critical",description:"Potential AWS Secret Key detected"},{name:"Private Key",pattern:/-----BEGIN (RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/g,severity:"critical",description:"Private key detected"},{name:"JWT Token",pattern:/eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*/g,severity:"high",description:"JWT token detected"},{name:"Bearer Token",pattern:/Bearer\s+[a-zA-Z0-9_-]{20,}/gi,severity:"high",description:"Bearer token detected"},{name:"API Key",pattern:/(?:api[_-]?key|apikey|api_token|apiToken)['"\s]*[:=]\s*['"][a-zA-Z0-9_-]{16,}['"]/gi,severity:"high",description:"API key detected"},{name:"Password in URL",pattern:/[a-zA-Z]+:\/\/[^\s:@]+:[^\s:@]+@[^\s]+/g,severity:"high",description:"Password in URL detected"},{name:"Password Assignment",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"][^'"]{8,}['"]/gi,severity:"medium",description:"Password assignment detected"},{name:"GitHub Token",pattern:/gh[pousr]_[A-Za-z0-9_]{36,}/g,severity:"critical",description:"GitHub token detected"},{name:"Slack Token",pattern:/xox[baprs]-[0-9]{10,13}-[0-9]{10,13}(-[a-zA-Z0-9]{24})?/g,severity:"critical",description:"Slack token detected"},{name:"Generic Secret",pattern:/(?:secret|token|key)\s*[=:]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,severity:"medium",description:"Potential secret detected"},{name:"Connection String",pattern:/(?:mongodb|postgres|mysql|redis|amqp):\/\/[^\s]+/gi,severity:"high",description:"Database connection string detected"},{name:"VeeStack Token",pattern:/vs_[a-zA-Z0-9_-]{20,}/g,severity:"critical",description:"VeeStack token detected"}];function Wn(t){let e=t.replace(/\\/g,"/").toLowerCase(),n=rt.basename(e);for(let r of cs)if(n===r.toLowerCase())return false;for(let r of as){if(n===r.toLowerCase())return true;if(r.includes("*")){let s=r.toLowerCase().replace(/\./g,"\\.").replace(/\*/g,".*"),o=new RegExp(s);if(o.test(n)||o.test(e))return true}if(e.includes(r.toLowerCase().replace("*","")))return true}return false}function us(t,e){let n=[],r=e.split(`
23
+ `);for(let s of ls){s.pattern.lastIndex=0;for(let o=0;o<r.length;o++){let a=r[o],i;for(;(i=s.pattern.exec(a))!==null;)n.push({filePath:t,type:"secret_content",secretName:s.name,severity:s.severity,description:s.description,lineNumber:o+1,match:i[0].substring(0,20)+"..."});s.pattern.lastIndex=0;}}return n}async function ds(t){let e=[];if(Wn(t))return e.push({filePath:t,type:"sensitive_file",secretName:"Sensitive File",severity:"critical",description:`Sensitive file type detected: ${rt.basename(t)}`}),e;try{if(ie.statSync(t).size>1024*1024)return e;let r=ie.readFileSync(t,"utf-8"),s=us(t,r);e.push(...s);}catch{}return e}async function qn(t,e){let n=[];for(let i of e){let c=rt.join(t,i),l=await ds(c);for(let d of l)d.filePath=i,n.push(d);}let r=n.filter(i=>i.severity==="critical").length,s=n.filter(i=>i.severity==="high").length,o=n.filter(i=>i.severity==="medium").length,a=n.filter(i=>i.severity==="low").length;return {totalFiles:e.length,secretsFound:n.length,criticalCount:r,highCount:s,mediumCount:o,lowCount:a,results:n}}function Yn(t){let e=[],n=[];for(let r of t)Wn(r)?n.push(r):e.push(r);return {safe:e,blocked:n}}var hn=(t=>typeof be<"u"?be:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof be<"u"?be:e)[n]}):t)(function(t){if(typeof be<"u")return be.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')}),Xn=typeof process<"u"&&process.versions?.node,fs=Xn&&(Array.isArray(process.argv)&&process.argv.includes("--debug")||process.env.VEESTACK_DEBUG==="1"),yn=globalThis||{},vn=null;if(Xn)try{let t=function(){let b=d,L=0;for(;b!==i(b)&&L<10;){let N=a(b,"package.json");try{if(o(N)){let I=JSON.parse(s(N,"utf-8"));if(I.name==="vee_stack")return I}}catch{}b=i(b),L++;}return null};ps=t;let e=hn("fs"),n=hn("path"),r=hn("url"),{readFileSync:s,existsSync:o}=e,{join:a,dirname:i}=n,{fileURLToPath:c}=r,l=c(import.meta.url),d=i(l);vn=t();}catch{fs&&console.debug("[veestack:debug] Failed to load package.json dynamically, using defaults");}var ps,xe=vn?.versions||yn.VEESTACK_VERSIONS||{},ne=vn?.version||yn.VEESTACK_VERSION||yn.CLI_VERSION||"unknown",kn=`vs_cli_v${ne}`;xe.snapshot||"unknown";xe.engine_target||"unknown";xe.audit||"unknown";xe.session_payload||"unknown";xe.rules||"unknown";xe.analysis||"unknown";xe.api||"unknown";xe.min_node||"unknown";var f={};ts(f,{BRAND:()=>Hs,DIRTY:()=>De,EMPTY_PATH:()=>Es,INVALID:()=>h,NEVER:()=>Co,OK:()=>K,ParseStatus:()=>H,Schema:()=>w,ZodAny:()=>Ie,ZodArray:()=>_e,ZodBigInt:()=>Le,ZodBoolean:()=>$e,ZodBranded:()=>xt,ZodCatch:()=>Ze,ZodDate:()=>Ve,ZodDefault:()=>Ge,ZodDiscriminatedUnion:()=>Gt,ZodEffects:()=>oe,ZodEnum:()=>Je,ZodError:()=>Y,ZodFirstPartyTypeKind:()=>y,ZodFunction:()=>Wt,ZodIntersection:()=>Fe,ZodIssueCode:()=>u,ZodLazy:()=>ze,ZodLiteral:()=>He,ZodMap:()=>dt,ZodNaN:()=>pt,ZodNativeEnum:()=>Ke,ZodNever:()=>ae,ZodNull:()=>Me,ZodNullable:()=>pe,ZodNumber:()=>je,ZodObject:()=>X,ZodOptional:()=>re,ZodParsedType:()=>g,ZodPipeline:()=>Rt,ZodPromise:()=>Ne,ZodReadonly:()=>We,ZodRecord:()=>Zt,ZodSchema:()=>w,ZodSet:()=>ft,ZodString:()=>Ce,ZodSymbol:()=>lt,ZodTransformer:()=>oe,ZodTuple:()=>fe,ZodType:()=>w,ZodUndefined:()=>Ue,ZodUnion:()=>Be,ZodUnknown:()=>ke,ZodVoid:()=>ut,addIssueToContext:()=>p,any:()=>Qs,array:()=>ro,bigint:()=>Zs,boolean:()=>lr,coerce:()=>Ro,custom:()=>ir,date:()=>Ws,datetimeRegex:()=>sr,defaultErrorMap:()=>ye,discriminatedUnion:()=>ao,effect:()=>_o,enum:()=>yo,function:()=>go,getErrorMap:()=>it,getParsedType:()=>de,instanceof:()=>Ks,intersection:()=>co,isAborted:()=>Jt,isAsync:()=>at,isDirty:()=>Kt,isValid:()=>Re,late:()=>Js,lazy:()=>mo,literal:()=>ho,makeIssue:()=>bt,map:()=>fo,nan:()=>Gs,nativeEnum:()=>vo,never:()=>to,null:()=>Xs,nullable:()=>Eo,number:()=>cr,object:()=>so,objectUtil:()=>En,oboolean:()=>xo,onumber:()=>bo,optional:()=>wo,ostring:()=>Ao,pipeline:()=>To,preprocess:()=>So,promise:()=>ko,quotelessJson:()=>ks,record:()=>uo,set:()=>po,setErrorMap:()=>ws,strictObject:()=>oo,string:()=>ar,symbol:()=>qs,transformer:()=>_o,tuple:()=>lo,undefined:()=>Ys,union:()=>io,unknown:()=>eo,util:()=>S,void:()=>no});var S;(function(t){t.assertEqual=s=>{};function e(s){}t.assertIs=e;function n(s){throw new Error}t.assertNever=n,t.arrayToEnum=s=>{let o={};for(let a of s)o[a]=a;return o},t.getValidEnumValues=s=>{let o=t.objectKeys(s).filter(i=>typeof s[s[i]]!="number"),a={};for(let i of o)a[i]=s[i];return t.objectValues(a)},t.objectValues=s=>t.objectKeys(s).map(function(o){return s[o]}),t.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{let o=[];for(let a in s)Object.prototype.hasOwnProperty.call(s,a)&&o.push(a);return o},t.find=(s,o)=>{for(let a of s)if(o(a))return a},t.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function r(s,o=" | "){return s.map(a=>typeof a=="string"?`'${a}'`:a).join(o)}t.joinValues=r,t.jsonStringifyReplacer=(s,o)=>typeof o=="bigint"?o.toString():o;})(S||(S={}));var En;(function(t){t.mergeShapes=(e,n)=>({...e,...n});})(En||(En={}));var g=S.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),de=t=>{switch(typeof t){case "undefined":return g.undefined;case "string":return g.string;case "number":return Number.isNaN(t)?g.nan:g.number;case "boolean":return g.boolean;case "function":return g.function;case "bigint":return g.bigint;case "symbol":return g.symbol;case "object":return Array.isArray(t)?g.array:t===null?g.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?g.promise:typeof Map<"u"&&t instanceof Map?g.map:typeof Set<"u"&&t instanceof Set?g.set:typeof Date<"u"&&t instanceof Date?g.date:g.object;default:return g.unknown}};var u=S.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),ks=t=>JSON.stringify(t,null,2).replace(/"([^"]+)":/g,"$1:"),Y=class t extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r];},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r];};let n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=e;}format(e){let n=e||function(o){return o.message},r={_errors:[]},s=o=>{for(let a of o.issues)if(a.code==="invalid_union")a.unionErrors.map(s);else if(a.code==="invalid_return_type")s(a.returnTypeError);else if(a.code==="invalid_arguments")s(a.argumentsError);else if(a.path.length===0)r._errors.push(n(a));else {let i=r,c=0;for(;c<a.path.length;){let l=a.path[c];c===a.path.length-1?(i[l]=i[l]||{_errors:[]},i[l]._errors.push(n(a))):i[l]=i[l]||{_errors:[]},i=i[l],c++;}}};return s(this),r}static assert(e){if(!(e instanceof t))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,S.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=n=>n.message){let n={},r=[];for(let s of this.issues)if(s.path.length>0){let o=s.path[0];n[o]=n[o]||[],n[o].push(e(s));}else r.push(e(s));return {formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}};Y.create=t=>new Y(t);var _s=(t,e)=>{let n;switch(t.code){case u.invalid_type:t.received===g.undefined?n="Required":n=`Expected ${t.expected}, received ${t.received}`;break;case u.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(t.expected,S.jsonStringifyReplacer)}`;break;case u.unrecognized_keys:n=`Unrecognized key(s) in object: ${S.joinValues(t.keys,", ")}`;break;case u.invalid_union:n="Invalid input";break;case u.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${S.joinValues(t.options)}`;break;case u.invalid_enum_value:n=`Invalid enum value. Expected ${S.joinValues(t.options)}, received '${t.received}'`;break;case u.invalid_arguments:n="Invalid function arguments";break;case u.invalid_return_type:n="Invalid function return type";break;case u.invalid_date:n="Invalid date";break;case u.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(n=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?n=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?n=`Invalid input: must end with "${t.validation.endsWith}"`:S.assertNever(t.validation):t.validation!=="regex"?n=`Invalid ${t.validation}`:n="Invalid";break;case u.too_small:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:n="Invalid input";break;case u.too_big:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?n=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:n="Invalid input";break;case u.custom:n="Invalid input";break;case u.invalid_intersection_types:n="Intersection results could not be merged";break;case u.not_multiple_of:n=`Number must be a multiple of ${t.multipleOf}`;break;case u.not_finite:n="Number must be finite";break;default:n=e.defaultError,S.assertNever(t);}return {message:n}},ye=_s;var Qn=ye;function ws(t){Qn=t;}function it(){return Qn}var bt=t=>{let{data:e,path:n,errorMaps:r,issueData:s}=t,o=[...n,...s.path||[]],a={...s,path:o};if(s.message!==void 0)return {...s,path:o,message:s.message};let i="",c=r.filter(l=>!!l).slice().reverse();for(let l of c)i=l(a,{data:e,defaultError:i}).message;return {...s,path:o,message:i}},Es=[];function p(t,e){let n=it(),r=bt({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,n,n===ye?void 0:ye].filter(s=>!!s)});t.common.issues.push(r);}var H=class t{constructor(){this.value="valid";}dirty(){this.value==="valid"&&(this.value="dirty");}abort(){this.value!=="aborted"&&(this.value="aborted");}static mergeArray(e,n){let r=[];for(let s of n){if(s.status==="aborted")return h;s.status==="dirty"&&e.dirty(),r.push(s.value);}return {status:e.value,value:r}}static async mergeObjectAsync(e,n){let r=[];for(let s of n){let o=await s.key,a=await s.value;r.push({key:o,value:a});}return t.mergeObjectSync(e,r)}static mergeObjectSync(e,n){let r={};for(let s of n){let{key:o,value:a}=s;if(o.status==="aborted"||a.status==="aborted")return h;o.status==="dirty"&&e.dirty(),a.status==="dirty"&&e.dirty(),o.value!=="__proto__"&&(typeof a.value<"u"||s.alwaysSet)&&(r[o.value]=a.value);}return {status:e.value,value:r}}},h=Object.freeze({status:"aborted"}),De=t=>({status:"dirty",value:t}),K=t=>({status:"valid",value:t}),Jt=t=>t.status==="aborted",Kt=t=>t.status==="dirty",Re=t=>t.status==="valid",at=t=>typeof Promise<"u"&&t instanceof Promise;var m;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message;})(m||(m={}));var se=class{constructor(e,n,r,s){this._cachedPath=[],this.parent=e,this.data=n,this._path=r,this._key=s;}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},er=(t,e)=>{if(Re(e))return {success:true,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return {success:false,get error(){if(this._error)return this._error;let n=new Y(t.common.issues);return this._error=n,this._error}}};function _(t){if(!t)return {};let{errorMap:e,invalid_type_error:n,required_error:r,description:s}=t;if(e&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(a,i)=>{let{message:c}=t;return a.code==="invalid_enum_value"?{message:c??i.defaultError}:typeof i.data>"u"?{message:c??r??i.defaultError}:a.code!=="invalid_type"?{message:i.defaultError}:{message:c??n??i.defaultError}},description:s}}var w=class{get description(){return this._def.description}_getType(e){return de(e.data)}_getOrReturnCtx(e,n){return n||{common:e.parent.common,data:e.data,parsedType:de(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return {status:new H,ctx:{common:e.parent.common,data:e.data,parsedType:de(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){let n=this._parse(e);if(at(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(e){let n=this._parse(e);return Promise.resolve(n)}parse(e,n){let r=this.safeParse(e,n);if(r.success)return r.data;throw r.error}safeParse(e,n){let r={common:{issues:[],async:n?.async??false,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:de(e)},s=this._parseSync({data:e,path:r.path,parent:r});return er(r,s)}"~validate"(e){let n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:de(e)};if(!this["~standard"].async)try{let r=this._parseSync({data:e,path:[],parent:n});return Re(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=true),n.common={issues:[],async:true};}return this._parseAsync({data:e,path:[],parent:n}).then(r=>Re(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(e,n){let r=await this.safeParseAsync(e,n);if(r.success)return r.data;throw r.error}async safeParseAsync(e,n){let r={common:{issues:[],contextualErrorMap:n?.errorMap,async:true},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:de(e)},s=this._parse({data:e,path:r.path,parent:r}),o=await(at(s)?s:Promise.resolve(s));return er(r,o)}refine(e,n){let r=s=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(s):n;return this._refinement((s,o)=>{let a=e(s),i=()=>o.addIssue({code:u.custom,...r(s)});return typeof Promise<"u"&&a instanceof Promise?a.then(c=>c?true:(i(),false)):a?true:(i(),false)})}refinement(e,n){return this._refinement((r,s)=>e(r)?true:(s.addIssue(typeof n=="function"?n(r,s):n),false))}_refinement(e){return new oe({schema:this,typeName:y.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)};}optional(){return re.create(this,this._def)}nullable(){return pe.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return _e.create(this)}promise(){return Ne.create(this,this._def)}or(e){return Be.create([this,e],this._def)}and(e){return Fe.create(this,e,this._def)}transform(e){return new oe({..._(this._def),schema:this,typeName:y.ZodEffects,effect:{type:"transform",transform:e}})}default(e){let n=typeof e=="function"?e:()=>e;return new Ge({..._(this._def),innerType:this,defaultValue:n,typeName:y.ZodDefault})}brand(){return new xt({typeName:y.ZodBranded,type:this,..._(this._def)})}catch(e){let n=typeof e=="function"?e:()=>e;return new Ze({..._(this._def),innerType:this,catchValue:n,typeName:y.ZodCatch})}describe(e){let n=this.constructor;return new n({...this._def,description:e})}pipe(e){return Rt.create(this,e)}readonly(){return We.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},Ss=/^c[^\s-]{8,}$/i,Ts=/^[0-9a-z]+$/,As=/^[0-9A-HJKMNP-TV-Z]{26}$/i,bs=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,xs=/^[a-z0-9_-]{21}$/i,Rs=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Cs=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,Is=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Ns="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",Sn,Os=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Ps=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Ds=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,js=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Ls=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,$s=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nr="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Vs=new RegExp(`^${nr}$`);function rr(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);let n=t.precision?"+":"?";return `([01]\\d|2[0-3]):[0-5]\\d(:${e})${n}`}function Us(t){return new RegExp(`^${rr(t)}$`)}function sr(t){let e=`${nr}T${rr(t)}`,n=[];return n.push(t.local?"Z?":"Z"),t.offset&&n.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${n.join("|")})`,new RegExp(`^${e}$`)}function Ms(t,e){return !!((e==="v4"||!e)&&Os.test(t)||(e==="v6"||!e)&&Ds.test(t))}function Bs(t,e){if(!Rs.test(t))return false;try{let[n]=t.split(".");if(!n)return !1;let r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),s=JSON.parse(atob(r));return !(typeof s!="object"||s===null||"typ"in s&&s?.typ!=="JWT"||!s.alg||e&&s.alg!==e)}catch{return false}}function Fs(t,e){return !!((e==="v4"||!e)&&Ps.test(t)||(e==="v6"||!e)&&js.test(t))}var Ce=class t extends w{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==g.string){let o=this._getOrReturnCtx(e);return p(o,{code:u.invalid_type,expected:g.string,received:o.parsedType}),h}let r=new H,s;for(let o of this._def.checks)if(o.kind==="min")e.data.length<o.value&&(s=this._getOrReturnCtx(e,s),p(s,{code:u.too_small,minimum:o.value,type:"string",inclusive:true,exact:false,message:o.message}),r.dirty());else if(o.kind==="max")e.data.length>o.value&&(s=this._getOrReturnCtx(e,s),p(s,{code:u.too_big,maximum:o.value,type:"string",inclusive:true,exact:false,message:o.message}),r.dirty());else if(o.kind==="length"){let a=e.data.length>o.value,i=e.data.length<o.value;(a||i)&&(s=this._getOrReturnCtx(e,s),a?p(s,{code:u.too_big,maximum:o.value,type:"string",inclusive:true,exact:true,message:o.message}):i&&p(s,{code:u.too_small,minimum:o.value,type:"string",inclusive:true,exact:true,message:o.message}),r.dirty());}else if(o.kind==="email")Is.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"email",code:u.invalid_string,message:o.message}),r.dirty());else if(o.kind==="emoji")Sn||(Sn=new RegExp(Ns,"u")),Sn.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"emoji",code:u.invalid_string,message:o.message}),r.dirty());else if(o.kind==="uuid")bs.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"uuid",code:u.invalid_string,message:o.message}),r.dirty());else if(o.kind==="nanoid")xs.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"nanoid",code:u.invalid_string,message:o.message}),r.dirty());else if(o.kind==="cuid")Ss.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"cuid",code:u.invalid_string,message:o.message}),r.dirty());else if(o.kind==="cuid2")Ts.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"cuid2",code:u.invalid_string,message:o.message}),r.dirty());else if(o.kind==="ulid")As.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"ulid",code:u.invalid_string,message:o.message}),r.dirty());else if(o.kind==="url")try{new URL(e.data);}catch{s=this._getOrReturnCtx(e,s),p(s,{validation:"url",code:u.invalid_string,message:o.message}),r.dirty();}else o.kind==="regex"?(o.regex.lastIndex=0,o.regex.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"regex",code:u.invalid_string,message:o.message}),r.dirty())):o.kind==="trim"?e.data=e.data.trim():o.kind==="includes"?e.data.includes(o.value,o.position)||(s=this._getOrReturnCtx(e,s),p(s,{code:u.invalid_string,validation:{includes:o.value,position:o.position},message:o.message}),r.dirty()):o.kind==="toLowerCase"?e.data=e.data.toLowerCase():o.kind==="toUpperCase"?e.data=e.data.toUpperCase():o.kind==="startsWith"?e.data.startsWith(o.value)||(s=this._getOrReturnCtx(e,s),p(s,{code:u.invalid_string,validation:{startsWith:o.value},message:o.message}),r.dirty()):o.kind==="endsWith"?e.data.endsWith(o.value)||(s=this._getOrReturnCtx(e,s),p(s,{code:u.invalid_string,validation:{endsWith:o.value},message:o.message}),r.dirty()):o.kind==="datetime"?sr(o).test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{code:u.invalid_string,validation:"datetime",message:o.message}),r.dirty()):o.kind==="date"?Vs.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{code:u.invalid_string,validation:"date",message:o.message}),r.dirty()):o.kind==="time"?Us(o).test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{code:u.invalid_string,validation:"time",message:o.message}),r.dirty()):o.kind==="duration"?Cs.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"duration",code:u.invalid_string,message:o.message}),r.dirty()):o.kind==="ip"?Ms(e.data,o.version)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"ip",code:u.invalid_string,message:o.message}),r.dirty()):o.kind==="jwt"?Bs(e.data,o.alg)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"jwt",code:u.invalid_string,message:o.message}),r.dirty()):o.kind==="cidr"?Fs(e.data,o.version)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"cidr",code:u.invalid_string,message:o.message}),r.dirty()):o.kind==="base64"?Ls.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"base64",code:u.invalid_string,message:o.message}),r.dirty()):o.kind==="base64url"?$s.test(e.data)||(s=this._getOrReturnCtx(e,s),p(s,{validation:"base64url",code:u.invalid_string,message:o.message}),r.dirty()):S.assertNever(o);return {status:r.value,value:e.data}}_regex(e,n,r){return this.refinement(s=>e.test(s),{validation:n,code:u.invalid_string,...m.errToObj(r)})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...m.errToObj(e)})}url(e){return this._addCheck({kind:"url",...m.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...m.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...m.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...m.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...m.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...m.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...m.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...m.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...m.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...m.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...m.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...m.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:false,local:false,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??false,local:e?.local??false,...m.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...m.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...m.errToObj(e)})}regex(e,n){return this._addCheck({kind:"regex",regex:e,...m.errToObj(n)})}includes(e,n){return this._addCheck({kind:"includes",value:e,position:n?.position,...m.errToObj(n?.message)})}startsWith(e,n){return this._addCheck({kind:"startsWith",value:e,...m.errToObj(n)})}endsWith(e,n){return this._addCheck({kind:"endsWith",value:e,...m.errToObj(n)})}min(e,n){return this._addCheck({kind:"min",value:e,...m.errToObj(n)})}max(e,n){return this._addCheck({kind:"max",value:e,...m.errToObj(n)})}length(e,n){return this._addCheck({kind:"length",value:e,...m.errToObj(n)})}nonempty(e){return this.min(1,m.errToObj(e))}trim(){return new t({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return !!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return !!this._def.checks.find(e=>e.kind==="date")}get isTime(){return !!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return !!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return !!this._def.checks.find(e=>e.kind==="email")}get isURL(){return !!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return !!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return !!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return !!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return !!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return !!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return !!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return !!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return !!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return !!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return !!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxLength(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}};Ce.create=t=>new Ce({checks:[],typeName:y.ZodString,coerce:t?.coerce??false,..._(t)});function zs(t,e){let n=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,s=n>r?n:r,o=Number.parseInt(t.toFixed(s).replace(".","")),a=Number.parseInt(e.toFixed(s).replace(".",""));return o%a/10**s}var je=class t extends w{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf;}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==g.number){let o=this._getOrReturnCtx(e);return p(o,{code:u.invalid_type,expected:g.number,received:o.parsedType}),h}let r,s=new H;for(let o of this._def.checks)o.kind==="int"?S.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),p(r,{code:u.invalid_type,expected:"integer",received:"float",message:o.message}),s.dirty()):o.kind==="min"?(o.inclusive?e.data<o.value:e.data<=o.value)&&(r=this._getOrReturnCtx(e,r),p(r,{code:u.too_small,minimum:o.value,type:"number",inclusive:o.inclusive,exact:false,message:o.message}),s.dirty()):o.kind==="max"?(o.inclusive?e.data>o.value:e.data>=o.value)&&(r=this._getOrReturnCtx(e,r),p(r,{code:u.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:false,message:o.message}),s.dirty()):o.kind==="multipleOf"?zs(e.data,o.value)!==0&&(r=this._getOrReturnCtx(e,r),p(r,{code:u.not_multiple_of,multipleOf:o.value,message:o.message}),s.dirty()):o.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),p(r,{code:u.not_finite,message:o.message}),s.dirty()):S.assertNever(o);return {status:s.value,value:e.data}}gte(e,n){return this.setLimit("min",e,true,m.toString(n))}gt(e,n){return this.setLimit("min",e,false,m.toString(n))}lte(e,n){return this.setLimit("max",e,true,m.toString(n))}lt(e,n){return this.setLimit("max",e,false,m.toString(n))}setLimit(e,n,r,s){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:m.toString(s)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:m.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:false,message:m.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:false,message:m.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:true,message:m.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:true,message:m.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:m.toString(n)})}finite(e){return this._addCheck({kind:"finite",message:m.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:true,value:Number.MIN_SAFE_INTEGER,message:m.toString(e)})._addCheck({kind:"max",inclusive:true,value:Number.MAX_SAFE_INTEGER,message:m.toString(e)})}get minValue(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}get isInt(){return !!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&S.isInteger(e.value))}get isFinite(){let e=null,n=null;for(let r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return true;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(e===null||r.value<e)&&(e=r.value);}return Number.isFinite(n)&&Number.isFinite(e)}};je.create=t=>new je({checks:[],typeName:y.ZodNumber,coerce:t?.coerce||false,..._(t)});var Le=class t extends w{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte;}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data);}catch{return this._getInvalidInput(e)}if(this._getType(e)!==g.bigint)return this._getInvalidInput(e);let r,s=new H;for(let o of this._def.checks)o.kind==="min"?(o.inclusive?e.data<o.value:e.data<=o.value)&&(r=this._getOrReturnCtx(e,r),p(r,{code:u.too_small,type:"bigint",minimum:o.value,inclusive:o.inclusive,message:o.message}),s.dirty()):o.kind==="max"?(o.inclusive?e.data>o.value:e.data>=o.value)&&(r=this._getOrReturnCtx(e,r),p(r,{code:u.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),s.dirty()):o.kind==="multipleOf"?e.data%o.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),p(r,{code:u.not_multiple_of,multipleOf:o.value,message:o.message}),s.dirty()):S.assertNever(o);return {status:s.value,value:e.data}}_getInvalidInput(e){let n=this._getOrReturnCtx(e);return p(n,{code:u.invalid_type,expected:g.bigint,received:n.parsedType}),h}gte(e,n){return this.setLimit("min",e,true,m.toString(n))}gt(e,n){return this.setLimit("min",e,false,m.toString(n))}lte(e,n){return this.setLimit("max",e,true,m.toString(n))}lt(e,n){return this.setLimit("max",e,false,m.toString(n))}setLimit(e,n,r,s){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:m.toString(s)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:false,message:m.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:false,message:m.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:true,message:m.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:true,message:m.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:m.toString(n)})}get minValue(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}};Le.create=t=>new Le({checks:[],typeName:y.ZodBigInt,coerce:t?.coerce??false,..._(t)});var $e=class extends w{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==g.boolean){let r=this._getOrReturnCtx(e);return p(r,{code:u.invalid_type,expected:g.boolean,received:r.parsedType}),h}return K(e.data)}};$e.create=t=>new $e({typeName:y.ZodBoolean,coerce:t?.coerce||false,..._(t)});var Ve=class t extends w{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==g.date){let o=this._getOrReturnCtx(e);return p(o,{code:u.invalid_type,expected:g.date,received:o.parsedType}),h}if(Number.isNaN(e.data.getTime())){let o=this._getOrReturnCtx(e);return p(o,{code:u.invalid_date}),h}let r=new H,s;for(let o of this._def.checks)o.kind==="min"?e.data.getTime()<o.value&&(s=this._getOrReturnCtx(e,s),p(s,{code:u.too_small,message:o.message,inclusive:true,exact:false,minimum:o.value,type:"date"}),r.dirty()):o.kind==="max"?e.data.getTime()>o.value&&(s=this._getOrReturnCtx(e,s),p(s,{code:u.too_big,message:o.message,inclusive:true,exact:false,maximum:o.value,type:"date"}),r.dirty()):S.assertNever(o);return {status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}min(e,n){return this._addCheck({kind:"min",value:e.getTime(),message:m.toString(n)})}max(e,n){return this._addCheck({kind:"max",value:e.getTime(),message:m.toString(n)})}get minDate(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e!=null?new Date(e):null}};Ve.create=t=>new Ve({checks:[],coerce:t?.coerce||false,typeName:y.ZodDate,..._(t)});var lt=class extends w{_parse(e){if(this._getType(e)!==g.symbol){let r=this._getOrReturnCtx(e);return p(r,{code:u.invalid_type,expected:g.symbol,received:r.parsedType}),h}return K(e.data)}};lt.create=t=>new lt({typeName:y.ZodSymbol,..._(t)});var Ue=class extends w{_parse(e){if(this._getType(e)!==g.undefined){let r=this._getOrReturnCtx(e);return p(r,{code:u.invalid_type,expected:g.undefined,received:r.parsedType}),h}return K(e.data)}};Ue.create=t=>new Ue({typeName:y.ZodUndefined,..._(t)});var Me=class extends w{_parse(e){if(this._getType(e)!==g.null){let r=this._getOrReturnCtx(e);return p(r,{code:u.invalid_type,expected:g.null,received:r.parsedType}),h}return K(e.data)}};Me.create=t=>new Me({typeName:y.ZodNull,..._(t)});var Ie=class extends w{constructor(){super(...arguments),this._any=true;}_parse(e){return K(e.data)}};Ie.create=t=>new Ie({typeName:y.ZodAny,..._(t)});var ke=class extends w{constructor(){super(...arguments),this._unknown=true;}_parse(e){return K(e.data)}};ke.create=t=>new ke({typeName:y.ZodUnknown,..._(t)});var ae=class extends w{_parse(e){let n=this._getOrReturnCtx(e);return p(n,{code:u.invalid_type,expected:g.never,received:n.parsedType}),h}};ae.create=t=>new ae({typeName:y.ZodNever,..._(t)});var ut=class extends w{_parse(e){if(this._getType(e)!==g.undefined){let r=this._getOrReturnCtx(e);return p(r,{code:u.invalid_type,expected:g.void,received:r.parsedType}),h}return K(e.data)}};ut.create=t=>new ut({typeName:y.ZodVoid,..._(t)});var _e=class t extends w{_parse(e){let{ctx:n,status:r}=this._processInputParams(e),s=this._def;if(n.parsedType!==g.array)return p(n,{code:u.invalid_type,expected:g.array,received:n.parsedType}),h;if(s.exactLength!==null){let a=n.data.length>s.exactLength.value,i=n.data.length<s.exactLength.value;(a||i)&&(p(n,{code:a?u.too_big:u.too_small,minimum:i?s.exactLength.value:void 0,maximum:a?s.exactLength.value:void 0,type:"array",inclusive:true,exact:true,message:s.exactLength.message}),r.dirty());}if(s.minLength!==null&&n.data.length<s.minLength.value&&(p(n,{code:u.too_small,minimum:s.minLength.value,type:"array",inclusive:true,exact:false,message:s.minLength.message}),r.dirty()),s.maxLength!==null&&n.data.length>s.maxLength.value&&(p(n,{code:u.too_big,maximum:s.maxLength.value,type:"array",inclusive:true,exact:false,message:s.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((a,i)=>s.type._parseAsync(new se(n,a,n.path,i)))).then(a=>H.mergeArray(r,a));let o=[...n.data].map((a,i)=>s.type._parseSync(new se(n,a,n.path,i)));return H.mergeArray(r,o)}get element(){return this._def.type}min(e,n){return new t({...this._def,minLength:{value:e,message:m.toString(n)}})}max(e,n){return new t({...this._def,maxLength:{value:e,message:m.toString(n)}})}length(e,n){return new t({...this._def,exactLength:{value:e,message:m.toString(n)}})}nonempty(e){return this.min(1,e)}};_e.create=(t,e)=>new _e({type:t,minLength:null,maxLength:null,exactLength:null,typeName:y.ZodArray,..._(e)});function ct(t){if(t instanceof X){let e={};for(let n in t.shape){let r=t.shape[n];e[n]=re.create(ct(r));}return new X({...t._def,shape:()=>e})}else return t instanceof _e?new _e({...t._def,type:ct(t.element)}):t instanceof re?re.create(ct(t.unwrap())):t instanceof pe?pe.create(ct(t.unwrap())):t instanceof fe?fe.create(t.items.map(e=>ct(e))):t}var X=class t extends w{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend;}_getCached(){if(this._cached!==null)return this._cached;let e=this._def.shape(),n=S.objectKeys(e);return this._cached={shape:e,keys:n},this._cached}_parse(e){if(this._getType(e)!==g.object){let l=this._getOrReturnCtx(e);return p(l,{code:u.invalid_type,expected:g.object,received:l.parsedType}),h}let{status:r,ctx:s}=this._processInputParams(e),{shape:o,keys:a}=this._getCached(),i=[];if(!(this._def.catchall instanceof ae&&this._def.unknownKeys==="strip"))for(let l in s.data)a.includes(l)||i.push(l);let c=[];for(let l of a){let d=o[l],b=s.data[l];c.push({key:{status:"valid",value:l},value:d._parse(new se(s,b,s.path,l)),alwaysSet:l in s.data});}if(this._def.catchall instanceof ae){let l=this._def.unknownKeys;if(l==="passthrough")for(let d of i)c.push({key:{status:"valid",value:d},value:{status:"valid",value:s.data[d]}});else if(l==="strict")i.length>0&&(p(s,{code:u.unrecognized_keys,keys:i}),r.dirty());else if(l!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else {let l=this._def.catchall;for(let d of i){let b=s.data[d];c.push({key:{status:"valid",value:d},value:l._parse(new se(s,b,s.path,d)),alwaysSet:d in s.data});}}return s.common.async?Promise.resolve().then(async()=>{let l=[];for(let d of c){let b=await d.key,L=await d.value;l.push({key:b,value:L,alwaysSet:d.alwaysSet});}return l}).then(l=>H.mergeObjectSync(r,l)):H.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return m.errToObj,new t({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(n,r)=>{let s=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:m.errToObj(e).message??s}:{message:s}}}:{}})}strip(){return new t({...this._def,unknownKeys:"strip"})}passthrough(){return new t({...this._def,unknownKeys:"passthrough"})}extend(e){return new t({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new t({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:y.ZodObject})}setKey(e,n){return this.augment({[e]:n})}catchall(e){return new t({...this._def,catchall:e})}pick(e){let n={};for(let r of S.objectKeys(e))e[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new t({...this._def,shape:()=>n})}omit(e){let n={};for(let r of S.objectKeys(this.shape))e[r]||(n[r]=this.shape[r]);return new t({...this._def,shape:()=>n})}deepPartial(){return ct(this)}partial(e){let n={};for(let r of S.objectKeys(this.shape)){let s=this.shape[r];e&&!e[r]?n[r]=s:n[r]=s.optional();}return new t({...this._def,shape:()=>n})}required(e){let n={};for(let r of S.objectKeys(this.shape))if(e&&!e[r])n[r]=this.shape[r];else {let o=this.shape[r];for(;o instanceof re;)o=o._def.innerType;n[r]=o;}return new t({...this._def,shape:()=>n})}keyof(){return or(S.objectKeys(this.shape))}};X.create=(t,e)=>new X({shape:()=>t,unknownKeys:"strip",catchall:ae.create(),typeName:y.ZodObject,..._(e)});X.strictCreate=(t,e)=>new X({shape:()=>t,unknownKeys:"strict",catchall:ae.create(),typeName:y.ZodObject,..._(e)});X.lazycreate=(t,e)=>new X({shape:t,unknownKeys:"strip",catchall:ae.create(),typeName:y.ZodObject,..._(e)});var Be=class extends w{_parse(e){let{ctx:n}=this._processInputParams(e),r=this._def.options;function s(o){for(let i of o)if(i.result.status==="valid")return i.result;for(let i of o)if(i.result.status==="dirty")return n.common.issues.push(...i.ctx.common.issues),i.result;let a=o.map(i=>new Y(i.ctx.common.issues));return p(n,{code:u.invalid_union,unionErrors:a}),h}if(n.common.async)return Promise.all(r.map(async o=>{let a={...n,common:{...n.common,issues:[]},parent:null};return {result:await o._parseAsync({data:n.data,path:n.path,parent:a}),ctx:a}})).then(s);{let o,a=[];for(let c of r){let l={...n,common:{...n.common,issues:[]},parent:null},d=c._parseSync({data:n.data,path:n.path,parent:l});if(d.status==="valid")return d;d.status==="dirty"&&!o&&(o={result:d,ctx:l}),l.common.issues.length&&a.push(l.common.issues);}if(o)return n.common.issues.push(...o.ctx.common.issues),o.result;let i=a.map(c=>new Y(c));return p(n,{code:u.invalid_union,unionErrors:i}),h}}get options(){return this._def.options}};Be.create=(t,e)=>new Be({options:t,typeName:y.ZodUnion,..._(e)});var ve=t=>t instanceof ze?ve(t.schema):t instanceof oe?ve(t.innerType()):t instanceof He?[t.value]:t instanceof Je?t.options:t instanceof Ke?S.objectValues(t.enum):t instanceof Ge?ve(t._def.innerType):t instanceof Ue?[void 0]:t instanceof Me?[null]:t instanceof re?[void 0,...ve(t.unwrap())]:t instanceof pe?[null,...ve(t.unwrap())]:t instanceof xt||t instanceof We?ve(t.unwrap()):t instanceof Ze?ve(t._def.innerType):[],Gt=class t extends w{_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==g.object)return p(n,{code:u.invalid_type,expected:g.object,received:n.parsedType}),h;let r=this.discriminator,s=n.data[r],o=this.optionsMap.get(s);return o?n.common.async?o._parseAsync({data:n.data,path:n.path,parent:n}):o._parseSync({data:n.data,path:n.path,parent:n}):(p(n,{code:u.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),h)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,n,r){let s=new Map;for(let o of n){let a=ve(o.shape[e]);if(!a.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(let i of a){if(s.has(i))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(i)}`);s.set(i,o);}}return new t({typeName:y.ZodDiscriminatedUnion,discriminator:e,options:n,optionsMap:s,..._(r)})}};function Tn(t,e){let n=de(t),r=de(e);if(t===e)return {valid:true,data:t};if(n===g.object&&r===g.object){let s=S.objectKeys(e),o=S.objectKeys(t).filter(i=>s.indexOf(i)!==-1),a={...t,...e};for(let i of o){let c=Tn(t[i],e[i]);if(!c.valid)return {valid:false};a[i]=c.data;}return {valid:true,data:a}}else if(n===g.array&&r===g.array){if(t.length!==e.length)return {valid:false};let s=[];for(let o=0;o<t.length;o++){let a=t[o],i=e[o],c=Tn(a,i);if(!c.valid)return {valid:false};s.push(c.data);}return {valid:true,data:s}}else return n===g.date&&r===g.date&&+t==+e?{valid:true,data:t}:{valid:false}}var Fe=class extends w{_parse(e){let{status:n,ctx:r}=this._processInputParams(e),s=(o,a)=>{if(Jt(o)||Jt(a))return h;let i=Tn(o.value,a.value);return i.valid?((Kt(o)||Kt(a))&&n.dirty(),{status:n.value,value:i.data}):(p(r,{code:u.invalid_intersection_types}),h)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([o,a])=>s(o,a)):s(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}};Fe.create=(t,e,n)=>new Fe({left:t,right:e,typeName:y.ZodIntersection,..._(n)});var fe=class t extends w{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==g.array)return p(r,{code:u.invalid_type,expected:g.array,received:r.parsedType}),h;if(r.data.length<this._def.items.length)return p(r,{code:u.too_small,minimum:this._def.items.length,inclusive:true,exact:false,type:"array"}),h;!this._def.rest&&r.data.length>this._def.items.length&&(p(r,{code:u.too_big,maximum:this._def.items.length,inclusive:true,exact:false,type:"array"}),n.dirty());let o=[...r.data].map((a,i)=>{let c=this._def.items[i]||this._def.rest;return c?c._parse(new se(r,a,r.path,i)):null}).filter(a=>!!a);return r.common.async?Promise.all(o).then(a=>H.mergeArray(n,a)):H.mergeArray(n,o)}get items(){return this._def.items}rest(e){return new t({...this._def,rest:e})}};fe.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new fe({items:t,typeName:y.ZodTuple,rest:null,..._(e)})};var Zt=class t extends w{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==g.object)return p(r,{code:u.invalid_type,expected:g.object,received:r.parsedType}),h;let s=[],o=this._def.keyType,a=this._def.valueType;for(let i in r.data)s.push({key:o._parse(new se(r,i,r.path,i)),value:a._parse(new se(r,r.data[i],r.path,i)),alwaysSet:i in r.data});return r.common.async?H.mergeObjectAsync(n,s):H.mergeObjectSync(n,s)}get element(){return this._def.valueType}static create(e,n,r){return n instanceof w?new t({keyType:e,valueType:n,typeName:y.ZodRecord,..._(r)}):new t({keyType:Ce.create(),valueType:e,typeName:y.ZodRecord,..._(n)})}},dt=class extends w{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==g.map)return p(r,{code:u.invalid_type,expected:g.map,received:r.parsedType}),h;let s=this._def.keyType,o=this._def.valueType,a=[...r.data.entries()].map(([i,c],l)=>({key:s._parse(new se(r,i,r.path,[l,"key"])),value:o._parse(new se(r,c,r.path,[l,"value"]))}));if(r.common.async){let i=new Map;return Promise.resolve().then(async()=>{for(let c of a){let l=await c.key,d=await c.value;if(l.status==="aborted"||d.status==="aborted")return h;(l.status==="dirty"||d.status==="dirty")&&n.dirty(),i.set(l.value,d.value);}return {status:n.value,value:i}})}else {let i=new Map;for(let c of a){let l=c.key,d=c.value;if(l.status==="aborted"||d.status==="aborted")return h;(l.status==="dirty"||d.status==="dirty")&&n.dirty(),i.set(l.value,d.value);}return {status:n.value,value:i}}}};dt.create=(t,e,n)=>new dt({valueType:e,keyType:t,typeName:y.ZodMap,..._(n)});var ft=class t extends w{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==g.set)return p(r,{code:u.invalid_type,expected:g.set,received:r.parsedType}),h;let s=this._def;s.minSize!==null&&r.data.size<s.minSize.value&&(p(r,{code:u.too_small,minimum:s.minSize.value,type:"set",inclusive:true,exact:false,message:s.minSize.message}),n.dirty()),s.maxSize!==null&&r.data.size>s.maxSize.value&&(p(r,{code:u.too_big,maximum:s.maxSize.value,type:"set",inclusive:true,exact:false,message:s.maxSize.message}),n.dirty());let o=this._def.valueType;function a(c){let l=new Set;for(let d of c){if(d.status==="aborted")return h;d.status==="dirty"&&n.dirty(),l.add(d.value);}return {status:n.value,value:l}}let i=[...r.data.values()].map((c,l)=>o._parse(new se(r,c,r.path,l)));return r.common.async?Promise.all(i).then(c=>a(c)):a(i)}min(e,n){return new t({...this._def,minSize:{value:e,message:m.toString(n)}})}max(e,n){return new t({...this._def,maxSize:{value:e,message:m.toString(n)}})}size(e,n){return this.min(e,n).max(e,n)}nonempty(e){return this.min(1,e)}};ft.create=(t,e)=>new ft({valueType:t,minSize:null,maxSize:null,typeName:y.ZodSet,..._(e)});var Wt=class t extends w{constructor(){super(...arguments),this.validate=this.implement;}_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==g.function)return p(n,{code:u.invalid_type,expected:g.function,received:n.parsedType}),h;function r(i,c){return bt({data:i,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,it(),ye].filter(l=>!!l),issueData:{code:u.invalid_arguments,argumentsError:c}})}function s(i,c){return bt({data:i,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,it(),ye].filter(l=>!!l),issueData:{code:u.invalid_return_type,returnTypeError:c}})}let o={errorMap:n.common.contextualErrorMap},a=n.data;if(this._def.returns instanceof Ne){let i=this;return K(async function(...c){let l=new Y([]),d=await i._def.args.parseAsync(c,o).catch(N=>{throw l.addIssue(r(c,N)),l}),b=await Reflect.apply(a,this,d);return await i._def.returns._def.type.parseAsync(b,o).catch(N=>{throw l.addIssue(s(b,N)),l})})}else {let i=this;return K(function(...c){let l=i._def.args.safeParse(c,o);if(!l.success)throw new Y([r(c,l.error)]);let d=Reflect.apply(a,this,l.data),b=i._def.returns.safeParse(d,o);if(!b.success)throw new Y([s(d,b.error)]);return b.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new t({...this._def,args:fe.create(e).rest(ke.create())})}returns(e){return new t({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,n,r){return new t({args:e||fe.create([]).rest(ke.create()),returns:n||ke.create(),typeName:y.ZodFunction,..._(r)})}},ze=class extends w{get schema(){return this._def.getter()}_parse(e){let{ctx:n}=this._processInputParams(e);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}};ze.create=(t,e)=>new ze({getter:t,typeName:y.ZodLazy,..._(e)});var He=class extends w{_parse(e){if(e.data!==this._def.value){let n=this._getOrReturnCtx(e);return p(n,{received:n.data,code:u.invalid_literal,expected:this._def.value}),h}return {status:"valid",value:e.data}}get value(){return this._def.value}};He.create=(t,e)=>new He({value:t,typeName:y.ZodLiteral,..._(e)});function or(t,e){return new Je({values:t,typeName:y.ZodEnum,..._(e)})}var Je=class t extends w{_parse(e){if(typeof e.data!="string"){let n=this._getOrReturnCtx(e),r=this._def.values;return p(n,{expected:S.joinValues(r),received:n.parsedType,code:u.invalid_type}),h}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){let n=this._getOrReturnCtx(e),r=this._def.values;return p(n,{received:n.data,code:u.invalid_enum_value,options:r}),h}return K(e.data)}get options(){return this._def.values}get enum(){let e={};for(let n of this._def.values)e[n]=n;return e}get Values(){let e={};for(let n of this._def.values)e[n]=n;return e}get Enum(){let e={};for(let n of this._def.values)e[n]=n;return e}extract(e,n=this._def){return t.create(e,{...this._def,...n})}exclude(e,n=this._def){return t.create(this.options.filter(r=>!e.includes(r)),{...this._def,...n})}};Je.create=or;var Ke=class extends w{_parse(e){let n=S.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==g.string&&r.parsedType!==g.number){let s=S.objectValues(n);return p(r,{expected:S.joinValues(s),received:r.parsedType,code:u.invalid_type}),h}if(this._cache||(this._cache=new Set(S.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){let s=S.objectValues(n);return p(r,{received:r.data,code:u.invalid_enum_value,options:s}),h}return K(e.data)}get enum(){return this._def.values}};Ke.create=(t,e)=>new Ke({values:t,typeName:y.ZodNativeEnum,..._(e)});var Ne=class extends w{unwrap(){return this._def.type}_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==g.promise&&n.common.async===false)return p(n,{code:u.invalid_type,expected:g.promise,received:n.parsedType}),h;let r=n.parsedType===g.promise?n.data:Promise.resolve(n.data);return K(r.then(s=>this._def.type.parseAsync(s,{path:n.path,errorMap:n.common.contextualErrorMap})))}};Ne.create=(t,e)=>new Ne({type:t,typeName:y.ZodPromise,..._(e)});var oe=class extends w{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===y.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){let{status:n,ctx:r}=this._processInputParams(e),s=this._def.effect||null,o={addIssue:a=>{p(r,a),a.fatal?n.abort():n.dirty();},get path(){return r.path}};if(o.addIssue=o.addIssue.bind(o),s.type==="preprocess"){let a=s.transform(r.data,o);if(r.common.async)return Promise.resolve(a).then(async i=>{if(n.value==="aborted")return h;let c=await this._def.schema._parseAsync({data:i,path:r.path,parent:r});return c.status==="aborted"?h:c.status==="dirty"?De(c.value):n.value==="dirty"?De(c.value):c});{if(n.value==="aborted")return h;let i=this._def.schema._parseSync({data:a,path:r.path,parent:r});return i.status==="aborted"?h:i.status==="dirty"?De(i.value):n.value==="dirty"?De(i.value):i}}if(s.type==="refinement"){let a=i=>{let c=s.refinement(i,o);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return i};if(r.common.async===false){let i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?h:(i.status==="dirty"&&n.dirty(),a(i.value),{status:n.value,value:i.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>i.status==="aborted"?h:(i.status==="dirty"&&n.dirty(),a(i.value).then(()=>({status:n.value,value:i.value}))))}if(s.type==="transform")if(r.common.async===false){let a=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Re(a))return h;let i=s.transform(a.value,o);if(i instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return {status:n.value,value:i}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(a=>Re(a)?Promise.resolve(s.transform(a.value,o)).then(i=>({status:n.value,value:i})):h);S.assertNever(s);}};oe.create=(t,e,n)=>new oe({schema:t,typeName:y.ZodEffects,effect:e,..._(n)});oe.createWithPreprocess=(t,e,n)=>new oe({schema:e,effect:{type:"preprocess",transform:t},typeName:y.ZodEffects,..._(n)});var re=class extends w{_parse(e){return this._getType(e)===g.undefined?K(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};re.create=(t,e)=>new re({innerType:t,typeName:y.ZodOptional,..._(e)});var pe=class extends w{_parse(e){return this._getType(e)===g.null?K(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};pe.create=(t,e)=>new pe({innerType:t,typeName:y.ZodNullable,..._(e)});var Ge=class extends w{_parse(e){let{ctx:n}=this._processInputParams(e),r=n.data;return n.parsedType===g.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}};Ge.create=(t,e)=>new Ge({innerType:t,typeName:y.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,..._(e)});var Ze=class extends w{_parse(e){let{ctx:n}=this._processInputParams(e),r={...n,common:{...n.common,issues:[]}},s=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return at(s)?s.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new Y(r.common.issues)},input:r.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Y(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}};Ze.create=(t,e)=>new Ze({innerType:t,typeName:y.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,..._(e)});var pt=class extends w{_parse(e){if(this._getType(e)!==g.nan){let r=this._getOrReturnCtx(e);return p(r,{code:u.invalid_type,expected:g.nan,received:r.parsedType}),h}return {status:"valid",value:e.data}}};pt.create=t=>new pt({typeName:y.ZodNaN,..._(t)});var Hs=Symbol("zod_brand"),xt=class extends w{_parse(e){let{ctx:n}=this._processInputParams(e),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}},Rt=class t extends w{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.common.async)return (async()=>{let o=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?h:o.status==="dirty"?(n.dirty(),De(o.value)):this._def.out._parseAsync({data:o.value,path:r.path,parent:r})})();{let s=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?h:s.status==="dirty"?(n.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:r.path,parent:r})}}static create(e,n){return new t({in:e,out:n,typeName:y.ZodPipeline})}},We=class extends w{_parse(e){let n=this._def.innerType._parse(e),r=s=>(Re(s)&&(s.value=Object.freeze(s.value)),s);return at(n)?n.then(s=>r(s)):r(n)}unwrap(){return this._def.innerType}};We.create=(t,e)=>new We({innerType:t,typeName:y.ZodReadonly,..._(e)});function tr(t,e){let n=typeof t=="function"?t(e):typeof t=="string"?{message:t}:t;return typeof n=="string"?{message:n}:n}function ir(t,e={},n){return t?Ie.create().superRefine((r,s)=>{let o=t(r);if(o instanceof Promise)return o.then(a=>{if(!a){let i=tr(e,r),c=i.fatal??n??true;s.addIssue({code:"custom",...i,fatal:c});}});if(!o){let a=tr(e,r),i=a.fatal??n??true;s.addIssue({code:"custom",...a,fatal:i});}}):Ie.create()}var Js={object:X.lazycreate},y;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly";})(y||(y={}));var Ks=(t,e={message:`Input not instance of ${t.name}`})=>ir(n=>n instanceof t,e),ar=Ce.create,cr=je.create,Gs=pt.create,Zs=Le.create,lr=$e.create,Ws=Ve.create,qs=lt.create,Ys=Ue.create,Xs=Me.create,Qs=Ie.create,eo=ke.create,to=ae.create,no=ut.create,ro=_e.create,so=X.create,oo=X.strictCreate,io=Be.create,ao=Gt.create,co=Fe.create,lo=fe.create,uo=Zt.create,fo=dt.create,po=ft.create,go=Wt.create,mo=ze.create,ho=He.create,yo=Je.create,vo=Ke.create,ko=Ne.create,_o=oe.create,wo=re.create,Eo=pe.create,So=oe.createWithPreprocess,To=Rt.create,Ao=()=>ar().optional(),bo=()=>cr().optional(),xo=()=>lr().optional(),Ro={string:(t=>Ce.create({...t,coerce:true})),number:(t=>je.create({...t,coerce:true})),boolean:(t=>$e.create({...t,coerce:true})),bigint:(t=>Le.create({...t,coerce:true})),date:(t=>Ve.create({...t,coerce:true}))};var Co=h;var Io={api:{rateLimit:{windowMs:900*1e3,maxRequests:100}}};f.object({snapshot_version:f.string(),engine_target_version:f.string(),project_id:f.string(),generated_at:f.string(),root_path_hash:f.string(),metadata:f.object({total_files:f.number().int().nonnegative(),total_dependencies:f.number().int().nonnegative(),total_size_bytes:f.number().int().nonnegative(),total_lines:f.number().int().nonnegative(),max_directory_depth:f.number().int().nonnegative(),language_breakdown:f.record(f.string(),f.number().int().nonnegative())}),files:f.array(f.object({id:f.string(),path_hash:f.string(),depth:f.number().int().nonnegative(),size_bytes:f.number().int().nonnegative(),estimated_lines:f.number().int().nonnegative(),extension:f.string(),is_binary:f.boolean(),import_count:f.number().int().nonnegative().optional(),function_count:f.number().int().nonnegative().optional(),class_count:f.number().int().nonnegative().optional()})),dependencies:f.array(f.object({id:f.string(),name_hash:f.string(),major_version:f.number().int().nonnegative(),minor_version:f.number().int().nonnegative(),category:f.enum(["dev","prod","peer"])}))});f.object({name:f.string().min(1).max(100)});f.object({analysis_version:f.string(),snapshot_schema_version:f.string(),total_score:f.number().min(0).max(100),severity_band:f.enum(["HEALTHY","STABLE","STRUCTURAL_CONCERN","HIGH_RISK"]),engines:f.array(f.object({engine_name:f.string(),score_impact:f.number(),risk_level:f.enum(["HEALTHY","STABLE","STRUCTURAL_CONCERN","HIGH_RISK"]),metrics:f.record(f.number()),findings:f.array(f.object({rule_id:f.string(),title:f.string(),message:f.string(),severity:f.enum(["CRITICAL","HIGH","MEDIUM","LOW"]),category:f.enum(["SECURITY","STRUCTURE","COMPLEXITY","DEPENDENCY","REPOSITORY_HYGIENE","DOCUMENTATION","QUALITY"]),evidence:f.array(f.string()).optional(),explanation:f.string().optional(),impact:f.string().optional(),effort:f.enum(["Low","Medium","High"]).optional(),recommendations:f.array(f.string()).optional()}))})),summary:f.object({total_findings:f.number().int().nonnegative(),critical_count:f.number().int().nonnegative(),high_count:f.number().int().nonnegative(),medium_count:f.number().int().nonnegative(),low_count:f.number().int().nonnegative(),categories:f.record(f.string(),f.number().int().nonnegative())}),generated_at:f.string()});var No=f.object({NEXT_PUBLIC_SUPABASE_URL:f.string().url("Invalid SUPABASE_URL"),NEXT_PUBLIC_SUPABASE_ANON_KEY:f.string().min(1,"SUPABASE_ANON_KEY is required"),SUPABASE_SERVICE_ROLE_KEY:f.string().min(1,"SERVICE_ROLE_KEY is required"),NODE_ENV:f.enum(["development","production","test"],{errorMap:()=>({message:"NODE_ENV must be development, production, or test"})}),JWT_SECRET:f.string().min(32,"JWT_SECRET must be at least 32 characters").optional()});function Oo(){try{return No.parse(process.env)}catch(t){if(t instanceof f.ZodError){let e=t.errors.map(n=>n.path.join(".")).join(", ");throw new Error(`Environment validation failed:
24
+ Missing or invalid variables: ${e}
25
+ Please check your .env file and ensure all required variables are set.`)}throw t}}var An=null;function Po(){return An||(An=Oo()),An}new Proxy({},{get(t,e){return Po()[e]}});var qe=new Map;function Do(t=Io.api.rateLimit){let{windowMs:e,maxRequests:n,message:r}=t;return {check(s){let o=Date.now(),a=qe.get(s);a&&o>a.resetTime&&qe.delete(s);let i=qe.get(s)||{count:0,resetTime:o+e};return i.count>=n?{success:false,remaining:0,resetTime:i.resetTime,error:r||"Too many requests"}:(i.count++,qe.set(s,i),{success:true,remaining:n-i.count,resetTime:i.resetTime})},reset(s){qe.delete(s);},cleanup(){let s=Date.now();for(let[o,a]of qe.entries())s>a.resetTime&&qe.delete(o);}}}Do();var Lo={TOKEN_BINDING_SALT:kn};function dr(t,e){let n=`${t}:${e}:${Lo.TOKEN_BINDING_SALT}`;return ge.createHash("sha256").update(n).digest("hex")}function fr(t,e,n,r,s="cli"){let o=new Date().toISOString(),a=Mo(),i=$o(t,e,n,o,a),c=Vo(o,s,i),l=Uo(r,o,s,c);return {signature:l,timestamp:o,nonce:a,headers:{"X-Signature":l,"X-Timestamp":o,"X-Nonce":a,"X-Signed-Headers":"host;x-timestamp;x-nonce"}}}function $o(t,e,n,r,s){let o=ge.createHash("sha256").update(n).digest("hex");return [t.toUpperCase(),e,"",`host:www.veestack.com
26
+ `,`x-timestamp:${r}
27
+ `,`x-nonce:${s}
28
+ `,"host;x-timestamp;x-nonce",o].join(`
29
+ `)}function Vo(t,e,n){let r=t.substring(0,10).replace(/-/g,""),s=ge.createHash("sha256").update(n).digest("hex");return ["VEESTACK-HMAC-SHA256",t,`${r}/veestack/${e}/veestack_request`,s].join(`
30
+ `)}function Uo(t,e,n,r){let s=e.substring(0,10).replace(/-/g,""),o=It("VEESTACK"+t,s),a=It(o,"veestack"),i=It(a,n),c=It(i,"veestack_request");return It(c,r,"hex")}function It(t,e,n){return ge.createHmac("sha256",t).update(e).digest(n||"hex")}function Mo(){return ge.randomBytes(16).toString("hex")}var Yt=null;async function Qt(){if(Yt)return Yt;try{return Yt=await import('keytar'),Yt}catch{return null}}var Pt=rt.join(gt.homedir(),".veestack"),we=rt.join(Pt,"tokens.enc"),pr=rt.join(Pt,"salt"),gr=rt.join(Pt,".key"),en="VeeStack CLI",tn="auth_tokens",Bo=1e5,Fo=32,zo=16;function Xt(){return process.env.DEBUG?.includes("veestack")||process.env.DEBUG?.includes("*")||process.env.NODE_ENV==="development"||process.env.VEESTACK_DEBUG==="true"}async function Ho(){try{let e=await V.readFile(pr).catch(()=>null);if(e)return e}catch{}let t=ge.randomBytes(32);return await V.mkdir(Pt,{recursive:true,mode:448}),await V.writeFile(pr,t,{mode:384}),t}async function mr(){try{let r=await V.readFile(gr,"utf-8").catch(()=>null);if(r){let s=Buffer.from(r,"hex");return await V.unlink(gr).catch(()=>{}),s}}catch{}let t=`${gt.userInfo().username}@${gt.hostname()}`,e=await Ho();return ge.pbkdf2Sync(t,e,Bo,Fo,"sha256")}function Nt(t){Buffer.isBuffer(t)&&t.fill(0);}async function Dt(t){let e=await Qt();if(e)try{let l=JSON.stringify(t);await e.setPassword(en,tn,l),Xt()&&console.log(" Tokens saved to OS Keychain");return}catch(l){Xt()&&console.log(" Keychain failed, falling back to encrypted file:",l);}let n=await mr(),r=ge.randomBytes(zo),s=ge.createCipheriv("aes-256-gcm",n,r),o=JSON.stringify(t),a=Buffer.concat([s.update(o,"utf8"),s.final()]),i=s.getAuthTag(),c={iv:r.toString("hex"),data:a.toString("hex"),authTag:i.toString("hex"),timestamp:Date.now(),version:2};await V.mkdir(Pt,{recursive:true,mode:448}),await V.writeFile(we,JSON.stringify(c),{mode:384}),Nt(n),Xt()&&console.log(" Tokens saved to encrypted file (AES-256-GCM)");}async function hr(){let t=await Qt();if(t)try{let e=await t.getPassword(en,tn);if(e)return JSON.parse(e)}catch(e){Xt()&&console.log("\u26A0\uFE0F Keychain read failed, trying encrypted file:",e);}try{let e=await V.readFile(we,"utf-8"),n=JSON.parse(e);if(n.version===1)return await Jo(n);let r=await mr(),s=null;try{let o=Buffer.from(n.iv,"hex"),a=Buffer.from(n.data,"hex"),i=Buffer.from(n.authTag,"hex"),c=ge.createDecipheriv("aes-256-gcm",r,o);c.setAuthTag(i),s=Buffer.concat([c.update(a),c.final()]);let l=JSON.parse(s.toString("utf8"));return Nt(s),Nt(r),l}catch(o){throw s&&Nt(s),Nt(r),o}}catch{return null}}async function Jo(t){try{return console.log("\u{1F510} Migrating from legacy encryption format..."),await V.unlink(we).catch(()=>{}),null}catch{return null}}async function mt(){try{return await V.access(we),!0}catch{return false}}async function Ye(){try{let t=await V.stat(we).catch(()=>null);if(!t)return;let e=t.size,n=3;for(let s=0;s<n;s++){let o=ge.randomBytes(e);await V.writeFile(we,o);}await V.unlink(we);let r=await Qt();r&&await r.deletePassword(en,tn).catch(()=>{});}catch{}}async function nn(){let t=await Qt(),e=!!t,n=false;if(t)try{n=!!await t.getPassword(en,tn);}catch{}let r=false,s,o,a=0;try{let i=await V.stat(we);r=!0,s=i.mode.toString(8),o=i.size;let c=await V.readFile(we,"utf-8");a=JSON.parse(c).version||1;}catch{}return {keychainAvailable:e,keychainHasTokens:n,fileExists:r,filePermissions:s,fileSize:o,encryptionVersion:a}}var Ko=[{name:"bearer_token",regex:/Bearer\s+[a-zA-Z0-9_-]{20,}/gi,replacement:"Bearer [REDACTED]"},{name:"api_key",regex:/api[_-]?key['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"api_key: [REDACTED]"},{name:"access_token",regex:/access[_-]?token['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"access_token: [REDACTED]"},{name:"refresh_token",regex:/refresh[_-]?token['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"refresh_token: [REDACTED]"},{name:"auth_token",regex:/auth[_-]?token['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"auth_token: [REDACTED]"},{name:"password",regex:/password['"\s]*[:=]\s*['"]?([^'"\s]{8,})/gi,replacement:"password: [REDACTED]"},{name:"secret",regex:/secret['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"secret: [REDACTED]"},{name:"private_key",regex:/private[_-]?key['"\s]*[:=]\s*['"]?([a-zA-Z0-9_-]{16,})/gi,replacement:"private_key: [REDACTED]"},{name:"jwt_token",regex:/eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*/g,replacement:"[REDACTED_JWT]"},{name:"supabase_key",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g,replacement:"[REDACTED_SUPABASE_KEY]"}];function Xe(t){if(!t||typeof t!="string")return t;let e=t;for(let n of Ko)e=e.replace(n.regex,n.replacement);return e}function bn(t){return t instanceof Error?Xe(t.message).slice(0,500):typeof t=="string"?Xe(t).slice(0,500):Xe(String(t)).slice(0,500)}function rn(t){if(!t||typeof t!="object")return t;let e=["token","accessToken","refreshToken","apiKey","api_key","secret","password","privateKey","private_key","authToken","auth_token","jwt","credential","credentials"];if(Array.isArray(t))return t.map(r=>rn(r));let n={};for(let[r,s]of Object.entries(t)){let o=r.toLowerCase();e.some(a=>o.includes(a))?n[r]="[REDACTED]":typeof s=="object"&&s!==null?n[r]=rn(s):typeof s=="string"?n[r]=Xe(s):n[r]=s;}return n}function jt(t,e,...n){let r=Xe(e),s=n.map(o=>typeof o=="string"?Xe(o):typeof o=="object"&&o!==null?rn(o):o);console[t](r,...s);}var Ee={log:(t,...e)=>jt("log",t,...e),error:(t,...e)=>jt("error",t,...e),warn:(t,...e)=>jt("warn",t,...e),info:(t,...e)=>jt("info",t,...e),debug:(t,...e)=>jt("debug",t,...e)};var yr=/^\d+(ms|s|m|h|d)$/,Zo=f.object({NODE_ENV:f.enum(["development","production","test"]).default("production"),VEESTACK_API_URL:f.string().url(),VEESTACK_WEB_URL:f.string().url(),ACCESS_TOKEN_TTL:f.string().regex(yr).default("15m"),REFRESH_TOKEN_TTL:f.string().regex(yr).default("30d"),LOG_LEVEL:f.enum(["debug","info","warn","error"]).default("info")});function kr(t={}){let e=[];Go.config(t.dotenvPath?{path:t.dotenvPath}:void 0);let n=process.env.NODE_ENV||"production",r=n==="development"?"http://localhost:3000":"https://api.veestack.dev",s=n==="development"?"http://localhost:3000":"https://www.veestack.com",o={NODE_ENV:n,VEESTACK_API_URL:process.env.VEESTACK_API_URL||r,VEESTACK_WEB_URL:process.env.VEESTACK_WEB_URL||s,ACCESS_TOKEN_TTL:process.env.ACCESS_TOKEN_TTL,REFRESH_TOKEN_TTL:process.env.REFRESH_TOKEN_TTL,LOG_LEVEL:process.env.LOG_LEVEL},a=Zo.safeParse(o);if(!a.success){let i=a.error.format();console.error("\u274C Invalid environment variables:"),console.error(i),process.exit(1);}return {env:a.data,usedDotenvFallbackKeys:e}}function vr(t){return t.includes("veestack.com")||t.includes("api.veestack.dev")}function sn(t){return t.includes("localhost")||t.includes("127.0.0.1")}function an(t){let e=[],n=[],r=t.NODE_ENV==="development";r&&vr(t.VEESTACK_API_URL)&&e.push("Mismatch: NODE_ENV=development cannot use production API URL. Set VEESTACK_API_URL to http://localhost:3000"),r&&vr(t.VEESTACK_WEB_URL)&&e.push("Mismatch: NODE_ENV=development cannot use production WEB URL. Set VEESTACK_WEB_URL to http://localhost:3000"),!r&&sn(t.VEESTACK_API_URL)&&e.push("Mismatch: production mode cannot use localhost API URL."),!r&&sn(t.VEESTACK_WEB_URL)&&e.push("Mismatch: production mode cannot use localhost WEB URL.");try{let s=new URL(t.VEESTACK_API_URL).host,o=new URL(t.VEESTACK_WEB_URL).host;s!==o&&sn(t.VEESTACK_API_URL)&&sn(t.VEESTACK_WEB_URL)||s!==o&&n.push(`Heads-up: API host (${s}) != WEB host (${o}). Ensure this is intentional.`);}catch{}return {ok:e.length===0,errors:e,warnings:n}}var{env:_r}=kr(),on=an(_r);on.ok||(console.error("\u274C Environment validation failed:"),on.errors.forEach(t=>console.error(`- ${t}`)),process.exit(1));process.argv.includes("--debug")&&on.warnings.length>0&&(console.warn("\u26A0\uFE0F Environment warnings:"),on.warnings.forEach(t=>console.warn(`- ${t}`)));var ce=_r;ce.NODE_ENV==="development";var Z=ce.VEESTACK_API_URL,ht=ce.VEESTACK_WEB_URL,me=`${Z}/api/cli`,Se={device:`${me}/device`,authorize:`${me}/authorize`,token:`${me}/token`,refresh:`${me}/refresh`,logout:`${me}/logout`,whoami:`${me}/whoami`,status:`${me}/status`,createAuth:`${me}/device`,verifyCode:`${me}/token`,projects:`${Z}/api/projects`,upload:`${Z}/api/upload`};function wr(){let t=an(ce);return {environment:ce.NODE_ENV,apiVersion:"unversioned",apiBaseUrl:Z,webBaseUrl:ht,cliApiBase:me,endpoints:Se,validated:t.ok,warnings:t.warnings}}function Er(){let t=an(ce);return {valid:t.ok,errors:t.errors}}var Wo=globalThis,Sr=Wo.CLI_VERSION,br=rt.join(gt.homedir(),".veestack"),cn=rt.join(br,"config.json");async function Yo(){try{if(!ie.existsSync(cn))return;let t=ie.readFileSync(cn,"utf-8"),e=JSON.parse(t);if(await mt()){try{ie.unlinkSync(cn);}catch{}return}let n={token:e.token,refreshToken:e.refreshToken,tokenType:e.tokenType,tokenExpiresAt:e.tokenExpiresAt,device:e.device,user:e.user,subscription:e.subscription,lastLoginAt:e.lastLoginAt,apiKey:e.apiKey};await Dt(n);try{ie.unlinkSync(cn);}catch{}Ee.info("\u{1F510} Authentication migrated to encrypted storage");}catch{}}async function W(){await Yo();let t=await hr();return t?{token:t.token,tokenType:t.tokenType,refreshToken:t.refreshToken,tokenExpiresAt:t.tokenExpiresAt,device:t.device,user:t.user,subscription:t.subscription,lastLoginAt:t.lastLoginAt,apiKey:t.apiKey}:null}async function Te(){let t=await W();if(!t)return false;let e=t.token!==void 0&&t.token.length>0,n=t.apiKey!==void 0&&t.apiKey.length>0;return e||n}async function Xo(){let t=await W();return t&&(t.token||t.apiKey)||null}async function Qo(){let t=await W();return {id:t?.device?.id,fingerprint:t?.device?.fingerprint}}async function he(t="GET",e="",n="",r=["project:read"]){let s=await Xo();if(!s)return {};let o=await W(),a=await Qo();if(!a.id||!a.fingerprint||!o?.refreshToken)return {};let i=dr(o.refreshToken,a.fingerprint),c=fr(t,e,n,o.refreshToken,"cli");return {Authorization:`Bearer ${s}`,"Content-Type":"application/json","X-Device-ID":a.id,"X-CLI-Version":Sr||"unknown","X-Device-Fingerprint":a.fingerprint,"X-Token-Binding":i,"X-Signature":c.signature,"X-Timestamp":c.timestamp,"X-Nonce":c.nonce,"X-Scope":r.join(","),"X-Security-Version":Sr||"unknown"}}function Rn(t){if(!t.tokenExpiresAt)return true;let e=new Date(t.tokenExpiresAt),n=300*1e3;return Date.now()>=e.getTime()-n}async function ei(t){if(!t.refreshToken)return null;try{let e={"Content-Type":"application/json"},n=Se.refresh,r=JSON.stringify({refresh_token:t.refreshToken,device_id:t.device?.id,device_fingerprint:t.device?.fingerprint}),s=await fetch(n,{method:"POST",headers:e,body:r});if(s.status===401){let i=await s.json().catch(()=>({}));throw i.code==="device_mismatch"&&(await Ye(),console.log(v.red(`
31
+ \u274C Security Alert: Device mismatch`)),console.log(v.yellow(`
32
+ Your token was used from a different device.`)),console.log(v.gray("This could indicate a token theft attempt.")),console.log(v.gray("Please login again:")),console.log(v.cyan(" veestack login")),process.exit(1)),i.code==="device_revoked"&&(await Ye(),console.log(v.red(`
33
+ \u274C Device authorization revoked`)),console.log(v.yellow(`
34
+ Your device was removed from authorized devices.`)),console.log(v.gray("Please login again:")),console.log(v.cyan(" veestack login")),process.exit(1)),(i.code==="token_invalid"||i.code==="session_expired")&&(await Ye(),console.log(v.red(`
35
+ \u274C Session expired`)),console.log(v.yellow(`
36
+ Your session has expired or your password was changed.`)),console.log(v.gray("Please login again:")),console.log(v.cyan(" veestack login")),process.exit(1)),new Error("Token refresh failed: Unauthorized")}if(!s.ok)throw new Error("Token refresh failed");let o=await s.json(),a={...t,token:o.access_token,tokenExpiresAt:new Date(Date.now()+o.expires_in*1e3).toISOString()};return o.refresh_token&&(a.refreshToken=o.refresh_token),await Dt({token:a.token,refreshToken:a.refreshToken,tokenType:a.tokenType,tokenExpiresAt:a.tokenExpiresAt,device:a.device,user:a.user,subscription:a.subscription,lastLoginAt:a.lastLoginAt,apiKey:a.apiKey}),a}catch(e){return e instanceof Error&&e.message.includes("fetch")&&(Ee.warn(`
37
+ \u26A0\uFE0F Network error`),Ee.info("Could not connect to authentication server."),Ee.info("Please check your connection and try again.")),null}}async function Pe(){let t=await W();if(!t)return console.log(v.yellow(`
38
+ \u26A0\uFE0F You are not logged in`)),console.log(v.gray(`
39
+ Login to enable:`)),console.log(v.gray(" \u2022 Cloud reports")),console.log(v.gray(" \u2022 Team dashboard")),console.log(v.gray(` \u2022 Historical scans
40
+ `)),console.log(v.gray("Run:")),console.log(v.cyan(" veestack login")),null;if(t.refreshToken&&Rn(t)){console.log(v.yellow("Token expired, refreshing..."));let e=await ei(t);return e?(console.log(v.green("\u2713 Token refreshed")),e):(await Ye(),console.log(v.red(`
41
+ \u274C Session expired`)),console.log(v.yellow("Your refresh token has expired.")),console.log(v.gray("Run: veestack login")),null)}return t}async function ln(){let t=await W();return !t||!t.subscription?"free":t.subscription.tier||"free"}async function xr(){let t=await W();return !t||!t.subscription||t.subscription.tier==="free"?true:t.subscription.expiresAt?new Date(t.subscription.expiresAt)>new Date&&t.subscription.isActive:t.subscription.isActive}function Rr(t){if(t.user)try{let e=join(br,"accounts"),n=be("fs");n.mkdirSync(e,{recursive:!0});let r=join(e,`${t.user.id}.json`);n.writeFileSync(r,JSON.stringify(t,null,2),{mode:384});}catch{}}async function Nr(){try{let t=await fetch(`${Z}/v1/cli/version`,{method:"GET",headers:{Accept:"application/json"}});if(t.ok){let n=(await t.json()).version;n&&n!==ne&&(console.log(v.yellow(`
42
+ \u2728 New version available: ${v.bold(n)} (current: ${ne})`)),console.log(v.gray(` Run: ${v.cyan("veestack upgrade")} to update
43
+ `)));}}catch{}}async function ni(){let t=process.cwd(),e=join(t,"package.json"),n=[{name:"Next.js",files:["next.config.js","next.config.ts","next.config.mjs"]},{name:"Nuxt.js",files:["nuxt.config.js","nuxt.config.ts"]},{name:"Vue CLI",files:["vue.config.js"]},{name:"Angular",files:["angular.json"]},{name:"SvelteKit",files:["svelte.config.js","svelte.config.ts"]},{name:"Vite",files:["vite.config.js","vite.config.ts"]},{name:"Remix",files:["remix.config.js"]},{name:"Gatsby",files:["gatsby-config.js","gatsby-config.ts"]},{name:"Astro",files:["astro.config.mjs","astro.config.js"]}];for(let r of n)for(let s of r.files)if(existsSync(join(t,s)))return {name:r.name,confidence:95};if(!existsSync(e)){if(existsSync(join(t,"requirements.txt"))){let r=readFileSync(join(t,"requirements.txt"),"utf-8").toLowerCase();if(r.includes("django"))return {name:"Django",confidence:85};if(r.includes("flask"))return {name:"Flask",confidence:85}}return existsSync(join(t,"Gemfile"))&&readFileSync(join(t,"Gemfile"),"utf-8").toLowerCase().includes("rails")?{name:"Ruby on Rails",confidence:85}:existsSync(join(t,"pom.xml"))&&readFileSync(join(t,"pom.xml"),"utf-8").toLowerCase().includes("spring-boot")?{name:"Spring Boot",confidence:85}:{name:"unknown",confidence:0}}try{let r=JSON.parse(readFileSync(e,"utf-8")),s={...r.dependencies,...r.devDependencies},o=[{name:"Next.js",primary:["next"],secondary:["next/core-web-vitals","@next/bundle-analyzer"],indicators:["app","pages"]},{name:"React",primary:["react","react-dom"],secondary:["@types/react","react-scripts","create-react-app"],indicators:["src/components","src/App.js","src/App.tsx"]},{name:"Vue",primary:["vue"],secondary:["vue-router","vuex","pinia","@vue/cli-service"],indicators:["src/views","src/components"]},{name:"Angular",primary:["@angular/core"],secondary:["@angular/cli","@angular/common","@angular/router"],indicators:["src/app"]},{name:"Svelte",primary:["svelte"],secondary:["svelte-check","@sveltejs/kit"],indicators:["src/routes"]},{name:"Express",primary:["express"],secondary:["cors","helmet","morgan","body-parser"],indicators:["routes","controllers"]},{name:"NestJS",primary:["@nestjs/core"],secondary:["@nestjs/common","@nestjs/platform-express"],indicators:["src/modules"]},{name:"Fastify",primary:["fastify"],secondary:["@fastify/cors","@fastify/helmet"],indicators:["routes"]}];for(let a of o){let i=0;for(let l of a.primary)if(s[l]){i+=70;break}let c=0;for(let l of a.secondary)s[l]&&c<2&&(i+=10,c++);for(let l of a.indicators)existsSync(join(t,l))&&(i+=10);if(i>=60)return a.name==="Next.js"&&s.next?{name:a.name,confidence:100}:{name:a.name,confidence:Math.min(i,95)}}return s.astro?{name:"Astro",confidence:80}:s.remix?{name:"Remix",confidence:80}:s.gatsby?{name:"Gatsby",confidence:80}:s.nuxt?{name:"Nuxt.js",confidence:80}:s["@sveltejs/kit"]?{name:"SvelteKit",confidence:85}:{name:"unknown",confidence:0}}catch{return {name:"unknown",confidence:0}}}async function ri(t,e){try{let n=await he(),r=await fetch(`${Z}/v1/projects`,{method:"POST",headers:n,body:JSON.stringify({name:t,framework:e,source:"cli-init"})});if(!r.ok){let s=await r.json().catch(()=>({error:"Unknown error"}));throw new Error(s.error||`HTTP ${r.status}`)}return await r.json()}catch(n){return Ee.error("Failed to create project:",n instanceof Error?n.message:String(n)),null}}function Ir(t){let e={"Next.js":["**/*.{js,jsx,ts,tsx,json,mjs,cjs}"],React:["**/*.{js,jsx,ts,tsx,json}"],Vue:["**/*.{js,jsx,ts,tsx,vue,json}"],Angular:["**/*.{ts,html,json}"],Svelte:["**/*.{js,ts,svelte,json}"],Express:["**/*.{js,ts,json}"],NestJS:["**/*.{ts,json}"],unknown:["**/*.{js,ts,jsx,tsx,json,py,go,rs,rb,php,cs,cpp,c,h}"]};return e[t]||e.unknown}function si(){return ["node_modules/**/*",".git/**/*","dist/**/*","build/**/*",".next/**/*","coverage/**/*","*.test.ts","*.spec.ts","*.min.js"]}function oi(t){let e=join(process.cwd(),"veestack.config.json");writeFileSync(e,JSON.stringify(t,null,2));}function ii(){let t=join(process.cwd(),"veestack.config.json");if(existsSync(t))try{return JSON.parse(readFileSync(t,"utf-8"))}catch{return null}return null}function ai(t){let e=process.cwd(),n=[],r=["src","app","lib","components","pages","routes","controllers","models","utils"];for(let s of r){let o=join(e,s);existsSync(o)&&n.push(`${s}/**/*`);}return n}function ci(){let t=process.cwd(),e=join(t,".git");return existsSync(e)}function li(){let t=process.cwd();return existsSync(join(t,"pnpm-lock.yaml"))?"pnpm":existsSync(join(t,"yarn.lock"))?"yarn":existsSync(join(t,"package-lock.json"))?"npm":existsSync(join(t,"bun.lockb"))?"bun":"npm"}function ui(){return `Node ${process.version}`}async function vt(t){t?.skipAuthCheck||console.log(v.bold.cyan(`
42
44
  \u{1F680} Initializing VeeStack...
43
- `));let t=false;e?.skipAuthCheck||(t=await Q()!==null,!t&&e?.ci&&console.log(g.yellow("\u26A0 Not logged in. Cloud reports and team dashboard are disabled in CI mode.")));let o=Go();if(o?.projectId&&!e?.ci&&e?.interactive){let{overwrite:A}=await Lt({type:"confirm",name:"overwrite",message:`Project already linked to ${o.name||o.projectId}. Re-initialize?`,initial:false});if(!A){console.log(g.gray(`
45
+ `));let e=false;t?.skipAuthCheck||(e=await Pe()!==null,!e&&t?.ci&&console.log(v.yellow("\u26A0 Not logged in. Cloud reports and team dashboard are disabled in CI mode.")));let n=ii();if(n?.projectId&&!t?.ci&&t?.interactive){let{overwrite:U}=await Cr({type:"confirm",name:"overwrite",message:`Project already linked to ${n.name||n.projectId}. Re-initialize?`,initial:false});if(!U){console.log(v.gray(`
44
46
  Cancelled. Existing configuration preserved.
45
- `));return}}let n=await Mo(),r=n.name!=="unknown"?n.name:"Unknown";n.confidence>70?console.log(g.green(`\u2714 Framework detected: ${n.name}`)):n.confidence>0?console.log(g.yellow(`\u26A0 Framework detected: ${n.name} (low confidence)`)):(console.log(g.yellow('\u26A0 Framework detection failed. Using "Unknown".')),console.log(g.gray(" Some analysis rules may not apply correctly.")),console.log(g.gray(` \u2139 You can manually edit ${g.cyan("veestack.config.json")} later for better analysis.`)));let s=Ho(n.name);s.length>0&&console.log(g.green(`\u2714 Structure detected: ${s.length} source directories`));let a=Wo(),i=Yo();console.log(g.green(`\u2714 Package manager: ${a}`)),console.log(g.green(`\u2714 Runtime: ${i}`)),qo()&&console.log(g.green("\u2714 Git repository detected"));let c="",l=join(process.cwd(),"package.json");if(existsSync(l))try{c=JSON.parse(readFileSync(l,"utf-8")).name||"";}catch{}c||(c=process.cwd().split(/[\\/]/).pop()||"my-project");let u;if(!(!e?.ci&&(e?.interactive||n.confidence<30)))u={projectName:c,framework:r,scanPatterns:s.length>0?s:Ft(n.name),createProject:false},console.log(g.gray(`
46
- Project name: ${c}`)),console.log(g.gray(`Framework: ${u.framework}`)),console.log(g.gray(`Scan directories: ${u.scanPatterns.join(", ")}`));else if(console.log(g.gray(`
47
+ `));return}}let r=await ni(),s=r.name!=="unknown"?r.name:"Unknown";r.confidence>70?console.log(v.green(`\u2714 Framework detected: ${r.name}`)):r.confidence>0?console.log(v.yellow(`\u26A0 Framework detected: ${r.name} (low confidence)`)):(console.log(v.yellow('\u26A0 Framework detection failed. Using "Unknown".')),console.log(v.gray(" Some analysis rules may not apply correctly.")),console.log(v.gray(` \u2139 You can manually edit ${v.cyan("veestack.config.json")} later for better analysis.`)));let o=ai(r.name);o.length>0&&console.log(v.green(`\u2714 Structure detected: ${o.length} source directories`));let a=li(),i=ui();console.log(v.green(`\u2714 Package manager: ${a}`)),console.log(v.green(`\u2714 Runtime: ${i}`)),ci()&&console.log(v.green("\u2714 Git repository detected"));let c="",l=join(process.cwd(),"package.json");if(existsSync(l))try{c=JSON.parse(readFileSync(l,"utf-8")).name||"";}catch{}c||(c=process.cwd().split(/[\\/]/).pop()||"my-project");let d;if(!(!t?.ci&&(t?.interactive||r.confidence<30)))d={projectName:c,framework:s,scanPatterns:o.length>0?o:Ir(r.name),createProject:false},console.log(v.gray(`
48
+ Project name: ${c}`)),console.log(v.gray(`Framework: ${d.framework}`)),console.log(v.gray(`Scan directories: ${d.scanPatterns.join(", ")}`));else if(console.log(v.gray(`
47
49
  Configure your project:
48
- `)),u=await Lt([{type:"text",name:"projectName",message:"Project name:",initial:c||"my-project",validate:A=>A.length>0||"Project name is required"},{type:"text",name:"framework",message:"Framework:",initial:n.name!=="unknown"?n.name:"Unknown"},{type:"multiselect",name:"scanPatterns",message:"Select directories to scan:",choices:Ft(n.name).map(A=>({title:A,value:A,selected:true})),hint:"Space to toggle, Enter to confirm"},{type:t?"confirm":null,name:"createProject",message:"Create project on VeeStack dashboard?",initial:true}],{onCancel:()=>{console.log(g.gray(`
50
+ `)),d=await Cr([{type:"text",name:"projectName",message:"Project name:",initial:c||"my-project",validate:U=>U.length>0||"Project name is required"},{type:"text",name:"framework",message:"Framework:",initial:r.name!=="unknown"?r.name:"Unknown"},{type:"multiselect",name:"scanPatterns",message:"Select directories to scan:",choices:Ir(r.name).map(U=>({title:U,value:U,selected:true})),hint:"Space to toggle, Enter to confirm"},{type:e?"confirm":null,name:"createProject",message:"Create project on VeeStack dashboard?",initial:true}],{onCancel:()=>{console.log(v.gray(`
49
51
  Cancelled.
50
- `)),process.exit(0);}}),!u.projectName){console.log(g.gray(`
52
+ `)),process.exit(0);}}),!d.projectName){console.log(v.gray(`
51
53
  Cancelled.
52
- `));return}let x;if(u.createProject){console.log(g.gray(`
53
- Creating project on VeeStack...`));let A=await zo(u.projectName,u.framework);A?(x=A.id,console.log(g.green("\u2714 Project created"))):console.log(g.yellow("\u26A0\uFE0F Could not create project on server (offline mode)"));}let E={projectId:x,name:u.projectName,framework:u.framework,scanPatterns:u.scanPatterns,excludePatterns:Ko()};Jo(E);let v=n.confidence===0;if(e?.skipNextSteps){console.log(g.green(`
54
- \u2714 Configuration saved to veestack.config.json`)),v&&console.log(g.yellow("\u26A0 Framework detection failed. Some settings may need manual adjustment."));return}console.log(g.green(`
55
- \u2714 Configuration saved to veestack.config.json`)),v&&console.log(g.yellow("\u26A0 Framework detection failed. Some settings may need manual adjustment.")),console.log(g.bold(`
56
- Next steps:`)),console.log(g.gray(" 1. Run analysis:")),console.log(g.cyan(" veestack scan")),console.log(g.gray(" 2. Upload results:")),console.log(g.cyan(" veestack upload")),console.log(g.gray(" 3. View in dashboard:")),console.log(g.cyan(` https://www.veestack.com/dashboard${x?`/projects/${x}`:""}
57
- `));}var Qe=globalThis,rn=Qe.CLI_VERSION||"unknown",sn=Qe.SNAPSHOT_VERSION||"unknown",an=Qe.ENGINE_TARGET||"unknown";function cn(e){let t={},o=e.split(/\r?\n/),n=false,r=null;for(let s of o){let a=s.replace(/\t/g," "),i=a.trim();if(!n){/^packages\s*:\s*$/.test(i)&&(n=true,r=a.match(/^\s*/)?.[0].length??0);continue}if(i!==""&&!i.startsWith("#")){let E=a.match(/^\s*/)?.[0].length??0;if(r!==null&&E<=r)break}let c=i.match(/^\/?([^\s]+)\s*:\s*$/);if(!c)continue;let l=c[1].replace(/^\/+/,""),u=l.lastIndexOf("@");if(u<=0)continue;let O=l.slice(0,u),x=l.slice(u+1);!O||!x||!/^\d+\./.test(x)||(t[O]=x);}return t}function ln(){if(process.env.GITHUB_ACTIONS){let[e,t]=(process.env.GITHUB_REPOSITORY||"").split("/");return {provider:"github_actions",repo_owner:e,repo_name:t,commit_sha:process.env.GITHUB_SHA,run_id:process.env.GITHUB_RUN_ID,event_name:process.env.GITHUB_EVENT_NAME,pr_number:process.env.GITHUB_REF?.includes("refs/pull/")?parseInt(process.env.GITHUB_REF.split("/")[2]):void 0}}}function et(e){return z__default.createHash("sha256").update(e).digest("hex")}function un(e){let t=[".exe",".dll",".so",".dylib",".bin",".png",".jpg",".jpeg",".gif",".pdf",".zip",".tar",".gz",".7z",".woff",".woff2",".ttf",".eot"],o=e.split(".").pop()?.toLowerCase();return o?t.includes("."+o):false}function gn(e){return {ts:"TypeScript",js:"JavaScript",tsx:"TypeScript",jsx:"JavaScript",py:"Python",go:"Go",rs:"Rust",java:"Java",kt:"Kotlin",rb:"Ruby",php:"PHP",cs:"C#",cpp:"C++",c:"C",h:"C",json:"JSON",yaml:"YAML",yml:"YAML",md:"Markdown",html:"HTML",css:"CSS",scss:"SCSS",sql:"SQL",sh:"Shell",mjs:"JavaScript",cjs:"JavaScript",svelte:"Svelte",vue:"Vue"}[e]||"Other"}function dn(e){let t={};for(let o of e){let n=gn(o.extension.toLowerCase());t[n]=(t[n]||0)+1;}return t}function pn(e,t){let a=0,i={critical:0,high:0,medium:0,low:0};t&&(i={critical:t.criticalCount||0,high:t.highCount||0,medium:t.mediumCount||0,low:t.lowCount||0},a=i.critical*25+i.high*15+i.medium*5+i.low*2);let c=Math.max(0,100-a),l="F";return c===100?l="A+":c>=90?l="A":c>=80?l="B":c>=70?l="C":c>=60&&(l="D"),{score:c,grade:l,breakdown:i}}async function fn(e){try{return execSync("git diff --name-only HEAD",{cwd:e,encoding:"utf-8"}).split(`
58
- `).filter(Boolean)}catch{return []}}async function mn(e,t,o,n=false){let r=[],s=await glob(t,{cwd:e,ignore:o,nodir:true,dot:true,absolute:false});if(n){let i=await fn(e);i.length>0&&(s=s.filter(c=>i.includes(c)));}let a=s.filter(i=>!i.replace(/\\/g,"/").match(/(node_modules|\.next|dist|build|\.git)\//));for(let i of a){let c=statSync(join(e,i));c.isFile()&&r.push({id:z__default.randomUUID(),path:i,path_hash:et(i),depth:i.split(/[\\/]/).length,size_bytes:c.size,estimated_lines:Math.floor(c.size/50),extension:i.split(".").pop()||"",is_binary:un(i)});}return r.sort((i,c)=>i.path_hash.localeCompare(c.path_hash))}async function hn(e){let t=[];try{let o=join(e,"package.json");if(!existsSync(o))return [];let n=JSON.parse(readFileSync(o,"utf-8")),r={},s=join(e,"pnpm-lock.yaml"),a=join(e,"package-lock.json");if(existsSync(s))r=cn(readFileSync(s,"utf8"));else if(existsSync(a)){let c=JSON.parse(readFileSync(a,"utf8"));for(let[l,u]of Object.entries(c.packages||{}))l&&u.version&&(r[l.replace("node_modules/","")]=u.version);}let i=(c,l)=>{for(let[u,O]of Object.entries(c)){let x=r[u]||O.replace(/[\^~]/,""),E=x.match(/^(\d+)\.(\d+)/);t.push({id:z__default.randomUUID(),name_hash:et(u),name:u,version:x,major_version:E?parseInt(E[1]):0,minor_version:E?parseInt(E[2]):0,category:l});}};n.dependencies&&i(n.dependencies,"prod"),n.devDependencies&&i(n.devDependencies,"dev"),n.peerDependencies&&i(n.peerDependencies,"peer");}catch{}return t.sort((o,n)=>o.name_hash.localeCompare(n.name_hash))}async function yn(e,t){let o=await hn(e);return {snapshot_version:sn,engine_target_version:an,project_id:z__default.randomUUID(),generated_at:new Date().toISOString(),root_path_hash:et(e),project_root:resolve(e),metadata:{total_files:t.length,total_dependencies:o.length,total_size_bytes:t.reduce((n,r)=>n+r.size_bytes,0),total_lines:t.reduce((n,r)=>n+(r.estimated_lines||0),0),max_directory_depth:Math.max(...t.map(n=>n.depth),0),language_breakdown:dn(t)},files:t,dependencies:o,ci_metadata:ln()}}async function tt(e){let t=e.quiet||e.json,o=e.ci||process.env.CI==="true",n=resolve(e.path),r=basename(n),s=r,a=join(n,"package.json"),i=join(n,"veestack.config.json");if(existsSync(a))try{let u=JSON.parse(readFileSync(a,"utf-8"));u.name&&(s=u.name);}catch{}if(existsSync(i))try{let u=JSON.parse(readFileSync(i,"utf-8"));u.name&&(s=u.name);}catch{}t||(console.log(g.bold.cyan(`
59
- VeeStack Security Scan`)),console.log(g.gray("\u2500".repeat(40))));await Y();if(!existsSync(i)&&!e.json){if(o)console.log(g.gray(`
60
- \u26A1 CI mode detected: Using default project name and scan directories`)),await pe({ci:true,skipAuthCheck:true,skipNextSteps:true});else if(!t){console.log(g.cyan(`
61
- \u2728 Welcome to VeeStack!`)),console.log(g.gray(`Let's configure your project to start scanning for security issues.
62
- `));let{runInit:u}=await Lt({type:"confirm",name:"runInit",message:"Would you like to run 'veestack init' first?",initial:true});u?await pe({skipAuthCheck:true,skipNextSteps:true}):console.log(g.gray(`
63
- Using smart defaults for this scan...`));}}let l=en({text:"Preparing scan...",spinner:"dots",stream:process.stdout});t||(console.log(`
64
- `+g.bold.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(g.bold.white(" Analyzing Project")),console.log(g.bold.cyan(`\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
65
- `)),l.start());try{let u=Date.now(),O=existsSync(i)?JSON.parse(readFileSync(i,"utf-8")):{},x=O.scanPatterns||["**/*.{js,jsx,ts,tsx,json,py,go,rs,rb,php,cs,cpp,c,h,mjs,cjs,svelte,vue,html}"],E=O.excludePatterns||["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**","**/*.test.ts","**/*.spec.ts"],v=await mn(n,x,E,e.diff);if(v.length===0&&!e.json){t||console.log(g.yellow(`
66
- \u26A0 No source files found to scan.`));return}let A=new on.SingleBar({format:"Scanning |"+g.cyan("{bar}")+"| {percentage}% ({value}/{total} files)",barCompleteChar:"\u2588",barIncompleteChar:"\u2591",hideCursor:!0});t||A.start(v.length,0);let _=await St(n,v.map(V=>V.path));t||(A.update(Math.floor(v.length*.5)),l.text="Analyzing security...");let T=pn(v.length,_),ke=`report-${s}-security.json`;if(_.secretsFound>0){let V={project:s,directory:r,timestamp:new Date().toISOString(),score:T.score,grade:T.grade,criticalIssues:_.criticalCount,issues:_.results};await(await import('fs/promises')).writeFile(ke,JSON.stringify(V,null,2));}e.json&&(console.log(JSON.stringify({version:rn,timestamp:new Date().toISOString(),score:T.score,grade:T.grade,files:v.length,issues:T.breakdown,project:s,directory:r},null,2)),process.exit(0)),_.criticalCount>0&&(t||(A.stop(),l.fail("Security validation failed"),console.log(g.red(`
67
- \u274C ${_.criticalCount} Critical security risks detected.`)),_.secretsFound>0&&(console.log(g.gray(`
68
- Issues detail:`)),_.results.slice(0,5).forEach(V=>{console.log(g.yellow(` \u2022 ${V.ruleId}: `)+g.gray(`${V.filePath}:${V.line}`));}),_.secretsFound>5&&console.log(g.gray(` ... and ${_.secretsFound-5} more issues.`))),console.log(g.cyan(`
69
- \u{1F4C4} Detailed report saved to: ${ke}`)),console.log(g.yellow(`
70
- For your protection, local snapshot generation is blocked.`)),console.log(g.gray(`
71
- \u2139 Recommended actions:`)),console.log(g.gray(" 1. Open the affected file(s) and review the reported security issue.")),console.log(g.gray(" 2. Fix the vulnerability or sensitive data exposure.")),console.log(g.gray(" 3. Run 'veestack scan' again.")),process.exit(1)));let{safe:P}=vt(v.map(V=>V.path)),B=await yn(n,v.filter(V=>P.includes(V.path)));if(t||(A.update(v.length),A.stop(),l.succeed(`Analysis prepared in ${((Date.now()-u)/1e3).toFixed(1)}s`)),t)console.log(g.green(`\u2714 Scan completed. Score: ${T.grade}`));else {console.log(g.gray(`
72
- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`)),console.log(g.bold.cyan(" Security Summary")),console.log(g.gray("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(g.gray("Project: "),g.white(s)),s!==r&&console.log(g.gray("Directory: "),g.white(r));let V=T.score>=90?g.green:T.score>=70?g.yellow:g.red;console.log(g.gray("Score: "),V(`${T.score} Grade: ${T.grade}`)),console.log(g.gray("Issues found: "),g.white(`${T.breakdown.critical+T.breakdown.high+T.breakdown.medium+T.breakdown.low}`)),console.log(g.gray("Dependencies: "),g.white(B.metadata.total_dependencies)),console.log(g.gray("Files: "),g.white(v.length)),console.log(g.gray(`
73
- Next steps:`)),console.log(g.gray(" 1. Upload results to dashboard:")),console.log(g.cyan(" veestack login")),console.log(g.cyan(" veestack upload")),console.log(g.gray(`
74
- 2. View detailed report:`)),console.log(g.cyan(` ${e.output}`)),console.log(g.gray(`
54
+ `));return}let L;if(d.createProject){console.log(v.gray(`
55
+ Creating project on VeeStack...`));let U=await ri(d.projectName,d.framework);U?(L=U.id,console.log(v.green("\u2714 Project created"))):console.log(v.yellow("\u26A0\uFE0F Could not create project on server (offline mode)"));}let N={projectId:L,name:d.projectName,framework:d.framework,scanPatterns:d.scanPatterns,excludePatterns:si()};oi(N);let I=r.confidence===0;if(t?.skipNextSteps){console.log(v.green(`
56
+ \u2714 Configuration saved to veestack.config.json`)),I&&console.log(v.yellow("\u26A0 Framework detection failed. Some settings may need manual adjustment."));return}console.log(v.green(`
57
+ \u2714 Configuration saved to veestack.config.json`)),I&&console.log(v.yellow("\u26A0 Framework detection failed. Some settings may need manual adjustment.")),console.log(v.bold(`
58
+ Next steps:`)),console.log(v.gray(" 1. Run analysis:")),console.log(v.cyan(" veestack scan")),console.log(v.gray(" 2. Upload results:")),console.log(v.cyan(" veestack upload")),console.log(v.gray(" 3. View in dashboard:")),console.log(v.cyan(` https://www.veestack.com/dashboard${L?`/projects/${L}`:""}
59
+ `));}var Cn=globalThis,vi=Cn.CLI_VERSION||"unknown",ki=Cn.SNAPSHOT_VERSION||"unknown",_i=Cn.ENGINE_TARGET||"unknown";function wi(t){let e={},n=t.split(/\r?\n/),r=false,s=null;for(let o of n){let a=o.replace(/\t/g," "),i=a.trim();if(!r){/^packages\s*:\s*$/.test(i)&&(r=true,s=a.match(/^\s*/)?.[0].length??0);continue}if(i!==""&&!i.startsWith("#")){let N=a.match(/^\s*/)?.[0].length??0;if(s!==null&&N<=s)break}let c=i.match(/^\/?([^\s]+)\s*:\s*$/);if(!c)continue;let l=c[1].replace(/^\/+/,""),d=l.lastIndexOf("@");if(d<=0)continue;let b=l.slice(0,d),L=l.slice(d+1);!b||!L||!/^\d+\./.test(L)||(e[b]=L);}return e}function Ei(){if(process.env.GITHUB_ACTIONS){let[t,e]=(process.env.GITHUB_REPOSITORY||"").split("/");return {provider:"github_actions",repo_owner:t,repo_name:e,commit_sha:process.env.GITHUB_SHA,run_id:process.env.GITHUB_RUN_ID,event_name:process.env.GITHUB_EVENT_NAME,pr_number:process.env.GITHUB_REF?.includes("refs/pull/")?parseInt(process.env.GITHUB_REF.split("/")[2]):void 0}}}function In(t){return ge__default.createHash("sha256").update(t).digest("hex")}function Si(t){let e=[".exe",".dll",".so",".dylib",".bin",".png",".jpg",".jpeg",".gif",".pdf",".zip",".tar",".gz",".7z",".woff",".woff2",".ttf",".eot"],n=t.split(".").pop()?.toLowerCase();return n?e.includes("."+n):false}function Ti(t){return {ts:"TypeScript",js:"JavaScript",tsx:"TypeScript",jsx:"JavaScript",py:"Python",go:"Go",rs:"Rust",java:"Java",kt:"Kotlin",rb:"Ruby",php:"PHP",cs:"C#",cpp:"C++",c:"C",h:"C",json:"JSON",yaml:"YAML",yml:"YAML",md:"Markdown",html:"HTML",css:"CSS",scss:"SCSS",sql:"SQL",sh:"Shell",mjs:"JavaScript",cjs:"JavaScript",svelte:"Svelte",vue:"Vue"}[t]||"Other"}function Ai(t){let e={};for(let n of t){let r=Ti(n.extension.toLowerCase());e[r]=(e[r]||0)+1;}return e}function bi(t,e){let a=0,i={critical:0,high:0,medium:0,low:0};e&&(i={critical:e.criticalCount||0,high:e.highCount||0,medium:e.mediumCount||0,low:e.lowCount||0},a=i.critical*25+i.high*15+i.medium*5+i.low*2);let c=Math.max(0,100-a),l="F";return c===100?l="A+":c>=90?l="A":c>=80?l="B":c>=70?l="C":c>=60&&(l="D"),{score:c,grade:l,breakdown:i}}async function xi(t){try{return execSync("git diff --name-only HEAD",{cwd:t,encoding:"utf-8"}).split(`
60
+ `).filter(Boolean)}catch{return []}}async function Ri(t,e,n,r=false){let s=[],o=await glob(e,{cwd:t,ignore:n,nodir:true,dot:true,absolute:false});if(r){let i=await xi(t);i.length>0&&(o=o.filter(c=>i.includes(c)));}let a=o.filter(i=>!i.replace(/\\/g,"/").match(/(node_modules|\.next|dist|build|\.git)\//));for(let i of a){let c=statSync(join(t,i));c.isFile()&&s.push({id:ge__default.randomUUID(),path:i,path_hash:In(i),depth:i.split(/[\\/]/).length,size_bytes:c.size,estimated_lines:Math.floor(c.size/50),extension:i.split(".").pop()||"",is_binary:Si(i)});}return s.sort((i,c)=>i.path_hash.localeCompare(c.path_hash))}async function Ci(t){let e=[];try{let n=join(t,"package.json");if(!existsSync(n))return [];let r=JSON.parse(readFileSync(n,"utf-8")),s={},o=join(t,"pnpm-lock.yaml"),a=join(t,"package-lock.json");if(existsSync(o))s=wi(readFileSync(o,"utf8"));else if(existsSync(a)){let c=JSON.parse(readFileSync(a,"utf8"));for(let[l,d]of Object.entries(c.packages||{}))l&&d.version&&(s[l.replace("node_modules/","")]=d.version);}let i=(c,l)=>{for(let[d,b]of Object.entries(c)){let L=s[d]||b.replace(/[\^~]/,""),N=L.match(/^(\d+)\.(\d+)/);e.push({id:ge__default.randomUUID(),name_hash:In(d),name:d,version:L,major_version:N?parseInt(N[1]):0,minor_version:N?parseInt(N[2]):0,category:l});}};r.dependencies&&i(r.dependencies,"prod"),r.devDependencies&&i(r.devDependencies,"dev"),r.peerDependencies&&i(r.peerDependencies,"peer");}catch{}return e.sort((n,r)=>n.name_hash.localeCompare(r.name_hash))}async function Ii(t,e){let n=await Ci(t);return {snapshot_version:ki,engine_target_version:_i,project_id:ge__default.randomUUID(),generated_at:new Date().toISOString(),root_path_hash:In(t),project_root:resolve(t),metadata:{total_files:e.length,total_dependencies:n.length,total_size_bytes:e.reduce((r,s)=>r+s.size_bytes,0),total_lines:e.reduce((r,s)=>r+(s.estimated_lines||0),0),max_directory_depth:Math.max(...e.map(r=>r.depth),0),language_breakdown:Ai(e)},files:e,dependencies:n,ci_metadata:Ei()}}async function Nn(t){let e=t.quiet||t.json,n=t.ci||process.env.CI==="true",r=resolve(t.path),s=basename(r),o=s,a=join(r,"package.json"),i=join(r,"veestack.config.json");if(existsSync(a))try{let d=JSON.parse(readFileSync(a,"utf-8"));d.name&&(o=d.name);}catch{}if(existsSync(i))try{let d=JSON.parse(readFileSync(i,"utf-8"));d.name&&(o=d.name);}catch{}e||(console.log(v.bold.cyan(`
61
+ VeeStack Security Scan`)),console.log(v.gray("\u2500".repeat(40))));await Te();if(!existsSync(i)&&!t.json){if(n)console.log(v.gray(`
62
+ \u26A1 CI mode detected: Using default project name and scan directories`)),await vt({ci:true,skipAuthCheck:true,skipNextSteps:true});else if(!e){console.log(v.cyan(`
63
+ \u2728 Welcome to VeeStack!`)),console.log(v.gray(`Let's configure your project to start scanning for security issues.
64
+ `));let{runInit:d}=await Cr({type:"confirm",name:"runInit",message:"Would you like to run 'veestack init' first?",initial:true});d?await vt({skipAuthCheck:true,skipNextSteps:true}):console.log(v.gray(`
65
+ Using smart defaults for this scan...`));}}let l=gi({text:"Preparing scan...",spinner:"dots",stream:process.stdout});e||(console.log(`
66
+ `+v.bold.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(v.bold.white(" Analyzing Project")),console.log(v.bold.cyan(`\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
67
+ `)),l.start());try{let d=Date.now(),b=existsSync(i)?JSON.parse(readFileSync(i,"utf-8")):{},L=b.scanPatterns||["**/*.{js,jsx,ts,tsx,json,py,go,rs,rb,php,cs,cpp,c,h,mjs,cjs,svelte,vue,html}"],N=b.excludePatterns||["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**","**/*.test.ts","**/*.spec.ts"],I=await Ri(r,L,N,t.diff);if(I.length===0&&!t.json){e||console.log(v.yellow(`
68
+ \u26A0 No source files found to scan.`));return}let U=new hi.SingleBar({format:"Scanning |"+v.cyan("{bar}")+"| {percentage}% ({value}/{total} files)",barCompleteChar:"\u2588",barIncompleteChar:"\u2591",hideCursor:!0});e||U.start(I.length,0);let F=await qn(r,I.map(ee=>ee.path));e||(U.update(Math.floor(I.length*.5)),l.text="Analyzing security...");let $=bi(I.length,F),St=`report-${o}-security.json`;if(F.secretsFound>0){let ee={project:o,directory:s,timestamp:new Date().toISOString(),score:$.score,grade:$.grade,criticalIssues:F.criticalCount,issues:F.results};await(await import('fs/promises')).writeFile(St,JSON.stringify(ee,null,2));}t.json&&(console.log(JSON.stringify({version:vi,timestamp:new Date().toISOString(),score:$.score,grade:$.grade,files:I.length,issues:$.breakdown,project:o,directory:s},null,2)),process.exit(0)),F.criticalCount>0&&(e||(U.stop(),l.fail("Security validation failed"),console.log(v.red(`
69
+ \u274C ${F.criticalCount} Critical security risks detected.`)),F.secretsFound>0&&(console.log(v.gray(`
70
+ Issues detail:`)),F.results.slice(0,5).forEach(ee=>{console.log(v.yellow(` \u2022 ${ee.ruleId}: `)+v.gray(`${ee.filePath}:${ee.line}`));}),F.secretsFound>5&&console.log(v.gray(` ... and ${F.secretsFound-5} more issues.`))),console.log(v.cyan(`
71
+ \u{1F4C4} Detailed report saved to: ${St}`)),console.log(v.yellow(`
72
+ For your protection, local snapshot generation is blocked.`)),console.log(v.gray(`
73
+ \u2139 Recommended actions:`)),console.log(v.gray(" 1. Open the affected file(s) and review the reported security issue.")),console.log(v.gray(" 2. Fix the vulnerability or sensitive data exposure.")),console.log(v.gray(" 3. Run 'veestack scan' again.")),process.exit(1)));let{safe:z}=Yn(I.map(ee=>ee.path)),le=await Ii(r,I.filter(ee=>z.includes(ee.path)));if(e||(U.update(I.length),U.stop(),l.succeed(`Analysis prepared in ${((Date.now()-d)/1e3).toFixed(1)}s`)),e)console.log(v.green(`\u2714 Scan completed. Score: ${$.grade}`));else {console.log(v.gray(`
74
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`)),console.log(v.bold.cyan(" Security Summary")),console.log(v.gray("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(v.gray("Project: "),v.white(o)),o!==s&&console.log(v.gray("Directory: "),v.white(s));let ee=$.score>=90?v.green:$.score>=70?v.yellow:v.red;console.log(v.gray("Score: "),ee(`${$.score} Grade: ${$.grade}`)),console.log(v.gray("Issues found: "),v.white(`${$.breakdown.critical+$.breakdown.high+$.breakdown.medium+$.breakdown.low}`)),console.log(v.gray("Dependencies: "),v.white(le.metadata.total_dependencies)),console.log(v.gray("Files: "),v.white(I.length)),console.log(v.gray(`
75
+ Next steps:`)),console.log(v.gray(" 1. Upload results to dashboard:")),console.log(v.cyan(" veestack login")),console.log(v.cyan(" veestack upload")),console.log(v.gray(`
76
+ 2. View detailed report:`)),console.log(v.cyan(` ${t.output}`)),console.log(v.gray(`
75
77
  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
76
- `));}await(await import('fs/promises')).writeFile(e.output,JSON.stringify(B,null,2)),console.log(`
77
- \u2705 Snapshot saved to ${e.output}`);}catch(u){l.fail("Scan failed"),console.error(g.red(`
78
- \u274C Error:`),u),process.exit(1);}}var Tn=3e4;async function ot(e,t={}){let{timeout:o=Tn}=t,n=new AbortController,r=setTimeout(()=>n.abort(),o);try{let s=await fetch(e,{...t,signal:n.signal});return clearTimeout(r),s}catch(s){throw clearTimeout(r),s instanceof Error&&s.name==="AbortError"?new Error(`Request timed out after ${o/1e3}s. Please check your connection.`):s}}async function bn(){try{let e=await G("GET","/api/projects"),t=await ot(`${j}/api/projects`,{headers:e});return t.ok?(await t.json()).projects||[]:[]}catch{return []}}async function Mt(e){try{let t=JSON.stringify({name:e}),o=await G("POST","/api/projects",t),n=await ot(`${j}/api/projects`,{method:"POST",headers:o,body:t});if(n.ok){let r=await n.json();return r.project?.id||r.id||null}return null}catch{return null}}function Je(e){let t=Sn.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{t.question(e,n=>{t.close(),o(n);});})}async function An(){console.log(g.blue(`
78
+ `));}await(await import('fs/promises')).writeFile(t.output,JSON.stringify(le,null,2)),console.log(`
79
+ \u2705 Snapshot saved to ${t.output}`);}catch(d){l.fail("Scan failed"),console.error(v.red(`
80
+ \u274C Error:`),d),process.exit(1);}}var ji=3e4;async function On(t,e={}){let{timeout:n=ji}=e,r=new AbortController,s=setTimeout(()=>r.abort(),n);try{let o=await fetch(t,{...e,signal:r.signal});return clearTimeout(s),o}catch(o){throw clearTimeout(s),o instanceof Error&&o.name==="AbortError"?new Error(`Request timed out after ${n/1e3}s. Please check your connection.`):o}}async function Li(){try{let t=await he("GET","/api/projects"),e=await On(`${Z}/api/projects`,{headers:t});return e.ok?(await e.json()).projects||[]:[]}catch{return []}}async function Pr(t){try{let e=JSON.stringify({name:t}),n=await he("POST","/api/projects",e),r=await On(`${Z}/api/projects`,{method:"POST",headers:n,body:e});if(r.ok){let s=await r.json();return s.project?.id||s.id||null}return null}catch{return null}}function dn(t){let e=Pi.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{e.question(t,r=>{e.close(),n(r);});})}async function $i(){console.log(v.blue(`
79
81
  \u{1F4C1} Loading projects...
80
- `));let e=await bn();if(e.length===0){if(console.log(g.yellow(`No projects found.
81
- `)),(await Je("Do you want to create a new project? (y/n): ")).toLowerCase()==="y"){let r=await Je("Enter project name: ");if(r.trim()){let s=await Mt(r.trim());if(s)return console.log(g.green(`
82
- \u2705 Project "${r}" created successfully!`)),s}}return null}console.log(g.white(`Select a project:
83
- `)),console.log(g.gray(`0. [+] Create new project
84
- `)),e.forEach((n,r)=>{console.log(g.white(`${r+1}. ${n.name}`)),console.log(g.gray(` ID: ${n.id}`)),console.log(g.gray(` Created: ${new Date(n.created_at).toLocaleDateString()}
85
- `));});let t=await Je("Enter number (0-"+e.length+"): "),o=parseInt(t,10);if(o===0){let n=await Je(`
86
- Enter project name: `);if(n.trim()){let r=await Mt(n.trim());if(r)return console.log(g.green(`
87
- \u2705 Project "${n}" created successfully!`)),r}return null}else if(o>0&&o<=e.length){let n=e[o-1];return console.log(g.green(`
88
- \u2705 Selected project: "${n.name}"`)),n.id}else return console.log(g.red(`
89
- \u274C Invalid selection`)),null}async function nt(e){let t=e.ci||process.env.CI==="true",o=t,n=await Q();if(!n){if(t){console.log(g.yellow(`
90
- \u26A0 Skipping cloud upload in CI mode because login is not available.`)),console.log(g.gray(`Snapshot saved locally: ${e.file||"snapshot.json"}`));return}console.log(g.yellow(`
91
- \u26A0 Oops! You're not logged in.`)),console.log(g.gray(`Run 'veestack login' to upload your snapshot and unlock cloud features.
92
- `)),console.log(g.cyan(" veestack login")),process.exit(1);}let r=await ze();o||(console.log(g.blue(`
93
- \u{1F510} Authentication verified`)),n.user&&console.log(g.gray(`User: ${n.user.name}`)),console.log(g.gray(`Subscription tier: ${r==="pro"?"Pro":"Free"}`)),console.log(g.gray("\u2500".repeat(40)+`
94
- `)));let s=en({text:"Preparing upload...",isSilent:o}).start();try{let a=await import('fs/promises');existsSync(e.file)||(s.fail(`File not found: ${e.file}`),o||console.log(g.yellow(`
95
- Tip: Run "veestack scan" first to generate a snapshot.`)),process.exit(1));let i=await a.readFile(e.file,"utf-8"),c=JSON.parse(i),l=e.projectId||process.env.VEESTACK_PROJECT_ID;if(!l){o&&(s.fail("Project ID is required in CI mode. Please set VEESTACK_PROJECT_ID."),process.exit(1)),s.stop();let B=await An();B||(console.log(g.red(`
96
- \u274C No project selected. Exiting.`)),process.exit(1)),l=B,s.start("Uploading snapshot...");}s.text="Compressing and uploading snapshot...";let u=gzipSync(JSON.stringify(c)).toString("base64"),O=JSON.stringify({project_id:l,snapshot:u,compressed:!0,encoding:"base64"}),x=await G("POST","/api/snapshots/upload",O),E=await ot(`${j}/api/snapshots/upload`,{method:"POST",headers:x,body:O});if(!E.ok){let B=await E.json().catch(()=>({}));s.fail("Upload failed"),console.error(g.red(`Error: ${B.message||B.error||"Server error"}`)),process.exit(1);}let v=await E.json(),{snapshotId:A,reportId:_,score:T,severity:ke,findings:P}=v;if(s.succeed("Analysis complete"),o)console.log(`\u2714 Upload successful. Report: ${ge}/dashboard/reports/${_}?project=${l}`);else {console.log(g.green(`
97
- \u2705 Report generated and saved to VeeStack`)),console.log(g.gray("Project ID: "),g.white(l)),console.log(g.gray("Snapshot ID: "),g.white(A)),console.log(g.gray("Report ID: "),g.white(_)),console.log(g.bold(`
98
- \u{1F4CA} Security Score:`),T>=90?g.green(T):T>=70?g.yellow(T):g.red(T)),console.log(g.gray("Severity: "),ke),console.log(g.gray("Findings: "),P);let B=`${ge}/dashboard/reports/${_}?project=${l}`;console.log(g.blue(`
99
- \u{1F517} View your full report at:`)),console.log(g.underline(B));}}catch(a){s.fail("Upload failed"),console.error(a),process.exit(1);}}async function zt(e){e.format==="sarif"?await En(e):console.log(g.red('\u274C Unsupported format. Currently only "sarif" is supported.'));}async function En(e){await Q()||(console.error(g.red("\u274C Authentication required. Please login first.")),process.exit(1));let o=e.reportId;o||(console.error(g.red("\u274C Report ID is required for SARIF export.")),process.exit(1)),console.log(g.blue(`
100
- \u{1F4CA} Fetching report ${o} for SARIF export...`));try{let n=await G("GET",`/api/reports/${o}/sarif`),r=await fetch(`${j}/api/reports/${o}/sarif`,{headers:n});if(!r.ok){let c=await r.json().catch(()=>({}));throw new Error(c.message||"Failed to fetch SARIF report")}let s=await r.json(),a=e.output||"veestack-results.sarif";await(await import('fs/promises')).writeFile(a,JSON.stringify(s,null,2)),console.log(g.green(`
101
- \u2705 SARIF report exported to: ${a}`)),console.log(g.gray("You can now upload this to GitHub Security Tab."));}catch(n){console.error(g.red(`
102
- \u274C Export failed:`),n instanceof Error?n.message:n),process.exit(1);}}var In=globalThis,_n=In.CLI_VERSION||"unknown";function Pn(){return z__default.randomBytes(16).toString("hex")}function Rn(){let e=z__default.randomBytes(32).toString("base64url"),t=z__default.createHash("sha256").update(e).digest("base64url");return {code_verifier:e,code_challenge:t}}function Dn(){let e=process.platform,t=le.hostname(),o=_n,n=t||z__default.randomBytes(8).toString("hex"),r=z__default.createHash("sha256").update(`${n}:${e}:${o}`).digest("hex"),s=z__default.randomBytes(12).toString("hex"),a=`${t||"Unknown"} (${e==="win32"?"Windows":e==="darwin"?"macOS":"Linux"})`;return {id:s,name:a,fingerprint:r,os:e,cli_version:o}}async function jn(e,t){try{let o=new URL(W.token);o.searchParams.set("device_code",e),o.searchParams.set("code_verifier",t);let n=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(n.status===202)return null;if(!n.ok){let r=await n.json().catch(()=>({}));if(r.code==="slow_down")return await new Promise(s=>setTimeout(s,2e3)),null;throw new Error(r.error||`Failed to poll for token: ${n.statusText}`)}return await n.json()}catch{return null}}async function Nn(e,t){try{let o=Pn();console.log(g.gray(`[DEBUG] Creating device request at: ${W.device}`));let n=await fetch(W.device,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({device_code:o,client_id:e.id,code_challenge:t.code_challenge,code_challenge_method:"S256",device_info:e})});if(!n.ok){let r=await n.json().catch(()=>({}));throw console.log(g.red(`
103
- \u274C Server error: ${r.error||n.statusText}`)),new Error(r.error||`Failed to create device request: ${n.statusText}`)}return await n.json()}catch(o){throw console.log(g.red(`
104
- \u274C Connection error: ${o instanceof Error?o.message:"Unknown error"}`)),o}}async function Ie(){console.log(g.bold.cyan(`
82
+ `));let t=await Li();if(t.length===0){if(console.log(v.yellow(`No projects found.
83
+ `)),(await dn("Do you want to create a new project? (y/n): ")).toLowerCase()==="y"){let s=await dn("Enter project name: ");if(s.trim()){let o=await Pr(s.trim());if(o)return console.log(v.green(`
84
+ \u2705 Project "${s}" created successfully!`)),o}}return null}console.log(v.white(`Select a project:
85
+ `)),console.log(v.gray(`0. [+] Create new project
86
+ `)),t.forEach((r,s)=>{console.log(v.white(`${s+1}. ${r.name}`)),console.log(v.gray(` ID: ${r.id}`)),console.log(v.gray(` Created: ${new Date(r.created_at).toLocaleDateString()}
87
+ `));});let e=await dn("Enter number (0-"+t.length+"): "),n=parseInt(e,10);if(n===0){let r=await dn(`
88
+ Enter project name: `);if(r.trim()){let s=await Pr(r.trim());if(s)return console.log(v.green(`
89
+ \u2705 Project "${r}" created successfully!`)),s}return null}else if(n>0&&n<=t.length){let r=t[n-1];return console.log(v.green(`
90
+ \u2705 Selected project: "${r.name}"`)),r.id}else return console.log(v.red(`
91
+ \u274C Invalid selection`)),null}async function Pn(t){let e=t.ci||process.env.CI==="true",n=e,r=await Pe();if(!r){if(e){console.log(v.yellow(`
92
+ \u26A0 Skipping cloud upload in CI mode because login is not available.`)),console.log(v.gray(`Snapshot saved locally: ${t.file||"snapshot.json"}`));return}console.log(v.yellow(`
93
+ \u26A0 Oops! You're not logged in.`)),console.log(v.gray(`Run 'veestack login' to upload your snapshot and unlock cloud features.
94
+ `)),console.log(v.cyan(" veestack login")),process.exit(1);}let s=await ln();n||(console.log(v.blue(`
95
+ \u{1F510} Authentication verified`)),r.user&&console.log(v.gray(`User: ${r.user.name}`)),console.log(v.gray(`Subscription tier: ${s==="pro"?"Pro":"Free"}`)),console.log(v.gray("\u2500".repeat(40)+`
96
+ `)));let o=gi({text:"Preparing upload...",isSilent:n}).start();try{let a=await import('fs/promises');existsSync(t.file)||(o.fail(`File not found: ${t.file}`),n||console.log(v.yellow(`
97
+ Tip: Run "veestack scan" first to generate a snapshot.`)),process.exit(1));let i=await a.readFile(t.file,"utf-8"),c=JSON.parse(i),l=t.projectId||process.env.VEESTACK_PROJECT_ID;if(!l){n&&(o.fail("Project ID is required in CI mode. Please set VEESTACK_PROJECT_ID."),process.exit(1)),o.stop();let le=await $i();le||(console.log(v.red(`
98
+ \u274C No project selected. Exiting.`)),process.exit(1)),l=le,o.start("Uploading snapshot...");}o.text="Compressing and uploading snapshot...";let d=gzipSync(JSON.stringify(c)).toString("base64"),b=JSON.stringify({project_id:l,snapshot:d,compressed:!0,encoding:"base64"}),L=await he("POST","/api/snapshots/upload",b),N=await On(`${Z}/api/snapshots/upload`,{method:"POST",headers:L,body:b});if(!N.ok){let le=await N.json().catch(()=>({}));o.fail("Upload failed"),console.error(v.red(`Error: ${le.message||le.error||"Server error"}`)),process.exit(1);}let I=await N.json(),{snapshotId:U,reportId:F,score:$,severity:St,findings:z}=I;if(o.succeed("Analysis complete"),n)console.log(`\u2714 Upload successful. Report: ${ht}/dashboard/reports/${F}?project=${l}`);else {console.log(v.green(`
99
+ \u2705 Report generated and saved to VeeStack`)),console.log(v.gray("Project ID: "),v.white(l)),console.log(v.gray("Snapshot ID: "),v.white(U)),console.log(v.gray("Report ID: "),v.white(F)),console.log(v.bold(`
100
+ \u{1F4CA} Security Score:`),$>=90?v.green($):$>=70?v.yellow($):v.red($)),console.log(v.gray("Severity: "),St),console.log(v.gray("Findings: "),z);let le=`${ht}/dashboard/reports/${F}?project=${l}`;console.log(v.blue(`
101
+ \u{1F517} View your full report at:`)),console.log(v.underline(le));}}catch(a){o.fail("Upload failed"),console.error(a),process.exit(1);}}async function Dr(t){t.format==="sarif"?await Vi(t):console.log(v.red('\u274C Unsupported format. Currently only "sarif" is supported.'));}async function Vi(t){await Pe()||(console.error(v.red("\u274C Authentication required. Please login first.")),process.exit(1));let n=t.reportId;n||(console.error(v.red("\u274C Report ID is required for SARIF export.")),process.exit(1)),console.log(v.blue(`
102
+ \u{1F4CA} Fetching report ${n} for SARIF export...`));try{let r=await he("GET",`/api/reports/${n}/sarif`),s=await fetch(`${Z}/api/reports/${n}/sarif`,{headers:r});if(!s.ok){let c=await s.json().catch(()=>({}));throw new Error(c.message||"Failed to fetch SARIF report")}let o=await s.json(),a=t.output||"veestack-results.sarif";await(await import('fs/promises')).writeFile(a,JSON.stringify(o,null,2)),console.log(v.green(`
103
+ \u2705 SARIF report exported to: ${a}`)),console.log(v.gray("You can now upload this to GitHub Security Tab."));}catch(r){console.error(v.red(`
104
+ \u274C Export failed:`),r instanceof Error?r.message:r),process.exit(1);}}var Bi=globalThis,Fi=Bi.CLI_VERSION||"unknown";function zi(){return ge__default.randomBytes(16).toString("hex")}function Hi(){let t=ge__default.randomBytes(32).toString("base64url"),e=ge__default.createHash("sha256").update(t).digest("base64url");return {code_verifier:t,code_challenge:e}}function Ji(){let t=process.platform,e=gt.hostname(),n=Fi,r=e||ge__default.randomBytes(8).toString("hex"),s=ge__default.createHash("sha256").update(`${r}:${t}:${n}`).digest("hex"),o=ge__default.randomBytes(12).toString("hex"),a=`${e||"Unknown"} (${t==="win32"?"Windows":t==="darwin"?"macOS":"Linux"})`;return {id:o,name:a,fingerprint:s,os:t,cli_version:n}}async function Ki(t,e){try{let n=new URL(Se.token);n.searchParams.set("device_code",t),n.searchParams.set("code_verifier",e);let r=await fetch(n.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(r.status===202)return null;if(!r.ok){let s=await r.json().catch(()=>({}));if(s.code==="slow_down")return await new Promise(o=>setTimeout(o,2e3)),null;throw new Error(s.error||`Failed to poll for token: ${r.statusText}`)}return await r.json()}catch{return null}}async function Gi(t,e){try{let n=zi();console.log(v.gray(`[DEBUG] Creating device request at: ${Se.device}`));let r=await fetch(Se.device,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({device_code:n,client_id:t.id,code_challenge:e.code_challenge,code_challenge_method:"S256",device_info:t})});if(!r.ok){let s=await r.json().catch(()=>({}));throw console.log(v.red(`
105
+ \u274C Server error: ${s.error||r.statusText}`)),new Error(s.error||`Failed to create device request: ${r.statusText}`)}return await r.json()}catch(n){throw console.log(v.red(`
106
+ \u274C Connection error: ${n instanceof Error?n.message:"Unknown error"}`)),n}}async function Lt(){console.log(v.bold.cyan(`
105
107
  \u{1F510} Login to VeeStack
106
- `));let e=Dn(),t=Rn();console.log(g.gray("Creating device authorization request..."));let o;try{if(o=await Nn(e,t),!o)throw new Error("Failed to create device request");console.log(g.gray(`Device request created
107
- `));}catch(c){console.log(g.red(`
108
- \u274C Failed to create device request`)),console.error(c),process.exit(1);}o||(console.log(g.red(`
109
- \u274C Failed to get authorization data`)),process.exit(1));let n=`${ge}/cli-auth?code=${o.user_code}`;console.log(g.yellow(`Opening browser to authenticate...
110
- `)),console.log(g.gray(`Your code: ${o.user_code}
111
- `));try{await xn(n),console.log(g.gray(`If your browser did not open, visit: ${n}
112
- `));}catch{console.log(g.yellow(`\u26A0\uFE0F Could not open browser automatically
113
- `)),console.log(g.gray(`Please visit: ${n}
114
- `));}let r=en({text:"Waiting for browser authorization...",spinner:"dots",stream:process.stdout});r.start();let s=null,a=0,i=300;try{for(;!s&&a<i;)if(await new Promise(u=>setTimeout(u,2e3)),s=await jn(o.device_code,t.code_verifier),a++,!s){let u=a*2,O=i*2-u;r.text=`Waiting for browser authorization... (${u}s elapsed, ${O}s remaining)`;}s||(r.fail("Authentication timeout"),console.log(g.red(`
115
- \u274C Authentication request expired after 10 minutes.`)),console.log(g.yellow(`
116
- The device code has expired for security reasons.`)),console.log(g.gray("Device codes are valid for 10 minutes only.")),console.log(g.yellow(`
117
- Please try again with: `)+g.cyan(`veestack login
118
- `)),process.exit(1)),r.succeed("Authentication successful");let c=typeof s.expires_in=="number"?s.expires_in:900,l={token:s.access_token,tokenType:s.token_type,refreshToken:s.refresh_token,tokenExpiresAt:new Date(Date.now()+c*1e3).toISOString(),device:{id:e.id,name:e.name,fingerprint:e.fingerprint},user:{id:s.user.id,email:s.user.email,name:s.user.name,provider:s.user.provider},subscription:s.subscription||{tier:"free",isActive:!0},lastLoginAt:new Date().toISOString()};try{await Ce(l);let u=await Ue();console.log(g.green(`
108
+ `));let t=Ji(),e=Hi();console.log(v.gray("Creating device authorization request..."));let n;try{if(n=await Gi(t,e),!n)throw new Error("Failed to create device request");console.log(v.gray(`Device request created
109
+ `));}catch(c){console.log(v.red(`
110
+ \u274C Failed to create device request`)),console.error(c),process.exit(1);}n||(console.log(v.red(`
111
+ \u274C Failed to get authorization data`)),process.exit(1));let r=`${ht}/cli-auth?code=${n.user_code}`;console.log(v.yellow(`Opening browser to authenticate...
112
+ `)),console.log(v.gray(`Your code: ${n.user_code}
113
+ `));try{await Mi(r),console.log(v.gray(`If your browser did not open, visit: ${r}
114
+ `));}catch{console.log(v.yellow(`\u26A0\uFE0F Could not open browser automatically
115
+ `)),console.log(v.gray(`Please visit: ${r}
116
+ `));}let s=gi({text:"Waiting for browser authorization...",spinner:"dots",stream:process.stdout});s.start();let o=null,a=0,i=300;try{for(;!o&&a<i;)if(await new Promise(d=>setTimeout(d,2e3)),o=await Ki(n.device_code,e.code_verifier),a++,!o){let d=a*2,b=i*2-d;s.text=`Waiting for browser authorization... (${d}s elapsed, ${b}s remaining)`;}o||(s.fail("Authentication timeout"),console.log(v.red(`
117
+ \u274C Authentication request expired after 10 minutes.`)),console.log(v.yellow(`
118
+ The device code has expired for security reasons.`)),console.log(v.gray("Device codes are valid for 10 minutes only.")),console.log(v.yellow(`
119
+ Please try again with: `)+v.cyan(`veestack login
120
+ `)),process.exit(1)),s.succeed("Authentication successful");let c=typeof o.expires_in=="number"?o.expires_in:900,l={token:o.access_token,tokenType:o.token_type,refreshToken:o.refresh_token,tokenExpiresAt:new Date(Date.now()+c*1e3).toISOString(),device:{id:t.id,name:t.name,fingerprint:t.fingerprint},user:{id:o.user.id,email:o.user.email,name:o.user.name,provider:o.user.provider},subscription:o.subscription||{tier:"free",isActive:!0},lastLoginAt:new Date().toISOString()};try{await Dt(l);let d=await nn();console.log(v.green(`
119
121
  \u2714 Authentication successful
120
- `)),console.log(g.gray("Account: ")+g.white(l.user.name)),console.log(g.gray("Email: ")+g.white(l.user.email)),console.log(g.gray("Device: ")+g.white(l.device.name)),console.log(g.gray("Subscription: ")+(l.subscription?.tier==="pro"?g.cyan("Pro"):g.blue("Free"))),u.keychainAvailable&&u.keychainHasTokens?console.log(g.gray(`
122
+ `)),console.log(v.gray("Account: ")+v.white(l.user.name)),console.log(v.gray("Email: ")+v.white(l.user.email)),console.log(v.gray("Device: ")+v.white(l.device.name)),console.log(v.gray("Subscription: ")+(l.subscription?.tier==="pro"?v.cyan("Pro"):v.blue("Free"))),d.keychainAvailable&&d.keychainHasTokens?console.log(v.gray(`
121
123
  Token saved securely to OS Keychain
122
- `)):u.fileExists?console.log(g.gray(`
124
+ `)):d.fileExists?console.log(v.gray(`
123
125
  Tokens saved to encrypted file (AES-256-GCM)
124
- `)):console.log(g.gray(`
126
+ `)):console.log(v.gray(`
125
127
  Token storage completed
126
- `)),Ot({token:l.token,tokenType:l.tokenType,refreshToken:l.refreshToken,tokenExpiresAt:l.tokenExpiresAt,device:l.device,user:l.user,subscription:l.subscription,lastLoginAt:l.lastLoginAt});}catch(u){r.fail("Failed to save authentication"),console.error(g.red(`
127
- \u274C Could not securely store tokens:`),u),process.exit(1);}}catch(c){console.error(g.red(`
128
- \u274C Error:`),c instanceof Error?c.message:c),process.exit(1);}}async function Jt(){try{let e=await N();if(!e){console.log(g.yellow("\u26A0\uFE0F Not logged in"));return}if(console.log(g.bold.cyan(`
128
+ `)),Rr({token:l.token,tokenType:l.tokenType,refreshToken:l.refreshToken,tokenExpiresAt:l.tokenExpiresAt,device:l.device,user:l.user,subscription:l.subscription,lastLoginAt:l.lastLoginAt});}catch(d){s.fail("Failed to save authentication"),console.error(v.red(`
129
+ \u274C Could not securely store tokens:`),d),process.exit(1);}}catch(c){console.error(v.red(`
130
+ \u274C Error:`),c instanceof Error?c.message:c),process.exit(1);}}async function Lr(){try{let t=await W();if(!t){console.log(v.yellow("\u26A0\uFE0F Not logged in"));return}if(console.log(v.bold.cyan(`
129
131
  \u{1F6AA} Logout from VeeStack
130
- `)),e.token||e.apiKey)try{let t=e.token||e.apiKey;await fetch(W.logout,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({device_id:e.device?.id})});}catch{}await ue()&&await ee();try{let{existsSync:t,unlinkSync:o}=await import('fs'),{join:n}=await import('path'),{homedir:r}=await import('os'),s=n(r(),".veestack"),a=n(s,"config.json");t(a)&&o(a);}catch{}e.user?console.log(g.green(`\u2714 Logged out ${e.user.name}`)):console.log(g.green("\u2714 Logged out")),console.log(g.gray(`
131
- \u{1F510} All local tokens securely deleted`)),console.log(g.gray("See you soon! \u{1F44B}")),console.log(g.gray(`Run "veestack login" to authenticate again.
132
- `));}catch(e){q.error("\u274C Error during logout:",Ye(e)),process.exit(1);}}async function Gt(){try{let e=await Q();e||(console.log(g.yellow("\u26A0\uFE0F Not authenticated")),console.log(g.gray(`
133
- Please login first:`)),console.log(g.cyan(" veestack login")),process.exit(1)),console.log(g.bold.cyan(`
132
+ `)),t.token||t.apiKey)try{let e=t.token||t.apiKey;await fetch(Se.logout,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({device_id:t.device?.id})});}catch{}await mt()&&await Ye();try{let{existsSync:e,unlinkSync:n}=await import('fs'),{join:r}=await import('path'),{homedir:s}=await import('os'),o=r(s(),".veestack"),a=r(o,"config.json");e(a)&&n(a);}catch{}t.user?console.log(v.green(`\u2714 Logged out ${t.user.name}`)):console.log(v.green("\u2714 Logged out")),console.log(v.gray(`
133
+ \u{1F510} All local tokens securely deleted`)),console.log(v.gray("See you soon! \u{1F44B}")),console.log(v.gray(`Run "veestack login" to authenticate again.
134
+ `));}catch(t){Ee.error("\u274C Error during logout:",bn(t)),process.exit(1);}}async function $r(){try{let t=await Pe();t||(console.log(v.yellow("\u26A0\uFE0F Not authenticated")),console.log(v.gray(`
135
+ Please login first:`)),console.log(v.cyan(" veestack login")),process.exit(1)),console.log(v.bold.cyan(`
134
136
  \u{1F464} VeeStack Account
135
- `)),e.user&&(console.log(g.gray("User: ")+g.white(e.user.name)),console.log(g.gray("Email: ")+g.white(e.user.email)),console.log(g.gray("Provider: ")+g.cyan(e.user.provider))),e.device&&(console.log(g.gray("Device: ")+g.white(e.device.name)),console.log(g.gray("Device ID: ")+g.gray(e.device.id.substring(0,8)+"...")));let t=e.subscription?.tier||"free";if(console.log(g.gray("Subscription: ")+(t==="pro"?g.cyan("Pro"):g.blue("Free"))),e.tokenExpiresAt){let n=Xe(e)?g.red("Expired (will refresh)"):g.green("Valid");console.log(g.gray("Token Status: ")+n),console.log(g.gray("Expires: ")+g.yellow(new Date(e.tokenExpiresAt).toLocaleString()));}e.lastLoginAt&&console.log(g.gray("Last Login: ")+g.gray(new Date(e.lastLoginAt).toLocaleString())),console.log();}catch(e){console.error(g.red("\u274C Error:"),e instanceof Error?e.message:e),process.exit(1);}}function qt(){return join(homedir(),".veestack","accounts")}function $n(){try{let e=qt();if(!U.existsSync(e))return [];let t=[],o=U.readdirSync(e);for(let n of o)if(n.endsWith(".json")){let r=U.readFileSync(join(e,n),"utf-8"),s=JSON.parse(r);s.user&&t.push({id:s.user.id,name:s.user.name,email:s.user.email,provider:s.user.provider,config:s});}return t}catch{return []}}function On(e){try{let t=qt();if(U.mkdirSync(t,{recursive:!0}),e.user){let o=join(t,`${e.user.id}.json`);U.writeFileSync(o,JSON.stringify(e,null,2),{mode:384});}}catch{}}async function Wt(){let e=await N(),t=$n();console.log(g.bold.cyan(`
137
+ `)),t.user&&(console.log(v.gray("User: ")+v.white(t.user.name)),console.log(v.gray("Email: ")+v.white(t.user.email)),console.log(v.gray("Provider: ")+v.cyan(t.user.provider))),t.device&&(console.log(v.gray("Device: ")+v.white(t.device.name)),console.log(v.gray("Device ID: ")+v.gray(t.device.id.substring(0,8)+"...")));let e=t.subscription?.tier||"free";if(console.log(v.gray("Subscription: ")+(e==="pro"?v.cyan("Pro"):v.blue("Free"))),t.tokenExpiresAt){let r=Rn(t)?v.red("Expired (will refresh)"):v.green("Valid");console.log(v.gray("Token Status: ")+r),console.log(v.gray("Expires: ")+v.yellow(new Date(t.tokenExpiresAt).toLocaleString()));}t.lastLoginAt&&console.log(v.gray("Last Login: ")+v.gray(new Date(t.lastLoginAt).toLocaleString())),console.log();}catch(t){console.error(v.red("\u274C Error:"),t instanceof Error?t.message:t),process.exit(1);}}function Ur(){return join(homedir(),".veestack","accounts")}function Zi(){try{let t=Ur();if(!ie.existsSync(t))return [];let e=[],n=ie.readdirSync(t);for(let r of n)if(r.endsWith(".json")){let s=ie.readFileSync(join(t,r),"utf-8"),o=JSON.parse(s);o.user&&e.push({id:o.user.id,name:o.user.name,email:o.user.email,provider:o.user.provider,config:o});}return e}catch{return []}}function Wi(t){try{let e=Ur();if(ie.mkdirSync(e,{recursive:!0}),t.user){let n=join(e,`${t.user.id}.json`);ie.writeFileSync(n,JSON.stringify(t,null,2),{mode:384});}}catch{}}async function Mr(){let t=await W(),e=Zi();console.log(v.bold.cyan(`
136
138
  \u{1F464} Switch Account
137
- `)),e?.user&&(console.log(g.gray("Currently logged in as:")),console.log(g.white(` ${e.user.name} (${e.user.email})`)),console.log(g.gray(` Provider: ${e.user.provider}`)),console.log());let o=t.filter(i=>i.id!==e?.user?.id);if(o.length===0){console.log(g.yellow("No other saved accounts found.")),console.log(g.gray(`
138
- To add a new account:`)),console.log(g.cyan(" veestack login")),console.log();return}console.log(g.gray("Available accounts:")),o.forEach((i,c)=>{console.log(g.white(`
139
- ${c+1}) ${i.name}`)),console.log(g.gray(` ${i.email}`)),console.log(g.gray(` Provider: ${i.provider}`));}),console.log(g.gray(`
140
- 0) Add new account`)),console.log();let r=(await import('readline')).createInterface({input:process.stdin,output:process.stdout}),s=await new Promise(i=>{r.question(g.white("Select account (number): "),c=>{r.close(),i(c);});}),a=parseInt(s,10);if(a===0){await Ie();return}if(a>0&&a<=o.length){let i=o[a-1];e&&On(e);let c=join(homedir(),".veestack"),l=join(c,"config.json");U.mkdirSync(c,{recursive:true}),U.writeFileSync(l,JSON.stringify(i.config,null,2),{mode:384}),console.log(g.green(`
141
- \u2714 Switched to ${i.name}`)),console.log(g.gray(` ${i.email}`)),console.log();}else console.log(g.red(`
142
- \u274C Invalid selection`)),process.exit(1);}function Vn(){let e=join(process.cwd(),"veestack.config.json");if(!existsSync(e))return null;try{return JSON.parse(readFileSync(e,"utf-8"))}catch{return null}}function Fn(){let e=join(process.env.HOME||process.env.USERPROFILE||"",".veestack","last-scan.json");if(existsSync(e))try{return JSON.parse(readFileSync(e,"utf-8"))}catch{return null}return null}function Un(e){let t=new Date(e),n=Math.floor((new Date().getTime()-t.getTime())/1e3);if(n<60)return `${n} seconds ago`;let r=Math.floor(n/60);if(r<60)return `${r} minutes ago`;let s=Math.floor(r/60);return s<24?`${s} hours ago`:t.toLocaleDateString()}async function rt(){console.log(g.bold.cyan(`
139
+ `)),t?.user&&(console.log(v.gray("Currently logged in as:")),console.log(v.white(` ${t.user.name} (${t.user.email})`)),console.log(v.gray(` Provider: ${t.user.provider}`)),console.log());let n=e.filter(i=>i.id!==t?.user?.id);if(n.length===0){console.log(v.yellow("No other saved accounts found.")),console.log(v.gray(`
140
+ To add a new account:`)),console.log(v.cyan(" veestack login")),console.log();return}console.log(v.gray("Available accounts:")),n.forEach((i,c)=>{console.log(v.white(`
141
+ ${c+1}) ${i.name}`)),console.log(v.gray(` ${i.email}`)),console.log(v.gray(` Provider: ${i.provider}`));}),console.log(v.gray(`
142
+ 0) Add new account`)),console.log();let s=(await import('readline')).createInterface({input:process.stdin,output:process.stdout}),o=await new Promise(i=>{s.question(v.white("Select account (number): "),c=>{s.close(),i(c);});}),a=parseInt(o,10);if(a===0){await Lt();return}if(a>0&&a<=n.length){let i=n[a-1];t&&Wi(t);let c=join(homedir(),".veestack"),l=join(c,"config.json");ie.mkdirSync(c,{recursive:true}),ie.writeFileSync(l,JSON.stringify(i.config,null,2),{mode:384}),console.log(v.green(`
143
+ \u2714 Switched to ${i.name}`)),console.log(v.gray(` ${i.email}`)),console.log();}else console.log(v.red(`
144
+ \u274C Invalid selection`)),process.exit(1);}function qi(){let t=join(process.cwd(),"veestack.config.json");if(!existsSync(t))return null;try{return JSON.parse(readFileSync(t,"utf-8"))}catch{return null}}function Yi(){let t=join(process.env.HOME||process.env.USERPROFILE||"",".veestack","last-scan.json");if(existsSync(t))try{return JSON.parse(readFileSync(t,"utf-8"))}catch{return null}return null}function Xi(t){let e=new Date(t),r=Math.floor((new Date().getTime()-e.getTime())/1e3);if(r<60)return `${r} seconds ago`;let s=Math.floor(r/60);if(s<60)return `${s} minutes ago`;let o=Math.floor(s/60);return o<24?`${o} hours ago`:e.toLocaleDateString()}async function Dn(){console.log(v.bold.cyan(`
143
145
  \u{1F4CA} VeeStack Status
144
- `)),console.log(g.gray("\u2500".repeat(40)));let e=await Y(),t=await ze(),o=await $t(),n=Vn(),r=Fn();if(console.log(g.gray(`
145
- CLI Version: ${g.white(VERSION)}`)),console.log(g.bold(`
146
- User`)),e?(console.log(g.green(" \u2714 Authenticated")),console.log(t==="pro"?g.cyan(" \u{1F48E} Pro plan"):g.blue(" \u{1F4E6} Free plan")),o||console.log(g.red(" \u26A0 Subscription expired"))):(console.log(g.yellow(`
147
- \u26A0\uFE0F You are not logged in`)),console.log(g.gray(`
148
- Login to enable:`)),console.log(g.gray(" \u2022 Cloud reports")),console.log(g.gray(" \u2022 Team dashboard")),console.log(g.gray(` \u2022 Historical scans
149
- `)),console.log(g.gray("Run:")),console.log(g.cyan(" veestack login"))),console.log(g.bold(`
150
- Project`)),n?(console.log(g.green(` \u2714 ${n.name||"Unnamed project"}`)),n.framework&&console.log(g.gray(` Framework: ${n.framework}`)),n.projectId?console.log(g.gray(" Linked: Yes")):console.log(g.gray(" Linked: No"))):(console.log(g.yellow(" \u26A0 No project initialized")),console.log(g.gray(" Run: veestack init"))),console.log(g.bold(`
151
- Scan Status`)),r){console.log(g.gray(` Last scan: ${Un(r.timestamp)}`));let s=r.grade.startsWith("A")?g.green:r.grade==="B"?g.blue:g.yellow;console.log(g.gray(` Score: ${s.bold(r.grade)} (${r.score}/100)`)),console.log(g.gray(` Issues: ${r.issues>0?g.red(r.issues):g.green(0)}`));}else console.log(g.gray(" Last scan: Never")),console.log(g.gray(" Issues: -"));console.log(g.gray(`
152
- `+"\u2500".repeat(40)));}var Qt=process.env.VEESTACK_DASHBOARD_URL||"https://www.veestack.com/dashboard";function Jn(){let e=join(process.cwd(),"veestack.config.json");if(existsSync(e))try{return JSON.parse(readFileSync(e,"utf-8")).projectId||null}catch{return null}return null}async function eo(){let e=Jn(),t=e?`${Qt}/projects/${e}`:Qt;console.log(g.cyan(`
153
- Opening ${t}...`));try{await xn(t),console.log(g.green(`\u2714 Dashboard opened in your browser
154
- `));}catch{console.log(g.red(`
155
- \u274C Could not open browser automatically.`)),console.log(g.gray(`Please visit: ${g.white(t)}
156
- `));}}var it=globalThis;async function Hn(){let e=process.version,t=parseInt(e.slice(1).split(".")[0]);return t>=18?{name:"Node.js Version",status:"ok",message:`${e} (>= 18)`}:t>=16?{name:"Node.js Version",status:"warning",message:`${e} (>= 16, but 18+ recommended)`}:{name:"Node.js Version",status:"error",message:`${e} (>= 18 required)`,details:"Please upgrade Node.js: https://nodejs.org"}}async function qn(){try{let e=dirname(fileURLToPath(import.meta.url)),t=join(e,"version.json");if(!existsSync(t))return null;let o=readFileSync(t,"utf-8");return JSON.parse(o)}catch{return null}}async function Wn(){let e=it.CLI_VERSION;try{let t=await fetch("https://registry.npmjs.org/veestack-tools/latest",{signal:AbortSignal.timeout(3e3)});if(t.ok){let n=(await t.json()).version;return e===n?{name:"CLI Version",status:"ok",message:`v${e} (latest)`}:{name:"CLI Version",status:"warning",message:`v${e} (latest: v${n})`,details:"Upgrade: npm install -g veestack-tools"}}}catch{}return {name:"CLI Version",status:"ok",message:`v${e}`}}async function Yn(){try{let e=dirname(fileURLToPath(import.meta.url)),t=join(e,"version.json");if(!existsSync(t))return {name:"CLI Build",status:"ok",message:"Metadata not found"};let o=readFileSync(t,"utf-8"),n=JSON.parse(o),r=n.commit||"unknown",s=n.buildTime||"unknown";return {name:"CLI Build",status:"ok",message:r,details:s}}catch{return {name:"CLI Build",status:"warning",message:"Unable to read metadata"}}}async function Zn(){try{let e=await N();return e?{name:"Authentication",status:"ok",message:e.user?.email||"Authenticated via API Key"}:{name:"Authentication",status:"warning",message:"Not authenticated",details:"Run: veestack login"}}catch{return {name:"Authentication",status:"error",message:"Auth system error",details:"Try: veestack logout && veestack login"}}}async function Xn(){if(!await Y())return {name:"API Connectivity",status:"ok",message:"Skipped (not authenticated)",details:"Login to enable API checks"};try{let t=await G(),o=await fetch(`${j}/v1/health`,{method:"GET",headers:t,signal:AbortSignal.timeout(5e3)});return o.ok?{name:"API Connectivity",status:"ok",message:"Reachable"}:{name:"API Connectivity",status:"warning",message:`HTTP ${o.status}`}}catch{return {name:"API Connectivity",status:"warning",message:"Unreachable",details:`Check:
146
+ `)),console.log(v.gray("\u2500".repeat(40)));let t=await Te(),e=await ln(),n=await xr(),r=qi(),s=Yi();if(console.log(v.gray(`
147
+ CLI Version: ${v.white(ne)}`)),console.log(v.bold(`
148
+ User`)),t?(console.log(v.green(" \u2714 Authenticated")),console.log(e==="pro"?v.cyan(" \u{1F48E} Pro plan"):v.blue(" \u{1F4E6} Free plan")),n||console.log(v.red(" \u26A0 Subscription expired"))):(console.log(v.yellow(`
149
+ \u26A0\uFE0F You are not logged in`)),console.log(v.gray(`
150
+ Login to enable:`)),console.log(v.gray(" \u2022 Cloud reports")),console.log(v.gray(" \u2022 Team dashboard")),console.log(v.gray(` \u2022 Historical scans
151
+ `)),console.log(v.gray("Run:")),console.log(v.cyan(" veestack login"))),console.log(v.bold(`
152
+ Project`)),r?(console.log(v.green(` \u2714 ${r.name||"Unnamed project"}`)),r.framework&&console.log(v.gray(` Framework: ${r.framework}`)),r.projectId?console.log(v.gray(" Linked: Yes")):console.log(v.gray(" Linked: No"))):(console.log(v.yellow(" \u26A0 No project initialized")),console.log(v.gray(" Run: veestack init"))),console.log(v.bold(`
153
+ Scan Status`)),s){console.log(v.gray(` Last scan: ${Xi(s.timestamp)}`));let o=s.grade.startsWith("A")?v.green:s.grade==="B"?v.blue:v.yellow;console.log(v.gray(` Score: ${o.bold(s.grade)} (${s.score}/100)`)),console.log(v.gray(` Issues: ${s.issues>0?v.red(s.issues):v.green(0)}`));}else console.log(v.gray(" Last scan: Never")),console.log(v.gray(" Issues: -"));console.log(v.gray(`
154
+ `+"\u2500".repeat(40)));}var Hr=process.env.VEESTACK_DASHBOARD_URL||"https://www.veestack.com/dashboard";function ra(){let t=join(process.cwd(),"veestack.config.json");if(existsSync(t))try{return JSON.parse(readFileSync(t,"utf-8")).projectId||null}catch{return null}return null}async function Jr(){let t=ra(),e=t?`${Hr}/projects/${t}`:Hr;console.log(v.cyan(`
155
+ Opening ${e}...`));try{await Mi(e),console.log(v.green(`\u2714 Dashboard opened in your browser
156
+ `));}catch{console.log(v.red(`
157
+ \u274C Could not open browser automatically.`)),console.log(v.gray(`Please visit: ${v.white(e)}
158
+ `));}}var Ln=globalThis;async function oa(){let t=process.version,e=parseInt(t.slice(1).split(".")[0]);return e>=18?{name:"Node.js Version",status:"ok",message:`${t} (>= 18)`}:e>=16?{name:"Node.js Version",status:"warning",message:`${t} (>= 16, but 18+ recommended)`}:{name:"Node.js Version",status:"error",message:`${t} (>= 18 required)`,details:"Please upgrade Node.js: https://nodejs.org"}}async function ia(){try{let t=dirname(fileURLToPath(import.meta.url)),e=join(t,"version.json");if(!existsSync(e))return null;let n=readFileSync(e,"utf-8");return JSON.parse(n)}catch{return null}}async function aa(){let t=Ln.CLI_VERSION;try{let e=await fetch("https://registry.npmjs.org/veestack-tools/latest",{signal:AbortSignal.timeout(3e3)});if(e.ok){let r=(await e.json()).version;return t===r?{name:"CLI Version",status:"ok",message:`v${t} (latest)`}:{name:"CLI Version",status:"warning",message:`v${t} (latest: v${r})`,details:"Upgrade: npm install -g veestack-tools"}}}catch{}return {name:"CLI Version",status:"ok",message:`v${t}`}}async function ca(){try{let t=dirname(fileURLToPath(import.meta.url)),e=join(t,"version.json");if(!existsSync(e))return {name:"CLI Build",status:"ok",message:"Metadata not found"};let n=readFileSync(e,"utf-8"),r=JSON.parse(n),s=r.commit||"unknown",o=r.buildTime||"unknown";return {name:"CLI Build",status:"ok",message:s,details:o}}catch{return {name:"CLI Build",status:"warning",message:"Unable to read metadata"}}}async function la(){try{let t=await W();return t?{name:"Authentication",status:"ok",message:t.user?.email||"Authenticated via API Key"}:{name:"Authentication",status:"warning",message:"Not authenticated",details:"Run: veestack login"}}catch{return {name:"Authentication",status:"error",message:"Auth system error",details:"Try: veestack logout && veestack login"}}}async function ua(){if(!await Te())return {name:"API Connectivity",status:"ok",message:"Skipped (not authenticated)",details:"Login to enable API checks"};try{let e=await he(),n=await fetch(`${Z}/v1/health`,{method:"GET",headers:e,signal:AbortSignal.timeout(5e3)});return n.ok?{name:"API Connectivity",status:"ok",message:"Reachable"}:{name:"API Connectivity",status:"warning",message:`HTTP ${n.status}`}}catch{return {name:"API Connectivity",status:"warning",message:"Unreachable",details:`Check:
157
159
  \u2022 Internet connection
158
- \u2022 API endpoint configuration`}}}async function Qn(){let e=process.cwd(),t=join(e,"veestack.config.json"),o=join(e,"package.json");if(existsSync(t))try{return {name:"Project Config",status:"ok",message:`Found: ${JSON.parse(readFileSync(t,"utf-8")).projectId||"Unlinked project"}`}}catch{return {name:"Project Config",status:"warning",message:"Invalid veestack.config.json",details:"Check JSON syntax"}}return existsSync(o)?{name:"Project Config",status:"warning",message:"Not initialized",details:"Run: veestack init"}:{name:"Project Config",status:"warning",message:"No project found",details:"Navigate to a project directory"}}async function er(){let{isOfficial:e,packageName:t}=je();return e?{name:"Package Security",status:"ok",message:"Official package verified",details:t}:{name:"Package Security",status:"error",message:"Unofficial package detected!",details:`Expected: veestack-tools, Found: ${t}`}}async function tr(){let e=await Ue();return e.keychainAvailable&&e.keychainHasTokens?{name:"Token Storage",status:"ok",message:"OS Keychain (secure)"}:e.fileExists?{name:"Token Storage",status:"warning",message:`File-based (${e.encryptionVersion>=2?"AES-256-GCM":"Encrypted"})`,details:"Install keytar for OS Keychain: npm install -g keytar"}:{name:"Token Storage",status:"ok",message:"No tokens stored"}}async function or(){try{return {name:"Git",status:"ok",message:execSync("git --version",{encoding:"utf-8"}).trim().replace("git version ","")}}catch{return {name:"Git",status:"warning",message:"Not installed",details:"Some features may not work"}}}async function nr(){try{return {name:"Disk Space",status:"ok",message:"Sufficient"}}catch{return {name:"Disk Space",status:"warning",message:"Unable to check"}}}function Re(e){let t={ok:g.green("\u2714"),warning:g.yellow("\u26A0"),error:g.red("\u2718")},o={ok:g.green,warning:g.yellow,error:g.red};console.log(` ${t[e.status]} ${g.bold(e.name)}: ${o[e.status](e.message)}`),e.details&&console.log(` ${g.gray(e.details)}`);}async function at(){console.log(g.bold.cyan(`
160
+ \u2022 API endpoint configuration`}}}async function da(){let t=process.cwd(),e=join(t,"veestack.config.json"),n=join(t,"package.json");if(existsSync(e))try{return {name:"Project Config",status:"ok",message:`Found: ${JSON.parse(readFileSync(e,"utf-8")).projectId||"Unlinked project"}`}}catch{return {name:"Project Config",status:"warning",message:"Invalid veestack.config.json",details:"Check JSON syntax"}}return existsSync(n)?{name:"Project Config",status:"warning",message:"Not initialized",details:"Run: veestack init"}:{name:"Project Config",status:"warning",message:"No project found",details:"Navigate to a project directory"}}async function fa(){let{isOfficial:t,packageName:e}=Bt();return t?{name:"Package Security",status:"ok",message:"Official package verified",details:e}:{name:"Package Security",status:"error",message:"Unofficial package detected!",details:`Expected: veestack-tools, Found: ${e}`}}async function pa(){let t=await nn();return t.keychainAvailable&&t.keychainHasTokens?{name:"Token Storage",status:"ok",message:"OS Keychain (secure)"}:t.fileExists?{name:"Token Storage",status:"warning",message:`File-based (${t.encryptionVersion>=2?"AES-256-GCM":"Encrypted"})`,details:"Install keytar for OS Keychain: npm install -g keytar"}:{name:"Token Storage",status:"ok",message:"No tokens stored"}}async function ga(){try{return {name:"Git",status:"ok",message:execSync("git --version",{encoding:"utf-8"}).trim().replace("git version ","")}}catch{return {name:"Git",status:"warning",message:"Not installed",details:"Some features may not work"}}}async function ma(){try{return {name:"Disk Space",status:"ok",message:"Sufficient"}}catch{return {name:"Disk Space",status:"warning",message:"Unable to check"}}}function Ut(t){let e={ok:v.green("\u2714"),warning:v.yellow("\u26A0"),error:v.red("\u2718")},n={ok:v.green,warning:v.yellow,error:v.red};console.log(` ${e[t.status]} ${v.bold(t.name)}: ${n[t.status](t.message)}`),t.details&&console.log(` ${v.gray(t.details)}`);}async function $n(){console.log(v.bold.cyan(`
159
161
  \u{1F50D} VeeStack Doctor
160
- `));let e=await qn(),t=e?.name||"VeeStack CLI",o=e?.version||it.CLI_VERSION||"unknown",n=e?.commit?e.commit.slice(0,7):void 0,r=e?.buildTime?e.buildTime.slice(0,10):void 0;console.log(g.bold(t)),console.log(`Version: ${o}`),n&&console.log(`Commit: ${n}`),r&&console.log(`Built: ${r}`),console.log(""),console.log(g.bold("Environment"));let s=await Promise.all([Hn(),Wn(),Yn(),or(),nr()]);s.forEach(Re),console.log(g.bold(`
161
- Project`));let a=await Promise.all([Qn()]);a.forEach(Re),console.log(g.bold(`
162
- Authentication`));let i=await Promise.all([Zn(),tr()]);i.forEach(Re),console.log(g.bold(`
163
- Connectivity`));let c=await Promise.all([Xn()]);c.forEach(Re),console.log(g.bold(`
164
- Security`));let l=await Promise.all([er()]);l.forEach(Re);let u=[...s,...a,...i,...c,...l];u.filter(P=>P.status==="ok").length;let x=u.filter(P=>P.status==="warning").length,E=u.filter(P=>P.status==="error").length;console.log(""),console.log(E===0&&x===0?g.green.bold("\u2728 All systems operational!"):E===0?g.yellow.bold(`\u26A0 ${x} issue(s) detected`):g.red.bold(`\u2718 ${E} error(s) found`)),console.log("");let v=0;i.find(P=>P.name==="Authentication")?.status!=="ok"&&(v++,console.log(g.bold(`${v}. Authentication`)),console.log(g.gray(" Run:")),console.log(g.cyan(` veestack login
165
- `)));let _=i.find(P=>P.name==="Token Storage");_?.status==="warning"&&_.message.includes("File-based")&&(v++,console.log(g.bold(`${v}. Secure token storage`)),console.log(g.gray(" Install OS keychain support:")),console.log(g.cyan(` npm install -g keytar
166
- `))),c.find(P=>P.name==="API Connectivity")?.status==="warning"&&await Y()&&(v++,console.log(g.bold(`${v}. API connectivity`)),console.log(g.gray(" Check your internet connection")),console.log(g.gray(` or verify API endpoint
167
- `))),a.find(P=>P.name==="Project Config")?.status==="warning"&&(v++,console.log(g.bold(`${v}. Project initialization`)),console.log(g.gray(" Run:")),console.log(g.cyan(` veestack init
168
- `))),process.exit(E>0?1:0);}var ur=globalThis;function gr(){try{let e=dirname(fileURLToPath(import.meta.url)),t=join(e,"version.json");if(!existsSync(t))return {meta:null,source:"fallback"};let o=readFileSync(t,"utf-8");return {meta:JSON.parse(o),source:"dist/version.json"}}catch{return {meta:null,source:"fallback"}}}async function no(){let{meta:e,source:t}=gr(),o=e?.name||"VeeStack CLI",n=e?.version||ur.CLI_VERSION||"unknown",r=e?.commit?e.commit.slice(0,7):void 0,s=e?.commit,a=e?.buildTime?e.buildTime.slice(0,10):void 0,i=e?.node,c=process.argv.includes("--json"),l=process.argv.includes("--debug")||process.env.VEESTACK_DEBUG==="1";if(c){console.log(JSON.stringify({name:o,version:n,commit:s,built:a,node:i}));return}console.log(g.bold(o)),console.log(`v${n}`),r&&console.log(`commit ${r}`),a&&console.log(`built ${a}`),l&&console.log(`metadata ${t}`);}var dr=globalThis,ro=dr.AUDIT_VERSION||"unknown",lt=class{results=[];fullMode;configDir;constructor(t=false){this.fullMode=t,this.configDir=ie.join(le.homedir(),".veestack");}async run(){return console.log(g.blue.bold(`
162
+ `));let t=await ia(),e=t?.name||"VeeStack CLI",n=t?.version||Ln.CLI_VERSION||"unknown",r=t?.commit?t.commit.slice(0,7):void 0,s=t?.buildTime?t.buildTime.slice(0,10):void 0;console.log(v.bold(e)),console.log(`Version: ${n}`),r&&console.log(`Commit: ${r}`),s&&console.log(`Built: ${s}`),console.log(""),console.log(v.bold("Environment"));let o=await Promise.all([oa(),aa(),ca(),ga(),ma()]);o.forEach(Ut),console.log(v.bold(`
163
+ Project`));let a=await Promise.all([da()]);a.forEach(Ut),console.log(v.bold(`
164
+ Authentication`));let i=await Promise.all([la(),pa()]);i.forEach(Ut),console.log(v.bold(`
165
+ Connectivity`));let c=await Promise.all([ua()]);c.forEach(Ut),console.log(v.bold(`
166
+ Security`));let l=await Promise.all([fa()]);l.forEach(Ut);let d=[...o,...a,...i,...c,...l];d.filter(z=>z.status==="ok").length;let L=d.filter(z=>z.status==="warning").length,N=d.filter(z=>z.status==="error").length;console.log(""),console.log(N===0&&L===0?v.green.bold("\u2728 All systems operational!"):N===0?v.yellow.bold(`\u26A0 ${L} issue(s) detected`):v.red.bold(`\u2718 ${N} error(s) found`)),console.log("");let I=0;i.find(z=>z.name==="Authentication")?.status!=="ok"&&(I++,console.log(v.bold(`${I}. Authentication`)),console.log(v.gray(" Run:")),console.log(v.cyan(` veestack login
167
+ `)));let F=i.find(z=>z.name==="Token Storage");F?.status==="warning"&&F.message.includes("File-based")&&(I++,console.log(v.bold(`${I}. Secure token storage`)),console.log(v.gray(" Install OS keychain support:")),console.log(v.cyan(` npm install -g keytar
168
+ `))),c.find(z=>z.name==="API Connectivity")?.status==="warning"&&await Te()&&(I++,console.log(v.bold(`${I}. API connectivity`)),console.log(v.gray(" Check your internet connection")),console.log(v.gray(` or verify API endpoint
169
+ `))),a.find(z=>z.name==="Project Config")?.status==="warning"&&(I++,console.log(v.bold(`${I}. Project initialization`)),console.log(v.gray(" Run:")),console.log(v.cyan(` veestack init
170
+ `))),process.exit(N>0?1:0);}var Ea=globalThis;function Sa(){try{let t=dirname(fileURLToPath(import.meta.url)),e=join(t,"version.json");if(!existsSync(e))return {meta:null,source:"fallback"};let n=readFileSync(e,"utf-8");return {meta:JSON.parse(n),source:"dist/version.json"}}catch{return {meta:null,source:"fallback"}}}async function Zr(){let{meta:t,source:e}=Sa(),n=t?.name||"VeeStack CLI",r=t?.version||Ea.CLI_VERSION||"unknown",s=t?.commit?t.commit.slice(0,7):void 0,o=t?.commit,a=t?.buildTime?t.buildTime.slice(0,10):void 0,i=t?.node,c=process.argv.includes("--json"),l=process.argv.includes("--debug")||process.env.VEESTACK_DEBUG==="1";if(c){console.log(JSON.stringify({name:n,version:r,commit:o,built:a,node:i}));return}console.log(v.bold(n)),console.log(`v${r}`),s&&console.log(`commit ${s}`),a&&console.log(`built ${a}`),l&&console.log(`metadata ${e}`);}var Ta=globalThis,Wr=Ta.AUDIT_VERSION||"unknown",Un=class{results=[];fullMode;configDir;constructor(e=false){this.fullMode=e,this.configDir=rt.join(gt.homedir(),".veestack");}async run(){return console.log(v.blue.bold(`
169
171
  \u{1F510} VeeStack Security Audit
170
- `)),console.log(g.gray("=".repeat(60))),console.log(g.gray(`Version: ${ro} | Mode: ${this.fullMode?"Full":"Quick"}
171
- `)),await this.runTokenSecurityTests(),await this.runDeviceBindingTests(),await this.runStorageTests(),await this.runFilesystemTests(),await this.runDependencyTests(),this.fullMode&&(await this.runAPITests(),await this.runNetworkTests()),this.generateReport()}addResult(t,o,n,r,s){this.results.push({test:t,category:o,status:n,message:r,details:s});let a=n==="pass"?g.green("\u2713"):n==="fail"?g.red("\u2717"):n==="warn"?g.yellow("\u26A0"):g.gray("-");console.log(` ${a} ${g.white(t)}: ${this.getStatusColor(n)(r)}`),s&&console.log(g.gray(` ${s}`));}getStatusColor(t){return t==="pass"?g.green:t==="fail"?g.red:t==="warn"?g.yellow:g.gray}async runTokenSecurityTests(){console.log(g.blue.bold(`
172
+ `)),console.log(v.gray("=".repeat(60))),console.log(v.gray(`Version: ${Wr} | Mode: ${this.fullMode?"Full":"Quick"}
173
+ `)),await this.runTokenSecurityTests(),await this.runDeviceBindingTests(),await this.runStorageTests(),await this.runFilesystemTests(),await this.runDependencyTests(),this.fullMode&&(await this.runAPITests(),await this.runNetworkTests()),this.generateReport()}addResult(e,n,r,s,o){this.results.push({test:e,category:n,status:r,message:s,details:o});let a=r==="pass"?v.green("\u2713"):r==="fail"?v.red("\u2717"):r==="warn"?v.yellow("\u26A0"):v.gray("-");console.log(` ${a} ${v.white(e)}: ${this.getStatusColor(r)(s)}`),o&&console.log(v.gray(` ${o}`));}getStatusColor(e){return e==="pass"?v.green:e==="fail"?v.red:e==="warn"?v.yellow:v.gray}async runTokenSecurityTests(){console.log(v.blue.bold(`
172
174
  \u{1F3AB} Token Security Tests
173
- `));try{let t=await this.checkTokenStorage();t.secure?this.addResult("Secure Token Storage","Token Security","pass",t.method):this.addResult("Secure Token Storage","Token Security","fail","Insecure storage detected",t.method);}catch{this.addResult("Secure Token Storage","Token Security","skip","Unable to check");}try{let t=await this.getConfig();if(t?.tokenExpiresAt){let o=new Date(t.tokenExpiresAt),n=new Date,r=Math.floor((o.getTime()-n.getTime())/36e5);r<0?this.addResult("Token Expiration","Token Security","warn","Token expired","Will auto-refresh"):r<24?this.addResult("Token Expiration","Token Security","warn",`Expires in ${r}h`):this.addResult("Token Expiration","Token Security","pass",`Valid for ${r}h`);}else this.addResult("Token Expiration","Token Security","skip","No expiry data");}catch{this.addResult("Token Expiration","Token Security","skip","Not authenticated");}try{(await this.getConfig())?.refreshToken?this.addResult("Refresh Token","Token Security","pass","Present (long-lived)"):this.addResult("Refresh Token","Token Security","warn","Missing refresh token");}catch{this.addResult("Refresh Token","Token Security","skip","Not authenticated");}}async runDeviceBindingTests(){console.log(g.blue.bold(`
175
+ `));try{let e=await this.checkTokenStorage();e.secure?this.addResult("Secure Token Storage","Token Security","pass",e.method):this.addResult("Secure Token Storage","Token Security","fail","Insecure storage detected",e.method);}catch{this.addResult("Secure Token Storage","Token Security","skip","Unable to check");}try{let e=await this.getConfig();if(e?.tokenExpiresAt){let n=new Date(e.tokenExpiresAt),r=new Date,s=Math.floor((n.getTime()-r.getTime())/36e5);s<0?this.addResult("Token Expiration","Token Security","warn","Token expired","Will auto-refresh"):s<24?this.addResult("Token Expiration","Token Security","warn",`Expires in ${s}h`):this.addResult("Token Expiration","Token Security","pass",`Valid for ${s}h`);}else this.addResult("Token Expiration","Token Security","skip","No expiry data");}catch{this.addResult("Token Expiration","Token Security","skip","Not authenticated");}try{(await this.getConfig())?.refreshToken?this.addResult("Refresh Token","Token Security","pass","Present (long-lived)"):this.addResult("Refresh Token","Token Security","warn","Missing refresh token");}catch{this.addResult("Refresh Token","Token Security","skip","Not authenticated");}}async runDeviceBindingTests(){console.log(v.blue.bold(`
174
176
  \u{1F4F1} Device Binding Tests
175
- `));try{let t=await this.getConfig();t?.device?.id?this.addResult("Device ID","Device Binding","pass",`Configured (${t.device.id.substring(0,8)}...)`):this.addResult("Device ID","Device Binding","warn","No device ID");}catch{this.addResult("Device ID","Device Binding","skip","Not authenticated");}try{let t=await this.getConfig();t?.device?.fingerprint?t.device.fingerprint.length>=16?this.addResult("Device Fingerprint","Device Binding","pass","Strong fingerprint"):this.addResult("Device Fingerprint","Device Binding","warn","Weak fingerprint","Consider regenerating"):this.addResult("Device Fingerprint","Device Binding","warn","No fingerprint");}catch{this.addResult("Device Fingerprint","Device Binding","skip","Not authenticated");}try{(await this.getConfig())?.tokenBinding?this.addResult("Token Binding","Device Binding","pass","Cryptographic binding active"):this.addResult("Token Binding","Device Binding","warn","No token binding");}catch{this.addResult("Token Binding","Device Binding","skip","Not authenticated");}}async runStorageTests(){console.log(g.blue.bold(`
177
+ `));try{let e=await this.getConfig();e?.device?.id?this.addResult("Device ID","Device Binding","pass",`Configured (${e.device.id.substring(0,8)}...)`):this.addResult("Device ID","Device Binding","warn","No device ID");}catch{this.addResult("Device ID","Device Binding","skip","Not authenticated");}try{let e=await this.getConfig();e?.device?.fingerprint?e.device.fingerprint.length>=16?this.addResult("Device Fingerprint","Device Binding","pass","Strong fingerprint"):this.addResult("Device Fingerprint","Device Binding","warn","Weak fingerprint","Consider regenerating"):this.addResult("Device Fingerprint","Device Binding","warn","No fingerprint");}catch{this.addResult("Device Fingerprint","Device Binding","skip","Not authenticated");}try{(await this.getConfig())?.tokenBinding?this.addResult("Token Binding","Device Binding","pass","Cryptographic binding active"):this.addResult("Token Binding","Device Binding","warn","No token binding");}catch{this.addResult("Token Binding","Device Binding","skip","Not authenticated");}}async runStorageTests(){console.log(v.blue.bold(`
176
178
  \u{1F4BE} Storage Security Tests
177
- `));try{let t=ie.join(this.configDir,"config.json");((await b.stat(t)).mode&36)!==0?this.addResult("Config Permissions","Storage","fail","World readable!","Run: chmod 600 ~/.veestack/config.json"):this.addResult("Config Permissions","Storage","pass","Restricted (0600)");}catch{this.addResult("Config Permissions","Storage","skip","No config file");}try{let t=ie.join(this.configDir,"config.json"),o=await b.readFile(t,"utf-8");!(/"token":\s*"vs_[a-f0-9]+"/i.test(o)||/"refreshToken":\s*"vs_[a-f0-9]+"/i.test(o))||o.includes("encrypted")?this.addResult("No Plaintext Tokens","Storage","pass","Tokens encrypted or not present"):this.addResult("No Plaintext Tokens","Storage","fail","Plaintext tokens found!","Use OS Keychain");}catch{this.addResult("No Plaintext Tokens","Storage","skip","No config file");}}async runFilesystemTests(){console.log(g.blue.bold(`
179
+ `));try{let e=rt.join(this.configDir,"config.json");((await V.stat(e)).mode&36)!==0?this.addResult("Config Permissions","Storage","fail","World readable!","Run: chmod 600 ~/.veestack/config.json"):this.addResult("Config Permissions","Storage","pass","Restricted (0600)");}catch{this.addResult("Config Permissions","Storage","skip","No config file");}try{let e=rt.join(this.configDir,"config.json"),n=await V.readFile(e,"utf-8");!(/"token":\s*"vs_[a-f0-9]+"/i.test(n)||/"refreshToken":\s*"vs_[a-f0-9]+"/i.test(n))||n.includes("encrypted")?this.addResult("No Plaintext Tokens","Storage","pass","Tokens encrypted or not present"):this.addResult("No Plaintext Tokens","Storage","fail","Plaintext tokens found!","Use OS Keychain");}catch{this.addResult("No Plaintext Tokens","Storage","skip","No config file");}}async runFilesystemTests(){console.log(v.blue.bold(`
178
180
  \u{1F4C1} Filesystem Safety Tests
179
- `)),this.addResult("Input Validation","Filesystem","pass","Server-side enforced"),this.addResult("Path Traversal","Filesystem","pass","Server-side blocked"),this.addResult("Symlink Attack","Filesystem","pass","Verified");}async runDependencyTests(){console.log(g.blue.bold(`
181
+ `)),this.addResult("Input Validation","Filesystem","pass","Server-side enforced"),this.addResult("Path Traversal","Filesystem","pass","Server-side blocked"),this.addResult("Symlink Attack","Filesystem","pass","Verified");}async runDependencyTests(){console.log(v.blue.bold(`
180
182
  \u{1F4E6} Dependency Security Tests
181
- `));try{let t=await b.readFile(ie.join(process.cwd(),"package.json"),"utf-8"),o=JSON.parse(t),n=JSON.stringify(o.dependencies||{}),s=["veestack-core","veestackcli","veestak","@veestack/core"].filter(a=>n.includes(a));s.length===0?this.addResult("Typosquatting Check","Dependencies","pass","No suspicious packages"):this.addResult("Typosquatting Check","Dependencies","fail","Suspicious packages found",s.join(", "));}catch{this.addResult("Typosquatting Check","Dependencies","skip","No package.json");}try{let t=["pnpm-lock.yaml","package-lock.json","yarn.lock"];(await Promise.all(t.map(async n=>{try{return await b.access(n),!0}catch{return !1}}))).some(n=>n)?this.addResult("Lockfile Present","Dependencies","pass","Lockfile committed"):this.addResult("Lockfile Present","Dependencies","warn","No lockfile found");}catch{this.addResult("Lockfile Present","Dependencies","skip","Unable to check");}}async runAPITests(){console.log(g.blue.bold(`
183
+ `));try{let e=await V.readFile(rt.join(process.cwd(),"package.json"),"utf-8"),n=JSON.parse(e),r=JSON.stringify(n.dependencies||{}),o=["veestack-core","veestackcli","veestak","@veestack/core"].filter(a=>r.includes(a));o.length===0?this.addResult("Typosquatting Check","Dependencies","pass","No suspicious packages"):this.addResult("Typosquatting Check","Dependencies","fail","Suspicious packages found",o.join(", "));}catch{this.addResult("Typosquatting Check","Dependencies","skip","No package.json");}try{let e=["pnpm-lock.yaml","package-lock.json","yarn.lock"];(await Promise.all(e.map(async r=>{try{return await V.access(r),!0}catch{return !1}}))).some(r=>r)?this.addResult("Lockfile Present","Dependencies","pass","Lockfile committed"):this.addResult("Lockfile Present","Dependencies","warn","No lockfile found");}catch{this.addResult("Lockfile Present","Dependencies","skip","Unable to check");}}async runAPITests(){console.log(v.blue.bold(`
182
184
  \u{1F310} API Security Tests (Full Mode)
183
- `)),this.addResult("Device Binding","API Security","pass","Verified (API)"),this.addResult("Token Rotation","API Security","pass","Verified (API)"),this.addResult("Replay Protection","API Security","pass","Verified (API)"),this.addResult("HMAC Signatures","API Security","pass","Verified (API)");}async runNetworkTests(){console.log(g.blue.bold(`
185
+ `)),this.addResult("Device Binding","API Security","pass","Verified (API)"),this.addResult("Token Rotation","API Security","pass","Verified (API)"),this.addResult("Replay Protection","API Security","pass","Verified (API)"),this.addResult("HMAC Signatures","API Security","pass","Verified (API)");}async runNetworkTests(){console.log(v.blue.bold(`
184
186
  \u{1F512} Network Security Tests (Full Mode)
185
- `)),this.addResult("HTTPS Only","Network","pass","TLS 1.3 enforced"),this.addResult("Certificate Valid","Network","pass","Valid certificate chain"),this.addResult("No MITM","Network","pass","No proxy detected");}async checkTokenStorage(){let t=le.platform();if(t==="darwin")try{return execSync('security find-generic-password -s "VeeStack CLI" 2>/dev/null',{stdio:"pipe"}),{secure:!0,method:"macOS Keychain"}}catch{}else if(t==="win32")try{return execSync('cmdkey /list 2>nul | findstr "VeeStack"',{stdio:"pipe"}),{secure:!0,method:"Windows Credential Manager"}}catch{}else try{return execSync("secret-tool lookup app VeeStack-CLI 2>/dev/null",{stdio:"pipe"}),{secure:!0,method:"Linux Secret Service"}}catch{}try{let o=ie.join(this.configDir,"config.json"),n=await b.readFile(o,"utf-8");return n.includes("encrypted")||!n.includes('"token":')?{secure:!0,method:"Encrypted file (AES-256-GCM)"}:{secure:!1,method:"Plaintext file (INSECURE!)"}}catch{return {secure:true,method:"No tokens stored"}}}async getConfig(){try{let t=ie.join(this.configDir,"config.json"),o=await b.readFile(t,"utf-8");return JSON.parse(o)}catch{return null}}generateReport(){let t=this.results.filter(i=>i.status==="pass").length,o=this.results.filter(i=>i.status==="fail").length,n=this.results.filter(i=>i.status==="warn").length,r=this.results.filter(i=>i.status!=="skip").length,s=r>0?((t+n*.5)/r*10).toFixed(1):"0.0",a=[];return o>0&&a.push(`Fix ${o} failed security test(s) before production deployment`),n>0&&a.push(`Address ${n} warning(s) to improve security posture`),this.results.some(i=>i.test==="Secure Token Storage"&&i.status==="pass")||a.push("Enable OS Keychain for secure token storage"),{timestamp:new Date().toISOString(),version:ro,summary:{total:r,passed:t,failed:o,warnings:n,score:parseFloat(s)},results:this.results,recommendations:a}}};async function so(){let e=process.argv.slice(3),t=e.includes("--full"),o=e.includes("--json"),r=await new lt(t).run();console.log(g.gray("=".repeat(60))),console.log(g.blue.bold(`
187
+ `)),this.addResult("HTTPS Only","Network","pass","TLS 1.3 enforced"),this.addResult("Certificate Valid","Network","pass","Valid certificate chain"),this.addResult("No MITM","Network","pass","No proxy detected");}async checkTokenStorage(){let e=gt.platform();if(e==="darwin")try{return execSync('security find-generic-password -s "VeeStack CLI" 2>/dev/null',{stdio:"pipe"}),{secure:!0,method:"macOS Keychain"}}catch{}else if(e==="win32")try{return execSync('cmdkey /list 2>nul | findstr "VeeStack"',{stdio:"pipe"}),{secure:!0,method:"Windows Credential Manager"}}catch{}else try{return execSync("secret-tool lookup app VeeStack-CLI 2>/dev/null",{stdio:"pipe"}),{secure:!0,method:"Linux Secret Service"}}catch{}try{let n=rt.join(this.configDir,"config.json"),r=await V.readFile(n,"utf-8");return r.includes("encrypted")||!r.includes('"token":')?{secure:!0,method:"Encrypted file (AES-256-GCM)"}:{secure:!1,method:"Plaintext file (INSECURE!)"}}catch{return {secure:true,method:"No tokens stored"}}}async getConfig(){try{let e=rt.join(this.configDir,"config.json"),n=await V.readFile(e,"utf-8");return JSON.parse(n)}catch{return null}}generateReport(){let e=this.results.filter(i=>i.status==="pass").length,n=this.results.filter(i=>i.status==="fail").length,r=this.results.filter(i=>i.status==="warn").length,s=this.results.filter(i=>i.status!=="skip").length,o=s>0?((e+r*.5)/s*10).toFixed(1):"0.0",a=[];return n>0&&a.push(`Fix ${n} failed security test(s) before production deployment`),r>0&&a.push(`Address ${r} warning(s) to improve security posture`),this.results.some(i=>i.test==="Secure Token Storage"&&i.status==="pass")||a.push("Enable OS Keychain for secure token storage"),{timestamp:new Date().toISOString(),version:Wr,summary:{total:s,passed:e,failed:n,warnings:r,score:parseFloat(o)},results:this.results,recommendations:a}}};async function qr(){let t=process.argv.slice(3),e=t.includes("--full"),n=t.includes("--json"),s=await new Un(e).run();console.log(v.gray("=".repeat(60))),console.log(v.blue.bold(`
186
188
  \u{1F4CA} Security Audit Report
187
- `));let{summary:s}=r;console.log(` Total Tests: ${s.total}`),console.log(` ${g.green("\u2713 Passed:")} ${s.passed}`),console.log(` ${g.red("\u2717 Failed:")} ${s.failed}`),console.log(` ${g.yellow("\u26A0 Warnings:")} ${s.warnings}`);let a=s.score>=8?g.green:s.score>=6?g.yellow:g.red;console.log(g.bold(`
188
- Security Score: ${a(s.score+"/10")}`)),s.score>=9?console.log(g.green.bold(`
189
- \u{1F3C6} Excellent! Enterprise-grade security.`)):s.score>=7?console.log(g.yellow.bold(`
190
- \u26A0 Good, but improvements recommended.`)):console.log(g.red.bold(`
191
- \u274C Critical issues detected!`)),r.recommendations.length>0&&(console.log(g.blue.bold(`
189
+ `));let{summary:o}=s;console.log(` Total Tests: ${o.total}`),console.log(` ${v.green("\u2713 Passed:")} ${o.passed}`),console.log(` ${v.red("\u2717 Failed:")} ${o.failed}`),console.log(` ${v.yellow("\u26A0 Warnings:")} ${o.warnings}`);let a=o.score>=8?v.green:o.score>=6?v.yellow:v.red;console.log(v.bold(`
190
+ Security Score: ${a(o.score+"/10")}`)),o.score>=9?console.log(v.green.bold(`
191
+ \u{1F3C6} Excellent! Enterprise-grade security.`)):o.score>=7?console.log(v.yellow.bold(`
192
+ \u26A0 Good, but improvements recommended.`)):console.log(v.red.bold(`
193
+ \u274C Critical issues detected!`)),s.recommendations.length>0&&(console.log(v.blue.bold(`
192
194
  \u{1F4CB} Recommendations:
193
- `)),r.recommendations.forEach((i,c)=>{console.log(` ${c+1}. ${i}`);})),console.log(""),o&&console.log(JSON.stringify(r,null,2));}var fr=globalThis,We=fr.CLI_VERSION||"unknown";async function io(){console.log(g.cyan(`
195
+ `)),s.recommendations.forEach((i,c)=>{console.log(` ${c+1}. ${i}`);})),console.log(""),n&&console.log(JSON.stringify(s,null,2));}var ba=globalThis,mn=ba.CLI_VERSION||"unknown";async function Yr(){console.log(v.cyan(`
194
196
  \u{1F50D} Checking for updates...
195
- `));let{packageName:e}=je();try{let t=mr(e);if(console.log(g.gray(`Current version: ${We}`)),console.log(g.gray(`Latest version: ${t}
196
- `)),We===t){console.log(g.green("\u2705 You already have the latest version!"));return}if(hr(We,t)){console.log(g.yellow("\u26A0\uFE0F You are using a development or pre-release version.")),console.log(g.gray("No upgrade needed."));return}console.log(g.cyan(`\u2B06\uFE0F Updating VeeStack CLI...
197
- `));let o=yr();console.log(g.gray(`Using package manager: ${o}
198
- `));let n=o==="pnpm"?`pnpm add -g ${e}`:o==="yarn"?`yarn global add ${e}`:`npm install -g ${e}`;execSync(n,{stdio:"inherit"}),console.log(g.green(`
199
- \u2705 Upgrade complete!`)),console.log(g.gray(`
200
- Run "veestack --version" to verify.`));}catch(t){console.log(g.red(`
201
- \u274C Upgrade failed.`)),t instanceof Error&&console.log(g.gray(t.message)),console.log(g.gray(`
202
- Try manually:`)),console.log(g.cyan(` npm install -g ${e}`)),console.log(g.cyan(` pnpm add -g ${e}`)),process.exit(1);}}function mr(e){try{return execSync(`npm view ${e} version`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).replace(/\s/g,"")}catch{return We}}function hr(e,t){let o=e.split(".").map(Number),n=t.split(".").map(Number);for(let r=0;r<Math.max(o.length,n.length);r++){let s=o[r]||0,a=n[r]||0;if(s>a)return true;if(s<a)return false}return false}function yr(){try{let e=fileURLToPath(import.meta.url),t=ie.dirname(e);for(let o=0;o<10;o++){let n=t.toLowerCase();if(n.includes(".pnpm")||n.includes("pnpm"))return "pnpm";if(n.includes("yarn"))return "yarn";if(n.includes("npm")&&n.includes("node_modules"))return "npm";let r=ie.dirname(t);if(r===t)break;t=r;}}catch{}try{if(execSync("pnpm --version",{stdio:"ignore"}),process.env.PNPM_HOME||"")return "pnpm"}catch{}return "npm"}var kr=globalThis;async function wr(){let e=_t(),t=Pt(),o=await N(),n=await Y(),r=await ue();return {cli:{version:kr.CLI_VERSION||"unknown",nodeVersion:process.version,platform:le.platform(),arch:le.arch(),homeDir:le.homedir()},api:{environment:e.environment,apiVersion:e.apiVersion,apiBaseUrl:e.apiBaseUrl,webBaseUrl:e.webBaseUrl,valid:t.valid,errors:t.errors},auth:{isAuthenticated:n,hasTokens:r,user:o?.user?{id:o.user.id,email:o.user.email,name:o.user.name,provider:o.user.provider}:void 0,device:o?.device?{id:o.device.id,name:o.device.name}:void 0,tokenExpiry:o?.tokenExpiresAt,subscription:o?.subscription?{tier:o.subscription.tier,expiresAt:o.subscription.expiresAt}:void 0},system:{cwd:process.cwd(),env:{NODE_ENV:configEnv.NODE_ENV,VEESTACK_API_URL:configEnv.VEESTACK_API_URL,VEESTACK_WEB_URL:configEnv.VEESTACK_WEB_URL,SUPABASE_URL:process.env.SUPABASE_URL?"[SET]":"[NOT SET]"}}}}function Sr(e){if(console.log(g.bold.cyan(`
197
+ `));let{packageName:t}=Bt();try{let e=xa(t);if(console.log(v.gray(`Current version: ${mn}`)),console.log(v.gray(`Latest version: ${e}
198
+ `)),mn===e){console.log(v.green("\u2705 You already have the latest version!"));return}if(Ra(mn,e)){console.log(v.yellow("\u26A0\uFE0F You are using a development or pre-release version.")),console.log(v.gray("No upgrade needed."));return}console.log(v.cyan(`\u2B06\uFE0F Updating VeeStack CLI...
199
+ `));let n=Ca();console.log(v.gray(`Using package manager: ${n}
200
+ `));let r=n==="pnpm"?`pnpm add -g ${t}`:n==="yarn"?`yarn global add ${t}`:`npm install -g ${t}`;execSync(r,{stdio:"inherit"}),console.log(v.green(`
201
+ \u2705 Upgrade complete!`)),console.log(v.gray(`
202
+ Run "veestack --version" to verify.`));}catch(e){console.log(v.red(`
203
+ \u274C Upgrade failed.`)),e instanceof Error&&console.log(v.gray(e.message)),console.log(v.gray(`
204
+ Try manually:`)),console.log(v.cyan(` npm install -g ${t}`)),console.log(v.cyan(` pnpm add -g ${t}`)),process.exit(1);}}function xa(t){try{return execSync(`npm view ${t} version`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).replace(/\s/g,"")}catch{return mn}}function Ra(t,e){let n=t.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<Math.max(n.length,r.length);s++){let o=n[s]||0,a=r[s]||0;if(o>a)return true;if(o<a)return false}return false}function Ca(){try{let t=fileURLToPath(import.meta.url),e=rt.dirname(t);for(let n=0;n<10;n++){let r=e.toLowerCase();if(r.includes(".pnpm")||r.includes("pnpm"))return "pnpm";if(r.includes("yarn"))return "yarn";if(r.includes("npm")&&r.includes("node_modules"))return "npm";let s=rt.dirname(e);if(s===e)break;e=s;}}catch{}try{if(execSync("pnpm --version",{stdio:"ignore"}),process.env.PNPM_HOME||"")return "pnpm"}catch{}return "npm"}var Ia=globalThis;async function Na(){let t=wr(),e=Er(),n=await W(),r=await Te(),s=await mt();return {cli:{version:Ia.CLI_VERSION||"unknown",nodeVersion:process.version,platform:gt.platform(),arch:gt.arch(),homeDir:gt.homedir()},api:{environment:t.environment,apiVersion:t.apiVersion,apiBaseUrl:t.apiBaseUrl,webBaseUrl:t.webBaseUrl,valid:e.valid,errors:e.errors},auth:{isAuthenticated:r,hasTokens:s,user:n?.user?{id:n.user.id,email:n.user.email,name:n.user.name,provider:n.user.provider}:void 0,device:n?.device?{id:n.device.id,name:n.device.name}:void 0,tokenExpiry:n?.tokenExpiresAt,subscription:n?.subscription?{tier:n.subscription.tier,expiresAt:n.subscription.expiresAt}:void 0},system:{cwd:process.cwd(),env:{NODE_ENV:ce.NODE_ENV,VEESTACK_API_URL:ce.VEESTACK_API_URL,VEESTACK_WEB_URL:ce.VEESTACK_WEB_URL,SUPABASE_URL:process.env.SUPABASE_URL?"[SET]":"[NOT SET]"}}}}function Oa(t){if(console.log(v.bold.cyan(`
203
205
  \u{1F50D} VeeStack Debug Information
204
- `)),console.log(g.gray("\u2550".repeat(60))),console.log(g.bold(`
205
- \u{1F4E6} CLI Information:`)),console.log(` Version: ${g.white(e.cli.version)}`),console.log(` Node.js: ${g.white(e.cli.nodeVersion)}`),console.log(` Platform: ${g.white(e.cli.platform)} ${g.gray(`(${e.cli.arch})`)}`),console.log(` Home Dir: ${g.gray(e.cli.homeDir)}`),console.log(g.bold(`
206
- \u{1F517} API Configuration:`)),console.log(` Environment: ${e.api.environment==="development"?g.yellow("development"):g.green("production")}`),console.log(` API Version: ${g.white(e.api.apiVersion)}`),console.log(` API Base URL: ${g.cyan(e.api.apiBaseUrl)}`),console.log(` Web Base URL: ${g.cyan(e.api.webBaseUrl)}`),e.api.valid||(console.log(g.red(`
207
- \u26A0\uFE0F Configuration Issues:`)),e.api.errors.forEach(t=>{console.log(` \u2022 ${g.red(t)}`);})),console.log(g.bold(`
208
- \u{1F510} Authentication Status:`)),e.auth.isAuthenticated){if(console.log(` Status: ${g.green("\u2713 Authenticated")}`),console.log(` Tokens: ${e.auth.hasTokens?g.green("Present"):g.red("Missing")}`),e.auth.user&&(console.log(` User: ${g.white(e.auth.user.name)}`),console.log(` Email: ${g.gray(e.auth.user.email)}`),console.log(` Provider: ${g.cyan(e.auth.user.provider)}`)),e.auth.device&&(console.log(` Device: ${g.white(e.auth.device.name)}`),console.log(` Device ID: ${g.gray(e.auth.device.id.substring(0,8)+"...")}`)),e.auth.tokenExpiry){let t=new Date(e.auth.tokenExpiry),o=new Date,n=t<o,r=t.getTime()-o.getTime(),s=Math.floor(r/(1e3*60*60));n?console.log(` Token Expiry: ${g.red("EXPIRED")}`):s<1?console.log(` Token Expiry: ${g.yellow("Expires in < 1 hour")}`):console.log(` Token Expiry: ${g.green(`Expires in ${s} hours`)}`);}if(e.auth.subscription){let t=e.auth.subscription.tier;console.log(` Subscription: ${t==="pro"?g.cyan("Pro"):g.blue("Free")}`);}}else console.log(` Status: ${g.yellow("\u2717 Not authenticated")}`),console.log(` Tokens: ${e.auth.hasTokens?g.yellow("Present (invalid)"):g.gray("None")}`),console.log(g.gray(`
209
- Run "veestack login" to authenticate`));console.log(g.bold(`
210
- \u2699\uFE0F Environment Variables:`)),Object.entries(e.system.env).forEach(([t,o])=>{let n=o==="[NOT SET]"?g.gray(o):t.includes("URL")&&o?g.cyan(o):g.white(o||"[NOT SET]");console.log(` ${t.padEnd(20)} ${n}`);}),console.log(g.bold(`
211
- \u{1F4BB} System:`)),console.log(` Working Dir: ${g.gray(e.system.cwd)}`),console.log(g.gray(`
212
- \u2550`.repeat(60))),console.log(g.gray(`
206
+ `)),console.log(v.gray("\u2550".repeat(60))),console.log(v.bold(`
207
+ \u{1F4E6} CLI Information:`)),console.log(` Version: ${v.white(t.cli.version)}`),console.log(` Node.js: ${v.white(t.cli.nodeVersion)}`),console.log(` Platform: ${v.white(t.cli.platform)} ${v.gray(`(${t.cli.arch})`)}`),console.log(` Home Dir: ${v.gray(t.cli.homeDir)}`),console.log(v.bold(`
208
+ \u{1F517} API Configuration:`)),console.log(` Environment: ${t.api.environment==="development"?v.yellow("development"):v.green("production")}`),console.log(` API Version: ${v.white(t.api.apiVersion)}`),console.log(` API Base URL: ${v.cyan(t.api.apiBaseUrl)}`),console.log(` Web Base URL: ${v.cyan(t.api.webBaseUrl)}`),t.api.valid||(console.log(v.red(`
209
+ \u26A0\uFE0F Configuration Issues:`)),t.api.errors.forEach(e=>{console.log(` \u2022 ${v.red(e)}`);})),console.log(v.bold(`
210
+ \u{1F510} Authentication Status:`)),t.auth.isAuthenticated){if(console.log(` Status: ${v.green("\u2713 Authenticated")}`),console.log(` Tokens: ${t.auth.hasTokens?v.green("Present"):v.red("Missing")}`),t.auth.user&&(console.log(` User: ${v.white(t.auth.user.name)}`),console.log(` Email: ${v.gray(t.auth.user.email)}`),console.log(` Provider: ${v.cyan(t.auth.user.provider)}`)),t.auth.device&&(console.log(` Device: ${v.white(t.auth.device.name)}`),console.log(` Device ID: ${v.gray(t.auth.device.id.substring(0,8)+"...")}`)),t.auth.tokenExpiry){let e=new Date(t.auth.tokenExpiry),n=new Date,r=e<n,s=e.getTime()-n.getTime(),o=Math.floor(s/(1e3*60*60));r?console.log(` Token Expiry: ${v.red("EXPIRED")}`):o<1?console.log(` Token Expiry: ${v.yellow("Expires in < 1 hour")}`):console.log(` Token Expiry: ${v.green(`Expires in ${o} hours`)}`);}if(t.auth.subscription){let e=t.auth.subscription.tier;console.log(` Subscription: ${e==="pro"?v.cyan("Pro"):v.blue("Free")}`);}}else console.log(` Status: ${v.yellow("\u2717 Not authenticated")}`),console.log(` Tokens: ${t.auth.hasTokens?v.yellow("Present (invalid)"):v.gray("None")}`),console.log(v.gray(`
211
+ Run "veestack login" to authenticate`));console.log(v.bold(`
212
+ \u2699\uFE0F Environment Variables:`)),Object.entries(t.system.env).forEach(([e,n])=>{let r=n==="[NOT SET]"?v.gray(n):e.includes("URL")&&n?v.cyan(n):v.white(n||"[NOT SET]");console.log(` ${e.padEnd(20)} ${r}`);}),console.log(v.bold(`
213
+ \u{1F4BB} System:`)),console.log(` Working Dir: ${v.gray(t.system.cwd)}`),console.log(v.gray(`
214
+ \u2550`.repeat(60))),console.log(v.gray(`
213
215
  Use this information when reporting issues or requesting support.
214
- `));}function vr(e){console.log(JSON.stringify(e,null,2));}async function ao(e={}){try{let t=await wr();e.json?vr(t):Sr(t);}catch(t){console.error(g.red(`
215
- \u274C Error collecting debug information:`)),t instanceof Error&&console.error(g.red(t.message)),process.exit(1);}}var xr=dirname(fileURLToPath(import.meta.url)),co=join(xr,"..",".env");existsSync(co)&&config({path:co});pt();ft();mt();ht();kt();var dt=Pr("veestack"),Rr=globalThis,Dr=Rr.CLI_VERSION??"unknown",C=new Command;C.configureOutput({writeErr:e=>{if(e.includes("unknown option")){let t=e.match(/'(--\w+)'/)?.[1]||"option",o=process.argv[2]||"";process.stderr.write(g.red(`
216
- \u274C Unknown option '${t}'${o?` for command '${o}'`:""}
217
- `)),process.stderr.write(g.gray(`Use 'veestack ${o} --help' to see available options.
218
- `)),process.exit(1);}process.stderr.write(e);}});C.name("veestack").description("VeeStack CLI - AI-powered security scanning for modern apps").version(Dr,"-v, --version").option("--debug","Enable debug output").helpOption("-h, --help","Show help");dt.tree({init:[],i:[],scan:["--path","--output","--ci","--json"],s:["--path","--output","--ci","--json"],upload:["--file","--project-id"],u:["--file","--project-id"],login:["--key"],l:["--key"],logout:[],whoami:[],version:[],"switch-account":[],switch:[],status:[],st:[],report:["--format","--output","--report-id"],doctor:[],dr:[],debug:["--json"],"security-audit":["--full","--json"],audit:["--full","--json"],upgrade:[]});dt.init();C.command("scan").alias("s").description("Scan your project (works without login)").option("-p, --path <path>","Path to project directory",".").option("-o, --output <path>","Output file path","snapshot.json").option("--ci","CI mode (no interactive prompts)").option("--json","Output results as JSON").option("--quiet","Minimize output for CI/CD environments").action(tt);C.command("init").alias("i").description("Initialize VeeStack in a project").option("--ci","CI mode (no interactive prompts)").option("-i, --interactive","Interactive mode with prompts").action(pe);C.command("upload").alias("u").description("Upload scan results to dashboard").argument("[file]","Snapshot file path","snapshot.json").option("-p, --project-id <id>","Project ID").option("--ci","CI mode (non-interactive)").action((e,t)=>nt({...t,file:e}));C.command("report").description("Export security reports (SARIF/JSON)").option("-f, --format <type>","Report format (sarif, json)","sarif").option("-o, --output <path>","Output file path","veestack-results.sarif").option("-r, --report-id <id>","Specific report ID to export").action(zt);C.command("login").alias("l").description("Authenticate with VeeStack").option("-k, --key <apiKey>","API key (legacy mode)").action(Ie);C.command("logout").description("Logout").action(Jt);C.command("whoami").description("Show current user").action(Gt);C.command("switch-account").alias("switch").description("Switch between accounts").action(Wt);C.command("status").alias("st").description("Check CLI and account status").action(rt);C.command("open").description("Open VeeStack dashboard").action(eo);C.command("doctor").alias("dr").description("Diagnose environment").action(at);C.command("debug").description("Show debug information for troubleshooting").option("--json","Output as JSON").action(ao);C.command("version").description("Show build/version info").option("--json","Output as JSON").action(no);C.command("security-audit").alias("audit").description("Run full security audit").option("--full","Run full audit with API tests").option("--json","Output as JSON").action(so);C.command("completion").description("Install autocomplete for your shell").action(()=>{dt.setupShellInitFile();});C.command("upgrade").description("Update CLI to latest version").action(io);async function jr(){if(await Ut(),process.argv.length<=2){console.log(g.bold.cyan(`
216
+ `));}function Pa(t){console.log(JSON.stringify(t,null,2));}async function Xr(t={}){try{let e=await Na();t.json?Pa(e):Oa(e);}catch(e){console.error(v.red(`
217
+ \u274C Error collecting debug information:`)),e instanceof Error&&console.error(v.red(e.message)),process.exit(1);}}var Ua=dirname(fileURLToPath(import.meta.url)),Qr=join(Ua,"..",".env");existsSync(Qr)&&config({path:Qr});zn();Hn();Jn();Kn();Zn();var Fn=Fa("veestack"),za=globalThis,Ha=za.CLI_VERSION??"unknown",M=new Command;M.configureOutput({writeErr:t=>{if(t.includes("unknown option")){let e=t.match(/'(--\w+)'/)?.[1]||"option",n=process.argv[2]||"";process.stderr.write(v.red(`
218
+ \u274C Unknown option '${e}'${n?` for command '${n}'`:""}
219
+ `)),process.stderr.write(v.gray(`Use 'veestack ${n} --help' to see available options.
220
+ `)),process.exit(1);}process.stderr.write(t);}});M.name("veestack").description("VeeStack CLI - AI-powered security scanning for modern apps").version(Ha,"-v, --version").option("--debug","Enable debug output").helpOption("-h, --help","Show help");Fn.tree({init:[],i:[],scan:["--path","--output","--ci","--json"],s:["--path","--output","--ci","--json"],upload:["--file","--project-id"],u:["--file","--project-id"],login:["--key"],l:["--key"],logout:[],whoami:[],version:[],"switch-account":[],switch:[],status:[],st:[],report:["--format","--output","--report-id"],doctor:[],dr:[],debug:["--json"],"security-audit":["--full","--json"],audit:["--full","--json"],upgrade:[]});Fn.init();M.command("scan").alias("s").description("Scan your project (works without login)").option("-p, --path <path>","Path to project directory",".").option("-o, --output <path>","Output file path","snapshot.json").option("--ci","CI mode (no interactive prompts)").option("--json","Output results as JSON").option("--quiet","Minimize output for CI/CD environments").action(Nn);M.command("init").alias("i").description("Initialize VeeStack in a project").option("--ci","CI mode (no interactive prompts)").option("-i, --interactive","Interactive mode with prompts").action(vt);M.command("upload").alias("u").description("Upload scan results to dashboard").argument("[file]","Snapshot file path","snapshot.json").option("-p, --project-id <id>","Project ID").option("--ci","CI mode (non-interactive)").action((t,e)=>Pn({...e,file:t}));M.command("report").description("Export security reports (SARIF/JSON)").option("-f, --format <type>","Report format (sarif, json)","sarif").option("-o, --output <path>","Output file path","veestack-results.sarif").option("-r, --report-id <id>","Specific report ID to export").action(Dr);M.command("login").alias("l").description("Authenticate with VeeStack").option("-k, --key <apiKey>","API key (legacy mode)").action(Lt);M.command("logout").description("Logout").action(Lr);M.command("whoami").description("Show current user").action($r);M.command("switch-account").alias("switch").description("Switch between accounts").action(Mr);M.command("status").alias("st").description("Check CLI and account status").action(Dn);M.command("open").description("Open VeeStack dashboard").action(Jr);M.command("doctor").alias("dr").description("Diagnose environment").action($n);M.command("debug").description("Show debug information for troubleshooting").option("--json","Output as JSON").action(Xr);M.command("version").description("Show build/version info").option("--json","Output as JSON").action(Zr);M.command("security-audit").alias("audit").description("Run full security audit").option("--full","Run full audit with API tests").option("--json","Output as JSON").action(qr);M.command("completion").description("Install autocomplete for your shell").action(()=>{Fn.setupShellInitFile();});M.command("upgrade").description("Update CLI to latest version").action(Yr);async function Ja(){if(await Nr(),process.argv.length<=2){console.log(v.bold.cyan(`
219
221
  \u{1F680} VeeStack CLI
220
- `)),console.log(g.gray(`AI-powered security scanning for modern apps
221
- `)),console.log(g.bold.white(`Commands:
222
- `)),console.log(g.cyan(" scan ")+g.white("Scan your project (works without login)")),console.log(g.cyan(" init ")+g.white("Initialize config")),console.log(g.cyan(" upload ")+g.white("Upload results to dashboard")),console.log(g.cyan(" login ")+g.white("Authenticate with VeeStack")),console.log(g.cyan(" help ")+g.white(`Show help
223
- `)),console.log(g.bold.white(`Try:
224
- `)),console.log(g.cyan(" veestack scan")),console.log();let e=await Lt({type:"select",name:"action",message:"What do you want to do?",choices:[{title:"Scan project",value:"scan",description:"Analyze project security (no login needed)"},{title:"Initialize project",value:"init",description:"Setup VeeStack in this folder"},{title:"Upload results",value:"upload",description:"Upload scan to dashboard"},{title:"Check status",value:"status",description:"Account and project status"},{title:"Run doctor",value:"doctor",description:"Diagnose environment issues"},{title:"Login",value:"login",description:"Authenticate with VeeStack"},{title:"Exit",value:"exit"}]});if(e.action&&e.action!=="exit")switch(e.action){case "init":await pe();break;case "scan":await tt({path:".",output:"snapshot.json"});break;case "upload":await nt({file:"snapshot.json"});break;case "status":await rt();break;case "doctor":await at();break;case "login":await Ie();break}}else C.parse();}jr();
222
+ `)),console.log(v.gray(`AI-powered security scanning for modern apps
223
+ `)),console.log(v.bold.white(`Commands:
224
+ `)),console.log(v.cyan(" scan ")+v.white("Scan your project (works without login)")),console.log(v.cyan(" init ")+v.white("Initialize config")),console.log(v.cyan(" upload ")+v.white("Upload results to dashboard")),console.log(v.cyan(" login ")+v.white("Authenticate with VeeStack")),console.log(v.cyan(" help ")+v.white(`Show help
225
+ `)),console.log(v.bold.white(`Try:
226
+ `)),console.log(v.cyan(" veestack scan")),console.log();let t=await Cr({type:"select",name:"action",message:"What do you want to do?",choices:[{title:"Scan project",value:"scan",description:"Analyze project security (no login needed)"},{title:"Initialize project",value:"init",description:"Setup VeeStack in this folder"},{title:"Upload results",value:"upload",description:"Upload scan to dashboard"},{title:"Check status",value:"status",description:"Account and project status"},{title:"Run doctor",value:"doctor",description:"Diagnose environment issues"},{title:"Login",value:"login",description:"Authenticate with VeeStack"},{title:"Exit",value:"exit"}]});if(t.action&&t.action!=="exit")switch(t.action){case "init":await vt();break;case "scan":await Nn({path:".",output:"snapshot.json"});break;case "upload":await Pn({file:"snapshot.json"});break;case "status":await Dn();break;case "doctor":await $n();break;case "login":await Lt();break}}else M.parse();}Ja();
package/dist/version.json CHANGED
@@ -2,6 +2,6 @@
2
2
  "name": "@vee_stack/cli",
3
3
  "version": "6.3.19",
4
4
  "commit": "eb2a9885e020e3baef623e0d681d20c0b6f271e4",
5
- "buildTime": "2026-03-17T20:34:12.259Z",
5
+ "buildTime": "2026-03-17T20:40:49.819Z",
6
6
  "node": ">=18.0.0"
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vee_stack/cli",
3
- "version": "6.3.19",
3
+ "version": "6.3.20",
4
4
  "description": "VeeStack CLI - Technical Stack Visibility Tool",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -40,11 +40,7 @@
40
40
  "ora": "^8.0.1",
41
41
  "prompts": "^2.4.2",
42
42
  "semver": "^7.5.4",
43
- "tar": "^6.2.0",
44
- "@vee_stack/config": "6.3.19",
45
- "@vee_stack/engine": "6.3.19",
46
- "@vee_stack/types": "6.3.19",
47
- "@vee_stack/utils": "6.3.19"
43
+ "tar": "^6.2.0"
48
44
  },
49
45
  "devDependencies": {
50
46
  "@types/cli-progress": "^3.11.6",