agenqa 1.1.3 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.cjs +4 -4
  2. package/package.json +1 -1
package/dist/cli.cjs CHANGED
@@ -20,9 +20,9 @@ Expecting one of '${r.join("', '")}'`);return this._lifeCycleHooks[e]?this._life
20
20
  `),this.outputHelp({error:!0}));let r=t||{},s=r.exitCode||1,i=r.code||"commander.error";this._exit(s,i,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in P.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||["default","config","env"].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,P.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new en(this.options),t=r=>this.getOptionValue(r)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(r));this.options.filter(r=>r.implied!==void 0&&t(r.attributeName())&&e.valueFromOption(this.getOptionValue(r.attributeName()),r)).forEach(r=>{Object.keys(r.implied).filter(s=>!t(s)).forEach(s=>{this.setOptionValueWithSource(s,r.implied[s],"implied")})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:"commander.missingArgument"})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,t){let r=o=>{let a=o.attributeName(),c=this.getOptionValue(a),l=this.options.find(d=>d.negate&&a===d.attributeName()),u=this.options.find(d=>!d.negate&&a===d.attributeName());return l&&(l.presetArg===void 0&&c===!1||l.presetArg!==void 0&&c===l.presetArg)?l:u||o},s=o=>{let a=r(o),c=a.attributeName();return this.getOptionValueSource(c)==="env"?`environment variable '${a.envVar}'`:`option '${a.flags}'`},i=`error: ${s(e)} cannot be used with ${s(t)}`;this.error(i,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let t="";if(e.startsWith("--")&&this._showSuggestionAfterError){let s=[],i=this;do{let o=i.createHelp().visibleOptions(i).filter(a=>a.long).map(a=>a.long);s=s.concat(o),i=i.parent}while(i&&!i._enablePositionalOptions);t=Ht(e,s)}let r=`error: unknown option '${e}'${t}`;this.error(r,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,r=t===1?"":"s",i=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${t} argument${r} but got ${e.length}.`;this.error(i,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],t="";if(this._showSuggestionAfterError){let s=[];this.createHelp().visibleCommands(this).forEach(i=>{s.push(i.name()),i.alias()&&s.push(i.alias())}),t=Ht(e,s)}let r=`error: unknown command '${e}'${t}`;this.error(r,{code:"commander.unknownCommand"})}version(e,t,r){if(e===void 0)return this._version;this._version=e,t=t||"-V, --version",r=r||"output the version number";let s=this.createOption(t,r);return this._versionOptionName=s.attributeName(),this._registerOption(s),this.on("option:"+s.name(),()=>{this._outputConfiguration.writeOut(`${e}
21
21
  `),this._exit(0,"commander.version",e)}),this}description(e,t){return e===void 0&&t===void 0?this._description:(this._description=e,t&&(this._argsDescription=t),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(t=this.commands[this.commands.length-1]),e===t._name)throw new Error("Command alias can't be the same as its name");let r=this.parent?._findCommand(e);if(r){let s=[r.name()].concat(r.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${s}'`)}return t._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(t=>this.alias(t)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let t=this.registeredArguments.map(r=>Xr(r));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?t:[]).join(" ")}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}nameFromFilename(e){return this._name=te.basename(e,te.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let t=this.createHelp();return t.helpWidth===void 0&&(t.helpWidth=e&&e.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth()),t.formatHelp(this,t)}_getHelpContext(e){e=e||{};let t={error:!!e.error},r;return t.error?r=s=>this._outputConfiguration.writeErr(s):r=s=>this._outputConfiguration.writeOut(s),t.write=e.write||r,t.command=this,t}outputHelp(e){let t;typeof e=="function"&&(t=e,e=void 0);let r=this._getHelpContext(e);this._getCommandAndAncestors().reverse().forEach(i=>i.emit("beforeAllHelp",r)),this.emit("beforeHelp",r);let s=this.helpInformation(r);if(t&&(s=t(s),typeof s!="string"&&!Buffer.isBuffer(s)))throw new Error("outputHelp callback must return a string or a Buffer");r.write(s),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",r),this._getCommandAndAncestors().forEach(i=>i.emit("afterAllHelp",r))}helpOption(e,t){return typeof e=="boolean"?(e?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(e=e??"-h, --help",t=t??"display help for command",this._helpOption=this.createOption(e,t),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this}help(e){this.outputHelp(e);let t=P.exitCode||0;t===0&&e&&typeof e!="function"&&e.error&&(t=1),this._exit(t,"commander.help","(outputHelp)")}addHelpText(e,t){let r=["beforeAll","before","after","afterAll"];if(!r.includes(e))throw new Error(`Unexpected value for position to addHelpText.
22
22
  Expecting one of '${r.join("', '")}'`);let s=`${e}Help`;return this.on(s,i=>{let o;typeof t=="function"?o=t({error:i.error,command:i.command}):o=t,o&&i.write(`${o}
23
- `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(s=>t.is(s))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function qt(n){return n.map(e=>{if(!e.startsWith("--inspect"))return e;let t,r="127.0.0.1",s="9229",i;return(i=e.match(/^(--inspect(-brk)?)$/))!==null?t=i[1]:(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=i[1],/^\d+$/.test(i[3])?s=i[3]:r=i[3]):(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],r=i[3],s=i[4]),t&&s!=="0"?`${t}=${r}:${parseInt(s)+1}`:e})}Bt.Command=gt});var Kt=ee(W=>{var{Argument:Wt}=Ne(),{Command:yt}=Mt(),{CommanderError:tn,InvalidArgumentError:Gt}=Ee(),{Help:rn}=ct(),{Option:Jt}=ht();W.program=new yt;W.createCommand=n=>new yt(n);W.createOption=(n,e)=>new Jt(n,e);W.createArgument=(n,e)=>new Wt(n,e);W.Command=yt;W.Option=Jt;W.Argument=Wt;W.Help=rn;W.CommanderError=tn;W.InvalidArgumentError=Gt;W.InvalidOptionArgumentError=Gt});var Qt=ee((Es,nn)=>{nn.exports={name:"dotenv",version:"16.6.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var rr=ee((xs,re)=>{var wt=require("fs"),Le=require("path"),sn=require("os"),on=require("crypto"),an=Qt(),_t=an.version,cn=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function ln(n){let e={},t=n.toString();t=t.replace(/\r\n?/mg,`
23
+ `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(s=>t.is(s))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function qt(n){return n.map(e=>{if(!e.startsWith("--inspect"))return e;let t,r="127.0.0.1",s="9229",i;return(i=e.match(/^(--inspect(-brk)?)$/))!==null?t=i[1]:(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=i[1],/^\d+$/.test(i[3])?s=i[3]:r=i[3]):(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],r=i[3],s=i[4]),t&&s!=="0"?`${t}=${r}:${parseInt(s)+1}`:e})}Bt.Command=gt});var Kt=ee(W=>{var{Argument:Wt}=Ne(),{Command:yt}=Mt(),{CommanderError:tn,InvalidArgumentError:Gt}=Ee(),{Help:rn}=ct(),{Option:Jt}=ht();W.program=new yt;W.createCommand=n=>new yt(n);W.createOption=(n,e)=>new Jt(n,e);W.createArgument=(n,e)=>new Wt(n,e);W.Command=yt;W.Option=Jt;W.Argument=Wt;W.Help=rn;W.CommanderError=tn;W.InvalidArgumentError=Gt;W.InvalidOptionArgumentError=Gt});var Qt=ee((xs,nn)=>{nn.exports={name:"dotenv",version:"16.6.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var rr=ee((vs,re)=>{var wt=require("fs"),Le=require("path"),sn=require("os"),on=require("crypto"),an=Qt(),_t=an.version,cn=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function ln(n){let e={},t=n.toString();t=t.replace(/\r\n?/mg,`
24
24
  `);let r;for(;(r=cn.exec(t))!=null;){let s=r[1],i=r[2]||"";i=i.trim();let o=i[0];i=i.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),o==='"'&&(i=i.replace(/\\n/g,`
25
- `),i=i.replace(/\\r/g,"\r")),e[s]=i}return e}function un(n){n=n||{};let e=tr(n);n.path=e;let t=N.configDotenv(n);if(!t.parsed){let o=new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);throw o.code="MISSING_DATA",o}let r=er(n).split(","),s=r.length,i;for(let o=0;o<s;o++)try{let a=r[o].trim(),c=hn(t,a);i=N.decrypt(c.ciphertext,c.key);break}catch(a){if(o+1>=s)throw a}return N.parse(i)}function dn(n){console.log(`[dotenv@${_t}][WARN] ${n}`)}function xe(n){console.log(`[dotenv@${_t}][DEBUG] ${n}`)}function Zt(n){console.log(`[dotenv@${_t}] ${n}`)}function er(n){return n&&n.DOTENV_KEY&&n.DOTENV_KEY.length>0?n.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function hn(n,e){let t;try{t=new URL(e)}catch(a){if(a.code==="ERR_INVALID_URL"){let c=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw c.code="INVALID_DOTENV_KEY",c}throw a}let r=t.password;if(!r){let a=new Error("INVALID_DOTENV_KEY: Missing key part");throw a.code="INVALID_DOTENV_KEY",a}let s=t.searchParams.get("environment");if(!s){let a=new Error("INVALID_DOTENV_KEY: Missing environment part");throw a.code="INVALID_DOTENV_KEY",a}let i=`DOTENV_VAULT_${s.toUpperCase()}`,o=n.parsed[i];if(!o){let a=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${i} in your .env.vault file.`);throw a.code="NOT_FOUND_DOTENV_ENVIRONMENT",a}return{ciphertext:o,key:r}}function tr(n){let e=null;if(n&&n.path&&n.path.length>0)if(Array.isArray(n.path))for(let t of n.path)wt.existsSync(t)&&(e=t.endsWith(".vault")?t:`${t}.vault`);else e=n.path.endsWith(".vault")?n.path:`${n.path}.vault`;else e=Le.resolve(process.cwd(),".env.vault");return wt.existsSync(e)?e:null}function Xt(n){return n[0]==="~"?Le.join(sn.homedir(),n.slice(1)):n}function fn(n){let e=!!(n&&n.debug),t=n&&"quiet"in n?n.quiet:!0;(e||!t)&&Zt("Loading env from encrypted .env.vault");let r=N._parseVault(n),s=process.env;return n&&n.processEnv!=null&&(s=n.processEnv),N.populate(s,r,n),{parsed:r}}function pn(n){let e=Le.resolve(process.cwd(),".env"),t="utf8",r=!!(n&&n.debug),s=n&&"quiet"in n?n.quiet:!0;n&&n.encoding?t=n.encoding:r&&xe("No encoding is specified. UTF-8 is used by default");let i=[e];if(n&&n.path)if(!Array.isArray(n.path))i=[Xt(n.path)];else{i=[];for(let l of n.path)i.push(Xt(l))}let o,a={};for(let l of i)try{let u=N.parse(wt.readFileSync(l,{encoding:t}));N.populate(a,u,n)}catch(u){r&&xe(`Failed to load ${l} ${u.message}`),o=u}let c=process.env;if(n&&n.processEnv!=null&&(c=n.processEnv),N.populate(c,a,n),r||!s){let l=Object.keys(a).length,u=[];for(let d of i)try{let h=Le.relative(process.cwd(),d);u.push(h)}catch(h){r&&xe(`Failed to load ${d} ${h.message}`),o=h}Zt(`injecting env (${l}) from ${u.join(",")}`)}return o?{parsed:a,error:o}:{parsed:a}}function mn(n){if(er(n).length===0)return N.configDotenv(n);let e=tr(n);return e?N._configVault(n):(dn(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),N.configDotenv(n))}function gn(n,e){let t=Buffer.from(e.slice(-64),"hex"),r=Buffer.from(n,"base64"),s=r.subarray(0,12),i=r.subarray(-16);r=r.subarray(12,-16);try{let o=on.createDecipheriv("aes-256-gcm",t,s);return o.setAuthTag(i),`${o.update(r)}${o.final()}`}catch(o){let a=o instanceof RangeError,c=o.message==="Invalid key length",l=o.message==="Unsupported state or unable to authenticate data";if(a||c){let u=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw u.code="INVALID_DOTENV_KEY",u}else if(l){let u=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw u.code="DECRYPTION_FAILED",u}else throw o}}function yn(n,e,t={}){let r=!!(t&&t.debug),s=!!(t&&t.override);if(typeof e!="object"){let i=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw i.code="OBJECT_REQUIRED",i}for(let i of Object.keys(e))Object.prototype.hasOwnProperty.call(n,i)?(s===!0&&(n[i]=e[i]),r&&xe(s===!0?`"${i}" is already defined and WAS overwritten`:`"${i}" is already defined and was NOT overwritten`)):n[i]=e[i]}var N={configDotenv:pn,_configVault:fn,_parseVault:un,config:mn,decrypt:gn,parse:ln,populate:yn};re.exports.configDotenv=N.configDotenv;re.exports._configVault=N._configVault;re.exports._parseVault=N._parseVault;re.exports.config=N.config;re.exports.decrypt=N.decrypt;re.exports.parse=N.parse;re.exports.populate=N.populate;re.exports=N});var ir={};Ur(ir,{baseDir:()=>Re,configPath:()=>St,ensureDir:()=>we,fileExists:()=>_e,getProjectDir:()=>se,loadConfig:()=>ne,readJson:()=>V,removeProjectCache:()=>Te,removeProjectData:()=>bt,saveConfig:()=>Ae,writeJson:()=>Y});async function we(n){await le.default.mkdir(n,{recursive:!0})}async function V(n,e){try{let t=await le.default.readFile(n,"utf8");return JSON.parse(t)}catch(t){if(t&&t.code==="ENOENT")return e;throw t}}async function Y(n,e){let t=ue.default.dirname(n);await we(t);let r=JSON.stringify(e,null,2);await le.default.writeFile(n,r,"utf8")}async function ne(){return await we(Re),await V(St,{projects:{}})}async function Ae(n){await Y(St,n)}function se(n){return ue.default.join(Re,"projects",n)}async function bt(n){let e=se(n);await le.default.rm(e,{recursive:!0,force:!0})}async function Te(n){let e=se(n),t=ue.default.join(e,"cache.json"),r=ue.default.join(e,"cache-signatures.json");await le.default.rm(t,{force:!0}),await le.default.rm(r,{force:!0})}async function _e(n){try{return await le.default.access(n),!0}catch{return!1}}var le,sr,ue,Re,St,Se=Vr(()=>{le=U(require("node:fs/promises"),1),sr=U(require("node:os"),1),ue=U(require("node:path"),1),Re=process.env.AGENQA_CLI_HOME?ue.default.resolve(process.env.AGENQA_CLI_HOME):ue.default.join(sr.default.homedir(),".agenqa-cli"),St=ue.default.join(Re,"config.json")});var Fr=U(require("node:path"),1);var zt=U(Kt(),1),{program:hs,createCommand:fs,createArgument:ps,createOption:ms,CommanderError:gs,InvalidArgumentError:ys,InvalidOptionArgumentError:ws,Command:Yt,Argument:_s,Option:Ss,Help:bs}=zt.default;var ti=U(rr(),1);var nr=U(require("node:readline/promises"),1),ve=require("node:process");async function ye(n,{required:e=!1}={}){let t=nr.default.createInterface({input:ve.stdin,output:ve.stdout});try{for(;;){let r=(await t.question(`${n} `)).trim().toLowerCase();if(!r&&!e)return null;if(["y","yes"].includes(r))return!0;if(["n","no"].includes(r))return!1;ve.stdout.write(`Please answer yes or no.
25
+ `),i=i.replace(/\\r/g,"\r")),e[s]=i}return e}function un(n){n=n||{};let e=tr(n);n.path=e;let t=N.configDotenv(n);if(!t.parsed){let o=new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);throw o.code="MISSING_DATA",o}let r=er(n).split(","),s=r.length,i;for(let o=0;o<s;o++)try{let a=r[o].trim(),c=hn(t,a);i=N.decrypt(c.ciphertext,c.key);break}catch(a){if(o+1>=s)throw a}return N.parse(i)}function dn(n){console.log(`[dotenv@${_t}][WARN] ${n}`)}function xe(n){console.log(`[dotenv@${_t}][DEBUG] ${n}`)}function Zt(n){console.log(`[dotenv@${_t}] ${n}`)}function er(n){return n&&n.DOTENV_KEY&&n.DOTENV_KEY.length>0?n.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function hn(n,e){let t;try{t=new URL(e)}catch(a){if(a.code==="ERR_INVALID_URL"){let c=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw c.code="INVALID_DOTENV_KEY",c}throw a}let r=t.password;if(!r){let a=new Error("INVALID_DOTENV_KEY: Missing key part");throw a.code="INVALID_DOTENV_KEY",a}let s=t.searchParams.get("environment");if(!s){let a=new Error("INVALID_DOTENV_KEY: Missing environment part");throw a.code="INVALID_DOTENV_KEY",a}let i=`DOTENV_VAULT_${s.toUpperCase()}`,o=n.parsed[i];if(!o){let a=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${i} in your .env.vault file.`);throw a.code="NOT_FOUND_DOTENV_ENVIRONMENT",a}return{ciphertext:o,key:r}}function tr(n){let e=null;if(n&&n.path&&n.path.length>0)if(Array.isArray(n.path))for(let t of n.path)wt.existsSync(t)&&(e=t.endsWith(".vault")?t:`${t}.vault`);else e=n.path.endsWith(".vault")?n.path:`${n.path}.vault`;else e=Le.resolve(process.cwd(),".env.vault");return wt.existsSync(e)?e:null}function Xt(n){return n[0]==="~"?Le.join(sn.homedir(),n.slice(1)):n}function fn(n){let e=!!(n&&n.debug),t=n&&"quiet"in n?n.quiet:!0;(e||!t)&&Zt("Loading env from encrypted .env.vault");let r=N._parseVault(n),s=process.env;return n&&n.processEnv!=null&&(s=n.processEnv),N.populate(s,r,n),{parsed:r}}function pn(n){let e=Le.resolve(process.cwd(),".env"),t="utf8",r=!!(n&&n.debug),s=n&&"quiet"in n?n.quiet:!0;n&&n.encoding?t=n.encoding:r&&xe("No encoding is specified. UTF-8 is used by default");let i=[e];if(n&&n.path)if(!Array.isArray(n.path))i=[Xt(n.path)];else{i=[];for(let l of n.path)i.push(Xt(l))}let o,a={};for(let l of i)try{let u=N.parse(wt.readFileSync(l,{encoding:t}));N.populate(a,u,n)}catch(u){r&&xe(`Failed to load ${l} ${u.message}`),o=u}let c=process.env;if(n&&n.processEnv!=null&&(c=n.processEnv),N.populate(c,a,n),r||!s){let l=Object.keys(a).length,u=[];for(let d of i)try{let h=Le.relative(process.cwd(),d);u.push(h)}catch(h){r&&xe(`Failed to load ${d} ${h.message}`),o=h}Zt(`injecting env (${l}) from ${u.join(",")}`)}return o?{parsed:a,error:o}:{parsed:a}}function mn(n){if(er(n).length===0)return N.configDotenv(n);let e=tr(n);return e?N._configVault(n):(dn(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),N.configDotenv(n))}function gn(n,e){let t=Buffer.from(e.slice(-64),"hex"),r=Buffer.from(n,"base64"),s=r.subarray(0,12),i=r.subarray(-16);r=r.subarray(12,-16);try{let o=on.createDecipheriv("aes-256-gcm",t,s);return o.setAuthTag(i),`${o.update(r)}${o.final()}`}catch(o){let a=o instanceof RangeError,c=o.message==="Invalid key length",l=o.message==="Unsupported state or unable to authenticate data";if(a||c){let u=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw u.code="INVALID_DOTENV_KEY",u}else if(l){let u=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw u.code="DECRYPTION_FAILED",u}else throw o}}function yn(n,e,t={}){let r=!!(t&&t.debug),s=!!(t&&t.override);if(typeof e!="object"){let i=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw i.code="OBJECT_REQUIRED",i}for(let i of Object.keys(e))Object.prototype.hasOwnProperty.call(n,i)?(s===!0&&(n[i]=e[i]),r&&xe(s===!0?`"${i}" is already defined and WAS overwritten`:`"${i}" is already defined and was NOT overwritten`)):n[i]=e[i]}var N={configDotenv:pn,_configVault:fn,_parseVault:un,config:mn,decrypt:gn,parse:ln,populate:yn};re.exports.configDotenv=N.configDotenv;re.exports._configVault=N._configVault;re.exports._parseVault=N._parseVault;re.exports.config=N.config;re.exports.decrypt=N.decrypt;re.exports.parse=N.parse;re.exports.populate=N.populate;re.exports=N});var ir={};Ur(ir,{baseDir:()=>Re,configPath:()=>St,ensureDir:()=>we,fileExists:()=>_e,getProjectDir:()=>se,loadConfig:()=>ne,readJson:()=>V,removeProjectCache:()=>Te,removeProjectData:()=>bt,saveConfig:()=>Ae,writeJson:()=>Y});async function we(n){await le.default.mkdir(n,{recursive:!0})}async function V(n,e){try{let t=await le.default.readFile(n,"utf8");return JSON.parse(t)}catch(t){if(t&&t.code==="ENOENT")return e;throw t}}async function Y(n,e){let t=ue.default.dirname(n);await we(t);let r=JSON.stringify(e,null,2);await le.default.writeFile(n,r,"utf8")}async function ne(){return await we(Re),await V(St,{projects:{}})}async function Ae(n){await Y(St,n)}function se(n){return ue.default.join(Re,"projects",n)}async function bt(n){let e=se(n);await le.default.rm(e,{recursive:!0,force:!0})}async function Te(n){let e=se(n),t=ue.default.join(e,"cache.json"),r=ue.default.join(e,"cache-signatures.json");await le.default.rm(t,{force:!0}),await le.default.rm(r,{force:!0})}async function _e(n){try{return await le.default.access(n),!0}catch{return!1}}var le,sr,ue,Re,St,Se=Vr(()=>{le=U(require("node:fs/promises"),1),sr=U(require("node:os"),1),ue=U(require("node:path"),1),Re=process.env.AGENQA_CLI_HOME?ue.default.resolve(process.env.AGENQA_CLI_HOME):ue.default.join(sr.default.homedir(),".agenqa-cli"),St=ue.default.join(Re,"config.json")});var Fr=U(require("node:path"),1);var zt=U(Kt(),1),{program:fs,createCommand:ps,createArgument:ms,createOption:gs,CommanderError:ys,InvalidArgumentError:ws,InvalidOptionArgumentError:_s,Command:Yt,Argument:Ss,Option:bs,Help:Cs}=zt.default;var ri=U(rr(),1);var nr=U(require("node:readline/promises"),1),ve=require("node:process");async function ye(n,{required:e=!1}={}){let t=nr.default.createInterface({input:ve.stdin,output:ve.stdout});try{for(;;){let r=(await t.question(`${n} `)).trim().toLowerCase();if(!r&&!e)return null;if(["y","yes"].includes(r))return!0;if(["n","no"].includes(r))return!1;ve.stdout.write(`Please answer yes or no.
26
26
  `)}}finally{t.close()}}Se();var xt=U(require("node:fs/promises"),1),lr=require("node:fs"),G=U(require("node:path"),1),ur=U(require("node:crypto"),1);var wn="https://www.agenqa.com/api",_n=/\/api(\/|$)/;function Ct(n){if(!n)return"";let e=n.replace(/\/+$/,"");return e?_n.test(e)?e:/^https?:\/\/[^/]+$/.test(e)?`${e}/api`:e:""}function $e(n,e){let t=n.projects?.[e],r=process.env.AGENQA_API_BASE_URL||wn||"";return Ct(t?.baseUrl||n.baseUrl||r||"")}function Ve(n,e){let t={"X-Cloud-Key-Token":n.keyToken};return e&&(t["X-Cloud-Project-Id"]=e),t}function Et(n,e){let t=new Error(`Request failed with status code ${n.status}`);return t.status=n.status,t.body=e,t.contentType=n.headers.get("content-type")||"",t}async function Oe(n,e={}){let t=await fetch(n,{...e,headers:{Accept:"application/json",...e.headers||{}}});if(!t.ok){let r=await t.text();throw Et(t,r)}return await t.json()}async function or(n,e={}){let t=await fetch(n,e);if(!t.ok){let i=await t.text();throw Et(t,i)}let r=Buffer.from(await t.arrayBuffer()),s=Object.fromEntries(t.headers.entries());return{buffer:r,headers:s}}async function Ue(n,{formData:e,headers:t={},signal:r}={}){let s={Accept:"application/json",...t},i=await fetch(n,{method:"POST",headers:s,body:e,signal:r});if(!i.ok){let a=await i.text();throw Et(i,a)}return await i.json()}function ar(n){return n&&(n.status===401||n.status===403)}Se();async function Sn(n){let e=ur.default.createHash("sha256");return new Promise((t,r)=>{let s=(0,lr.createReadStream)(n);s.on("data",i=>e.update(i)),s.on("error",r),s.on("end",()=>t(e.digest("hex")))})}function cr(n){return!n||typeof n!="object"?null:n.id||n.cloudId||n.cloud_id||null}async function He(n,e,t={}){let r=n.projects?.[e];if(!r)throw new Error(`Project ${e} is not imported. Run "agenqa import" first.`);let s=$e(n,e);if(!s)throw new Error("API base URL is not configured. Set AGENQA_API_BASE_URL.");let i=Ve(r,e),o=se(e);await we(o);let a=await Oe(`${s}/cloud/cli/projects/${e}`,{headers:i}),c={id:a.project?.id,name:a.project?.name,version:a.project?.version,ownerId:a.project?.owner_id,readOnly:a.project?.read_only||!1,synced_at:new Date().toISOString()},l=a.project?.structure_json||{},u=!!l?.disableCacheGlobally;await Y(G.default.join(o,"project.json"),c),await Y(G.default.join(o,"structure.json"),l);let d=await bn({baseUrl:s,projectId:e,headers:i,projectDir:o,serverFiles:dr(a.project?.structure_json)}),h=a.project?.cache_version||null,f={downloaded:0,skipped:0,total:0,version:h,updated:!1},g=t?.cacheOverride??null,m=u||g===!1?!1:typeof r.cacheCloudEnabled=="boolean"?r.cacheCloudEnabled:!!r.cacheEnabled,w=u||g===!1?!1:typeof r.cacheLocalEnabled=="boolean"?r.cacheLocalEnabled:!!r.cacheEnabled;if(m&&w){let y=G.default.join(o,"cache.json"),k=(await V(y,{entries:[],version:null})).version||null;!h&&k?(await Y(y,{version:null,entries:{}}),f={downloaded:0,skipped:0,total:0,version:null,updated:!0}):!!h&&h!==k?f=await Cn({baseUrl:s,projectId:e,headers:i,projectDir:o}):f={downloaded:0,skipped:0,total:0,version:k,updated:!1}}return{project:c,files:d,cache:f,cacheDisabledGlobally:u}}function dr(n){let e=new Map,t=(r,s=null)=>{if(Array.isArray(r))for(let i of r)!i?.id||e.has(i.id)||e.set(i.id,{...i,mime_type:i.mime_type??i.type,size_bytes:i.size_bytes??i.size,test_case_id:s||i?.test_case_id||i?.testCaseId||null})};return Array.isArray(n?.documents)&&n.documents.forEach(r=>t(r?.files||[],cr(r))),Array.isArray(n?.testFolders)&&n.testFolders.forEach(r=>{Array.isArray(r?.documents)&&r.documents.forEach(s=>t(s?.files,cr(s)))}),Array.from(e.values())}async function bn({baseUrl:n,projectId:e,headers:t,projectDir:r,serverFiles:s}){let i=G.default.join(r,"files");await we(i);let o=G.default.join(r,"files.json"),c=(await V(o,{files:{}})).files||{},l=Array.isArray(s)?s:[];if(!l.length){let m=await Oe(`${n}/cloud/cli/projects/${e}`,{headers:t});l=dr(m.project?.structure_json)}let u={files:{}},d=new Set,h=0,f=0,g=0;for(let m of l){d.add(m.id);let w=m?.test_case_id||m?.testCaseId||m?.test_id||m?.testId||null;if(!w)throw new Error(`Missing test case ID for file ${m?.name||m?.id||"unknown"}`);let y=typeof m.name=="string"&&m.name.trim().length>0?m.name:null;if(!y)throw new Error(`Missing file name for file ${m?.id||"unknown"}`);let C=String(w),k=G.default.join("files",C,y),p=G.default.join(r,"files",C);await we(p),u.files[m.id]={name:m.name,mime_type:m.mime_type,size_bytes:m.size_bytes,content_hash:m.content_hash,created_at:m.created_at,test_case_id:w||null,path:k};let b=G.default.join(r,k),E=await _e(b),D=E?await Sn(b):null;if(!E||!D||m.content_hash!==D)try{let R=await Oe(`${n}/cloud/cli/projects/${e}/files/${m.id}/presign-download`,{headers:t});if(!R?.download_url){console.warn(`Warning: missing download URL for file ${m.name||m.id}. Skipping.`),f++;continue}let O=await or(R.download_url,{headers:R.headers||{}});await xt.default.writeFile(b,O.buffer),h++}catch(R){if(R?.status===404){console.warn(`Warning: cloud file not found (${m.name||m.id}). Skipping.`),f++;continue}throw R}else f++}for(let[m]of Object.entries(c))if(!d.has(m)){let w=c[m]||{};if(!w.path){console.warn(`Warning: missing stored path for file ${m}, skipping removal.`);continue}let y=G.default.join(r,w.path);await _e(y)&&await xt.default.unlink(y),g++}return await Y(o,u),{downloaded:h,skipped:f,removed:g,total:l.length}}async function Cn({baseUrl:n,projectId:e,headers:t,projectDir:r}){let s=G.default.join(r,"cache.json"),o=(await V(s,{entries:[]})).version||null,a=await Oe(`${n}/cloud/cli/projects/${e}/cache`,{headers:t}),c=Array.isArray(a.entries)?a.entries:[],l=En(c);if(l&&o&&l===o)return{downloaded:0,skipped:c.length,total:c.length,version:l,updated:!1};let u={version:l,entries:[]},d=0,h=0;for(let f of c)!f?.key||typeof f.value>"u"||(u.entries.push({key:f.key,value:f.value,meta:f.meta||{},createdAt:Date.now(),expiresAt:null}),d++);return await Y(s,u),{downloaded:d,skipped:h,total:c.length,version:l,updated:!0}}function En(n){if(!Array.isArray(n)||n.length===0)return null;let e=null;for(let t of n){let r=t?.updated_at;if(!r)continue;let s=Date.parse(r);Number.isNaN(s)||(!e||s>e)&&(e=s)}return e?new Date(e).toISOString():null}var et=U(require("node:path"),1);var xn={info:"INFO",success:"SUCCESS",warning:"WARN",error:"ERROR"},qe=class{constructor(e={}){this.logs=[],this.silent=!!e.silent}addLog(e,t,r,s=null,i=null){let o={testId:e,level:t,message:r,details:s,extra:i,timestamp:new Date().toISOString()};if(this.logs.push(o),!this.silent||t==="error"){let a=xn[t]||t?.toUpperCase?.()||"LOG",c=e?`[${a}] [${e}]`:`[${a}]`;console.log(`${c} ${r}`),s&&console.log(s)}}convertScreenshotToDataUrl(){return null}getLogs(){return this.logs}};var vt=U(require("node:vm"),1),Be=U(require("node:path"),1),mr=require("node:child_process"),gr=require("node:fs"),Pe=require("node:url"),Ot=require("playwright"),yr=require("playwright/test"),x=null,hr=!1,je=new Map,wr=new Set,Me="EXECUTION_STOPPED",_r=["--yes","playwright","install","--with-deps","chromium"],Sr=process.platform==="win32"?"npx.cmd":"npx";function At(){try{let n=Ot.chromium.executablePath?.();return typeof n=="string"?n:null}catch{return null}}function fr(){let n=At();return!!(n&&(0,gr.existsSync)(n))}function vn(){let n=(0,mr.spawnSync)(Sr,_r,{stdio:"inherit"});if(n.error)throw n.error;if(typeof n.status=="number"&&n.status!==0)throw new Error(`Playwright install failed with exit code ${n.status}.`)}function An(){if(!fr()){if(hr){let n=At()||"unknown";throw new Error(`Chromium is still missing after an install attempt. Expected at: ${n}`)}hr=!0;try{vn()}catch(n){let e=`${Sr} ${_r.join(" ")}`,t=n?.message||String(n);throw new Error(`Failed to install Playwright Chromium via "${e}". ${t}`)}if(!fr()){let n=At()||"unknown";throw new Error(`Playwright install finished, but Chromium is still missing at: ${n}`)}}}function $n(n,e,t,r){if(!x)return!0;switch(e){case"never":return!1;case"testFolder":return x.projectId!==r||x.testFolderId!==t;case"test":default:return x.sessionTestId!==n}}async function oe(){if(x){try{x.browser&&await x.browser.close()}catch{}x=null}}async function We(){if(!x||!x.context)return null;try{let n=await x.context.storageState(),e={cookies:n.cookies||[],localStorage:{},sessionStorage:{}};return n.origins&&n.origins.forEach(t=>{t.localStorage&&t.localStorage.length>0&&(e.localStorage[t.origin]={},t.localStorage.forEach(r=>{e.localStorage[t.origin][r.name]=r.value})),t.sessionStorage&&t.sessionStorage.length>0&&(e.sessionStorage[t.origin]={},t.sessionStorage.forEach(r=>{e.sessionStorage[t.origin][r.name]=r.value}))}),e}catch{return null}}async function br(n,e){try{let t={cookies:[],origins:[]},r=null;try{r=await We()}catch{if(x?.browserState)try{r=JSON.parse(JSON.stringify(x.browserState))}catch{r=x.browserState}else r=null}let s=null;if(n)try{s=JSON.parse(JSON.stringify(n))}catch{s=null}let i=[];r?.cookies?.length&&i.push(...r.cookies),s?.cookies?.length&&s.cookies.forEach(a=>{if(a?.name&&a?.value&&a?.domain){let c=i.findIndex(l=>l.name===a.name&&l.domain===a.domain&&(l.path||"/")===(a.path||"/"));c>=0&&i.splice(c,1),i.push(a)}}),t.cookies=i.filter(a=>a?.name&&a?.value&&a?.domain).map(a=>{let c=a.domain.includes(":")?a.domain.split(":")[0]:a.domain,l={name:a.name,value:String(a.value),domain:c,path:a.path||"/"};if(a.expires){let u=new Date(a.expires);Number.isNaN(u.getTime())||(l.expires=Math.floor(u.getTime()/1e3))}else typeof a.expires=="number"&&(l.expires=a.expires);return typeof a.httpOnly=="boolean"&&(l.httpOnly=a.httpOnly),typeof a.secure=="boolean"&&(l.secure=a.secure),a.sameSite&&(l.sameSite=a.sameSite),l});let o={};if(r?.localStorage)for(let[a,c]of Object.entries(r.localStorage))o[a]||(o[a]={localStorage:{},sessionStorage:{}}),Object.assign(o[a].localStorage,c);if(r?.sessionStorage)for(let[a,c]of Object.entries(r.sessionStorage))o[a]||(o[a]={localStorage:{},sessionStorage:{}}),Object.assign(o[a].sessionStorage,c);if(s?.localStorage)for(let[a,c]of Object.entries(s.localStorage)){let l=a==="default"?e?new Pe.URL(e).origin:null:a;l&&(o[l]||(o[l]={localStorage:{},sessionStorage:{}}),Object.assign(o[l].localStorage,c))}if(s?.sessionStorage)for(let[a,c]of Object.entries(s.sessionStorage)){let l=a==="default"?e?new Pe.URL(e).origin:null:a;l&&(o[l]||(o[l]={localStorage:{},sessionStorage:{}}),Object.assign(o[l].sessionStorage,c))}for(let[a,c]of Object.entries(o)){let l={origin:a};l.localStorage=Object.entries(c.localStorage||{}).map(([u,d])=>({name:u,value:String(d)})),l.sessionStorage=Object.entries(c.sessionStorage||{}).map(([u,d])=>({name:u,value:String(d)})),(l.localStorage.length>0||l.sessionStorage.length>0)&&t.origins.push(l)}return t.cookies.length>0||t.origins.length>0?t:null}catch{return null}}async function On(n,e,t){if(!n||!e)return;let r=t||n.url||null;if(!r){let s=Object.keys(e.localStorage||{})[0]||Object.keys(e.sessionStorage||{})[0]||null;if(s)r=s;else if(e.cookies?.length){let i=e.cookies[0];if(i.domain){let o=i.secure?"https":"http",a=i.domain.startsWith(".")?i.domain.substring(1):i.domain;r=`${o}://${a}`}}}try{let s=await br(e,r);if(!s){n.browserState=JSON.parse(JSON.stringify(e));return}if(s.cookies?.length&&n.context){let i=s.cookies.map(o=>({name:o.name,value:String(o.value),domain:o.domain,path:o.path||"/",expires:typeof o.expires=="number"?o.expires:void 0,httpOnly:typeof o.httpOnly=="boolean"?o.httpOnly:void 0,secure:typeof o.secure=="boolean"?o.secure:void 0,sameSite:o.sameSite||void 0}));try{await n.context.addCookies(i)}catch{}}if(s.origins?.length&&n.page)try{await n.page.addInitScript(({origins:i})=>{try{let o=window.location.origin,a=i.find(c=>c.origin===o);if(!a)return;Array.isArray(a.localStorage)&&a.localStorage.forEach(({name:c,value:l})=>{try{window.localStorage.setItem(c,l)}catch{}}),Array.isArray(a.sessionStorage)&&a.sessionStorage.forEach(({name:c,value:l})=>{try{window.sessionStorage.setItem(c,l)}catch{}})}catch{}},{origins:s.origins})}catch{}try{let i=await We();n.browserState=i||JSON.parse(JSON.stringify(e))}catch{n.browserState=e}}catch{n.browserState=e}}async function jn(n,e,t){if(!n||!e)return;let r=(()=>{try{return t?new Pe.URL(t).origin:new Pe.URL(n.url()).origin}catch{return null}})(),s=(a={})=>{let c=[];for(let[l,u]of Object.entries(a)){let d=l==="default"&&r?r:l;if(!(!d||r&&d!==r))for(let[h,f]of Object.entries(u||{}))c.push({key:h,value:String(f)})}return c},i=s(e.localStorage),o=s(e.sessionStorage);try{await n.evaluate(({localEntries:a,sessionEntries:c})=>{try{Array.isArray(a)&&a.forEach(({key:l,value:u})=>{try{window.localStorage.setItem(l,u)}catch{}}),Array.isArray(c)&&c.forEach(({key:l,value:u})=>{try{window.sessionStorage.setItem(l,u)}catch{}})}catch{}},{localEntries:i,sessionEntries:o})}catch{}if(Array.isArray(e.cookies)&&e.cookies.length>0)try{await n.evaluate(a=>{try{a.forEach(c=>{if(c&&c.name&&c.value){let l=[`${c.name}=${c.value}`];c.path&&l.push(`path=${c.path}`),c.domain&&!c.domain.startsWith(".")&&l.push(`domain=${c.domain}`),c.secure&&l.push("Secure"),c.sameSite&&l.push(`SameSite=${c.sameSite}`),document.cookie=l.join("; ")}})}catch{}},e.cookies)}catch{}}function Pn(n){let e=new Set;for(let t of n)typeof t=="string"?e.add(Be.default.resolve(t)):t&&typeof t=="object"&&t.path&&e.add(Be.default.resolve(t.path));return function(r){if(!r||typeof r!="string")return!1;let s=Be.default.resolve(r);return e.has(s)}}function kn(n,e){let t=Pn(e);return new Proxy(n,{get(r,s){let i=r[s];return s==="constructor"?i:s==="locator"&&typeof i=="function"?function(...o){let a=i.apply(r,o),c=a.setInputFiles;return c&&(a.setInputFiles=function(l){if(Array.isArray(l)){let u=l.map(d=>{if(!t(d))throw new Error(`Access denied: File not in allowed test files: ${d}`);return d});return c.call(this,u)}if(typeof l=="string"){if(!t(l))throw new Error(`Access denied: File not in allowed test files: ${l}`);return c.call(this,l)}return c.call(this,l)}),a}:typeof i=="function"?i.bind(r):i}})}function Fn(n){n&&wr.add(n)}function H(n){return!!n&&wr.has(n)}function ie(n){let e=new Error("Test execution stopped by user");return e.code=Me,e.testId=n,e}function Cr(n){if(!n)return null;let e=null,t=100;return{promise:new Promise((i,o)=>{let a=()=>{H(n)&&(e&&clearInterval(e),oe().catch(()=>{}),o(ie(n)))};a(),e=setInterval(a,t)}),cancel:()=>{e&&(clearInterval(e),e=null)}}}async function Dn(n){Fn(n);let e=je.get(n),t=!1;if(e){if(e.vmContext)try{e.vmContext=null}catch{}e.abortController&&e.abortController.abort(),await oe(),t=!0}if(x&&(!n||x.sessionTestId===n))try{await oe(),t=!0}catch{}return je.delete(n),t||H(n)}function pr(n){return typeof n=="string"&&n.length>0&&n!=="about:blank"&&!n.startsWith("data:")}async function In(n){let e=()=>pr(n.url());if(e())return n.url();try{await n.waitForLoadState("domcontentloaded",{timeout:1e4})}catch{}if(e())return n.url();try{await n.waitForURL(t=>pr(t),{timeout:1e4})}catch{}if(e())return n.url();try{await n.waitForLoadState("load",{timeout:5e3})}catch{}return n.url()}function Nn(n){if(!n||!n.message)return!1;let e=n.message.toLowerCase(),t=(n.name||"").toLowerCase(),r=(n.constructor?.name||"").toLowerCase();return e.includes("strict mode violation")?!1:e.includes("expect(")||e.includes("expected")&&e.includes("received")||e.includes("assertion")||t==="assertionerror"||r==="assertionerror"||t==="expectationerror"||r==="expectationerror"||t==="testerror"||r==="testerror"||e.includes("tobevisible")||e.includes("tobehidden")||e.includes("tobeenabled")||e.includes("tobedisabled")||e.includes("tobechecked")||e.includes("tobeattached")||e.includes("tobedetached")||e.includes("tobeempty")||e.includes("tobefocused")||e.includes("tohavetext")||e.includes("tohavevalue")||e.includes("tohaveattribute")||e.includes("tohaveclass")||e.includes("tohavecount")||e.includes("tohaveurl")||e.includes("tohavetitle")||e.includes("tocontain")||e.includes("toequal")||e.includes("tomatch")||e.includes("tobetruthy")||e.includes("tobefalsy")||e.includes("tobenan")||e.includes("tobenull")||e.includes("tobeundefined")||e.includes("timed out")&&(e.includes("waiting for expect(")||e.includes("ms waiting for expect(")||e.includes("call log:")&&e.includes("expect("))||e.includes("unexpected value")||e.includes("assertion failed")||e.includes("expectation failed")||e.includes("test failed")||e.includes("element not found")&&e.includes("expected")||e.includes("selector")&&e.includes("not found")&&e.includes("expected")}function $t(n,e=null){let t=n||"the requested page",r=new Error(`It is impossible to reach ${t}. Please verify your internet connection or confirm the site allows automated browsing.`);return e&&(r.cause=e),r}async function Er(n,e,t=null){if(H(t))throw ie(t);try{await n.goto(e,{waitUntil:"networkidle",timeout:3e4})}catch(r){if(H(t))throw ie(t);try{let s=await n.evaluate(()=>document.readyState);if(s==="complete"||s==="interactive")return}catch{throw $t(e,r)}throw $t(e,r)}if(H(t))throw ie(t)}async function Ge(n,e,t=null,r=3,s="test",i=null,o=null){if(H(n))throw ie(n);let a=$n(n,s,i,o);if(!x||a){await oe(),An();let c=null;for(let l=1;l<=r;l++){if(H(n))throw ie(n);try{let u=await Ot.chromium.launch(),d={viewport:{width:1920,height:1080},ignoreHTTPSErrors:!0};if(t){let g=await br(t,e);g&&(d.storageState=g)}let h=await u.newContext(d);if(t?.sessionStorage&&Object.keys(t.sessionStorage).length>0){let g=`
27
27
  (function() {
28
28
  const currentOrigin = window.location.origin;
@@ -39,5 +39,5 @@ Expecting one of '${r.join("', '")}'`);let s=`${e}Help`;return this.on(s,i=>{let
39
39
  `:"")+this.retryErrorContext,this.retryErrorContext=null);let l=a?.cacheEnabled?await this._buildStepCacheKey(e,t,r,s,c,o):null;if(l){let f=await ze(l);if(f)return a.usedCache=!0,{playwrightCode:f.playwrightCode,description:f.description,isFinalStep:f.isFinalStep,forceFailure:f.forceFailure,forceFailureReason:f.forceFailureReason,userExperienceRate:f.userExperienceRate,userExperienceAdvices:f.userExperienceAdvices,fromCache:!0,cacheKey:l,cacheMeta:{projectId:e.projectId,testId:e.testId||e.sourceTestId||e.id,sessionId:e.sessionId,timing:"step",level:"test",actionId:null,testFolderId:e.testFolderId||null}}}let u=new FormData;u.append("test_name",e.testName||"Untitled Test"),u.append("test_description",e.testDescription||""),u.append("html_code",r||"");let d=new Blob([s],{type:"image/jpeg"});u.append("screenshot",d,"screenshot.jpeg"),c&&u.append("previous_steps",c),Array.isArray(e.files)&&e.files.length>0&&e.files.forEach((f,g)=>{u.append(`files[${g}][name]`,f.name||""),u.append(`files[${g}][description]`,f.description||"")});let h=await Ue(this.apiConfig.runTestUrl,{formData:u,headers:this.apiConfig.headers});return{playwrightCode:h.playwright_code,description:h.description,isFinalStep:h.is_final_step,forceFailure:h.force_failure,forceFailureReason:h.force_failure_reason,userExperienceRate:h.user_experience_rate,userExperienceAdvices:h.user_experience_advices,fromCache:!1,cacheKey:l,cacheMeta:{projectId:e.projectId,testId:e.testId||e.sourceTestId||e.id,sessionId:e.sessionId,timing:"step",level:"test",actionId:null,testFolderId:e.testFolderId||null}}}async _executePlaywrightCode(e,t,r,s,i=!1){try{let o=await this._prepareTestFiles(e);return await q.executePlaywrightCode(e.sessionId,e.url,r.playwrightCode,null,e.actionTimeout*1e3,r.isFinalStep,o,s,e.testFolderId,e.projectId,i)}catch(o){throw o.isLogged||(this.logger.addLog(e.id,"error",`Step ${t} execution error`,o.message),o.isLogged=!0),o}}async _prepareTestFiles(e){let t=[];if(Array.isArray(e.files))for(let r=0;r<e.files.length;r++){let s=e.files[r];s?.path&&s?.name?t[r]={name:s.name,description:s.description||"",path:s.path}:t[r]=null}return t}async _handleExecutionFailure(e,t,r,s,i,o,a,c,l){let u=`Step ${t} failed`,d=r.error;if(r.isExpectFailure){u=typeof a=="string"&&a.trim().length>0?`Step ${t} failed - ${a.trim()}`:`Step ${t} assertion failed`,this.logger.addLog(e.id,"error",u,d);let m=new Error(`${u}: ${d}`);return m.isLogged=!0,m.shouldRetryWithoutCache=l?.usedCache||!1,m.cacheUsed=l?.usedCache||!1,{shouldRetry:!1,error:m}}if(this.isRetryableError(r.error)&&s<i)return this.logger.addLog(e.id,"warning",`Step ${t} failed (attempt ${s+1}/${i}): ${r.error}`,d),this.retryErrorContext=`Step ${t} (attempt ${s+1}): Failed with error: ${r.error}`,{shouldRetry:!0};r.errorType==="execution"?u=`Step ${t} code execution failed`:r.errorType==="browser"&&(u=`Step ${t} browser error`),this.logger.addLog(e.id,"error",u,d);let f=new Error(`${u}: ${d}`);return f.isLogged=!0,f.shouldRetryWithoutCache=l?.usedCache||!1,f.cacheUsed=l?.usedCache||!1,{shouldRetry:!1,error:f}}_logStepDetails(e,t,r,s,i,o,a=!1){let c=r||"No description provided",l=a?" (cache)":"",u={};typeof i<"u"&&(u.user_experience_rate=i),typeof o<"u"&&(u.user_experience_advices=o),a&&(u.from_cache=!0),this.logger.addLog(e,"info",`Step ${t}${l}: ${c}`,null,u)}async _buildStepCacheKey(e,t,r,s,i,o){let a="v1",c=e.testId||e.sourceTestId||e.id||"unknown-test",l=e.projectId||"unknown-project",u=await this._hashString(i||""),d=this._buildFilesSignature(e.files),h=e.testFolderId||"",f=JSON.stringify({cacheVersion:a,projectId:l,sourceTestId:c,url:e.url||"",resetStateOption:o||"",maxSteps:e.maxSteps,actionTimeout:e.actionTimeout,environment:e.environment||"",role:e.role||"",previousStepsHash:u,filesSignature:d,testFolderId:h,stepNumber:t}),g=await this._hashString(f);return`step:${a}:${l}:${c}:${t}:${g}`}_buildFilesSignature(e){if(!Array.isArray(e)||e.length===0)return"no-files";let t=e.map(r=>({name:r?.name||"",description:r?.description||"",id:r?.id||""}));return this._simpleHash(JSON.stringify(t))}async _hashString(e){if(typeof e!="string")return"no-string";try{if(typeof crypto<"u"&&crypto.subtle?.digest){let r=new TextEncoder().encode(e),s=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(s)).map(i=>i.toString(16).padStart(2,"0")).join("")}}catch{}return this._simpleHash(e)}_simpleHash(e){let t=0,r=String(e);for(let s=0;s<r.length;s++)t=(t<<5)-t+r.charCodeAt(s),t|=0;return Math.abs(t).toString(16)}async _capturePageState(e,t){try{let r=await q.getCurrentState(e);if(r&&r.success)return{html:r.html,screenshot:r.screenshot}}catch(r){this.logger.addLog(t,"warning","Failed to capture page state",r.message)}return null}_sleep(e){return new Promise(t=>setTimeout(t,e))}_isNetworkError(e){if(!e||e.code==="ERR_CANCELED")return!1;if(e.isAxiosError&&!e.response)return!0;let t=typeof e.message=="string"?e.message.toLowerCase():"",r=typeof e.code=="string"?e.code.toLowerCase():"",s=["network error","net::err_","failed to fetch","getaddrinfo","socket hang up","econnreset","econnrefused","timed out","etimedout","ehostunreach","enotfound","network is unreachable"];return!!(s.some(i=>t.includes(i))||r&&s.some(i=>r.includes(i)))}isRetryableError(e){if(!e||typeof e!="string")return!1;let t=e.toLowerCase();return t.includes("strict mode violation")?!0:!(t.includes("assertion failed")||t.includes("expect(")&&!t.includes("timed out")||t.includes("expected")&&t.includes("received")&&!t.includes("timed out")||t.includes("assertionerror")||t.includes("expectation failed"))}};var Ze=class{constructor(e,t,r=()=>!1,s=()=>{}){this.logger=e,this.apiConfig=t,this.retryErrorContext=null,this.isStopRequested=r,this.executedProjectBeforeActions=new Map,this.recordActionCode=typeof s=="function"?s:()=>{}}async executeActions(e,t,r,s,i="test",o=null,a=null,c={}){let l=c?.enableCache!==!1,u=r.filter(m=>s==="before"&&!m.executeAfter||s==="after"&&m.executeAfter);if(this.isStopRequested())return this.logger.addLog(t,"warning",`${s} actions cancelled by user request`),{success:!1,message:`${s} actions cancelled by user`,cancelled:!0,usedCache:!1};if(u.length===0)return this.logger.addLog(t,"info",`No ${s} actions to execute`),{success:!0,message:`No ${s} actions to execute`,usedCache:!1};this.logger.addLog(t,"info",`Executing ${u.length} ${s} action(s) in inheritance order (Project->Test Folder->Test)`);let d=0,h=0,f=!1;for(let m=0;m<u.length;m++){if(this.isStopRequested())return this.logger.addLog(t,"warning",`Cancelled remaining ${s} actions after user stop request`),{success:!1,message:`${s} actions cancelled by user`,cancelled:!0,usedCache:f};let w=u[m];if(this._shouldSkipProjectBeforeAction(e,w,s,i)){this.logger.addLog(t,"info",`Skipping project-level ${s} action "${w.name}" for persistent session`);continue}try{let y=this._resolveActionUrl(w);this.logger.addLog(t,"info",`[${m+1}/${u.length}] Executing ${s} action: "${w.name}" (${w.level} level) - URL: ${y}`);let C=this._resolveActionStorage(w),k=(C?.cookies?.length||0)>0||Object.keys(C?.localStorage||{}).length>0||Object.keys(C?.sessionStorage||{}).length>0,p=null;if(k?p=await this._navigateWithBrowserState(e,w,y,t,i,o,a):p=await q.navigateToUrl(e,y,null,i,o,a),p?.cancelled)return this.logger.addLog(t,"warning",`${s} action "${w.name}" cancelled during navigation`),{success:!1,cancelled:!0,usedCache:f};if(p&&p.success===!1){let D=this._formatDetails(p.error,"Navigation failed");this.logger.addLog(t,"warning",`\u2717 ${s} action "${w.name}" navigation failed`,D),h++;continue}if(this.isStopRequested())return this.logger.addLog(t,"warning",`Cancelled ${s} action "${w.name}" due to user stop request`),{success:!1,message:`${s} actions cancelled by user`,cancelled:!0,usedCache:f};let b=typeof w.description=="string"?w.description.trim():"";if(!b){this._recordProjectBeforeActionSuccess(e,w,s,i);let v=!!w.storageOnly?`\u2713 ${s} action "${w.name}" storage configuration applied (no AI instructions)`:`\u2713 ${s} action "${w.name}" navigation completed (no description to execute)`;this.logger.addLog(t,"success",v),d++;continue}let E=await this._executeActionWithAI(e,{...w,description:b},y,t,s,i,o,a,m+1,{enableCache:l,testId:c?.testId,projectId:c?.projectId});if(E?.cacheUsed&&(f=!0),!E||E.cancelled)return{success:!1,cancelled:!0,usedCache:f};E.success?(d++,this._recordProjectBeforeActionSuccess(e,w,s,i)):h++}catch(y){let C=this._formatDetails(y);this.logger.addLog(t,"warning",`\u2717 ${s} action "${w.name}" failed with unexpected error`,C),h++}}let g=h===0;return{success:g,message:g?`${s} actions completed`:`${s} actions failed`,usedCache:f}}async _navigateWithBrowserState(e,t,r,s,i,o,a){let c=this._resolveActionStorage(t);this.logger.addLog(s,"info",`Action "${t.name}" includes browser state: ${t.cookies?.length||0} cookies, ${Object.keys(t.localStorage||{}).length} localStorage items, ${Object.keys(t.sessionStorage||{}).length} sessionStorage items`);let l=JSON.parse(JSON.stringify(c));return await q.navigateToUrlWithState(e,r,l,i,o,a)}async _executeActionWithAI(e,t,r,s,i,o,a,c,l=1,u={}){let d=u?.enableCache!==!1,h=!1,f=u?.testId||s,g=u?.projectId||c;if(this.isStopRequested())return this.logger.addLog(s,"warning",`${i} action "${t.name}" cancelled before execution`),{success:!1,cancelled:!0};let m=typeof t.actionTimeout=="number"?t.actionTimeout*1e3:6e4,w=typeof t.maxSteps=="number"?t.maxSteps:10,y=await q.getCurrentState(e);if(!y||!y.success){let O=this._formatDetails(y?.error);return this.logger.addLog(s,"warning",`\u2717 ${i} action "${t.name}" failed to capture page state: ${O}`,O),{success:!1}}let C=1,k="",p=!1,b=0,E=3,D=[5e3,15e3],v=0;for(;(!p||b>0)&&C<=w;){if(this.isStopRequested())return this.logger.addLog(s,"warning",`${i} action "${t.name}" cancelled by user`),{success:!1,cancelled:!0};try{let O=(t.description||"").trim(),T=k;this.retryErrorContext&&(T+=(T?`
40
40
  `:"")+this.retryErrorContext,this.retryErrorContext=null);let ae=d?await this._buildActionCacheKey({action:t,timing:i,stepNumber:C,pageStateResult:y,previousStepsContext:T,resetStateOption:o,projectId:g,testId:f,sessionId:e,actionTimeoutMs:m,maxSteps:w,testFolderId:a}):null,K,L,he,fe,S,$,I,j=!1;if(ae){let A=await ze(ae);A&&(h=!0,j=!0,{playwrightCode:K,description:L,isFinalStep:he,forceFailure:fe,forceFailureReason:S,userExperienceRate:$,userExperienceAdvices:I}=A)}if(!j){let A=new FormData;A.append("test_name",`${i} action: ${t.name}`),A.append("test_description",O),A.append("html_code",y.html);let F=new Blob([y.screenshot],{type:"image/jpeg"});A.append("screenshot",F,"screenshot.jpeg"),T&&A.append("previous_steps",T),{playwright_code:K,description:L,is_final_step:he,forceFailure:fe,forceFailureReason:S,user_experience_rate:$,user_experience_advices:I}=await Ue(this.apiConfig.runTestUrl,{formData:A,headers:this.apiConfig.headers})}if(fe){let A=S||L;if(j&&v<D.length&&!this.isStopRequested()){let F=D[v];v++,this.logger.addLog(s,"warning",`Cache retry ${v}/2 after failure - waiting ${Math.round(F/1e3)}s before retrying ${i} action "${t.name}" step ${C} from cache`),await new Promise(_=>setTimeout(_,F));let B=await this._capturePageState(e,s);B&&(y=B),b=0;continue}return this._logActionDetails(s,t.name,L,y.screenshot,$,I,j),this.logger.addLog(s,"warning",`\u2717 ${i} action "${t.name}" failed: ${A}`,A),{success:!1,cacheUsed:h}}if(p=!!he,K){if(this.isStopRequested())return this.logger.addLog(s,"warning",`${i} action "${t.name}" cancelled before executing Playwright code`),{success:!1,cancelled:!0,cacheUsed:h};let A=j&&v<D.length&&!this.isStopRequested(),F=await q.executePlaywrightCode(e,r,K,null,m,p,[],o,a,c,A),B=F.cancelled?"cancelled":F.success?"success":"failed";if(this.recordActionCode({executionId:s,timing:i,actionName:t.name,actionLevel:t.level,actionOrder:l,stepNumber:C,attempt:b+1,description:L,code:K,status:B}),F.cancelled)return{success:!1,cancelled:!0};if(F.success){let z=await this._capturePageState(e,s);if(z&&(y=z),!j&&ae&&Ye(ae,{playwrightCode:K,description:L,isFinalStep:he,forceFailure:fe,forceFailureReason:S,userExperienceRate:$,userExperienceAdvices:I},{projectId:g,testId:f,sessionId:e,timing:i,level:t.level,actionId:t.id||null,testFolderId:a||null}),j&&(h=!0),this._logActionDetails(s,t.name,L,y.screenshot,$,I,j),k+=`Step ${C}: ${L}
41
41
  `,!p){C++,b=0,v=0;continue}return this.logger.addLog(s,"success",`\u2713 ${i} action "${t.name}" executed successfully`),{success:!0,cacheUsed:h}}let _=!!F.isExpectFailure,ce=!_&&this.isRetryableError(F.error),M=this._formatDetails(F.error);if(ce&&b<E){b++,this.logger.addLog(s,"warning",`${i} action "${t.name}" step ${C} failed (attempt ${b}/${E}): ${F.error}`,M),this.retryErrorContext=`Step ${C} (attempt ${b}): Failed with error: ${F.error}`;let z=await this._capturePageState(e,s);z&&(y=z);continue}if(j&&v<D.length&&!this.isStopRequested()){let z=D[v];v++,this.logger.addLog(s,"warning",`Cache retry ${v}/2 after failure - waiting ${Math.round(z/1e3)}s before retrying ${i} action "${t.name}" step ${C} from cache`),await new Promise(Ce=>setTimeout(Ce,z));let be=await this._capturePageState(e,s);be&&(y=be),b=0;continue}let pe=_?"assertion failed":"execution failed";return this.logger.addLog(s,"warning",`\u2717 ${i} action "${t.name}" step ${C} ${pe}: ${F.error}`,M),{success:!1,cacheUsed:h}}let Z=await this._capturePageState(e,s);if(Z&&(y=Z),this._logActionDetails(s,t.name,L,y.screenshot,$,I,j),k+=`Step ${C}: ${L}
42
- `,!p){C++,b=0,v=0;continue}return this.logger.addLog(s,"success",`\u2713 ${i} action "${t.name}" completed`),{success:!0,cacheUsed:h}}catch(O){let T=this._formatDetails(O);return this.logger.addLog(s,"warning",`\u2717 ${i} action "${t.name}" API failed: ${O.message}`,T),{success:!1,cacheUsed:h}}}let R=`Maximum of ${w} steps reached without completing action "${t.name}"`;return this.logger.addLog(s,"warning",`\u2717 ${i} action "${t.name}" reached maximum steps limit (${w}) without completing`,R),{success:!1,cacheUsed:h}}async _capturePageState(e,t){try{let r=await q.getCurrentState(e);if(r&&r.success)return r}catch(r){let s=this._formatDetails(r);this.logger.addLog(t,"warning","Failed to capture page state for action logging",s)}return null}_logActionDetails(e,t,r,s,i,o,a=!1){let c=a?" (cache)":"",l={};typeof i<"u"&&(l.user_experience_rate=i),typeof o<"u"&&(l.user_experience_advices=o),a&&(l.from_cache=!0),this.logger.addLog(e,"info",`${t}${c}: ${r||"No description provided"}`,null,l)}_formatDetails(e,t="Unknown error"){if(e instanceof Error)return e.stack||e.message||t;if(typeof e=="string")return e||t;if(e==null)return t;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{return String(e)}return String(e)}async _buildActionCacheKey({action:e,timing:t,stepNumber:r,pageStateResult:s,previousStepsContext:i,resetStateOption:o,projectId:a,testId:c,sessionId:l,actionTimeoutMs:u,maxSteps:d,testFolderId:h}){let f="v1",g=await this._hashString(i||""),m=JSON.stringify({cacheVersion:f,actionId:e.id||"",actionName:e.name||"",actionUrl:e.url||"",actionLevel:e.level||"",timing:t,stepNumber:r,resetStateOption:o,actionTimeoutMs:u,maxSteps:d,projectId:a||"unknown-project",testId:c||"unknown-test",description:(e.description||"").trim(),storageOnly:!!e.storageOnly,testFolderId:h||e.testFolderId||"",cookies:e.cookies||[],localStorage:e.localStorage||{},sessionStorage:e.sessionStorage||{},previousStepsHash:g}),w=await this._hashString(m);return`action:${f}:${a||"project"}:${c||"test"}:${t}:${e.id||e.name||"unnamed"}:${w}`}async _hashString(e){if(typeof e!="string")return"no-string";try{if(typeof crypto<"u"&&crypto.subtle?.digest){let r=new TextEncoder().encode(e),s=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(s)).map(i=>i.toString(16).padStart(2,"0")).join("")}}catch{}return this._simpleHash(e)}_simpleHash(e){let t=0,r=String(e);for(let s=0;s<r.length;s++)t=(t<<5)-t+r.charCodeAt(s),t|=0;return Math.abs(t).toString(16)}_shouldSkipProjectBeforeAction(e,t,r,s){if(!e||r!=="before"||t.level!=="project"||!t.id||s==="test")return!1;let i=this.executedProjectBeforeActions.get(e);return i?i.has(t.id):!1}_recordProjectBeforeActionSuccess(e,t,r,s){!e||r!=="before"||t.level!=="project"||!t.id||s!=="test"&&(this.executedProjectBeforeActions.has(e)||this.executedProjectBeforeActions.set(e,new Set),this.executedProjectBeforeActions.get(e).add(t.id))}_resolveActionUrl(e){let t=typeof e?.cloudReplaceUrl=="string"?e.cloudReplaceUrl.trim():"";return e?.cloudUseLocalUrl===!1&&t?t:typeof e?.url=="string"?e.url.trim():""}_resolveActionStorage(e){return e?.cloudUseLocalStorage===!1&&e.cloudStorage?e.cloudStorage:{cookies:e.cookies||[],localStorage:e.localStorage||{},sessionStorage:e.sessionStorage||{}}}isRetryableError(e){if(!e||typeof e!="string")return!1;let t=e.toLowerCase();return t.includes("strict mode violation")?!0:!(t.includes("assertion failed")||t.includes("expect(")&&!t.includes("timed out")||t.includes("expected")&&t.includes("received")&&!t.includes("timed out")||t.includes("assertionerror")||t.includes("expectation failed"))}};Se();var ke=U(require("node:path"),1);Se();async function jr(n){let e=await V(ke.default.join(n,"structure.json"),{}),t=await V(ke.default.join(n,"project.json"),{}),r=await V(ke.default.join(n,"files.json"),{files:{}}),s=await V(ke.default.join(n,"cache.json"),{entries:[]});return{structure:e,projectMeta:t,filesIndex:r,cacheData:s}}function de(n){return typeof n!="string"?"":n.trim()}function Gn(n,e){let t=de(n),r=de(e);if(!r)return t;let s=t.replace(/\/+$/,""),i=r.replace(/^\/+/,"");return s?`${s}/${i}`:`/${i}`}function Jn(n,e,t){let r=de(n?.replaceUrl);if(r)return r;let s=de(n?.url);if(s)return s;let i=de(t?.replaceUrl);return i||Gn(e?.baseUrl||"",t?.path||"")}function Kn(n,e,t){let r=de(n?.cloudReplaceUrl);if(n?.cloudUseLocalUrl===!1&&r)return r;let s=de(t?.cloudReplaceUrl);if(t?.cloudUseLocalUrl===!1&&s)return s;let i=de(e?.cloudReplaceUrl);return e?.cloudUseLocalUrl===!1&&i?i:Jn(n,e,t)}function Ft(n=[],e){return n.map(t=>({...t,level:e}))}function zn(n,e,t){let r=[];return Array.isArray(n.actions)&&r.push(...Ft(n.actions,"project")),e&&Array.isArray(e.actions)&&r.push(...Ft(e.actions,"testFolder")),Array.isArray(t.actions)&&r.push(...Ft(t.actions,"test")),r}function Yn(n){return Array.isArray(n)?n.map(e=>({id:e?.id||"",name:e?.name||"",description:e?.description||""})):[]}function Pr(n){return Array.isArray(n)?n.map(e=>({id:e?.id||"",name:e?.name||"",description:e?.description||"",executeAfter:!!e?.executeAfter})):[]}function Qn(n,e,t,r){let s=Yn(n?.files),i=Pr(n?.actions),o=Pr(t?.actions),a={name:n?.name,description:n?.description,url:n?.url,maxSteps:n?.maxSteps,actionTimeout:n?.actionTimeout,resetStateOption:r,projectReset:e?.resetStateForEachTest,projectBaseUrl:e?.baseUrl,environment:n?.environment||"",role:n?.role||"",testFolderId:n?.testFolderId||"",testFolderReplaceUrl:t?.replaceUrl||"",testFolderActions:o,files:s,actions:i};try{return JSON.stringify(a)}catch{return`${n?.name||"test"}-${r}-${s.length}-${i.length}`}}function Xn(n,e,t){return Array.isArray(n.files)?n.files.map(r=>{if(!r?.id)return null;let s=e.files?.[r.id];if(!s?.path)throw new Error(`Missing stored file path for ${r.name||r.id}`);let i=et.default.join(t,s.path);return{id:r.id,name:r.name||s?.name||"",description:r.description||"",path:i}}).filter(Boolean):[]}function Zn(n){let e=[],t=Array.isArray(n.documents)?n.documents:[];for(let s of t)e.push({...s,testFolder:null});let r=Array.isArray(n.testFolders)?n.testFolders:[];for(let s of r){let i=Array.isArray(s.documents)?s.documents:[];for(let o of i)e.push({...o,testFolder:s})}return e}function es(n,e,t){let r=Zn(n);return e==="project"?r:e==="folder"?r.filter(s=>s.testFolder?.cloudId===t):e==="test"?r.filter(s=>s.cloudId===t):[]}async function kr({projectId:n,targetType:e,targetId:t,apiConfig:r,cacheEnabled:s,silent:i=!1}){let o=new qe({silent:i}),a=se(n),{structure:c,filesIndex:l,cacheData:u}=await jr(a),d=c||{},h=d.id||n,f=es(c,e,t),g=et.default.join(a,"cache-signatures.json"),m={},w=!1,y=!1,C=!1,k=Array.isArray(u.entries)&&u.entries.length>0;if(s)try{if(await _e(g)){let S=await V(g,{});S&&typeof S=="object"&&(m=S),y=!0}}catch{m={},y=!1}if(!f.length)throw new Error("No tests found for the selected target.");let p=et.default.join(a,"cache.json");$r(u.entries||{},s,{cachePath:p,cacheVersion:u.version||null});let b=new Ze(o,r),E=new Xe(o,r),D=Q.startExecutionGroup(),v=d?.queueFailureBehavior==="continueQueue"?"continueQueue":"stopQueue",R=[],O=new Map,T=0,ae=0;for(let S of f){let $=S.testFolder,I=S.resetStateOption||d?.resetStateForEachTest||"test";if(!(S.executeOnCloud!==!1)){ae++,o.addLog(S.cloudId||S.id||"unknown-test","info",`Skipping "${S.name||"Untitled Test"}" (set to run in app only).`);continue}let Z=Q.generateSessionId({...S,projectId:h,testFolderId:$?.id||null},I,D),A=S.id||S.testId||S.cloudId,F=S.name||"Untitled Test",B=Kn(S,d,$);if(!F.trim()||!S.description?.trim()||!B||!B.trim()){T++,o.addLog(A||"unknown-test","warning","Skipping test missing required name, description, or URL.");continue}if(s&&A){let _={...S,url:B,testFolderId:$?.id||S.testFolderId||null},ce=Qn(_,d,$,I),M=m[A];!y&&k&&!C?(Qe(h,A),C=!0):M&&M!==ce&&Qe(h,A),M!==ce&&(m[A]=ce,w=!0)}R.push({testEntry:S,testFolder:$,resetStateOption:I,sessionId:Z,testId:A,testName:F,testUrl:B}),O.set(Z,(O.get(Z)||0)+1)}if(!R.length)throw new Error("No valid tests found for the selected target.");T>0&&o.addLog("system","warning",`Skipping ${T} test(s) without required name, description, or URL.`),ae>0&&o.addLog("system","info",`Skipping ${ae} test(s) marked for app-only execution.`);let K=0,L=0,he=S=>{if(!S)return;let $=O.get(S);if(!$)return;let I=$-1;I<=0?O.delete(S):O.set(S,I)},fe=async(S,$,I=!1)=>{let j=$||S.resetStateOption||"test";if(j!=="never"){if(j==="testFolder"){if(I){await Q.cleanupSession();return}if((O.get(S.sessionId)||0)>1)return}await Q.cleanupSession()}};try{for(let S of R){let{testEntry:$,testFolder:I,resetStateOption:j,sessionId:Z,testId:A,testName:F,testUrl:B}=S,_={id:A,testId:A,sessionId:Z,testName:F,testDescription:$.description||"",projectId:h,testFolderId:I?.id||null,testFolderName:I?.name||null,url:B,actionTimeout:$.actionTimeout||60,testTimeout:$.testTimeout||300,maxSteps:$.maxSteps||50,actions:Array.isArray($.actions)?[...$.actions]:[],files:Xn($,l,a),environment:$.environment||"",role:$.role||"",resetStateOption:j,startedAt:new Date};o.addLog(_.id,"info",`Started executing test "${_.testName}"`);let ce=zn(d,I,_);try{let M=0,pe=!1,z=4,be=!1,Ce=!1;for(;M<z;){Q.shouldResetSession(_,j)&&await Q.cleanupSession(),Q.updateSessionTracking(_.sessionId,_.testFolderId);try{let me=await b.executeActions(_.sessionId,_.id,ce,"before",j,_.testFolderId,_.projectId,{enableCache:!pe,projectId:h,testId:A});if(!me?.success){let ge=new Error(`Before actions failed: ${me?.message||"Unknown error"}`);throw ge.shouldRetryWithoutCache=!0,me?.usedCache&&(ge.cacheUsed=!0),ge}let De=await q.getPageState(_.sessionId,_.url,null,j,_.testFolderId,_.projectId);if(!De?.success)throw new Error(De?.error||"Failed to capture initial page state");await E.executeTestSteps(_,De,j,{enableCache:!pe});let tt=await b.executeActions(_.sessionId,_.id,ce,"after",j,_.testFolderId,_.projectId,{enableCache:!pe,projectId:h,testId:A});if(!tt?.success){let ge=new Error(`After actions failed: ${tt?.message||"Unknown error"}`);throw ge.shouldRetryWithoutCache=!0,tt?.usedCache&&(ge.cacheUsed=!0),ge}o.addLog(_.id,"success",`Test "${_.testName}" completed successfully`),be=!0;break}catch(me){if(!pe&&!!me?.shouldRetryWithoutCache){pe=!0,Qe(_.projectId,A||null),Or(_.sessionId),o.addLog(_.id,"warning",`Cache invalidated after failure - retrying test "${_.testName}" without cache`),await Q.cleanupSession(),_.startedAt=new Date,M++;continue}o.addLog(_.id,"error",`Test "${_.testName}" failed`,me.message||String(me)),Ce=!0;break}}be?K++:Ce&&L++,await fe(_,j,Ce&&v==="stopQueue"),he(_.sessionId)}catch(M){o.addLog(_.id,"error",`Test "${_.testName}" failed`,M.message||String(M)),L++,await fe(_,j,v==="stopQueue"),he(_.sessionId)}if(L>0&&v==="stopQueue")break}}finally{await Q.cleanupSession()}if(s&&w)try{await Y(g,m)}catch{}return L>0?{success:!1,passed:K,failed:L,total:R.length}:{success:!0,passed:K,failed:L,total:R.length}}var J=new Yt,ts="1.1.3";J.name("agenqa").description("Agenqa CLI for cloud projects").version(ts);process.on("SIGINT",()=>{console.log(`
43
- Interrupted. Exiting.`),process.exit(130)});function Dr(n,e,t){let r=Ct(t||$e(n,e));if(!r)throw new Error("API base URL is not configured in this build.");return r}function Dt(n,e){if(n===void 0)return null;let t=String(n).trim().toLowerCase();if(["y","yes"].includes(t))return!0;if(["n","no"].includes(t))return!1;console.error(`Invalid value for ${e}. Use "yes" or "no".`),process.exit(1)}function It(n){console.log(`Synced project ${n.project?.name||n.project?.id}`),console.log(`Files: ${n.files.downloaded} downloaded, ${n.files.skipped} skipped, ${n.files.removed} removed.`),n.cache&&(n.cacheDisabledGlobally?console.log("Cache disabled globally for this project."):console.log("Cache synced."))}function rs(n){return typeof n?.cacheCloudEnabled=="boolean"?n.cacheCloudEnabled:!!n?.cacheEnabled}function ns(n){return typeof n?.cacheLocalEnabled=="boolean"?n.cacheLocalEnabled:!!n?.cacheEnabled}async function Fe(n){throw ar(n)&&(console.error("Cloud key is invalid or expired. Please re-import the project."),process.exit(2)),n}J.command("import").description("Import a cloud project using project id and secret key").requiredOption("-p, --project <projectId>","Cloud project id").requiredOption("-s, --key-secret <secret>","Cloud key secret").option("--trust <yes|no>","Skip trust prompt by answering yes or no").option("--cache-local <yes|no>","Skip local cache prompt by answering yes or no").option("--cache-cloud <yes|no>","Skip cloud cache prompt by answering yes or no").action(async n=>{let e=await ne(),t=n.project.trim(),r=n.keySecret.trim(),s=Dr(e,t),i=Dt(n.trust,"--trust"),o=Dt(n.cacheLocal,"--cache-local"),a=Dt(n.cacheCloud,"--cache-cloud");(i??await ye("Importing projects from unknown sources can expose you to risks. Do you confirm you trust this project? (yes/no)",{required:!0}))!==!0&&(console.error("Import cancelled."),process.exit(1));let u=(o??await ye("Enable local cache on this machine? (required for cloud cache) (yes/no)"))===!0,d=!1;u?d=(a??await ye("Enable cloud cache? (warning: reuses collaborators' cached steps; only enable if you trust them to avoid security risks) (yes/no)"))===!0:a===!0&&(console.error("Cloud cache requires local cache. Re-run with --cache-local yes or omit --cache-cloud."),process.exit(1));let h={keyToken:r,cacheCloudEnabled:d,cacheLocalEnabled:u,baseUrl:s,importedAt:new Date().toISOString()};e.projects[t]=h,await Ae(e),await Te(t);try{let f=await He(e,t);It(f),console.log("Import completed.")}catch(f){await Fe(f),console.error(f.message||String(f)),process.exit(1)}});J.command("list").description("List stored projects").action(async()=>{let n=await ne(),e=Object.entries(n.projects||{});if(e.length===0){console.log("No projects imported.");return}let t=[];for(let[a,c]of e){let l=null;try{l=await V(Fr.default.join(se(a),"project.json"),null)}catch(f){console.error(`Warning: failed to read metadata for project ${a}: ${f.message||f}`)}let u=rs(c)?"enabled":"disabled",d=c.importedAt||"import time unknown",h=$e(n,a)||"base URL not set";t.push([a,l?.name||"",h,u,d])}let r=["Project ID","Name","Base URL","Cache","Imported At"],s=r.map((a,c)=>Math.max(a.length,...t.map(l=>(l[c]||"").length))),i=s.map(a=>"-".repeat(a)).join("-+-"),o=a=>a.map((c,l)=>String(c||"").padEnd(s[l]," ")).join(" | ");console.log("Stored projects:"),console.log(o(r)),console.log(i),t.forEach(a=>console.log(o(a)))});J.command("sync").description("Sync a cloud project locally").requiredOption("-p, --project <projectId>","Cloud project id").action(async n=>{let e=await ne(),t=n.project.trim();try{let r=await He(e,t);It(r)}catch(r){await Fe(r),console.error(r.message||String(r)),process.exit(1)}});J.command("remove-project").description("Remove an imported project and local data").requiredOption("-p, --project <projectId>","Cloud project id").action(async n=>{let e=n.project.trim(),t=await ne();t.projects?.[e]||(console.error(`Project ${e} is not imported. Run "agenqa import" first.`),process.exit(1)),await ye(`Remove local data for project ${e}? This does not delete the cloud project. (yes/no)`,{required:!0})||(console.error("Remove cancelled."),process.exit(1)),delete t.projects[e],await Ae(t),await bt(e),console.log(`Removed local data for project ${e}.`)});J.command("cache").description("Enable or disable cloud cache for a project").requiredOption("-p, --project <projectId>","Project id").option("--enable","Enable cache").option("--disable","Disable cache").action(async n=>{let e=n.project.trim(),t=n.enable===!0?!0:n.disable===!0?!1:null;t===null&&(console.error("Choose either --enable or --disable."),process.exit(1));let r=await ne(),s=r.projects?.[e];s||(console.error(`Project ${e} is not imported. Run "agenqa import" first.`),process.exit(1)),t&&(console.log("Warning: cache reuses generated steps from collaborators. Enable only if you trust the project sources."),await ye("Do you want to enable cache? (yes/no)",{required:!0})||(console.error("Cache enable cancelled."),process.exit(1))),s.cacheCloudEnabled=t,s.cacheEnabled!==void 0&&(s.cacheEnabled=t),await Ae(r),console.log(`Cache ${t?"enabled":"disabled"} for project ${e}.`)});J.command("reset-cache").description("Clear local cache (cloud cache downloads and local-only cache)").requiredOption("-p, --project <projectId>","Project id").action(async n=>{let e=n.project.trim();(await ne()).projects?.[e]||(console.error(`Project ${e} is not imported. Run "agenqa import" first.`),process.exit(1)),await ye(`Reset local cache for project ${e}? (yes/no)`,{required:!0})||(console.error("Reset cache cancelled."),process.exit(1)),await Te(e),console.log(`Local cache cleared for project ${e}.`)});async function Nt({projectId:n,targetType:e,targetId:t,cacheOverride:r,silent:s}){let i=await ne(),o=i.projects?.[n];if(!o)throw new Error(`Project ${n} is not imported. Run "agenqa import" first.`);let a=Dr(i,n,o.baseUrl),c=await He(i,n,{cacheOverride:r}),l=!!c?.cacheDisabledGlobally;if(c?.project?.readOnly)throw new Error("This cloud project is read-only on your current plan. Convert to local-only to run tests.");s||It(c);let u=l?!1:r!==null?r:ns(o),d=Ve(o,n),h=await kr({projectId:n,targetType:e,targetId:t,cacheEnabled:u,silent:s,apiConfig:{runTestUrl:`${a}/cloud/cli/run-test`,headers:d}});s||console.log(`Summary: ${h.passed}/${h.total} passed, ${h.failed} failed.`),h.success||process.exit(1)}function Lt(n){return n.cache===void 0?null:!!n.cache}J.command("run-project").description("Execute a cloud project").requiredOption("-p, --project <projectId>","Cloud project id").option("--cache","Enable cache").option("--no-cache","Disable cache").option("--silent","Suppress non-error logs").action(async n=>{try{await Nt({projectId:n.project.trim(),targetType:"project",targetId:null,cacheOverride:Lt(n),silent:!!n.silent})}catch(e){await Fe(e),console.error(e.message||String(e)),process.exit(1)}});J.command("run-folder").description("Execute a cloud test folder").requiredOption("-p, --project <projectId>","Cloud project id").requiredOption("-f, --folder <folderId>","Cloud test folder id").option("--cache","Enable cache").option("--no-cache","Disable cache").option("--silent","Suppress non-error logs").action(async n=>{try{await Nt({projectId:n.project.trim(),targetType:"folder",targetId:n.folder.trim(),cacheOverride:Lt(n),silent:!!n.silent})}catch(e){await Fe(e),console.error(e.message||String(e)),process.exit(1)}});J.command("run-test").description("Execute a single cloud test case").requiredOption("-p, --project <projectId>","Cloud project id").requiredOption("-t, --test <testId>","Cloud test case id").option("--cache","Enable cache").option("--no-cache","Disable cache").option("--silent","Suppress non-error logs").action(async n=>{try{await Nt({projectId:n.project.trim(),targetType:"test",targetId:n.test.trim(),cacheOverride:Lt(n),silent:!!n.silent})}catch(e){await Fe(e),console.error(e.message||String(e)),process.exit(1)}});J.parseAsync(process.argv);
42
+ `,!p){C++,b=0,v=0;continue}return this.logger.addLog(s,"success",`\u2713 ${i} action "${t.name}" completed`),{success:!0,cacheUsed:h}}catch(O){let T=this._formatDetails(O);return this.logger.addLog(s,"warning",`\u2717 ${i} action "${t.name}" API failed: ${O.message}`,T),{success:!1,cacheUsed:h}}}let R=`Maximum of ${w} steps reached without completing action "${t.name}"`;return this.logger.addLog(s,"warning",`\u2717 ${i} action "${t.name}" reached maximum steps limit (${w}) without completing`,R),{success:!1,cacheUsed:h}}async _capturePageState(e,t){try{let r=await q.getCurrentState(e);if(r&&r.success)return r}catch(r){let s=this._formatDetails(r);this.logger.addLog(t,"warning","Failed to capture page state for action logging",s)}return null}_logActionDetails(e,t,r,s,i,o,a=!1){let c=a?" (cache)":"",l={};typeof i<"u"&&(l.user_experience_rate=i),typeof o<"u"&&(l.user_experience_advices=o),a&&(l.from_cache=!0),this.logger.addLog(e,"info",`${t}${c}: ${r||"No description provided"}`,null,l)}_formatDetails(e,t="Unknown error"){if(e instanceof Error)return e.stack||e.message||t;if(typeof e=="string")return e||t;if(e==null)return t;if(typeof e=="object")try{return JSON.stringify(e,null,2)}catch{return String(e)}return String(e)}async _buildActionCacheKey({action:e,timing:t,stepNumber:r,pageStateResult:s,previousStepsContext:i,resetStateOption:o,projectId:a,testId:c,sessionId:l,actionTimeoutMs:u,maxSteps:d,testFolderId:h}){let f="v1",g=await this._hashString(i||""),m=JSON.stringify({cacheVersion:f,actionId:e.id||"",actionName:e.name||"",actionUrl:e.url||"",actionLevel:e.level||"",timing:t,stepNumber:r,resetStateOption:o,actionTimeoutMs:u,maxSteps:d,projectId:a||"unknown-project",testId:c||"unknown-test",description:(e.description||"").trim(),storageOnly:!!e.storageOnly,testFolderId:h||e.testFolderId||"",cookies:e.cookies||[],localStorage:e.localStorage||{},sessionStorage:e.sessionStorage||{},previousStepsHash:g}),w=await this._hashString(m);return`action:${f}:${a||"project"}:${c||"test"}:${t}:${e.id||e.name||"unnamed"}:${w}`}async _hashString(e){if(typeof e!="string")return"no-string";try{if(typeof crypto<"u"&&crypto.subtle?.digest){let r=new TextEncoder().encode(e),s=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(s)).map(i=>i.toString(16).padStart(2,"0")).join("")}}catch{}return this._simpleHash(e)}_simpleHash(e){let t=0,r=String(e);for(let s=0;s<r.length;s++)t=(t<<5)-t+r.charCodeAt(s),t|=0;return Math.abs(t).toString(16)}_shouldSkipProjectBeforeAction(e,t,r,s){if(!e||r!=="before"||t.level!=="project"||!t.id||s==="test")return!1;let i=this.executedProjectBeforeActions.get(e);return i?i.has(t.id):!1}_recordProjectBeforeActionSuccess(e,t,r,s){!e||r!=="before"||t.level!=="project"||!t.id||s!=="test"&&(this.executedProjectBeforeActions.has(e)||this.executedProjectBeforeActions.set(e,new Set),this.executedProjectBeforeActions.get(e).add(t.id))}_resolveActionUrl(e){let t=typeof e?.cloudReplaceUrl=="string"?e.cloudReplaceUrl.trim():"";return e?.cloudUseLocalUrl===!1&&t?t:typeof e?.url=="string"?e.url.trim():""}_resolveActionStorage(e){return e?.cloudUseLocalStorage===!1&&e.cloudStorage?e.cloudStorage:{cookies:e.cookies||[],localStorage:e.localStorage||{},sessionStorage:e.sessionStorage||{}}}isRetryableError(e){if(!e||typeof e!="string")return!1;let t=e.toLowerCase();return t.includes("strict mode violation")?!0:!(t.includes("assertion failed")||t.includes("expect(")&&!t.includes("timed out")||t.includes("expected")&&t.includes("received")&&!t.includes("timed out")||t.includes("assertionerror")||t.includes("expectation failed"))}};Se();var ke=U(require("node:path"),1);Se();async function jr(n){let e=await V(ke.default.join(n,"structure.json"),{}),t=await V(ke.default.join(n,"project.json"),{}),r=await V(ke.default.join(n,"files.json"),{files:{}}),s=await V(ke.default.join(n,"cache.json"),{entries:[]});return{structure:e,projectMeta:t,filesIndex:r,cacheData:s}}function de(n){return typeof n!="string"?"":n.trim()}function Gn(n,e){let t=de(n),r=de(e);if(!r)return t;let s=t.replace(/\/+$/,""),i=r.replace(/^\/+/,"");return s?`${s}/${i}`:`/${i}`}function Jn(n,e,t){let r=de(n?.replaceUrl);if(r)return r;let s=de(n?.url);if(s)return s;let i=de(t?.replaceUrl);return i||Gn(e?.baseUrl||"",t?.path||"")}function Kn(n,e,t){let r=de(n?.cloudReplaceUrl);if(n?.cloudUseLocalUrl===!1&&r)return r;let s=de(t?.cloudReplaceUrl);if(t?.cloudUseLocalUrl===!1&&s)return s;let i=de(e?.cloudReplaceUrl);return e?.cloudUseLocalUrl===!1&&i?i:Jn(n,e,t)}function Ft(n=[],e){return n.map(t=>({...t,level:e}))}function zn(n,e,t){let r=[];return Array.isArray(n.actions)&&r.push(...Ft(n.actions,"project")),e&&Array.isArray(e.actions)&&r.push(...Ft(e.actions,"testFolder")),Array.isArray(t.actions)&&r.push(...Ft(t.actions,"test")),r}function Yn(n){return Array.isArray(n)?n.map(e=>({id:e?.id||"",name:e?.name||"",description:e?.description||""})):[]}function Pr(n){return Array.isArray(n)?n.map(e=>({id:e?.id||"",name:e?.name||"",description:e?.description||"",executeAfter:!!e?.executeAfter})):[]}function Qn(n,e,t,r){let s=Yn(n?.files),i=Pr(n?.actions),o=Pr(t?.actions),a={name:n?.name,description:n?.description,url:n?.url,maxSteps:n?.maxSteps,actionTimeout:n?.actionTimeout,resetStateOption:r,projectReset:e?.resetStateForEachTest,projectBaseUrl:e?.baseUrl,environment:n?.environment||"",role:n?.role||"",testFolderId:n?.testFolderId||"",testFolderReplaceUrl:t?.replaceUrl||"",testFolderActions:o,files:s,actions:i};try{return JSON.stringify(a)}catch{return`${n?.name||"test"}-${r}-${s.length}-${i.length}`}}function Xn(n,e,t){return Array.isArray(n.files)?n.files.map(r=>{if(!r?.id)return null;let s=e.files?.[r.id];if(!s?.path)throw new Error(`Missing stored file path for ${r.name||r.id}`);let i=et.default.join(t,s.path);return{id:r.id,name:r.name||s?.name||"",description:r.description||"",path:i}}).filter(Boolean):[]}function Zn(n){let e=[],t=Array.isArray(n.documents)?n.documents:[];for(let s of t)e.push({...s,testFolder:null});let r=Array.isArray(n.testFolders)?n.testFolders:[];for(let s of r){let i=Array.isArray(s.documents)?s.documents:[];for(let o of i)e.push({...o,testFolder:s})}return e}function es(n,e,t){let r=Zn(n);return e==="project"?r:e==="folder"?r.filter(s=>s.testFolder?.cloudId===t):e==="test"?r.filter(s=>s.cloudId===t):[]}async function kr({projectId:n,targetType:e,targetId:t,apiConfig:r,cacheEnabled:s,silent:i=!1}){let o=new qe({silent:i}),a=se(n),{structure:c,filesIndex:l,cacheData:u}=await jr(a),d=c||{},h=d.id||n,f=es(c,e,t),g=et.default.join(a,"cache-signatures.json"),m={},w=!1,y=!1,C=!1,k=Array.isArray(u.entries)&&u.entries.length>0;if(s)try{if(await _e(g)){let S=await V(g,{});S&&typeof S=="object"&&(m=S),y=!0}}catch{m={},y=!1}if(!f.length)throw new Error("No tests found for the selected target.");let p=et.default.join(a,"cache.json");$r(u.entries||{},s,{cachePath:p,cacheVersion:u.version||null});let b=new Ze(o,r),E=new Xe(o,r),D=Q.startExecutionGroup(),v=d?.queueFailureBehavior==="continueQueue"?"continueQueue":"stopQueue",R=[],O=new Map,T=0,ae=0;for(let S of f){let $=S.testFolder,I=S.resetStateOption||d?.resetStateForEachTest||"test";if(!(S.executeOnCloud!==!1)){ae++,o.addLog(S.cloudId||S.id||"unknown-test","info",`Skipping "${S.name||"Untitled Test"}" (set to run in app only).`);continue}let Z=Q.generateSessionId({...S,projectId:h,testFolderId:$?.id||null},I,D),A=S.id||S.testId||S.cloudId,F=S.name||"Untitled Test",B=Kn(S,d,$);if(!F.trim()||!S.description?.trim()||!B||!B.trim()){T++,o.addLog(A||"unknown-test","warning","Skipping test missing required name, description, or URL.");continue}if(s&&A){let _={...S,url:B,testFolderId:$?.id||S.testFolderId||null},ce=Qn(_,d,$,I),M=m[A];!y&&k&&!C?(Qe(h,A),C=!0):M&&M!==ce&&Qe(h,A),M!==ce&&(m[A]=ce,w=!0)}R.push({testEntry:S,testFolder:$,resetStateOption:I,sessionId:Z,testId:A,testName:F,testUrl:B}),O.set(Z,(O.get(Z)||0)+1)}if(!R.length)throw new Error("No valid tests found for the selected target.");T>0&&o.addLog("system","warning",`Skipping ${T} test(s) without required name, description, or URL.`),ae>0&&o.addLog("system","info",`Skipping ${ae} test(s) marked for app-only execution.`);let K=0,L=0,he=S=>{if(!S)return;let $=O.get(S);if(!$)return;let I=$-1;I<=0?O.delete(S):O.set(S,I)},fe=async(S,$,I=!1)=>{let j=$||S.resetStateOption||"test";if(j!=="never"){if(j==="testFolder"){if(I){await Q.cleanupSession();return}if((O.get(S.sessionId)||0)>1)return}await Q.cleanupSession()}};try{for(let S of R){let{testEntry:$,testFolder:I,resetStateOption:j,sessionId:Z,testId:A,testName:F,testUrl:B}=S,_={id:A,testId:A,sessionId:Z,testName:F,testDescription:$.description||"",projectId:h,testFolderId:I?.id||null,testFolderName:I?.name||null,url:B,actionTimeout:$.actionTimeout||60,testTimeout:$.testTimeout||300,maxSteps:$.maxSteps||50,actions:Array.isArray($.actions)?[...$.actions]:[],files:Xn($,l,a),environment:$.environment||"",role:$.role||"",resetStateOption:j,startedAt:new Date};o.addLog(_.id,"info",`Started executing test "${_.testName}"`);let ce=zn(d,I,_);try{let M=0,pe=!1,z=4,be=!1,Ce=!1;for(;M<z;){Q.shouldResetSession(_,j)&&await Q.cleanupSession(),Q.updateSessionTracking(_.sessionId,_.testFolderId);try{let me=await b.executeActions(_.sessionId,_.id,ce,"before",j,_.testFolderId,_.projectId,{enableCache:!pe,projectId:h,testId:A});if(!me?.success){let ge=new Error(`Before actions failed: ${me?.message||"Unknown error"}`);throw ge.shouldRetryWithoutCache=!0,me?.usedCache&&(ge.cacheUsed=!0),ge}let De=await q.getPageState(_.sessionId,_.url,null,j,_.testFolderId,_.projectId);if(!De?.success)throw new Error(De?.error||"Failed to capture initial page state");await E.executeTestSteps(_,De,j,{enableCache:!pe});let tt=await b.executeActions(_.sessionId,_.id,ce,"after",j,_.testFolderId,_.projectId,{enableCache:!pe,projectId:h,testId:A});if(!tt?.success){let ge=new Error(`After actions failed: ${tt?.message||"Unknown error"}`);throw ge.shouldRetryWithoutCache=!0,tt?.usedCache&&(ge.cacheUsed=!0),ge}o.addLog(_.id,"success",`Test "${_.testName}" completed successfully`),be=!0;break}catch(me){if(!pe&&!!me?.shouldRetryWithoutCache){pe=!0,Qe(_.projectId,A||null),Or(_.sessionId),o.addLog(_.id,"warning",`Cache invalidated after failure - retrying test "${_.testName}" without cache`),await Q.cleanupSession(),_.startedAt=new Date,M++;continue}o.addLog(_.id,"error",`Test "${_.testName}" failed`,me.message||String(me)),Ce=!0;break}}be?K++:Ce&&L++,await fe(_,j,Ce&&v==="stopQueue"),he(_.sessionId)}catch(M){o.addLog(_.id,"error",`Test "${_.testName}" failed`,M.message||String(M)),L++,await fe(_,j,v==="stopQueue"),he(_.sessionId)}if(L>0&&v==="stopQueue")break}}finally{await Q.cleanupSession()}if(s&&w)try{await Y(g,m)}catch{}return L>0?{success:!1,passed:K,failed:L,total:R.length}:{success:!0,passed:K,failed:L,total:R.length}}var ts=n=>n?.name==="ExperimentalWarning"&&/buffer\.File/i.test(n?.message||"");process.on("warning",n=>{if(ts(n))return;let e=n?.stack||`${n?.name||"Warning"}: ${n?.message||""}`.trim();e&&console.warn(e)});var J=new Yt,rs="1.1.4";J.name("agenqa").description("Agenqa CLI for cloud projects").version(rs);process.on("SIGINT",()=>{console.log(`
43
+ Interrupted. Exiting.`),process.exit(130)});function Dr(n,e,t){let r=Ct(t||$e(n,e));if(!r)throw new Error("API base URL is not configured in this build.");return r}function Dt(n,e){if(n===void 0)return null;let t=String(n).trim().toLowerCase();if(["y","yes"].includes(t))return!0;if(["n","no"].includes(t))return!1;console.error(`Invalid value for ${e}. Use "yes" or "no".`),process.exit(1)}function It(n){console.log(`Synced project ${n.project?.name||n.project?.id}`),console.log(`Files: ${n.files.downloaded} downloaded, ${n.files.skipped} skipped, ${n.files.removed} removed.`),n.cache&&(n.cacheDisabledGlobally?console.log("Cache disabled globally for this project."):console.log("Cache synced."))}function ns(n){return typeof n?.cacheCloudEnabled=="boolean"?n.cacheCloudEnabled:!!n?.cacheEnabled}function ss(n){return typeof n?.cacheLocalEnabled=="boolean"?n.cacheLocalEnabled:!!n?.cacheEnabled}async function Fe(n){throw ar(n)&&(console.error("Cloud key is invalid or expired. Please re-import the project."),process.exit(2)),n}J.command("import").description("Import a cloud project using project id and secret key").requiredOption("-p, --project <projectId>","Cloud project id").requiredOption("-s, --key-secret <secret>","Cloud key secret").option("--trust <yes|no>","Skip trust prompt by answering yes or no").option("--cache-local <yes|no>","Skip local cache prompt by answering yes or no").option("--cache-cloud <yes|no>","Skip cloud cache prompt by answering yes or no").action(async n=>{let e=await ne(),t=n.project.trim(),r=n.keySecret.trim(),s=Dr(e,t),i=Dt(n.trust,"--trust"),o=Dt(n.cacheLocal,"--cache-local"),a=Dt(n.cacheCloud,"--cache-cloud");(i??await ye("Importing projects from unknown sources can expose you to risks. Do you confirm you trust this project? (yes/no)",{required:!0}))!==!0&&(console.error("Import cancelled."),process.exit(1));let u=(o??await ye("Enable local cache on this machine? (required for cloud cache) (yes/no)"))===!0,d=!1;u?d=(a??await ye("Enable cloud cache? (warning: reuses collaborators' cached steps; only enable if you trust them to avoid security risks) (yes/no)"))===!0:a===!0&&(console.error("Cloud cache requires local cache. Re-run with --cache-local yes or omit --cache-cloud."),process.exit(1));let h={keyToken:r,cacheCloudEnabled:d,cacheLocalEnabled:u,baseUrl:s,importedAt:new Date().toISOString()};e.projects[t]=h,await Ae(e),await Te(t);try{let f=await He(e,t);It(f),console.log("Import completed.")}catch(f){await Fe(f),console.error(f.message||String(f)),process.exit(1)}});J.command("list").description("List stored projects").action(async()=>{let n=await ne(),e=Object.entries(n.projects||{});if(e.length===0){console.log("No projects imported.");return}let t=[];for(let[a,c]of e){let l=null;try{l=await V(Fr.default.join(se(a),"project.json"),null)}catch(f){console.error(`Warning: failed to read metadata for project ${a}: ${f.message||f}`)}let u=ns(c)?"enabled":"disabled",d=c.importedAt||"import time unknown",h=$e(n,a)||"base URL not set";t.push([a,l?.name||"",h,u,d])}let r=["Project ID","Name","Base URL","Cache","Imported At"],s=r.map((a,c)=>Math.max(a.length,...t.map(l=>(l[c]||"").length))),i=s.map(a=>"-".repeat(a)).join("-+-"),o=a=>a.map((c,l)=>String(c||"").padEnd(s[l]," ")).join(" | ");console.log("Stored projects:"),console.log(o(r)),console.log(i),t.forEach(a=>console.log(o(a)))});J.command("sync").description("Sync a cloud project locally").requiredOption("-p, --project <projectId>","Cloud project id").action(async n=>{let e=await ne(),t=n.project.trim();try{let r=await He(e,t);It(r)}catch(r){await Fe(r),console.error(r.message||String(r)),process.exit(1)}});J.command("remove-project").description("Remove an imported project and local data").requiredOption("-p, --project <projectId>","Cloud project id").action(async n=>{let e=n.project.trim(),t=await ne();t.projects?.[e]||(console.error(`Project ${e} is not imported. Run "agenqa import" first.`),process.exit(1)),await ye(`Remove local data for project ${e}? This does not delete the cloud project. (yes/no)`,{required:!0})||(console.error("Remove cancelled."),process.exit(1)),delete t.projects[e],await Ae(t),await bt(e),console.log(`Removed local data for project ${e}.`)});J.command("cache").description("Enable or disable cloud cache for a project").requiredOption("-p, --project <projectId>","Project id").option("--enable","Enable cache").option("--disable","Disable cache").action(async n=>{let e=n.project.trim(),t=n.enable===!0?!0:n.disable===!0?!1:null;t===null&&(console.error("Choose either --enable or --disable."),process.exit(1));let r=await ne(),s=r.projects?.[e];s||(console.error(`Project ${e} is not imported. Run "agenqa import" first.`),process.exit(1)),t&&(console.log("Warning: cache reuses generated steps from collaborators. Enable only if you trust the project sources."),await ye("Do you want to enable cache? (yes/no)",{required:!0})||(console.error("Cache enable cancelled."),process.exit(1))),s.cacheCloudEnabled=t,s.cacheEnabled!==void 0&&(s.cacheEnabled=t),await Ae(r),console.log(`Cache ${t?"enabled":"disabled"} for project ${e}.`)});J.command("reset-cache").description("Clear local cache (cloud cache downloads and local-only cache)").requiredOption("-p, --project <projectId>","Project id").action(async n=>{let e=n.project.trim();(await ne()).projects?.[e]||(console.error(`Project ${e} is not imported. Run "agenqa import" first.`),process.exit(1)),await ye(`Reset local cache for project ${e}? (yes/no)`,{required:!0})||(console.error("Reset cache cancelled."),process.exit(1)),await Te(e),console.log(`Local cache cleared for project ${e}.`)});async function Nt({projectId:n,targetType:e,targetId:t,cacheOverride:r,silent:s}){let i=await ne(),o=i.projects?.[n];if(!o)throw new Error(`Project ${n} is not imported. Run "agenqa import" first.`);let a=Dr(i,n,o.baseUrl),c=await He(i,n,{cacheOverride:r}),l=!!c?.cacheDisabledGlobally;if(c?.project?.readOnly)throw new Error("This cloud project is read-only on your current plan. Convert to local-only to run tests.");s||It(c);let u=l?!1:r!==null?r:ss(o),d=Ve(o,n),h=await kr({projectId:n,targetType:e,targetId:t,cacheEnabled:u,silent:s,apiConfig:{runTestUrl:`${a}/cloud/cli/run-test`,headers:d}});s||console.log(`Summary: ${h.passed}/${h.total} passed, ${h.failed} failed.`),h.success||process.exit(1)}function Lt(n){return n.cache===void 0?null:!!n.cache}J.command("run-project").description("Execute a cloud project").requiredOption("-p, --project <projectId>","Cloud project id").option("--cache","Enable cache").option("--no-cache","Disable cache").option("--silent","Suppress non-error logs").action(async n=>{try{await Nt({projectId:n.project.trim(),targetType:"project",targetId:null,cacheOverride:Lt(n),silent:!!n.silent})}catch(e){await Fe(e),console.error(e.message||String(e)),process.exit(1)}});J.command("run-folder").description("Execute a cloud test folder").requiredOption("-p, --project <projectId>","Cloud project id").requiredOption("-f, --folder <folderId>","Cloud test folder id").option("--cache","Enable cache").option("--no-cache","Disable cache").option("--silent","Suppress non-error logs").action(async n=>{try{await Nt({projectId:n.project.trim(),targetType:"folder",targetId:n.folder.trim(),cacheOverride:Lt(n),silent:!!n.silent})}catch(e){await Fe(e),console.error(e.message||String(e)),process.exit(1)}});J.command("run-test").description("Execute a single cloud test case").requiredOption("-p, --project <projectId>","Cloud project id").requiredOption("-t, --test <testId>","Cloud test case id").option("--cache","Enable cache").option("--no-cache","Disable cache").option("--silent","Suppress non-error logs").action(async n=>{try{await Nt({projectId:n.project.trim(),targetType:"test",targetId:n.test.trim(),cacheOverride:Lt(n),silent:!!n.silent})}catch(e){await Fe(e),console.error(e.message||String(e)),process.exit(1)}});J.parseAsync(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agenqa",
3
- "version": "1.1.3",
3
+ "version": "1.1.4",
4
4
  "description": "AgenQA CLI for running cloud projects",
5
5
  "type": "module",
6
6
  "bin": {