@devassure/cli 1.0.5 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +169 -3
- package/dist/index.js +18 -16
- package/package.json +2 -2
- package/scripts/check-node-version.cjs +15 -0
- package/scripts/run-devassure.cjs +29 -0
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {createRequire}from'module';import*as k from'fs';import {Command}from'commander';import*as B from'path';import {fileURLToPath}from'url';import $e from'chalk';import Oe from'picocolors';import {Box,Text,render,useInput}from'ink';import z$1,{useMemo,useCallback,useState,useRef,useEffect}from'react';import*as $ from'fs/promises';import*as
|
|
2
|
+
import {createRequire}from'module';import*as k from'fs';import {Command}from'commander';import*as B from'path';import {fileURLToPath}from'url';import $e from'chalk';import Oe from'picocolors';import {Box,Text,render,useInput}from'ink';import z$1,{useMemo,useCallback,useState,useRef,useEffect}from'react';import*as $ from'fs/promises';import*as de from'os';import {z}from'zod';import {v4}from'uuid';import {PostHog}from'posthog-node';import*as we from'crypto';import*as Rr from'http';import {spawn}from'child_process';import {promisify}from'util';import St from'semver';import*as Lr from'https';import {pipeline}from'stream/promises';import*as gs from'js-yaml';import _o from'ink-text-input';import {ConfirmInput,Select,MultiSelect}from'@inkjs/ui';import oa from'open';const require$1 = createRequire(import.meta.url);
|
|
3
3
|
globalThis.require = require$1;
|
|
4
4
|
|
|
5
|
-
var Zn=Object.create;var xs=Object.defineProperty;var Xn=Object.getOwnPropertyDescriptor;var Jn=Object.getOwnPropertyNames;var Qn=Object.getPrototypeOf,ei=Object.prototype.hasOwnProperty;var ke=(e=>typeof require$1<"u"?require$1:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require$1<"u"?require$1:t)[s]}):e)(function(e){if(typeof require$1<"u")return require$1.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var oe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ti=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Jn(t))!ei.call(e,n)&&n!==s&&xs(e,n,{get:()=>t[n],enumerable:!(r=Xn(t,n))||r.enumerable});return e};var si=(e,t,s)=>(s=e!=null?Zn(Qn(e)):{},ti(xs(s,"default",{value:e,enumerable:true}),e));var ss=oe((ha,ks)=>{ks.exports={LOCHDR:30,LOCSIG:67324752,LOCVER:4,LOCFLG:6,LOCHOW:8,LOCTIM:10,LOCCRC:14,LOCSIZ:18,LOCLEN:22,LOCNAM:26,LOCEXT:28,EXTSIG:134695760,EXTHDR:16,EXTCRC:4,EXTSIZ:8,EXTLEN:12,CENHDR:46,CENSIG:33639248,CENVEM:4,CENVER:6,CENFLG:8,CENHOW:10,CENTIM:12,CENCRC:16,CENSIZ:20,CENLEN:24,CENNAM:28,CENEXT:30,CENCOM:32,CENDSK:34,CENATT:36,CENATX:38,CENOFF:42,ENDHDR:22,ENDSIG:101010256,ENDSUB:8,ENDTOT:10,ENDSIZ:12,ENDOFF:16,ENDCOM:20,END64HDR:20,END64SIG:117853008,END64START:4,END64OFF:8,END64NUMDISKS:16,ZIP64SIG:101075792,ZIP64HDR:56,ZIP64LEAD:12,ZIP64SIZE:4,ZIP64VEM:12,ZIP64VER:14,ZIP64DSK:16,ZIP64DSKDIR:20,ZIP64SUB:24,ZIP64TOT:32,ZIP64SIZB:40,ZIP64OFF:48,ZIP64EXTRA:56,STORED:0,SHRUNK:1,REDUCED1:2,REDUCED2:3,REDUCED3:4,REDUCED4:5,IMPLODED:6,DEFLATED:8,ENHANCED_DEFLATED:9,PKWARE:10,BZIP2:12,LZMA:14,IBM_TERSE:18,IBM_LZ77:19,AES_ENCRYPT:99,FLG_ENC:1,FLG_COMP1:2,FLG_COMP2:4,FLG_DESC:8,FLG_ENH:16,FLG_PATCH:32,FLG_STR:64,FLG_EFS:2048,FLG_MSK:4096,FILE:2,BUFFER:1,NONE:0,EF_ID:0,EF_SIZE:2,ID_ZIP64:1,ID_AVINFO:7,ID_PFS:8,ID_OS2:9,ID_NTFS:10,ID_OPENVMS:12,ID_UNIX:13,ID_FORK:14,ID_PATCH:15,ID_X509_PKCS7:20,ID_X509_CERTID_F:21,ID_X509_CERTID_C:22,ID_STRONGENC:23,ID_RECORD_MGT:24,ID_X509_PKCS7_RL:25,ID_IBM1:101,ID_IBM2:102,ID_POSZIP:18064,EF_ZIP64_OR_32:4294967295,EF_ZIP64_OR_16:65535,EF_ZIP64_SUNCOMP:0,EF_ZIP64_SCOMP:8,EF_ZIP64_RHO:16,EF_ZIP64_DSN:24};});var It=oe($s=>{var Bs={INVALID_LOC:"Invalid LOC header (bad signature)",INVALID_CEN:"Invalid CEN header (bad signature)",INVALID_END:"Invalid END header (bad signature)",DESCRIPTOR_NOT_EXIST:"No descriptor present",DESCRIPTOR_UNKNOWN:"Unknown descriptor format",DESCRIPTOR_FAULTY:"Descriptor data is malformed",NO_DATA:"Nothing to decompress",BAD_CRC:"CRC32 checksum failed {0}",FILE_IN_THE_WAY:"There is a file in the way: {0}",UNKNOWN_METHOD:"Invalid/unsupported compression method",AVAIL_DATA:"inflate::Available inflate data did not terminate",INVALID_DISTANCE:"inflate::Invalid literal/length or distance code in fixed or dynamic block",TO_MANY_CODES:"inflate::Dynamic block code description: too many length or distance codes",INVALID_REPEAT_LEN:"inflate::Dynamic block code description: repeat more than specified lengths",INVALID_REPEAT_FIRST:"inflate::Dynamic block code description: repeat lengths with no first length",INCOMPLETE_CODES:"inflate::Dynamic block code description: code lengths codes incomplete",INVALID_DYN_DISTANCE:"inflate::Dynamic block code description: invalid distance code lengths",INVALID_CODES_LEN:"inflate::Dynamic block code description: invalid literal/length code lengths",INVALID_STORE_BLOCK:"inflate::Stored block length did not match one's complement",INVALID_BLOCK_TYPE:"inflate::Invalid block type (type == 3)",CANT_EXTRACT_FILE:"Could not extract the file",CANT_OVERRIDE:"Target file already exists",DISK_ENTRY_TOO_LARGE:"Number of disk entries is too large",NO_ZIP:"No zip file was loaded",NO_ENTRY:"Entry doesn't exist",DIRECTORY_CONTENT_ERROR:"A directory cannot have content",FILE_NOT_FOUND:'File not found: "{0}"',NOT_IMPLEMENTED:"Not implemented",INVALID_FILENAME:"Invalid filename",INVALID_FORMAT:"Invalid or unsupported zip format. No END header found",INVALID_PASS_PARAM:"Incompatible password parameter",WRONG_PASSWORD:"Wrong Password",COMMENT_TOO_LONG:"Comment is too long",EXTRA_FIELD_PARSE_ERROR:"Extra field parsing error"};function ii(e){return function(...t){return t.length&&(e=e.replace(/\{(\d)\}/g,(s,r)=>t[r]||"")),new Error("ADM-ZIP: "+e)}}for(let e of Object.keys(Bs))$s[e]=ii(Bs[e]);});var js=oe((wa,Gs)=>{var oi=ke("fs"),se=ke("path"),Us=ss(),ai=It(),ci=typeof process=="object"&&process.platform==="win32",Hs=e=>typeof e=="object"&&e!==null,zs=new Uint32Array(256).map((e,t)=>{for(let s=0;s<8;s++)(t&1)!==0?t=3988292384^t>>>1:t>>>=1;return t>>>0});function K(e){this.sep=se.sep,this.fs=oi,Hs(e)&&Hs(e.fs)&&typeof e.fs.statSync=="function"&&(this.fs=e.fs);}Gs.exports=K;K.prototype.makeDir=function(e){let t=this;function s(r){let n=r.split(t.sep)[0];r.split(t.sep).forEach(function(i){if(!(!i||i.substr(-1,1)===":")){n+=t.sep+i;var o;try{o=t.fs.statSync(n);}catch{t.fs.mkdirSync(n);}if(o&&o.isFile())throw ai.FILE_IN_THE_WAY(`"${n}"`)}});}s(e);};K.prototype.writeFileTo=function(e,t,s,r){let n=this;if(n.fs.existsSync(e)){if(!s)return false;var i=n.fs.statSync(e);if(i.isDirectory())return false}var o=se.dirname(e);n.fs.existsSync(o)||n.makeDir(o);var c;try{c=n.fs.openSync(e,"w",438);}catch{n.fs.chmodSync(e,438),c=n.fs.openSync(e,"w",438);}if(c)try{n.fs.writeSync(c,t,0,t.length,0);}finally{n.fs.closeSync(c);}return n.fs.chmodSync(e,r||438),true};K.prototype.writeFileToAsync=function(e,t,s,r,n){typeof r=="function"&&(n=r,r=void 0);let i=this;i.fs.exists(e,function(o){if(o&&!s)return n(false);i.fs.stat(e,function(c,d){if(o&&d.isDirectory())return n(false);var u=se.dirname(e);i.fs.exists(u,function(g){g||i.makeDir(u),i.fs.open(e,"w",438,function(I,v){I?i.fs.chmod(e,438,function(){i.fs.open(e,"w",438,function(a,m){i.fs.write(m,t,0,t.length,0,function(){i.fs.close(m,function(){i.fs.chmod(e,r||438,function(){n(true);});});});});}):v?i.fs.write(v,t,0,t.length,0,function(){i.fs.close(v,function(){i.fs.chmod(e,r||438,function(){n(true);});});}):i.fs.chmod(e,r||438,function(){n(true);});});});});});};K.prototype.findFiles=function(e){let t=this;function s(r,n,i){let o=[];return t.fs.readdirSync(r).forEach(function(c){let d=se.join(r,c),u=t.fs.statSync(d);o.push(se.normalize(d)+(u.isDirectory()?t.sep:"")),u.isDirectory()&&i&&(o=o.concat(s(d,n,i)));}),o}return s(e,void 0,true)};K.prototype.findFilesAsync=function(e,t){let s=this,r=[];s.fs.readdir(e,function(n,i){if(n)return t(n);let o=i.length;if(!o)return t(null,r);i.forEach(function(c){c=se.join(e,c),s.fs.stat(c,function(d,u){if(d)return t(d);u&&(r.push(se.normalize(c)+(u.isDirectory()?s.sep:"")),u.isDirectory()?s.findFilesAsync(c,function(g,I){if(g)return t(g);r=r.concat(I),--o||t(null,r);}):--o||t(null,r));});});});};K.prototype.getAttributes=function(){};K.prototype.setAttributes=function(){};K.crc32update=function(e,t){return zs[(e^t)&255]^e>>>8};K.crc32=function(e){typeof e=="string"&&(e=Buffer.from(e,"utf8"));let t=e.length,s=-1;for(let r=0;r<t;)s=K.crc32update(s,e[r++]);return ~s>>>0};K.methodToString=function(e){switch(e){case Us.STORED:return "STORED ("+e+")";case Us.DEFLATED:return "DEFLATED ("+e+")";default:return "UNSUPPORTED ("+e+")"}};K.canonical=function(e){if(!e)return "";let t=se.posix.normalize("/"+e.split("\\").join("/"));return se.join(".",t)};K.zipnamefix=function(e){if(!e)return "";let t=se.posix.normalize("/"+e.split("\\").join("/"));return se.posix.join(".",t)};K.findLast=function(e,t){if(!Array.isArray(e))throw new TypeError("arr is not array");let s=e.length>>>0;for(let r=s-1;r>=0;r--)if(t(e[r],r,e))return e[r]};K.sanitize=function(e,t){e=se.resolve(se.normalize(e));for(var s=t.split("/"),r=0,n=s.length;r<n;r++){var i=se.normalize(se.join(e,s.slice(r,n).join(se.sep)));if(i.indexOf(e)===0)return i}return se.normalize(se.join(e,se.basename(t)))};K.toBuffer=function(t,s){return Buffer.isBuffer(t)?t:t instanceof Uint8Array?Buffer.from(t):typeof t=="string"?s(t):Buffer.alloc(0)};K.readBigUInt64LE=function(e,t){var s=Buffer.from(e.slice(t,t+8));return s.swap64(),parseInt(`0x${s.toString("hex")}`)};K.fromDOS2Date=function(e){return new Date((e>>25&127)+1980,Math.max((e>>21&15)-1,0),Math.max(e>>16&31,1),e>>11&31,e>>5&63,(e&31)<<1)};K.fromDate2DOS=function(e){let t=0,s=0;return e.getFullYear()>1979&&(t=(e.getFullYear()-1980&127)<<9|e.getMonth()+1<<5|e.getDate(),s=e.getHours()<<11|e.getMinutes()<<5|e.getSeconds()>>1),t<<16|s};K.isWin=ci;K.crcTable=zs;});var Vs=oe((Sa,Ws)=>{var li=ke("path");Ws.exports=function(e,{fs:t}){var s=e||"",r=i(),n=null;function i(){return {directory:false,readonly:false,hidden:false,executable:false,mtime:0,atime:0}}return s&&t.existsSync(s)?(n=t.statSync(s),r.directory=n.isDirectory(),r.mtime=n.mtime,r.atime=n.atime,r.executable=(73&n.mode)!==0,r.readonly=(128&n.mode)===0,r.hidden=li.basename(s)[0]==="."):console.warn("Invalid path: "+s),{get directory(){return r.directory},get readOnly(){return r.readonly},get hidden(){return r.hidden},get mtime(){return r.mtime},get atime(){return r.atime},get executable(){return r.executable},decodeAttributes:function(){},encodeAttributes:function(){},toJSON:function(){return {path:s,isDirectory:r.directory,isReadOnly:r.readonly,isHidden:r.hidden,isExecutable:r.executable,mTime:r.mtime,aTime:r.atime}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var qs=oe((Ea,Ys)=>{Ys.exports={efs:true,encode:e=>Buffer.from(e,"utf8"),decode:e=>e.toString("utf8")};});var Ve=oe((Ia,We)=>{We.exports=js();We.exports.Constants=ss();We.exports.Errors=It();We.exports.FileAttr=Vs();We.exports.decoder=qs();});var Zs=oe((Ca,Ks)=>{var Fe=Ve(),A=Fe.Constants;Ks.exports=function(){var e=20,t=10,s=0,r=0,n=0,i=0,o=0,c=0,d=0,u=0,g=0,I=0,v=0,a=0,m=0;e|=Fe.isWin?2560:768,s|=A.FLG_EFS;let p={extraLen:0},f=l=>Math.max(0,l)>>>0,E=l=>Math.max(0,l)&255;return n=Fe.fromDate2DOS(new Date),{get made(){return e},set made(l){e=l;},get version(){return t},set version(l){t=l;},get flags(){return s},set flags(l){s=l;},get flags_efs(){return (s&A.FLG_EFS)>0},set flags_efs(l){l?s|=A.FLG_EFS:s&=~A.FLG_EFS;},get flags_desc(){return (s&A.FLG_DESC)>0},set flags_desc(l){l?s|=A.FLG_DESC:s&=~A.FLG_DESC;},get method(){return r},set method(l){switch(l){case A.STORED:this.version=10;case A.DEFLATED:default:this.version=20;}r=l;},get time(){return Fe.fromDOS2Date(this.timeval)},set time(l){this.timeval=Fe.fromDate2DOS(l);},get timeval(){return n},set timeval(l){n=f(l);},get timeHighByte(){return E(n>>>8)},get crc(){return i},set crc(l){i=f(l);},get compressedSize(){return o},set compressedSize(l){o=f(l);},get size(){return c},set size(l){c=f(l);},get fileNameLength(){return d},set fileNameLength(l){d=l;},get extraLength(){return u},set extraLength(l){u=l;},get extraLocalLength(){return p.extraLen},set extraLocalLength(l){p.extraLen=l;},get commentLength(){return g},set commentLength(l){g=l;},get diskNumStart(){return I},set diskNumStart(l){I=f(l);},get inAttr(){return v},set inAttr(l){v=f(l);},get attr(){return a},set attr(l){a=f(l);},get fileAttr(){return (a||0)>>16&4095},get offset(){return m},set offset(l){m=f(l);},get encrypted(){return (s&A.FLG_ENC)===A.FLG_ENC},get centralHeaderSize(){return A.CENHDR+d+u+g},get realDataOffset(){return m+A.LOCHDR+p.fnameLen+p.extraLen},get localHeader(){return p},loadLocalHeaderFromBinary:function(l){var C=l.slice(m,m+A.LOCHDR);if(C.readUInt32LE(0)!==A.LOCSIG)throw Fe.Errors.INVALID_LOC();p.version=C.readUInt16LE(A.LOCVER),p.flags=C.readUInt16LE(A.LOCFLG),p.method=C.readUInt16LE(A.LOCHOW),p.time=C.readUInt32LE(A.LOCTIM),p.crc=C.readUInt32LE(A.LOCCRC),p.compressedSize=C.readUInt32LE(A.LOCSIZ),p.size=C.readUInt32LE(A.LOCLEN),p.fnameLen=C.readUInt16LE(A.LOCNAM),p.extraLen=C.readUInt16LE(A.LOCEXT);let h=m+A.LOCHDR+p.fnameLen,_=h+p.extraLen;return l.slice(h,_)},loadFromBinary:function(l){if(l.length!==A.CENHDR||l.readUInt32LE(0)!==A.CENSIG)throw Fe.Errors.INVALID_CEN();e=l.readUInt16LE(A.CENVEM),t=l.readUInt16LE(A.CENVER),s=l.readUInt16LE(A.CENFLG),r=l.readUInt16LE(A.CENHOW),n=l.readUInt32LE(A.CENTIM),i=l.readUInt32LE(A.CENCRC),o=l.readUInt32LE(A.CENSIZ),c=l.readUInt32LE(A.CENLEN),d=l.readUInt16LE(A.CENNAM),u=l.readUInt16LE(A.CENEXT),g=l.readUInt16LE(A.CENCOM),I=l.readUInt16LE(A.CENDSK),v=l.readUInt16LE(A.CENATT),a=l.readUInt32LE(A.CENATX),m=l.readUInt32LE(A.CENOFF);},localHeaderToBinary:function(){var l=Buffer.alloc(A.LOCHDR);return l.writeUInt32LE(A.LOCSIG,0),l.writeUInt16LE(t,A.LOCVER),l.writeUInt16LE(s,A.LOCFLG),l.writeUInt16LE(r,A.LOCHOW),l.writeUInt32LE(n,A.LOCTIM),l.writeUInt32LE(i,A.LOCCRC),l.writeUInt32LE(o,A.LOCSIZ),l.writeUInt32LE(c,A.LOCLEN),l.writeUInt16LE(d,A.LOCNAM),l.writeUInt16LE(p.extraLen,A.LOCEXT),l},centralHeaderToBinary:function(){var l=Buffer.alloc(A.CENHDR+d+u+g);return l.writeUInt32LE(A.CENSIG,0),l.writeUInt16LE(e,A.CENVEM),l.writeUInt16LE(t,A.CENVER),l.writeUInt16LE(s,A.CENFLG),l.writeUInt16LE(r,A.CENHOW),l.writeUInt32LE(n,A.CENTIM),l.writeUInt32LE(i,A.CENCRC),l.writeUInt32LE(o,A.CENSIZ),l.writeUInt32LE(c,A.CENLEN),l.writeUInt16LE(d,A.CENNAM),l.writeUInt16LE(u,A.CENEXT),l.writeUInt16LE(g,A.CENCOM),l.writeUInt16LE(I,A.CENDSK),l.writeUInt16LE(v,A.CENATT),l.writeUInt32LE(a,A.CENATX),l.writeUInt32LE(m,A.CENOFF),l},toJSON:function(){let l=function(C){return C+" bytes"};return {made:e,version:t,flags:s,method:Fe.methodToString(r),time:this.time,crc:"0x"+i.toString(16).toUpperCase(),compressedSize:l(o),size:l(c),fileNameLength:l(d),extraLength:l(u),commentLength:l(g),diskNumStart:I,inAttr:v,attr:a,offset:m,centralHeaderSize:l(A.CENHDR+d+u+g)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var Js=oe((va,Xs)=>{var Ye=Ve(),V=Ye.Constants;Xs.exports=function(){var e=0,t=0,s=0,r=0,n=0;return {get diskEntries(){return e},set diskEntries(i){e=t=i;},get totalEntries(){return t},set totalEntries(i){t=e=i;},get size(){return s},set size(i){s=i;},get offset(){return r},set offset(i){r=i;},get commentLength(){return n},set commentLength(i){n=i;},get mainHeaderSize(){return V.ENDHDR+n},loadFromBinary:function(i){if((i.length!==V.ENDHDR||i.readUInt32LE(0)!==V.ENDSIG)&&(i.length<V.ZIP64HDR||i.readUInt32LE(0)!==V.ZIP64SIG))throw Ye.Errors.INVALID_END();i.readUInt32LE(0)===V.ENDSIG?(e=i.readUInt16LE(V.ENDSUB),t=i.readUInt16LE(V.ENDTOT),s=i.readUInt32LE(V.ENDSIZ),r=i.readUInt32LE(V.ENDOFF),n=i.readUInt16LE(V.ENDCOM)):(e=Ye.readBigUInt64LE(i,V.ZIP64SUB),t=Ye.readBigUInt64LE(i,V.ZIP64TOT),s=Ye.readBigUInt64LE(i,V.ZIP64SIZE),r=Ye.readBigUInt64LE(i,V.ZIP64OFF),n=0);},toBinary:function(){var i=Buffer.alloc(V.ENDHDR+n);return i.writeUInt32LE(V.ENDSIG,0),i.writeUInt32LE(0,4),i.writeUInt16LE(e,V.ENDSUB),i.writeUInt16LE(t,V.ENDTOT),i.writeUInt32LE(s,V.ENDSIZ),i.writeUInt32LE(r,V.ENDOFF),i.writeUInt16LE(n,V.ENDCOM),i.fill(" ",V.ENDHDR),i},toJSON:function(){let i=function(o,c){let d=o.toString(16).toUpperCase();for(;d.length<c;)d="0"+d;return "0x"+d};return {diskEntries:e,totalEntries:t,size:s+" bytes",offset:i(r,4),commentLength:n}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var ns=oe(rs=>{rs.EntryHeader=Zs();rs.MainHeader=Js();});var er=oe((ba,Qs)=>{Qs.exports=function(e){var t=ke("zlib"),s={chunkSize:(parseInt(e.length/1024)+1)*1024};return {deflate:function(){return t.deflateRawSync(e,s)},deflateAsync:function(r){var n=t.createDeflateRaw(s),i=[],o=0;n.on("data",function(c){i.push(c),o+=c.length;}),n.on("end",function(){var c=Buffer.alloc(o),d=0;c.fill(0);for(var u=0;u<i.length;u++){var g=i[u];g.copy(c,d),d+=g.length;}r&&r(c);}),n.end(e);}}};});var sr=oe((Ra,tr)=>{var ui=+(process.versions?process.versions.node:"").split(".")[0]||0;tr.exports=function(e,t){var s=ke("zlib");let r=ui>=15&&t>0?{maxOutputLength:t}:{};return {inflate:function(){return s.inflateRawSync(e,r)},inflateAsync:function(n){var i=s.createInflateRaw(r),o=[],c=0;i.on("data",function(d){o.push(d),c+=d.length;}),i.on("end",function(){var d=Buffer.alloc(c),u=0;d.fill(0);for(var g=0;g<o.length;g++){var I=o[g];I.copy(d,u),u+=I.length;}n&&n(d);}),i.end(e);}}};});var ar=oe((_a,or)=>{var{randomFillSync:rr}=ke("crypto"),di=It(),pi=new Uint32Array(256).map((e,t)=>{for(let s=0;s<8;s++)(t&1)!==0?t=t>>>1^3988292384:t>>>=1;return t>>>0}),ir=(e,t)=>Math.imul(e,t)>>>0,nr=(e,t)=>pi[(e^t)&255]^e>>>8,ot=()=>typeof rr=="function"?rr(Buffer.alloc(12)):ot.node();ot.node=()=>{let e=Buffer.alloc(12),t=e.length;for(let s=0;s<t;s++)e[s]=Math.random()*256&255;return e};var Ct={genSalt:ot};function vt(e){let t=Buffer.isBuffer(e)?e:Buffer.from(e);this.keys=new Uint32Array([305419896,591751049,878082192]);for(let s=0;s<t.length;s++)this.updateKeys(t[s]);}vt.prototype.updateKeys=function(e){let t=this.keys;return t[0]=nr(t[0],e),t[1]+=t[0]&255,t[1]=ir(t[1],134775813)+1,t[2]=nr(t[2],t[1]>>>24),e};vt.prototype.next=function(){let e=(this.keys[2]|2)>>>0;return ir(e,e^1)>>8&255};function fi(e){let t=new vt(e);return function(s){let r=Buffer.alloc(s.length),n=0;for(let i of s)r[n++]=t.updateKeys(i^t.next());return r}}function gi(e){let t=new vt(e);return function(s,r,n=0){r||(r=Buffer.alloc(s.length));for(let i of s){let o=t.next();r[n++]=i^o,t.updateKeys(i);}return r}}function mi(e,t,s){if(!e||!Buffer.isBuffer(e)||e.length<12)return Buffer.alloc(0);let r=fi(s),n=r(e.slice(0,12)),i=(t.flags&8)===8?t.timeHighByte:t.crc>>>24;if(n[11]!==i)throw di.WRONG_PASSWORD();return r(e.slice(12))}function hi(e){Buffer.isBuffer(e)&&e.length>=12?Ct.genSalt=function(){return e.slice(0,12)}:e==="node"?Ct.genSalt=ot.node:Ct.genSalt=ot;}function yi(e,t,s,r=false){e==null&&(e=Buffer.alloc(0)),Buffer.isBuffer(e)||(e=Buffer.from(e.toString()));let n=gi(s),i=Ct.genSalt();i[11]=t.crc>>>24&255,r&&(i[10]=t.crc>>>16&255);let o=Buffer.alloc(e.length+12);return n(i,o),n(e,o,12)}or.exports={decrypt:mi,encrypt:yi,_salter:hi};});var cr=oe(Tt=>{Tt.Deflater=er();Tt.Inflater=sr();Tt.ZipCrypto=ar();});var os=oe((Aa,lr)=>{var H=Ve(),wi=ns(),Z=H.Constants,is=cr();lr.exports=function(e,t){var s=new wi.EntryHeader,r=Buffer.alloc(0),n=Buffer.alloc(0),i=false,o=null,c=Buffer.alloc(0),d=Buffer.alloc(0),u=true;let g=e,I=typeof g.decoder=="object"?g.decoder:H.decoder;u=I.hasOwnProperty("efs")?I.efs:false;function v(){return !t||!(t instanceof Uint8Array)?Buffer.alloc(0):(d=s.loadLocalHeaderFromBinary(t),t.slice(s.realDataOffset,s.realDataOffset+s.compressedSize))}function a(l){if(s.flags_desc){let C={},h=s.realDataOffset+s.compressedSize;if(t.readUInt32LE(h)==Z.LOCSIG||t.readUInt32LE(h)==Z.CENSIG)throw H.Errors.DESCRIPTOR_NOT_EXIST();if(t.readUInt32LE(h)==Z.EXTSIG)C.crc=t.readUInt32LE(h+Z.EXTCRC),C.compressedSize=t.readUInt32LE(h+Z.EXTSIZ),C.size=t.readUInt32LE(h+Z.EXTLEN);else if(t.readUInt16LE(h+12)===19280)C.crc=t.readUInt32LE(h+Z.EXTCRC-4),C.compressedSize=t.readUInt32LE(h+Z.EXTSIZ-4),C.size=t.readUInt32LE(h+Z.EXTLEN-4);else throw H.Errors.DESCRIPTOR_UNKNOWN();if(C.compressedSize!==s.compressedSize||C.size!==s.size||C.crc!==s.crc)throw H.Errors.DESCRIPTOR_FAULTY();if(H.crc32(l)!==C.crc)return false}else if(H.crc32(l)!==s.localHeader.crc)return false;return true}function m(l,C,h){if(typeof C>"u"&&typeof l=="string"&&(h=l,l=void 0),i)return l&&C&&C(Buffer.alloc(0),H.Errors.DIRECTORY_CONTENT_ERROR()),Buffer.alloc(0);var _=v();if(_.length===0)return l&&C&&C(_),_;if(s.encrypted){if(typeof h!="string"&&!Buffer.isBuffer(h))throw H.Errors.INVALID_PASS_PARAM();_=is.ZipCrypto.decrypt(_,s,h);}var T=Buffer.alloc(s.size);switch(s.method){case H.Constants.STORED:if(_.copy(T),a(T))return l&&C&&C(T),T;throw l&&C&&C(T,H.Errors.BAD_CRC()),H.Errors.BAD_CRC();case H.Constants.DEFLATED:var P=new is.Inflater(_,s.size);if(l)P.inflateAsync(function(x){x.copy(x,0),C&&(a(x)?C(x):C(x,H.Errors.BAD_CRC()));});else {if(P.inflate(T).copy(T,0),!a(T))throw H.Errors.BAD_CRC(`"${I.decode(r)}"`);return T}break;default:throw l&&C&&C(Buffer.alloc(0),H.Errors.UNKNOWN_METHOD()),H.Errors.UNKNOWN_METHOD()}}function p(l,C){if((!o||!o.length)&&Buffer.isBuffer(t))return l&&C&&C(v()),v();if(o.length&&!i){var h;switch(s.method){case H.Constants.STORED:return s.compressedSize=s.size,h=Buffer.alloc(o.length),o.copy(h),l&&C&&C(h),h;default:case H.Constants.DEFLATED:var _=new is.Deflater(o);if(l)_.deflateAsync(function(P){h=Buffer.alloc(P.length),s.compressedSize=P.length,P.copy(h),C&&C(h);});else {var T=_.deflate();return s.compressedSize=T.length,T}_=null;break}}else if(l&&C)C(Buffer.alloc(0));else return Buffer.alloc(0)}function f(l,C){return (l.readUInt32LE(C+4)<<4)+l.readUInt32LE(C)}function w(l){try{for(var C=0,h,_,T;C+4<l.length;)h=l.readUInt16LE(C),C+=2,_=l.readUInt16LE(C),C+=2,T=l.slice(C,C+_),C+=_,Z.ID_ZIP64===h&&E(T);}catch{throw H.Errors.EXTRA_FIELD_PARSE_ERROR()}}function E(l){var C,h,_,T;l.length>=Z.EF_ZIP64_SCOMP&&(C=f(l,Z.EF_ZIP64_SUNCOMP),s.size===Z.EF_ZIP64_OR_32&&(s.size=C)),l.length>=Z.EF_ZIP64_RHO&&(h=f(l,Z.EF_ZIP64_SCOMP),s.compressedSize===Z.EF_ZIP64_OR_32&&(s.compressedSize=h)),l.length>=Z.EF_ZIP64_DSN&&(_=f(l,Z.EF_ZIP64_RHO),s.offset===Z.EF_ZIP64_OR_32&&(s.offset=_)),l.length>=Z.EF_ZIP64_DSN+4&&(T=l.readUInt32LE(Z.EF_ZIP64_DSN),s.diskNumStart===Z.EF_ZIP64_OR_16&&(s.diskNumStart=T));}return {get entryName(){return I.decode(r)},get rawEntryName(){return r},set entryName(l){r=H.toBuffer(l,I.encode);var C=r[r.length-1];i=C===47||C===92,s.fileNameLength=r.length;},get efs(){return typeof u=="function"?u(this.entryName):u},get extra(){return c},set extra(l){c=l,s.extraLength=l.length,w(l);},get comment(){return I.decode(n)},set comment(l){if(n=H.toBuffer(l,I.encode),s.commentLength=n.length,n.length>65535)throw H.Errors.COMMENT_TOO_LONG()},get name(){var l=I.decode(r);return i?l.substr(l.length-1).split("/").pop():l.split("/").pop()},get isDirectory(){return i},getCompressedData:function(){return p(false,null)},getCompressedDataAsync:function(l){p(true,l);},setData:function(l){o=H.toBuffer(l,H.decoder.encode),!i&&o.length?(s.size=o.length,s.method=H.Constants.DEFLATED,s.crc=H.crc32(l),s.changed=true):s.method=H.Constants.STORED;},getData:function(l){return s.changed?o:m(false,null,l)},getDataAsync:function(l,C){s.changed?l(o):m(true,l,C);},set attr(l){s.attr=l;},get attr(){return s.attr},set header(l){s.loadFromBinary(l);},get header(){return s},packCentralHeader:function(){s.flags_efs=this.efs,s.extraLength=c.length;var l=s.centralHeaderToBinary(),C=H.Constants.CENHDR;return r.copy(l,C),C+=r.length,c.copy(l,C),C+=s.extraLength,n.copy(l,C),l},packLocalHeader:function(){let l=0;s.flags_efs=this.efs,s.extraLocalLength=d.length;let C=s.localHeaderToBinary(),h=Buffer.alloc(C.length+r.length+s.extraLocalLength);return C.copy(h,l),l+=C.length,r.copy(h,l),l+=r.length,d.copy(h,l),l+=d.length,h},toJSON:function(){let l=function(C){return "<"+(C&&C.length+" bytes buffer"||"null")+">"};return {entryName:this.entryName,name:this.name,comment:this.comment,isDirectory:this.isDirectory,header:s.toJSON(),compressedData:l(t),data:l(o)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var pr=oe((Da,dr)=>{var ur=os(),Si=ns(),ie=Ve();dr.exports=function(e,t){var s=[],r={},n=Buffer.alloc(0),i=new Si.MainHeader,o=false;let d=new Set,u=t,{noSort:g,decoder:I}=u;e?m(u.readEntries):o=true;function v(){let f=new Set;for(let w of Object.keys(r)){let E=w.split("/");if(E.pop(),!!E.length)for(let l=0;l<E.length;l++){let C=E.slice(0,l+1).join("/")+"/";f.add(C);}}for(let w of f)if(!(w in r)){let E=new ur(u);E.entryName=w,E.attr=16,E.temporary=true,s.push(E),r[E.entryName]=E,d.add(E);}}function a(){if(o=true,r={},i.diskEntries>(e.length-i.offset)/ie.Constants.CENHDR)throw ie.Errors.DISK_ENTRY_TOO_LARGE();s=new Array(i.diskEntries);for(var f=i.offset,w=0;w<s.length;w++){var E=f,l=new ur(u,e);l.header=e.slice(E,E+=ie.Constants.CENHDR),l.entryName=e.slice(E,E+=l.header.fileNameLength),l.header.extraLength&&(l.extra=e.slice(E,E+=l.header.extraLength)),l.header.commentLength&&(l.comment=e.slice(E,E+l.header.commentLength)),f+=l.header.centralHeaderSize,s[w]=l,r[l.entryName]=l;}d.clear(),v();}function m(f){var w=e.length-ie.Constants.ENDHDR,E=Math.max(0,w-65535),l=E,C=e.length,h=-1,_=0;for(typeof u.trailingSpace=="boolean"&&u.trailingSpace&&(E=0),w;w>=l;w--)if(e[w]===80){if(e.readUInt32LE(w)===ie.Constants.ENDSIG){h=w,_=w,C=w+ie.Constants.ENDHDR,l=w-ie.Constants.END64HDR;continue}if(e.readUInt32LE(w)===ie.Constants.END64SIG){l=E;continue}if(e.readUInt32LE(w)===ie.Constants.ZIP64SIG){h=w,C=w+ie.readBigUInt64LE(e,w+ie.Constants.ZIP64SIZE)+ie.Constants.ZIP64LEAD;break}}if(h==-1)throw ie.Errors.INVALID_FORMAT();i.loadFromBinary(e.slice(h,C)),i.commentLength&&(n=e.slice(_+ie.Constants.ENDHDR)),f&&a();}function p(){s.length>1&&!g&&s.sort((f,w)=>f.entryName.toLowerCase().localeCompare(w.entryName.toLowerCase()));}return {get entries(){return o||a(),s.filter(f=>!d.has(f))},get comment(){return I.decode(n)},set comment(f){n=ie.toBuffer(f,I.encode),i.commentLength=n.length;},getEntryCount:function(){return o?s.length:i.diskEntries},forEach:function(f){this.entries.forEach(f);},getEntry:function(f){return o||a(),r[f]||null},setEntry:function(f){o||a(),s.push(f),r[f.entryName]=f,i.totalEntries=s.length;},deleteFile:function(f,w=true){o||a();let E=r[f];this.getEntryChildren(E,w).map(C=>C.entryName).forEach(this.deleteEntry);},deleteEntry:function(f){o||a();let w=r[f],E=s.indexOf(w);E>=0&&(s.splice(E,1),delete r[f],i.totalEntries=s.length);},getEntryChildren:function(f,w=true){if(o||a(),typeof f=="object")if(f.isDirectory&&w){let E=[],l=f.entryName;for(let C of s)C.entryName.startsWith(l)&&E.push(C);return E}else return [f];return []},getChildCount:function(f){if(f&&f.isDirectory){let w=this.getEntryChildren(f);return w.includes(f)?w.length-1:w.length}return 0},compressToBuffer:function(){o||a(),p();let f=[],w=[],E=0,l=0;i.size=0,i.offset=0;let C=0;for(let T of this.entries){let P=T.getCompressedData();T.header.offset=l;let x=T.packLocalHeader(),F=x.length+P.length;l+=F,f.push(x),f.push(P);let O=T.packCentralHeader();w.push(O),i.size+=O.length,E+=F+O.length,C++;}E+=i.mainHeaderSize,i.offset=l,i.totalEntries=C,l=0;let h=Buffer.alloc(E);for(let T of f)T.copy(h,l),l+=T.length;for(let T of w)T.copy(h,l),l+=T.length;let _=i.toBinary();return n&&n.copy(_,ie.Constants.ENDHDR),_.copy(h,l),e=h,o=false,h},toAsyncBuffer:function(f,w,E,l){try{o||a(),p();let C=[],h=[],_=0,T=0,P=0;i.size=0,i.offset=0;let x=function(F){if(F.length>0){let O=F.shift(),G=O.entryName+O.extra.toString();E&&E(G),O.getCompressedDataAsync(function(U){l&&l(G),O.header.offset=T;let De=O.packLocalHeader(),J=De.length+U.length;T+=J,C.push(De),C.push(U);let Et=O.packCentralHeader();h.push(Et),i.size+=Et.length,_+=J+Et.length,P++,x(F);});}else {_+=i.mainHeaderSize,i.offset=T,i.totalEntries=P,T=0;let O=Buffer.alloc(_);C.forEach(function(U){U.copy(O,T),T+=U.length;}),h.forEach(function(U){U.copy(O,T),T+=U.length;});let G=i.toBinary();n&&n.copy(G,ie.Constants.ENDHDR),G.copy(O,T),e=O,o=!1,f(O);}};x(Array.from(this.entries));}catch(C){w(C);}}}};});var mr=oe((Fa,gr)=>{var Y=Ve(),X=ke("path"),Ei=os(),Ii=pr(),Be=(...e)=>Y.findLast(e,t=>typeof t=="boolean"),fr=(...e)=>Y.findLast(e,t=>typeof t=="string"),Ci=(...e)=>Y.findLast(e,t=>typeof t=="function"),vi={noSort:false,readEntries:false,method:Y.Constants.NONE,fs:null};gr.exports=function(e,t){let s=null,r=Object.assign(Object.create(null),vi);e&&typeof e=="object"&&(e instanceof Uint8Array||(Object.assign(r,e),e=r.input?r.input:void 0,r.input&&delete r.input),Buffer.isBuffer(e)&&(s=e,r.method=Y.Constants.BUFFER,e=void 0)),Object.assign(r,t);let n=new Y(r);if((typeof r.decoder!="object"||typeof r.decoder.encode!="function"||typeof r.decoder.decode!="function")&&(r.decoder=Y.decoder),e&&typeof e=="string")if(n.fs.existsSync(e))r.method=Y.Constants.FILE,r.filename=e,s=n.fs.readFileSync(e);else throw Y.Errors.INVALID_FILENAME();let i=new Ii(s,r),{canonical:o,sanitize:c,zipnamefix:d}=Y;function u(a){if(a&&i){var m;if(typeof a=="string"&&(m=i.getEntry(X.posix.normalize(a))),typeof a=="object"&&typeof a.entryName<"u"&&typeof a.header<"u"&&(m=i.getEntry(a.entryName)),m)return m}return null}function g(a){let{join:m,normalize:p,sep:f}=X.posix;return m(".",p(f+a.split("\\").join(f)+f))}function I(a){return a instanceof RegExp?(function(m){return function(p){return m.test(p)}})(a):typeof a!="function"?()=>true:a}let v=(a,m)=>{let p=m.slice(-1);return p=p===n.sep?n.sep:"",X.relative(a,m)+p};return {readFile:function(a,m){var p=u(a);return p&&p.getData(m)||null},childCount:function(a){let m=u(a);if(m)return i.getChildCount(m)},readFileAsync:function(a,m){var p=u(a);p?p.getDataAsync(m):m(null,"getEntry failed for:"+a);},readAsText:function(a,m){var p=u(a);if(p){var f=p.getData();if(f&&f.length)return f.toString(m||"utf8")}return ""},readAsTextAsync:function(a,m,p){var f=u(a);f?f.getDataAsync(function(w,E){if(E){m(w,E);return}w&&w.length?m(w.toString(p||"utf8")):m("");}):m("");},deleteFile:function(a,m=true){var p=u(a);p&&i.deleteFile(p.entryName,m);},deleteEntry:function(a){var m=u(a);m&&i.deleteEntry(m.entryName);},addZipComment:function(a){i.comment=a;},getZipComment:function(){return i.comment||""},addZipEntryComment:function(a,m){var p=u(a);p&&(p.comment=m);},getZipEntryComment:function(a){var m=u(a);return m&&m.comment||""},updateFile:function(a,m){var p=u(a);p&&p.setData(m);},addLocalFile:function(a,m,p,f){if(n.fs.existsSync(a)){m=m?g(m):"";let w=X.win32.basename(X.win32.normalize(a));m+=p||w;let E=n.fs.statSync(a),l=E.isFile()?n.fs.readFileSync(a):Buffer.alloc(0);E.isDirectory()&&(m+=n.sep),this.addFile(m,l,f,E);}else throw Y.Errors.FILE_NOT_FOUND(a)},addLocalFileAsync:function(a,m){a=typeof a=="object"?a:{localPath:a};let p=X.resolve(a.localPath),{comment:f}=a,{zipPath:w,zipName:E}=a,l=this;n.fs.stat(p,function(C,h){if(C)return m(C,false);w=w?g(w):"";let _=X.win32.basename(X.win32.normalize(p));if(w+=E||_,h.isFile())n.fs.readFile(p,function(T,P){return T?m(T,false):(l.addFile(w,P,f,h),setImmediate(m,void 0,true))});else if(h.isDirectory())return w+=n.sep,l.addFile(w,Buffer.alloc(0),f,h),setImmediate(m,void 0,true)});},addLocalFolder:function(a,m,p){if(p=I(p),m=m?g(m):"",a=X.normalize(a),n.fs.existsSync(a)){let f=n.findFiles(a),w=this;if(f.length)for(let E of f){let l=X.join(m,v(a,E));p(l)&&w.addLocalFile(E,X.dirname(l));}}else throw Y.Errors.FILE_NOT_FOUND(a)},addLocalFolderAsync:function(a,m,p,f){f=I(f),p=p?g(p):"",a=X.normalize(a);var w=this;n.fs.open(a,"r",function(E){if(E&&E.code==="ENOENT")m(void 0,Y.Errors.FILE_NOT_FOUND(a));else if(E)m(void 0,E);else {var l=n.findFiles(a),C=-1,h=function(){if(C+=1,C<l.length){var _=l[C],T=v(a,_).split("\\").join("/");T=T.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,""),f(T)?n.fs.stat(_,function(P,x){P&&m(void 0,P),x.isFile()?n.fs.readFile(_,function(F,O){F?m(void 0,F):(w.addFile(p+T,O,"",x),h());}):(w.addFile(p+T+"/",Buffer.alloc(0),"",x),h());}):process.nextTick(()=>{h();});}else m(true,void 0);};h();}});},addLocalFolderAsync2:function(a,m){let p=this;a=typeof a=="object"?a:{localPath:a},localPath=X.resolve(g(a.localPath));let{zipPath:f,filter:w,namefix:E}=a;w instanceof RegExp?w=(function(h){return function(_){return h.test(_)}})(w):typeof w!="function"&&(w=function(){return true}),f=f?g(f):"",E=="latin1"&&(E=h=>h.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,"")),typeof E!="function"&&(E=h=>h);let l=h=>X.join(f,E(v(localPath,h))),C=h=>X.win32.basename(X.win32.normalize(E(h)));n.fs.open(localPath,"r",function(h){h&&h.code==="ENOENT"?m(void 0,Y.Errors.FILE_NOT_FOUND(localPath)):h?m(void 0,h):n.findFilesAsync(localPath,function(_,T){if(_)return m(_);T=T.filter(P=>w(l(P))),T.length||m(void 0,false),setImmediate(T.reverse().reduce(function(P,x){return function(F,O){if(F||O===false)return setImmediate(P,F,false);p.addLocalFileAsync({localPath:x,zipPath:X.dirname(l(x)),zipName:C(x)},P);}},m));});});},addLocalFolderPromise:function(a,m){return new Promise((p,f)=>{this.addLocalFolderAsync2(Object.assign({localPath:a},m),(w,E)=>{w&&f(w),E&&p(this);});})},addFile:function(a,m,p,f){a=d(a);let w=u(a),E=w!=null;E||(w=new Ei(r),w.entryName=a),w.comment=p||"";let l=typeof f=="object"&&f instanceof n.fs.Stats;l&&(w.header.time=f.mtime);var C=w.isDirectory?16:0;let h=w.isDirectory?16384:32768;return l?h|=4095&f.mode:typeof f=="number"?h|=4095&f:h|=w.isDirectory?493:420,C=(C|h<<16)>>>0,w.attr=C,w.setData(m),E||i.setEntry(w),w},getEntries:function(a){return i.password=a,i?i.entries:[]},getEntry:function(a){return u(a)},getEntryCount:function(){return i.getEntryCount()},forEach:function(a){return i.forEach(a)},extractEntryTo:function(a,m,p,f,w,E){f=Be(false,f),w=Be(false,w),p=Be(true,p),E=fr(w,E);var l=u(a);if(!l)throw Y.Errors.NO_ENTRY();var C=o(l.entryName),h=c(m,E&&!l.isDirectory?E:p?C:X.basename(C));if(l.isDirectory){var _=i.getEntryChildren(l);return _.forEach(function(x){if(x.isDirectory)return;var F=x.getData();if(!F)throw Y.Errors.CANT_EXTRACT_FILE();var O=o(x.entryName),G=c(m,p?O:X.basename(O));let U=w?x.header.fileAttr:void 0;n.writeFileTo(G,F,f,U);}),true}var T=l.getData(i.password);if(!T)throw Y.Errors.CANT_EXTRACT_FILE();if(n.fs.existsSync(h)&&!f)throw Y.Errors.CANT_OVERRIDE();let P=w?a.header.fileAttr:void 0;return n.writeFileTo(h,T,f,P),true},test:function(a){if(!i)return false;for(var m in i.entries)try{if(m.isDirectory)continue;var p=i.entries[m].getData(a);if(!p)return !1}catch{return false}return true},extractAllTo:function(a,m,p,f){if(p=Be(false,p),f=fr(p,f),m=Be(false,m),!i)throw Y.Errors.NO_ZIP();i.entries.forEach(function(w){var E=c(a,o(w.entryName));if(w.isDirectory){n.makeDir(E);return}var l=w.getData(f);if(!l)throw Y.Errors.CANT_EXTRACT_FILE();let C=p?w.header.fileAttr:void 0;n.writeFileTo(E,l,m,C);try{n.fs.utimesSync(E,w.header.time,w.header.time);}catch{throw Y.Errors.CANT_EXTRACT_FILE()}});},extractAllToAsync:function(a,m,p,f){if(f=Ci(m,p,f),p=Be(false,p),m=Be(false,m),!f)return new Promise((h,_)=>{this.extractAllToAsync(a,m,p,function(T){T?_(T):h(this);});});if(!i){f(Y.Errors.NO_ZIP());return}a=X.resolve(a);let w=h=>c(a,X.normalize(o(h.entryName))),E=(h,_)=>new Error(h+': "'+_+'"'),l=[],C=[];i.entries.forEach(h=>{h.isDirectory?l.push(h):C.push(h);});for(let h of l){let _=w(h),T=p?h.header.fileAttr:void 0;try{n.makeDir(_),T&&n.fs.chmodSync(_,T),n.fs.utimesSync(_,h.header.time,h.header.time);}catch{f(E("Unable to create folder",_));}}C.reverse().reduce(function(h,_){return function(T){if(T)h(T);else {let P=X.normalize(o(_.entryName)),x=c(a,P);_.getDataAsync(function(F,O){if(O)h(O);else if(!F)h(Y.Errors.CANT_EXTRACT_FILE());else {let G=p?_.header.fileAttr:void 0;n.writeFileToAsync(x,F,m,G,function(U){U||h(E("Unable to write file",x)),n.fs.utimes(x,_.header.time,_.header.time,function(De){De?h(E("Unable to set times",x)):h();});});}});}}},f)();},writeZip:function(a,m){if(arguments.length===1&&typeof a=="function"&&(m=a,a=""),!a&&r.filename&&(a=r.filename),!!a){var p=i.compressToBuffer();if(p){var f=n.writeFileTo(a,p,true);typeof m=="function"&&m(f?null:new Error("failed"),"");}}},writeZipPromise:function(a,m){let{overwrite:p,perm:f}=Object.assign({overwrite:true},m);return new Promise((w,E)=>{!a&&r.filename&&(a=r.filename),a||E("ADM-ZIP: ZIP File Name Missing"),this.toBufferPromise().then(l=>{let C=h=>h?w(h):E("ADM-ZIP: Wasn't able to write zip file");n.writeFileToAsync(a,l,p,f,C);},E);})},toBufferPromise:function(){return new Promise((a,m)=>{i.toAsyncBuffer(a,m);})},toBuffer:function(a,m,p,f){return typeof a=="function"?(i.toAsyncBuffer(a,m,p,f),null):i.compressToBuffer()}}};});var ni=fileURLToPath(import.meta.url),Ns=B.dirname(ni);function Os(){let e=[B.join(Ns,"../package.json"),B.join(Ns,"../../package.json")];for(let t of e)try{let r=JSON.parse(k.readFileSync(t,"utf8")).version;if(typeof r=="string"&&r)return r}catch{continue}return "1.0.0"}function ts(e){console.log($e.cyan.bold("DevAssure CLI")),console.log(""),console.log($e.white("Usage: devassure [command] [options]")),console.log(""),console.log($e.yellow.bold("Commands:")),console.log(" version Print the version of the app"),console.log(" help Show help information"),console.log(" login Login to DevAssure"),console.log(" logout Logout from DevAssure"),console.log(" add-token <token> Add and validate authentication token"),console.log(" init Initialize DevAssure configuration"),console.log(" run-tests Run tests (same as new but uses current directory as test cases directory)"),console.log(" run Run tests (alias for run-tests)"),console.log(" stats Show statistics about sessions, scenarios, and storage"),console.log(" summary Print summary for a test session (--session-id or --last, optional --json)"),console.log(" cleanup Clean up old sessions"),console.log(" archive-report Archive report results for a test session (--output-dir, --session-id or --last)"),console.log(" open-report Open report server for a test session (--session-id, --last, or --archive)"),console.log(""),console.log($e.yellow.bold("Options:")),console.log(" -v, --verbose Print verbose output"),console.log(" -s, --short Print short output"),console.log(" --env <environment> Set environment (dev, prod, staging)"),console.log(" -h, --help Display help for command"),console.log(""),console.log($e.gray("For more information, visit: https://devassure.io/docs"));}var _r=si(mr());var re=(e=>(e.TEXT="text",e.PASSWORD="password",e.SELECT="select",e.MULTISELECT="multiselect",e.CONFIRM="confirm",e.KEYPRESS="keypress",e.USERKILL="userKill",e))(re||{}),Qe=(e=>(e.TOKEN="token",e.API_KEY="api_key",e.API_KEY_ENV_VAR="api_key_env_var",e.OAUTH="oauth",e))(Qe||{}),b=(e=>(e.RUNNING="running",e.SUCCESS="success",e.PASSED="passed",e.FAILED="failed",e.WAITING="waiting",e.FAILING="failing",e.SKIPPED="skipped",e.CANCELLED="cancelled",e.ERROR="error",e))(b||{}),et=["success","passed","failed","skipped","cancelled","error"],xe=(e=>(e.NUMBER="number",e.PROGRESS_BAR="progressBar",e.THIN_PROGRESS_BAR="thinProgressBar",e.PERCENTAGE="percentage",e.ETA="eta",e.DOTTED="dotted",e))(xe||{}),N=(e=>(e.SPINNER="spinner",e.CHECK="check",e.CROSS="cross",e.ARROW="arrow",e.DOT="dot",e.CIRCLE="circle",e.CIRCLE_FILL="circleFill",e.CIRCLE_SPINNER="circleSpinner",e.BLINKING_CIRCLE="blinkingCircle",e.BLINKING_DIAMOND="blinkingDiamond",e.BLINKING_HEXAGON="blinkingHexagon",e.SQUARE="square",e.HEXAGON="hexagon",e.DIAMOND="diamond",e))(N||{});function R(e,t,s){return {message:e,styles:t,maxCharLength:s}}function M(e){return e.map(t=>R(t))}var Rt="devassure";function Te(){let e=ue.homedir(),t;return process.platform==="win32"?t=B.join(e,"AppData","Local",Rt,Rt):process.platform==="darwin"?t=B.join(e,"Library","Application Support",Rt):t=B.join(e,".local","share",Rt),t}function Pe(){return B.join(Te(),"bin")}function Xe(){let e=process.platform==="win32"?"devassure-agent.exe":"devassure-agent";return B.join(Pe(),e)}function Ri(){let e=process.platform==="win32"?"node.exe":"node";return B.join(Pe(),".devassure-agent-internal","playwright","driver",e)}function ms(){return B.join(Te(),"data")}function Je(){return B.join(Te(),".secrets")}function ft(){return B.join(Te(),".cache")}var _i=createRequire(import.meta.url),Li=_i("sqlite3"),Ee=null,Mt=null;function lt(e,t,s=[]){return new Promise((r,n)=>{e.run(t,s,function(i){i?n(i):r();});})}function Ai(e,t,s=[]){return new Promise((r,n)=>{e.get(t,s,(i,o)=>{i?n(i):r(o);});})}function Di(e,t,s=[]){return new Promise((r,n)=>{e.all(t,s,(i,o)=>{i?n(i):r(o);});})}async function xt(){if(Ee)return Ee;let e=ms();return await $.mkdir(e,{recursive:true}),Mt=B.join(e,"devassure.db"),Ee=await new Promise((t,s)=>{let r=new Li.Database(Mt,n=>{n?s(n):t(r);});}),await lt(Ee,"PRAGMA journal_mode = WAL;"),await lt(Ee,"PRAGMA busy_timeout = 5000;"),await lt(Ee,"PRAGMA synchronous = NORMAL;"),await lt(Ee,"PRAGMA foreign_keys = ON;"),Ee}async function Fi(){Ee&&(await new Promise((e,t)=>{Ee.close(s=>s?t(s):e());}),Ee=null,Mt=null);}function Pi(){return Mt}function as(e){let t=e?.code,s=String(e?.message??e);return !!(t==="SQLITE_ERROR"&&s.includes("no such table")||t==="SQLITE_CANTOPEN")}var W={run:async(e,t=[])=>{try{await lt(await xt(),e,t);}catch(s){if(as(s))return;throw s}},get:async(e,t=[])=>{try{return await Ai(await xt(),e,t)}catch(s){if(as(s))return;throw s}},all:async(e,t=[])=>{try{return await Di(await xt(),e,t)}catch(s){if(as(s))return [];throw s}}},xi=class{static async getClient(){return await xt()}static async disconnect(){await Fi();}static getDbPath(){return Pi()}},hr=xi,Ae=class{run(e,t=[]){return W.run(e,t)}get(e,t=[]){return W.get(e,t)}all(e,t=[]){return W.all(e,t)}},_t=z.object({id:z.string(),project_path:z.string(),pid:z.number().nullable(),status:z.string(),title:z.string().nullable(),branch_name:z.string().nullable(),commit_id:z.string().nullable(),current_phase:z.string().nullable(),created_at:z.string().nullable(),end_time:z.string().nullable(),duration:z.number().nullable(),session_type:z.string().nullable(),test_cases_dir:z.string().nullable(),test_case_file:z.string().nullable(),concurrency:z.number().nullable(),test_environment:z.string().nullable()});async function q(e,t=5){let s=0;for(;;)try{return await e()}catch(r){let n=String(r?.message||r);if(!(n.includes("SQLITE_BUSY")||n.includes("database is locked"))||s>=t)throw r;let o=50*Math.pow(2,s);await new Promise(c=>setTimeout(c,o)),s++;}}var Ni=class extends Ae{async getById(e){let t=await this.get("SELECT * FROM TestSession WHERE id = ? LIMIT 1",[e]);return t?_t.parse(t):void 0}async getAll(){return (await this.all("SELECT * FROM TestSession",[])).map(t=>_t.parse(t))}async getAllOrderedByCreatedAt(){return (await this.all("SELECT * FROM TestSession ORDER BY created_at DESC",[])).map(t=>_t.parse(t))}async getLastSessionId(){return (await this.get("SELECT id FROM TestSession ORDER BY created_at DESC LIMIT 1",[]))?.id}async getLastSessions(e){return (await this.all("SELECT * FROM TestSession ORDER BY created_at DESC LIMIT ?",[e])).map(s=>_t.parse(s))}async getCount(){return (await this.get("SELECT COUNT(*) as count FROM TestSession",[]))?.count??0}async deleteByIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TestSession WHERE id IN (${t})`,e));}async updateStatus(e,t){await q(()=>this.run("UPDATE TestSession SET status = ? WHERE id = ?",[t,e]));}},Mi=z.object({id:z.string(),session_id:z.string(),label:z.string(),name:z.string(),status:z.string(),waiting_on:z.string().nullable(),browser_session_id:z.string().nullable(),created_at:z.string().nullable()}),yr=z.object({id:z.string(),task_id:z.string(),label:z.string(),name:z.string(),type:z.string(),status:z.string(),data:z.string().nullable(),user_input:z.string().nullable(),created_at:z.string().nullable()}),Oi=z.object({id:z.string(),content:z.string(),parent_type:z.string().nullable(),parent_id:z.string().nullable(),type:z.string().nullable(),created_at:z.string().nullable()}),ki=class extends Ae{async getBySessionId(e){return (await this.all("SELECT * FROM Task WHERE session_id = ?",[e])).map(s=>Mi.parse(s))}async getStepsByTaskId(e){return (await this.all("SELECT * FROM TaskStep WHERE task_id = ? ORDER BY created_at ASC",[e])).map(s=>yr.parse(s))}async updateTaskStepUserInput(e,t){await q(()=>this.run("UPDATE TaskStep SET user_input = ?, status = 'validating' WHERE id = ?",[t,e]));}async getValidatingUserInputTaskStep(e){let t=await this.get("SELECT * FROM TaskStep WHERE task_id = ? AND type = 'userInput' AND status = 'validating' LIMIT 1",[e]);return t?yr.parse(t):null}async getMessagesByParent(e,t){return (await this.all("SELECT * FROM Message WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>Oi.parse(r))}},Bi=z.object({id:z.string(),test_session_id:z.string(),status:z.string(),title:z.string(),label:z.string().nullable(),browser_session_id:z.string().nullable(),steps:z.string().nullable(),tags:z.string().nullable(),test_type:z.string().nullable(),agent_type:z.string().nullable(),test_data:z.string().nullable(),priority:z.string().nullable(),created_at:z.string().nullable()}),Ar=z.object({id:z.string(),test_session_id:z.string(),scenario_id:z.string().nullable(),agent_type:z.string(),browser:z.string(),resolution_x:z.number().nullable(),resolution_y:z.number().nullable(),headless:z.number(),status:z.string(),cdp_port:z.number().nullable(),worker_id:z.number().nullable(),created_at:z.string().nullable(),start_time:z.string().nullable(),end_time:z.string().nullable()}),$i=z.object({id:z.string(),created_at:z.string().nullable(),browser_session_id:z.string(),step_number:z.number(),start_time:z.string(),end_time:z.string(),url:z.string().nullable(),page_title:z.string().nullable(),evaluation_previous_goal:z.string().nullable(),next_goal:z.string().nullable(),thinking:z.string().nullable(),bu_screenshot_path:z.string().nullable(),screenshot_path:z.string().nullable(),type:z.string()}),Ui=z.object({id:z.string(),created_at:z.string().nullable(),agent_step_id:z.string(),action:z.string()}),Hi=z.object({id:z.string(),created_at:z.string().nullable(),agent_step_id:z.string(),validation_type:z.string().nullable(),status:z.string(),progress:z.string().nullable(),summary:z.string().nullable(),reasoning:z.string().nullable(),expected_result:z.string().nullable(),actual_result:z.string().nullable(),failure_message:z.string().nullable(),next_step:z.string().nullable()}),zi=z.object({id:z.string(),created_at:z.string().nullable(),scenario_id:z.string(),validation_type:z.string(),description:z.string(),step_number:z.string()}),ut=z.object({id:z.string(),test_session_id:z.string(),parent_id:z.string(),parent_type:z.string(),message:z.string(),error_type:z.string().nullable(),created_at:z.string().nullable()}),Dr=z.object({id:z.string(),created_at:z.string().nullable(),parent_id:z.string(),parent_type:z.string(),issue_type:z.string(),description:z.string(),severity:z.string(),root_cause:z.string().nullable(),next_steps:z.string().nullable(),scenario_ids:z.string().nullable()}),Gi=class extends Ae{async getBySessionId(e){return (await this.all("SELECT * FROM Scenario WHERE test_session_id = ?",[e])).map(s=>Bi.parse(s))}async getBrowserSessionById(e){let t=await this.get("SELECT * FROM BrowserSession WHERE id = ? LIMIT 1",[e]);return t?Ar.parse(t):void 0}async getAgentStepsByBrowserSessionId(e){return (await this.all("SELECT * FROM AgentStep WHERE browser_session_id = ? ORDER BY step_number ASC",[e])).map(s=>$i.parse(s))}async getAgentStepActionsByStepId(e){return (await this.all("SELECT * FROM AgentStepAction WHERE agent_step_id = ?",[e])).map(s=>Ui.parse(s))}async getAgentStepValidationsByStepId(e){return (await this.all("SELECT * FROM AgentStepValidation WHERE agent_step_id = ?",[e])).map(s=>Hi.parse(s))}async getPassedValidationsByScenarioId(e){return (await this.all("SELECT * FROM PassedValidation WHERE scenario_id = ?",[e])).map(s=>zi.parse(s))}async getPassedValidationCountByTestSessionId(e){return (await this.get("SELECT COUNT(*) as count FROM PassedValidation WHERE scenario_id IN (SELECT id FROM Scenario WHERE test_session_id = ?)",[e]))?.count??0}async getErrorsByScenarioId(e){return (await this.all("SELECT * FROM Error WHERE parent_id = ? AND parent_type = 'scenario' ORDER BY created_at ASC",[e])).map(s=>ut.parse(s))}async getIssuesByParent(e,t){return (await this.all("SELECT * FROM Issue WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>Dr.parse(r))}async getCountExcludingStatuses(e){if(e.length===0)return (await this.get("SELECT COUNT(*) as count FROM Scenario",[]))?.count??0;let t=e.map(()=>"status != ?").join(" AND ");return (await this.get(`SELECT COUNT(*) as count FROM Scenario WHERE ${t}`,e))?.count??0}async getCount(){return (await this.get("SELECT COUNT(*) as count FROM Scenario WHERE status != 'new' AND status != 'executing'",[]))?.count??0}async deleteBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Scenario WHERE test_session_id IN (${t})`,e));}async getScenarioIdsBySessionIds(e){if(e.length===0)return [];let t=e.map(()=>"?").join(", ");return (await this.all(`SELECT id FROM Scenario WHERE test_session_id IN (${t})`,e)).map(r=>r.id)}},ji=z.object({id:z.string(),created_at:z.string().nullable(),scenario_id:z.string(),status:z.string(),execution_summary:z.string().nullable(),analysis_summary:z.string().nullable(),score:z.number().nullable(),step_count:z.number().nullable()}),Wi=z.object({id:z.string(),created_at:z.string().nullable(),test_session_id:z.string(),status:z.string(),session_summary:z.string().nullable(),analysis_summary:z.string().nullable(),score:z.number().nullable(),step_count:z.number().nullable()}),Vi=class extends Ae{async getLatestScenarioAnalysis(e){let t=await this.get("SELECT * FROM ScenarioAnalysis WHERE scenario_id = ? ORDER BY created_at DESC LIMIT 1",[e]);return t?ji.parse(t):void 0}async getLatestTestSessionAnalysis(e){let t=await this.get("SELECT * FROM TestSessionAnalysis WHERE test_session_id = ? ORDER BY created_at DESC LIMIT 1",[e]);return t?Wi.parse(t):void 0}async getIssuesByParent(e,t){return (await this.all("SELECT * FROM Issue WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>Dr.parse(r))}async getFailedValidationCountByTestSessionId(e){return (await this.get("SELECT COUNT(*) as count FROM Issue WHERE parent_type = 'scenario_analysis' AND parent_id IN (SELECT id FROM ScenarioAnalysis WHERE scenario_id IN (SELECT id FROM Scenario WHERE test_session_id = ?))",[e]))?.count??0}},Yi=class extends Ae{async getByParent(e,t){let s=await this.get("SELECT * FROM Error WHERE parent_id = ? AND parent_type = ? LIMIT 1",[e,t]);return s?ut.parse(s):void 0}async getBySessionId(e){return (await this.all("SELECT * FROM Error WHERE test_session_id = ? AND parent_type = 'test_session' ORDER BY created_at ASC",[e])).map(s=>ut.parse(s))}async getByScenarioId(e){return (await this.all("SELECT * FROM Error WHERE parent_id = ? AND parent_type = 'scenario' ORDER BY created_at ASC",[e])).map(s=>ut.parse(s))}async getAllByParent(e,t){return (await this.all("SELECT * FROM Error WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>ut.parse(r))}async createForSession(e,t){let s=v4(),r=new Date().toISOString();await this.run("INSERT INTO Error (id, test_session_id, parent_id, parent_type, message, error_type, created_at) VALUES (?, ?, ?, 'test_session', ?, NULL, ?)",[s,e,e,t,r]);}},qi=class extends Ae{async getTotalScenarioCount(e){return (await this.get("SELECT COUNT(*) as count FROM Scenario WHERE test_session_id = ?",[e]))?.count??0}async getCompletedScenarioCount(e){return (await this.get("SELECT COUNT(*) as count FROM Scenario WHERE test_session_id = ? AND status IN ('passed', 'failed', 'cancelled', 'skipped', 'error')",[e]))?.count??0}},Ki=class extends Ae{async getCount(){return (await this.get("SELECT COUNT(*) as count FROM BrowserSession",[]))?.count??0}async getBySessionIds(e){if(e.length===0)return [];let t=e.map(()=>"?").join(", ");return (await this.all(`SELECT * FROM BrowserSession WHERE test_session_id IN (${t})`,e)).map(r=>Ar.parse(r))}async getBrowserSessionIdsBySessionIds(e){if(e.length===0)return [];let t=e.map(()=>"?").join(", ");return (await this.all(`SELECT id FROM BrowserSession WHERE test_session_id IN (${t})`,e)).map(r=>r.id)}async deleteBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM BrowserSession WHERE test_session_id IN (${t})`,e));}},Zi=class extends Ae{async deleteAgentStepActionsByBrowserSessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM AgentStepAction WHERE agent_step_id IN (SELECT id FROM AgentStep WHERE browser_session_id IN (${t}))`,e));}async deleteAgentStepValidationsByBrowserSessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM AgentStepValidation WHERE agent_step_id IN (SELECT id FROM AgentStep WHERE browser_session_id IN (${t}))`,e));}async deleteAgentStepsByBrowserSessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM AgentStep WHERE browser_session_id IN (${t})`,e));}async deletePassedValidationsByScenarioIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM PassedValidation WHERE scenario_id IN (${t})`,e));}async deleteTaskStepsBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TaskStep WHERE task_id IN (SELECT id FROM Task WHERE session_id IN (${t}))`,e));}async deleteTasksBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Task WHERE session_id IN (${t})`,e));}async deleteErrorsBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Error WHERE test_session_id IN (${t})`,e));}async deleteMessagesBySessionIds(e,t,s,r,n){let i=[],o=[];if(e.length>0){let d=e.map(()=>"?").join(", ");i.push(`(parent_type = 'session' AND parent_id IN (${d}))`),o.push(...e);}if(t.length>0){let d=t.map(()=>"?").join(", ");i.push(`(parent_type = 'scenario' AND parent_id IN (${d}))`),o.push(...t);}if(s.length>0){let d=s.map(()=>"?").join(", ");i.push(`(parent_type = 'browser_session' AND parent_id IN (${d}))`),o.push(...s);}if(r.length>0){let d=r.map(()=>"?").join(", ");i.push(`(parent_type = 'task' AND parent_id IN (${d}))`),o.push(...r);}if(n.length>0){let d=n.map(()=>"?").join(", ");i.push(`(parent_type = 'step' AND parent_id IN (${d}))`),o.push(...n);}if(i.length===0)return;let c=i.join(" OR ");await q(()=>this.run(`DELETE FROM Message WHERE ${c}`,o));}async deleteIssuesByAnalysisIds(e,t){let s=[],r=[];if(e.length>0){let i=e.map(()=>"?").join(", ");s.push(`(parent_type = 'scenario_analysis' AND parent_id IN (${i}))`),r.push(...e);}if(t.length>0){let i=t.map(()=>"?").join(", ");s.push(`(parent_type = 'test_session_analysis' AND parent_id IN (${i}))`),r.push(...t);}if(s.length===0)return;let n=s.join(" OR ");await q(()=>this.run(`DELETE FROM Issue WHERE ${n}`,r));}async deleteBrowserSessionsBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM BrowserSession WHERE test_session_id IN (${t})`,e));}async deleteScenarioAnalysesByScenarioIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM ScenarioAnalysis WHERE scenario_id IN (${t})`,e));}async deleteScenariosBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Scenario WHERE test_session_id IN (${t})`,e));}async deleteTestSessionAnalysesBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TestSessionAnalysis WHERE test_session_id IN (${t})`,e));}async deleteReportsRendersBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM ReportsRender WHERE test_session_id IN (${t})`,e));}async deleteSessionDataBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM SessionData WHERE test_session_id IN (${t})`,e));}async deleteTestSessionsByIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TestSession WHERE id IN (${t})`,e));}},Lt=z.object({id:z.string(),created_at:z.string().nullable(),test_session_id:z.string(),status:z.string(),host:z.string().nullable(),port:z.number().nullable(),stopped_at:z.string().nullable(),archive:z.string().nullable()}),Xi=class extends Ae{async getByTestSessionId(e){return (await this.all("SELECT * FROM ReportsRender WHERE test_session_id = ?",[e])).map(s=>Lt.parse(s))}async getByCreatedAtAfter(e){return (await this.all("SELECT * FROM ReportsRender WHERE created_at > ? ORDER BY created_at ASC",[e])).map(s=>Lt.parse(s))}async getLatestByTestSessionId(e){let t=await this.get("SELECT * FROM ReportsRender WHERE test_session_id = ? ORDER BY created_at DESC LIMIT 1",[e]);return t?Lt.parse(t):void 0}async getLatestByTestSessionIdAfter(e,t){let s=await this.get("SELECT * FROM ReportsRender WHERE test_session_id = ? AND created_at > ? ORDER BY created_at DESC LIMIT 1",[e,t]);return s?Lt.parse(s):void 0}},Ji=class{constructor(){this._initialized=false,this._sessionRepository=null,this._taskRepository=null,this._scenarioRepository=null,this._analysisRepository=null,this._errorRepository=null,this._progressRepository=null,this._browserSessionRepository=null,this._cleanupRepository=null,this._reportsRenderRepository=null;}async initialize(){this._initialized||(await hr.getClient(),this._initialized=true);}get sessionRepository(){return this._sessionRepository||(this._sessionRepository=new Ni),this._sessionRepository}get taskRepository(){return this._taskRepository||(this._taskRepository=new ki),this._taskRepository}get scenarioRepository(){return this._scenarioRepository||(this._scenarioRepository=new Gi),this._scenarioRepository}get analysisRepository(){return this._analysisRepository||(this._analysisRepository=new Vi),this._analysisRepository}get errorRepository(){return this._errorRepository||(this._errorRepository=new Yi),this._errorRepository}get progressRepository(){return this._progressRepository||(this._progressRepository=new qi),this._progressRepository}get browserSessionRepository(){return this._browserSessionRepository||(this._browserSessionRepository=new Ki),this._browserSessionRepository}get cleanupRepository(){return this._cleanupRepository||(this._cleanupRepository=new Zi),this._cleanupRepository}get reportsRenderRepository(){return this._reportsRenderRepository||(this._reportsRenderRepository=new Xi),this._reportsRenderRepository}async close(){await hr.disconnect(),this._initialized=false,this._sessionRepository=null,this._taskRepository=null,this._scenarioRepository=null,this._analysisRepository=null,this._errorRepository=null,this._progressRepository=null,this._browserSessionRepository=null,this._cleanupRepository=null,this._reportsRenderRepository=null;}},L=new Ji,he=class Fr{constructor(t){this.taskRepository=t;}async getPendingUserInputTaskStep(t){return (await this.taskRepository.getStepsByTaskId(t)).find(n=>n.type==="userInput"&&n.status==="pending")||null}static isTaskActive(t){return ["pending","running","waiting","validating","failing"].includes(t)}static isTaskCompleted(t){return ["success","error","skipped","cancelled"].includes(t)}static mapTaskStatusToFeedStatus(t){switch(t){case "pending":case "waiting":case "validating":return "waiting";case "running":return "running";case "success":return "success";case "error":return "failed";case "skipped":return "skipped";case "cancelled":return "cancelled";case "failing":return "failing";default:return "running"}}async getTaskMessages(t){let s=await this.taskRepository.getStepsByTaskId(t),r=[];for(let o of s)o.label?r.push(R(o.label)):o.name&&r.push(R(o.name));let n=await this.taskRepository.getMessagesByParent(t,"task");for(let o of n)o.content&&r.push(R(o.content,{icon:"circle",iconColor:"gray",textColor:"gray"}));for(let o of s){let c=await this.taskRepository.getMessagesByParent(o.id,"step");for(let d of c)d.content&&r.push(R(d.content,{icon:"circle",iconColor:"gray",textColor:"gray"}));}return await this.taskRepository.getValidatingUserInputTaskStep(t)&&r.push(R("Validating...")),r}static createFeedItem(t,s){let r=Fr.mapTaskStatusToFeedStatus(t.status),n=s.length>0?[s[s.length-1]]:[],i=s.length>1?s.slice(0,-1):[];return {id:`task-${t.id}`,name:t.name,status:r,objectType:"Task",stateIndicators:[{status:"running",indicator:"spinner",color:"blue"},{status:"success",indicator:"check",color:"green"},{status:"failed",indicator:"cross",color:"red"},{status:"waiting",indicator:"blinkingCircle",color:"yellow"},{status:"failing",indicator:"spinner",color:"red"}],currentMessages:n,allMessages:i}}static getPromptTypeFromTaskStepData(t){if(!t)return null;try{let r=JSON.parse(t).input_type;return r==="string"||r==="number"?"text":r==="boolean"?"confirm":null}catch{return null}}},at=class Pr{constructor(t){this.scenarioRepository=t;}static isScenarioActive(t){return ["executing","executed","analysing"].includes(t)}static isScenarioCompleted(t){return ["passed","failed","cancelled","skipped","error"].includes(t)}static mapScenarioStatusToFeedStatus(t){switch(t){case "new":return "waiting";case "executing":case "executed":case "analysing":return "running";case "passed":return "success";case "failed":return "failed";case "skipped":return "skipped";case "cancelled":return "cancelled";case "error":return "failed";default:return "running"}}async getScenarioMessages(t){let s=[];if(!t.browser_session_id)return s;let r=await this.scenarioRepository.getBrowserSessionById(t.browser_session_id);if(!r)return s;let n=await this.scenarioRepository.getAgentStepsByBrowserSessionId(r.id),i;if(n.length>0){let d=n[n.length-1];(d.step_number-=0)&&(d.evaluation_previous_goal?.trim()&&d.evaluation_previous_goal.trim()?.toLowerCase()!=="n/a"&&s.push(R(d.evaluation_previous_goal,{icon:"\u{1F916}"},2e3)),d.next_goal?.trim()&&d.next_goal.trim()?.toLowerCase()!=="n/a"&&(i=R(d.next_goal,{icon:"\u{1F5A5}\uFE0F"},2e3)),d.thinking?.trim()&&d.thinking.trim()?.toLowerCase()!=="n/a"&&s.push(R(d.thinking,{icon:"\u{1F9E0}"},2e3)));}for(let d of n){let u=await this.scenarioRepository.getAgentStepActionsByStepId(d.id);for(let g of u)g.action&&s.push(R(g.action,{icon:"circle",iconColor:"gray",textColor:"gray"}));}for(let d of n){let u=await this.scenarioRepository.getAgentStepValidationsByStepId(d.id);for(let g of u){let I=[];if(g.validation_type&&I.push(`Type: ${g.validation_type}`),g.status&&I.push(`Status: ${g.status}`),g.summary&&I.push(`Summary: ${g.summary}`),g.reasoning&&I.push(`Reasoning: ${g.reasoning}`),g.actual_result&&I.push(`Actual: ${g.actual_result}`),g.failure_message&&I.push(`Failure: ${g.failure_message}`),g.next_step&&I.push(`Next: ${g.next_step}`),I.length>0){let v=I.join(" | ");g.status==="pass"?s.push(R(v,{icon:"check",iconColor:"green",textColor:"white"})):g.status==="fail"?s.push(R(v,{icon:"cross",iconColor:"red",textColor:"white"})):s.push(R(v));}}}let o=await this.scenarioRepository.getPassedValidationsByScenarioId(t.id);for(let d of o){let u=[];d.validation_type&&u.push(`Type: ${d.validation_type}`),d.description&&u.push(`Description: ${d.description}`),u.length>0&&s.push(R(u.join(" | "),{icon:"circle",iconColor:"gray",textColor:"gray"}));}let c=await this.scenarioRepository.getErrorsByScenarioId(t.id);for(let d of c)d.message&&s.push(R(d.message,{icon:"cross",iconColor:"red",textColor:"white"}));return i&&s.push(i),s}static createFeedItem(t,s){let r=Pr.mapScenarioStatusToFeedStatus(t.status);return {id:`scenario-${t.id}`,name:t.title,status:r,objectType:"Scenario",stateIndicators:[{status:"running",indicator:"\u{1F9EA}",color:"blue"},{status:"failing",indicator:"\u{1F9EA}",color:"red"}],currentMessages:s,colorTheme:"magenta",typewriterEffect:{enabled:true,charDelay:4,retainDuration:1e3,maxStreamCharLength:2e3,maxDisplayLength:300}}}};z.object({id:z.string(),test_session_id:z.string(),app_description:z.string().nullable(),app_rules:z.string().nullable(),personas:z.string().nullable(),agent_instructions:z.string().nullable(),test_data:z.string().nullable(),global_data:z.string().nullable(),filter:z.string().nullable()});z.object({sessionId:z.string(),title:z.string().nullable(),environment:z.string().nullable(),scenarios:z.number(),score:z.number().nullable(),passedValidations:z.number(),failedValidations:z.number(),failureGroups:z.number(),durationMs:z.number().nullable(),durationString:z.string()});var xr=class Ke{constructor(){this.client=null,this.context=null,this.initialized=false,this.enabled=true,this.debug=false,this.exceptionListenersSetup=false,this.clientPort=null,this.getUser=null;}initialize(t,s,r,n,i,o){if(!this.initialized){if(this.enabled=r,this.debug=n,this.clientPort=i,this.getUser=o,this.setupExceptionListeners(),!r){this.initialized=true;return}this.client=new PostHog(t,{host:s||"https://app.posthog.com",flushAt:10,flushInterval:5e3,disableGeoip:false}),this.initialized=true;}}setupExceptionListeners(){this.exceptionListenersSetup||(process.on("uncaughtException",async t=>{console.error("Uncaught exception:",t);try{await this.captureErrorEvent({error:t,context:{type:"uncaughtException"}}),await this.shutdown();}catch{}process.exit(1);}),process.on("unhandledRejection",async t=>{console.error("Unhandled rejection:",t);try{let s=t instanceof Error?t:new Error(String(t));await this.captureErrorEvent({error:s,context:{type:"unhandledRejection"}}),await this.shutdown();}catch{}process.exit(1);}),this.exceptionListenersSetup=true);}async captureErrorEvent(t){try{let s={message:t.error.message,name:t.error.name,stack:t.error.stack,...t.context};this.capture("exception",s,"exception");}catch{}}setCommandContext(t,s){let r=this.clientPort?.getRuntime()||{source:"cli",version:"1.0.0"};this.context={command:t,commandArgs:s,machineDetails:Ke.getMachineDetails(),terminalType:Ke.getTerminalType(),version:r.version,source:r.source,commandStartTime:Date.now(),commandSessionId:v4()};}setUserContext(t){if(!this.context){let s=this.clientPort?.getRuntime()||{source:"cli",version:"1.0.0"};this.context={command:"unknown",commandArgs:{},machineDetails:Ke.getMachineDetails(),terminalType:Ke.getTerminalType(),version:s.version,source:s.source,commandStartTime:Date.now(),commandSessionId:v4()};}this.context.user={id:t.id,orgId:t.organization?.id,authType:t.authType},this.identify(t),this.groupIdentify(t);}identify(t){let s={distinctId:t.id,properties:{id:t.id,name:t.name,email:t.email,authType:t.authType,orgId:t.organization?.id}};if(!this.enabled){this.debug&&console.log("[PostHog] identify:",s);return}if(this.client)try{this.client.identify(s);}catch{}}groupIdentify(t){let s=t.organization;if(!s)return;let r={groupType:"company",groupKey:s.id,properties:{id:s.id,name:s.name,plan:s.plan_type,status:s.subscription_status},distinctId:t.id};if(!this.enabled){this.debug&&console.log("[PostHog] groupIdentify:",r);return}if(this.client)try{this.client.groupIdentify(r);}catch{}}capture(t,s,r){let n=Date.now(),i=this.context?.commandStartTime||n,o=n-i,d=(this.getUser?.()||null)?.id||this.context?.user?.id||"anonymous",u=this.context?.user?.orgId?{company:this.context.user.orgId}:void 0,I={...{eventType:r||"custom",source:this.context?.source||"cli",command:this.context?.command||"unknown",commandArgs:this.context?.commandArgs||{},authType:this.context?.user?.authType,version:this.context?.version||"0.0",createdAt:new Date().toISOString(),terminalType:this.context?.terminalType||"unknown",machineDetails:this.context?.machineDetails||Ke.getMachineDetails(),commandStartTime:new Date(i).toISOString(),elapsedTime:o,commandSessionId:this.context?.commandSessionId||"unset"},...s||{}};if(!this.enabled){this.debug&&console.log("[PostHog] capture:",{distinctId:d,event:t,properties:I,groups:u});return}if(!(!this.client||!this.context))try{this.client.capture({distinctId:d,event:t,properties:I,groups:u});}catch{}}async shutdown(){if(this.client)try{await this.client.shutdown(),this.client=null,this.initialized=!1,this.context=null;}catch{}}async flush(){if(this.client)try{await this.client.flush();}catch{}}static getMachineDetails(){let t=ue.platform(),s=ue.release(),r=ue.hostname(),n=ue.totalmem(),i=ue.cpus(),o=t.toString();t==="darwin"?o="macOS":t==="win32"?o="Windows":t==="linux"&&(o="Linux");let c=(n/(1024*1024*1024)).toFixed(2)+"GB",d=i[0]?.model||"Unknown",u=i.length.toString(),g=i[0]?.speed?`${(i[0].speed/1e3).toFixed(2)}GHz`:"Unknown";return {os:o,osVersion:s,machineName:r,ram:c,cpu:d,cpuCount:u,cpuSpeed:g}}static getTerminalType(){let t=process.env.SHELL||"";return t.includes("zsh")?"zsh":t.includes("bash")?"bash":t.includes("powershell")||t.includes("pwsh")?"powershell":t.includes("cmd")?"cmd":t.includes("fish")?"fish":"unknown"}},us="user.json";async function Qi(e){try{let t=Je();await $.mkdir(t,{recursive:!0});let s=B.join(t,us);await $.writeFile(s,JSON.stringify(e,null,2),{mode:384});try{await $.chmod(s,384);}catch{}}catch{}}var eo=class{constructor(){this.user=null;}async setUser(e){this.user=e,await Qi(e);}getUser(){return this.user}async clearUser(){this.user=null;try{let e=Je(),t=B.join(e,us);await $.unlink(t);}catch{}}hasUser(){return this.user!==null}async loadUserFromFile(){try{let e=Je(),t=B.join(e,us),s=await $.readFile(t,"utf8"),r=JSON.parse(s);if(r&&r.id)return this.user=r,r}catch{}return null}},ae=new eo,At="access_token",Dt="refresh_token",Ft="auth_token",Nr=Je(),Ze=B.join(Nr,"tokens.enc"),Mr="aes-256-gcm",dt=16,wr=16;function Or(){let e=ue.hostname(),t=ue.homedir(),s="1f6af1b7-c1bb-45f6-85e9-1fc7d791b1c3";return ye.pbkdf2Sync(`${e}:${t}:${s}`,s,1e5,32,"sha256")}function kr(e){if(!e)return "";let t=Or(),s=ye.randomBytes(dt),r=ye.createCipheriv(Mr,t,s),n=r.update(e,"utf8");n=Buffer.concat([n,r.final()]);let i=r.getAuthTag();return Buffer.concat([s,i,n]).toString("base64")}function to(e){if(!e)return "";try{let t=Buffer.from(e,"base64"),s=t.subarray(0,dt),r=t.subarray(dt,dt+wr),n=t.subarray(dt+wr),i=Or(),o=ye.createDecipheriv(Mr,i,s);o.setAuthTag(r);let c=o.update(n);return c=Buffer.concat([c,o.final()]),c.toString("utf8")}catch{return ""}}async function Br(){await $.mkdir(Nr,{recursive:true});try{await $.access(Ze);}catch{let t=kr("{}");await $.writeFile(Ze,t,{mode:384});}try{await $.chmod(Ze,384);}catch{}}async function Le(){await Br();try{let e=await $.readFile(Ze,"utf8");if(!e||e.trim()==="")return {};let t=to(e);if(!t)return {};let s=JSON.parse(t);if(s&&typeof s=="object")return s}catch{}return {}}async function qe(e){await Br();let t=JSON.stringify(e,null,2),s=kr(t);await $.writeFile(Ze,s,{mode:384});try{await $.chmod(Ze,384);}catch{}}var ee=class{static async getAccessToken(){let t=(await Le())[At];return t&&t.trim()!==""?t:null}static async getRefreshToken(){let t=(await Le())[Dt];return t&&t.trim()!==""?t:null}static async saveAccessToken(e){let t=await Le();t[At]=e,await qe(t);}static async saveRefreshToken(e){let t=await Le();t[Dt]=e,await qe(t);}static async saveTokens(e,t){let s=await Le();s[At]=e,s[Dt]=t,await qe(s);}static async clearTokens(){let e=await Le();e[At]="",e[Dt]="",e[Ft]="",await qe(e),await ae.clearUser();}static async getAuthToken(){let t=(await Le())[Ft];return t&&t.trim()!==""?t:null}static async saveAuthToken(e){let t=await Le();t[Ft]=e,await qe(t);}static async clearAuthToken(){let e=await Le();e[Ft]="",await qe(e);}static async isAuthenticated(){return await this.getAccessToken()!==null}static async hasAuthToken(){return await this.getAuthToken()!==null}};var so={environment:"prod",auth:{authorizationUrl:"https://app.devassure.io/oauth/authorize",tokenUrl:"https://app.devassure.io/oauth/token",clientId:"M3oOg9oSnQksy4J2IFwd5zF2GekAEBi-DznaB-K8xKA",clientSecret:"YwFk23pHaQBF8azxt0KR8aMUwUANMl78cbEuQuJaq68",redirectUri:"http://127.0.0.1:3001/callback"},api:{baseUrl:"https://app.devassure.io"},posthog:{apiKey:"phc_GCpM30unLbtcxUSSWx5H2omEifldrXubk4FYM5kuVvA",host:"https://us.i.posthog.com",enabled:true}};var Pt=null;function Ot(){return Pt||(Pt=so,Pt)}function ct(){return Ot().auth}function ro(){return Ot().api}function $r(){return Ot().posthog}var Ur=class{constructor(){this.clientPort=null,this.webAppCall=null,this.eventService=null;}initialize(e,t,s){this.clientPort=e,this.webAppCall=t,this.eventService=s;}async login(){if(!this.clientPort)throw new Error("AuthService not initialized. Call initialize() first.");ct();let e=await this.clientPort.userPrompt({type:"confirm",message:"Open browser to login?",initialValue:true});if(!e.ok||e.value!==true)throw new Error("Login cancelled by user");let t=this.generateRandomString(32),s=this.generateRandomString(128),r=await this.generateCodeChallenge(s),{authCode:n,redirectUri:i}=await this.startCallbackServer(t,s,r),o=await this.exchangeCodeForTokens(n,s,i);await ee.clearAuthToken(),await ee.saveTokens(o.access_token,o.refresh_token);try{let c=await this.ping(o.access_token);c.authType="oauth",await ae.setUser(c),this.eventService?.setUserContext(c);}catch{}return o}async refreshToken(){let e=await ee.getRefreshToken();if(!e)throw new Error("No refresh token available. Please login again.");let t=ct();try{let s=Buffer.from(`${t.clientId}:${t.clientSecret}`).toString("base64"),r=await fetch(t.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Basic ${s}`},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e})});if(!r.ok){let i=await r.text();throw new Error(`Token refresh failed: ${r.status} ${i}`)}let n=await r.json();if(!n.access_token||!n.refresh_token)throw new Error("Invalid token response");await ee.clearAuthToken(),await ee.saveTokens(n.access_token,n.refresh_token);try{let i=await this.ping(n.access_token);i.authType="oauth",await ae.setUser(i),this.eventService?.setUserContext(i);}catch{}return n}catch(s){throw await ee.clearTokens(),s}}async ping(e){if(!this.webAppCall||!this.eventService)throw new Error("AuthService not initialized. Call initialize() first.");let t=await this.webAppCall("post","/oauth/ping",{},{},true,{Authorization:`Bearer ${e}`},void 0,this);if(this.eventService.capture("ping",{tokenType:"oauth",success:t.status!==200||!t.data,statusCode:t.status||0,endpoint:"/oauth/ping"}),t.exception)throw new Error(`Authentication ping failed: ${t.exception}`);if(!t.data)throw new Error("Authentication ping failed: No user data returned");if(t.status!==200)throw new Error(`Authentication ping failed: ${t.status} ${t.statusText}`);return t.data?.user}async jobPing(e,t="token"){if(!this.webAppCall||!this.eventService)throw new Error("AuthService not initialized. Call initialize() first.");let s=await this.webAppCall("post","/job_ping",{},{},false,{Authorization:`JWT ${e}`},void 0,this);if(this.eventService.capture("ping",{tokenType:t,success:s.status===200&&!!s.data,statusCode:s.status||0,endpoint:"/job_ping"}),s.exception)throw new Error(`Job ping failed: ${s.exception}`);if(!s.data)throw new Error("Job ping failed: No user data returned");if(s.status!==200)throw new Error(`Job ping failed: ${s.status} ${s.statusText}`);return s.data?.user}async ensureAuthenticated(){let e=await ee.getAccessToken();if(e)try{let t=await this.ping(e);return t.authType="oauth",await ae.setUser(t),this.eventService?.setUserContext(t),e}catch{try{let s=await this.refreshToken(),r=await this.ping(s.access_token);return r.authType="oauth",await ae.setUser(r),this.eventService?.setUserContext(r),s.access_token}catch{throw await ae.clearUser(),new Error("Not authenticated. Please login to authenticate.")}}try{let t=await this.refreshToken(),s=await this.ping(t.access_token);return s.authType="oauth",await ae.setUser(s),this.eventService?.setUserContext(s),t.access_token}catch{throw await ae.clearUser(),new Error("Not authenticated. Please login to authenticate.")}}async startCallbackServer(e,t,s){if(!this.clientPort)throw new Error("AuthService not initialized. Call initialize() first.");let r=ct(),n=new URL(r.redirectUri),i=n.port?parseInt(n.port,10):3e3,o=n.hostname,c=10;for(let d=0;d<c;d++){let u=i+d;try{return await this.tryStartServer(u,e,t,s,o,n.pathname)}catch(g){if(g.code==="EADDRINUSE"&&d<c-1)continue;throw d===c-1?new Error(`Could not find an available port after ${c} attempts starting from ${i}.
|
|
5
|
+
var Xn=Object.create;var xs=Object.defineProperty;var Jn=Object.getOwnPropertyDescriptor;var Qn=Object.getOwnPropertyNames;var ei=Object.getPrototypeOf,ti=Object.prototype.hasOwnProperty;var ke=(e=>typeof require$1<"u"?require$1:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require$1<"u"?require$1:t)[s]}):e)(function(e){if(typeof require$1<"u")return require$1.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var si=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Qn(t))!ti.call(e,n)&&n!==s&&xs(e,n,{get:()=>t[n],enumerable:!(r=Jn(t,n))||r.enumerable});return e};var ri=(e,t,s)=>(s=e!=null?Xn(ei(e)):{},si(xs(s,"default",{value:e,enumerable:true}),e));var ss=ce((Ea,ks)=>{ks.exports={LOCHDR:30,LOCSIG:67324752,LOCVER:4,LOCFLG:6,LOCHOW:8,LOCTIM:10,LOCCRC:14,LOCSIZ:18,LOCLEN:22,LOCNAM:26,LOCEXT:28,EXTSIG:134695760,EXTHDR:16,EXTCRC:4,EXTSIZ:8,EXTLEN:12,CENHDR:46,CENSIG:33639248,CENVEM:4,CENVER:6,CENFLG:8,CENHOW:10,CENTIM:12,CENCRC:16,CENSIZ:20,CENLEN:24,CENNAM:28,CENEXT:30,CENCOM:32,CENDSK:34,CENATT:36,CENATX:38,CENOFF:42,ENDHDR:22,ENDSIG:101010256,ENDSUB:8,ENDTOT:10,ENDSIZ:12,ENDOFF:16,ENDCOM:20,END64HDR:20,END64SIG:117853008,END64START:4,END64OFF:8,END64NUMDISKS:16,ZIP64SIG:101075792,ZIP64HDR:56,ZIP64LEAD:12,ZIP64SIZE:4,ZIP64VEM:12,ZIP64VER:14,ZIP64DSK:16,ZIP64DSKDIR:20,ZIP64SUB:24,ZIP64TOT:32,ZIP64SIZB:40,ZIP64OFF:48,ZIP64EXTRA:56,STORED:0,SHRUNK:1,REDUCED1:2,REDUCED2:3,REDUCED3:4,REDUCED4:5,IMPLODED:6,DEFLATED:8,ENHANCED_DEFLATED:9,PKWARE:10,BZIP2:12,LZMA:14,IBM_TERSE:18,IBM_LZ77:19,AES_ENCRYPT:99,FLG_ENC:1,FLG_COMP1:2,FLG_COMP2:4,FLG_DESC:8,FLG_ENH:16,FLG_PATCH:32,FLG_STR:64,FLG_EFS:2048,FLG_MSK:4096,FILE:2,BUFFER:1,NONE:0,EF_ID:0,EF_SIZE:2,ID_ZIP64:1,ID_AVINFO:7,ID_PFS:8,ID_OS2:9,ID_NTFS:10,ID_OPENVMS:12,ID_UNIX:13,ID_FORK:14,ID_PATCH:15,ID_X509_PKCS7:20,ID_X509_CERTID_F:21,ID_X509_CERTID_C:22,ID_STRONGENC:23,ID_RECORD_MGT:24,ID_X509_PKCS7_RL:25,ID_IBM1:101,ID_IBM2:102,ID_POSZIP:18064,EF_ZIP64_OR_32:4294967295,EF_ZIP64_OR_16:65535,EF_ZIP64_SUNCOMP:0,EF_ZIP64_SCOMP:8,EF_ZIP64_RHO:16,EF_ZIP64_DSN:24};});var It=ce($s=>{var Bs={INVALID_LOC:"Invalid LOC header (bad signature)",INVALID_CEN:"Invalid CEN header (bad signature)",INVALID_END:"Invalid END header (bad signature)",DESCRIPTOR_NOT_EXIST:"No descriptor present",DESCRIPTOR_UNKNOWN:"Unknown descriptor format",DESCRIPTOR_FAULTY:"Descriptor data is malformed",NO_DATA:"Nothing to decompress",BAD_CRC:"CRC32 checksum failed {0}",FILE_IN_THE_WAY:"There is a file in the way: {0}",UNKNOWN_METHOD:"Invalid/unsupported compression method",AVAIL_DATA:"inflate::Available inflate data did not terminate",INVALID_DISTANCE:"inflate::Invalid literal/length or distance code in fixed or dynamic block",TO_MANY_CODES:"inflate::Dynamic block code description: too many length or distance codes",INVALID_REPEAT_LEN:"inflate::Dynamic block code description: repeat more than specified lengths",INVALID_REPEAT_FIRST:"inflate::Dynamic block code description: repeat lengths with no first length",INCOMPLETE_CODES:"inflate::Dynamic block code description: code lengths codes incomplete",INVALID_DYN_DISTANCE:"inflate::Dynamic block code description: invalid distance code lengths",INVALID_CODES_LEN:"inflate::Dynamic block code description: invalid literal/length code lengths",INVALID_STORE_BLOCK:"inflate::Stored block length did not match one's complement",INVALID_BLOCK_TYPE:"inflate::Invalid block type (type == 3)",CANT_EXTRACT_FILE:"Could not extract the file",CANT_OVERRIDE:"Target file already exists",DISK_ENTRY_TOO_LARGE:"Number of disk entries is too large",NO_ZIP:"No zip file was loaded",NO_ENTRY:"Entry doesn't exist",DIRECTORY_CONTENT_ERROR:"A directory cannot have content",FILE_NOT_FOUND:'File not found: "{0}"',NOT_IMPLEMENTED:"Not implemented",INVALID_FILENAME:"Invalid filename",INVALID_FORMAT:"Invalid or unsupported zip format. No END header found",INVALID_PASS_PARAM:"Incompatible password parameter",WRONG_PASSWORD:"Wrong Password",COMMENT_TOO_LONG:"Comment is too long",EXTRA_FIELD_PARSE_ERROR:"Extra field parsing error"};function oi(e){return function(...t){return t.length&&(e=e.replace(/\{(\d)\}/g,(s,r)=>t[r]||"")),new Error("ADM-ZIP: "+e)}}for(let e of Object.keys(Bs))$s[e]=oi(Bs[e]);});var js=ce((Ca,Gs)=>{var ai=ke("fs"),re=ke("path"),Us=ss(),ci=It(),li=typeof process=="object"&&process.platform==="win32",Hs=e=>typeof e=="object"&&e!==null,zs=new Uint32Array(256).map((e,t)=>{for(let s=0;s<8;s++)(t&1)!==0?t=3988292384^t>>>1:t>>>=1;return t>>>0});function K(e){this.sep=re.sep,this.fs=ai,Hs(e)&&Hs(e.fs)&&typeof e.fs.statSync=="function"&&(this.fs=e.fs);}Gs.exports=K;K.prototype.makeDir=function(e){let t=this;function s(r){let n=r.split(t.sep)[0];r.split(t.sep).forEach(function(i){if(!(!i||i.substr(-1,1)===":")){n+=t.sep+i;var o;try{o=t.fs.statSync(n);}catch{t.fs.mkdirSync(n);}if(o&&o.isFile())throw ci.FILE_IN_THE_WAY(`"${n}"`)}});}s(e);};K.prototype.writeFileTo=function(e,t,s,r){let n=this;if(n.fs.existsSync(e)){if(!s)return false;var i=n.fs.statSync(e);if(i.isDirectory())return false}var o=re.dirname(e);n.fs.existsSync(o)||n.makeDir(o);var a;try{a=n.fs.openSync(e,"w",438);}catch{n.fs.chmodSync(e,438),a=n.fs.openSync(e,"w",438);}if(a)try{n.fs.writeSync(a,t,0,t.length,0);}finally{n.fs.closeSync(a);}return n.fs.chmodSync(e,r||438),true};K.prototype.writeFileToAsync=function(e,t,s,r,n){typeof r=="function"&&(n=r,r=void 0);let i=this;i.fs.exists(e,function(o){if(o&&!s)return n(false);i.fs.stat(e,function(a,d){if(o&&d.isDirectory())return n(false);var u=re.dirname(e);i.fs.exists(u,function(p){p||i.makeDir(u),i.fs.open(e,"w",438,function(I,v){I?i.fs.chmod(e,438,function(){i.fs.open(e,"w",438,function(c,h){i.fs.write(h,t,0,t.length,0,function(){i.fs.close(h,function(){i.fs.chmod(e,r||438,function(){n(true);});});});});}):v?i.fs.write(v,t,0,t.length,0,function(){i.fs.close(v,function(){i.fs.chmod(e,r||438,function(){n(true);});});}):i.fs.chmod(e,r||438,function(){n(true);});});});});});};K.prototype.findFiles=function(e){let t=this;function s(r,n,i){let o=[];return t.fs.readdirSync(r).forEach(function(a){let d=re.join(r,a),u=t.fs.statSync(d);o.push(re.normalize(d)+(u.isDirectory()?t.sep:"")),u.isDirectory()&&i&&(o=o.concat(s(d,n,i)));}),o}return s(e,void 0,true)};K.prototype.findFilesAsync=function(e,t){let s=this,r=[];s.fs.readdir(e,function(n,i){if(n)return t(n);let o=i.length;if(!o)return t(null,r);i.forEach(function(a){a=re.join(e,a),s.fs.stat(a,function(d,u){if(d)return t(d);u&&(r.push(re.normalize(a)+(u.isDirectory()?s.sep:"")),u.isDirectory()?s.findFilesAsync(a,function(p,I){if(p)return t(p);r=r.concat(I),--o||t(null,r);}):--o||t(null,r));});});});};K.prototype.getAttributes=function(){};K.prototype.setAttributes=function(){};K.crc32update=function(e,t){return zs[(e^t)&255]^e>>>8};K.crc32=function(e){typeof e=="string"&&(e=Buffer.from(e,"utf8"));let t=e.length,s=-1;for(let r=0;r<t;)s=K.crc32update(s,e[r++]);return ~s>>>0};K.methodToString=function(e){switch(e){case Us.STORED:return "STORED ("+e+")";case Us.DEFLATED:return "DEFLATED ("+e+")";default:return "UNSUPPORTED ("+e+")"}};K.canonical=function(e){if(!e)return "";let t=re.posix.normalize("/"+e.split("\\").join("/"));return re.join(".",t)};K.zipnamefix=function(e){if(!e)return "";let t=re.posix.normalize("/"+e.split("\\").join("/"));return re.posix.join(".",t)};K.findLast=function(e,t){if(!Array.isArray(e))throw new TypeError("arr is not array");let s=e.length>>>0;for(let r=s-1;r>=0;r--)if(t(e[r],r,e))return e[r]};K.sanitize=function(e,t){e=re.resolve(re.normalize(e));for(var s=t.split("/"),r=0,n=s.length;r<n;r++){var i=re.normalize(re.join(e,s.slice(r,n).join(re.sep)));if(i.indexOf(e)===0)return i}return re.normalize(re.join(e,re.basename(t)))};K.toBuffer=function(t,s){return Buffer.isBuffer(t)?t:t instanceof Uint8Array?Buffer.from(t):typeof t=="string"?s(t):Buffer.alloc(0)};K.readBigUInt64LE=function(e,t){var s=Buffer.from(e.slice(t,t+8));return s.swap64(),parseInt(`0x${s.toString("hex")}`)};K.fromDOS2Date=function(e){return new Date((e>>25&127)+1980,Math.max((e>>21&15)-1,0),Math.max(e>>16&31,1),e>>11&31,e>>5&63,(e&31)<<1)};K.fromDate2DOS=function(e){let t=0,s=0;return e.getFullYear()>1979&&(t=(e.getFullYear()-1980&127)<<9|e.getMonth()+1<<5|e.getDate(),s=e.getHours()<<11|e.getMinutes()<<5|e.getSeconds()>>1),t<<16|s};K.isWin=li;K.crcTable=zs;});var Vs=ce((va,Ws)=>{var ui=ke("path");Ws.exports=function(e,{fs:t}){var s=e||"",r=i(),n=null;function i(){return {directory:false,readonly:false,hidden:false,executable:false,mtime:0,atime:0}}return s&&t.existsSync(s)?(n=t.statSync(s),r.directory=n.isDirectory(),r.mtime=n.mtime,r.atime=n.atime,r.executable=(73&n.mode)!==0,r.readonly=(128&n.mode)===0,r.hidden=ui.basename(s)[0]==="."):console.warn("Invalid path: "+s),{get directory(){return r.directory},get readOnly(){return r.readonly},get hidden(){return r.hidden},get mtime(){return r.mtime},get atime(){return r.atime},get executable(){return r.executable},decodeAttributes:function(){},encodeAttributes:function(){},toJSON:function(){return {path:s,isDirectory:r.directory,isReadOnly:r.readonly,isHidden:r.hidden,isExecutable:r.executable,mTime:r.mtime,aTime:r.atime}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var qs=ce((Ta,Ys)=>{Ys.exports={efs:true,encode:e=>Buffer.from(e,"utf8"),decode:e=>e.toString("utf8")};});var Ve=ce((ba,We)=>{We.exports=js();We.exports.Constants=ss();We.exports.Errors=It();We.exports.FileAttr=Vs();We.exports.decoder=qs();});var Zs=ce((Ra,Ks)=>{var De=Ve(),A=De.Constants;Ks.exports=function(){var e=20,t=10,s=0,r=0,n=0,i=0,o=0,a=0,d=0,u=0,p=0,I=0,v=0,c=0,h=0;e|=De.isWin?2560:768,s|=A.FLG_EFS;let g={extraLen:0},y=l=>Math.max(0,l)>>>0,w=l=>Math.max(0,l)&255;return n=De.fromDate2DOS(new Date),{get made(){return e},set made(l){e=l;},get version(){return t},set version(l){t=l;},get flags(){return s},set flags(l){s=l;},get flags_efs(){return (s&A.FLG_EFS)>0},set flags_efs(l){l?s|=A.FLG_EFS:s&=~A.FLG_EFS;},get flags_desc(){return (s&A.FLG_DESC)>0},set flags_desc(l){l?s|=A.FLG_DESC:s&=~A.FLG_DESC;},get method(){return r},set method(l){switch(l){case A.STORED:this.version=10;case A.DEFLATED:default:this.version=20;}r=l;},get time(){return De.fromDOS2Date(this.timeval)},set time(l){this.timeval=De.fromDate2DOS(l);},get timeval(){return n},set timeval(l){n=y(l);},get timeHighByte(){return w(n>>>8)},get crc(){return i},set crc(l){i=y(l);},get compressedSize(){return o},set compressedSize(l){o=y(l);},get size(){return a},set size(l){a=y(l);},get fileNameLength(){return d},set fileNameLength(l){d=l;},get extraLength(){return u},set extraLength(l){u=l;},get extraLocalLength(){return g.extraLen},set extraLocalLength(l){g.extraLen=l;},get commentLength(){return p},set commentLength(l){p=l;},get diskNumStart(){return I},set diskNumStart(l){I=y(l);},get inAttr(){return v},set inAttr(l){v=y(l);},get attr(){return c},set attr(l){c=y(l);},get fileAttr(){return (c||0)>>16&4095},get offset(){return h},set offset(l){h=y(l);},get encrypted(){return (s&A.FLG_ENC)===A.FLG_ENC},get centralHeaderSize(){return A.CENHDR+d+u+p},get realDataOffset(){return h+A.LOCHDR+g.fnameLen+g.extraLen},get localHeader(){return g},loadLocalHeaderFromBinary:function(l){var C=l.slice(h,h+A.LOCHDR);if(C.readUInt32LE(0)!==A.LOCSIG)throw De.Errors.INVALID_LOC();g.version=C.readUInt16LE(A.LOCVER),g.flags=C.readUInt16LE(A.LOCFLG),g.method=C.readUInt16LE(A.LOCHOW),g.time=C.readUInt32LE(A.LOCTIM),g.crc=C.readUInt32LE(A.LOCCRC),g.compressedSize=C.readUInt32LE(A.LOCSIZ),g.size=C.readUInt32LE(A.LOCLEN),g.fnameLen=C.readUInt16LE(A.LOCNAM),g.extraLen=C.readUInt16LE(A.LOCEXT);let f=h+A.LOCHDR+g.fnameLen,_=f+g.extraLen;return l.slice(f,_)},loadFromBinary:function(l){if(l.length!==A.CENHDR||l.readUInt32LE(0)!==A.CENSIG)throw De.Errors.INVALID_CEN();e=l.readUInt16LE(A.CENVEM),t=l.readUInt16LE(A.CENVER),s=l.readUInt16LE(A.CENFLG),r=l.readUInt16LE(A.CENHOW),n=l.readUInt32LE(A.CENTIM),i=l.readUInt32LE(A.CENCRC),o=l.readUInt32LE(A.CENSIZ),a=l.readUInt32LE(A.CENLEN),d=l.readUInt16LE(A.CENNAM),u=l.readUInt16LE(A.CENEXT),p=l.readUInt16LE(A.CENCOM),I=l.readUInt16LE(A.CENDSK),v=l.readUInt16LE(A.CENATT),c=l.readUInt32LE(A.CENATX),h=l.readUInt32LE(A.CENOFF);},localHeaderToBinary:function(){var l=Buffer.alloc(A.LOCHDR);return l.writeUInt32LE(A.LOCSIG,0),l.writeUInt16LE(t,A.LOCVER),l.writeUInt16LE(s,A.LOCFLG),l.writeUInt16LE(r,A.LOCHOW),l.writeUInt32LE(n,A.LOCTIM),l.writeUInt32LE(i,A.LOCCRC),l.writeUInt32LE(o,A.LOCSIZ),l.writeUInt32LE(a,A.LOCLEN),l.writeUInt16LE(d,A.LOCNAM),l.writeUInt16LE(g.extraLen,A.LOCEXT),l},centralHeaderToBinary:function(){var l=Buffer.alloc(A.CENHDR+d+u+p);return l.writeUInt32LE(A.CENSIG,0),l.writeUInt16LE(e,A.CENVEM),l.writeUInt16LE(t,A.CENVER),l.writeUInt16LE(s,A.CENFLG),l.writeUInt16LE(r,A.CENHOW),l.writeUInt32LE(n,A.CENTIM),l.writeUInt32LE(i,A.CENCRC),l.writeUInt32LE(o,A.CENSIZ),l.writeUInt32LE(a,A.CENLEN),l.writeUInt16LE(d,A.CENNAM),l.writeUInt16LE(u,A.CENEXT),l.writeUInt16LE(p,A.CENCOM),l.writeUInt16LE(I,A.CENDSK),l.writeUInt16LE(v,A.CENATT),l.writeUInt32LE(c,A.CENATX),l.writeUInt32LE(h,A.CENOFF),l},toJSON:function(){let l=function(C){return C+" bytes"};return {made:e,version:t,flags:s,method:De.methodToString(r),time:this.time,crc:"0x"+i.toString(16).toUpperCase(),compressedSize:l(o),size:l(a),fileNameLength:l(d),extraLength:l(u),commentLength:l(p),diskNumStart:I,inAttr:v,attr:c,offset:h,centralHeaderSize:l(A.CENHDR+d+u+p)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var Js=ce((_a,Xs)=>{var Ye=Ve(),V=Ye.Constants;Xs.exports=function(){var e=0,t=0,s=0,r=0,n=0;return {get diskEntries(){return e},set diskEntries(i){e=t=i;},get totalEntries(){return t},set totalEntries(i){t=e=i;},get size(){return s},set size(i){s=i;},get offset(){return r},set offset(i){r=i;},get commentLength(){return n},set commentLength(i){n=i;},get mainHeaderSize(){return V.ENDHDR+n},loadFromBinary:function(i){if((i.length!==V.ENDHDR||i.readUInt32LE(0)!==V.ENDSIG)&&(i.length<V.ZIP64HDR||i.readUInt32LE(0)!==V.ZIP64SIG))throw Ye.Errors.INVALID_END();i.readUInt32LE(0)===V.ENDSIG?(e=i.readUInt16LE(V.ENDSUB),t=i.readUInt16LE(V.ENDTOT),s=i.readUInt32LE(V.ENDSIZ),r=i.readUInt32LE(V.ENDOFF),n=i.readUInt16LE(V.ENDCOM)):(e=Ye.readBigUInt64LE(i,V.ZIP64SUB),t=Ye.readBigUInt64LE(i,V.ZIP64TOT),s=Ye.readBigUInt64LE(i,V.ZIP64SIZE),r=Ye.readBigUInt64LE(i,V.ZIP64OFF),n=0);},toBinary:function(){var i=Buffer.alloc(V.ENDHDR+n);return i.writeUInt32LE(V.ENDSIG,0),i.writeUInt32LE(0,4),i.writeUInt16LE(e,V.ENDSUB),i.writeUInt16LE(t,V.ENDTOT),i.writeUInt32LE(s,V.ENDSIZ),i.writeUInt32LE(r,V.ENDOFF),i.writeUInt16LE(n,V.ENDCOM),i.fill(" ",V.ENDHDR),i},toJSON:function(){let i=function(o,a){let d=o.toString(16).toUpperCase();for(;d.length<a;)d="0"+d;return "0x"+d};return {diskEntries:e,totalEntries:t,size:s+" bytes",offset:i(r,4),commentLength:n}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var ns=ce(rs=>{rs.EntryHeader=Zs();rs.MainHeader=Js();});var er=ce((Aa,Qs)=>{Qs.exports=function(e){var t=ke("zlib"),s={chunkSize:(parseInt(e.length/1024)+1)*1024};return {deflate:function(){return t.deflateRawSync(e,s)},deflateAsync:function(r){var n=t.createDeflateRaw(s),i=[],o=0;n.on("data",function(a){i.push(a),o+=a.length;}),n.on("end",function(){var a=Buffer.alloc(o),d=0;a.fill(0);for(var u=0;u<i.length;u++){var p=i[u];p.copy(a,d),d+=p.length;}r&&r(a);}),n.end(e);}}};});var sr=ce((Fa,tr)=>{var di=+(process.versions?process.versions.node:"").split(".")[0]||0;tr.exports=function(e,t){var s=ke("zlib");let r=di>=15&&t>0?{maxOutputLength:t}:{};return {inflate:function(){return s.inflateRawSync(e,r)},inflateAsync:function(n){var i=s.createInflateRaw(r),o=[],a=0;i.on("data",function(d){o.push(d),a+=d.length;}),i.on("end",function(){var d=Buffer.alloc(a),u=0;d.fill(0);for(var p=0;p<o.length;p++){var I=o[p];I.copy(d,u),u+=I.length;}n&&n(d);}),i.end(e);}}};});var ar=ce((Da,or)=>{var{randomFillSync:rr}=ke("crypto"),pi=It(),fi=new Uint32Array(256).map((e,t)=>{for(let s=0;s<8;s++)(t&1)!==0?t=t>>>1^3988292384:t>>>=1;return t>>>0}),ir=(e,t)=>Math.imul(e,t)>>>0,nr=(e,t)=>fi[(e^t)&255]^e>>>8,ot=()=>typeof rr=="function"?rr(Buffer.alloc(12)):ot.node();ot.node=()=>{let e=Buffer.alloc(12),t=e.length;for(let s=0;s<t;s++)e[s]=Math.random()*256&255;return e};var Ct={genSalt:ot};function vt(e){let t=Buffer.isBuffer(e)?e:Buffer.from(e);this.keys=new Uint32Array([305419896,591751049,878082192]);for(let s=0;s<t.length;s++)this.updateKeys(t[s]);}vt.prototype.updateKeys=function(e){let t=this.keys;return t[0]=nr(t[0],e),t[1]+=t[0]&255,t[1]=ir(t[1],134775813)+1,t[2]=nr(t[2],t[1]>>>24),e};vt.prototype.next=function(){let e=(this.keys[2]|2)>>>0;return ir(e,e^1)>>8&255};function gi(e){let t=new vt(e);return function(s){let r=Buffer.alloc(s.length),n=0;for(let i of s)r[n++]=t.updateKeys(i^t.next());return r}}function mi(e){let t=new vt(e);return function(s,r,n=0){r||(r=Buffer.alloc(s.length));for(let i of s){let o=t.next();r[n++]=i^o,t.updateKeys(i);}return r}}function hi(e,t,s){if(!e||!Buffer.isBuffer(e)||e.length<12)return Buffer.alloc(0);let r=gi(s),n=r(e.slice(0,12)),i=(t.flags&8)===8?t.timeHighByte:t.crc>>>24;if(n[11]!==i)throw pi.WRONG_PASSWORD();return r(e.slice(12))}function yi(e){Buffer.isBuffer(e)&&e.length>=12?Ct.genSalt=function(){return e.slice(0,12)}:e==="node"?Ct.genSalt=ot.node:Ct.genSalt=ot;}function wi(e,t,s,r=false){e==null&&(e=Buffer.alloc(0)),Buffer.isBuffer(e)||(e=Buffer.from(e.toString()));let n=mi(s),i=Ct.genSalt();i[11]=t.crc>>>24&255,r&&(i[10]=t.crc>>>16&255);let o=Buffer.alloc(e.length+12);return n(i,o),n(e,o,12)}or.exports={decrypt:hi,encrypt:wi,_salter:yi};});var cr=ce(Tt=>{Tt.Deflater=er();Tt.Inflater=sr();Tt.ZipCrypto=ar();});var os=ce((xa,lr)=>{var H=Ve(),Si=ns(),Z=H.Constants,is=cr();lr.exports=function(e,t){var s=new Si.EntryHeader,r=Buffer.alloc(0),n=Buffer.alloc(0),i=false,o=null,a=Buffer.alloc(0),d=Buffer.alloc(0),u=true;let p=e,I=typeof p.decoder=="object"?p.decoder:H.decoder;u=I.hasOwnProperty("efs")?I.efs:false;function v(){return !t||!(t instanceof Uint8Array)?Buffer.alloc(0):(d=s.loadLocalHeaderFromBinary(t),t.slice(s.realDataOffset,s.realDataOffset+s.compressedSize))}function c(l){if(s.flags_desc){let C={},f=s.realDataOffset+s.compressedSize;if(t.readUInt32LE(f)==Z.LOCSIG||t.readUInt32LE(f)==Z.CENSIG)throw H.Errors.DESCRIPTOR_NOT_EXIST();if(t.readUInt32LE(f)==Z.EXTSIG)C.crc=t.readUInt32LE(f+Z.EXTCRC),C.compressedSize=t.readUInt32LE(f+Z.EXTSIZ),C.size=t.readUInt32LE(f+Z.EXTLEN);else if(t.readUInt16LE(f+12)===19280)C.crc=t.readUInt32LE(f+Z.EXTCRC-4),C.compressedSize=t.readUInt32LE(f+Z.EXTSIZ-4),C.size=t.readUInt32LE(f+Z.EXTLEN-4);else throw H.Errors.DESCRIPTOR_UNKNOWN();if(C.compressedSize!==s.compressedSize||C.size!==s.size||C.crc!==s.crc)throw H.Errors.DESCRIPTOR_FAULTY();if(H.crc32(l)!==C.crc)return false}else if(H.crc32(l)!==s.localHeader.crc)return false;return true}function h(l,C,f){if(typeof C>"u"&&typeof l=="string"&&(f=l,l=void 0),i)return l&&C&&C(Buffer.alloc(0),H.Errors.DIRECTORY_CONTENT_ERROR()),Buffer.alloc(0);var _=v();if(_.length===0)return l&&C&&C(_),_;if(s.encrypted){if(typeof f!="string"&&!Buffer.isBuffer(f))throw H.Errors.INVALID_PASS_PARAM();_=is.ZipCrypto.decrypt(_,s,f);}var T=Buffer.alloc(s.size);switch(s.method){case H.Constants.STORED:if(_.copy(T),c(T))return l&&C&&C(T),T;throw l&&C&&C(T,H.Errors.BAD_CRC()),H.Errors.BAD_CRC();case H.Constants.DEFLATED:var P=new is.Inflater(_,s.size);if(l)P.inflateAsync(function(x){x.copy(x,0),C&&(c(x)?C(x):C(x,H.Errors.BAD_CRC()));});else {if(P.inflate(T).copy(T,0),!c(T))throw H.Errors.BAD_CRC(`"${I.decode(r)}"`);return T}break;default:throw l&&C&&C(Buffer.alloc(0),H.Errors.UNKNOWN_METHOD()),H.Errors.UNKNOWN_METHOD()}}function g(l,C){if((!o||!o.length)&&Buffer.isBuffer(t))return l&&C&&C(v()),v();if(o.length&&!i){var f;switch(s.method){case H.Constants.STORED:return s.compressedSize=s.size,f=Buffer.alloc(o.length),o.copy(f),l&&C&&C(f),f;default:case H.Constants.DEFLATED:var _=new is.Deflater(o);if(l)_.deflateAsync(function(P){f=Buffer.alloc(P.length),s.compressedSize=P.length,P.copy(f),C&&C(f);});else {var T=_.deflate();return s.compressedSize=T.length,T}_=null;break}}else if(l&&C)C(Buffer.alloc(0));else return Buffer.alloc(0)}function y(l,C){return (l.readUInt32LE(C+4)<<4)+l.readUInt32LE(C)}function m(l){try{for(var C=0,f,_,T;C+4<l.length;)f=l.readUInt16LE(C),C+=2,_=l.readUInt16LE(C),C+=2,T=l.slice(C,C+_),C+=_,Z.ID_ZIP64===f&&w(T);}catch{throw H.Errors.EXTRA_FIELD_PARSE_ERROR()}}function w(l){var C,f,_,T;l.length>=Z.EF_ZIP64_SCOMP&&(C=y(l,Z.EF_ZIP64_SUNCOMP),s.size===Z.EF_ZIP64_OR_32&&(s.size=C)),l.length>=Z.EF_ZIP64_RHO&&(f=y(l,Z.EF_ZIP64_SCOMP),s.compressedSize===Z.EF_ZIP64_OR_32&&(s.compressedSize=f)),l.length>=Z.EF_ZIP64_DSN&&(_=y(l,Z.EF_ZIP64_RHO),s.offset===Z.EF_ZIP64_OR_32&&(s.offset=_)),l.length>=Z.EF_ZIP64_DSN+4&&(T=l.readUInt32LE(Z.EF_ZIP64_DSN),s.diskNumStart===Z.EF_ZIP64_OR_16&&(s.diskNumStart=T));}return {get entryName(){return I.decode(r)},get rawEntryName(){return r},set entryName(l){r=H.toBuffer(l,I.encode);var C=r[r.length-1];i=C===47||C===92,s.fileNameLength=r.length;},get efs(){return typeof u=="function"?u(this.entryName):u},get extra(){return a},set extra(l){a=l,s.extraLength=l.length,m(l);},get comment(){return I.decode(n)},set comment(l){if(n=H.toBuffer(l,I.encode),s.commentLength=n.length,n.length>65535)throw H.Errors.COMMENT_TOO_LONG()},get name(){var l=I.decode(r);return i?l.substr(l.length-1).split("/").pop():l.split("/").pop()},get isDirectory(){return i},getCompressedData:function(){return g(false,null)},getCompressedDataAsync:function(l){g(true,l);},setData:function(l){o=H.toBuffer(l,H.decoder.encode),!i&&o.length?(s.size=o.length,s.method=H.Constants.DEFLATED,s.crc=H.crc32(l),s.changed=true):s.method=H.Constants.STORED;},getData:function(l){return s.changed?o:h(false,null,l)},getDataAsync:function(l,C){s.changed?l(o):h(true,l,C);},set attr(l){s.attr=l;},get attr(){return s.attr},set header(l){s.loadFromBinary(l);},get header(){return s},packCentralHeader:function(){s.flags_efs=this.efs,s.extraLength=a.length;var l=s.centralHeaderToBinary(),C=H.Constants.CENHDR;return r.copy(l,C),C+=r.length,a.copy(l,C),C+=s.extraLength,n.copy(l,C),l},packLocalHeader:function(){let l=0;s.flags_efs=this.efs,s.extraLocalLength=d.length;let C=s.localHeaderToBinary(),f=Buffer.alloc(C.length+r.length+s.extraLocalLength);return C.copy(f,l),l+=C.length,r.copy(f,l),l+=r.length,d.copy(f,l),l+=d.length,f},toJSON:function(){let l=function(C){return "<"+(C&&C.length+" bytes buffer"||"null")+">"};return {entryName:this.entryName,name:this.name,comment:this.comment,isDirectory:this.isDirectory,header:s.toJSON(),compressedData:l(t),data:l(o)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}};});var pr=ce((Na,dr)=>{var ur=os(),Ei=ns(),ae=Ve();dr.exports=function(e,t){var s=[],r={},n=Buffer.alloc(0),i=new Ei.MainHeader,o=false;let d=new Set,u=t,{noSort:p,decoder:I}=u;e?h(u.readEntries):o=true;function v(){let y=new Set;for(let m of Object.keys(r)){let w=m.split("/");if(w.pop(),!!w.length)for(let l=0;l<w.length;l++){let C=w.slice(0,l+1).join("/")+"/";y.add(C);}}for(let m of y)if(!(m in r)){let w=new ur(u);w.entryName=m,w.attr=16,w.temporary=true,s.push(w),r[w.entryName]=w,d.add(w);}}function c(){if(o=true,r={},i.diskEntries>(e.length-i.offset)/ae.Constants.CENHDR)throw ae.Errors.DISK_ENTRY_TOO_LARGE();s=new Array(i.diskEntries);for(var y=i.offset,m=0;m<s.length;m++){var w=y,l=new ur(u,e);l.header=e.slice(w,w+=ae.Constants.CENHDR),l.entryName=e.slice(w,w+=l.header.fileNameLength),l.header.extraLength&&(l.extra=e.slice(w,w+=l.header.extraLength)),l.header.commentLength&&(l.comment=e.slice(w,w+l.header.commentLength)),y+=l.header.centralHeaderSize,s[m]=l,r[l.entryName]=l;}d.clear(),v();}function h(y){var m=e.length-ae.Constants.ENDHDR,w=Math.max(0,m-65535),l=w,C=e.length,f=-1,_=0;for(typeof u.trailingSpace=="boolean"&&u.trailingSpace&&(w=0),m;m>=l;m--)if(e[m]===80){if(e.readUInt32LE(m)===ae.Constants.ENDSIG){f=m,_=m,C=m+ae.Constants.ENDHDR,l=m-ae.Constants.END64HDR;continue}if(e.readUInt32LE(m)===ae.Constants.END64SIG){l=w;continue}if(e.readUInt32LE(m)===ae.Constants.ZIP64SIG){f=m,C=m+ae.readBigUInt64LE(e,m+ae.Constants.ZIP64SIZE)+ae.Constants.ZIP64LEAD;break}}if(f==-1)throw ae.Errors.INVALID_FORMAT();i.loadFromBinary(e.slice(f,C)),i.commentLength&&(n=e.slice(_+ae.Constants.ENDHDR)),y&&c();}function g(){s.length>1&&!p&&s.sort((y,m)=>y.entryName.toLowerCase().localeCompare(m.entryName.toLowerCase()));}return {get entries(){return o||c(),s.filter(y=>!d.has(y))},get comment(){return I.decode(n)},set comment(y){n=ae.toBuffer(y,I.encode),i.commentLength=n.length;},getEntryCount:function(){return o?s.length:i.diskEntries},forEach:function(y){this.entries.forEach(y);},getEntry:function(y){return o||c(),r[y]||null},setEntry:function(y){o||c(),s.push(y),r[y.entryName]=y,i.totalEntries=s.length;},deleteFile:function(y,m=true){o||c();let w=r[y];this.getEntryChildren(w,m).map(C=>C.entryName).forEach(this.deleteEntry);},deleteEntry:function(y){o||c();let m=r[y],w=s.indexOf(m);w>=0&&(s.splice(w,1),delete r[y],i.totalEntries=s.length);},getEntryChildren:function(y,m=true){if(o||c(),typeof y=="object")if(y.isDirectory&&m){let w=[],l=y.entryName;for(let C of s)C.entryName.startsWith(l)&&w.push(C);return w}else return [y];return []},getChildCount:function(y){if(y&&y.isDirectory){let m=this.getEntryChildren(y);return m.includes(y)?m.length-1:m.length}return 0},compressToBuffer:function(){o||c(),g();let y=[],m=[],w=0,l=0;i.size=0,i.offset=0;let C=0;for(let T of this.entries){let P=T.getCompressedData();T.header.offset=l;let x=T.packLocalHeader(),D=x.length+P.length;l+=D,y.push(x),y.push(P);let O=T.packCentralHeader();m.push(O),i.size+=O.length,w+=D+O.length,C++;}w+=i.mainHeaderSize,i.offset=l,i.totalEntries=C,l=0;let f=Buffer.alloc(w);for(let T of y)T.copy(f,l),l+=T.length;for(let T of m)T.copy(f,l),l+=T.length;let _=i.toBinary();return n&&n.copy(_,ae.Constants.ENDHDR),_.copy(f,l),e=f,o=false,f},toAsyncBuffer:function(y,m,w,l){try{o||c(),g();let C=[],f=[],_=0,T=0,P=0;i.size=0,i.offset=0;let x=function(D){if(D.length>0){let O=D.shift(),G=O.entryName+O.extra.toString();w&&w(G),O.getCompressedDataAsync(function(U){l&&l(G),O.header.offset=T;let Fe=O.packLocalHeader(),J=Fe.length+U.length;T+=J,C.push(Fe),C.push(U);let Et=O.packCentralHeader();f.push(Et),i.size+=Et.length,_+=J+Et.length,P++,x(D);});}else {_+=i.mainHeaderSize,i.offset=T,i.totalEntries=P,T=0;let O=Buffer.alloc(_);C.forEach(function(U){U.copy(O,T),T+=U.length;}),f.forEach(function(U){U.copy(O,T),T+=U.length;});let G=i.toBinary();n&&n.copy(G,ae.Constants.ENDHDR),G.copy(O,T),e=O,o=!1,y(O);}};x(Array.from(this.entries));}catch(C){m(C);}}}};});var mr=ce((Ma,gr)=>{var Y=Ve(),X=ke("path"),Ii=os(),Ci=pr(),Be=(...e)=>Y.findLast(e,t=>typeof t=="boolean"),fr=(...e)=>Y.findLast(e,t=>typeof t=="string"),vi=(...e)=>Y.findLast(e,t=>typeof t=="function"),Ti={noSort:false,readEntries:false,method:Y.Constants.NONE,fs:null};gr.exports=function(e,t){let s=null,r=Object.assign(Object.create(null),Ti);e&&typeof e=="object"&&(e instanceof Uint8Array||(Object.assign(r,e),e=r.input?r.input:void 0,r.input&&delete r.input),Buffer.isBuffer(e)&&(s=e,r.method=Y.Constants.BUFFER,e=void 0)),Object.assign(r,t);let n=new Y(r);if((typeof r.decoder!="object"||typeof r.decoder.encode!="function"||typeof r.decoder.decode!="function")&&(r.decoder=Y.decoder),e&&typeof e=="string")if(n.fs.existsSync(e))r.method=Y.Constants.FILE,r.filename=e,s=n.fs.readFileSync(e);else throw Y.Errors.INVALID_FILENAME();let i=new Ci(s,r),{canonical:o,sanitize:a,zipnamefix:d}=Y;function u(c){if(c&&i){var h;if(typeof c=="string"&&(h=i.getEntry(X.posix.normalize(c))),typeof c=="object"&&typeof c.entryName<"u"&&typeof c.header<"u"&&(h=i.getEntry(c.entryName)),h)return h}return null}function p(c){let{join:h,normalize:g,sep:y}=X.posix;return h(".",g(y+c.split("\\").join(y)+y))}function I(c){return c instanceof RegExp?(function(h){return function(g){return h.test(g)}})(c):typeof c!="function"?()=>true:c}let v=(c,h)=>{let g=h.slice(-1);return g=g===n.sep?n.sep:"",X.relative(c,h)+g};return {readFile:function(c,h){var g=u(c);return g&&g.getData(h)||null},childCount:function(c){let h=u(c);if(h)return i.getChildCount(h)},readFileAsync:function(c,h){var g=u(c);g?g.getDataAsync(h):h(null,"getEntry failed for:"+c);},readAsText:function(c,h){var g=u(c);if(g){var y=g.getData();if(y&&y.length)return y.toString(h||"utf8")}return ""},readAsTextAsync:function(c,h,g){var y=u(c);y?y.getDataAsync(function(m,w){if(w){h(m,w);return}m&&m.length?h(m.toString(g||"utf8")):h("");}):h("");},deleteFile:function(c,h=true){var g=u(c);g&&i.deleteFile(g.entryName,h);},deleteEntry:function(c){var h=u(c);h&&i.deleteEntry(h.entryName);},addZipComment:function(c){i.comment=c;},getZipComment:function(){return i.comment||""},addZipEntryComment:function(c,h){var g=u(c);g&&(g.comment=h);},getZipEntryComment:function(c){var h=u(c);return h&&h.comment||""},updateFile:function(c,h){var g=u(c);g&&g.setData(h);},addLocalFile:function(c,h,g,y){if(n.fs.existsSync(c)){h=h?p(h):"";let m=X.win32.basename(X.win32.normalize(c));h+=g||m;let w=n.fs.statSync(c),l=w.isFile()?n.fs.readFileSync(c):Buffer.alloc(0);w.isDirectory()&&(h+=n.sep),this.addFile(h,l,y,w);}else throw Y.Errors.FILE_NOT_FOUND(c)},addLocalFileAsync:function(c,h){c=typeof c=="object"?c:{localPath:c};let g=X.resolve(c.localPath),{comment:y}=c,{zipPath:m,zipName:w}=c,l=this;n.fs.stat(g,function(C,f){if(C)return h(C,false);m=m?p(m):"";let _=X.win32.basename(X.win32.normalize(g));if(m+=w||_,f.isFile())n.fs.readFile(g,function(T,P){return T?h(T,false):(l.addFile(m,P,y,f),setImmediate(h,void 0,true))});else if(f.isDirectory())return m+=n.sep,l.addFile(m,Buffer.alloc(0),y,f),setImmediate(h,void 0,true)});},addLocalFolder:function(c,h,g){if(g=I(g),h=h?p(h):"",c=X.normalize(c),n.fs.existsSync(c)){let y=n.findFiles(c),m=this;if(y.length)for(let w of y){let l=X.join(h,v(c,w));g(l)&&m.addLocalFile(w,X.dirname(l));}}else throw Y.Errors.FILE_NOT_FOUND(c)},addLocalFolderAsync:function(c,h,g,y){y=I(y),g=g?p(g):"",c=X.normalize(c);var m=this;n.fs.open(c,"r",function(w){if(w&&w.code==="ENOENT")h(void 0,Y.Errors.FILE_NOT_FOUND(c));else if(w)h(void 0,w);else {var l=n.findFiles(c),C=-1,f=function(){if(C+=1,C<l.length){var _=l[C],T=v(c,_).split("\\").join("/");T=T.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,""),y(T)?n.fs.stat(_,function(P,x){P&&h(void 0,P),x.isFile()?n.fs.readFile(_,function(D,O){D?h(void 0,D):(m.addFile(g+T,O,"",x),f());}):(m.addFile(g+T+"/",Buffer.alloc(0),"",x),f());}):process.nextTick(()=>{f();});}else h(true,void 0);};f();}});},addLocalFolderAsync2:function(c,h){let g=this;c=typeof c=="object"?c:{localPath:c},localPath=X.resolve(p(c.localPath));let{zipPath:y,filter:m,namefix:w}=c;m instanceof RegExp?m=(function(f){return function(_){return f.test(_)}})(m):typeof m!="function"&&(m=function(){return true}),y=y?p(y):"",w=="latin1"&&(w=f=>f.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,"")),typeof w!="function"&&(w=f=>f);let l=f=>X.join(y,w(v(localPath,f))),C=f=>X.win32.basename(X.win32.normalize(w(f)));n.fs.open(localPath,"r",function(f){f&&f.code==="ENOENT"?h(void 0,Y.Errors.FILE_NOT_FOUND(localPath)):f?h(void 0,f):n.findFilesAsync(localPath,function(_,T){if(_)return h(_);T=T.filter(P=>m(l(P))),T.length||h(void 0,false),setImmediate(T.reverse().reduce(function(P,x){return function(D,O){if(D||O===false)return setImmediate(P,D,false);g.addLocalFileAsync({localPath:x,zipPath:X.dirname(l(x)),zipName:C(x)},P);}},h));});});},addLocalFolderPromise:function(c,h){return new Promise((g,y)=>{this.addLocalFolderAsync2(Object.assign({localPath:c},h),(m,w)=>{m&&y(m),w&&g(this);});})},addFile:function(c,h,g,y){c=d(c);let m=u(c),w=m!=null;w||(m=new Ii(r),m.entryName=c),m.comment=g||"";let l=typeof y=="object"&&y instanceof n.fs.Stats;l&&(m.header.time=y.mtime);var C=m.isDirectory?16:0;let f=m.isDirectory?16384:32768;return l?f|=4095&y.mode:typeof y=="number"?f|=4095&y:f|=m.isDirectory?493:420,C=(C|f<<16)>>>0,m.attr=C,m.setData(h),w||i.setEntry(m),m},getEntries:function(c){return i.password=c,i?i.entries:[]},getEntry:function(c){return u(c)},getEntryCount:function(){return i.getEntryCount()},forEach:function(c){return i.forEach(c)},extractEntryTo:function(c,h,g,y,m,w){y=Be(false,y),m=Be(false,m),g=Be(true,g),w=fr(m,w);var l=u(c);if(!l)throw Y.Errors.NO_ENTRY();var C=o(l.entryName),f=a(h,w&&!l.isDirectory?w:g?C:X.basename(C));if(l.isDirectory){var _=i.getEntryChildren(l);return _.forEach(function(x){if(x.isDirectory)return;var D=x.getData();if(!D)throw Y.Errors.CANT_EXTRACT_FILE();var O=o(x.entryName),G=a(h,g?O:X.basename(O));let U=m?x.header.fileAttr:void 0;n.writeFileTo(G,D,y,U);}),true}var T=l.getData(i.password);if(!T)throw Y.Errors.CANT_EXTRACT_FILE();if(n.fs.existsSync(f)&&!y)throw Y.Errors.CANT_OVERRIDE();let P=m?c.header.fileAttr:void 0;return n.writeFileTo(f,T,y,P),true},test:function(c){if(!i)return false;for(var h in i.entries)try{if(h.isDirectory)continue;var g=i.entries[h].getData(c);if(!g)return !1}catch{return false}return true},extractAllTo:function(c,h,g,y){if(g=Be(false,g),y=fr(g,y),h=Be(false,h),!i)throw Y.Errors.NO_ZIP();i.entries.forEach(function(m){var w=a(c,o(m.entryName));if(m.isDirectory){n.makeDir(w);return}var l=m.getData(y);if(!l)throw Y.Errors.CANT_EXTRACT_FILE();let C=g?m.header.fileAttr:void 0;n.writeFileTo(w,l,h,C);try{n.fs.utimesSync(w,m.header.time,m.header.time);}catch{throw Y.Errors.CANT_EXTRACT_FILE()}});},extractAllToAsync:function(c,h,g,y){if(y=vi(h,g,y),g=Be(false,g),h=Be(false,h),!y)return new Promise((f,_)=>{this.extractAllToAsync(c,h,g,function(T){T?_(T):f(this);});});if(!i){y(Y.Errors.NO_ZIP());return}c=X.resolve(c);let m=f=>a(c,X.normalize(o(f.entryName))),w=(f,_)=>new Error(f+': "'+_+'"'),l=[],C=[];i.entries.forEach(f=>{f.isDirectory?l.push(f):C.push(f);});for(let f of l){let _=m(f),T=g?f.header.fileAttr:void 0;try{n.makeDir(_),T&&n.fs.chmodSync(_,T),n.fs.utimesSync(_,f.header.time,f.header.time);}catch{y(w("Unable to create folder",_));}}C.reverse().reduce(function(f,_){return function(T){if(T)f(T);else {let P=X.normalize(o(_.entryName)),x=a(c,P);_.getDataAsync(function(D,O){if(O)f(O);else if(!D)f(Y.Errors.CANT_EXTRACT_FILE());else {let G=g?_.header.fileAttr:void 0;n.writeFileToAsync(x,D,h,G,function(U){U||f(w("Unable to write file",x)),n.fs.utimes(x,_.header.time,_.header.time,function(Fe){Fe?f(w("Unable to set times",x)):f();});});}});}}},y)();},writeZip:function(c,h){if(arguments.length===1&&typeof c=="function"&&(h=c,c=""),!c&&r.filename&&(c=r.filename),!!c){var g=i.compressToBuffer();if(g){var y=n.writeFileTo(c,g,true);typeof h=="function"&&h(y?null:new Error("failed"),"");}}},writeZipPromise:function(c,h){let{overwrite:g,perm:y}=Object.assign({overwrite:true},h);return new Promise((m,w)=>{!c&&r.filename&&(c=r.filename),c||w("ADM-ZIP: ZIP File Name Missing"),this.toBufferPromise().then(l=>{let C=f=>f?m(f):w("ADM-ZIP: Wasn't able to write zip file");n.writeFileToAsync(c,l,g,y,C);},w);})},toBufferPromise:function(){return new Promise((c,h)=>{i.toAsyncBuffer(c,h);})},toBuffer:function(c,h,g,y){return typeof c=="function"?(i.toAsyncBuffer(c,h,g,y),null):i.compressToBuffer()}}};});var ii=fileURLToPath(import.meta.url),Ns=B.dirname(ii);function Os(){let e=[B.join(Ns,"../package.json"),B.join(Ns,"../../package.json")];for(let t of e)try{let r=JSON.parse(k.readFileSync(t,"utf8")).version;if(typeof r=="string"&&r)return r}catch{continue}return "1.0.0"}function ts(e){console.log($e.cyan.bold("DevAssure CLI")),console.log(""),console.log($e.white("Usage: devassure [command] [options]")),console.log(""),console.log($e.yellow.bold("Commands:")),console.log(" version Print the version of the app"),console.log(" help Show help information"),console.log(" login Login to DevAssure"),console.log(" logout Logout from DevAssure"),console.log(" add-token <token> Add and validate authentication token"),console.log(" init Initialize DevAssure configuration"),console.log(" run-tests Run tests (same as new but uses current directory as test cases directory)"),console.log(" run Run tests (alias for run-tests)"),console.log(" Use --csv <path> to pass test cases as a CSV file (relative or absolute)"),console.log(" stats Show statistics about sessions, scenarios, and storage"),console.log(" summary Print summary for a test session (--session-id or --last, optional --json)"),console.log(" cleanup Clean up old sessions"),console.log(" archive-report Archive report results for a test session (--output-dir, --session-id or --last)"),console.log(" open-report Open report server for a test session (--session-id, --last, or --archive)"),console.log(""),console.log($e.yellow.bold("Options:")),console.log(" -v, --verbose Print verbose output"),console.log(" -s, --short Print short output"),console.log(" --env <environment> Set environment (dev, prod, staging)"),console.log(" -h, --help Display help for command"),console.log(""),console.log($e.gray("For more information, visit: https://www.npmjs.com/package/@devassure/cli"));}var _r=ri(mr());var ie=(e=>(e.TEXT="text",e.PASSWORD="password",e.SELECT="select",e.MULTISELECT="multiselect",e.CONFIRM="confirm",e.KEYPRESS="keypress",e.USERKILL="userKill",e))(ie||{}),Qe=(e=>(e.TOKEN="token",e.API_KEY="api_key",e.API_KEY_ENV_VAR="api_key_env_var",e.OAUTH="oauth",e))(Qe||{}),b=(e=>(e.RUNNING="running",e.SUCCESS="success",e.PASSED="passed",e.FAILED="failed",e.WAITING="waiting",e.FAILING="failing",e.SKIPPED="skipped",e.CANCELLED="cancelled",e.ERROR="error",e))(b||{}),et=["success","passed","failed","skipped","cancelled","error"],xe=(e=>(e.NUMBER="number",e.PROGRESS_BAR="progressBar",e.THIN_PROGRESS_BAR="thinProgressBar",e.PERCENTAGE="percentage",e.ETA="eta",e.DOTTED="dotted",e))(xe||{}),N=(e=>(e.SPINNER="spinner",e.CHECK="check",e.CROSS="cross",e.ARROW="arrow",e.DOT="dot",e.CIRCLE="circle",e.CIRCLE_FILL="circleFill",e.CIRCLE_SPINNER="circleSpinner",e.BLINKING_CIRCLE="blinkingCircle",e.BLINKING_DIAMOND="blinkingDiamond",e.BLINKING_HEXAGON="blinkingHexagon",e.SQUARE="square",e.HEXAGON="hexagon",e.DIAMOND="diamond",e))(N||{});function R(e,t,s){return {message:e,styles:t,maxCharLength:s}}function M(e){return e.map(t=>R(t))}var Rt="devassure";function Te(){let e=de.homedir(),t;return process.platform==="win32"?t=B.join(e,"AppData","Local",Rt,Rt):process.platform==="darwin"?t=B.join(e,"Library","Application Support",Rt):t=B.join(e,".local","share",Rt),t}function Pe(){return B.join(Te(),"bin")}function Xe(){let e=process.platform==="win32"?"devassure-agent.exe":"devassure-agent";return B.join(Pe(),e)}function _i(){let e=process.platform==="win32"?"node.exe":"node";return B.join(Pe(),".devassure-agent-internal","playwright","driver",e)}function ms(){return B.join(Te(),"data")}function Je(){return B.join(Te(),".secrets")}function ft(){return B.join(Te(),".cache")}var Li=createRequire(import.meta.url),Ai=Li("sqlite3"),Ie=null,Mt=null;function lt(e,t,s=[]){return new Promise((r,n)=>{e.run(t,s,function(i){i?n(i):r();});})}function Fi(e,t,s=[]){return new Promise((r,n)=>{e.get(t,s,(i,o)=>{i?n(i):r(o);});})}function Di(e,t,s=[]){return new Promise((r,n)=>{e.all(t,s,(i,o)=>{i?n(i):r(o);});})}async function xt(){if(Ie)return Ie;let e=ms();return await $.mkdir(e,{recursive:true}),Mt=B.join(e,"devassure.db"),Ie=await new Promise((t,s)=>{let r=new Ai.Database(Mt,n=>{n?s(n):t(r);});}),await lt(Ie,"PRAGMA journal_mode = WAL;"),await lt(Ie,"PRAGMA busy_timeout = 5000;"),await lt(Ie,"PRAGMA synchronous = NORMAL;"),await lt(Ie,"PRAGMA foreign_keys = ON;"),Ie}async function Pi(){Ie&&(await new Promise((e,t)=>{Ie.close(s=>s?t(s):e());}),Ie=null,Mt=null);}function xi(){return Mt}function as(e){let t=e?.code,s=String(e?.message??e);return !!(t==="SQLITE_ERROR"&&s.includes("no such table")||t==="SQLITE_CANTOPEN")}var W={run:async(e,t=[])=>{try{await lt(await xt(),e,t);}catch(s){if(as(s))return;throw s}},get:async(e,t=[])=>{try{return await Fi(await xt(),e,t)}catch(s){if(as(s))return;throw s}},all:async(e,t=[])=>{try{return await Di(await xt(),e,t)}catch(s){if(as(s))return [];throw s}}},Ni=class{static async getClient(){return await xt()}static async disconnect(){await Pi();}static getDbPath(){return xi()}},hr=Ni,Ae=class{run(e,t=[]){return W.run(e,t)}get(e,t=[]){return W.get(e,t)}all(e,t=[]){return W.all(e,t)}},_t=z.object({id:z.string(),project_path:z.string(),pid:z.number().nullable(),status:z.string(),title:z.string().nullable(),branch_name:z.string().nullable(),commit_id:z.string().nullable(),current_phase:z.string().nullable(),created_at:z.string().nullable(),end_time:z.string().nullable(),duration:z.number().nullable(),session_type:z.string().nullable(),test_cases_dir:z.string().nullable(),test_case_file:z.string().nullable(),test_cases_csv_path:z.string().nullable(),concurrency:z.number().nullable(),test_environment:z.string().nullable()});async function q(e,t=5){let s=0;for(;;)try{return await e()}catch(r){let n=String(r?.message||r);if(!(n.includes("SQLITE_BUSY")||n.includes("database is locked"))||s>=t)throw r;let o=50*Math.pow(2,s);await new Promise(a=>setTimeout(a,o)),s++;}}var Mi=class extends Ae{async getById(e){let t=await this.get("SELECT * FROM TestSession WHERE id = ? LIMIT 1",[e]);return t?_t.parse(t):void 0}async getAll(){return (await this.all("SELECT * FROM TestSession",[])).map(t=>_t.parse(t))}async getAllOrderedByCreatedAt(){return (await this.all("SELECT * FROM TestSession ORDER BY created_at DESC",[])).map(t=>_t.parse(t))}async getLastSessionId(){return (await this.get("SELECT id FROM TestSession ORDER BY created_at DESC LIMIT 1",[]))?.id}async getLastSessions(e){return (await this.all("SELECT * FROM TestSession ORDER BY created_at DESC LIMIT ?",[e])).map(s=>_t.parse(s))}async getCount(){return (await this.get("SELECT COUNT(*) as count FROM TestSession",[]))?.count??0}async getExistingSessionIds(e){if(e.length===0)return [];let t=e.map(()=>"?").join(", ");return (await this.all(`SELECT id FROM TestSession WHERE id IN (${t})`,e)).map(r=>r.id)}async deleteByIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TestSession WHERE id IN (${t})`,e));}async updateStatus(e,t){await q(()=>this.run("UPDATE TestSession SET status = ? WHERE id = ?",[t,e]));}},Oi=z.object({id:z.string(),session_id:z.string(),label:z.string(),name:z.string(),status:z.string(),waiting_on:z.string().nullable(),browser_session_id:z.string().nullable(),created_at:z.string().nullable()}),yr=z.object({id:z.string(),task_id:z.string(),label:z.string(),name:z.string(),type:z.string(),status:z.string(),data:z.string().nullable(),user_input:z.string().nullable(),created_at:z.string().nullable()}),ki=z.object({id:z.string(),content:z.string(),parent_type:z.string().nullable(),parent_id:z.string().nullable(),type:z.string().nullable(),created_at:z.string().nullable()}),Bi=class extends Ae{async getBySessionId(e){return (await this.all("SELECT * FROM Task WHERE session_id = ?",[e])).map(s=>Oi.parse(s))}async getStepsByTaskId(e){return (await this.all("SELECT * FROM TaskStep WHERE task_id = ? ORDER BY created_at ASC",[e])).map(s=>yr.parse(s))}async updateTaskStepUserInput(e,t){await q(()=>this.run("UPDATE TaskStep SET user_input = ?, status = 'validating' WHERE id = ?",[t,e]));}async getValidatingUserInputTaskStep(e){let t=await this.get("SELECT * FROM TaskStep WHERE task_id = ? AND type = 'userInput' AND status = 'validating' LIMIT 1",[e]);return t?yr.parse(t):null}async getMessagesByParent(e,t){return (await this.all("SELECT * FROM Message WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>ki.parse(r))}},$i=z.object({id:z.string(),test_session_id:z.string(),status:z.string(),title:z.string(),label:z.string().nullable(),browser_session_id:z.string().nullable(),steps:z.string().nullable(),tags:z.string().nullable(),test_type:z.string().nullable(),agent_type:z.string().nullable(),test_data:z.string().nullable(),priority:z.string().nullable(),created_at:z.string().nullable()}),Ar=z.object({id:z.string(),test_session_id:z.string(),scenario_id:z.string().nullable(),agent_type:z.string(),browser:z.string(),resolution_x:z.number().nullable(),resolution_y:z.number().nullable(),headless:z.number(),status:z.string(),cdp_port:z.number().nullable(),worker_id:z.number().nullable(),created_at:z.string().nullable(),start_time:z.string().nullable(),end_time:z.string().nullable()}),Ui=z.object({id:z.string(),created_at:z.string().nullable(),browser_session_id:z.string(),step_number:z.number(),start_time:z.string(),end_time:z.string(),url:z.string().nullable(),page_title:z.string().nullable(),evaluation_previous_goal:z.string().nullable(),next_goal:z.string().nullable(),thinking:z.string().nullable(),bu_screenshot_path:z.string().nullable(),screenshot_path:z.string().nullable(),type:z.string()}),Hi=z.object({id:z.string(),created_at:z.string().nullable(),agent_step_id:z.string(),action:z.string()}),zi=z.object({id:z.string(),created_at:z.string().nullable(),agent_step_id:z.string(),validation_type:z.string().nullable(),status:z.string(),progress:z.string().nullable(),summary:z.string().nullable(),reasoning:z.string().nullable(),expected_result:z.string().nullable(),actual_result:z.string().nullable(),failure_message:z.string().nullable(),next_step:z.string().nullable()}),Gi=z.object({id:z.string(),created_at:z.string().nullable(),scenario_id:z.string(),validation_type:z.string(),description:z.string(),step_number:z.string()}),ut=z.object({id:z.string(),test_session_id:z.string(),parent_id:z.string(),parent_type:z.string(),message:z.string(),error_type:z.string().nullable(),created_at:z.string().nullable()}),Fr=z.object({id:z.string(),created_at:z.string().nullable(),parent_id:z.string(),parent_type:z.string(),issue_type:z.string(),description:z.string(),severity:z.string(),root_cause:z.string().nullable(),next_steps:z.string().nullable(),scenario_ids:z.string().nullable()}),ji=class extends Ae{async getBySessionId(e){return (await this.all("SELECT * FROM Scenario WHERE test_session_id = ?",[e])).map(s=>$i.parse(s))}async getBrowserSessionById(e){let t=await this.get("SELECT * FROM BrowserSession WHERE id = ? LIMIT 1",[e]);return t?Ar.parse(t):void 0}async getAgentStepsByBrowserSessionId(e){return (await this.all("SELECT * FROM AgentStep WHERE browser_session_id = ? ORDER BY step_number ASC",[e])).map(s=>Ui.parse(s))}async getAgentStepActionsByStepId(e){return (await this.all("SELECT * FROM AgentStepAction WHERE agent_step_id = ?",[e])).map(s=>Hi.parse(s))}async getAgentStepValidationsByStepId(e){return (await this.all("SELECT * FROM AgentStepValidation WHERE agent_step_id = ?",[e])).map(s=>zi.parse(s))}async getPassedValidationsByScenarioId(e){return (await this.all("SELECT * FROM PassedValidation WHERE scenario_id = ?",[e])).map(s=>Gi.parse(s))}async getPassedValidationCountByTestSessionId(e){return (await this.get("SELECT COUNT(*) as count FROM PassedValidation WHERE scenario_id IN (SELECT id FROM Scenario WHERE test_session_id = ?)",[e]))?.count??0}async getErrorsByScenarioId(e){return (await this.all("SELECT * FROM Error WHERE parent_id = ? AND parent_type = 'scenario' ORDER BY created_at ASC",[e])).map(s=>ut.parse(s))}async getIssuesByParent(e,t){return (await this.all("SELECT * FROM Issue WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>Fr.parse(r))}async getCountExcludingStatuses(e){if(e.length===0)return (await this.get("SELECT COUNT(*) as count FROM Scenario",[]))?.count??0;let t=e.map(()=>"status != ?").join(" AND ");return (await this.get(`SELECT COUNT(*) as count FROM Scenario WHERE ${t}`,e))?.count??0}async getCount(){return (await this.get("SELECT COUNT(*) as count FROM Scenario WHERE status != 'new' AND status != 'executing'",[]))?.count??0}async deleteBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Scenario WHERE test_session_id IN (${t})`,e));}async getScenarioIdsBySessionIds(e){if(e.length===0)return [];let t=e.map(()=>"?").join(", ");return (await this.all(`SELECT id FROM Scenario WHERE test_session_id IN (${t})`,e)).map(r=>r.id)}},Wi=z.object({id:z.string(),created_at:z.string().nullable(),scenario_id:z.string(),status:z.string(),execution_summary:z.string().nullable(),analysis_summary:z.string().nullable(),score:z.number().nullable(),step_count:z.number().nullable()}),Vi=z.object({id:z.string(),created_at:z.string().nullable(),test_session_id:z.string(),status:z.string(),session_summary:z.string().nullable(),analysis_summary:z.string().nullable(),score:z.number().nullable(),step_count:z.number().nullable()}),Yi=class extends Ae{async getLatestScenarioAnalysis(e){let t=await this.get("SELECT * FROM ScenarioAnalysis WHERE scenario_id = ? ORDER BY created_at DESC LIMIT 1",[e]);return t?Wi.parse(t):void 0}async getLatestTestSessionAnalysis(e){let t=await this.get("SELECT * FROM TestSessionAnalysis WHERE test_session_id = ? ORDER BY created_at DESC LIMIT 1",[e]);return t?Vi.parse(t):void 0}async getIssuesByParent(e,t){return (await this.all("SELECT * FROM Issue WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>Fr.parse(r))}async getFailedValidationCountByTestSessionId(e){return (await this.get("SELECT COUNT(*) as count FROM Issue WHERE parent_type = 'scenario_analysis' AND parent_id IN (SELECT id FROM ScenarioAnalysis WHERE scenario_id IN (SELECT id FROM Scenario WHERE test_session_id = ?))",[e]))?.count??0}},qi=class extends Ae{async getByParent(e,t){let s=await this.get("SELECT * FROM Error WHERE parent_id = ? AND parent_type = ? LIMIT 1",[e,t]);return s?ut.parse(s):void 0}async getBySessionId(e){return (await this.all("SELECT * FROM Error WHERE test_session_id = ? AND parent_type = 'test_session' ORDER BY created_at ASC",[e])).map(s=>ut.parse(s))}async getByScenarioId(e){return (await this.all("SELECT * FROM Error WHERE parent_id = ? AND parent_type = 'scenario' ORDER BY created_at ASC",[e])).map(s=>ut.parse(s))}async getAllByParent(e,t){return (await this.all("SELECT * FROM Error WHERE parent_id = ? AND parent_type = ? ORDER BY created_at ASC",[e,t])).map(r=>ut.parse(r))}async createForSession(e,t){let s=v4(),r=new Date().toISOString();await this.run("INSERT INTO Error (id, test_session_id, parent_id, parent_type, message, error_type, created_at) VALUES (?, ?, ?, 'test_session', ?, NULL, ?)",[s,e,e,t,r]);}},Ki=class extends Ae{async getTotalScenarioCount(e){return (await this.get("SELECT COUNT(*) as count FROM Scenario WHERE test_session_id = ?",[e]))?.count??0}async getCompletedScenarioCount(e){return (await this.get("SELECT COUNT(*) as count FROM Scenario WHERE test_session_id = ? AND status IN ('passed', 'failed', 'cancelled', 'skipped', 'error')",[e]))?.count??0}},Zi=class extends Ae{async getCount(){return (await this.get("SELECT COUNT(*) as count FROM BrowserSession",[]))?.count??0}async getBySessionIds(e){if(e.length===0)return [];let t=e.map(()=>"?").join(", ");return (await this.all(`SELECT * FROM BrowserSession WHERE test_session_id IN (${t})`,e)).map(r=>Ar.parse(r))}async getBrowserSessionIdsBySessionIds(e){if(e.length===0)return [];let t=e.map(()=>"?").join(", ");return (await this.all(`SELECT id FROM BrowserSession WHERE test_session_id IN (${t})`,e)).map(r=>r.id)}async deleteBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM BrowserSession WHERE test_session_id IN (${t})`,e));}},Xi=class extends Ae{async deleteAgentStepActionsByBrowserSessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM AgentStepAction WHERE agent_step_id IN (SELECT id FROM AgentStep WHERE browser_session_id IN (${t}))`,e));}async deleteAgentStepValidationsByBrowserSessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM AgentStepValidation WHERE agent_step_id IN (SELECT id FROM AgentStep WHERE browser_session_id IN (${t}))`,e));}async deleteAgentStepsByBrowserSessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM AgentStep WHERE browser_session_id IN (${t})`,e));}async deletePassedValidationsByScenarioIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM PassedValidation WHERE scenario_id IN (${t})`,e));}async deleteTaskStepsBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TaskStep WHERE task_id IN (SELECT id FROM Task WHERE session_id IN (${t}))`,e));}async deleteTasksBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Task WHERE session_id IN (${t})`,e));}async deleteErrorsBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Error WHERE test_session_id IN (${t})`,e));}async deleteMessagesBySessionIds(e,t,s,r,n){let i=[],o=[];if(e.length>0){let d=e.map(()=>"?").join(", ");i.push(`(parent_type = 'session' AND parent_id IN (${d}))`),o.push(...e);}if(t.length>0){let d=t.map(()=>"?").join(", ");i.push(`(parent_type = 'scenario' AND parent_id IN (${d}))`),o.push(...t);}if(s.length>0){let d=s.map(()=>"?").join(", ");i.push(`(parent_type = 'browser_session' AND parent_id IN (${d}))`),o.push(...s);}if(r.length>0){let d=r.map(()=>"?").join(", ");i.push(`(parent_type = 'task' AND parent_id IN (${d}))`),o.push(...r);}if(n.length>0){let d=n.map(()=>"?").join(", ");i.push(`(parent_type = 'step' AND parent_id IN (${d}))`),o.push(...n);}if(i.length===0)return;let a=i.join(" OR ");await q(()=>this.run(`DELETE FROM Message WHERE ${a}`,o));}async deleteIssuesByAnalysisIds(e,t){let s=[],r=[];if(e.length>0){let i=e.map(()=>"?").join(", ");s.push(`(parent_type = 'scenario_analysis' AND parent_id IN (${i}))`),r.push(...e);}if(t.length>0){let i=t.map(()=>"?").join(", ");s.push(`(parent_type = 'test_session_analysis' AND parent_id IN (${i}))`),r.push(...t);}if(s.length===0)return;let n=s.join(" OR ");await q(()=>this.run(`DELETE FROM Issue WHERE ${n}`,r));}async deleteBrowserSessionsBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM BrowserSession WHERE test_session_id IN (${t})`,e));}async deleteScenarioAnalysesByScenarioIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM ScenarioAnalysis WHERE scenario_id IN (${t})`,e));}async deleteScenariosBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM Scenario WHERE test_session_id IN (${t})`,e));}async deleteTestSessionAnalysesBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TestSessionAnalysis WHERE test_session_id IN (${t})`,e));}async deleteReportsRendersBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM ReportsRender WHERE test_session_id IN (${t})`,e));}async deleteSessionDataBySessionIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM SessionData WHERE test_session_id IN (${t})`,e));}async deleteTestSessionsByIds(e){if(e.length===0)return;let t=e.map(()=>"?").join(", ");await q(()=>this.run(`DELETE FROM TestSession WHERE id IN (${t})`,e));}},Lt=z.object({id:z.string(),created_at:z.string().nullable(),test_session_id:z.string(),status:z.string(),host:z.string().nullable(),port:z.number().nullable(),stopped_at:z.string().nullable(),archive:z.string().nullable()}),Ji=class extends Ae{async getByTestSessionId(e){return (await this.all("SELECT * FROM ReportsRender WHERE test_session_id = ?",[e])).map(s=>Lt.parse(s))}async getByCreatedAtAfter(e){return (await this.all("SELECT * FROM ReportsRender WHERE created_at > ? ORDER BY created_at ASC",[e])).map(s=>Lt.parse(s))}async getLatestByTestSessionId(e){let t=await this.get("SELECT * FROM ReportsRender WHERE test_session_id = ? ORDER BY created_at DESC LIMIT 1",[e]);return t?Lt.parse(t):void 0}async getLatestByTestSessionIdAfter(e,t){let s=await this.get("SELECT * FROM ReportsRender WHERE test_session_id = ? AND created_at > ? ORDER BY created_at DESC LIMIT 1",[e,t]);return s?Lt.parse(s):void 0}},Qi=class{constructor(){this._initialized=false,this._sessionRepository=null,this._taskRepository=null,this._scenarioRepository=null,this._analysisRepository=null,this._errorRepository=null,this._progressRepository=null,this._browserSessionRepository=null,this._cleanupRepository=null,this._reportsRenderRepository=null;}async initialize(){this._initialized||(await hr.getClient(),this._initialized=true);}get sessionRepository(){return this._sessionRepository||(this._sessionRepository=new Mi),this._sessionRepository}get taskRepository(){return this._taskRepository||(this._taskRepository=new Bi),this._taskRepository}get scenarioRepository(){return this._scenarioRepository||(this._scenarioRepository=new ji),this._scenarioRepository}get analysisRepository(){return this._analysisRepository||(this._analysisRepository=new Yi),this._analysisRepository}get errorRepository(){return this._errorRepository||(this._errorRepository=new qi),this._errorRepository}get progressRepository(){return this._progressRepository||(this._progressRepository=new Ki),this._progressRepository}get browserSessionRepository(){return this._browserSessionRepository||(this._browserSessionRepository=new Zi),this._browserSessionRepository}get cleanupRepository(){return this._cleanupRepository||(this._cleanupRepository=new Xi),this._cleanupRepository}get reportsRenderRepository(){return this._reportsRenderRepository||(this._reportsRenderRepository=new Ji),this._reportsRenderRepository}async close(){await hr.disconnect(),this._initialized=false,this._sessionRepository=null,this._taskRepository=null,this._scenarioRepository=null,this._analysisRepository=null,this._errorRepository=null,this._progressRepository=null,this._browserSessionRepository=null,this._cleanupRepository=null,this._reportsRenderRepository=null;}},L=new Qi,ye=class Dr{constructor(t){this.taskRepository=t;}async getPendingUserInputTaskStep(t){return (await this.taskRepository.getStepsByTaskId(t)).find(n=>n.type==="userInput"&&n.status==="pending")||null}static isTaskActive(t){return ["pending","running","waiting","validating","failing"].includes(t)}static isTaskCompleted(t){return ["success","error","skipped","cancelled"].includes(t)}static mapTaskStatusToFeedStatus(t){switch(t){case "pending":case "waiting":case "validating":return "waiting";case "running":return "running";case "success":return "success";case "error":return "failed";case "skipped":return "skipped";case "cancelled":return "cancelled";case "failing":return "failing";default:return "running"}}async getTaskMessages(t){let s=await this.taskRepository.getStepsByTaskId(t),r=[];for(let o of s)o.label?r.push(R(o.label)):o.name&&r.push(R(o.name));let n=await this.taskRepository.getMessagesByParent(t,"task");for(let o of n)o.content&&r.push(R(o.content,{icon:"circle",iconColor:"gray",textColor:"gray"}));for(let o of s){let a=await this.taskRepository.getMessagesByParent(o.id,"step");for(let d of a)d.content&&r.push(R(d.content,{icon:"circle",iconColor:"gray",textColor:"gray"}));}return await this.taskRepository.getValidatingUserInputTaskStep(t)&&r.push(R("Validating...")),r}static createFeedItem(t,s){let r=Dr.mapTaskStatusToFeedStatus(t.status),n=s.length>0?[s[s.length-1]]:[],i=s.length>1?s.slice(0,-1):[];return {id:`task-${t.id}`,name:t.name,status:r,objectType:"Task",stateIndicators:[{status:"running",indicator:"spinner",color:"blue"},{status:"success",indicator:"check",color:"green"},{status:"failed",indicator:"cross",color:"red"},{status:"waiting",indicator:"blinkingCircle",color:"yellow"},{status:"failing",indicator:"spinner",color:"red"}],currentMessages:n,allMessages:i}}static getPromptTypeFromTaskStepData(t){if(!t)return null;try{let r=JSON.parse(t).input_type;return r==="string"||r==="number"?"text":r==="boolean"?"confirm":null}catch{return null}}},at=class Pr{constructor(t){this.scenarioRepository=t;}static isScenarioActive(t){return ["executing","executed","analysing"].includes(t)}static isScenarioCompleted(t){return ["passed","failed","cancelled","skipped","error"].includes(t)}static mapScenarioStatusToFeedStatus(t){switch(t){case "new":return "waiting";case "executing":case "executed":case "analysing":return "running";case "passed":return "success";case "failed":return "failed";case "skipped":return "skipped";case "cancelled":return "cancelled";case "error":return "failed";default:return "running"}}async getScenarioMessages(t){let s=[];if(!t.browser_session_id)return s;let r=await this.scenarioRepository.getBrowserSessionById(t.browser_session_id);if(!r)return s;let n=await this.scenarioRepository.getAgentStepsByBrowserSessionId(r.id),i;if(n.length>0){let d=n[n.length-1];(d.step_number-=0)&&(d.evaluation_previous_goal?.trim()&&d.evaluation_previous_goal.trim()?.toLowerCase()!=="n/a"&&s.push(R(d.evaluation_previous_goal,{icon:"\u{1F916}"},2e3)),d.next_goal?.trim()&&d.next_goal.trim()?.toLowerCase()!=="n/a"&&(i=R(d.next_goal,{icon:"\u{1F5A5}\uFE0F"},2e3)),d.thinking?.trim()&&d.thinking.trim()?.toLowerCase()!=="n/a"&&s.push(R(d.thinking,{icon:"\u{1F9E0}"},2e3)));}for(let d of n){let u=await this.scenarioRepository.getAgentStepActionsByStepId(d.id);for(let p of u)p.action&&s.push(R(p.action,{icon:"circle",iconColor:"gray",textColor:"gray"}));}for(let d of n){let u=await this.scenarioRepository.getAgentStepValidationsByStepId(d.id);for(let p of u){let I=[];if(p.validation_type&&I.push(`Type: ${p.validation_type}`),p.status&&I.push(`Status: ${p.status}`),p.summary&&I.push(`Summary: ${p.summary}`),p.reasoning&&I.push(`Reasoning: ${p.reasoning}`),p.actual_result&&I.push(`Actual: ${p.actual_result}`),p.failure_message&&I.push(`Failure: ${p.failure_message}`),p.next_step&&I.push(`Next: ${p.next_step}`),I.length>0){let v=I.join(" | ");p.status==="pass"?s.push(R(v,{icon:"check",iconColor:"green",textColor:"white"})):p.status==="fail"?s.push(R(v,{icon:"cross",iconColor:"red",textColor:"white"})):s.push(R(v));}}}let o=await this.scenarioRepository.getPassedValidationsByScenarioId(t.id);for(let d of o){let u=[];d.validation_type&&u.push(`Type: ${d.validation_type}`),d.description&&u.push(`Description: ${d.description}`),u.length>0&&s.push(R(u.join(" | "),{icon:"circle",iconColor:"gray",textColor:"gray"}));}let a=await this.scenarioRepository.getErrorsByScenarioId(t.id);for(let d of a)d.message&&s.push(R(d.message,{icon:"cross",iconColor:"red",textColor:"white"}));return i&&s.push(i),s}static createFeedItem(t,s){let r=Pr.mapScenarioStatusToFeedStatus(t.status),n=t.title;return t.label?.trim()&&t.label.trim().length<50&&(n=`${t.label} | ${n}`),{id:`scenario-${t.id}`,name:n,status:r,objectType:"Scenario",stateIndicators:[{status:"running",indicator:"\u{1F9EA}",color:"blue"},{status:"failing",indicator:"\u{1F9EA}",color:"red"}],currentMessages:s,colorTheme:"magenta",typewriterEffect:{enabled:true,charDelay:4,retainDuration:1e3,maxStreamCharLength:2e3,maxDisplayLength:300}}}};z.object({id:z.string(),test_session_id:z.string(),app_description:z.string().nullable(),app_rules:z.string().nullable(),personas:z.string().nullable(),agent_instructions:z.string().nullable(),test_data:z.string().nullable(),global_data:z.string().nullable(),filter:z.string().nullable()});z.object({sessionId:z.string(),title:z.string().nullable(),environment:z.string().nullable(),scenarios:z.number(),score:z.number().nullable(),passedValidations:z.number(),failedValidations:z.number(),failureGroups:z.number(),durationMs:z.number().nullable(),durationString:z.string()});var xr=class Ke{constructor(){this.client=null,this.context=null,this.initialized=false,this.enabled=true,this.debug=false,this.exceptionListenersSetup=false,this.clientPort=null,this.getUser=null;}initialize(t,s,r,n,i,o){if(!this.initialized){if(this.enabled=r,this.debug=n,this.clientPort=i,this.getUser=o,this.setupExceptionListeners(),!r){this.initialized=true;return}this.client=new PostHog(t,{host:s||"https://app.posthog.com",flushAt:10,flushInterval:5e3,disableGeoip:false}),this.initialized=true;}}setupExceptionListeners(){this.exceptionListenersSetup||(process.on("uncaughtException",async t=>{console.error("Uncaught exception:",t);try{await this.captureErrorEvent({error:t,context:{type:"uncaughtException"}}),await this.shutdown();}catch{}process.exit(1);}),process.on("unhandledRejection",async t=>{console.error("Unhandled rejection:",t);try{let s=t instanceof Error?t:new Error(String(t));await this.captureErrorEvent({error:s,context:{type:"unhandledRejection"}}),await this.shutdown();}catch{}process.exit(1);}),this.exceptionListenersSetup=true);}async captureErrorEvent(t){try{let s={message:t.error.message,name:t.error.name,stack:t.error.stack,...t.context};this.capture("exception",s,"exception");}catch{}}setCommandContext(t,s){let r=this.clientPort?.getRuntime()||{source:"cli",version:"1.0.0"};this.context={command:t,commandArgs:s,machineDetails:Ke.getMachineDetails(),terminalType:Ke.getTerminalType(),version:r.version,source:r.source,commandStartTime:Date.now(),commandSessionId:v4()};}setUserContext(t){if(!this.context){let s=this.clientPort?.getRuntime()||{source:"cli",version:"1.0.0"};this.context={command:"unknown",commandArgs:{},machineDetails:Ke.getMachineDetails(),terminalType:Ke.getTerminalType(),version:s.version,source:s.source,commandStartTime:Date.now(),commandSessionId:v4()};}this.context.user={id:t.id,orgId:t.organization?.id,authType:t.authType},this.identify(t),this.groupIdentify(t);}identify(t){let s={distinctId:t.id,properties:{id:t.id,name:t.name,email:t.email,authType:t.authType,orgId:t.organization?.id}};if(!this.enabled){this.debug&&console.log("[PostHog] identify:",s);return}if(this.client)try{this.client.identify(s);}catch{}}groupIdentify(t){let s=t.organization;if(!s)return;let r={groupType:"company",groupKey:s.id,properties:{id:s.id,name:s.name,plan:s.plan_type,status:s.subscription_status},distinctId:t.id};if(!this.enabled){this.debug&&console.log("[PostHog] groupIdentify:",r);return}if(this.client)try{this.client.groupIdentify(r);}catch{}}capture(t,s,r){let n=Date.now(),i=this.context?.commandStartTime||n,o=n-i,d=(this.getUser?.()||null)?.id||this.context?.user?.id||"anonymous",u=this.context?.user?.orgId?{company:this.context.user.orgId}:void 0,I={...{eventType:r||"custom",source:this.context?.source||"cli",command:this.context?.command||"unknown",commandArgs:this.context?.commandArgs||{},authType:this.context?.user?.authType,version:this.context?.version||"0.0",createdAt:new Date().toISOString(),terminalType:this.context?.terminalType||"unknown",machineDetails:this.context?.machineDetails||Ke.getMachineDetails(),commandStartTime:new Date(i).toISOString(),elapsedTime:o,commandSessionId:this.context?.commandSessionId||"unset"},...s||{}};if(!this.enabled){this.debug&&console.log("[PostHog] capture:",{distinctId:d,event:t,properties:I,groups:u});return}if(!(!this.client||!this.context))try{this.client.capture({distinctId:d,event:t,properties:I,groups:u});}catch{}}async shutdown(){if(this.client)try{await this.client.shutdown(),this.client=null,this.initialized=!1,this.context=null;}catch{}}async flush(){if(this.client)try{await this.client.flush();}catch{}}static getMachineDetails(){let t=de.platform(),s=de.release(),r=de.hostname(),n=de.totalmem(),i=de.cpus(),o=t.toString();t==="darwin"?o="macOS":t==="win32"?o="Windows":t==="linux"&&(o="Linux");let a=(n/(1024*1024*1024)).toFixed(2)+"GB",d=i[0]?.model||"Unknown",u=i.length.toString(),p=i[0]?.speed?`${(i[0].speed/1e3).toFixed(2)}GHz`:"Unknown";return {os:o,osVersion:s,machineName:r,ram:a,cpu:d,cpuCount:u,cpuSpeed:p}}static getTerminalType(){let t=process.env.SHELL||"";return t.includes("zsh")?"zsh":t.includes("bash")?"bash":t.includes("powershell")||t.includes("pwsh")?"powershell":t.includes("cmd")?"cmd":t.includes("fish")?"fish":"unknown"}},us="user.json";async function eo(e){try{let t=Je();await $.mkdir(t,{recursive:!0});let s=B.join(t,us);await $.writeFile(s,JSON.stringify(e,null,2),{mode:384});try{await $.chmod(s,384);}catch{}}catch{}}var to=class{constructor(){this.user=null;}async setUser(e){this.user=e,await eo(e);}getUser(){return this.user}async clearUser(){this.user=null;try{let e=Je(),t=B.join(e,us);await $.unlink(t);}catch{}}hasUser(){return this.user!==null}async loadUserFromFile(){try{let e=Je(),t=B.join(e,us),s=await $.readFile(t,"utf8"),r=JSON.parse(s);if(r&&r.id)return this.user=r,r}catch{}return null}},le=new to,At="access_token",Ft="refresh_token",Dt="auth_token",Nr=Je(),Ze=B.join(Nr,"tokens.enc"),Mr="aes-256-gcm",dt=16,wr=16;function Or(){let e=de.hostname(),t=de.homedir(),s="1f6af1b7-c1bb-45f6-85e9-1fc7d791b1c3";return we.pbkdf2Sync(`${e}:${t}:${s}`,s,1e5,32,"sha256")}function kr(e){if(!e)return "";let t=Or(),s=we.randomBytes(dt),r=we.createCipheriv(Mr,t,s),n=r.update(e,"utf8");n=Buffer.concat([n,r.final()]);let i=r.getAuthTag();return Buffer.concat([s,i,n]).toString("base64")}function so(e){if(!e)return "";try{let t=Buffer.from(e,"base64"),s=t.subarray(0,dt),r=t.subarray(dt,dt+wr),n=t.subarray(dt+wr),i=Or(),o=we.createDecipheriv(Mr,i,s);o.setAuthTag(r);let a=o.update(n);return a=Buffer.concat([a,o.final()]),a.toString("utf8")}catch{return ""}}async function Br(){await $.mkdir(Nr,{recursive:true});try{await $.access(Ze);}catch{let t=kr("{}");await $.writeFile(Ze,t,{mode:384});}try{await $.chmod(Ze,384);}catch{}}async function Le(){await Br();try{let e=await $.readFile(Ze,"utf8");if(!e||e.trim()==="")return {};let t=so(e);if(!t)return {};let s=JSON.parse(t);if(s&&typeof s=="object")return s}catch{}return {}}async function qe(e){await Br();let t=JSON.stringify(e,null,2),s=kr(t);await $.writeFile(Ze,s,{mode:384});try{await $.chmod(Ze,384);}catch{}}var ee=class{static async getAccessToken(){let t=(await Le())[At];return t&&t.trim()!==""?t:null}static async getRefreshToken(){let t=(await Le())[Ft];return t&&t.trim()!==""?t:null}static async saveAccessToken(e){let t=await Le();t[At]=e,await qe(t);}static async saveRefreshToken(e){let t=await Le();t[Ft]=e,await qe(t);}static async saveTokens(e,t){let s=await Le();s[At]=e,s[Ft]=t,await qe(s);}static async clearTokens(){let e=await Le();e[At]="",e[Ft]="",e[Dt]="",await qe(e),await le.clearUser();}static async getAuthToken(){let t=(await Le())[Dt];return t&&t.trim()!==""?t:null}static async saveAuthToken(e){let t=await Le();t[Dt]=e,await qe(t);}static async clearAuthToken(){let e=await Le();e[Dt]="",await qe(e);}static async isAuthenticated(){return await this.getAccessToken()!==null}static async hasAuthToken(){return await this.getAuthToken()!==null}};var ro={environment:"prod",auth:{authorizationUrl:"https://app.devassure.io/oauth/authorize",tokenUrl:"https://app.devassure.io/oauth/token",clientId:"M3oOg9oSnQksy4J2IFwd5zF2GekAEBi-DznaB-K8xKA",clientSecret:"YwFk23pHaQBF8azxt0KR8aMUwUANMl78cbEuQuJaq68",redirectUri:"http://127.0.0.1:3001/callback"},api:{baseUrl:"https://app.devassure.io"},posthog:{apiKey:"phc_GCpM30unLbtcxUSSWx5H2omEifldrXubk4FYM5kuVvA",host:"https://us.i.posthog.com",enabled:true}};var Pt=null;function Ot(){return Pt||(Pt=ro,Pt)}function ct(){return Ot().auth}function no(){return Ot().api}function $r(){return Ot().posthog}var Ur=class{constructor(){this.clientPort=null,this.webAppCall=null,this.eventService=null;}initialize(e,t,s){this.clientPort=e,this.webAppCall=t,this.eventService=s;}async login(){if(!this.clientPort)throw new Error("AuthService not initialized. Call initialize() first.");ct();let e=await this.clientPort.userPrompt({type:"confirm",message:"Open browser to login?",initialValue:true});if(!e.ok||e.value!==true)throw new Error("Login cancelled by user");let t=this.generateRandomString(32),s=this.generateRandomString(128),r=await this.generateCodeChallenge(s),{authCode:n,redirectUri:i}=await this.startCallbackServer(t,s,r),o=await this.exchangeCodeForTokens(n,s,i);await ee.clearAuthToken(),await ee.saveTokens(o.access_token,o.refresh_token);try{let a=await this.ping(o.access_token);a.authType="oauth",await le.setUser(a),this.eventService?.setUserContext(a);}catch{}return o}async refreshToken(){let e=await ee.getRefreshToken();if(!e)throw new Error("No refresh token available. Please login again.");let t=ct();try{let s=Buffer.from(`${t.clientId}:${t.clientSecret}`).toString("base64"),r=await fetch(t.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Basic ${s}`},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e})});if(!r.ok){let i=await r.text();throw new Error(`Token refresh failed: ${r.status} ${i}`)}let n=await r.json();if(!n.access_token||!n.refresh_token)throw new Error("Invalid token response");await ee.clearAuthToken(),await ee.saveTokens(n.access_token,n.refresh_token);try{let i=await this.ping(n.access_token);i.authType="oauth",await le.setUser(i),this.eventService?.setUserContext(i);}catch{}return n}catch(s){throw await ee.clearTokens(),s}}async ping(e){if(!this.webAppCall||!this.eventService)throw new Error("AuthService not initialized. Call initialize() first.");let t=await this.webAppCall("post","/oauth/ping",{},{},true,{Authorization:`Bearer ${e}`},void 0,this);if(this.eventService.capture("ping",{tokenType:"oauth",success:t.status!==200||!t.data,statusCode:t.status||0,endpoint:"/oauth/ping"}),t.exception)throw new Error(`Authentication ping failed: ${t.exception}`);if(!t.data)throw new Error("Authentication ping failed: No user data returned");if(t.status!==200)throw new Error(`Authentication ping failed: ${t.status} ${t.statusText}`);return t.data?.user}async jobPing(e,t="token"){if(!this.webAppCall||!this.eventService)throw new Error("AuthService not initialized. Call initialize() first.");let s=await this.webAppCall("post","/job_ping",{},{},false,{Authorization:`JWT ${e}`},void 0,this);if(this.eventService.capture("ping",{tokenType:t,success:s.status===200&&!!s.data,statusCode:s.status||0,endpoint:"/job_ping"}),s.exception)throw new Error(`Job ping failed: ${s.exception}`);if(!s.data)throw new Error("Job ping failed: No user data returned");if(s.status!==200)throw new Error(`Job ping failed: ${s.status} ${s.statusText}`);return s.data?.user}async ensureAuthenticated(){let e=await ee.getAccessToken();if(e)try{let t=await this.ping(e);return t.authType="oauth",await le.setUser(t),this.eventService?.setUserContext(t),e}catch{try{let s=await this.refreshToken(),r=await this.ping(s.access_token);return r.authType="oauth",await le.setUser(r),this.eventService?.setUserContext(r),s.access_token}catch{throw await le.clearUser(),new Error("Not authenticated. Please login to authenticate.")}}try{let t=await this.refreshToken(),s=await this.ping(t.access_token);return s.authType="oauth",await le.setUser(s),this.eventService?.setUserContext(s),t.access_token}catch{throw await le.clearUser(),new Error("Not authenticated. Please login to authenticate.")}}async startCallbackServer(e,t,s){if(!this.clientPort)throw new Error("AuthService not initialized. Call initialize() first.");let r=ct(),n=new URL(r.redirectUri),i=n.port?parseInt(n.port,10):3e3,o=n.hostname,a=10;for(let d=0;d<a;d++){let u=i+d;try{return await this.tryStartServer(u,e,t,s,o,n.pathname)}catch(p){if(p.code==="EADDRINUSE"&&d<a-1)continue;throw d===a-1?new Error(`Could not find an available port after ${a} attempts starting from ${i}.
|
|
6
6
|
Please free up port ${i} or update the OAuth server redirect URI configuration.
|
|
7
|
-
To free the port: lsof -ti:${i} | xargs kill`):
|
|
7
|
+
To free the port: lsof -ti:${i} | xargs kill`):p}}throw new Error("Failed to start callback server")}async tryStartServer(e,t,s,r,n,i){if(!this.clientPort)throw new Error("AuthService not initialized. Call initialize() first.");let o=`
|
|
8
8
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
9
|
body {
|
|
10
10
|
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;
|
|
@@ -41,7 +41,7 @@ To free the port: lsof -ti:${i} | xargs kill`):g}}throw new Error("Failed to sta
|
|
|
41
41
|
.close-link:hover {
|
|
42
42
|
color: #004499;
|
|
43
43
|
}
|
|
44
|
-
`;return new Promise((
|
|
44
|
+
`;return new Promise((a,d)=>{let u=ct(),p=`http://${n}:${e}${i}`,I=Rr.createServer((v,c)=>{if(!v.url){c.writeHead(400),c.end("Bad Request");return}let h=new URL(v.url,`http://${v.headers.host||"localhost"}`),g=Object.fromEntries(h.searchParams);if(g.error){let y=g.error_description||g.error;c.writeHead(400),c.end(`
|
|
45
45
|
<!DOCTYPE html>
|
|
46
46
|
<html>
|
|
47
47
|
<head>
|
|
@@ -58,12 +58,12 @@ To free the port: lsof -ti:${i} | xargs kill`):g}}throw new Error("Failed to sta
|
|
|
58
58
|
<body>
|
|
59
59
|
<div class="container">
|
|
60
60
|
<h1>\u274C DevAssure Authentication Failed</h1>
|
|
61
|
-
<p><span class="error">Error:</span> ${
|
|
61
|
+
<p><span class="error">Error:</span> ${y}</p>
|
|
62
62
|
<p>You can close this window and return to the CLI.</p>
|
|
63
63
|
</div>
|
|
64
64
|
</body>
|
|
65
65
|
</html>
|
|
66
|
-
`),I.close(),d(new Error(`OAuth error: ${
|
|
66
|
+
`),I.close(),d(new Error(`OAuth error: ${y}`));return}g.code&&g.state===t?(c.writeHead(200,{"Content-Type":"text/html"}),c.end(`
|
|
67
67
|
<!DOCTYPE html>
|
|
68
68
|
<html>
|
|
69
69
|
<head>
|
|
@@ -80,10 +80,10 @@ To free the port: lsof -ti:${i} | xargs kill`):g}}throw new Error("Failed to sta
|
|
|
80
80
|
</div>
|
|
81
81
|
</body>
|
|
82
82
|
</html>
|
|
83
|
-
`),I.close(),c({authCode:p.code,redirectUri:g})):(a.writeHead(400),a.end("Invalid callback"));});I.listen(e,async()=>{let v=new URL(u.authorizationUrl);v.searchParams.set("response_type","code"),v.searchParams.set("client_id",u.clientId),v.searchParams.set("redirect_uri",g),v.searchParams.set("state",t),v.searchParams.set("code_challenge",r),v.searchParams.set("code_challenge_method","S256"),v.searchParams.set("scope","offline_access");try{await this.clientPort.openExternal(v.toString());}catch(a){I.close(),d(new Error(`Failed to open browser: ${a instanceof Error?a.message:String(a)}`));}}),I.on("error",v=>{d(v);}),setTimeout(()=>{I.close(),d(new Error("Authentication timeout. Please try again."));},300*1e3);})}async exchangeCodeForTokens(e,t,s){let r=ct(),n=Buffer.from(`${r.clientId}:${r.clientSecret}`).toString("base64"),i=await fetch(r.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Basic ${n}`},body:new URLSearchParams({grant_type:"authorization_code",code:e,redirect_uri:s,code_verifier:t})});if(!i.ok){let c=await i.text();throw new Error(`Token exchange failed: ${i.status} ${c}`)}let o=await i.json();if(!o.access_token||!o.refresh_token)throw new Error("Invalid token response");return o}generateRandomString(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",s="",r=new Uint8Array(e);ye.getRandomValues(r);for(let n=0;n<e;n++)s+=t[r[n]%t.length];return s}async generateCodeChallenge(e){let s=new TextEncoder().encode(e),r=await ye.subtle.digest("SHA-256",s);return btoa(String.fromCharCode(...new Uint8Array(r))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}};async function Hr(e){let t=process.env.DEVASSURE_TOKEN;if(t&&t.trim()!=="")try{return await e.jobPing(t,"api_key_env_var"),{success:!0,message:""}}catch{return {success:false,message:"auth token in Environment variable DEVASSURE_TOKEN is invalid, add valid token or remove the variable and run `devassure login` to login."}}let s=await ee.getAuthToken();if(s)try{return await e.jobPing(s,"token"),{success:!0,message:""}}catch{return await ee.clearAuthToken(),{success:false,message:"auth-token added is invalid. Please add new token using `devassure add-token` command or run `devassure login` to login from browser."}}if(await ee.getAccessToken())try{return await e.ensureAuthenticated(),{success:!0,message:""}}catch{return {success:false,message:"Not authenticated. Please login to authenticate. Run `devassure login` to login from browser."}}return {success:false,message:"Not authenticated. Please login to authenticate. Run `devassure login` to login from browser."}}async function no(e){try{return {Authorization:`Bearer ${await e.ensureAuthenticated()}`}}catch{return null}}function io(e){return {Authorization:`Bearer ${e}`}}async function hs(e,t,s={},r,n,i,o,c){let u=ro().baseUrl,g=new URL(t,u);o&&Object.entries(o).forEach(([w,E])=>{g.searchParams.set(w,E);});let I=g.toString(),v=i==="no_auth",a=v?void 0:i||await no(c);if(!v&&!a)return {exception:"unauthorized",status:401,statusText:"Unauthorized",headers:new Headers};let m={method:e.toUpperCase(),headers:{"Content-Type":"application/json",...a,...r?.headers},...r};(e==="post"||e==="put")&&s&&(m.body=JSON.stringify(s));let p;try{p=await fetch(I,m);}catch{return {exception:"connection_error",status:0,statusText:"Connection Error",headers:new Headers}}if(p.status===401&&n&&!v)try{let w=await c.refreshToken();if(w?.access_token){let E={...r,headers:{"Content-Type":"application/json",...r?.headers}};return await hs(e,t,s,E,!1,io(w.access_token),o,c)}}catch{return await ee.clearTokens(),{exception:"unauthorized",status:401,statusText:"Unauthorized - Session expired",headers:p.headers}}let f;try{let w=p.headers.get("content-type");w&&w.includes("application/json")?f=await p.json():f=await p.text();}catch{}return {data:f,status:p.status,statusText:p.statusText,headers:p.headers}}var zr=class{constructor(){this.authService=null,this.webAppCallFn=null;}initialize(e,t){this.authService=e,this.webAppCallFn=t;}async request(e,t={}){if(!this.webAppCallFn||!this.authService)throw new Error("ApiService not initialized. Call initialize() first.");let s=t.method?.toLowerCase()||"get",r;if(t.body)if(typeof t.body=="string")try{r=JSON.parse(t.body);}catch{r=t.body;}else r=t.body;let n=await this.webAppCallFn(s,e,r,{...t,refreshTokenOn401:!t.skipAuth,authHeader:t.skipAuth?"no_auth":void 0},!t.skipAuth,t.skipAuth?"no_auth":void 0,void 0);if(n.exception)throw n.exception==="unauthorized"?new Error("Authentication required. Please login to authenticate."):n.exception==="connection_error"?new Error("Connection error. Please check your network connection."):new Error(`API request failed: ${n.exception}`);if(!n.data&&n.status!==204)throw new Error(`API request failed: ${n.status} ${n.statusText}`);return n.data}async get(e,t){return this.request(e,{...t,method:"GET"})}async post(e,t,s){return this.request(e,{...s,method:"POST",body:t?JSON.stringify(t):void 0})}async put(e,t,s){return this.request(e,{...s,method:"PUT",body:t?JSON.stringify(t):void 0})}async delete(e,t){return this.request(e,{...t,method:"DELETE"})}},Gr="normal",ds=null;function oo(e){ds=e,jr();}function jr(){ds&&(Gr=ds.getLogLevel());}function ao(){return jr(),Gr==="debug"}var D={debug:(...e)=>{ao()&&console.log("[DEBUG]",...e);}},co=class{constructor(){this.clientPort=null,this.pollTimer=null,this.pollInterval=500,this.isPolling=false,this.isPaused=false,this.state=null,this.taskFeedItems=new Map,this.scenarioFeedItems=new Map,this.sessionTracking=null,this.completedTasks=new Set,this.completedScenarios=new Set,this.sessionErrorFeedItemCreated=false,this.sessionNotFoundStartTime=null,this.sessionWaitTimeout=120*1e3,this.maxPollTime=3600*1e3,this.startTime=0,this.resolveCallback=null,this.rejectCallback=null,this.terminationRequested=false,this.activePrompts=new Map,this.pollCallCounter=0;}initialize(e){this.clientPort=e,oo(e);}async start(e){if(!this.clientPort)throw new Error("PollingService not initialized. Call initialize() first.");return D.debug(`PollingService.start() called for session ${e}`),await L.initialize(),this.state={sessionId:e,feedItems:new Map,progress:null,isPolling:false,isCompleted:false},this.startTime=Date.now(),this.isPolling=false,this.isPaused=false,this.terminationRequested=false,D.debug(`PollingService: Starting polling for session ${e} with interval ${this.pollInterval}ms`),new Promise((t,s)=>{this.resolveCallback=t,this.rejectCallback=s,this.pollTimer=setInterval(()=>{this.poll().catch(r=>{D.debug(`Error in poll() from interval: ${r instanceof Error?r.message:String(r)}`);});},this.pollInterval),this.poll().catch(r=>{D.debug(`Error in initial poll(): ${r instanceof Error?r.message:String(r)}`);});})}async poll(){if(++this.pollCallCounter,!this.clientPort||!this.state||this.isPaused){D.debug(`poll() - clientPort or state or isPaused is false client port = ${this.clientPort?"true":"false"}, state = ${this.state?"true":"false"}, isPaused = ${this.isPaused?"true":"false"}`);return}if(!this.isPolling){if(this.isPolling=true,this.terminationRequested){this.isPolling=false;return}if(!L){this.isPolling=false;return}try{if(Date.now()-this.startTime>this.maxPollTime){if(D.debug("poll() - max poll time exceeded"),await this.stop(),this.terminationRequested)return;this.rejectCallback?.(new Error("Session execution timed out"));return}let e;try{e=await L.sessionRepository.getById(this.state.sessionId);}catch(i){throw D.debug(`poll() - error getting session from database: ${i instanceof Error?i.message:String(i)}`),i}if(!e){if(this.sessionNotFoundStartTime===null&&(this.sessionNotFoundStartTime=Date.now()),Date.now()-this.sessionNotFoundStartTime>this.sessionWaitTimeout){if(await this.stop(),this.terminationRequested)return;this.rejectCallback?.(new Error("Session not found in database after waiting 2 minutes"));return}this.isPolling=!1;return}this.sessionNotFoundStartTime=null,this.sessionTracking||(this.sessionTracking=this.initializeSessionTracking(e.status),D.debug(`Session ${this.state.sessionId} tracking initialized with status ${e.status}`));let t=e.status,s=this.isSessionCompleted(t);if(D.debug(`Session ${this.state.sessionId} status check: ${t}, isCompleted: ${s}, wasActive: ${this.sessionTracking.wasActive}, lastStatus: ${this.sessionTracking.lastStatus}`),s&&!this.sessionTracking.wasActive){if(D.debug(`Session ${this.state.sessionId} is already completed (was never active), handling completion immediately`),await this.handleSessionCompletion(this.state.sessionId),this.sessionTracking.wasActive=!1,this.sessionTracking.lastStatus=e.status,D.debug(`Session ${this.state.sessionId} is completed, all data read and emitted, stopping polling`),await this.stop(),this.terminationRequested)return;this.state.isCompleted=!0,this.resolveCallback?.();return}await this.handleTasks(this.state.sessionId),await this.handleScenarios(this.state.sessionId),await this.updateProgress(this.state.sessionId),this.sessionTracking.lastStatus!==e.status&&this.sessionTracking.lastStatus&&D.debug(`Session ${this.state.sessionId} status changed: ${this.sessionTracking.lastStatus} -> ${e.status}`);let n=this.sessionTracking.wasActive&&s;if(await this.handleSessionErrors(this.state.sessionId),n?(D.debug(`Session ${this.state.sessionId} transitioned from active to completed`),await this.handleSessionCompletion(this.state.sessionId),this.sessionTracking.wasActive=!1):s?(D.debug(`Session ${this.state.sessionId} is completed (was not active before)`),await this.handleSessionCompletion(this.state.sessionId),this.sessionTracking.wasActive=!1):(this.sessionTracking.wasActive||D.debug(`Session ${this.state.sessionId} is now active`),this.sessionTracking.wasActive=!0),this.sessionTracking.lastStatus=e.status,!s){let i={sessionId:this.state.sessionId,status:e.status,feedItems:Array.from(this.state.feedItems.values()),progress:this.state.progress||void 0,timestamp:new Date};this.clientPort.onSnapshot(i);}if(s){if(D.debug(`Session ${this.state.sessionId} is completed, all data read and emitted, stopping polling`),await this.stop(),this.terminationRequested)return;this.state.isCompleted=!0,this.resolveCallback?.();return}this.isPolling=!1;}catch(e){if(D.debug(`poll() error: ${e instanceof Error?e.message:String(e)}`),await this.stop(),this.terminationRequested)return;this.rejectCallback?.(e instanceof Error?e:new Error(String(e)));}}}async handleTasks(e){try{let t=await L.taskRepository.getBySessionId(e),s=new he(L.taskRepository);for(let r of t){if(r.name.startsWith("execute_scenario_"))continue;let n=`task-${r.id}`,i=he.isTaskActive(r.status),o=he.isTaskCompleted(r.status);if(o&&this.completedTasks.has(r.id))continue;let c=this.taskFeedItems.get(r.id);c||(c=this.initializeTaskTracking(r.id),this.taskFeedItems.set(r.id,c),D.debug(`Task ${r.id} (${r.name}) tracking initialized`)),c.wasActive&&o&&D.debug(`Task ${r.id} (${r.name}) transitioned from active to completed`);let{taskStepIds:u,messageIds:g}=await this.collectTaskSubItemIds(r.id),I=await s.getPendingUserInputTaskStep(r.id),v=await L.taskRepository.getValidatingUserInputTaskStep(r.id),a=c.lastStatus!==r.status;a&&c.lastStatus&&D.debug(`Task ${r.id} (${r.name}) status changed: ${c.lastStatus} -> ${r.status}`);let m=this.detectSubItemChanges(u,c.lastTaskStepIds);m&&D.debug(`Task ${r.id} (${r.name}) task steps changed: ${u.size} current, ${c.lastTaskStepIds.size} previous`);let p=this.detectSubItemChanges(g,c.lastMessageIds);p&&D.debug(`Task ${r.id} (${r.name}) messages changed: ${g.size} current, ${c.lastMessageIds.size} previous`);let f=I?.id!==c.lastPendingUserInputStepId;f&&D.debug(`Task ${r.id} (${r.name}) pending user input step changed: ${I?.id||"none"} -> ${c.lastPendingUserInputStepId||"none"}`);let w=v?.id!==c.lastValidatingUserInputStepId;if(w&&D.debug(`Task ${r.id} (${r.name}) validating user input step changed: ${v?.id||"none"} -> ${c.lastValidatingUserInputStepId||"none"}`),i){if(c.wasActive=!0,I){let h=`task-${r.id}-step-${I.id}`;if(!this.activePrompts.has(h)&&(f||!c.lastPendingUserInputStepId)){let T=he.getPromptTypeFromTaskStepData(I.data);if(T){this.pause(),D.debug(`Polling paused for user input on task ${r.id} (${r.name}), step ${I.id}`);let P=new AbortController;this.activePrompts.set(h,P);let x=await s.getTaskMessages(r.id),F=he.mapTaskStatusToFeedStatus(r.status),O=he.createFeedItem(r,x);O.onInput=!0,O.currentPrompt={message:I.label||"Please provide input:",type:T==="text"?"text":"confirm",placeholder:T==="text"?"Enter value...":void 0},this.state.feedItems.set(n,O),this.clientPort.onFeedItem(O);try{let G=await this.clientPort.userPrompt({type:T==="text"?"text":"confirm",message:I.label||"Please provide input:",placeholder:T==="text"?"Enter value...":void 0},P.signal);if(G.ok&&G.value!==void 0){let U=(typeof G.value=="boolean",String(G.value));await L.taskRepository.updateTaskStepUserInput(I.id,U),D.debug(`User input received for task ${r.id} (${r.name}), step ${I.id}, updated DB with status=validating`);}else D.debug(`User input cancelled for task ${r.id} (${r.name}), step ${I.id}`);}catch(G){D.debug(`User input prompt failed for task ${r.id} (${r.name}), step ${I.id}: ${G instanceof Error?G.message:String(G)}`);}finally{this.activePrompts.delete(h);let G=this.state.feedItems.get(n);if(G){let U={...G};delete U.currentPrompt,U.onInput=!1,this.state.feedItems.set(n,U),this.clientPort.onFeedItem(U);}this.resume(),D.debug(`Polling resumed after user input for task ${r.id} (${r.name})`);}}}}let E=await s.getTaskMessages(r.id),l=he.mapTaskStatusToFeedStatus(r.status),C=he.createFeedItem(r,E);I&&!this.activePrompts.has(`task-${r.id}-step-${I.id}`)&&(C.onInput=!0),(!this.state.feedItems.has(n)||a||m||p||f||w)&&(this.state.feedItems.has(n)?D.debug(`Task ${r.id} (${r.name}) feed item updated`):D.debug(`Task ${r.id} (${r.name}) feed item created`),this.state.feedItems.set(n,C),this.clientPort.onFeedItem(C)),c.lastStatus=r.status,c.lastUpdatedAt=new Date().toISOString(),c.lastPendingUserInputStepId=I?.id,c.lastValidatingUserInputStepId=v?.id,c.lastTaskStepIds=u,c.lastMessageIds=g;}else if(o&&!this.completedTasks.has(r.id)){D.debug(`Task ${r.id} (${r.name}) marked as completed`),this.completedTasks.add(r.id),c.wasActive=!1;let E=await s.getTaskMessages(r.id),l=he.createFeedItem(r,E);this.state.feedItems.set(n,l),this.clientPort.onFeedItem(l),this.state.feedItems.delete(n);}else c.wasActive=!1;}}catch(t){D.debug(`Error handling tasks: ${t}`);}}async handleScenarios(e){try{let t=await L.scenarioRepository.getBySessionId(e),s=new at(L.scenarioRepository);for(let r of t){let n=`scenario-${r.id}`,i=at.isScenarioActive(r.status),o=at.isScenarioCompleted(r.status);if(r.status==="new"||o&&this.completedScenarios.has(r.id))continue;let c=this.scenarioFeedItems.get(r.id);c||(c=this.initializeScenarioTracking(r.id),this.scenarioFeedItems.set(r.id,c),D.debug(`Scenario ${r.id} (${r.title}) tracking initialized`));let d=c.wasActive&&o;d&&D.debug(`Scenario ${r.id} (${r.title}) transitioned from active to completed`),d&&await this.handleScenarioCompletion(r.id);let u=await this.collectScenarioSubItemIds(r.id,r.browser_session_id),g=c.lastStatus!==r.status;g&&c.lastStatus&&D.debug(`Scenario ${r.id} (${r.title}) status changed: ${c.lastStatus} -> ${r.status}`);let I=this.detectSubItemChanges(u.agentStepIds,c.lastAgentStepIds);I&&D.debug(`Scenario ${r.id} (${r.title}) agent steps changed: ${u.agentStepIds.size} current, ${c.lastAgentStepIds.size} previous`);let v=!1;for(let[f,w]of u.agentStepActionIds.entries()){let E=c.lastAgentStepActionIds.get(f)||new Set;if(this.detectSubItemChanges(w,E)){v=!0,D.debug(`Scenario ${r.id} (${r.title}) agent step actions changed for step ${f}: ${w.size} current, ${E.size} previous`);break}}let a=!1;for(let[f,w]of u.agentStepValidationIds.entries()){let E=c.lastAgentStepValidationIds.get(f)||new Set;if(this.detectSubItemChanges(w,E)){a=!0,D.debug(`Scenario ${r.id} (${r.title}) agent step validations changed for step ${f}: ${w.size} current, ${E.size} previous`);break}}let m=this.detectSubItemChanges(u.passedValidationIds,c.lastPassedValidationIds);m&&D.debug(`Scenario ${r.id} (${r.title}) passed validations changed: ${u.passedValidationIds.size} current, ${c.lastPassedValidationIds.size} previous`);let p=this.detectSubItemChanges(u.errorIds,c.lastErrorIds);if(p&&D.debug(`Scenario ${r.id} (${r.title}) errors changed: ${u.errorIds.size} current, ${c.lastErrorIds.size} previous`),i){c.wasActive=!0;let f=await s.getScenarioMessages(r),w=at.createFeedItem(r,f);(!this.state.feedItems.has(n)||g||I||v||a||m||p)&&(this.state.feedItems.has(n)?D.debug(`Scenario ${r.id} (${r.title}) feed item updated`):D.debug(`Scenario ${r.id} (${r.title}) feed item created`),this.state.feedItems.set(n,w),this.clientPort.onFeedItem(w)),c.lastStatus=r.status,c.lastUpdatedAt=new Date().toISOString(),c.lastAgentStepIds=u.agentStepIds,c.lastAgentStepActionIds=u.agentStepActionIds,c.lastAgentStepValidationIds=u.agentStepValidationIds,c.lastPassedValidationIds=u.passedValidationIds,c.lastErrorIds=u.errorIds;}else o&&!this.completedScenarios.has(r.id)?(D.debug(`Scenario ${r.id} (${r.title}) marked as completed`),this.completedScenarios.add(r.id),c.wasActive=!1,this.state.feedItems.delete(n)):c.wasActive=!1;}}catch(t){D.debug(`Error handling scenarios: ${t}`);}}async handleScenarioCompletion(e){try{let s=(await L.scenarioRepository.getBySessionId(this.state.sessionId)).find(u=>u.id===e);if(!s)return;let r=await L.analysisRepository.getLatestScenarioAnalysis(e);if(!r){D.debug(`Scenario ${e} completion: no analysis found`);return}D.debug(`Scenario ${e} (${s.title}) completion: analysis found, score=${r.score}`);let n=`scenario-${s.id}`,i=this.state.feedItems.get(n);if(!i)return;let o=[];o.push({message:`Score: ${r.score==null?"-":r.score} / 100`,styles:{icon:"\u{1F4CA}",textColor:this.getScoreColor(r.score||-1)}}),r.analysis_summary&&o.push({message:`Analysis: ${r.analysis_summary}`,styles:{icon:"\u{1F9E0}",textColor:"white"}}),o.push({message:`Execution Summary: ${r.execution_summary}`,styles:{icon:"hexagon",iconColor:"blueBright",textColor:"white"}});let c=await L.scenarioRepository.getIssuesByParent(r.id,"scenario_analysis");c.length>0&&D.debug(`Scenario ${e} (${s.title}) completion: ${c.length} issues found`);for(let u of c){let g=[];u.issue_type&&g.push(`${u.issue_type}`),u.description&&g.push(`${u.description}`),g.length>0&&o.push({message:g.join(" | "),styles:{icon:"\u{1F41E}",textColor:u.severity==="critical"||u.severity==="high"?"red":"yellow"}});}let d=await L.scenarioRepository.getPassedValidationsByScenarioId(e);d.length>0&&D.debug(`Scenario ${e} (${s.title}) completion: ${d.length} passed validations found`);for(let u of d){let g=[];u.validation_type&&g.push(`${u.validation_type}`),u.description&&g.push(`${u.description}`),g.length>0&&o.push({message:g.join(" | "),styles:{icon:"check",iconColor:"greenBright",textColor:"greenBright"}});}if(o.length>0){let u={...i,completedLogStyle:{icon:"\u{1F9EA}",textColor:"magenta",bold:!0},status:at.mapScenarioStatusToFeedStatus(s.status),currentMessages:o};this.state.feedItems.set(n,u),this.clientPort.onFeedItem(u);}}catch{}}async handleSessionErrors(e){try{let t=await L.errorRepository.getAllByParent(e,"test_session");if(t.length===0)return;D.debug(`Session ${e}: Found ${t.length} session-level errors`);let s=`session-error-${e}`;if(this.sessionErrorFeedItemCreated||this.state.feedItems.has(s))return;let r=[];for(let i of t)i.message&&r.push(this.createErrorMessage(i.message));let n={id:s,name:"Session Error",status:"failed",currentMessages:r.length>0?[r[r.length-1]]:[],allMessages:r.length>1?r.slice(0,-1):[],objectType:"Error"};this.state.feedItems.set(s,n),this.clientPort.onFeedItem(n),this.sessionErrorFeedItemCreated=!0,D.debug(`Session ${e}: Created error feed item with ${t.length} errors`);}catch(t){D.debug(`Error handling session errors: ${t instanceof Error?t.message:String(t)}`);}}async handleSessionCompletion(e){try{let t=await L.sessionRepository.getById(e);if(!t)return;await new Promise(u=>setTimeout(u,1e3)),await this.handleTasks(e);let s=[],r=await L.analysisRepository.getLatestTestSessionAnalysis(e),n=await L.scenarioRepository.getBySessionId(e);if(r){s.push({message:`Score: ${r.score==null?"-":r.score} / 100`,styles:{icon:"\u{1F4CA}",textColor:this.getScoreColor(r.score||-1)}}),s.push({message:`Scenarios run: ${n.length}`,styles:{icon:"\u{1F9EA}",textColor:"white"}}),r.analysis_summary&&s.push({message:`Analysis: ${r.analysis_summary}`,styles:{icon:"\u{1F9E0}",textColor:"white"}});let u=await L.analysisRepository.getIssuesByParent(r.id,"test_session_analysis");u.length>0&&D.debug(`Session ${e} completion: ${u.length} issues found`);for(let g of u){let I=[];g.issue_type&&I.push(`${g.issue_type}`),g.description&&I.push(`${g.description}`),I.length>0&&s.push({message:I.join(" | "),styles:{icon:"\u{1F41E}",textColor:g.severity==="critical"||g.severity==="high"?"red":"yellow"}});}}let i=t.status,o;switch(i){case "success":o="success";break;case "error":case "failing":o="failed";break;case "skipped":o="skipped";break;case "cancelled":o="cancelled";break;default:o="failed";}if(i==="error"){let u=await L.errorRepository.getAllByParent(e,"test_session");if(u.length>0){D.debug(`Session ${e} completion: ${u.length} errors found`);for(let g=0;g<u.length;g++){let I=u[g];I.message&&s.push(this.createErrorMessage(I.message));}}}let c={id:`session-${e}`,name:t.title?`Session: ${t.title}`:`Session: ${e}`,status:o,objectType:"TestSession",completedLogStyle:{icon:"\u{1F3AF}",textColor:"cyanBright",bold:!0},currentMessages:s};this.state.feedItems.set(c.id,c),this.clientPort.onFeedItem(c);let d={sessionId:e,status:t.status,feedItems:Array.from(this.state.feedItems.values()),progress:this.state.progress||void 0,timestamp:new Date};this.clientPort.onSnapshot(d),await new Promise(u=>setTimeout(u,500));}catch(t){D.debug(`Error in handleSessionCompletion: ${t instanceof Error?t.message:String(t)}`);}}async updateProgress(e){try{let t=await L.progressRepository.getTotalScenarioCount(e),s=await L.progressRepository.getCompletedScenarioCount(e);if(t>0){let r=Math.round(s/t*100);this.state.progress={total:t,current:s,percentage:r,type:"number"};}}catch{}}isSessionCompleted(e){return ["success","error","skipped","cancelled"].includes(e)}pause(){this.isPaused=true;}resume(){this.isPaused=false,!this.isPolling&&this.state&&!this.state.isCompleted&&this.poll();}async stop(){await new Promise(e=>setTimeout(e,200)),this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null),this.isPolling=false,this.isPaused=false;}requestTermination(){this.terminationRequested=true,this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null);}async stopAndResolve(){await this.stop(),this.state&&(this.state.isCompleted=true),this.resolveCallback?.();}setRate(e){this.pollInterval=e,this.pollTimer&&(this.stop().catch(()=>{}),this.pollTimer=setInterval(()=>this.poll(),this.pollInterval));}createInfoMessage(e){return R(e,{icon:"circle",iconColor:"gray",textColor:"gray"})}createErrorMessage(e){return R(e,{icon:"cross",iconColor:"red",textColor:"red"})}getScoreColor(e){return e<0?"gray":e>=90?"greenBright":e>=80||e>=70?"yellowBright":"redBright"}initializeTaskTracking(e){return {lastStatus:"",wasActive:false,lastUpdatedAt:new Date().toISOString(),lastMessageIds:new Set,lastTaskStepIds:new Set}}initializeScenarioTracking(e){return {lastStatus:"",wasActive:false,lastUpdatedAt:new Date().toISOString(),lastAgentStepIds:new Set,lastAgentStepActionIds:new Map,lastAgentStepValidationIds:new Map,lastPassedValidationIds:new Set,lastErrorIds:new Set}}initializeSessionTracking(e){return {lastStatus:e,wasActive:false,lastErrorIds:new Set}}detectSubItemChanges(e,t){if(e.size!==t.size)return true;for(let s of e)if(!t.has(s))return true;return false}async collectTaskSubItemIds(e){let t=await L.taskRepository.getStepsByTaskId(e),s=new Set(t.map(u=>u.id)),r=await L.taskRepository.getMessagesByParent(e,"task"),n=t.map(u=>L.taskRepository.getMessagesByParent(u.id,"step")),o=(await Promise.all(n)).flat(),c=[...r,...o],d=new Set(c.map(u=>u.id));return {taskStepIds:s,messageIds:d}}async collectScenarioSubItemIds(e,t){let s=new Set,r=new Map,n=new Map;if(t){let u=await L.scenarioRepository.getAgentStepsByBrowserSessionId(t);for(let g of u){s.add(g.id);let I=await L.scenarioRepository.getAgentStepActionsByStepId(g.id),v=new Set(I.map(p=>p.id));r.set(g.id,v);let a=await L.scenarioRepository.getAgentStepValidationsByStepId(g.id),m=new Set(a.map(p=>p.id));n.set(g.id,m);}}let i=await L.scenarioRepository.getPassedValidationsByScenarioId(e),o=new Set(i.map(u=>u.id)),c=await L.scenarioRepository.getErrorsByScenarioId(e),d=new Set(c.map(u=>u.id));return {agentStepIds:s,agentStepActionIds:r,agentStepValidationIds:n,passedValidationIds:o,errorIds:d}}getController(){return {pause:()=>this.pause(),resume:()=>this.resume(),stop:()=>this.stop(),setRate:e=>this.setRate(e)}}};function ys(e,t={}){return new Promise((s,r)=>{let n=Lr.request(e,t,i=>s(i));n.on("error",r),n.end();})}async function Wr(e){let t=await ys(e,{method:"HEAD"});if(t.statusCode&&t.statusCode>=300&&t.statusCode<400&&t.headers.location)return t.resume(),Wr(t.headers.location);if(!t.statusCode||t.statusCode<200||t.statusCode>=300)throw t.resume(),new Error(`HEAD failed: HTTP ${t.statusCode}`);let s=Number(t.headers["content-length"]??0)||0,r=String(t.headers["accept-ranges"]??"").toLowerCase().includes("bytes");return t.resume(),{total:s,acceptRanges:r}}async function lo(e,t,s,r,n){let i=await ys(e,{method:"GET",headers:{Range:`bytes=${t}-${s}`}});if(i.statusCode!==206)throw i.resume(),new Error(`Range not supported or ignored (HTTP ${i.statusCode}).`);i.on("data",c=>n?.(c.length));let o=k.createWriteStream(r,{flags:"w"});await pipeline(i,o);}async function uo(e,t){let s=k.createWriteStream(t,{flags:"w"});for(let r of e){let n=k.createReadStream(r);await pipeline(n,s,{end:false});}await new Promise((r,n)=>{s.end(i=>i?n(i):r());});}async function po(e,t,s){let r=Math.max(1,s?.parts),n=s?.minPartSizeMB*1024*1024,i=s?.emitEveryMs,{total:o,acceptRanges:c}=await Wr(e);if(!o)throw new Error("Unknown content-length; cannot parallelize safely.");if(!c||o<n||r===1){let a=await ys(e,{method:"GET"});if(!a.statusCode||a.statusCode<200||a.statusCode>=300)throw a.resume(),new Error(`Download failed: HTTP ${a.statusCode}`);let m=0,p=0;a.on("data",w=>{m+=w.length;let E=Date.now();s?.onProgress&&E-p>=i&&(p=E,s.onProgress({total:o,current:m,percentage:Math.floor(m/o*100)}));});let f=k.createWriteStream(t,{highWaterMark:1024*1024});f.setMaxListeners(50),await pipeline(a,f),s?.onProgress?.({total:o,current:o,percentage:100});return}let d=Math.ceil(o/r),u=[];for(let a=0;a<r;a++){let m=a*d;if(m>=o)break;let p=Math.min(o-1,(a+1)*d-1);u.push({start:m,end:p,partPath:`${t}.part${a}`});}let g=0,I=0,v=a=>{if(g+=a,!s?.onProgress)return;let m=Date.now();m-I>=i&&(I=m,s.onProgress({total:o,current:g,percentage:Math.floor(g/o*100)}));};try{await Promise.all(u.map(a=>lo(e,a.start,a.end,a.partPath,v))),await uo(u.map(a=>a.partPath),t),s?.onProgress?.({total:o,current:o,percentage:100});}finally{await Promise.allSettled(u.map(a=>$.unlink(a.partPath)));}}var Sr=promisify(k.mkdir),fo=promisify(k.writeFile),go=promisify(k.unlink),Er="1.0.12",mo="1.0.12",ho="https://devassures3bucket.s3.us-east-1.amazonaws.com",Ir=/devassure-agent,\s*version\s+([\d.]+)/i;function yo(){return process.platform==="win32"?"windows":process.platform==="darwin"?process.arch==="arm64"?"macos":"macos_intel":"linux"}function wo(){return process.platform==="win32"?"devassure-agent.exe":"devassure-agent"}function Vr(){return B.join(ft(),"last-downloaded-version")}function Cr(){try{let e=Xe();return k.existsSync(e)&&k.statSync(e).isFile()}catch{return false}}function Yr(){let e=Pe(),t=wo(),s=B.join(e,t),r=B.join(e,".devassure-agent-internal");try{k.existsSync(s)&&k.unlinkSync(s);}catch{}try{k.existsSync(r)&&(k.statSync(r).isDirectory()?k.rmSync(r,{recursive:!0}):k.unlinkSync(r));}catch{}}function So(){let e=Vr();if(!k.existsSync(e))return null;try{return k.readFileSync(e,"utf8").trim()||null}catch{return null}}function qr(){return new Promise((e,t)=>{let s=Xe(),r=spawn(s,["version"],{shell:false,stdio:["ignore","pipe","pipe"]}),n="",i="";r.stdout&&r.stdout.on("data",o=>{n+=o.toString();}),r.stderr&&r.stderr.on("data",o=>{i+=o.toString();}),r.on("error",t),r.on("close",o=>{if(o!==0){t(new Error(`devassure-agent version exited ${o}: ${i||n}`));return}let c=n.match(Ir)||i.match(Ir);c&&c[1]?e(c[1].trim()):t(new Error(`Could not parse version from: ${n||i}`));});})}function pt(e,t){e?.onFeedItem(t);}function vr(e,t){if(!e)return;let s=t.progress!==void 0&&t.progress!==null?{...t.progress,type:"progressBar",unit:"MB"}:void 0;e.onSnapshot({sessionId:"",status:"setup",feedItems:t.feedItems,progress:s,timestamp:new Date});}async function Eo(e,t,s){let n={id:"setup-download",name:"Downloading devassure-agent",status:"running"};pt(s,n);try{await po(e,t,{parts:8,minPartSizeMB:10,emitEveryMs:300,onProgress:({total:i,current:o,percentage:c})=>{vr(s,{feedItems:[{...n}],progress:{total:+(i/(1024*1024)).toFixed(2),current:+(o/(1024*1024)).toFixed(2),percentage:c}});}}),await new Promise(i=>setTimeout(i,100)),vr(s,{feedItems:[{...n,status:"success",currentMessages:[R("Download complete.")]}],progress:void 0});}catch(i){try{k.unlinkSync(t);}catch{}throw i}}async function Io(e,t,s){let n={id:"setup-extract",name:"Extracting\u2026",status:"running",currentMessages:[R("Extracting...")]};pt(s,n),new _r.default(e).extractAllTo(t,true),await go(e).catch(()=>{}),Tr(Xe()),Tr(Ri()),await new Promise(o=>setTimeout(o,100)),pt(s,{...n,status:"success",currentMessages:[R("Extracted.")]});}function Tr(e){try{k.chmodSync(e,493);}catch{}}async function cs(e){let t=Pe(),s=ft(),r=yo(),n=mo,i=`${ho}/${r}/devassure-agent/${n}/DevAssure-Agent.zip`;await Sr(t,{recursive:true}),await Sr(s,{recursive:true}),Yr();let o=B.join(s,`DevAssure-Agent-${n}.zip`);await Eo(i,o,e),await Io(o,t,e);let c={id:"setup-version-check",name:"Setting up DevAssure agent",status:"running"};pt(e,c);let d=await qr();await new Promise(u=>setTimeout(u,100)),pt(e,{...c,status:"success"}),await fo(Vr(),d,"utf8"),await new Promise(u=>setTimeout(u,100));}async function ws(e,t){let s=t?.force===true,r=Ot().environment==="dev";if(r){if(!Cr())throw new Error(`Dev mode: devassure-agent not found. Add devassure-agent and .devassure-agent-internal to ${Pe()}`);return}if(s){if(Yr(),r)throw new Error(`Dev mode: agent cannot be downloaded. Add devassure-agent and .devassure-agent-internal to ${Pe()}`);await cs(e);return}if(!Cr()){await cs(e);return}let n=So();if(!(n&&St.valid(n)&&St.gte(n,Er))){try{let i=await qr();if(St.valid(i)&&St.gte(i,Er))return}catch{}await cs(e);}}var Kr=class{constructor(){this.clientPort=null,this.pollingService=null,this.agentProcessBySessionId=new Map,this.activePrompts=new Map;}initialize(e){this.clientPort=e,this.pollingService=new co,this.pollingService.initialize(e);}async close(){await L.close(),await this.pollingService?.stop();}async executeSession(e,t,s,r,n,i,o){if(!this.clientPort||!this.pollingService)throw new Error("SessionService not initialized. Call initialize() first.");await L.initialize(),await ws(this.clientPort??void 0);let c=Xe(),d=["start",`--test-session-id=${e}`,`--project-path=${t}`];r?.trim()?d.push(`--test-case-file=${r}`):s?.trim()&&(d.push(`--test-cases-dir=${s}`),n&&d.push(`--filter=${n}`)),i&&d.push("--archive",i),o?.trim()&&d.push(`--environment=${o.trim()}`);let u=this.clientPort?.getLogLevel()==="debug",g=spawn(c,d,{shell:false,stdio:["ignore",u?"pipe":"ignore",u?"pipe":"ignore"]});this.agentProcessBySessionId.set(e,g);let I=async()=>{await this.pollingService?.stop(),g.kill(),this.agentProcessBySessionId.delete(e);};u&&g.stdout&&(g.stdout.on("data",v=>{console.log(">>> [AGENT]: ",v.toString());}),g.stderr&&g.stderr.on("data",v=>{console.log(">>> [AGENT]: [ERROR] ",v.toString());}));try{this.handleUserInputPrompts(e).catch(()=>{}),await this.pollingService.start(e);}finally{await I();}}async sessionExecutionTermination(e){let t=`session-termination-${e}`;try{if(await L.initialize(),await L.sessionRepository.updateStatus(e,"cancelled"),this.clientPort){let i={id:t,name:"Terminating execution...",status:"failing",stateIndicators:[{status:"failing",indicator:"blinkingCircle",color:"red"}],currentMessages:[],noBorder:!0};this.clientPort.onFeedItem(i);}if(await new Promise(i=>setTimeout(i,2e3)),this.pollingService?.requestTermination(),await this.clientPort?.markActiveFeedItemsCancelled?.([t]),await new Promise(i=>setTimeout(i,6e3)),this.clientPort){let i={id:t,name:"Terminated execution.",status:"failing",stateIndicators:[{status:"failing",indicator:"blinkingCircle",color:"red"}],currentMessages:[],noBorder:!0};this.clientPort.onFeedItem(i);}let s=this.agentProcessBySessionId.get(e);if(s&&(s.kill(),this.agentProcessBySessionId.delete(e)),await new Promise(i=>setTimeout(i,200)),this.clientPort){let i={id:t,name:"Execution terminated!",status:"error",currentMessages:[],noBorder:!0};this.clientPort.onFeedItem(i);}let r=await L.sessionRepository.getById(e);r&&r.status!=="cancelled"&&await L.sessionRepository.updateStatus(e,"cancelled"),(await L.errorRepository.getBySessionId(e)).length===0&&await L.errorRepository.createForSession(e,"Execution cancelled by user!"),await this.pollingService?.stopAndResolve();}catch(s){console.error(`Error during session termination: ${s instanceof Error?s.message:String(s)}`);}}async handleUserInputPrompts(e){if(!this.clientPort||!this.pollingService)return;let t=new he(L.taskRepository),s=true,r=setInterval(async()=>{if(!s){clearInterval(r);return}try{let n=await L.taskRepository.getBySessionId(e);for(let i of n){if(!he.isTaskActive(i.status))continue;let c=await t.getPendingUserInputTaskStep(i.id);if(c){let d=`task-${i.id}-step-${c.id}`;if(this.activePrompts.has(d))continue;let u=he.getPromptTypeFromTaskStepData(c.data);if(!u)continue;let g=new AbortController;this.activePrompts.set(d,g);try{let I=await this.clientPort.userPrompt({type:u==="text"?"text":"confirm",message:c.label||"Please provide input:",placeholder:u==="text"?"Enter value...":void 0},g.signal);if(I.ok&&I.value!==void 0){let v=(typeof I.value=="boolean",String(I.value));await L.taskRepository.updateTaskStepUserInput(c.id,v);}}catch{}finally{this.activePrompts.delete(d);}}}}catch{}},500);return new Promise(n=>{let i=setInterval(()=>{(!this.pollingService||!this.pollingService.state||this.pollingService.state.isCompleted)&&(s=false,clearInterval(r),clearInterval(i),n());},100);})}},kt=class{async getBrowserSessionCount(){return await L.browserSessionRepository.getCount()}async getTestSessionCount(){return await L.sessionRepository.getCount()}async getScenarioCount(){return await L.scenarioRepository.getCount()}async getStorageSize(){let e=Te(),t=B.join(e,"data","devassure.db"),s=B.join(e,"reports"),r=0;try{r+=await $.stat(t).then(n=>n.size);}catch{}try{r+=await this.calculateDirectorySize(s);}catch{}return r}async calculateDirectorySize(e){let t=0;try{let s=await $.readdir(e,{withFileTypes:!0});for(let r of s){let n=B.join(e,r.name);if(r.isDirectory())t+=await this.calculateDirectorySize(n);else if(r.isFile())try{let i=await $.stat(n);t+=i.size;}catch{}}}catch{}return t}formatStorageSize(e){if(e===0)return "0 B";let t=1024,s=["B","KB","MB","GB","TB"],r=Math.floor(Math.log(e)/Math.log(t));return `${(e/Math.pow(t,r)).toFixed(2)} ${s[r]??"B"}`}},Zr=class{async getAllSessions(){return await L.sessionRepository.getAllOrderedByCreatedAt()}async getSessionsToDelete(e,t){let s=await this.getAllSessions();if(e!==void 0){let r=new Date;r.setDate(r.getDate()-e);let n=r.toISOString();return s.filter(i=>i.created_at?i.created_at<n:true)}return t!==void 0?t>=s.length?[]:s.slice(t):s}async getCleanupStats(e){let s=(await L.browserSessionRepository.getBySessionIds(e)).length,r=await this.calculateStorageSize(e);return {sessionsToDelete:e.length,browserSessionsToDelete:s,storageToFree:r}}async calculateStorageSize(e){let t=Te(),s=0;for(let r of e){let n=B.join(t,"data",r),i=B.join(t,"reports",r);try{s+=await this.getDirectorySize(n);}catch{}try{s+=await this.getDirectorySize(i);}catch{}}return s}async getDirectorySize(e){let t=0;try{let s=await $.readdir(e,{withFileTypes:!0});for(let r of s){let n=B.join(e,r.name);if(r.isDirectory())t+=await this.getDirectorySize(n);else if(r.isFile())try{let i=await $.stat(n);t+=i.size;}catch{}}}catch{}return t}async deleteAllData(){await q(async()=>{await W.run("BEGIN TRANSACTION");try{await W.run("DELETE FROM AgentStepAction"),await W.run("DELETE FROM AgentStepValidation"),await W.run("DELETE FROM AgentStep"),await W.run("DELETE FROM PassedValidation"),await W.run("DELETE FROM TaskStep"),await W.run("DELETE FROM Task"),await W.run("DELETE FROM Error"),await W.run("DELETE FROM Message"),await W.run("DELETE FROM Issue"),await W.run("DELETE FROM BrowserSession"),await W.run("DELETE FROM ScenarioAnalysis"),await W.run("DELETE FROM Scenario"),await W.run("DELETE FROM TestSessionAnalysis"),await W.run("DELETE FROM ReportsRender"),await W.run("DELETE FROM SessionData"),await W.run("DELETE FROM TestSession"),await W.run("COMMIT");}catch(r){throw await W.run("ROLLBACK"),r}});let e=Te(),t=B.join(e,"data"),s=B.join(e,"reports");try{let r=await $.readdir(t,{withFileTypes:!0});for(let n of r)n.isDirectory()&&await $.rm(B.join(t,n.name),{recursive:!0,force:!0});}catch{}try{let r=await $.readdir(s,{withFileTypes:!0});for(let n of r)n.isDirectory()&&await $.rm(B.join(s,n.name),{recursive:!0,force:!0});}catch{}}async deleteSessions(e,t){if(e.length===0&&!t)return;if(t){await this.deleteAllData();return}let s=await L.scenarioRepository.getScenarioIdsBySessionIds(e),r=await L.browserSessionRepository.getBrowserSessionIdsBySessionIds(e),n=[];for(let d of e){let u=await L.taskRepository.getBySessionId(d);n.push(...u.map(g=>g.id));}let i=[];for(let d of n){let u=await L.taskRepository.getStepsByTaskId(d);i.push(...u.map(g=>g.id));}let o=[];for(let d of s){let u=await L.analysisRepository.getLatestScenarioAnalysis(d);u&&o.push(u.id);}let c=[];for(let d of e){let u=await L.analysisRepository.getLatestTestSessionAnalysis(d);u&&c.push(u.id);}await q(async()=>{await W.run("BEGIN TRANSACTION");try{let d=L.cleanupRepository;await d.deleteAgentStepActionsByBrowserSessionIds(r),await d.deleteAgentStepValidationsByBrowserSessionIds(r),await d.deleteAgentStepsByBrowserSessionIds(r),await d.deletePassedValidationsByScenarioIds(s),await d.deleteTaskStepsBySessionIds(e),await d.deleteTasksBySessionIds(e),await d.deleteErrorsBySessionIds(e),await d.deleteMessagesBySessionIds(e,s,r,n,i),await d.deleteIssuesByAnalysisIds(o,c),await d.deleteBrowserSessionsBySessionIds(e),await d.deleteScenarioAnalysesByScenarioIds(s),await d.deleteScenariosBySessionIds(e),await d.deleteTestSessionAnalysesBySessionIds(e),await d.deleteReportsRendersBySessionIds(e),await d.deleteSessionDataBySessionIds(e),await d.deleteTestSessionsByIds(e),await W.run("COMMIT");}catch(d){throw await W.run("ROLLBACK"),d}}),await this.deleteSessionFolders(e);}async deleteSessionFolders(e){let t=Te();for(let s of e){let r=B.join(t,"data",s),n=B.join(t,"reports",s);try{await $.rm(r,{recursive:!0,force:!0});}catch{}try{await $.rm(n,{recursive:!0,force:!0});}catch{}}}};function Co(){let e=new Date,t=r=>r.toString().padStart(2,"0"),s=e.getMilliseconds().toString().padStart(3,"0").padEnd(6,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}.${s}`}var Bt=class{constructor(){this.clientPort=null;}initialize(e){this.clientPort=e;}async archiveReport(e,t){let s=Xe(),r=["archive-results","--target-path",e,"--test-session-id",t],n=this.clientPort?.getLogLevel()==="debug",i=spawn(s,r,{shell:false,stdio:n?["ignore","pipe","pipe"]:"inherit"});return n&&i.stdout&&i.stdout.on("data",o=>{console.log(">>> [AGENT]: ",o.toString());}),n&&i.stderr&&i.stderr.on("data",o=>{console.log(">>> [AGENT]: [ERROR] ",o.toString());}),new Promise(o=>{i.on("exit",(c,d)=>{o(c??(d?1:0));});})}async openReport(e,t,s,r){await L.initialize();let n=e;if(!r&&t){let I=await L.sessionRepository.getLastSessionId();if(!I)throw new Error("No test sessions found");n=I;}let i=Co(),o=Xe(),c=["open-report"];r?c.push("--archive",r):n&&c.push(`--test-session-id=${n}`);let d=spawn(o,c,{shell:false});this.clientPort?.getLogLevel()==="debug"&&(d.stdout.on("data",I=>{console.log(">>> [AGENT]: ",I.toString());}),d.stderr.on("data",I=>{console.log(">>> [AGENT]: [ERROR] ",I.toString());}));let u=()=>{d.killed||d.kill();},g=()=>{d.killed||d.kill();};process.on("SIGINT",g),process.on("SIGTERM",g);try{let I=await this.pollForReportsRender(i,n);if(!I)throw new Error("Failed to start report server - no ReportsRender entry found");if(!I.host||I.port===null)throw new Error("Report server started but host/port not available");let v=`http://${I.host}:${I.port}`;if(s){let a="report-server",m={id:a,name:`Running report server at ${v}`,status:"running",currentMessages:[R(`Report server running at ${v}`)]};await s.addFeedItem(m),await new Promise(async p=>{let f=!1,w=async()=>{if(!f){f=!0,u();try{await s.updateFeedItem(a,{status:"success",currentMessages:[R("Report server closed")],currentPrompt:void 0});}catch(l){D.debug(">>> [REPORT SERVICE]: Feed item already removed",{error:l});}p();}},E={message:"Stop reporting server.",type:"userKill",callbackFunction:async l=>{D.debug(">>> [REPORT SERVICE]: User kill callback",{proceed:l}),l||await w();}};await s.updateFeedItem(a,{currentPrompt:E}),d.on("exit",async()=>{if(!f){f=!0;try{await s.updateFeedItem(a,{status:"success",currentMessages:[R("Report server closed")],currentPrompt:void 0});}catch(l){D.debug(">>> [REPORT SERVICE]: Feed item already removed on exit",{error:l});}p();}});});}return {url:v,process:d}}catch(I){throw u(),I}finally{process.removeListener("SIGINT",g),process.removeListener("SIGTERM",g);}}async pollForReportsRender(e,t,s=60,r=500){for(let n=0;n<s;n++)try{let i;if(t)i=await L.reportsRenderRepository.getLatestByTestSessionIdAfter(t,e);else {let o=await L.reportsRenderRepository.getByCreatedAtAfter(e);i=o.length>0?o[0]:void 0;}if(i&&i.host&&i.port!==null)return {host:i.host,port:i.port};await new Promise(o=>setTimeout(o,r));}catch{await new Promise(o=>setTimeout(o,r));}return null}},Xr="00:00:00";function vo(e){if(e<0||!Number.isFinite(e))return Xr;let t=Math.floor(e/1e3),s=Math.floor(t/3600),r=Math.floor(t%3600/60),n=t%60,i=o=>o.toString().padStart(2,"0");return `${i(s)}:${i(r)}:${i(n)}`}function br(e){if(e==null||e==="")return null;let t=Date.parse(e);return Number.isNaN(t)?null:t}var Jr=class{async getSessionSummary(e){let t=await L.sessionRepository.getById(e);if(!t)throw new Error("Session not found");let r=(await L.scenarioRepository.getBySessionId(e)).length,n=await L.analysisRepository.getLatestTestSessionAnalysis(e),i=null,o=0;n&&(i=n.score??null,o=(await L.analysisRepository.getIssuesByParent(n.id,"test_session_analysis")).length);let c=await L.scenarioRepository.getPassedValidationCountByTestSessionId(e),d=await L.analysisRepository.getFailedValidationCountByTestSessionId(e),u=null,g=br(t.created_at),I=br(t.end_time);g!=null&&I!=null&&(u=I-g);let v=u!=null?vo(u):Xr;return {sessionId:e,title:t.title??null,environment:t.test_environment??null,scenarios:r,score:i,passedValidations:c,failedValidations:d,failureGroups:o,durationMs:u,durationString:v}}},To=".devassure";function tt(e){let t=process.cwd();return B.join(t,To)}function $t(e){let t=tt();k.existsSync(t)||k.mkdirSync(t,{recursive:true});}function gt(e,t,s,r){$t();let n=B.join(tt(),e),i="";s&&(i=s+`
|
|
83
|
+
`),I.close(),a({authCode:g.code,redirectUri:p})):(c.writeHead(400),c.end("Invalid callback"));});I.listen(e,async()=>{let v=new URL(u.authorizationUrl);v.searchParams.set("response_type","code"),v.searchParams.set("client_id",u.clientId),v.searchParams.set("redirect_uri",p),v.searchParams.set("state",t),v.searchParams.set("code_challenge",r),v.searchParams.set("code_challenge_method","S256"),v.searchParams.set("scope","offline_access");try{await this.clientPort.openExternal(v.toString());}catch(c){I.close(),d(new Error(`Failed to open browser: ${c instanceof Error?c.message:String(c)}`));}}),I.on("error",v=>{d(v);}),setTimeout(()=>{I.close(),d(new Error("Authentication timeout. Please try again."));},300*1e3);})}async exchangeCodeForTokens(e,t,s){let r=ct(),n=Buffer.from(`${r.clientId}:${r.clientSecret}`).toString("base64"),i=await fetch(r.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Basic ${n}`},body:new URLSearchParams({grant_type:"authorization_code",code:e,redirect_uri:s,code_verifier:t})});if(!i.ok){let a=await i.text();throw new Error(`Token exchange failed: ${i.status} ${a}`)}let o=await i.json();if(!o.access_token||!o.refresh_token)throw new Error("Invalid token response");return o}generateRandomString(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",s="",r=new Uint8Array(e);we.getRandomValues(r);for(let n=0;n<e;n++)s+=t[r[n]%t.length];return s}async generateCodeChallenge(e){let s=new TextEncoder().encode(e),r=await we.subtle.digest("SHA-256",s);return btoa(String.fromCharCode(...new Uint8Array(r))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}};async function Hr(e){let t=process.env.DEVASSURE_TOKEN;if(t&&t.trim()!=="")try{return await e.jobPing(t,"api_key_env_var"),{success:!0,message:""}}catch{return {success:false,message:"auth token in Environment variable DEVASSURE_TOKEN is invalid, add valid token or remove the variable and run `devassure login` to login."}}let s=await ee.getAuthToken();if(s)try{return await e.jobPing(s,"token"),{success:!0,message:""}}catch{return await ee.clearAuthToken(),{success:false,message:"auth-token added is invalid. Please add new token using `devassure add-token` command or run `devassure login` to login from browser."}}if(await ee.getAccessToken())try{return await e.ensureAuthenticated(),{success:!0,message:""}}catch{return {success:false,message:"Not authenticated. Please login to authenticate. Run `devassure login` to login from browser."}}return {success:false,message:"Not authenticated. Please login to authenticate. Run `devassure login` to login from browser."}}async function io(e){try{return {Authorization:`Bearer ${await e.ensureAuthenticated()}`}}catch{return null}}function oo(e){return {Authorization:`Bearer ${e}`}}async function hs(e,t,s={},r,n,i,o,a){let u=no().baseUrl,p=new URL(t,u);o&&Object.entries(o).forEach(([m,w])=>{p.searchParams.set(m,w);});let I=p.toString(),v=i==="no_auth",c=v?void 0:i||await io(a);if(!v&&!c)return {exception:"unauthorized",status:401,statusText:"Unauthorized",headers:new Headers};let h={method:e.toUpperCase(),headers:{"Content-Type":"application/json",...c,...r?.headers},...r};(e==="post"||e==="put")&&s&&(h.body=JSON.stringify(s));let g;try{g=await fetch(I,h);}catch{return {exception:"connection_error",status:0,statusText:"Connection Error",headers:new Headers}}if(g.status===401&&n&&!v)try{let m=await a.refreshToken();if(m?.access_token){let w={...r,headers:{"Content-Type":"application/json",...r?.headers}};return await hs(e,t,s,w,!1,oo(m.access_token),o,a)}}catch{return await ee.clearTokens(),{exception:"unauthorized",status:401,statusText:"Unauthorized - Session expired",headers:g.headers}}let y;try{let m=g.headers.get("content-type");m&&m.includes("application/json")?y=await g.json():y=await g.text();}catch{}return {data:y,status:g.status,statusText:g.statusText,headers:g.headers}}var zr=class{constructor(){this.authService=null,this.webAppCallFn=null;}initialize(e,t){this.authService=e,this.webAppCallFn=t;}async request(e,t={}){if(!this.webAppCallFn||!this.authService)throw new Error("ApiService not initialized. Call initialize() first.");let s=t.method?.toLowerCase()||"get",r;if(t.body)if(typeof t.body=="string")try{r=JSON.parse(t.body);}catch{r=t.body;}else r=t.body;let n=await this.webAppCallFn(s,e,r,{...t,refreshTokenOn401:!t.skipAuth,authHeader:t.skipAuth?"no_auth":void 0},!t.skipAuth,t.skipAuth?"no_auth":void 0,void 0);if(n.exception)throw n.exception==="unauthorized"?new Error("Authentication required. Please login to authenticate."):n.exception==="connection_error"?new Error("Connection error. Please check your network connection."):new Error(`API request failed: ${n.exception}`);if(!n.data&&n.status!==204)throw new Error(`API request failed: ${n.status} ${n.statusText}`);return n.data}async get(e,t){return this.request(e,{...t,method:"GET"})}async post(e,t,s){return this.request(e,{...s,method:"POST",body:t?JSON.stringify(t):void 0})}async put(e,t,s){return this.request(e,{...s,method:"PUT",body:t?JSON.stringify(t):void 0})}async delete(e,t){return this.request(e,{...t,method:"DELETE"})}},Gr="normal",ds=null;function ao(e){ds=e,jr();}function jr(){ds&&(Gr=ds.getLogLevel());}function co(){return jr(),Gr==="debug"}var F={debug:(...e)=>{co()&&console.log("[DEBUG]",...e);}},lo=class{constructor(){this.clientPort=null,this.pollTimer=null,this.pollInterval=500,this.isPolling=false,this.isPaused=false,this.state=null,this.taskFeedItems=new Map,this.scenarioFeedItems=new Map,this.sessionTracking=null,this.completedTasks=new Set,this.completedScenarios=new Set,this.sessionErrorFeedItemCreated=false,this.sessionWaitFeedItemCreated=false,this.sessionWaitFeedItemUpdatedToSuccess=false,this.sessionNotFoundStartTime=null,this.sessionWaitTimeout=120*1e3,this.maxPollTime=3600*1e3,this.startTime=0,this.resolveCallback=null,this.rejectCallback=null,this.terminationRequested=false,this.activePrompts=new Map,this.pollCallCounter=0;}initialize(e){this.clientPort=e,ao(e);}async start(e){if(!this.clientPort)throw new Error("PollingService not initialized. Call initialize() first.");return F.debug(`PollingService.start() called for session ${e}`),await L.initialize(),this.state={sessionId:e,feedItems:new Map,progress:null,isPolling:false,isCompleted:false},this.startTime=Date.now(),this.isPolling=false,this.isPaused=false,this.terminationRequested=false,this.sessionWaitFeedItemCreated=false,this.sessionWaitFeedItemUpdatedToSuccess=false,this.sessionNotFoundStartTime=null,F.debug(`PollingService: Starting polling for session ${e} with interval ${this.pollInterval}ms`),new Promise((t,s)=>{this.resolveCallback=t,this.rejectCallback=s,this.pollTimer=setInterval(()=>{this.poll().catch(r=>{F.debug(`Error in poll() from interval: ${r instanceof Error?r.message:String(r)}`);});},this.pollInterval),this.poll().catch(r=>{F.debug(`Error in initial poll(): ${r instanceof Error?r.message:String(r)}`);});})}async poll(){if(++this.pollCallCounter,!this.clientPort||!this.state||this.isPaused){F.debug(`poll() - clientPort or state or isPaused is false client port = ${this.clientPort?"true":"false"}, state = ${this.state?"true":"false"}, isPaused = ${this.isPaused?"true":"false"}`);return}if(!this.isPolling){if(this.isPolling=true,this.terminationRequested){this.isPolling=false;return}if(!L){this.isPolling=false;return}try{if(Date.now()-this.startTime>this.maxPollTime){if(F.debug("poll() - max poll time exceeded"),await this.stop(),this.terminationRequested)return;this.rejectCallback?.(new Error("Session execution timed out"));return}let e;try{e=await L.sessionRepository.getById(this.state.sessionId);}catch(a){throw F.debug(`poll() - error getting session from database: ${a instanceof Error?a.message:String(a)}`),a}if(!e){if(!this.sessionWaitFeedItemCreated){let a=`session-wait-${this.state.sessionId}`,d={id:a,name:"Booting up DevAssure Agent",status:"running",stateIndicators:[{status:"running",indicator:"blinkingHexagon",color:"cyan"},{status:"success",indicator:"hexagon",color:"green"}]};this.state.feedItems.set(a,d),this.clientPort.onFeedItem(d),this.sessionWaitFeedItemCreated=!0;}if(this.sessionNotFoundStartTime===null&&(this.sessionNotFoundStartTime=Date.now()),Date.now()-this.sessionNotFoundStartTime>this.sessionWaitTimeout){if(await this.stop(),this.terminationRequested)return;this.rejectCallback?.(new Error("Session not found in database after waiting 2 minutes"));return}this.isPolling=!1;return}this.sessionNotFoundStartTime=null;let t=`session-wait-${this.state.sessionId}`,s=this.state.feedItems.get(t);if(s&&!this.sessionWaitFeedItemUpdatedToSuccess){this.sessionWaitFeedItemUpdatedToSuccess=!0;let a={...s,status:"success",currentMessages:[R("Agent is ready!",{icon:"blinkingHexagon",iconColor:"grey",textColor:"grey"})]};this.state.feedItems.set(t,a),this.clientPort.onFeedItem(a),await new Promise(d=>setTimeout(d,1e3));}this.sessionTracking||(this.sessionTracking=this.initializeSessionTracking(e.status),F.debug(`Session ${this.state.sessionId} tracking initialized with status ${e.status}`));let r=e.status,n=this.isSessionCompleted(r);if(F.debug(`Session ${this.state.sessionId} status check: ${r}, isCompleted: ${n}, wasActive: ${this.sessionTracking.wasActive}, lastStatus: ${this.sessionTracking.lastStatus}`),n&&!this.sessionTracking.wasActive){if(F.debug(`Session ${this.state.sessionId} is already completed (was never active), handling completion immediately`),await this.handleSessionCompletion(this.state.sessionId),this.sessionTracking.wasActive=!1,this.sessionTracking.lastStatus=e.status,F.debug(`Session ${this.state.sessionId} is completed, all data read and emitted, stopping polling`),await this.stop(),this.terminationRequested)return;this.state.isCompleted=!0,this.resolveCallback?.();return}await this.handleTasks(this.state.sessionId),await this.handleScenarios(this.state.sessionId),await this.updateProgress(this.state.sessionId),this.sessionTracking.lastStatus!==e.status&&this.sessionTracking.lastStatus&&F.debug(`Session ${this.state.sessionId} status changed: ${this.sessionTracking.lastStatus} -> ${e.status}`);let o=this.sessionTracking.wasActive&&n;if(await this.handleSessionErrors(this.state.sessionId),o?(F.debug(`Session ${this.state.sessionId} transitioned from active to completed`),await this.handleSessionCompletion(this.state.sessionId),this.sessionTracking.wasActive=!1):n?(F.debug(`Session ${this.state.sessionId} is completed (was not active before)`),await this.handleSessionCompletion(this.state.sessionId),this.sessionTracking.wasActive=!1):(this.sessionTracking.wasActive||F.debug(`Session ${this.state.sessionId} is now active`),this.sessionTracking.wasActive=!0),this.sessionTracking.lastStatus=e.status,!n){let a={sessionId:this.state.sessionId,status:e.status,feedItems:Array.from(this.state.feedItems.values()),progress:this.state.progress||void 0,timestamp:new Date};this.clientPort.onSnapshot(a);}if(n){if(F.debug(`Session ${this.state.sessionId} is completed, all data read and emitted, stopping polling`),await this.stop(),this.terminationRequested)return;this.state.isCompleted=!0,this.resolveCallback?.();return}this.isPolling=!1;}catch(e){if(F.debug(`poll() error: ${e instanceof Error?e.message:String(e)}`),await this.stop(),this.terminationRequested)return;this.rejectCallback?.(e instanceof Error?e:new Error(String(e)));}}}async handleTasks(e){try{let t=await L.taskRepository.getBySessionId(e),s=new ye(L.taskRepository);for(let r of t){if(r.name.startsWith("execute_scenario_"))continue;let n=`task-${r.id}`,i=ye.isTaskActive(r.status),o=ye.isTaskCompleted(r.status);if(o&&this.completedTasks.has(r.id))continue;let a=this.taskFeedItems.get(r.id);a||(a=this.initializeTaskTracking(r.id),this.taskFeedItems.set(r.id,a),F.debug(`Task ${r.id} (${r.name}) tracking initialized`)),a.wasActive&&o&&F.debug(`Task ${r.id} (${r.name}) transitioned from active to completed`);let{taskStepIds:u,messageIds:p}=await this.collectTaskSubItemIds(r.id),I=await s.getPendingUserInputTaskStep(r.id),v=await L.taskRepository.getValidatingUserInputTaskStep(r.id),c=a.lastStatus!==r.status;c&&a.lastStatus&&F.debug(`Task ${r.id} (${r.name}) status changed: ${a.lastStatus} -> ${r.status}`);let h=this.detectSubItemChanges(u,a.lastTaskStepIds);h&&F.debug(`Task ${r.id} (${r.name}) task steps changed: ${u.size} current, ${a.lastTaskStepIds.size} previous`);let g=this.detectSubItemChanges(p,a.lastMessageIds);g&&F.debug(`Task ${r.id} (${r.name}) messages changed: ${p.size} current, ${a.lastMessageIds.size} previous`);let y=I?.id!==a.lastPendingUserInputStepId;y&&F.debug(`Task ${r.id} (${r.name}) pending user input step changed: ${I?.id||"none"} -> ${a.lastPendingUserInputStepId||"none"}`);let m=v?.id!==a.lastValidatingUserInputStepId;if(m&&F.debug(`Task ${r.id} (${r.name}) validating user input step changed: ${v?.id||"none"} -> ${a.lastValidatingUserInputStepId||"none"}`),i){if(a.wasActive=!0,I){let f=`task-${r.id}-step-${I.id}`;if(!this.activePrompts.has(f)&&(y||!a.lastPendingUserInputStepId)){let T=ye.getPromptTypeFromTaskStepData(I.data);if(T){this.pause(),F.debug(`Polling paused for user input on task ${r.id} (${r.name}), step ${I.id}`);let P=new AbortController;this.activePrompts.set(f,P);let x=await s.getTaskMessages(r.id),D=ye.mapTaskStatusToFeedStatus(r.status),O=ye.createFeedItem(r,x);O.onInput=!0,O.currentPrompt={message:I.label||"Please provide input:",type:T==="text"?"text":"confirm",placeholder:T==="text"?"Enter value...":void 0},this.state.feedItems.set(n,O),this.clientPort.onFeedItem(O);try{let G=await this.clientPort.userPrompt({type:T==="text"?"text":"confirm",message:I.label||"Please provide input:",placeholder:T==="text"?"Enter value...":void 0},P.signal);if(G.ok&&G.value!==void 0){let U=(typeof G.value=="boolean",String(G.value));await L.taskRepository.updateTaskStepUserInput(I.id,U),F.debug(`User input received for task ${r.id} (${r.name}), step ${I.id}, updated DB with status=validating`);}else F.debug(`User input cancelled for task ${r.id} (${r.name}), step ${I.id}`);}catch(G){F.debug(`User input prompt failed for task ${r.id} (${r.name}), step ${I.id}: ${G instanceof Error?G.message:String(G)}`);}finally{this.activePrompts.delete(f);let G=this.state.feedItems.get(n);if(G){let U={...G};delete U.currentPrompt,U.onInput=!1,this.state.feedItems.set(n,U),this.clientPort.onFeedItem(U);}this.resume(),F.debug(`Polling resumed after user input for task ${r.id} (${r.name})`);}}}}let w=await s.getTaskMessages(r.id),l=ye.mapTaskStatusToFeedStatus(r.status),C=ye.createFeedItem(r,w);I&&!this.activePrompts.has(`task-${r.id}-step-${I.id}`)&&(C.onInput=!0),(!this.state.feedItems.has(n)||c||h||g||y||m)&&(this.state.feedItems.has(n)?F.debug(`Task ${r.id} (${r.name}) feed item updated`):F.debug(`Task ${r.id} (${r.name}) feed item created`),this.state.feedItems.set(n,C),this.clientPort.onFeedItem(C)),a.lastStatus=r.status,a.lastUpdatedAt=new Date().toISOString(),a.lastPendingUserInputStepId=I?.id,a.lastValidatingUserInputStepId=v?.id,a.lastTaskStepIds=u,a.lastMessageIds=p;}else if(o&&!this.completedTasks.has(r.id)){F.debug(`Task ${r.id} (${r.name}) marked as completed`),this.completedTasks.add(r.id),a.wasActive=!1;let w=await s.getTaskMessages(r.id),l=ye.createFeedItem(r,w);this.state.feedItems.set(n,l),this.clientPort.onFeedItem(l),this.state.feedItems.delete(n);}else a.wasActive=!1;}}catch(t){F.debug(`Error handling tasks: ${t}`);}}async handleScenarios(e){try{let t=await L.scenarioRepository.getBySessionId(e),s=new at(L.scenarioRepository);for(let r of t){let n=`scenario-${r.id}`,i=at.isScenarioActive(r.status),o=at.isScenarioCompleted(r.status);if(r.status==="new"||o&&this.completedScenarios.has(r.id))continue;let a=this.scenarioFeedItems.get(r.id);a||(a=this.initializeScenarioTracking(r.id),this.scenarioFeedItems.set(r.id,a),F.debug(`Scenario ${r.id} (${r.title}) tracking initialized`));let d=a.wasActive&&o;d&&F.debug(`Scenario ${r.id} (${r.title}) transitioned from active to completed`),d&&await this.handleScenarioCompletion(r.id);let u=await this.collectScenarioSubItemIds(r.id,r.browser_session_id),p=a.lastStatus!==r.status;p&&a.lastStatus&&F.debug(`Scenario ${r.id} (${r.title}) status changed: ${a.lastStatus} -> ${r.status}`);let I=this.detectSubItemChanges(u.agentStepIds,a.lastAgentStepIds);I&&F.debug(`Scenario ${r.id} (${r.title}) agent steps changed: ${u.agentStepIds.size} current, ${a.lastAgentStepIds.size} previous`);let v=!1;for(let[y,m]of u.agentStepActionIds.entries()){let w=a.lastAgentStepActionIds.get(y)||new Set;if(this.detectSubItemChanges(m,w)){v=!0,F.debug(`Scenario ${r.id} (${r.title}) agent step actions changed for step ${y}: ${m.size} current, ${w.size} previous`);break}}let c=!1;for(let[y,m]of u.agentStepValidationIds.entries()){let w=a.lastAgentStepValidationIds.get(y)||new Set;if(this.detectSubItemChanges(m,w)){c=!0,F.debug(`Scenario ${r.id} (${r.title}) agent step validations changed for step ${y}: ${m.size} current, ${w.size} previous`);break}}let h=this.detectSubItemChanges(u.passedValidationIds,a.lastPassedValidationIds);h&&F.debug(`Scenario ${r.id} (${r.title}) passed validations changed: ${u.passedValidationIds.size} current, ${a.lastPassedValidationIds.size} previous`);let g=this.detectSubItemChanges(u.errorIds,a.lastErrorIds);if(g&&F.debug(`Scenario ${r.id} (${r.title}) errors changed: ${u.errorIds.size} current, ${a.lastErrorIds.size} previous`),i){a.wasActive=!0;let y=await s.getScenarioMessages(r),m=at.createFeedItem(r,y);(!this.state.feedItems.has(n)||p||I||v||c||h||g)&&(this.state.feedItems.has(n)?F.debug(`Scenario ${r.id} (${r.title}) feed item updated`):F.debug(`Scenario ${r.id} (${r.title}) feed item created`),this.state.feedItems.set(n,m),this.clientPort.onFeedItem(m)),a.lastStatus=r.status,a.lastUpdatedAt=new Date().toISOString(),a.lastAgentStepIds=u.agentStepIds,a.lastAgentStepActionIds=u.agentStepActionIds,a.lastAgentStepValidationIds=u.agentStepValidationIds,a.lastPassedValidationIds=u.passedValidationIds,a.lastErrorIds=u.errorIds;}else o&&!this.completedScenarios.has(r.id)?(F.debug(`Scenario ${r.id} (${r.title}) marked as completed`),this.completedScenarios.add(r.id),a.wasActive=!1,this.state.feedItems.delete(n)):a.wasActive=!1;}}catch(t){F.debug(`Error handling scenarios: ${t}`);}}async handleScenarioCompletion(e){try{let s=(await L.scenarioRepository.getBySessionId(this.state.sessionId)).find(u=>u.id===e);if(!s)return;let r=await L.analysisRepository.getLatestScenarioAnalysis(e);if(!r){F.debug(`Scenario ${e} completion: no analysis found`);return}F.debug(`Scenario ${e} (${s.title}) completion: analysis found, score=${r.score}`);let n=`scenario-${s.id}`,i=this.state.feedItems.get(n);if(!i)return;let o=[];o.push({message:`Score: ${r.score==null?"-":r.score} / 100`,styles:{icon:"\u{1F4CA}",textColor:this.getScoreColor(r.score||-1)}}),r.analysis_summary&&o.push({message:`Analysis: ${r.analysis_summary}`,styles:{icon:"\u{1F9E0}",textColor:"white"}}),o.push({message:`Execution Summary: ${r.execution_summary}`,styles:{icon:"hexagon",iconColor:"blueBright",textColor:"white"}});let a=await L.scenarioRepository.getIssuesByParent(r.id,"scenario_analysis");a.length>0&&F.debug(`Scenario ${e} (${s.title}) completion: ${a.length} issues found`);for(let u of a){let p=[];u.issue_type&&p.push(`${u.issue_type}`),u.description&&p.push(`${u.description}`),p.length>0&&o.push({message:p.join(" | "),styles:{icon:"\u{1F41E}",textColor:u.severity==="critical"||u.severity==="high"?"red":"yellow"}});}let d=await L.scenarioRepository.getPassedValidationsByScenarioId(e);d.length>0&&F.debug(`Scenario ${e} (${s.title}) completion: ${d.length} passed validations found`);for(let u of d){let p=[];u.validation_type&&p.push(`${u.validation_type}`),u.description&&p.push(`${u.description}`),p.length>0&&o.push({message:p.join(" | "),styles:{icon:"check",iconColor:"greenBright",textColor:"greenBright"}});}if(o.length>0){let u={...i,completedLogStyle:{icon:"\u{1F9EA}",textColor:"magenta",bold:!0},status:at.mapScenarioStatusToFeedStatus(s.status),currentMessages:o};this.state.feedItems.set(n,u),this.clientPort.onFeedItem(u);}}catch{}}async handleSessionErrors(e){try{let t=await L.errorRepository.getAllByParent(e,"test_session");if(t.length===0)return;F.debug(`Session ${e}: Found ${t.length} session-level errors`);let s=`session-error-${e}`;if(this.sessionErrorFeedItemCreated||this.state.feedItems.has(s))return;let r=[];for(let i of t)i.message&&r.push(this.createErrorMessage(i.message));let n={id:s,name:"Session Error",status:"failed",currentMessages:r.length>0?[r[r.length-1]]:[],allMessages:r.length>1?r.slice(0,-1):[],objectType:"Error"};this.state.feedItems.set(s,n),this.clientPort.onFeedItem(n),this.sessionErrorFeedItemCreated=!0,F.debug(`Session ${e}: Created error feed item with ${t.length} errors`);}catch(t){F.debug(`Error handling session errors: ${t instanceof Error?t.message:String(t)}`);}}async handleSessionCompletion(e){try{let t=await L.sessionRepository.getById(e);if(!t)return;await new Promise(u=>setTimeout(u,1e3)),await this.handleTasks(e);let s=[],r=await L.analysisRepository.getLatestTestSessionAnalysis(e),n=await L.scenarioRepository.getBySessionId(e);if(r){s.push({message:`Score: ${r.score==null?"-":r.score} / 100`,styles:{icon:"\u{1F4CA}",textColor:this.getScoreColor(r.score||-1)}}),s.push({message:`Scenarios run: ${n.length}`,styles:{icon:"\u{1F9EA}",textColor:"white"}}),r.analysis_summary&&s.push({message:`Analysis: ${r.analysis_summary}`,styles:{icon:"\u{1F9E0}",textColor:"white"}});let u=await L.analysisRepository.getIssuesByParent(r.id,"test_session_analysis");u.length>0&&F.debug(`Session ${e} completion: ${u.length} issues found`);for(let p of u){let I=[];p.issue_type&&I.push(`${p.issue_type}`),p.description&&I.push(`${p.description}`),I.length>0&&s.push({message:I.join(" | "),styles:{icon:"\u{1F41E}",textColor:p.severity==="critical"||p.severity==="high"?"red":"yellow"}});}}let i=t.status,o;switch(i){case "success":o="success";break;case "error":case "failing":o="failed";break;case "skipped":o="skipped";break;case "cancelled":o="cancelled";break;default:o="failed";}if(i==="error"){let u=await L.errorRepository.getAllByParent(e,"test_session");if(u.length>0){F.debug(`Session ${e} completion: ${u.length} errors found`);for(let p=0;p<u.length;p++){let I=u[p];I.message&&s.push(this.createErrorMessage(I.message));}}}let a={id:`session-${e}`,name:t.title?`Session: ${t.title}`:`Session: ${e}`,status:o,objectType:"TestSession",completedLogStyle:{icon:"\u{1F3AF}",textColor:"cyanBright",bold:!0},currentMessages:s};this.state.feedItems.set(a.id,a),this.clientPort.onFeedItem(a);let d={sessionId:e,status:t.status,feedItems:Array.from(this.state.feedItems.values()),progress:this.state.progress||void 0,timestamp:new Date};this.clientPort.onSnapshot(d),await new Promise(u=>setTimeout(u,500));}catch(t){F.debug(`Error in handleSessionCompletion: ${t instanceof Error?t.message:String(t)}`);}}async updateProgress(e){try{let t=await L.progressRepository.getTotalScenarioCount(e),s=await L.progressRepository.getCompletedScenarioCount(e);if(t>0){let r=Math.round(s/t*100);this.state.progress={total:t,current:s,percentage:r,type:"number"};}}catch{}}isSessionCompleted(e){return ["success","error","skipped","cancelled"].includes(e)}pause(){this.isPaused=true;}resume(){this.isPaused=false,!this.isPolling&&this.state&&!this.state.isCompleted&&this.poll();}async stop(){await new Promise(e=>setTimeout(e,200)),this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null),this.isPolling=false,this.isPaused=false;}requestTermination(){this.terminationRequested=true,this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null);}async stopAndResolve(){await this.stop(),this.state&&(this.state.isCompleted=true),this.resolveCallback?.();}setRate(e){this.pollInterval=e,this.pollTimer&&(this.stop().catch(()=>{}),this.pollTimer=setInterval(()=>this.poll(),this.pollInterval));}createInfoMessage(e){return R(e,{icon:"circle",iconColor:"gray",textColor:"gray"})}createErrorMessage(e){return R(e,{icon:"cross",iconColor:"red",textColor:"red"})}getScoreColor(e){return e<0?"gray":e>=90?"greenBright":e>=80||e>=70?"yellowBright":"redBright"}initializeTaskTracking(e){return {lastStatus:"",wasActive:false,lastUpdatedAt:new Date().toISOString(),lastMessageIds:new Set,lastTaskStepIds:new Set}}initializeScenarioTracking(e){return {lastStatus:"",wasActive:false,lastUpdatedAt:new Date().toISOString(),lastAgentStepIds:new Set,lastAgentStepActionIds:new Map,lastAgentStepValidationIds:new Map,lastPassedValidationIds:new Set,lastErrorIds:new Set}}initializeSessionTracking(e){return {lastStatus:e,wasActive:false,lastErrorIds:new Set}}detectSubItemChanges(e,t){if(e.size!==t.size)return true;for(let s of e)if(!t.has(s))return true;return false}async collectTaskSubItemIds(e){let t=await L.taskRepository.getStepsByTaskId(e),s=new Set(t.map(u=>u.id)),r=await L.taskRepository.getMessagesByParent(e,"task"),n=t.map(u=>L.taskRepository.getMessagesByParent(u.id,"step")),o=(await Promise.all(n)).flat(),a=[...r,...o],d=new Set(a.map(u=>u.id));return {taskStepIds:s,messageIds:d}}async collectScenarioSubItemIds(e,t){let s=new Set,r=new Map,n=new Map;if(t){let u=await L.scenarioRepository.getAgentStepsByBrowserSessionId(t);for(let p of u){s.add(p.id);let I=await L.scenarioRepository.getAgentStepActionsByStepId(p.id),v=new Set(I.map(g=>g.id));r.set(p.id,v);let c=await L.scenarioRepository.getAgentStepValidationsByStepId(p.id),h=new Set(c.map(g=>g.id));n.set(p.id,h);}}let i=await L.scenarioRepository.getPassedValidationsByScenarioId(e),o=new Set(i.map(u=>u.id)),a=await L.scenarioRepository.getErrorsByScenarioId(e),d=new Set(a.map(u=>u.id));return {agentStepIds:s,agentStepActionIds:r,agentStepValidationIds:n,passedValidationIds:o,errorIds:d}}getController(){return {pause:()=>this.pause(),resume:()=>this.resume(),stop:()=>this.stop(),setRate:e=>this.setRate(e)}}};function ys(e,t={}){return new Promise((s,r)=>{let n=Lr.request(e,t,i=>s(i));n.on("error",r),n.end();})}async function Wr(e){let t=await ys(e,{method:"HEAD"});if(t.statusCode&&t.statusCode>=300&&t.statusCode<400&&t.headers.location)return t.resume(),Wr(t.headers.location);if(!t.statusCode||t.statusCode<200||t.statusCode>=300)throw t.resume(),new Error(`HEAD failed: HTTP ${t.statusCode}`);let s=Number(t.headers["content-length"]??0)||0,r=String(t.headers["accept-ranges"]??"").toLowerCase().includes("bytes");return t.resume(),{total:s,acceptRanges:r}}async function uo(e,t,s,r,n){let i=await ys(e,{method:"GET",headers:{Range:`bytes=${t}-${s}`}});if(i.statusCode!==206)throw i.resume(),new Error(`Range not supported or ignored (HTTP ${i.statusCode}).`);i.on("data",a=>n?.(a.length));let o=k.createWriteStream(r,{flags:"w"});await pipeline(i,o);}async function po(e,t){let s=k.createWriteStream(t,{flags:"w"});for(let r of e){let n=k.createReadStream(r);await pipeline(n,s,{end:false});}await new Promise((r,n)=>{s.end(i=>i?n(i):r());});}async function fo(e,t,s){let r=Math.max(1,s?.parts),n=s?.minPartSizeMB*1024*1024,i=s?.emitEveryMs??250,{total:o,acceptRanges:a}=await Wr(e);if(!o)throw new Error("Unknown content-length; cannot parallelize safely.");if(!a||o<n||r===1){let c=await ys(e,{method:"GET"});if(!c.statusCode||c.statusCode<200||c.statusCode>=300)throw c.resume(),new Error(`Download failed: HTTP ${c.statusCode}`);let h=0,g=0;c.on("data",m=>{h+=m.length;let w=Date.now();s?.onProgress&&w-g>=i&&(g=w,s.onProgress({total:o,current:h,percentage:Math.floor(h/o*100)}));});let y=k.createWriteStream(t,{highWaterMark:1024*1024});y.setMaxListeners(50),await pipeline(c,y),s?.onProgress?.({total:o,current:o,percentage:100});return}let d=Math.ceil(o/r),u=[];for(let c=0;c<r;c++){let h=c*d;if(h>=o)break;let g=Math.min(o-1,(c+1)*d-1);u.push({start:h,end:g,partPath:`${t}.part${c}`});}let p=0,I=0,v=c=>{if(p+=c,!s?.onProgress)return;let h=Date.now();h-I>=i&&(I=h,s.onProgress({total:o,current:p,percentage:Math.floor(p/o*100)}));};try{await Promise.all(u.map(c=>uo(e,c.start,c.end,c.partPath,v))),await po(u.map(c=>c.partPath),t),s?.onProgress?.({total:o,current:o,percentage:100});}finally{await Promise.allSettled(u.map(c=>$.unlink(c.partPath)));}}var Sr=promisify(k.mkdir),go=promisify(k.writeFile),mo=promisify(k.unlink),Er="1.0.15",ho="1.0.15",yo="https://devassures3bucket.s3.us-east-1.amazonaws.com",Ir=/devassure-agent,\s*version\s+([\d.]+)/i;function wo(){return process.platform==="win32"?"windows":process.platform==="darwin"?process.arch==="arm64"?"macos":"macos_intel":"linux"}function So(){return process.platform==="win32"?"devassure-agent.exe":"devassure-agent"}function Vr(){return B.join(ft(),"last-downloaded-version")}function Cr(){try{let e=Xe();return k.existsSync(e)&&k.statSync(e).isFile()}catch{return false}}function Yr(){let e=Pe(),t=So(),s=B.join(e,t),r=B.join(e,".devassure-agent-internal");try{k.existsSync(s)&&k.unlinkSync(s);}catch{}try{k.existsSync(r)&&(k.statSync(r).isDirectory()?k.rmSync(r,{recursive:!0}):k.unlinkSync(r));}catch{}}function Eo(){let e=Vr();if(!k.existsSync(e))return null;try{return k.readFileSync(e,"utf8").trim()||null}catch{return null}}function qr(){return new Promise((e,t)=>{let s=Xe(),r=spawn(s,["version"],{shell:false,stdio:["ignore","pipe","pipe"]}),n="",i="";r.stdout&&r.stdout.on("data",o=>{n+=o.toString();}),r.stderr&&r.stderr.on("data",o=>{i+=o.toString();}),r.on("error",t),r.on("close",o=>{if(o!==0){t(new Error(`devassure-agent version exited ${o}: ${i||n}`));return}let a=n.match(Ir)||i.match(Ir);a&&a[1]?e(a[1].trim()):t(new Error(`Could not parse version from: ${n||i}`));});})}function pt(e,t){e?.onFeedItem(t);}function vr(e,t){if(!e)return;let s=t.progress!==void 0&&t.progress!==null?{...t.progress,type:"progressBar",unit:"MB"}:void 0;e.onSnapshot({sessionId:"",status:"setup",feedItems:t.feedItems,progress:s,timestamp:new Date});}async function Io(e,t,s,r){let i={id:"setup-download",name:"Downloading devassure-agent",status:"running"};pt(s,i);let o=r?.progressEmitIntervalMs??300;try{await fo(e,t,{parts:8,minPartSizeMB:10,emitEveryMs:o,onProgress:({total:a,current:d,percentage:u})=>{vr(s,{feedItems:[{...i}],progress:{total:+(a/(1024*1024)).toFixed(2),current:+(d/(1024*1024)).toFixed(2),percentage:u}});}}),await new Promise(a=>setTimeout(a,100)),vr(s,{feedItems:[{...i,status:"success",currentMessages:[R("Download complete.")]}],progress:void 0});}catch(a){try{k.unlinkSync(t);}catch{}throw a}}async function Co(e,t,s){let n={id:"setup-extract",name:"Extracting\u2026",status:"running",currentMessages:[R("Extracting...")]};pt(s,n),new _r.default(e).extractAllTo(t,true),await mo(e).catch(()=>{}),Tr(Xe()),Tr(_i()),await new Promise(o=>setTimeout(o,100)),pt(s,{...n,status:"success",currentMessages:[R("Extracted.")]});}function Tr(e){try{k.chmodSync(e,493);}catch{}}async function cs(e,t){let s=Pe(),r=ft(),n=wo(),i=ho,o=`${yo}/${n}/devassure-agent/${i}/DevAssure-Agent.zip`;await Sr(s,{recursive:true}),await Sr(r,{recursive:true}),Yr();let a=B.join(r,`DevAssure-Agent-${i}.zip`);await Io(o,a,e,t),await Co(a,s,e);let d={id:"setup-version-check",name:"Setting up DevAssure agent",status:"running"};pt(e,d);let u=await qr();await new Promise(p=>setTimeout(p,100)),pt(e,{...d,status:"success"}),await go(Vr(),u,"utf8"),await new Promise(p=>setTimeout(p,100));}async function ws(e,t){let s=t?.force===true,r=t?.progressEmitIntervalMs,n=Ot().environment==="dev";if(n){if(!Cr())throw new Error(`Dev mode: devassure-agent not found. Add devassure-agent and .devassure-agent-internal to ${Pe()}`);return}let i=r!==void 0?{progressEmitIntervalMs:r}:void 0;if(s){if(Yr(),n)throw new Error(`Dev mode: agent cannot be downloaded. Add devassure-agent and .devassure-agent-internal to ${Pe()}`);await cs(e,i);return}if(!Cr()){await cs(e,i);return}let o=Eo();if(!(o&&St.valid(o)&&St.gte(o,Er))){try{let a=await qr();if(St.valid(a)&&St.gte(a,Er))return}catch{}await cs(e,i);}}var Kr=class{constructor(){this.clientPort=null,this.pollingService=null,this.agentProcessBySessionId=new Map,this.activePrompts=new Map;}initialize(e){this.clientPort=e,this.pollingService=new lo,this.pollingService.initialize(e);}async close(){await L.close(),await this.pollingService?.stop();}async executeSession(e,t,s,r,n,i,o,a){if(!this.clientPort||!this.pollingService)throw new Error("SessionService not initialized. Call initialize() first.");await L.initialize(),await ws(this.clientPort??void 0);let d=Xe(),u=["start",`--test-session-id=${e}`,`--project-path=${t}`];r?.trim()?u.push(`--test-case-file=${r}`):(n?.trim()?u.push(`--test-cases-csv=${n}`):s?.trim()&&u.push(`--test-cases-dir=${s}`),i&&u.push(`--filter=${i}`)),o&&u.push("--archive",o),a?.trim()&&u.push(`--environment=${a.trim()}`);let p=this.clientPort?.getLogLevel()==="debug",I=spawn(d,u,{shell:false,stdio:["ignore",p?"pipe":"ignore",p?"pipe":"ignore"]});this.agentProcessBySessionId.set(e,I);let v=async()=>{await this.pollingService?.stop(),I.kill(),this.agentProcessBySessionId.delete(e);};p&&I.stdout&&(I.stdout.on("data",c=>{console.log(">>> [AGENT]: ",c.toString());}),I.stderr&&I.stderr.on("data",c=>{console.log(">>> [AGENT]: [ERROR] ",c.toString());}));try{this.handleUserInputPrompts(e).catch(()=>{}),await this.pollingService.start(e);}finally{await v();}}async sessionExecutionTermination(e){let t=`session-termination-${e}`;try{if(await L.initialize(),await L.sessionRepository.updateStatus(e,"cancelled"),this.clientPort){let i={id:t,name:"Terminating execution...",status:"failing",stateIndicators:[{status:"failing",indicator:"blinkingCircle",color:"red"}],currentMessages:[],noBorder:!0};this.clientPort.onFeedItem(i);}if(await new Promise(i=>setTimeout(i,2e3)),this.pollingService?.requestTermination(),await this.clientPort?.markActiveFeedItemsCancelled?.([t]),await new Promise(i=>setTimeout(i,6e3)),this.clientPort){let i={id:t,name:"Terminated execution.",status:"failing",stateIndicators:[{status:"failing",indicator:"blinkingCircle",color:"red"}],currentMessages:[],noBorder:!0};this.clientPort.onFeedItem(i);}let s=this.agentProcessBySessionId.get(e);if(s&&(s.kill(),this.agentProcessBySessionId.delete(e)),await new Promise(i=>setTimeout(i,200)),this.clientPort){let i={id:t,name:"Execution terminated!",status:"error",currentMessages:[],noBorder:!0};this.clientPort.onFeedItem(i);}let r=await L.sessionRepository.getById(e);r&&r.status!=="cancelled"&&await L.sessionRepository.updateStatus(e,"cancelled"),(await L.errorRepository.getBySessionId(e)).length===0&&await L.errorRepository.createForSession(e,"Execution cancelled by user!"),await this.pollingService?.stopAndResolve();}catch(s){console.error(`Error during session termination: ${s instanceof Error?s.message:String(s)}`);}}async handleUserInputPrompts(e){if(!this.clientPort||!this.pollingService)return;let t=new ye(L.taskRepository),s=true,r=setInterval(async()=>{if(!s){clearInterval(r);return}try{let n=await L.taskRepository.getBySessionId(e);for(let i of n){if(!ye.isTaskActive(i.status))continue;let a=await t.getPendingUserInputTaskStep(i.id);if(a){let d=`task-${i.id}-step-${a.id}`;if(this.activePrompts.has(d))continue;let u=ye.getPromptTypeFromTaskStepData(a.data);if(!u)continue;let p=new AbortController;this.activePrompts.set(d,p);try{let I=await this.clientPort.userPrompt({type:u==="text"?"text":"confirm",message:a.label||"Please provide input:",placeholder:u==="text"?"Enter value...":void 0},p.signal);if(I.ok&&I.value!==void 0){let v=(typeof I.value=="boolean",String(I.value));await L.taskRepository.updateTaskStepUserInput(a.id,v);}}catch{}finally{this.activePrompts.delete(d);}}}}catch{}},500);return new Promise(n=>{let i=setInterval(()=>{(!this.pollingService||!this.pollingService.state||this.pollingService.state.isCompleted)&&(s=false,clearInterval(r),clearInterval(i),n());},100);})}},kt=class{async getBrowserSessionCount(){return await L.browserSessionRepository.getCount()}async getTestSessionCount(){return await L.sessionRepository.getCount()}async getScenarioCount(){return await L.scenarioRepository.getCount()}async getStorageSize(){let e=Te(),t=B.join(e,"data","devassure.db"),s=B.join(e,"reports"),r=0;try{r+=await $.stat(t).then(n=>n.size);}catch{}try{r+=await this.calculateDirectorySize(s);}catch{}return r}async calculateDirectorySize(e){let t=0;try{let s=await $.readdir(e,{withFileTypes:!0});for(let r of s){let n=B.join(e,r.name);if(r.isDirectory())t+=await this.calculateDirectorySize(n);else if(r.isFile())try{let i=await $.stat(n);t+=i.size;}catch{}}}catch{}return t}formatStorageSize(e){if(e===0)return "0 B";let t=1024,s=["B","KB","MB","GB","TB"],r=Math.floor(Math.log(e)/Math.log(t));return `${(e/Math.pow(t,r)).toFixed(2)} ${s[r]??"B"}`}},Zr=class{async getAllSessions(){return await L.sessionRepository.getAllOrderedByCreatedAt()}async getSessionsToDelete(e,t){let s=await this.getAllSessions();if(e!==void 0){let r=new Date;r.setDate(r.getDate()-e);let n=r.toISOString();return s.filter(i=>i.created_at?i.created_at<n:true)}return t!==void 0?t>=s.length?[]:s.slice(t):s}async getCleanupStats(e){let s=(await L.browserSessionRepository.getBySessionIds(e)).length,r=await this.calculateStorageSize(e);return {sessionsToDelete:e.length,browserSessionsToDelete:s,storageToFree:r}}async cleanupSessionsByIds(e){if(e.length===0)return;let t=await L.sessionRepository.getExistingSessionIds(e);await this.deleteSessions(t);}async calculateStorageSize(e){let t=Te(),s=0;for(let r of e){let n=B.join(t,"data",r),i=B.join(t,"reports",r);try{s+=await this.getDirectorySize(n);}catch{}try{s+=await this.getDirectorySize(i);}catch{}}return s}async getDirectorySize(e){let t=0;try{let s=await $.readdir(e,{withFileTypes:!0});for(let r of s){let n=B.join(e,r.name);if(r.isDirectory())t+=await this.getDirectorySize(n);else if(r.isFile())try{let i=await $.stat(n);t+=i.size;}catch{}}}catch{}return t}async deleteAllData(){await q(async()=>{await W.run("BEGIN TRANSACTION");try{await W.run("DELETE FROM AgentStepAction"),await W.run("DELETE FROM AgentStepValidation"),await W.run("DELETE FROM AgentStep"),await W.run("DELETE FROM PassedValidation"),await W.run("DELETE FROM TaskStep"),await W.run("DELETE FROM Task"),await W.run("DELETE FROM Error"),await W.run("DELETE FROM Message"),await W.run("DELETE FROM Issue"),await W.run("DELETE FROM BrowserSession"),await W.run("DELETE FROM ScenarioAnalysis"),await W.run("DELETE FROM Scenario"),await W.run("DELETE FROM TestSessionAnalysis"),await W.run("DELETE FROM ReportsRender"),await W.run("DELETE FROM SessionData"),await W.run("DELETE FROM TestSession"),await W.run("COMMIT");}catch(r){throw await W.run("ROLLBACK"),r}});let e=Te(),t=B.join(e,"data"),s=B.join(e,"reports");try{let r=await $.readdir(t,{withFileTypes:!0});for(let n of r)n.isDirectory()&&await $.rm(B.join(t,n.name),{recursive:!0,force:!0});}catch{}try{let r=await $.readdir(s,{withFileTypes:!0});for(let n of r)n.isDirectory()&&await $.rm(B.join(s,n.name),{recursive:!0,force:!0});}catch{}}async deleteSessions(e,t){if(e.length===0&&!t)return;if(t){await this.deleteAllData();return}let s=await L.scenarioRepository.getScenarioIdsBySessionIds(e),r=await L.browserSessionRepository.getBrowserSessionIdsBySessionIds(e),n=[];for(let d of e){let u=await L.taskRepository.getBySessionId(d);n.push(...u.map(p=>p.id));}let i=[];for(let d of n){let u=await L.taskRepository.getStepsByTaskId(d);i.push(...u.map(p=>p.id));}let o=[];for(let d of s){let u=await L.analysisRepository.getLatestScenarioAnalysis(d);u&&o.push(u.id);}let a=[];for(let d of e){let u=await L.analysisRepository.getLatestTestSessionAnalysis(d);u&&a.push(u.id);}await q(async()=>{await W.run("BEGIN TRANSACTION");try{let d=L.cleanupRepository;await d.deleteAgentStepActionsByBrowserSessionIds(r),await d.deleteAgentStepValidationsByBrowserSessionIds(r),await d.deleteAgentStepsByBrowserSessionIds(r),await d.deletePassedValidationsByScenarioIds(s),await d.deleteTaskStepsBySessionIds(e),await d.deleteTasksBySessionIds(e),await d.deleteErrorsBySessionIds(e),await d.deleteMessagesBySessionIds(e,s,r,n,i),await d.deleteIssuesByAnalysisIds(o,a),await d.deleteBrowserSessionsBySessionIds(e),await d.deleteScenarioAnalysesByScenarioIds(s),await d.deleteScenariosBySessionIds(e),await d.deleteTestSessionAnalysesBySessionIds(e),await d.deleteReportsRendersBySessionIds(e),await d.deleteSessionDataBySessionIds(e),await d.deleteTestSessionsByIds(e),await W.run("COMMIT");}catch(d){throw await W.run("ROLLBACK"),d}}),await this.deleteSessionFolders(e);}async deleteSessionFolders(e){let t=Te();for(let s of e){let r=B.join(t,"data",s),n=B.join(t,"reports",s);try{await $.rm(r,{recursive:!0,force:!0});}catch{}try{await $.rm(n,{recursive:!0,force:!0});}catch{}}}};function vo(){let e=new Date,t=r=>r.toString().padStart(2,"0"),s=e.getMilliseconds().toString().padStart(3,"0").padEnd(6,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}.${s}`}var Bt=class{constructor(){this.clientPort=null;}initialize(e){this.clientPort=e;}async archiveReport(e,t){let s=Xe(),r=["archive-results","--target-path",e,"--test-session-id",t],n=this.clientPort?.getLogLevel()==="debug",i=spawn(s,r,{shell:false,stdio:n?["ignore","pipe","pipe"]:"inherit"});return n&&i.stdout&&i.stdout.on("data",o=>{console.log(">>> [AGENT]: ",o.toString());}),n&&i.stderr&&i.stderr.on("data",o=>{console.log(">>> [AGENT]: [ERROR] ",o.toString());}),new Promise(o=>{i.on("exit",(a,d)=>{o(a??(d?1:0));});})}async openReport(e,t,s,r){await L.initialize();let n=e;if(!r&&t){let I=await L.sessionRepository.getLastSessionId();if(!I)throw new Error("No test sessions found");n=I;}let i=vo(),o=Xe(),a=["open-report"];r?a.push("--archive",r):n&&a.push(`--test-session-id=${n}`);let d=spawn(o,a,{shell:false});this.clientPort?.getLogLevel()==="debug"&&(d.stdout.on("data",I=>{console.log(">>> [AGENT]: ",I.toString());}),d.stderr.on("data",I=>{console.log(">>> [AGENT]: [ERROR] ",I.toString());}));let u=()=>{d.killed||d.kill();},p=()=>{d.killed||d.kill();};process.on("SIGINT",p),process.on("SIGTERM",p);try{let I=await this.pollForReportsRender(i,n);if(!I)throw new Error("Failed to start report server - no ReportsRender entry found");if(!I.host||I.port===null)throw new Error("Report server started but host/port not available");let v=`http://${I.host}:${I.port}`;if(s){let c="report-server",h={id:c,name:`Running report server at ${v}`,status:"running",currentMessages:[R(`Report server running at ${v}`)]};await s.addFeedItem(h),await new Promise(async g=>{let y=!1,m=async()=>{if(!y){y=!0,u();try{await s.updateFeedItem(c,{status:"success",currentMessages:[R("Report server closed")],currentPrompt:void 0});}catch(l){F.debug(">>> [REPORT SERVICE]: Feed item already removed",{error:l});}g();}},w={message:"Stop reporting server.",type:"userKill",callbackFunction:async l=>{F.debug(">>> [REPORT SERVICE]: User kill callback",{proceed:l}),l||await m();}};await s.updateFeedItem(c,{currentPrompt:w}),d.on("exit",async()=>{if(!y){y=!0;try{await s.updateFeedItem(c,{status:"success",currentMessages:[R("Report server closed")],currentPrompt:void 0});}catch(l){F.debug(">>> [REPORT SERVICE]: Feed item already removed on exit",{error:l});}g();}});});}return {url:v,process:d}}catch(I){throw u(),I}finally{process.removeListener("SIGINT",p),process.removeListener("SIGTERM",p);}}async pollForReportsRender(e,t,s=60,r=500){for(let n=0;n<s;n++)try{let i;if(t)i=await L.reportsRenderRepository.getLatestByTestSessionIdAfter(t,e);else {let o=await L.reportsRenderRepository.getByCreatedAtAfter(e);i=o.length>0?o[0]:void 0;}if(i&&i.host&&i.port!==null)return {host:i.host,port:i.port};await new Promise(o=>setTimeout(o,r));}catch{await new Promise(o=>setTimeout(o,r));}return null}},Xr="00:00:00";function To(e){if(e<0||!Number.isFinite(e))return Xr;let t=Math.floor(e/1e3),s=Math.floor(t/3600),r=Math.floor(t%3600/60),n=t%60,i=o=>o.toString().padStart(2,"0");return `${i(s)}:${i(r)}:${i(n)}`}function br(e){if(e==null||e==="")return null;let t=Date.parse(e);return Number.isNaN(t)?null:t}var Jr=class{async getSessionSummary(e){let t=await L.sessionRepository.getById(e);if(!t)throw new Error("Session not found");let r=(await L.scenarioRepository.getBySessionId(e)).length,n=await L.analysisRepository.getLatestTestSessionAnalysis(e),i=null,o=0;n&&(i=n.score??null,o=(await L.analysisRepository.getIssuesByParent(n.id,"test_session_analysis")).length);let a=await L.scenarioRepository.getPassedValidationCountByTestSessionId(e),d=await L.analysisRepository.getFailedValidationCountByTestSessionId(e),u=null,p=br(t.created_at),I=br(t.end_time);p!=null&&I!=null&&(u=I-p);let v=u!=null?To(u):Xr;return {sessionId:e,title:t.title??null,environment:t.test_environment??null,scenarios:r,score:i,passedValidations:a,failedValidations:d,failureGroups:o,durationMs:u,durationString:v}}},bo=".devassure";function tt(e){let t=process.cwd();return B.join(t,bo)}function $t(e){let t=tt();k.existsSync(t)||k.mkdirSync(t,{recursive:true});}function gt(e,t,s,r){$t();let n=B.join(tt(),e),i="";s&&(i=s+`
|
|
84
84
|
`),i+=gs.dump(t,{indent:2,lineWidth:-1}),k.writeFileSync(n,i,"utf8");}function Qr(e,t){gt("app.yaml",e,`# App Configuration
|
|
85
85
|
# This file contains the description of the web application
|
|
86
|
-
# Documentation: https://
|
|
86
|
+
# Documentation: https://www.npmjs.com/package/@devassure/cli
|
|
87
87
|
# Example:
|
|
88
88
|
# description: >
|
|
89
89
|
# about my app
|
|
@@ -94,7 +94,7 @@ To free the port: lsof -ti:${i} | xargs kill`):g}}throw new Error("Failed to sta
|
|
|
94
94
|
`);}function en(e,t){let s=`# Personas Configuration
|
|
95
95
|
# This file defines the personas for the web application
|
|
96
96
|
# Each persona represents a user type with specific characteristics
|
|
97
|
-
# Documentation: https://
|
|
97
|
+
# Documentation: https://www.npmjs.com/package/@devassure/cli
|
|
98
98
|
# Example:
|
|
99
99
|
# normal_user:
|
|
100
100
|
# description: No admin access can do all other operations
|
|
@@ -109,7 +109,7 @@ To free the port: lsof -ti:${i} | xargs kill`):g}}throw new Error("Failed to sta
|
|
|
109
109
|
# description: License has expired
|
|
110
110
|
`,r={};for(let n of e){let i=n.label.toLowerCase().replace(/\s+/g,"_");r[i]={description:n.description};}gt("personas.yaml",r,s);}function tn(e,t){gt("test_data.yaml",e,`# Test Data Configuration
|
|
111
111
|
# This file contains test data including the default URL of the web app
|
|
112
|
-
# Documentation: https://
|
|
112
|
+
# Documentation: https://www.npmjs.com/package/@devassure/cli
|
|
113
113
|
# Example:
|
|
114
114
|
# default:
|
|
115
115
|
# url: 'http://localhost:3000'
|
|
@@ -140,14 +140,14 @@ To free the port: lsof -ti:${i} | xargs kill`):g}}throw new Error("Failed to sta
|
|
|
140
140
|
# test_otp: 2345
|
|
141
141
|
`);}function sn(e,t){gt("agent_instructions.yaml",{instructions:[]},`# Agent Instructions Configuration
|
|
142
142
|
# This file contains instructions for the agent to follow during testing
|
|
143
|
-
# Documentation: https://
|
|
143
|
+
# Documentation: https://www.npmjs.com/package/@devassure/cli
|
|
144
144
|
# Example:
|
|
145
145
|
# instructions:
|
|
146
146
|
# - Reload the app and retry if app shows warning server is busy
|
|
147
147
|
# - Signup a new user and proceed if any of the give login is not working
|
|
148
148
|
`);}function rn(e,t){let s=`# Preferences Configuration
|
|
149
149
|
# This file contains browser and test execution preferences for the agent
|
|
150
|
-
# Documentation: https://
|
|
150
|
+
# Documentation: https://www.npmjs.com/package/@devassure/cli
|
|
151
151
|
# Example:
|
|
152
152
|
# browsers:
|
|
153
153
|
# default:
|
|
@@ -157,7 +157,7 @@ To free the port: lsof -ti:${i} | xargs kill`):g}}throw new Error("Failed to sta
|
|
|
157
157
|
# workers: 2
|
|
158
158
|
`,r={browsers:{default:{browser:"chromium",resolution:"1920 x 1200",headless:false}},workers:2};gt("preferences.yaml",r,s);}function nn(e){$t();let t=B.join(tt(),"tests");k.existsSync(t)||k.mkdirSync(t,{recursive:true});let s=`# Sample Test Case
|
|
159
159
|
# Each test case should have steps array, rest are optional
|
|
160
|
-
# Documentation: https://
|
|
160
|
+
# Documentation: https://www.npmjs.com/package/@devassure/cli
|
|
161
161
|
# Fields:
|
|
162
162
|
# - summary: Summary of the test case
|
|
163
163
|
# - steps: Steps to be executed in the test case
|
|
@@ -173,10 +173,12 @@ priority: P1
|
|
|
173
173
|
tags:
|
|
174
174
|
- sample
|
|
175
175
|
- ui
|
|
176
|
-
`,r=B.join(t,"sample-test.yaml");k.writeFileSync(r,s,"utf8");}var Es=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function
|
|
176
|
+
`,r=B.join(t,"sample-test.yaml");k.writeFileSync(r,s,"utf8");}var Es=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function pe(e,t,s){if(e&&!Object.values(N).includes(e))return e;switch(e){case N.SPINNER:return t===b.RUNNING||t===b.WAITING||t===b.FAILING?"\u280B":"\u2022";case N.CHECK:return "\u2713";case N.CROSS:return "\u2717";case N.ARROW:return "\u2192";case N.DOT:return "\u2022";case N.CIRCLE:return "\u25CB";case N.CIRCLE_FILL:return "\u25CF";case N.CIRCLE_SPINNER:case N.BLINKING_CIRCLE:case N.BLINKING_DIAMOND:case N.BLINKING_HEXAGON:return Is(e,s||0);case N.SQUARE:return "\u25A0";case N.HEXAGON:return "\u2B22";case N.DIAMOND:return "\u25C7";default:return "\u2022"}}function mt(e){switch(e){case b.RUNNING:return "cyan";case b.SUCCESS:return "green";case b.FAILED:return "red";case b.WAITING:return "yellow";case b.FAILING:return "red";case b.SKIPPED:return "gray";case b.CANCELLED:return "gray";default:return "white"}}function Ro(e){switch(e){case b.RUNNING:return "\u23F3";case b.SUCCESS:return "\u2B22";case b.FAILED:return "\u25CF";case b.WAITING:return "\u23F8";case b.FAILING:return "\u26A0\uFE0F";case b.SKIPPED:return "\u23ED ";case b.CANCELLED:return "\u{1F6AB}";default:return "\u2022"}}function Ut(e,t){if(t){let s=t.find(r=>r.status===e);if(s)return {icon:pe(s.indicator,e),color:s.color||mt(e)}}return e===b.RUNNING||e===b.WAITING||e===b.FAILING?{icon:pe(N.BLINKING_CIRCLE,e),color:mt(e)}:{icon:Ro(e),color:mt(e)}}function Ce(e){return e.startsWith("#")?$e.hex(e):$e[{black:"black",red:"red",green:"green",yellow:"yellow",blue:"blue",magenta:"magenta",cyan:"cyan",white:"white",gray:"gray",grey:"grey",redBright:"redBright",greenBright:"greenBright",yellowBright:"yellowBright",blueBright:"blueBright",magentaBright:"magentaBright",cyanBright:"cyanBright",whiteBright:"whiteBright"}[e]||"white"]||$e.white}function Is(e,t){if(e&&!Object.values(N).includes(e))return e;let s=["\u25D0","\u25D3","\u25D1","\u25D2"],r=["\u25CB","\u25CF"],n=["\u25C7","\u25C6"],i=["\u2B22","\u2B21"];return e===N.CIRCLE_SPINNER?s[t%s.length]:e===N.BLINKING_CIRCLE?r[t%r.length]:e===N.BLINKING_DIAMOND?n[t%n.length]:e===N.BLINKING_HEXAGON?i[t%i.length]:Es[t]}var S=class{static{this.logLevel="normal";}static{this.debugEnabled=false;}static isDevMode(){let t=process.argv[1]||"",s=t.includes("src")||t.includes("tsx"),r=t.includes("dist");return process.env.NODE_ENV==="production"||r?false:s||!r}static setLogLevel(t){this.logLevel=t;}static setDebugEnabled(t){t&&!this.isDevMode()?(this.debugEnabled=false,this.logLevel="verbose"):this.debugEnabled=t;}static isDebugEnabled(){return this.debugEnabled&&this.isDevMode()}static getLogLevel(){return this.logLevel}static getColorFunction(t){let s={black:"black",red:"red",green:"green",yellow:"yellow",blue:"blue",magenta:"magenta",cyan:"cyan",white:"white",gray:"gray",grey:"grey",redBright:"redBright",greenBright:"greenBright",yellowBright:"yellowBright",blueBright:"blueBright",magentaBright:"magentaBright",cyanBright:"cyanBright",whiteBright:"whiteBright"};return s[t]?$e[s[t]]||$e.white:t.startsWith("#")?$e.hex(t):$e.white}static formatMessage(t,s){let n=(s.textColor?this.getColorFunction(s.textColor):$e.white)(t);return s.bold&&(n=$e.bold(n)),n}static formatIcon(t,s){let n=t&&Object.values(N).includes(t)?pe(t,b.RUNNING):t;return (s.iconColor?this.getColorFunction(s.iconColor):$e.white)(n)}static parseSuccessOptions(t){return {bold:false,icon:"\u2B22",iconColor:"greenBright",textColor:"white",...t}}static parseErrorOptions(t){return {bold:false,icon:"\u25CF",iconColor:"redBright",textColor:"redBright",...t}}static parseWarningOptions(t){return {bold:false,icon:"\u26A0",iconColor:"yellowBright",textColor:"yellowBright",...t}}static parseInfoOptions(t){return {bold:false,icon:"\u25C7",iconColor:"blueBright",textColor:"blueBright",...t}}static parseDebugOptions(t){return {bold:false,icon:"\u25CB",iconColor:"gray",textColor:"gray",...t}}static parseStepOptions(t){return {bold:false,icon:"\u25CF",iconColor:"cyanBright",textColor:"cyanBright",...t}}static parseMessageOptions(t){return {bold:false,icon:"-",iconColor:"gray",textColor:"gray",...t}}static success(t,s){let r=this.parseSuccessOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);console.log(`${n} ${i}`);}static error(t,s){let r=this.parseErrorOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);console.log(`${n} ${i}`);}static warning(t,s){let r=this.parseWarningOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);console.log(`${n} ${i}`);}static info(t,s){let r=this.parseInfoOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);console.log(`${n} ${i}`);}static debug(t,s){if(this.isDebugEnabled()){let r=this.parseDebugOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(`[DEBUG] ${t}`,r);console.log(`${n} ${i}`);}}static step(t,s){if(this.logLevel!=="short"){let r=this.parseStepOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);console.log(`${n} ${i}`);}}static message(t,s){let r=this.parseMessageOptions(s),n=this.formatIcon(r.icon,{...r,iconColor:r.iconColor}),i=this.formatMessage(t,r);console.log(` ${n} ${i}`);}static intro(t,s){if(t){let r={bold:true,textColor:"cyan",...s},n=this.formatMessage(t,r);console.log(`
|
|
177
177
|
${n}
|
|
178
178
|
`);}else console.log("");}static outro(t,s){if(t){let r={bold:true,textColor:"green",...s},n=this.formatMessage(t,r);console.log(`
|
|
179
179
|
${n}
|
|
180
180
|
`);}else console.log("");}static newline(){console.log("");}static log(...t){console.log(...t);}static getSuccess(t,s){let r=this.parseSuccessOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);return `${n} ${i}`}static getError(t,s){let r=this.parseErrorOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);return `${n} ${i}`}static getWarning(t,s){let r=this.parseWarningOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);return `${n} ${i}`}static getInfo(t,s){let r=this.parseInfoOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);return `${n} ${i}`}static getDebug(t,s){if(!this.isDebugEnabled())return "";let r=this.parseDebugOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(`[DEBUG] ${t}`,r);return `${n} ${i}`}static getMessage(t,s){let r=this.parseMessageOptions(s),n=this.formatIcon(r.icon,{...r,iconColor:r.iconColor}),i=this.formatMessage(t,r);return ` ${n} ${i}`}static getNewline(){return `
|
|
181
|
-
`}static getVerbose(t){return `[VERBOSE] ${t}`}static getIntro(t,s){if(!t)return "";let r={bold:true,textColor:"cyan",...s};return this.formatMessage(t,r)}static getOutro(t,s){if(!t)return "";let r={bold:true,textColor:"green",...s};return this.formatMessage(t,r)}static getStep(t,s){if(this.logLevel==="short")return "";let r=this.parseStepOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);return `${n} ${i}`}};function on(e){if(!e)return "";let{type:t,total:s,current:r,percentage:n,eta:i,unit:o}=e;switch(t){case xe.NUMBER:return `${r}/${s} ${o||""}`;case xe.PERCENTAGE:return `${n.toFixed(1)}%`;case xe.PROGRESS_BAR:{let d=Math.floor(r/s*30),u=30-d;return `[${"\u2588".repeat(d)+"\u2591".repeat(u)}] ${r}/${s} ${o||""}`}case xe.THIN_PROGRESS_BAR:{let d=Math.floor(r/s*30),u=30-d;return `[${"\u2584".repeat(d)+"\u2581".repeat(u)}] ${n.toFixed(1)}% ${o||""}`}case xe.ETA:if(i!==void 0){let c=Math.floor(i/60),d=Math.floor(i%60);return `ETA: ${c}m ${d}s`}return `${r}/${s}`;case xe.DOTTED:{let c=Math.floor(r/s*10);return `${"\u25CF".repeat(c)+"\u25CB".repeat(10-c)} ${r}/${s} ${o||""}`}default:return `${r}/${s}`}}function Cs({message:e,placeholder:t,value:s,onChange:r,onSubmit:n,validate:i,isPassword:o=false,styles:c}){let[d,u]=useState(),g=T=>{u(void 0),r(T);},I=T=>{if(i){let P=i(T);if(P){u(P);return}}u(void 0),n(T);},v="?",a="yellow",m="white",p=c?.icon||v,f=c?.iconColor||a,w=c?.textColor||m,E=c?.bold||false,C=Object.values(N).includes(p)?de(p,b.RUNNING,0):p,h=Ie(f);return z$1.createElement(Box,{flexDirection:"column"},z$1.createElement(Box,null,z$1.createElement(Text,{bold:E,color:w},h(C)," ",e,t&&z$1.createElement(Text,{dimColor:true}," (",t,")"))),z$1.createElement(Box,{marginTop:1,flexDirection:"row",alignItems:"center"},z$1.createElement(Text,{dimColor:true},">"),z$1.createElement(Text,null," "),z$1.createElement(Ro,{value:s,onChange:g,onSubmit:I,placeholder:t,mask:o?"*":void 0})),d&&z$1.createElement(Box,{marginTop:1},z$1.createElement(Text,{color:"red"},d)))}function un({message:e,initialValue:t,onSubmit:s,styles:r}){let n=()=>{s(true);},i=()=>{s(false);},c="yellow",d="white",u=r?.icon||"?",g=r?.iconColor||c,I=r?.textColor||d,v=r?.bold||false,m=Object.values(N).includes(u)?de(u,b.RUNNING,0):u,p=Ie(g);return z$1.createElement(Box,{flexDirection:"row",alignItems:"center"},z$1.createElement(Text,{bold:v,color:I},p(m)," ",e," "),z$1.createElement(Text,{dimColor:true},">"),z$1.createElement(Text,null," "),z$1.createElement(ConfirmInput,{onConfirm:n,onCancel:i,defaultChoice:t?"confirm":"cancel"}))}function dn({message:e,options:t,initialValue:s,onSubmit:r,styles:n}){let i=t.map(h=>({label:h.label,value:String(h.value)})),o=s!==void 0?String(s):void 0,[c,d]=useState(o);useInput((h,_)=>{if(_.return&&c!==void 0){let T=t.find(P=>String(P.value)===c);T&&r(T.value);}});let u=h=>{d(h);},g="?",I="yellow",v="white",a=n?.icon||g,m=n?.iconColor||I,p=n?.textColor||v,f=n?.bold||false,E=Object.values(N).includes(a)?de(a,b.RUNNING,0):a,l=Ie(m);return z$1.createElement(Box,{flexDirection:"column"},z$1.createElement(Box,null,z$1.createElement(Text,{bold:f,color:p},l(E)," ",e)),z$1.createElement(Box,{marginTop:1},z$1.createElement(Select,{options:i,defaultValue:o,onChange:u})))}function pn({message:e,options:t,initialValues:s=[],onSubmit:r,styles:n}){let i=t.map(l=>({label:l.label,value:String(l.value)})),o=s.map(l=>String(l)),c=l=>{let C=l.map(h=>{let _=t.find(T=>String(T.value)===h);return _?_.value:h});r(C);},d="?",u="yellow",g="white",I=n?.icon||d,v=n?.iconColor||u,a=n?.textColor||g,m=n?.bold||false,f=Object.values(N).includes(I)?de(I,b.RUNNING,0):I,w=Ie(v);return z$1.createElement(Box,{flexDirection:"column"},z$1.createElement(Box,null,z$1.createElement(Text,{bold:m,color:a},w(f)," ",e)),z$1.createElement(Box,{marginTop:1},z$1.createElement(MultiSelect,{options:i,defaultValue:o,onSubmit:c})))}function vs({message:e,onSubmit:t,styles:s,confirmKeys:r,cancelKeys:n,escToCancel:i}){useEffect(()=>{process.stdin.isTTY&&process.stdin.isPaused()&&process.stdin.resume();},[]);let o=(E,l,C)=>E==="ctrl+c"||E==="Ctrl+C"?C.ctrl&&l==="c":E==="escape"||E==="Escape"||E==="esc"||E==="ESC"?C.escape:E==="return"||E==="Return"||E==="enter"||E==="Enter"?C.return:typeof l=="string"&&l.toLowerCase()===E.toLowerCase();try{useInput((E,l)=>{let C=i!==void 0?i:!0;if(n&&n.length>0){for(let h of n)if(o(h,E,l)){t(!1);return}if(C&&l.escape){t(!1);return}}else {if(l.ctrl&&E==="c"){t(!1);return}if(E&&E.toLowerCase()==="q"){t(!1);return}if(C&&l.escape){t(!1);return}}if(r&&r.length>0){for(let h of r)if(o(h,E,l)){t(!0);return}return}else t(!0);});}catch{useEffect(()=>{let l=setTimeout(()=>{t(true);},2e3);return ()=>{clearTimeout(l);}},[]);}let c="?",d="yellow",u="white",g=s?.icon||c,I=s?.iconColor||d,v=s?.textColor||u,a=s?.bold||false,p=Object.values(N).includes(g)?de(g,b.RUNNING,0):g,f=Ie(I);return z$1.createElement(Box,{flexDirection:"row",alignItems:"center"},z$1.createElement(Text,{bold:a,color:v},f(p)," ",e))}var zt=30,Gt=2e3;function Fo({text:e,charDelay:t,onComplete:s,onProgress:r,maxLength:n,maxDisplayLength:i,initialVisibleLength:o=0,children:c}){let d=n!=null&&e.length>n?n:e.length,[u,g]=useState(()=>Math.min(o,d)),I=useRef(s),v=useRef(r),a=useRef(false),m=useRef(e),p=useRef(n);I.current=s,v.current=r,useEffect(()=>{let E=m.current!==e,l=p.current!==n;m.current=e,p.current=n,E||l?(g(0),a.current=false):o>0&&o<=d&&u<o&&g(o);},[e,n,o,d,u]),useEffect(()=>{v.current?.(u);},[u]),useEffect(()=>{if(u>=d){!a.current&&I.current&&(a.current=true,I.current());return}a.current=false;let E=setInterval(()=>{g(l=>Math.min(l+1,d));},t);return ()=>clearInterval(E)},[u,d,t]);let f=e.slice(0,u),w;if(i==null||f.length<=i)w=f;else {let l=100*(Math.floor((u-i)/100)+1);w=e.slice(l,u);}return i!=null&&w.length>i&&(w=w.slice(-i)),w=w.replace(/\n/g," \u25C6\u25C6 "),c?z$1.createElement(z$1.Fragment,null,c(w)):z$1.createElement(Text,null,w)}var Po=z$1.memo(Fo),fn=new Map;function Ts(e,t){if(!e||t.length===0)return {currentIndex:0,phase:"typing",currentVisibleLength:0,messagesLength:t.length};let s=fn.get(e);if(!s)return {currentIndex:0,phase:"typing",currentVisibleLength:0,messagesLength:t.length};let r=s.messagesLength??0;if(t.length>r)return {currentIndex:r,phase:"typing",currentVisibleLength:0,messagesLength:t.length};let i=t[s.currentIndex]?.length??0,o=Math.min(s.currentVisibleLength,i);return {currentIndex:Math.min(s.currentIndex,t.length-1),phase:s.phase,currentVisibleLength:o,messagesLength:t.length}}function xo({messages:e,charDelay:t,retainDuration:s,maxStreamCharLength:r,maxDisplayLength:n,progressKey:i,render:o}){let[c,d]=useState(()=>Ts(i,e).currentIndex),[u,g]=useState(()=>Ts(i,e).phase),[I,v]=useState(()=>Ts(i,e).currentVisibleLength),a=useRef(null),m=useRef(c),p=useRef(e),f=useRef(false),w=useRef(e.length);if(m.current=c,p.current=e,useEffect(()=>{let T=w.current;w.current=e.length,e.length>T&&T>0&&(E(),f.current=false,d(T),g("typing"),v(0));},[e.length]),useEffect(()=>{!i||e.length===0||fn.set(i,{currentIndex:c,phase:u,currentVisibleLength:I,messagesLength:e.length});},[i,e.length,c,u,I]),e.length===0)return null;let E=()=>{a.current!=null&&(clearTimeout(a.current),a.current=null);},l=()=>{E();let T=m.current,P=p.current;T<P.length-1&&(a.current=setTimeout(()=>{a.current=null;let x=m.current,F=p.current;x<F.length-1&&(d(x+1),g("typing"),v(0));},s));},C=()=>{f.current=false,g("retaining"),l(),f.current=true;};if(useEffect(()=>()=>E(),[]),useEffect(()=>{if(u!=="retaining"){f.current=false;return}if(!(c>=e.length-1)&&!f.current)return f.current=true,l(),()=>E()},[u,c,e.length,s]),u==="retaining"){let T=e[c];return n!=null&&T.length>n&&(T=T.slice(-n)),T=T.replace(/\n/g," \u25C6\u25C6 "),z$1.createElement(z$1.Fragment,null,o(c,T))}let h=e[c],_=r!=null&&h.length>r?r:void 0;return z$1.createElement(Po,{key:c,text:h,charDelay:t,maxLength:_,maxDisplayLength:n,initialVisibleLength:I,onProgress:v,onComplete:C},T=>o(c,T))}function No(e,t){return e.length!==t.length?false:e.every((s,r)=>s===t[r])}var gn=z$1.memo(xo,(e,t)=>e.progressKey===t.progressKey&&e.charDelay===t.charDelay&&e.retainDuration===t.retainDuration&&e.maxStreamCharLength===t.maxStreamCharLength&&e.maxDisplayLength===t.maxDisplayLength&&No(e.messages,t.messages));var bs=class{constructor(){this.ctrlCPressedOnce=false;this.currentSessionId=null;this.currentSessionService=null;this.handlerInstalled=false;this.handlingCtrlC=false;}initialize(){this.handlerInstalled||(process.on("SIGINT",this.handleSIGINT.bind(this)),this.handlerInstalled=true);}registerSession(t,s){this.currentSessionId=t,this.currentSessionService=s,this.ctrlCPressedOnce=false;}unregisterSession(){this.currentSessionId=null,this.currentSessionService=null,this.ctrlCPressedOnce=false;}handleCtrlCFromInk(){setImmediate(()=>{this.handleCtrlC();});}async handleSIGINT(){setImmediate(()=>{this.handleCtrlC();});}async handleCtrlC(){if(!this.handlingCtrlC){this.handlingCtrlC=true;try{if(!this.ctrlCPressedOnce)this.ctrlCPressedOnce=!0,y.newline(),y.warning("Press ctrl+c again to close");else {if(y.newline(),this.currentSessionId&&this.currentSessionService)try{await this.currentSessionService.sessionExecutionTermination(this.currentSessionId);}catch(t){y.error(`Failed to update session status: ${t instanceof Error?t.message:String(t)}`);}y.newline(),y.error("Cancelled by user!"),process.exit(0);}}finally{setTimeout(()=>{this.handlingCtrlC=false;},100);}}}},He=new bs;function Me(e){return e.maxCharLength!=null&&e.message.length>e.maxCharLength?e.message.slice(0,e.maxCharLength)+"...":e.message}function Rs(e){return e?.length?e.map(t=>t.message).join("\0"):""}var $o=z$1.memo(function({feedItem:t,renderFeedItemMessage:s}){let r=Rs(t.currentMessages),n=useMemo(()=>t.currentMessages?.map(g=>g.message)??[],[r]),i=t.typewriterEffect?.charDelay??zt,o=t.typewriterEffect?.retainDuration??Gt,c=t.typewriterEffect?.maxStreamCharLength,d=t.typewriterEffect?.maxDisplayLength,u=useCallback((g,I)=>z$1.createElement(Box,{marginTop:g>0?1:0},s({...t.currentMessages[g],message:I},t.status)),[t.currentMessages,t.status,s]);return z$1.createElement(gn,{key:t.id,progressKey:t.id,messages:n,charDelay:i,retainDuration:o,maxStreamCharLength:c,maxDisplayLength:d,render:u})},(e,t)=>{if(e.feedItem.id!==t.feedItem.id||Rs(e.feedItem.currentMessages)!==Rs(t.feedItem.currentMessages))return false;let s=e.feedItem.typewriterEffect,r=t.feedItem.typewriterEffect;return !((s?.charDelay??zt)!==(r?.charDelay??zt)||(s?.retainDuration??Gt)!==(r?.retainDuration??Gt)||s?.maxStreamCharLength!==r?.maxStreamCharLength||s?.maxDisplayLength!==r?.maxDisplayLength||e.feedItem.status!==t.feedItem.status)});function ce({feedItems:e,progress:t,onInput:s,logLevel:r,summary:n}){let[i,o]=useState(0),[c,d]=useState(new Map),u=a=>{let m=a.styles,p=m?.logger,f=m?.border,w=p?.icon,E=p?.iconColor||"blue",l=p?.textColor||"white",C=p?.bold||false,h="",_=F=>F;w&&(h=Object.values(N).includes(w)?de(w,b.RUNNING,i):w,_=Ie(E));let T={};f&&(T.borderStyle="round",f.color&&(T.borderColor=f.color));let P={};f&&(P.paddingX=1,P.paddingY=0);let x=z$1.createElement(Text,{bold:C,color:l},h?`${_(h)} `:"",a.summary);return f?z$1.createElement(Box,{flexDirection:"column",marginBottom:1,marginTop:1,...T,...P},x):z$1.createElement(Box,{flexDirection:"column",marginBottom:1,marginTop:1},x)},g=(a,m)=>{let p=N.BLINKING_CIRCLE,f=m?mt(m):"blue",w="white",E=a.styles,l=E?.icon||p,C=E?.iconColor||f,h=E?.textColor||w,_=E?.bold||false,P=l&&Object.values(N).includes(l)?de(l,b.RUNNING,i):l,x=C,F=h,O=Ie(x),G=Me(a),U=G.split(`
|
|
182
|
-
`);return U.length<=1?z$1.createElement(Text,{bold:_,color:F},O(P)," ",G):z$1.createElement(Box,{flexDirection:"column"},U.map((De,J)=>z$1.createElement(Text,{key:J,bold:_,color:F},J===0?`${O(P)} ${De}`:De)))};useEffect(()=>{let a=setInterval(()=>{o(m=>(m+1)%Es.length);},100);return ()=>clearInterval(a)},[]),useInput((a,m)=>{if(m.ctrl&&a==="c"&&!e.some(p=>p.currentPrompt?.type===re.USERKILL)){He.handleCtrlCFromInk();return}s&&m.return&&s(a);}),useEffect(()=>{},[e.length,t]);let v=e.filter(a=>!et.includes(a.status));return v.length===0&&!n?null:z$1.createElement(Box,{key:"cli-feed-root",flexDirection:"column"},n&&z$1.createElement(Box,{key:"summary"},u(n)),v?.map((a,m)=>{let{icon:p,color:f}=Ut(a.status,a.stateIndicators),w=p;if(a.status===b.RUNNING||a.status===b.WAITING||a.status===b.FAILING){let h=a.stateIndicators?.find(_=>_.status===a.status)?.indicator;w=Is(h,i);}let E=Ie(f),l=Ie("magentaBright"),C=a.noBorder?{paddingX:0,paddingY:0}:{borderStyle:"round",borderColor:a.colorTheme||f,paddingX:0,paddingY:0};return z$1.createElement(Box,{key:a.id,flexDirection:"column",marginBottom:1,marginTop:1},z$1.createElement(Box,{key:`${a.id}-border`,...C},z$1.createElement(Box,{key:`${a.id}-content`,flexDirection:"column",width:"100%"},z$1.createElement(Text,{key:`${a.id}-title`,bold:true,color:a.textColor},a.objectType?.toLowerCase()==="scenario"&&` ${l(de(N.CIRCLE_SPINNER,a.status,i))} `,E(w)," ",a.name),!a.currentPrompt&&!!a.currentMessages?.length&&z$1.createElement(Box,{key:"current-messages",flexDirection:"column",marginLeft:2},a.typewriterEffect?.enabled===true?z$1.createElement($o,{key:`typewriter-${a.id}`,feedItem:a,renderFeedItemMessage:g}):a.currentMessages.map((h,_)=>z$1.createElement(Box,{key:`msg-${_}`,marginTop:1},g(h,a.status)))),a.currentPrompt&&z$1.createElement(Box,{marginTop:1},a.currentPrompt.type===re.TEXT&&z$1.createElement(Cs,{message:a.currentPrompt.message,placeholder:a.currentPrompt.placeholder,value:c.get(a.id)||"",onChange:h=>{let _=new Map(c);_.set(a.id,h),d(_);},onSubmit:h=>{a.currentPrompt?.callbackFunction(h);},validate:a.currentPrompt.validate||(h=>{if(!h||h.trim()==="")return "This field is required"}),styles:a.currentPrompt.styles}),a.currentPrompt.type===re.CONFIRM&&z$1.createElement(un,{message:a.currentPrompt.message,initialValue:a.currentPrompt.options?.[0]?.value??true,onSubmit:h=>{a.currentPrompt?.callbackFunction(h);},styles:a.currentPrompt.styles}),a.currentPrompt.type===re.PASSWORD&&z$1.createElement(Cs,{message:a.currentPrompt.message,placeholder:a.currentPrompt.placeholder,value:c.get(a.id)||"",onChange:h=>{let _=new Map(c);_.set(a.id,h),d(_);},onSubmit:h=>{a.currentPrompt?.callbackFunction(h);},validate:a.currentPrompt.validate||(h=>{if(!h||h.trim()==="")return "This field is required"}),isPassword:true,styles:a.currentPrompt.styles}),a.currentPrompt.type===re.SELECT&&z$1.createElement(dn,{message:a.currentPrompt.message,options:a.currentPrompt.options||[],initialValue:a.currentPrompt.options?.[0]?.value,onSubmit:h=>{a.currentPrompt?.callbackFunction(h);},styles:a.currentPrompt.styles}),a.currentPrompt.type===re.MULTISELECT&&z$1.createElement(pn,{message:a.currentPrompt.message,options:a.currentPrompt.options||[],initialValues:[],onSubmit:h=>{a.currentPrompt?.callbackFunction(h);},styles:a.currentPrompt.styles}),a.currentPrompt.type===re.KEYPRESS&&z$1.createElement(vs,{message:a.currentPrompt.message,styles:a.currentPrompt.styles,onSubmit:h=>{a.currentPrompt?.callbackFunction(h);}}),a.currentPrompt.type===re.USERKILL&&z$1.createElement(vs,{message:`${a.currentPrompt.message}. Press ctrl+c`,styles:a.currentPrompt.styles,onSubmit:async h=>{a.currentPrompt&&"callbackFunction"in a.currentPrompt&&a.currentPrompt.callbackFunction&&await a.currentPrompt.callbackFunction(h);},confirmKeys:[],cancelKeys:["ctrl+c"],escToCancel:false})))))}),t&&z$1.createElement(Box,{key:"progress",marginTop:1},z$1.createElement(Text,null,$e.cyan("Progress:")," ",on(t))))}var ne=class{constructor(t="normal"){this.feedItems=new Map;this.processedCompletedItems=new Set;this.progress=null;this.logLevel="normal";this.renderInstance=null;this.summary=null;this.logLevel=t;}setRenderInstance(t){this.renderInstance=t;}setOnInput(t){this.onInputCallback=t;}async wait(t){return new Promise(s=>setTimeout(s,t))}async addFeedItem(t){if(et.includes(t.status)){if(this.processedCompletedItems.has(t.id))return;this.processedCompletedItems.add(t.id);}if(await this.wait(100),t.createdAt=new Date,et.includes(t.status)){let s={name:t.name,currentMessages:t.currentMessages,allMessages:t.allMessages,stateIndicators:t.stateIndicators};this.forceUpdate(),await new Promise(r=>{setTimeout(()=>{if(this.logLevel!=="short"&&t.status){let{icon:n}=Ut(t.status,s.stateIndicators);switch(y.newline(),t.status){case b.SUCCESS:y.success(s.name,t.completedLogStyle||{icon:n,iconColor:"greenBright",textColor:"white"});break;case b.FAILED:y.error(s.name,t.completedLogStyle||{icon:n,iconColor:"redBright",textColor:"white"});break;case b.SKIPPED:y.warning(s.name,t.completedLogStyle||{icon:n,iconColor:"yellowBright",textColor:"white"});break;case b.CANCELLED:y.info(s.name,t.completedLogStyle||{icon:n,iconColor:"gray",textColor:"white"});break;default:y.info(s.name,t.completedLogStyle||{icon:n,iconColor:"gray",textColor:"white"});break}this.logLevel==="verbose"&&!t.retainAllMessages&&s.allMessages?.forEach(i=>{let o=typeof i=="string"?i:Me(i);y.message(`[VERBOSE] ${o}`);}),t.retainAllMessages&&s.allMessages?.forEach(i=>{y.message(Me(i),i.styles);}),s.currentMessages?.forEach(i=>{y.message(Me(i),i.styles);});}r();},10);});return}this.feedItems.set(t.id,t),this.forceUpdate();}async removeFeedItem(t,s){if(this.logLevel=="verbose"){let r=this.feedItems.get(t);r&&(this.onLog(s,r.name,r.completedLogStyle),[...r.allMessages||[],...r.currentMessages||[]].forEach(n=>{n.message&&this.onLog("message",Me(n),n.styles);}),y.newline());}this.feedItems.delete(t),this.forceUpdate();}async updateFeedItem(t,s){let r=this.feedItems.get(t);if(!r)throw new Error(`Feed item ${t} not found`);let n=[...r.allMessages||[]];if(s.currentMessages&&r.currentMessages&&(n=[...n,...r.currentMessages]),s.allMessages&&(n=[...n,...s.allMessages]),s.status&&et.includes(s.status)){let o=s.currentMessages||r.currentMessages,c=s.completedLogStyle||r.completedLogStyle,d={name:r.name,currentMessages:o,allMessages:n,stateIndicators:r.stateIndicators};this.feedItems.delete(t),this.forceUpdate(),setTimeout(()=>{if(this.logLevel!=="short"&&s.status){let{icon:u}=Ut(s.status,d.stateIndicators);switch(y.newline(),s.status){case b.SUCCESS:y.success(d.name,c||{icon:u,iconColor:"greenBright",textColor:"white"});break;case b.FAILED:y.error(d.name,c||{icon:u,iconColor:"redBright",textColor:"white"});break;case b.SKIPPED:y.warning(d.name,c||{icon:u,iconColor:"yellowBright",textColor:"white"});break;case b.CANCELLED:y.info(d.name,c||{icon:u,iconColor:"gray",textColor:"white"});break;default:y.info(d.name,c||{icon:u,iconColor:"gray",textColor:"white"});break}this.logLevel==="verbose"&&!r.retainAllMessages&&d.allMessages?.forEach(g=>{let I=typeof g=="string"?g:Me(g);y.message(`[VERBOSE] ${I}`);}),r.retainAllMessages&&d.allMessages?.forEach(g=>{y.message(Me(g),g.styles);}),d.currentMessages?.forEach(g=>{y.message(Me(g),g.styles);});}},10),await this.wait(15);return}let i={...r,...s,allMessages:n,name:r.name,updatedAt:new Date};this.feedItems.set(t,i),this.forceUpdate();}setProgress(t){this.progress=t,this.forceUpdate();}setSummary(t){this.summary=t,this.forceUpdate();}onLog(t,s,r){if(t==="verbose"){this.logLevel=="verbose"&&console.log(`[VERBOSE] ${s}`);return}setTimeout(()=>{switch(t){case "success":y.success(s,r);break;case "error":y.error(s,r);break;case "warning":y.warning(s,r);break;case "info":y.info(s,r);break;case "debug":y.debug(s,r);break;case "message":y.message(s,r);break}},10);}getActiveFeedItems(){return Array.from(this.feedItems.values()).filter(t=>!et.includes(t.status))}getAllFeedItems(){return Array.from(this.feedItems.values())}hasActivePrompt(){return this.getActiveFeedItems().some(s=>s.currentPrompt!==void 0)}forceUpdate(){this.renderInstance&&this.renderInstance.rerender&&this.renderInstance.rerender();}getComponentProps(){return {feedItems:this.getAllFeedItems(),progress:this.progress,onInput:this.onInputCallback,logLevel:this.logLevel,summary:this.summary}}async cancelAllFeedItems(t){let s=this.getActiveFeedItems().filter(r=>!t?.includes(r.id));for(let r of s)await this.updateFeedItem(r.id,{status:b.CANCELLED});}clearFeedItems(){this.feedItems.clear(),this.progress=null,this.forceUpdate();}intro(t){y.intro(t);}outro(t){y.outro(t);}};async function wn(e,t){return new Promise((s,r)=>{(async()=>{if(process.stdin.isTTY&&typeof process.stdin.setRawMode=="function"){let i={message:"Press any key to open up the browser to login or q/esc to exit:",type:re.KEYPRESS,callbackFunction:async o=>{await e.updateFeedItem(t,{currentPrompt:void 0}),o||(y.newline(),y.info("Login cancelled.",{textColor:"yellow",iconColor:"yellow"})),s(o);},styles:{textColor:"yellow",iconColor:"white"}};await e.updateFeedItem(t,{currentPrompt:i}),await new Promise(o=>setTimeout(o,100)),await new Promise(o=>setImmediate(()=>o(void 0))),await new Promise(o=>setTimeout(o,100));}else {let i=await import('readline');y.newline(),y.info('Press Enter to open browser to login, or type "q" and Enter to exit:',{textColor:"yellow",iconColor:"white"});let o=i.createInterface({input:process.stdin,output:process.stdout});o.question("> ",c=>{o.close();let d=c.trim().toLowerCase()!=="q";d||(y.newline(),y.info("Login cancelled.",{textColor:"yellow",iconColor:"yellow"})),s(d);});}})().catch(n=>{r(n);});})}async function En(e,t,s){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let r=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",n=new ne("normal"),i=null;if(r){let o=()=>{let[c,d]=z$1.useState(0);z$1.useEffect(()=>{n.setRenderInstance({rerender:()=>{d(g=>g+1);}});},[]);let u=n.getComponentProps();return z$1.createElement(ce,{...u,key:c})};try{i=render(z$1.createElement(o),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(c){console.warn("Ink rendering failed, continuing without interactive UI:",c instanceof Error?c.message:String(c));}}n.intro(Oe.bold("\u{1F510} Logging in to DevAssure"));try{let o="feed-item1",c={id:o,name:"Checking authentication",status:b.RUNNING,currentMessages:[R("Checking existing authentication")]};if(await n.addFeedItem(c),await ee.isAuthenticated()){await n.updateFeedItem(o,{currentMessages:M(["Tokens found in keychain","Verifying authentication"])});try{let m=await ee.getAccessToken();if(m){let p=await t.ping(m);return p.authType=Qe.OAUTH,await ae.setUser(p),s.setUserContext(p),await n.updateFeedItem(o,{currentMessages:[R("Authentication verified")],status:b.SUCCESS}),y.newline(),y.info(" You are already logged in! To logout run `devassure logout`.",{icon:"\u2139\uFE0F"}),0}}catch{await n.updateFeedItem(o,{currentMessages:[R("Authentication expired, proceeding with login...")]}),await ee.clearTokens(),await new Promise(p=>setTimeout(p,400));}}await n.updateFeedItem(o,{allMessages:M(["Checking for existing tokens","No tokens found","Proceeding with login"])}),await n.removeFeedItem(o,"info"),await new Promise(m=>setTimeout(m,400));let u="feed-item2",g={id:u,name:"Starting authentication",status:b.RUNNING,currentMessages:[R("Starting authentication")],allMessages:[],createdAt:new Date,updatedAt:new Date};if(await n.addFeedItem(g),await n.updateFeedItem(u,{currentMessages:[R("Waiting for user confirmation...")],allMessages:M(["Initializing OAuth flow","Preparing authorization URL"])}),await new Promise(m=>setTimeout(m,400)),!await wn(n,u))return await n.updateFeedItem(u,{currentMessages:[R("Login cancelled by user")],status:b.CANCELLED,allMessages:M(["Initializing OAuth flow","Preparing authorization URL"])}),0;await n.updateFeedItem(u,{currentMessages:[R("Opening browser for authentication...")],allMessages:M(["User confirmed"])});let v=e.userPrompt.bind(e);e.userPrompt=async m=>m.type==="confirm"&&m.message==="Open browser to login?"?{ok:!0,value:!0}:v(m);let a=t.login();await n.updateFeedItem(u,{status:b.WAITING,currentMessages:[R("Waiting for authentication in browser...")],allMessages:M(["Waiting for user authentication"])});try{await a,e.userPrompt=v,await n.updateFeedItem(u,{currentMessages:[R("Authentication successful")],status:b.SUCCESS,allMessages:M(["Authorization code received","Exchanging code for tokens"])});}catch(m){e.userPrompt=v;let p=m instanceof Error?m.message:String(m),f=p;throw p.includes("OAuth error:")&&(f=`OAuth authentication failed: ${p.replace("OAuth error: ","")}`),await n.updateFeedItem(u,{currentMessages:[R(f)],status:b.FAILED}),await new Promise(w=>setTimeout(w,400)),m}return await new Promise(m=>setTimeout(m,400)),n.outro(Oe.bold("\u2728 Successfully logged in to DevAssure!")),0}catch(o){return n.onLog("error","Failed to login"),y.newline(),o instanceof Error?y.error(o.message):y.error(String(o)),1}finally{if(i)try{i.unmount();}catch{}}}async function In(){try{return await ee.clearTokens(),await ae.clearUser(),y.newline(),y.success("Successfully logged out",{textColor:"magenta",iconColor:"magenta"}),y.newline(),0}catch(e){return y.error("Failed to logout"),e instanceof Error?y.error(e.message):y.error(String(e)),1}}function yt(e,t,s,r,n,i){return new Promise((o,c)=>{(async()=>{let d={message:s,type:re.TEXT,placeholder:r,validate:n,callbackFunction:async u=>{await e.updateFeedItem(t,{currentPrompt:void 0}),o(u);},styles:i};await e.updateFeedItem(t,{currentPrompt:d}),await new Promise(u=>setTimeout(u,100)),await new Promise(u=>setImmediate(()=>u(void 0))),await new Promise(u=>setTimeout(u,100));})().catch(c);})}function Cn(e,t,s,r=false){return new Promise((n,i)=>{(async()=>{let o={message:s,type:re.CONFIRM,options:[{label:"Yes/No",value:r}],callbackFunction:async c=>{await e.updateFeedItem(t,{currentPrompt:void 0}),n(c);}};await e.updateFeedItem(t,{currentPrompt:o}),await new Promise(c=>setTimeout(c,100)),await new Promise(c=>setImmediate(()=>c(void 0))),await new Promise(c=>setTimeout(c,100));})().catch(i);})}function vn(e){if(!k.existsSync(e)||!k.statSync(e).isDirectory())return 0;let t=0,s=k.readdirSync(e);for(let r of s){let n=B.join(e,r),i=k.statSync(n);i.isDirectory()?t+=vn(n):i.isFile()&&t++;}return t}function Tn(e,t="",s=true){let r=[],n=s?"\u2514\u2500\u2500":"\u251C\u2500\u2500",i=e.isDirectory?Oe.cyan:Oe.white,o=e.isDirectory?`${e.name}/`:e.name;if(r.push(Oe.gray(t+n)+" "+i(o)),e.children&&e.children.length>0){let c=t+(s?" ":"\u2502 ");e.children.forEach((d,u)=>{let g=u===e.children.length-1;r.push(...Tn(d,c,g));});}return r}async function bn(e,t,s){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let r=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",n=new ne("normal"),i=null;if(r){let o=()=>{let[c,d]=z$1.useState(0);z$1.useEffect(()=>{n.setRenderInstance({rerender:()=>{d(g=>g+1);}});},[]);let u=n.getComponentProps();return z$1.createElement(ce,{...u,key:c})};try{i=render(z$1.createElement(o),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(c){console.warn("Ink rendering failed, continuing without interactive UI:",c instanceof Error?c.message:String(c));}}n.intro(Oe.bold("\u{1F680} Initializing DevAssure"));try{let o=tt(),c=k.existsSync(o)&&k.statSync(o).isDirectory();if(c){let F="feed-item-0",O={id:F,name:"Confirm override existing configuration",status:b.RUNNING,currentMessages:[R("Confirm override existing configuration")],allMessages:[]};if(await n.addFeedItem(O),await n.updateFeedItem(F,{currentMessages:[R(".devassure folder already exists")],allMessages:M(["Checking if .devassure directory exists",".devassure directory found"])}),!await Cn(n,F,"The .devassure folder already exists. Do you want to override it?",!1))return await n.updateFeedItem(F,{currentMessages:[R("Configuration override cancelled")],status:b.SKIPPED,allMessages:M(["User chose not to override"])}),await new Promise(J=>setTimeout(J,400)),y.newline(),y.info("Initialization cancelled. Existing configuration preserved.",{icon:"\u23ED"}),0;s&&s.capture("init_reset_devassure_folder");let U=B.join(o,"tests");if(k.existsSync(U)&&k.statSync(U).isDirectory()){let J=vn(U);if(J>0)if(await n.updateFeedItem(F,{currentMessages:[R(`Found ${J} file${J!==1?"s":""} in tests folder`)],allMessages:M(["Configuration override confirmed",`Found ${J} file${J!==1?"s":""} in tests folder`])}),(await yt(n,F,`The tests folder contains ${J} file${J!==1?"s":""}. Type "delete" to confirm deletion, or press "no" to cancel:`,"",Ps=>{},{bold:!0,iconColor:"red",textColor:"red"})).trim().toLowerCase()==="delete")k.rmSync(U,{recursive:!0,force:!0}),await n.updateFeedItem(F,{currentMessages:[R("Tests folder deleted")],allMessages:M(["Configuration override confirmed",`Found ${J} file${J!==1?"s":""} in tests folder`,"Tests folder deleted"])});else return await n.updateFeedItem(F,{currentMessages:[R("Tests folder deletion cancelled")],status:b.SKIPPED,allMessages:M(["Configuration override confirmed",`Found ${J} file${J!==1?"s":""} in tests folder`,"Tests folder deletion cancelled"])}),await new Promise(Ps=>setTimeout(Ps,400)),y.newline(),y.info("Initialization cancelled. Tests folder preserved.",{icon:"\u23ED"}),0}await n.updateFeedItem(F,{currentMessages:[R("Configuration override confirmed")],status:b.SUCCESS}),await new Promise(J=>setTimeout(J,400));}let d="feed-item-1",u={id:d,name:"Check and create .devassure folder",status:b.RUNNING,currentMessages:[R("Check and create .devassure folder")]};await n.addFeedItem(u),await n.updateFeedItem(d,{currentMessages:[R("Checking .devassure directory")],allMessages:M(["Checking if .devassure directory exists"])}),$t(),await n.updateFeedItem(d,{currentMessages:[R(c?"Overriding existing .devassure directory":"Created .devassure directory")],status:b.SUCCESS});let g="feed-item-2",I={id:g,name:"Get app URL",status:b.WAITING,currentMessages:[R("Get app URL")]};await n.addFeedItem(I),await n.updateFeedItem(g,{status:b.RUNNING,currentMessages:[R("Get app URL")]});let v=await yt(n,g,"Enter the URL of the web app","https://example.com",F=>{if(!F||F.trim()==="")return "URL is required";try{new URL(F);return}catch{return "Please enter a valid URL"}});s&&s.capture("init_add_url",{url:v}),await n.updateFeedItem(g,{currentMessages:[R(`App URL: ${v}`)],status:b.SUCCESS,allMessages:M([`URL: ${v}`])});let a="feed-item-3",m={id:a,name:"Get app description",status:b.WAITING,currentMessages:[R("Get app description")]};await n.addFeedItem(m),await n.updateFeedItem(a,{status:b.RUNNING});let p=await yt(n,a,"Enter the description of the web app","A modern web application",F=>{if(!F||F.trim()==="")return "Description is required"});s&&s.capture("init_add_description"),await n.updateFeedItem(a,{currentMessages:[R("App description added")],status:b.SUCCESS,allMessages:M([`Description: ${p}`])});let f="feed-item-4",w={id:f,name:"Get personas",status:b.WAITING,currentMessages:[R("Get personas")]};await n.addFeedItem(w),await n.updateFeedItem(f,{status:b.RUNNING,currentMessages:[R("Get personas")]});let E=[],l=!0,C=1;for(;l;){await n.updateFeedItem(f,{currentMessages:[R(`Get personas (Adding persona ${C})`)],allMessages:M([`Personas added: ${E.length}`])});let F=await yt(n,f,"Add personas of your application. Persona Name:","e.g. admin, normal_user, deactivated_user, expired_user",U=>{if(!U||U.trim()==="")return "Persona label is required"}),O=await yt(n,f,`Short description of persona ${C}`,"e.g. A user with full administrative privileges",U=>{if(!U||U.trim()==="")return "Persona description is required"});E.push({label:F,description:O}),await n.updateFeedItem(f,{currentMessages:[R(`Get personas (Added ${E.length} persona${E.length!==1?"s":""})`)],allMessages:M([`Personas added: ${E.length}`,`Latest: ${F}: ${O}`])}),C++,l=await Cn(n,f,"Add another persona?",!0);}s&&s.capture("init_add_persona",{count:E.length}),await n.updateFeedItem(f,{currentMessages:[R(`Personas added (${E.length} persona${E.length!==1?"s":""})`)],status:b.SUCCESS,allMessages:M([`Total personas: ${E.length}`])});let h="feed-item-5",_={id:h,name:"Write configuration files",status:b.RUNNING,currentMessages:[R("Write configuration files")]};await n.addFeedItem(_),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files"])}),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml"])}),tn({default:{url:v}}),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully"])}),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml"])}),Qr({description:p}),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully"])}),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml"])}),en(E),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml","\u2713 personas.yaml written successfully","Writing agent_instructions.yaml"])}),sn(),rn(),await n.updateFeedItem(h,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml","\u2713 personas.yaml written successfully","Writing agent_instructions.yaml","\u2713 agent_instructions.yaml written successfully","Creating tests folder"])}),nn(),s&&s.capture("init_saved_data",{personaCount:E.length}),await n.updateFeedItem(h,{currentMessages:[R("All configuration files written successfully")],status:b.SUCCESS,allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml","\u2713 personas.yaml written successfully","Writing agent_instructions.yaml","\u2713 agent_instructions.yaml written successfully","Creating tests folder","\u2713 sample-test.yaml created successfully"])});let T=tt();return y.newline(),y.success("Successfully initialized DevAssure project!",{bold:!0}),y.newline(),y.info(`Project configuration files are stored in: ${Oe.cyan(T)}`),y.newline(),Tn({name:".devassure",isDirectory:!0,children:[{name:"app.yaml"},{name:"personas.yaml"},{name:"test_data.yaml"},{name:"agent_instructions.yaml"},{name:"preferences.yaml"},{name:"tests",isDirectory:!0,children:[{name:"sample-test.yaml"}]}]}).forEach(F=>console.log(F)),y.newline(),y.info("You can add tests by creating .yaml files in the tests folder (refer sample-test.yaml)"),y.newline(),y.info("To run tests, run:"),console.log(Oe.bold(Oe.cyan(" devassure run-tests"))),y.newline(),n.outro(Oe.bold("\u2728 DevAssure initialized successfully!")),0}catch(o){return n.onLog("error","Failed to initialize configuration"),y.newline(),o instanceof Error?y.error(o.message):y.error(String(o)),1}finally{if(i)try{i.unmount();}catch{}}}function Go(e){let t=B.join(e,".devassure");if(k.existsSync(t)&&k.statSync(t).isDirectory())return {path:e,wasDerived:false};try{let n=k.readdirSync(e,{withFileTypes:!0});for(let i of n)if(i.isDirectory()){let o=B.join(e,i.name),c=B.join(o,".devassure");if(k.existsSync(c)&&k.statSync(c).isDirectory())return {path:o,wasDerived:!0}}}catch{}let r=Rn(e,new Set);return r!==null?{path:r,wasDerived:true}:{path:e,wasDerived:false}}function Rn(e,t){let s;try{s=k.realpathSync(e);}catch{return null}if(t.has(s))return null;t.add(s);let r=B.join(e,".devassure");if(k.existsSync(r)&&k.statSync(r).isDirectory())return e;try{let n=k.readdirSync(e,{withFileTypes:!0});for(let i of n)if(i.isDirectory()){let o=B.join(e,i.name),c=Rn(o,t);if(c!==null)return c}}catch{}return null}var jo=250,Wo=7e3;async function Vo(e,t){let s=B.join(e,`devassure-results-${t}.zip`),r=Date.now();for(;Date.now()-r<Wo;){if(k.existsSync(s)){y.newline(),y.info(`Test reports are archived in ${s}`),y.newline(),y.info("To open the archived report run: `devassure open-report --archive=<zip-path>`",{textColor:"grey",iconColor:"grey"});return}await new Promise(n=>setTimeout(n,jo));}k.existsSync(s)&&(y.newline(),y.info(`Test reports are archived in ${s}`),y.newline(),y.info("To open the archived report run: `devassure open-report --archive=<zip-path>`",{textColor:"grey",iconColor:"grey"}));}async function st(e){let{clientPort:t,sessionService:s,projectPath:r,testCasesDir:n,filter:i,archiveFolder:o,environment:c,introMessage:d,onPrepare:u,outroMessage:g}=e,I=o?B.isAbsolute(o)?o:B.join(process.cwd(),o):void 0;process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let v=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",a=new ne("normal"),m=null;if(v){let p=()=>{let[f,w]=z$1.useState(0);z$1.useEffect(()=>{a.setRenderInstance({rerender:()=>{w(l=>l+1);}});},[]);let E=a.getComponentProps();return z$1.createElement(ce,{...E,key:f})};try{m=render(z$1.createElement(p),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(f){console.warn("Ink rendering failed, continuing without interactive UI:",f instanceof Error?f.message:String(f));}}t.setCallbacks(p=>{p.feedItems.forEach(f=>{a.updateFeedItem(f.id,f).catch(()=>{a.addFeedItem(f).catch(()=>{});});}),p.progress&&a.setProgress(p.progress);},p=>{a.updateFeedItem(p.id,p).catch(f=>{a.addFeedItem(p).catch(()=>{});});},p=>a.cancelAllFeedItems(p)),a.intro(d);try{let p;if(r!==void 0&&r!=="")p=r;else {let w=process.cwd(),{path:E,wasDerived:l}=Go(w);p=E,l&&y.info(`Using project path: ${B.join(p,".devassure")}`,{icon:N.DIAMOND});}let f=await u(a,p);He.registerSession(f,s);try{return await s.executeSession(f,p,n,void 0,i,I,c),y.newline(),y.newline(),y.info(`To open this test session report run: \`devassure open-report --session-id=${f}\``,{textColor:"grey",iconColor:"grey"}),y.info("To open last executed session report run: `devassure open-report --last`",{textColor:"grey",iconColor:"grey"}),I&&await Vo(I,f),a.outro(g(f)),0}catch(w){y.error(`Failed to execute session: ${w instanceof Error?w.message:String(w)}`);try{await s.close();}catch(E){y.error(`Error during cleanup: ${E instanceof Error?E.message:String(E)}`);}return 1}}catch(p){a.onLog("error","Failed to execute test session"),y.newline(),y.error(`Failed to execute test session: ${p instanceof Error?p.message:String(p)}`);try{await s.close();}catch{}return 1}finally{if(He.unregisterSession(),m)try{m.unmount();}catch{}}}async function Re(e){let t=await Hr(e);t.success||(y.error(t.message,{icon:"\u274C",bold:true}),process.exit(1));}async function Ls(e,t,s,r){return await Re(s),st({clientPort:e,sessionService:t,projectPath:r,introMessage:Oe.bold("\u{1F680} Starting new test session"),onPrepare:async(n,i)=>{let o="feed-item-1",c={id:o,name:"Generate session ID",status:b.RUNNING,currentMessages:[R("Generating session ID...")]};await n.addFeedItem(c);let d=v4();await n.updateFeedItem(o,{currentMessages:[R(`Session ID: ${d}`)],status:b.SUCCESS,allMessages:M([`Generated session ID: ${d}`])}),await new Promise(I=>setTimeout(I,400));let u="feed-item-2",g={id:u,name:"Initialize session service",status:b.RUNNING,currentMessages:[R("Initializing session service...")]};return await n.addFeedItem(g),await n.updateFeedItem(u,{currentMessages:[R(`Project path: ${i}`)],status:b.SUCCESS,allMessages:M(["Initialized session service",`Project path: ${i}`])}),await new Promise(I=>setTimeout(I,400)),d},outroMessage:n=>Oe.bold(`\u2728 Test session ${n} completed!`)})}async function An(e,t,s,r,n){return await Re(s),r?st({clientPort:e,sessionService:t,projectPath:n,introMessage:Oe.bold(`\u{1F504} Resuming test session: ${r}`),onPrepare:async(i,o)=>{let c="feed-item-1",d={id:c,name:"Validate session ID",status:b.RUNNING,currentMessages:[R(`Validating session ID: ${r}`)]};return await i.addFeedItem(d),await i.updateFeedItem(c,{currentMessages:[R(`Session ID validated, project path: ${o}`)],status:b.SUCCESS,allMessages:M([`Session ID: ${r}`,`Project path: ${o}`])}),await new Promise(u=>setTimeout(u,400)),r},outroMessage:i=>Oe.bold(`\u2728 Test session ${i} completed!`)}):(y.error("Session ID is required"),1)}function Dn(e){let{tag:t,priority:s,folder:r,query:n,filter:i}=e;if(i?.trim())return i;let o=[];if(t&&o.push(`tag=${t}`),s&&o.push(`priority=${s}`),r&&o.push(`folder=${r}`),n&&o.push(`query=${n}`),o.length!==0)return o.join(" && ")}async function As(e,t,s,r,n,i,o,c,d,u,g){await Re(s);let I=Dn({tag:n,priority:i,folder:o,query:c,filter:d});return st({clientPort:e,sessionService:t,projectPath:r,testCasesDir:".",filter:I,archiveFolder:u,environment:g,introMessage:Oe.bold("\u{1F680} Starting test session"),onPrepare:async(v,a)=>{let m="feed-item-1",p={id:m,name:"Generate session ID",status:b.RUNNING,currentMessages:[R("Generating session ID...")]};await v.addFeedItem(p);let f=v4();await v.updateFeedItem(m,{currentMessages:[R(`Session ID: ${f}`)],status:b.SUCCESS,allMessages:M([`Generated session ID: ${f}`])}),await new Promise(l=>setTimeout(l,400));let w="feed-item-2",E={id:w,name:"Initialize session service",status:b.RUNNING,currentMessages:[R("Initializing session service...")]};return await v.addFeedItem(E),await v.updateFeedItem(w,{currentMessages:[R(`Project path: ${a}`)],status:b.SUCCESS,allMessages:M(["Initialized session service",`Project path: ${a}`])}),await new Promise(l=>setTimeout(l,400)),f},outroMessage:v=>Oe.bold(`\u2728 DevAssure Agent session ${v} completed!`)})}async function xn(e,t,s,r){let n=new ne("normal"),i=()=>{let[,c]=z$1.useReducer(d=>d+1,0);return z$1.useEffect(()=>{let d=n.forceUpdate.bind(n);n.forceUpdate=()=>{d(),c();};},[]),z$1.createElement(ce,n.getComponentProps())},o=render(z$1.createElement(i));n.setRenderInstance(o),n.intro(Oe.bold("\u{1F511} Adding authentication token"));try{let c="add-token-feedItem",d={id:c,name:"Validating token",status:b.RUNNING,currentMessages:[R("Validating token with server")]};await n.addFeedItem(d);try{let u=await t.jobPing(r,Qe.TOKEN);await n.updateFeedItem(c,{currentMessages:[R("Token validated, clearing existing tokens...")],allMessages:M(["Token validated successfully","Clearing existing OAuth tokens"])}),await ee.clearTokens(),await n.updateFeedItem(c,{currentMessages:[R("Saving token to keychain")]}),await ee.saveAuthToken(r);let g={...u,authType:Qe.TOKEN};return await ae.setUser(g),s.setUserContext(g),await n.updateFeedItem(c,{currentMessages:[R("Token saved successfully")],status:b.SUCCESS}),await new Promise(I=>setTimeout(I,400)),n.outro(Oe.bold("\u2728 Token added successfully!")),y.newline(),y.success("Authentication token has been validated and saved."),0}catch(u){let g=u instanceof Error?u.message:String(u);return await n.updateFeedItem(c,{currentMessages:[R("Token validation failed")],status:b.FAILED,allMessages:M(["Validating token with server",`Token validation failed: ${g}`])}),await new Promise(I=>setTimeout(I,400)),n.onLog("error","Failed to add token"),y.newline(),y.error(`Token validation failed: ${g}`),y.info("Please check your token and try again."),1}}catch(c){return n.onLog("error","Failed to add token"),y.newline(),c instanceof Error?y.error(c.message):y.error(String(c)),1}}async function Nn(){try{await L.initialize();let e=new kt,t=await e.getTestSessionCount(),s=await e.getScenarioCount(),r=await e.getStorageSize(),n=e.formatStorageSize(r);y.newline(),y.info("Statistics:",{bold:!0}),y.newline(),y.info(`Test Sessions: ${Oe.cyan(t.toString())}`),y.info(`Scenarios: ${Oe.cyan(s.toString())}`),y.info(`Storage Used: ${Oe.cyan(n)}`),y.newline();let i=1024*1024*1024;return r>i&&(y.warning(`You can run ${Oe.bold("devassure cleanup")} to remove execution history and free up space.`),y.newline()),0}catch(e){return y.newline(),y.error("Failed to retrieve statistics"),e instanceof Error?y.error(e.message):y.error(String(e)),y.newline(),1}}function Zo(e){y.info("Summary:",{bold:true}),y.info(`sessionId: ${e.sessionId}`,{icon:" "}),e.title!=null&&e.title!==""&&y.info(`title: ${e.title}`,{icon:" "}),e.environment!=null&&e.environment!==""&&y.info(`environment: ${e.environment}`,{icon:" "}),y.info(`scenarios: ${e.scenarios}`,{icon:" "}),y.info(`score: ${e.score??"N/A"}`,{icon:" "}),y.info(`passedValidations: ${e.passedValidations}`,{icon:" "}),y.info(`failedValidations: ${e.failedValidations}`,{icon:" "}),y.info(`failureGroups: ${e.failureGroups}`,{icon:" "}),y.info(`durationMs: ${e.durationMs??"N/A"}`,{icon:" "}),y.info(`durationString: ${e.durationString}`,{icon:" "});}async function Mn(e,t,s){await L.initialize();let r=e;if(t&&(r=await L.sessionRepository.getLastSessionId(),!r))return y.error("No test sessions found"),1;if(!r)return y.error("Either --session-id or --last is required"),1;try{let i=await new Jr().getSessionSummary(r);return s?console.log(JSON.stringify(i,null,2)):Zo(i),0}catch(n){let i=n instanceof Error?n.message:String(n);return i==="Session not found"?y.error("Session not found"):y.error(`Failed to get summary: ${i}`),1}}function Jo(e,t,s,r){return new Promise((n,i)=>{(async()=>{let o={message:s,type:re.TEXT,placeholder:r,callbackFunction:async c=>{await e.updateFeedItem(t,{currentPrompt:void 0}),n(c);},styles:{textColor:"red",bold:true},validate:c=>{}};await e.updateFeedItem(t,{currentPrompt:o}),await new Promise(c=>setTimeout(c,100)),await new Promise(c=>setImmediate(()=>c(void 0))),await new Promise(c=>setTimeout(c,100));})().catch(i);})}function On(e,t,s,r=false){return new Promise((n,i)=>{(async()=>{let o={message:s,type:re.CONFIRM,options:[{label:"Yes/No",value:r}],callbackFunction:async c=>{await e.updateFeedItem(t,{currentPrompt:void 0}),n(c);},styles:{textColor:"red",bold:true}};await e.updateFeedItem(t,{currentPrompt:o}),await new Promise(c=>setTimeout(c,100)),await new Promise(c=>setImmediate(()=>c(void 0))),await new Promise(c=>setTimeout(c,100));})().catch(i);})}async function kn(e,t){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let s=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",r=new ne("normal"),n=null;if(s){let i=()=>{let[o,c]=z$1.useState(0);z$1.useEffect(()=>{r.setRenderInstance({rerender:()=>{c(u=>u+1);}});},[]);let d=r.getComponentProps();return z$1.createElement(ce,{...d,key:o})};try{n=render(z$1.createElement(i),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(o){console.warn("Ink rendering failed, continuing without interactive UI:",o instanceof Error?o.message:String(o));}}try{await L.initialize();let i=new Zr,o=new kt;r.intro(Oe.bold("\u{1F9F9} Cleaning up sessions"));let c="cleanup-feedItem-1",d={id:c,name:"Finding sessions to delete",status:b.RUNNING,currentMessages:[R("Finding sessions...")]};await r.addFeedItem(d);let u=await i.getSessionsToDelete(e,t);if(u.length===0)return await r.updateFeedItem(c,{currentMessages:[R("No sessions to delete")],status:b.SUCCESS}),await new Promise(h=>setTimeout(h,400)),r.outro(Oe.bold("\u2728 No cleanup needed!")),y.newline(),y.success("No sessions need to be cleaned up."),y.newline(),0;let g=u.map(h=>h.id),I=await i.getCleanupStats(g),v=o.formatStorageSize(I.storageToFree);await r.updateFeedItem(c,{currentMessages:[R(`Found ${u.length} session(s) to delete`)],status:b.SUCCESS}),await new Promise(h=>setTimeout(h,400));let a="cleanup-feedItem-2",m={id:a,name:"Confirm deletion",status:b.RUNNING,currentMessages:[R("Waiting for confirmation...")]};await r.addFeedItem(m),await new Promise(h=>setTimeout(h,200));let p=!1;if(e===void 0&&t===void 0){let h=`This will delete ${I.sessionsToDelete} session(s) and free ${v} storage. Type 'delete' to confirm or 'no' to cancel:`;p=(await Jo(r,a,h)).toLowerCase().trim()==="delete";}else if(e!==void 0){let T=`This will retain ${(await i.getAllSessions()).filter(P=>!g.includes(P.id)).length} session(s) from the last ${e} days and delete ${I.sessionsToDelete} session(s), freeing ${v} storage. Continue? (y/N)`;p=await On(r,a,T,!1);}else if(t!==void 0){let h=`This will retain the last ${t} session(s) and delete ${I.sessionsToDelete} session(s), freeing ${v} storage. Continue? (y/N)`;p=await On(r,a,h,!1);}if(!p)return await r.updateFeedItem(a,{currentMessages:[R("Cleanup cancelled")],status:b.CANCELLED}),await new Promise(h=>setTimeout(h,400)),r.outro(Oe.bold("\u274C Cleanup cancelled")),y.newline(),y.info("Cleanup operation was cancelled."),y.newline(),0;await r.updateFeedItem(a,{currentMessages:[R("Deleting sessions...")],status:b.RUNNING});let f=e==null&&t==null;await i.deleteSessions(g,f),await r.updateFeedItem(a,{currentMessages:[R(`Successfully deleted ${I.sessionsToDelete} session(s)`)],status:b.SUCCESS}),await new Promise(h=>setTimeout(h,400)),r.outro(Oe.bold("\u2728 Cleanup completed!")),y.newline(),y.success("Cleanup completed successfully!"),y.newline();let w=await o.getTestSessionCount(),E=await o.getScenarioCount(),l=await o.getStorageSize(),C=o.formatStorageSize(l);return y.info("Updated Statistics:",{bold:!0}),y.newline(),y.info(`Test Sessions: ${Oe.cyan(w.toString())}`),y.info(`Scenarios: ${Oe.cyan(E.toString())}`),y.info(`Storage Used: ${Oe.cyan(C)}`),y.newline(),0}catch(i){return r.onLog("error","Cleanup failed"),y.newline(),y.error("Failed to clean up sessions"),i instanceof Error?y.error(i.message):y.error(String(i)),y.newline(),1}finally{if(n)try{n.unmount();}catch{}}}async function $n(e,t,s,r,n){await Re(t),process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let i=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",o=new ne("normal"),c=null;if(i){let d=()=>{let[u,g]=z$1.useState(0);z$1.useEffect(()=>{o.setRenderInstance({rerender:()=>{g(v=>v+1);}});},[]);let I=o.getComponentProps();return z$1.createElement(ce,{...I,key:u})};try{c=render(z$1.createElement(d),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(u){console.warn("Ink rendering failed, continuing without interactive UI:",u instanceof Error?u.message:String(u));}}o.intro(Oe.bold("\u{1F4CA} Opening report server"));try{await L.initialize();let d=new Bt;return d.initialize(e),await d.openReport(s,r,o,n),o.outro(Oe.bold("\u2728 Report server closed")),0}catch(d){return o.onLog("error","Failed to open report"),y.newline(),y.error(`Failed to open report: ${d instanceof Error?d.message:String(d)}`),1}finally{if(c)try{c.unmount();}catch{}}}var Un=250,wt="archive-report";async function zn(e,t,s,r,n){await Re(t),await L.initialize();let i=r;if(n&&(i=await L.sessionRepository.getLastSessionId(),!i))return y.error("No test sessions found"),1;if(!i)return y.error("Either --session-id or --last is required"),1;process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let o=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",c=new ne("normal"),d=null;if(o){let u=()=>{let[g,I]=z$1.useState(0);z$1.useEffect(()=>{c.setRenderInstance({rerender:()=>I(a=>a+1)});},[]);let v=c.getComponentProps();return z$1.createElement(ce,{...v,key:g})};try{d=render(z$1.createElement(u),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(g){console.warn("Ink rendering failed, continuing without interactive UI:",g instanceof Error?g.message:String(g));}}c.intro(Oe.bold("\u{1F4E6} Archiving report"));try{let u=new Bt;if(u.initialize(e),await c.addFeedItem({id:wt,name:`Archiving reports for test session ${i}`,status:b.RUNNING,noBorder:!0}),await u.archiveReport(s,i)!==0)return await c.updateFeedItem(wt,{status:b.FAILED,currentMessages:[R("Archive failed")]}),c.outro(Oe.bold("Archive failed")),1;let I=B.join(s,`devassure-results-${i}.zip`),v=!1,a=setInterval(()=>{v||k.existsSync(I)&&(v=!0,clearInterval(a));},Un),m=3e4,p=Date.now();for(;!v&&Date.now()-p<m;)await new Promise(w=>setTimeout(w,Un));if(clearInterval(a),k.existsSync(I))await c.removeFeedItem(wt,"success"),y.newline(),y.success(`Test reports are archived in ${I}`,{icon:"\u{1F4E6}",bold:!0,textColor:"green"});else return await c.updateFeedItem(wt,{status:b.FAILED,currentMessages:[R("Archive completed but zip file was not found")]}),await new Promise(w=>setTimeout(w,200)),1;return c.outro(Oe.bold("\u2728 Archive complete")),0}catch(u){try{await c.updateFeedItem(wt,{status:b.FAILED,currentMessages:[R(u instanceof Error?u.message:String(u))]}),await new Promise(g=>setTimeout(g,400));}catch{y.error("Archive failed!");}return y.newline(),y.error(`Failed to archive report: ${u instanceof Error?u.message:String(u)}`),1}finally{if(d&&typeof d.unmount=="function")try{d.unmount();}catch{}}}async function jn(e,t){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let s=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",r=new ne("normal"),n=null;if(s){let i=()=>{let[o,c]=z$1.useState(0);z$1.useEffect(()=>{r.setRenderInstance({rerender:()=>c(u=>u+1)});},[]);let d=r.getComponentProps();return z$1.createElement(ce,{...d,key:o})};try{n=render(z$1.createElement(i),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(o){console.warn("Ink rendering failed, continuing without interactive UI:",o instanceof Error?o.message:String(o));}}e.setCallbacks(i=>{i.feedItems.forEach(o=>{r.updateFeedItem(o.id,o).catch(()=>{r.addFeedItem(o).catch(()=>{});});}),i.progress&&r.setProgress(i.progress);},i=>{r.updateFeedItem(i.id,i).catch(()=>{r.addFeedItem(i).catch(()=>{});});},i=>r.cancelAllFeedItems(i)),r.intro(Oe.bold("Setting up DevAssure agent"));try{return await ws(e,{force:t.force}),r.outro(Oe.green("Setup complete.")),0}catch(i){return y.error(i instanceof Error?i.message:String(i)),1}finally{if(n)try{n.unmount();}catch{}}}var Qt=class{constructor(t="1.0.0"){this.feedItems=new Map;this.snapshots=[];this.promptResolvers=new Map;this.version=t;}setCallbacks(t,s,r){this.onSnapshotCallback=t,this.onFeedItemCallback=s,this.onMarkActiveFeedItemsCancelledCallback=r;}async userPrompt(t,s){return new Promise((r,n)=>{let i=`prompt-${Date.now()}-${Math.random()}`,o=new AbortController;if(this.promptResolvers.set(i,{resolve:r,reject:n,abortController:o}),s){if(s.aborted){n(new Error("Prompt cancelled"));return}s.addEventListener("abort",()=>{o.abort();let c=this.promptResolvers.get(i);c&&(c.reject(new Error("Prompt cancelled")),this.promptResolvers.delete(i));});}this.emitPromptRequest(i,t);})}resolvePrompt(t,s){let r=this.promptResolvers.get(t);r&&(r.resolve(s),this.promptResolvers.delete(t));}rejectPrompt(t,s){let r=this.promptResolvers.get(t);r&&(r.reject(s),this.promptResolvers.delete(t));}emitPromptRequest(t,s){this.pendingPrompts=this.pendingPrompts||new Map,this.pendingPrompts.set(t,s);}getPendingPrompts(){return this.pendingPrompts||new Map}onSnapshot(t){this.snapshots.push(t),t.feedItems.forEach(s=>{this.feedItems.set(s.id,s);}),this.onSnapshotCallback&&this.onSnapshotCallback(t);}onFeedItem(t){this.feedItems.set(t.id,t),this.onFeedItemCallback&&this.onFeedItemCallback(t);}async openExternal(t){await sa(t);}getPaths(){return {baseDirectory:Te(),dataDirectory:ms(),secretsDirectory:Je(),binDirectory:Pe()}}getRuntime(){return {source:"cli",version:this.version}}track(t){}markActiveFeedItemsCancelled(t){return this.onMarkActiveFeedItemsCancelledCallback?.(t)}getLogLevel(){return y.isDebugEnabled()?"debug":y.getLogLevel()}getFeedItems(){return Array.from(this.feedItems.values())}getLatestSnapshot(){return this.snapshots.length>0?this.snapshots[this.snapshots.length-1]:null}};var ra="https://devassures3bucket.s3.us-east-1.amazonaws.com/agent-versions/devassure-cli-version.json",na=5e3,ia=720*60*1e3,oa="devassure-cli-version.json";function Vn(){return B.join(ft(),oa)}async function aa(){try{let e=await $.readFile(Vn(),"utf8"),t=JSON.parse(e);return typeof t.timestamp!="number"||Date.now()-t.timestamp>=ia?null:t}catch{return null}}async function ca(e){try{await $.mkdir(ft(),{recursive:!0});let t={...e,timestamp:Date.now()};await $.writeFile(Vn(),JSON.stringify(t,null,2),"utf8");}catch{}}async function Ge(e){try{let t=await aa(),s;if(t)s=t;else {let d=await fetch(ra,{signal:AbortSignal.timeout(na)});if(!d.ok)return;s=await d.json(),await ca(s);}let r=s.minimum_working_version,n=s.recommended_version;if(typeof r!="string"||typeof n!="string")return;let i=St.valid(e),o=St.valid(r),c=St.valid(n);if(!i||!o||!c)return;if(St.lt(e,r)){y.warning(`Your version of DevAssure CLI (${e}) is no longer supported. Update DevAssure CLI for accurate results: npm install -g @devassure/cli`);return}St.lt(e,n)&&y.info(`A newer version of the DevAssureCLI (${n}) is available. To update: npm install -g @devassure/cli`,{textColor:"grey",icon:N.DOT,iconColor:"grey"});}catch{}}var Q=new Command,_e=Os(),pe=new Qt(_e),Se=new Ur,te=new xr,ua=new zr,je=new Kr,es=$r();es&&te.initialize(es.apiKey,es.host,es.enabled!==false,false,pe,()=>ae.getUser());var Kn=async(e,t,s,r,n,i,o)=>hs(e,t,s,r,n??true,i,o,Se);Se.initialize(pe,Kn,te);ua.initialize(Se,Kn);je.initialize(pe);He.initialize();var Yn=false;async function me(){Yn||(await L.initialize(),Yn=true);}Q.name("devassure").description("CLI application for DevAssure").version(_e).option("--debug","Enable debug logging for all commands (dev mode only, falls back to verbose in prod)").hook("preAction",e=>{e.opts().debug&&(y.setDebugEnabled(true),y.isDebugEnabled()&&y.debug("Debug mode enabled"));});Q.command("version").description("Print the version of the app").action(()=>{console.log(_e),process.exit(0);});Q.command("help").description("Show help information").action(()=>{ts(),process.exit(0);});Q.command("login").description("Login to DevAssure").action(async()=>{await me();let e=await En(pe,Se,te);await te.shutdown(),process.exit(e);});Q.command("logout").description("Logout from DevAssure").action(async()=>{let e=await In();await te.shutdown(),process.exit(e);});Q.command("init").description("Initialize DevAssure configuration").action(async()=>{await me();let e=await bn(pe,je,te);await te.shutdown(),process.exit(e);});Q.command("new-session").description("Create a new test session").option("--path <path>","Project path (default: current directory)").action(async e=>{await me();let t=await Ls(pe,je,Se,e.path);await te.shutdown(),process.exit(t);});Q.command("new").description("Create a new test session (alias for new-session)").option("--path <path>","Project path (default: current directory)").action(async e=>{await me();let t=await Ls(pe,je,Se,e.path);await te.shutdown(),process.exit(t);});Q.command("resume").description("Resume a test session by session ID").option("--id <session-id>","Session ID to resume").option("--path <path>","Project path (default: current directory)").action(async e=>{e.id||(y.error("Session ID is required. Use --id=<session-id>"),process.exit(1)),await me();let t=await An(pe,je,Se,e.id,e.path);await te.shutdown(),process.exit(t);});Q.command("run-tests").description("Run tests (same as new but uses current directory as test cases directory)").option("--path <path>","Project path (default: current directory)").option("--tag <tags>","Comma-separated tag values").option("--tags <tags>","Comma-separated tag values (alias for --tag)").option("--priority <priorities>","Comma-separated priority values").option("--priorities <priorities>","Comma-separated priority values (alias for --priority)").option("--folder <folders>","Comma-separated folder paths").option("--folders <folders>","Comma-separated folder paths (alias for --folder)").option("--query <query>","Search query string").option("--queries <query>","Search query string (alias for --query)").option("--filter <filter>","Raw filter string (takes precedence over other filter parameters)").option("--filters <filter>","Raw filter string (alias for --filter)").option("--archive <folder>","Archive folder path").option("--environment <env>","Environment name (e.g. staging, production)").action(async e=>{await me();let t=await As(pe,je,Se,e.path,e.tag||e.tags,e.priority||e.priorities,e.folder||e.folders,e.query||e.queries,e.filter||e.filters,e.archive,e.environment);await Ge(_e),await te.shutdown(),process.exit(t);});Q.command("run").description("Run tests (alias for run-tests)").option("--path <path>","Project path (default: current directory)").option("--tag <tags>","Comma-separated tag values").option("--tags <tags>","Comma-separated tag values (alias for --tag)").option("--priority <priorities>","Comma-separated priority values").option("--priorities <priorities>","Comma-separated priority values (alias for --priority)").option("--folder <folders>","Comma-separated folder paths").option("--folders <folders>","Comma-separated folder paths (alias for --folder)").option("--query <query>","Search query string").option("--queries <query>","Search query string (alias for --query)").option("--filter <filter>","Raw filter string (takes precedence over other filter parameters)").option("--filters <filter>","Raw filter string (alias for --filter)").option("--archive <folder>","Archive folder path").option("--environment <env>","Environment name (e.g. staging, production)").action(async e=>{await me();let t=await As(pe,je,Se,e.path,e.tag||e.tags,e.priority||e.priorities,e.folder||e.folders,e.query||e.queries,e.filter||e.filters,e.archive,e.environment);await Ge(_e),await te.shutdown(),process.exit(t);});Q.command("add-token <token_value>").description("Add and validate authentication token").action(async e=>{await me();let t=await xn(pe,Se,te,e);await te.shutdown(),process.exit(t);});Q.command("stats").description("Show statistics about sessions, scenarios, and storage").action(async()=>{await me();let e=await Nn();await Ge(_e),await te.shutdown(),process.exit(e);});Q.command("summary").description("Print summary for a test session").option("--session-id <sessionId>","Session ID to summarize").option("--last","Use last session ID from database").option("--json","Output summary as JSON").action(async e=>{!e.sessionId&&!e.last&&(y.error("Either --session-id or --last is required"),process.exit(1)),await me();let t=await Mn(e.sessionId,e.last,e.json);await te.shutdown(),process.exit(t);});Q.command("cleanup").description("Clean up old sessions").option("--retain-days <days>","Retain sessions from the last N days").option("--retain-sessions <count>","Retain the last N sessions").action(async e=>{await me();let t=e.retainDays?parseInt(e.retainDays,10):void 0,s=e.retainSessions?parseInt(e.retainSessions,10):void 0,r=await kn(t,s);await Ge(_e),await te.shutdown(),process.exit(r);});Q.command("archive-report").description("Archive report results for a test session").requiredOption("--output-dir <dir>","Output directory for the report").option("--session-id <sessionId>","Session ID to archive").option("--last","Use last session ID from database").action(async e=>{!e.sessionId&&!e.last&&(y.error("Either --session-id or --last is required"),process.exit(1)),await me();let t=await zn(pe,Se,e.outputDir,e.sessionId,e.last);await Ge(_e),await te.shutdown(),process.exit(t);});Q.command("open-report").description("Open report server for a test session").option("--session-id <sessionId>","Session ID to open report for").option("--last","Open report for the last executed session").option("--archive <path>","Archive file to open").action(async e=>{e.archive&&!k.existsSync(e.archive)&&(y.error(`Archive file not found: ${e.archive}`),process.exit(1)),await me();let t=await $n(pe,Se,e.sessionId,e.last,e.archive);await Ge(_e),await te.shutdown(),process.exit(t);});Q.command("setup").description("Download/setup DevAssure agent").option("--force","Remove existing agent in bin and re-download latest").action(async e=>{let t=await jn(pe,{force:e.force});await te.shutdown(),process.exit(t);});Q.parseAsync(process.argv).then(()=>{process.argv.slice(2).length||(console.log(_e),console.log(""),ts());});
|
|
181
|
+
`}static getVerbose(t){return `[VERBOSE] ${t}`}static getIntro(t,s){if(!t)return "";let r={bold:true,textColor:"cyan",...s};return this.formatMessage(t,r)}static getOutro(t,s){if(!t)return "";let r={bold:true,textColor:"green",...s};return this.formatMessage(t,r)}static getStep(t,s){if(this.logLevel==="short")return "";let r=this.parseStepOptions(s),n=this.formatIcon(r.icon,r),i=this.formatMessage(t,r);return `${n} ${i}`}};function on(e){if(!e)return "";let{type:t,total:s,current:r,percentage:n,eta:i,unit:o}=e;switch(t){case xe.NUMBER:return `${r}/${s} ${o||""}`;case xe.PERCENTAGE:return `${n.toFixed(1)}%`;case xe.PROGRESS_BAR:{let d=Math.floor(r/s*30),u=30-d;return `[${"\u2588".repeat(d)+"\u2591".repeat(u)}] ${r}/${s} ${o||""}`}case xe.THIN_PROGRESS_BAR:{let d=Math.floor(r/s*30),u=30-d;return `[${"\u2584".repeat(d)+"\u2581".repeat(u)}] ${n.toFixed(1)}% ${o||""}`}case xe.ETA:if(i!==void 0){let a=Math.floor(i/60),d=Math.floor(i%60);return `ETA: ${a}m ${d}s`}return `${r}/${s}`;case xe.DOTTED:{let a=Math.floor(r/s*10);return `${"\u25CF".repeat(a)+"\u25CB".repeat(10-a)} ${r}/${s} ${o||""}`}default:return `${r}/${s}`}}function Cs({message:e,placeholder:t,value:s,onChange:r,onSubmit:n,validate:i,isPassword:o=false,styles:a}){let[d,u]=useState(),p=T=>{u(void 0),r(T);},I=T=>{if(i){let P=i(T);if(P){u(P);return}}u(void 0),n(T);},v="?",c="yellow",h="white",g=a?.icon||v,y=a?.iconColor||c,m=a?.textColor||h,w=a?.bold||false,C=Object.values(N).includes(g)?pe(g,b.RUNNING,0):g,f=Ce(y);return z$1.createElement(Box,{flexDirection:"column"},z$1.createElement(Box,null,z$1.createElement(Text,{bold:w,color:m},f(C)," ",e,t&&z$1.createElement(Text,{dimColor:true}," (",t,")"))),z$1.createElement(Box,{marginTop:1,flexDirection:"row",alignItems:"center"},z$1.createElement(Text,{dimColor:true},">"),z$1.createElement(Text,null," "),z$1.createElement(_o,{value:s,onChange:p,onSubmit:I,placeholder:t,mask:o?"*":void 0})),d&&z$1.createElement(Box,{marginTop:1},z$1.createElement(Text,{color:"red"},d)))}function un({message:e,initialValue:t,onSubmit:s,styles:r}){let n=()=>{s(true);},i=()=>{s(false);},a="yellow",d="white",u=r?.icon||"?",p=r?.iconColor||a,I=r?.textColor||d,v=r?.bold||false,h=Object.values(N).includes(u)?pe(u,b.RUNNING,0):u,g=Ce(p);return z$1.createElement(Box,{flexDirection:"row",alignItems:"center"},z$1.createElement(Text,{bold:v,color:I},g(h)," ",e," "),z$1.createElement(Text,{dimColor:true},">"),z$1.createElement(Text,null," "),z$1.createElement(ConfirmInput,{onConfirm:n,onCancel:i,defaultChoice:t?"confirm":"cancel"}))}function dn({message:e,options:t,initialValue:s,onSubmit:r,styles:n}){let i=t.map(f=>({label:f.label,value:String(f.value)})),o=s!==void 0?String(s):void 0,[a,d]=useState(o);useInput((f,_)=>{if(_.return&&a!==void 0){let T=t.find(P=>String(P.value)===a);T&&r(T.value);}});let u=f=>{d(f);},p="?",I="yellow",v="white",c=n?.icon||p,h=n?.iconColor||I,g=n?.textColor||v,y=n?.bold||false,w=Object.values(N).includes(c)?pe(c,b.RUNNING,0):c,l=Ce(h);return z$1.createElement(Box,{flexDirection:"column"},z$1.createElement(Box,null,z$1.createElement(Text,{bold:y,color:g},l(w)," ",e)),z$1.createElement(Box,{marginTop:1},z$1.createElement(Select,{options:i,defaultValue:o,onChange:u})))}function pn({message:e,options:t,initialValues:s=[],onSubmit:r,styles:n}){let i=t.map(l=>({label:l.label,value:String(l.value)})),o=s.map(l=>String(l)),a=l=>{let C=l.map(f=>{let _=t.find(T=>String(T.value)===f);return _?_.value:f});r(C);},d="?",u="yellow",p="white",I=n?.icon||d,v=n?.iconColor||u,c=n?.textColor||p,h=n?.bold||false,y=Object.values(N).includes(I)?pe(I,b.RUNNING,0):I,m=Ce(v);return z$1.createElement(Box,{flexDirection:"column"},z$1.createElement(Box,null,z$1.createElement(Text,{bold:h,color:c},m(y)," ",e)),z$1.createElement(Box,{marginTop:1},z$1.createElement(MultiSelect,{options:i,defaultValue:o,onSubmit:a})))}function vs({message:e,onSubmit:t,styles:s,confirmKeys:r,cancelKeys:n,escToCancel:i}){useEffect(()=>{process.stdin.isTTY&&process.stdin.isPaused()&&process.stdin.resume();},[]);let o=(w,l,C)=>w==="ctrl+c"||w==="Ctrl+C"?C.ctrl&&l==="c":w==="escape"||w==="Escape"||w==="esc"||w==="ESC"?C.escape:w==="return"||w==="Return"||w==="enter"||w==="Enter"?C.return:typeof l=="string"&&l.toLowerCase()===w.toLowerCase();try{useInput((w,l)=>{let C=i!==void 0?i:!0;if(n&&n.length>0){for(let f of n)if(o(f,w,l)){t(!1);return}if(C&&l.escape){t(!1);return}}else {if(l.ctrl&&w==="c"){t(!1);return}if(w&&w.toLowerCase()==="q"){t(!1);return}if(C&&l.escape){t(!1);return}}if(r&&r.length>0){for(let f of r)if(o(f,w,l)){t(!0);return}return}else t(!0);});}catch{useEffect(()=>{let l=setTimeout(()=>{t(true);},2e3);return ()=>{clearTimeout(l);}},[]);}let a="?",d="yellow",u="white",p=s?.icon||a,I=s?.iconColor||d,v=s?.textColor||u,c=s?.bold||false,g=Object.values(N).includes(p)?pe(p,b.RUNNING,0):p,y=Ce(I);return z$1.createElement(Box,{flexDirection:"row",alignItems:"center"},z$1.createElement(Text,{bold:c,color:v},y(g)," ",e))}var zt=5,Gt=1e3;function Po({text:e,charDelay:t,onComplete:s,onProgress:r,maxLength:n,maxDisplayLength:i,initialVisibleLength:o=0,children:a}){let d=n!=null&&e.length>n?n:e.length,[u,p]=useState(()=>Math.min(o,d)),I=useRef(s),v=useRef(r),c=useRef(false),h=useRef(e),g=useRef(n);I.current=s,v.current=r,useEffect(()=>{let w=h.current!==e,l=g.current!==n;h.current=e,g.current=n,w||l?(p(0),c.current=false):o>0&&o<=d&&u<o&&p(o);},[e,n,o,d,u]),useEffect(()=>{v.current?.(u);},[u]),useEffect(()=>{if(u>=d){!c.current&&I.current&&(c.current=true,I.current());return}c.current=false;let w=setInterval(()=>{p(l=>Math.min(l+1,d));},t);return ()=>clearInterval(w)},[u,d,t]);let y=e.slice(0,u),m;if(i==null||y.length<=i)m=y;else {let l=100*(Math.floor((u-i)/100)+1);m=e.slice(l,u);}return i!=null&&m.length>i&&(m=m.slice(-i)),m=m.replace(/\n/g," \u25C6\u25C6 "),a?z$1.createElement(z$1.Fragment,null,a(m)):z$1.createElement(Text,null,m)}var xo=z$1.memo(Po),fn=new Map;function Ts(e,t){if(!e||t.length===0)return {currentIndex:0,phase:"typing",currentVisibleLength:0,messagesLength:t.length};let s=fn.get(e);if(!s)return {currentIndex:0,phase:"typing",currentVisibleLength:0,messagesLength:t.length};let r=s.messagesLength??0;if(t.length>r)return {currentIndex:r,phase:"typing",currentVisibleLength:0,messagesLength:t.length};let i=t[s.currentIndex]?.length??0,o=Math.min(s.currentVisibleLength,i);return {currentIndex:Math.min(s.currentIndex,t.length-1),phase:s.phase,currentVisibleLength:o,messagesLength:t.length}}function No({messages:e,charDelay:t,retainDuration:s,maxStreamCharLength:r,maxDisplayLength:n,progressKey:i,render:o}){let[a,d]=useState(()=>Ts(i,e).currentIndex),[u,p]=useState(()=>Ts(i,e).phase),[I,v]=useState(()=>Ts(i,e).currentVisibleLength),c=useRef(null),h=useRef(a),g=useRef(e),y=useRef(false),m=useRef(e.length);if(h.current=a,g.current=e,useEffect(()=>{let T=m.current;m.current=e.length,e.length>T&&T>0&&(w(),y.current=false,d(T),p("typing"),v(0));},[e.length]),useEffect(()=>{!i||e.length===0||fn.set(i,{currentIndex:a,phase:u,currentVisibleLength:I,messagesLength:e.length});},[i,e.length,a,u,I]),e.length===0)return null;let w=()=>{c.current!=null&&(clearTimeout(c.current),c.current=null);},l=()=>{w();let T=h.current,P=g.current;T<P.length-1&&(c.current=setTimeout(()=>{c.current=null;let x=h.current,D=g.current;x<D.length-1&&(d(x+1),p("typing"),v(0));},s));},C=()=>{y.current=false,p("retaining"),l(),y.current=true;};if(useEffect(()=>()=>w(),[]),useEffect(()=>{if(u!=="retaining"){y.current=false;return}if(!(a>=e.length-1)&&!y.current)return y.current=true,l(),()=>w()},[u,a,e.length,s]),u==="retaining"){let T=e[a];return n!=null&&T.length>n&&(T=T.slice(-n)),T=T.replace(/\n/g," \u25C6\u25C6 "),z$1.createElement(z$1.Fragment,null,o(a,T))}let f=e[a],_=r!=null&&f.length>r?r:void 0;return z$1.createElement(xo,{key:a,text:f,charDelay:t,maxLength:_,maxDisplayLength:n,initialVisibleLength:I,onProgress:v,onComplete:C},T=>o(a,T))}function Mo(e,t){return e.length!==t.length?false:e.every((s,r)=>s===t[r])}var gn=z$1.memo(No,(e,t)=>e.progressKey===t.progressKey&&e.charDelay===t.charDelay&&e.retainDuration===t.retainDuration&&e.maxStreamCharLength===t.maxStreamCharLength&&e.maxDisplayLength===t.maxDisplayLength&&Mo(e.messages,t.messages));var bs=class{constructor(){this.ctrlCPressedOnce=false;this.currentSessionId=null;this.currentSessionService=null;this.handlerInstalled=false;this.handlingCtrlC=false;}initialize(){this.handlerInstalled||(process.on("SIGINT",this.handleSIGINT.bind(this)),this.handlerInstalled=true);}registerSession(t,s){this.currentSessionId=t,this.currentSessionService=s,this.ctrlCPressedOnce=false;}unregisterSession(){this.currentSessionId=null,this.currentSessionService=null,this.ctrlCPressedOnce=false;}handleCtrlCFromInk(){setImmediate(()=>{this.handleCtrlC();});}async handleSIGINT(){setImmediate(()=>{this.handleCtrlC();});}async handleCtrlC(){if(!this.handlingCtrlC){this.handlingCtrlC=true;try{if(!this.ctrlCPressedOnce)this.ctrlCPressedOnce=!0,S.newline(),S.warning("Press ctrl+c again to close");else {if(S.newline(),this.currentSessionId&&this.currentSessionService)try{await this.currentSessionService.sessionExecutionTermination(this.currentSessionId);}catch(t){S.error(`Failed to update session status: ${t instanceof Error?t.message:String(t)}`);}S.newline(),S.error("Cancelled by user!"),process.exit(0);}}finally{setTimeout(()=>{this.handlingCtrlC=false;},100);}}}},He=new bs;function Me(e){return e.maxCharLength!=null&&e.message.length>e.maxCharLength?e.message.slice(0,e.maxCharLength)+"...":e.message}function Rs(e){return e?.length?e.map(t=>t.message).join("\0"):""}var Uo=z$1.memo(function({feedItem:t,renderFeedItemMessage:s}){let r=Rs(t.currentMessages),n=useMemo(()=>t.currentMessages?.map(p=>p.message)??[],[r]),i=t.typewriterEffect?.charDelay??zt,o=t.typewriterEffect?.retainDuration??Gt,a=t.typewriterEffect?.maxStreamCharLength,d=t.typewriterEffect?.maxDisplayLength,u=useCallback((p,I)=>z$1.createElement(Box,{marginTop:p>0?1:0},s({...t.currentMessages[p],message:I},t.status)),[t.currentMessages,t.status,s]);return z$1.createElement(gn,{key:t.id,progressKey:t.id,messages:n,charDelay:i,retainDuration:o,maxStreamCharLength:a,maxDisplayLength:d,render:u})},(e,t)=>{if(e.feedItem.id!==t.feedItem.id||Rs(e.feedItem.currentMessages)!==Rs(t.feedItem.currentMessages))return false;let s=e.feedItem.typewriterEffect,r=t.feedItem.typewriterEffect;return !((s?.charDelay??zt)!==(r?.charDelay??zt)||(s?.retainDuration??Gt)!==(r?.retainDuration??Gt)||s?.maxStreamCharLength!==r?.maxStreamCharLength||s?.maxDisplayLength!==r?.maxDisplayLength||e.feedItem.status!==t.feedItem.status)});function ue({feedItems:e,progress:t,onInput:s,logLevel:r,summary:n}){let[i,o]=useState(0),[a,d]=useState(new Map),u=c=>{let h=c.styles,g=h?.logger,y=h?.border,m=g?.icon,w=g?.iconColor||"blue",l=g?.textColor||"white",C=g?.bold||false,f="",_=D=>D;m&&(f=Object.values(N).includes(m)?pe(m,b.RUNNING,i):m,_=Ce(w));let T={};y&&(T.borderStyle="round",y.color&&(T.borderColor=y.color));let P={};y&&(P.paddingX=1,P.paddingY=0);let x=z$1.createElement(Text,{bold:C,color:l},f?`${_(f)} `:"",c.summary);return y?z$1.createElement(Box,{flexDirection:"column",marginBottom:1,marginTop:1,...T,...P},x):z$1.createElement(Box,{flexDirection:"column",marginBottom:1,marginTop:1},x)},p=(c,h)=>{let g=N.BLINKING_CIRCLE,y=h?mt(h):"blue",m="white",w=c.styles,l=w?.icon||g,C=w?.iconColor||y,f=w?.textColor||m,_=w?.bold||false,P=l&&Object.values(N).includes(l)?pe(l,b.RUNNING,i):l,x=C,D=f,O=Ce(x),G=Me(c),U=G.split(`
|
|
182
|
+
`);return U.length<=1?z$1.createElement(Text,{bold:_,color:D},O(P)," ",G):z$1.createElement(Box,{flexDirection:"column"},U.map((Fe,J)=>z$1.createElement(Text,{key:J,bold:_,color:D},J===0?`${O(P)} ${Fe}`:Fe)))};useEffect(()=>{let c=setInterval(()=>{o(h=>(h+1)%Es.length);},100);return ()=>clearInterval(c)},[]),useInput((c,h)=>{if(h.ctrl&&c==="c"&&!e.some(g=>g.currentPrompt?.type===ie.USERKILL)){He.handleCtrlCFromInk();return}s&&h.return&&s(c);}),useEffect(()=>{},[e.length,t]);let v=e.filter(c=>!et.includes(c.status));return v.length===0&&!n?null:z$1.createElement(Box,{key:"cli-feed-root",flexDirection:"column"},n&&z$1.createElement(Box,{key:"summary"},u(n)),v?.map((c,h)=>{let{icon:g,color:y}=Ut(c.status,c.stateIndicators),m=g;if(c.status===b.RUNNING||c.status===b.WAITING||c.status===b.FAILING){let f=c.stateIndicators?.find(_=>_.status===c.status)?.indicator;m=Is(f,i);}let w=Ce(y),l=Ce("magentaBright"),C=c.noBorder?{paddingX:0,paddingY:0}:{borderStyle:"round",borderColor:c.colorTheme||y,paddingX:0,paddingY:0};return z$1.createElement(Box,{key:c.id,flexDirection:"column",marginBottom:1,marginTop:1},z$1.createElement(Box,{key:`${c.id}-border`,...C},z$1.createElement(Box,{key:`${c.id}-content`,flexDirection:"column",width:"100%"},z$1.createElement(Text,{key:`${c.id}-title`,bold:true,color:c.textColor},c.objectType?.toLowerCase()==="scenario"&&` ${l(pe(N.CIRCLE_SPINNER,c.status,i))} `,w(m)," ",c.name),!c.currentPrompt&&!!c.currentMessages?.length&&z$1.createElement(Box,{key:"current-messages",flexDirection:"column",marginLeft:2},c.typewriterEffect?.enabled===true?z$1.createElement(Uo,{key:`typewriter-${c.id}`,feedItem:c,renderFeedItemMessage:p}):c.currentMessages.map((f,_)=>z$1.createElement(Box,{key:`msg-${_}`,marginTop:1},p(f,c.status)))),c.currentPrompt&&z$1.createElement(Box,{marginTop:1},c.currentPrompt.type===ie.TEXT&&z$1.createElement(Cs,{message:c.currentPrompt.message,placeholder:c.currentPrompt.placeholder,value:a.get(c.id)||"",onChange:f=>{let _=new Map(a);_.set(c.id,f),d(_);},onSubmit:f=>{c.currentPrompt?.callbackFunction(f);},validate:c.currentPrompt.validate||(f=>{if(!f||f.trim()==="")return "This field is required"}),styles:c.currentPrompt.styles}),c.currentPrompt.type===ie.CONFIRM&&z$1.createElement(un,{message:c.currentPrompt.message,initialValue:c.currentPrompt.options?.[0]?.value??true,onSubmit:f=>{c.currentPrompt?.callbackFunction(f);},styles:c.currentPrompt.styles}),c.currentPrompt.type===ie.PASSWORD&&z$1.createElement(Cs,{message:c.currentPrompt.message,placeholder:c.currentPrompt.placeholder,value:a.get(c.id)||"",onChange:f=>{let _=new Map(a);_.set(c.id,f),d(_);},onSubmit:f=>{c.currentPrompt?.callbackFunction(f);},validate:c.currentPrompt.validate||(f=>{if(!f||f.trim()==="")return "This field is required"}),isPassword:true,styles:c.currentPrompt.styles}),c.currentPrompt.type===ie.SELECT&&z$1.createElement(dn,{message:c.currentPrompt.message,options:c.currentPrompt.options||[],initialValue:c.currentPrompt.options?.[0]?.value,onSubmit:f=>{c.currentPrompt?.callbackFunction(f);},styles:c.currentPrompt.styles}),c.currentPrompt.type===ie.MULTISELECT&&z$1.createElement(pn,{message:c.currentPrompt.message,options:c.currentPrompt.options||[],initialValues:[],onSubmit:f=>{c.currentPrompt?.callbackFunction(f);},styles:c.currentPrompt.styles}),c.currentPrompt.type===ie.KEYPRESS&&z$1.createElement(vs,{message:c.currentPrompt.message,styles:c.currentPrompt.styles,onSubmit:f=>{c.currentPrompt?.callbackFunction(f);}}),c.currentPrompt.type===ie.USERKILL&&z$1.createElement(vs,{message:`${c.currentPrompt.message}. Press ctrl+c`,styles:c.currentPrompt.styles,onSubmit:async f=>{c.currentPrompt&&"callbackFunction"in c.currentPrompt&&c.currentPrompt.callbackFunction&&await c.currentPrompt.callbackFunction(f);},confirmKeys:[],cancelKeys:["ctrl+c"],escToCancel:false})))))}),t&&z$1.createElement(Box,{key:"progress",marginTop:1},z$1.createElement(Text,null,$e.cyan("Progress:")," ",on(t))))}var oe=class{constructor(t="normal"){this.feedItems=new Map;this.processedCompletedItems=new Set;this.progress=null;this.logLevel="normal";this.renderInstance=null;this.summary=null;this.logLevel=t;}setRenderInstance(t){this.renderInstance=t;}setOnInput(t){this.onInputCallback=t;}async wait(t){return new Promise(s=>setTimeout(s,t))}async addFeedItem(t){if(et.includes(t.status)){if(this.processedCompletedItems.has(t.id))return;this.processedCompletedItems.add(t.id);}if(await this.wait(100),t.createdAt=new Date,et.includes(t.status)){let s={name:t.name,currentMessages:t.currentMessages,allMessages:t.allMessages,stateIndicators:t.stateIndicators};this.forceUpdate(),await new Promise(r=>{setTimeout(()=>{if(this.logLevel!=="short"&&t.status){let{icon:n}=Ut(t.status,s.stateIndicators);switch(S.newline(),t.status){case b.SUCCESS:S.success(s.name,t.completedLogStyle||{icon:n,iconColor:"greenBright",textColor:"white"});break;case b.FAILED:S.error(s.name,t.completedLogStyle||{icon:n,iconColor:"redBright",textColor:"white"});break;case b.SKIPPED:S.warning(s.name,t.completedLogStyle||{icon:n,iconColor:"yellowBright",textColor:"white"});break;case b.CANCELLED:S.info(s.name,t.completedLogStyle||{icon:n,iconColor:"gray",textColor:"white"});break;default:S.info(s.name,t.completedLogStyle||{icon:n,iconColor:"gray",textColor:"white"});break}this.logLevel==="verbose"&&!t.retainAllMessages&&s.allMessages?.forEach(i=>{let o=typeof i=="string"?i:Me(i);S.message(`[VERBOSE] ${o}`);}),t.retainAllMessages&&s.allMessages?.forEach(i=>{S.message(Me(i),i.styles);}),s.currentMessages?.forEach(i=>{S.message(Me(i),i.styles);});}r();},10);});return}this.feedItems.set(t.id,t),this.forceUpdate();}async removeFeedItem(t,s){if(this.logLevel=="verbose"){let r=this.feedItems.get(t);r&&(this.onLog(s,r.name,r.completedLogStyle),[...r.allMessages||[],...r.currentMessages||[]].forEach(n=>{n.message&&this.onLog("message",Me(n),n.styles);}),S.newline());}this.feedItems.delete(t),this.forceUpdate();}async updateFeedItem(t,s){let r=this.feedItems.get(t);if(!r)throw new Error(`Feed item ${t} not found`);let n=[...r.allMessages||[]];if(s.currentMessages&&r.currentMessages&&(n=[...n,...r.currentMessages]),s.allMessages&&(n=[...n,...s.allMessages]),s.status&&et.includes(s.status)){let o=s.currentMessages||r.currentMessages,a=s.completedLogStyle||r.completedLogStyle,d={name:r.name,currentMessages:o,allMessages:n,stateIndicators:r.stateIndicators};this.feedItems.delete(t),this.processedCompletedItems.add(t),this.forceUpdate(),setTimeout(()=>{if(this.logLevel!=="short"&&s.status){let{icon:u}=Ut(s.status,d.stateIndicators);switch(S.newline(),s.status){case b.SUCCESS:S.success(d.name,a||{icon:u,iconColor:"greenBright",textColor:"white"});break;case b.FAILED:S.error(d.name,a||{icon:u,iconColor:"redBright",textColor:"white"});break;case b.SKIPPED:S.warning(d.name,a||{icon:u,iconColor:"yellowBright",textColor:"white"});break;case b.CANCELLED:S.info(d.name,a||{icon:u,iconColor:"gray",textColor:"white"});break;default:S.info(d.name,a||{icon:u,iconColor:"gray",textColor:"white"});break}this.logLevel==="verbose"&&!r.retainAllMessages&&d.allMessages?.forEach(p=>{let I=typeof p=="string"?p:Me(p);S.message(`[VERBOSE] ${I}`);}),r.retainAllMessages&&d.allMessages?.forEach(p=>{S.message(Me(p),p.styles);}),d.currentMessages?.forEach(p=>{S.message(Me(p),p.styles);});}},10),await this.wait(15);return}let i={...r,...s,allMessages:n,name:r.name,updatedAt:new Date};this.feedItems.set(t,i),this.forceUpdate();}setProgress(t){this.progress=t,this.forceUpdate();}setSummary(t){this.summary=t,this.forceUpdate();}onLog(t,s,r){if(t==="verbose"){this.logLevel=="verbose"&&console.log(`[VERBOSE] ${s}`);return}setTimeout(()=>{switch(t){case "success":S.success(s,r);break;case "error":S.error(s,r);break;case "warning":S.warning(s,r);break;case "info":S.info(s,r);break;case "debug":S.debug(s,r);break;case "message":S.message(s,r);break}},10);}getActiveFeedItems(){return Array.from(this.feedItems.values()).filter(t=>!et.includes(t.status))}getAllFeedItems(){return Array.from(this.feedItems.values())}hasActivePrompt(){return this.getActiveFeedItems().some(s=>s.currentPrompt!==void 0)}forceUpdate(){this.renderInstance&&this.renderInstance.rerender&&this.renderInstance.rerender();}getComponentProps(){return {feedItems:this.getAllFeedItems(),progress:this.progress,onInput:this.onInputCallback,logLevel:this.logLevel,summary:this.summary}}async cancelAllFeedItems(t){let s=this.getActiveFeedItems().filter(r=>!t?.includes(r.id));for(let r of s)await this.updateFeedItem(r.id,{status:b.CANCELLED});}clearFeedItems(){this.feedItems.clear(),this.progress=null,this.forceUpdate();}intro(t){S.intro(t);}outro(t){S.outro(t);}};async function wn(e,t){return new Promise((s,r)=>{(async()=>{if(process.stdin.isTTY&&typeof process.stdin.setRawMode=="function"){let i={message:"Press any key to open up the browser to login or q/esc to exit:",type:ie.KEYPRESS,callbackFunction:async o=>{await e.updateFeedItem(t,{currentPrompt:void 0}),o||(S.newline(),S.info("Login cancelled.",{textColor:"yellow",iconColor:"yellow"})),s(o);},styles:{textColor:"yellow",iconColor:"white"}};await e.updateFeedItem(t,{currentPrompt:i}),await new Promise(o=>setTimeout(o,100)),await new Promise(o=>setImmediate(()=>o(void 0))),await new Promise(o=>setTimeout(o,100));}else {let i=await import('readline');S.newline(),S.info('Press Enter to open browser to login, or type "q" and Enter to exit:',{textColor:"yellow",iconColor:"white"});let o=i.createInterface({input:process.stdin,output:process.stdout});o.question("> ",a=>{o.close();let d=a.trim().toLowerCase()!=="q";d||(S.newline(),S.info("Login cancelled.",{textColor:"yellow",iconColor:"yellow"})),s(d);});}})().catch(n=>{r(n);});})}async function En(e,t,s){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let r=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",n=new oe("normal"),i=null;if(r){let o=()=>{let[a,d]=z$1.useState(0);z$1.useEffect(()=>{n.setRenderInstance({rerender:()=>{d(p=>p+1);}});},[]);let u=n.getComponentProps();return z$1.createElement(ue,{...u,key:a})};try{i=render(z$1.createElement(o),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(a){console.warn("Ink rendering failed, continuing without interactive UI:",a instanceof Error?a.message:String(a));}}n.intro(Oe.bold("\u{1F510} Logging in to DevAssure"));try{let o="feed-item1",a={id:o,name:"Checking authentication",status:b.RUNNING,currentMessages:[R("Checking existing authentication")]};if(await n.addFeedItem(a),await ee.isAuthenticated()){await n.updateFeedItem(o,{currentMessages:M(["Tokens found in keychain","Verifying authentication"])});try{let h=await ee.getAccessToken();if(h){let g=await t.ping(h);return g.authType=Qe.OAUTH,await le.setUser(g),s.setUserContext(g),await n.updateFeedItem(o,{currentMessages:[R("Authentication verified")],status:b.SUCCESS}),S.newline(),S.info(" You are already logged in! To logout run `devassure logout`.",{icon:"\u2139\uFE0F"}),0}}catch{await n.updateFeedItem(o,{currentMessages:[R("Authentication expired, proceeding with login...")]}),await ee.clearTokens(),await new Promise(g=>setTimeout(g,400));}}await n.updateFeedItem(o,{allMessages:M(["Checking for existing tokens","No tokens found","Proceeding with login"])}),await n.removeFeedItem(o,"info"),await new Promise(h=>setTimeout(h,400));let u="feed-item2",p={id:u,name:"Starting authentication",status:b.RUNNING,currentMessages:[R("Starting authentication")],allMessages:[],createdAt:new Date,updatedAt:new Date};if(await n.addFeedItem(p),await n.updateFeedItem(u,{currentMessages:[R("Waiting for user confirmation...")],allMessages:M(["Initializing OAuth flow","Preparing authorization URL"])}),await new Promise(h=>setTimeout(h,400)),!await wn(n,u))return await n.updateFeedItem(u,{currentMessages:[R("Login cancelled by user")],status:b.CANCELLED,allMessages:M(["Initializing OAuth flow","Preparing authorization URL"])}),0;await n.updateFeedItem(u,{currentMessages:[R("Opening browser for authentication...")],allMessages:M(["User confirmed"])});let v=e.userPrompt.bind(e);e.userPrompt=async h=>h.type==="confirm"&&h.message==="Open browser to login?"?{ok:!0,value:!0}:v(h);let c=t.login();await n.updateFeedItem(u,{status:b.WAITING,currentMessages:[R("Waiting for authentication in browser...")],allMessages:M(["Waiting for user authentication"])});try{await c,e.userPrompt=v,await n.updateFeedItem(u,{currentMessages:[R("Authentication successful")],status:b.SUCCESS,allMessages:M(["Authorization code received","Exchanging code for tokens"])});}catch(h){e.userPrompt=v;let g=h instanceof Error?h.message:String(h),y=g;throw g.includes("OAuth error:")&&(y=`OAuth authentication failed: ${g.replace("OAuth error: ","")}`),await n.updateFeedItem(u,{currentMessages:[R(y)],status:b.FAILED}),await new Promise(m=>setTimeout(m,400)),h}return await new Promise(h=>setTimeout(h,400)),n.outro(Oe.bold("\u2728 Successfully logged in to DevAssure!")),0}catch(o){return n.onLog("error","Failed to login"),S.newline(),o instanceof Error?S.error(o.message):S.error(String(o)),1}finally{if(i)try{i.unmount();}catch{}}}async function In(){try{return await ee.clearTokens(),await le.clearUser(),S.newline(),S.success("Successfully logged out",{textColor:"magenta",iconColor:"magenta"}),S.newline(),0}catch(e){return S.error("Failed to logout"),e instanceof Error?S.error(e.message):S.error(String(e)),1}}function yt(e,t,s,r,n,i){return new Promise((o,a)=>{(async()=>{let d={message:s,type:ie.TEXT,placeholder:r,validate:n,callbackFunction:async u=>{await e.updateFeedItem(t,{currentPrompt:void 0}),o(u);},styles:i};await e.updateFeedItem(t,{currentPrompt:d}),await new Promise(u=>setTimeout(u,100)),await new Promise(u=>setImmediate(()=>u(void 0))),await new Promise(u=>setTimeout(u,100));})().catch(a);})}function Cn(e,t,s,r=false){return new Promise((n,i)=>{(async()=>{let o={message:s,type:ie.CONFIRM,options:[{label:"Yes/No",value:r}],callbackFunction:async a=>{await e.updateFeedItem(t,{currentPrompt:void 0}),n(a);}};await e.updateFeedItem(t,{currentPrompt:o}),await new Promise(a=>setTimeout(a,100)),await new Promise(a=>setImmediate(()=>a(void 0))),await new Promise(a=>setTimeout(a,100));})().catch(i);})}function vn(e){if(!k.existsSync(e)||!k.statSync(e).isDirectory())return 0;let t=0,s=k.readdirSync(e);for(let r of s){let n=B.join(e,r),i=k.statSync(n);i.isDirectory()?t+=vn(n):i.isFile()&&t++;}return t}function Tn(e,t="",s=true){let r=[],n=s?"\u2514\u2500\u2500":"\u251C\u2500\u2500",i=e.isDirectory?Oe.cyan:Oe.white,o=e.isDirectory?`${e.name}/`:e.name;if(r.push(Oe.gray(t+n)+" "+i(o)),e.children&&e.children.length>0){let a=t+(s?" ":"\u2502 ");e.children.forEach((d,u)=>{let p=u===e.children.length-1;r.push(...Tn(d,a,p));});}return r}async function bn(e,t,s){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let r=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",n=new oe("normal"),i=null;if(r){let o=()=>{let[a,d]=z$1.useState(0);z$1.useEffect(()=>{n.setRenderInstance({rerender:()=>{d(p=>p+1);}});},[]);let u=n.getComponentProps();return z$1.createElement(ue,{...u,key:a})};try{i=render(z$1.createElement(o),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(a){console.warn("Ink rendering failed, continuing without interactive UI:",a instanceof Error?a.message:String(a));}}n.intro(Oe.bold("\u{1F680} Initializing DevAssure"));try{let o=tt(),a=k.existsSync(o)&&k.statSync(o).isDirectory();if(a){let D="feed-item-0",O={id:D,name:"Confirm override existing configuration",status:b.RUNNING,currentMessages:[R("Confirm override existing configuration")],allMessages:[]};if(await n.addFeedItem(O),await n.updateFeedItem(D,{currentMessages:[R(".devassure folder already exists")],allMessages:M(["Checking if .devassure directory exists",".devassure directory found"])}),!await Cn(n,D,"The .devassure folder already exists. Do you want to override it?",!1))return await n.updateFeedItem(D,{currentMessages:[R("Configuration override cancelled")],status:b.SKIPPED,allMessages:M(["User chose not to override"])}),await new Promise(J=>setTimeout(J,400)),S.newline(),S.info("Initialization cancelled. Existing configuration preserved.",{icon:"\u23ED"}),0;s&&s.capture("init_reset_devassure_folder");let U=B.join(o,"tests");if(k.existsSync(U)&&k.statSync(U).isDirectory()){let J=vn(U);if(J>0)if(await n.updateFeedItem(D,{currentMessages:[R(`Found ${J} file${J!==1?"s":""} in tests folder`)],allMessages:M(["Configuration override confirmed",`Found ${J} file${J!==1?"s":""} in tests folder`])}),(await yt(n,D,`The tests folder contains ${J} file${J!==1?"s":""}. Type "delete" to confirm deletion, or press "no" to cancel:`,"",Ps=>{},{bold:!0,iconColor:"red",textColor:"red"})).trim().toLowerCase()==="delete")k.rmSync(U,{recursive:!0,force:!0}),await n.updateFeedItem(D,{currentMessages:[R("Tests folder deleted")],allMessages:M(["Configuration override confirmed",`Found ${J} file${J!==1?"s":""} in tests folder`,"Tests folder deleted"])});else return await n.updateFeedItem(D,{currentMessages:[R("Tests folder deletion cancelled")],status:b.SKIPPED,allMessages:M(["Configuration override confirmed",`Found ${J} file${J!==1?"s":""} in tests folder`,"Tests folder deletion cancelled"])}),await new Promise(Ps=>setTimeout(Ps,400)),S.newline(),S.info("Initialization cancelled. Tests folder preserved.",{icon:"\u23ED"}),0}await n.updateFeedItem(D,{currentMessages:[R("Configuration override confirmed")],status:b.SUCCESS}),await new Promise(J=>setTimeout(J,400));}let d="feed-item-1",u={id:d,name:"Check and create .devassure folder",status:b.RUNNING,currentMessages:[R("Check and create .devassure folder")]};await n.addFeedItem(u),await n.updateFeedItem(d,{currentMessages:[R("Checking .devassure directory")],allMessages:M(["Checking if .devassure directory exists"])}),$t(),await n.updateFeedItem(d,{currentMessages:[R(a?"Overriding existing .devassure directory":"Created .devassure directory")],status:b.SUCCESS});let p="feed-item-2",I={id:p,name:"Get app URL",status:b.WAITING,currentMessages:[R("Get app URL")]};await n.addFeedItem(I),await n.updateFeedItem(p,{status:b.RUNNING,currentMessages:[R("Get app URL")]});let v=await yt(n,p,"Enter the URL of the web app","https://example.com",D=>{if(!D||D.trim()==="")return "URL is required";try{new URL(D);return}catch{return "Please enter a valid URL"}});s&&s.capture("init_add_url",{url:v}),await n.updateFeedItem(p,{currentMessages:[R(`App URL: ${v}`)],status:b.SUCCESS,allMessages:M([`URL: ${v}`])});let c="feed-item-3",h={id:c,name:"Get app description",status:b.WAITING,currentMessages:[R("Get app description")]};await n.addFeedItem(h),await n.updateFeedItem(c,{status:b.RUNNING});let g=await yt(n,c,"Enter the description of the web app","A modern web application",D=>{if(!D||D.trim()==="")return "Description is required"});s&&s.capture("init_add_description"),await n.updateFeedItem(c,{currentMessages:[R("App description added")],status:b.SUCCESS,allMessages:M([`Description: ${g}`])});let y="feed-item-4",m={id:y,name:"Get personas",status:b.WAITING,currentMessages:[R("Get personas")]};await n.addFeedItem(m),await n.updateFeedItem(y,{status:b.RUNNING,currentMessages:[R("Get personas")]});let w=[],l=!0,C=1;for(;l;){await n.updateFeedItem(y,{currentMessages:[R(`Get personas (Adding persona ${C})`)],allMessages:M([`Personas added: ${w.length}`])});let D=await yt(n,y,"Add personas of your application. Persona Name:","e.g. admin, normal_user, deactivated_user, expired_user",U=>{if(!U||U.trim()==="")return "Persona label is required"}),O=await yt(n,y,`Short description of persona ${C}`,"e.g. A user with full administrative privileges",U=>{if(!U||U.trim()==="")return "Persona description is required"});w.push({label:D,description:O}),await n.updateFeedItem(y,{currentMessages:[R(`Get personas (Added ${w.length} persona${w.length!==1?"s":""})`)],allMessages:M([`Personas added: ${w.length}`,`Latest: ${D}: ${O}`])}),C++,l=await Cn(n,y,"Add another persona?",!0);}s&&s.capture("init_add_persona",{count:w.length}),await n.updateFeedItem(y,{currentMessages:[R(`Personas added (${w.length} persona${w.length!==1?"s":""})`)],status:b.SUCCESS,allMessages:M([`Total personas: ${w.length}`])});let f="feed-item-5",_={id:f,name:"Write configuration files",status:b.RUNNING,currentMessages:[R("Write configuration files")]};await n.addFeedItem(_),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files"])}),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml"])}),tn({default:{url:v}}),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully"])}),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml"])}),Qr({description:g}),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully"])}),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml"])}),en(w),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml","\u2713 personas.yaml written successfully","Writing agent_instructions.yaml"])}),sn(),rn(),await n.updateFeedItem(f,{currentMessages:[R("Writing configuration files...")],allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml","\u2713 personas.yaml written successfully","Writing agent_instructions.yaml","\u2713 agent_instructions.yaml written successfully","Creating tests folder"])}),nn(),s&&s.capture("init_saved_data",{personaCount:w.length}),await n.updateFeedItem(f,{currentMessages:[R("All configuration files written successfully")],status:b.SUCCESS,allMessages:M(["Starting to write YAML configuration files","Writing test_data.yaml","\u2713 test_data.yaml written successfully","Writing app.yaml","\u2713 app.yaml written successfully","Writing personas.yaml","\u2713 personas.yaml written successfully","Writing agent_instructions.yaml","\u2713 agent_instructions.yaml written successfully","Creating tests folder","\u2713 sample-test.yaml created successfully"])});let T=tt();return S.newline(),S.success("Successfully initialized DevAssure project!",{bold:!0}),S.newline(),S.info(`Project configuration files are stored in: ${Oe.cyan(T)}`),S.newline(),Tn({name:".devassure",isDirectory:!0,children:[{name:"app.yaml"},{name:"personas.yaml"},{name:"test_data.yaml"},{name:"agent_instructions.yaml"},{name:"preferences.yaml"},{name:"tests",isDirectory:!0,children:[{name:"sample-test.yaml"}]}]}).forEach(D=>console.log(D)),S.newline(),S.info("You can add tests by creating .yaml files in the tests folder (refer sample-test.yaml)"),S.newline(),S.info("To run tests, run:"),console.log(Oe.bold(Oe.cyan(" devassure run-tests"))),S.newline(),n.outro(Oe.bold("\u2728 DevAssure initialized successfully!")),0}catch(o){return n.onLog("error","Failed to initialize configuration"),S.newline(),o instanceof Error?S.error(o.message):S.error(String(o)),1}finally{if(i)try{i.unmount();}catch{}}}function jo(e){let t=B.join(e,".devassure");if(k.existsSync(t)&&k.statSync(t).isDirectory())return {path:e,wasDerived:false};try{let n=k.readdirSync(e,{withFileTypes:!0});for(let i of n)if(i.isDirectory()){let o=B.join(e,i.name),a=B.join(o,".devassure");if(k.existsSync(a)&&k.statSync(a).isDirectory())return {path:o,wasDerived:!0}}}catch{}let r=Rn(e,new Set);return r!==null?{path:r,wasDerived:true}:{path:e,wasDerived:false}}function Rn(e,t){let s;try{s=k.realpathSync(e);}catch{return null}if(t.has(s))return null;t.add(s);let r=B.join(e,".devassure");if(k.existsSync(r)&&k.statSync(r).isDirectory())return e;try{let n=k.readdirSync(e,{withFileTypes:!0});for(let i of n)if(i.isDirectory()){let o=B.join(e,i.name),a=Rn(o,t);if(a!==null)return a}}catch{}return null}var Wo=250,Vo=7e3,Yo=".csv";function _n(e){return B.extname(e).toLowerCase()===Yo}function qo(e){if(!k.existsSync(e))throw new Error(`CSV path must exist, be a file, and have .csv extension: '${e}'`);if(!k.statSync(e).isFile())throw new Error(`CSV path must exist, be a file, and have .csv extension: '${e}'`);if(!_n(e))throw new Error(`CSV path must exist, be a file, and have .csv extension: '${e}'`)}function Ko(e,t){let s=t?.trim();if(!s)throw new Error("CSV path cannot be empty.");if(B.isAbsolute(s))return qo(s),s;let r=[B.join(e,s),B.join(e,".devassure",s),B.join(e,".devassure","tests",s),B.join(e,".devassure","test",s)];for(let i of r)if(k.existsSync(i)&&k.statSync(i).isFile()&&_n(i))return B.resolve(i);let n=r.map(i=>` ${i}`).join(`
|
|
183
|
+
`);throw new Error(`CSV file not found or invalid: '${s}' (tried:
|
|
184
|
+
${n}). Must exist, be a file, and have .csv extension.`)}async function Zo(e,t){let s=B.join(e,`devassure-results-${t}.zip`),r=Date.now();for(;Date.now()-r<Vo;){if(k.existsSync(s)){S.newline(),S.info(`Test reports are archived in ${s}`),S.newline(),S.info("To open the archived report run: `devassure open-report --archive=<zip-path>`",{textColor:"grey",iconColor:"grey"});return}await new Promise(n=>setTimeout(n,Wo));}k.existsSync(s)&&(S.newline(),S.info(`Test reports are archived in ${s}`),S.newline(),S.info("To open the archived report run: `devassure open-report --archive=<zip-path>`",{textColor:"grey",iconColor:"grey"}));}async function st(e){let{clientPort:t,sessionService:s,projectPath:r,testCasesDir:n,testCaseFile:i,csvPath:o,filter:a,archiveFolder:d,environment:u,introMessage:p,onPrepare:I,outroMessage:v}=e,c=d?B.isAbsolute(d)?d:B.join(process.cwd(),d):void 0;process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let h=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",g=new oe("normal"),y=null;if(h){let m=()=>{let[w,l]=z$1.useState(0);z$1.useEffect(()=>{g.setRenderInstance({rerender:()=>{l(f=>f+1);}});},[]);let C=g.getComponentProps();return z$1.createElement(ue,{...C,key:w})};try{y=render(z$1.createElement(m),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(w){console.warn("Ink rendering failed, continuing without interactive UI:",w instanceof Error?w.message:String(w));}}t.setCallbacks(m=>{m.feedItems.forEach(w=>{g.updateFeedItem(w.id,w).catch(()=>{g.addFeedItem(w).catch(()=>{});});}),m.progress&&g.setProgress(m.progress);},m=>{g.updateFeedItem(m.id,m).catch(w=>{g.addFeedItem(m).catch(()=>{});});},m=>g.cancelAllFeedItems(m)),g.intro(p);try{let m;if(r!==void 0&&r!=="")m=r;else {let C=process.cwd(),{path:f,wasDerived:_}=jo(C);m=f,_&&S.info(`Using project path: ${B.join(m,".devassure")}`,{icon:N.DIAMOND});}let w;o?.trim()&&(w=Ko(m,o));let l=await I(g,m);He.registerSession(l,s);try{return await s.executeSession(l,m,n,i,w,a,c,u),S.newline(),S.newline(),S.info(`To open this test session report run: \`devassure open-report --session-id=${l}\``,{textColor:"grey",iconColor:"grey"}),S.info("To open last executed session report run: `devassure open-report --last`",{textColor:"grey",iconColor:"grey"}),c&&await Zo(c,l),g.outro(v(l)),0}catch(C){S.error(`Failed to execute session: ${C instanceof Error?C.message:String(C)}`);try{await s.close();}catch(f){S.error(`Error during cleanup: ${f instanceof Error?f.message:String(f)}`);}return 1}}catch(m){g.onLog("error","Failed to execute test session"),S.newline(),S.error(`Failed to execute test session: ${m instanceof Error?m.message:String(m)}`);try{await s.close();}catch{}return 1}finally{if(He.unregisterSession(),y)try{y.unmount();}catch{}}}async function Re(e){let t=await Hr(e);t.success||(S.error(t.message,{icon:"\u274C",bold:true}),process.exit(1));}async function Ls(e,t,s,r){return await Re(s),st({clientPort:e,sessionService:t,projectPath:r,introMessage:Oe.bold("\u{1F680} Starting new test session"),onPrepare:async(n,i)=>{let o="feed-item-1",a={id:o,name:"Generate session ID",status:b.RUNNING,currentMessages:[R("Generating session ID...")]};await n.addFeedItem(a);let d=v4();await n.updateFeedItem(o,{currentMessages:[R(`Session ID: ${d}`)],status:b.SUCCESS,allMessages:M([`Generated session ID: ${d}`])}),await new Promise(I=>setTimeout(I,400));let u="feed-item-2",p={id:u,name:"Initialize session service",status:b.RUNNING,currentMessages:[R("Initializing session service...")]};return await n.addFeedItem(p),await n.updateFeedItem(u,{currentMessages:[R(`Project path: ${i}`)],status:b.SUCCESS,allMessages:M(["Initialized session service",`Project path: ${i}`])}),await new Promise(I=>setTimeout(I,400)),d},outroMessage:n=>Oe.bold(`\u2728 Test session ${n} completed!`)})}async function Fn(e,t,s,r,n){return await Re(s),r?st({clientPort:e,sessionService:t,projectPath:n,introMessage:Oe.bold(`\u{1F504} Resuming test session: ${r}`),onPrepare:async(i,o)=>{let a="feed-item-1",d={id:a,name:"Validate session ID",status:b.RUNNING,currentMessages:[R(`Validating session ID: ${r}`)]};return await i.addFeedItem(d),await i.updateFeedItem(a,{currentMessages:[R(`Session ID validated, project path: ${o}`)],status:b.SUCCESS,allMessages:M([`Session ID: ${r}`,`Project path: ${o}`])}),await new Promise(u=>setTimeout(u,400)),r},outroMessage:i=>Oe.bold(`\u2728 Test session ${i} completed!`)}):(S.error("Session ID is required"),1)}function Dn(e){let{tag:t,priority:s,folder:r,query:n,filter:i}=e;if(i?.trim())return i;let o=[];if(t&&o.push(`tag=${t}`),s&&o.push(`priority=${s}`),r&&o.push(`folder=${r}`),n&&o.push(`query=${n}`),o.length!==0)return o.join(" && ")}async function As(e,t,s,r,n,i,o,a,d,u,p,I){await Re(s);let v=Dn({tag:n,priority:i,folder:o,query:a,filter:d});return st({clientPort:e,sessionService:t,projectPath:r,testCasesDir:".",csvPath:u,filter:v,archiveFolder:p,environment:I,introMessage:Oe.bold("\u{1F680} Starting test session"),onPrepare:async(c,h)=>{let g="feed-item-1",y={id:g,name:"Generate session ID",status:b.RUNNING,currentMessages:[R("Generating session ID...")]};await c.addFeedItem(y);let m=v4();await c.updateFeedItem(g,{currentMessages:[R(`Session ID: ${m}`)],status:b.SUCCESS,allMessages:M([`Generated session ID: ${m}`])}),await new Promise(C=>setTimeout(C,400));let w="feed-item-2",l={id:w,name:"Initialize session service",status:b.RUNNING,currentMessages:[R("Initializing session service...")]};return await c.addFeedItem(l),await c.updateFeedItem(w,{currentMessages:[R(`Project path: ${h}`)],status:b.SUCCESS,allMessages:M(["Initialized session service",`Project path: ${h}`])}),await new Promise(C=>setTimeout(C,400)),m},outroMessage:c=>Oe.bold(`\u2728 DevAssure Agent session ${c} completed!`)})}async function Nn(e,t,s,r){let n=new oe("normal"),i=()=>{let[,a]=z$1.useReducer(d=>d+1,0);return z$1.useEffect(()=>{let d=n.forceUpdate.bind(n);n.forceUpdate=()=>{d(),a();};},[]),z$1.createElement(ue,n.getComponentProps())},o=render(z$1.createElement(i));n.setRenderInstance(o),n.intro(Oe.bold("\u{1F511} Adding authentication token"));try{let a="add-token-feedItem",d={id:a,name:"Validating token",status:b.RUNNING,currentMessages:[R("Validating token with server")]};await n.addFeedItem(d);try{let u=await t.jobPing(r,Qe.TOKEN);await n.updateFeedItem(a,{currentMessages:[R("Token validated, clearing existing tokens...")],allMessages:M(["Token validated successfully","Clearing existing OAuth tokens"])}),await ee.clearTokens(),await n.updateFeedItem(a,{currentMessages:[R("Saving token to keychain")]}),await ee.saveAuthToken(r);let p={...u,authType:Qe.TOKEN};return await le.setUser(p),s.setUserContext(p),await n.updateFeedItem(a,{currentMessages:[R("Token saved successfully")],status:b.SUCCESS}),await new Promise(I=>setTimeout(I,400)),n.outro(Oe.bold("\u2728 Token added successfully!")),S.newline(),S.success("Authentication token has been validated and saved."),0}catch(u){let p=u instanceof Error?u.message:String(u);return await n.updateFeedItem(a,{currentMessages:[R("Token validation failed")],status:b.FAILED,allMessages:M(["Validating token with server",`Token validation failed: ${p}`])}),await new Promise(I=>setTimeout(I,400)),n.onLog("error","Failed to add token"),S.newline(),S.error(`Token validation failed: ${p}`),S.info("Please check your token and try again."),1}}catch(a){return n.onLog("error","Failed to add token"),S.newline(),a instanceof Error?S.error(a.message):S.error(String(a)),1}}async function Mn(){try{await L.initialize();let e=new kt,t=await e.getTestSessionCount(),s=await e.getScenarioCount(),r=await e.getStorageSize(),n=e.formatStorageSize(r);S.newline(),S.info("Statistics:",{bold:!0}),S.newline(),S.info(`Test Sessions: ${Oe.cyan(t.toString())}`),S.info(`Scenarios: ${Oe.cyan(s.toString())}`),S.info(`Storage Used: ${Oe.cyan(n)}`),S.newline();let i=1024*1024*1024;return r>i&&(S.warning(`You can run ${Oe.bold("devassure cleanup")} to remove execution history and free up space.`),S.newline()),0}catch(e){return S.newline(),S.error("Failed to retrieve statistics"),e instanceof Error?S.error(e.message):S.error(String(e)),S.newline(),1}}function ea(e){S.info("Summary:",{bold:true}),S.info(`sessionId: ${e.sessionId}`,{icon:" "}),e.title!=null&&e.title!==""&&S.info(`title: ${e.title}`,{icon:" "}),e.environment!=null&&e.environment!==""&&S.info(`environment: ${e.environment}`,{icon:" "}),S.info(`scenarios: ${e.scenarios}`,{icon:" "}),S.info(`score: ${e.score??"N/A"}`,{icon:" "}),S.info(`passedValidations: ${e.passedValidations}`,{icon:" "}),S.info(`failedValidations: ${e.failedValidations}`,{icon:" "}),S.info(`failureGroups: ${e.failureGroups}`,{icon:" "}),S.info(`durationMs: ${e.durationMs??"N/A"}`,{icon:" "}),S.info(`durationString: ${e.durationString}`,{icon:" "});}async function On(e,t,s){await L.initialize();let r=e;if(t&&(r=await L.sessionRepository.getLastSessionId(),!r))return S.error("No test sessions found"),1;if(!r)return S.error("Either --session-id or --last is required"),1;try{let i=await new Jr().getSessionSummary(r);return s?console.log(JSON.stringify(i,null,2)):ea(i),0}catch(n){let i=n instanceof Error?n.message:String(n);return i==="Session not found"?S.error("Session not found"):S.error(`Failed to get summary: ${i}`),1}}function sa(e,t,s,r){return new Promise((n,i)=>{(async()=>{let o={message:s,type:ie.TEXT,placeholder:r,callbackFunction:async a=>{await e.updateFeedItem(t,{currentPrompt:void 0}),n(a);},styles:{textColor:"red",bold:true},validate:a=>{}};await e.updateFeedItem(t,{currentPrompt:o}),await new Promise(a=>setTimeout(a,100)),await new Promise(a=>setImmediate(()=>a(void 0))),await new Promise(a=>setTimeout(a,100));})().catch(i);})}function kn(e,t,s,r=false){return new Promise((n,i)=>{(async()=>{let o={message:s,type:ie.CONFIRM,options:[{label:"Yes/No",value:r}],callbackFunction:async a=>{await e.updateFeedItem(t,{currentPrompt:void 0}),n(a);},styles:{textColor:"red",bold:true}};await e.updateFeedItem(t,{currentPrompt:o}),await new Promise(a=>setTimeout(a,100)),await new Promise(a=>setImmediate(()=>a(void 0))),await new Promise(a=>setTimeout(a,100));})().catch(i);})}async function Bn(e,t){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let s=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",r=new oe("normal"),n=null;if(s){let i=()=>{let[o,a]=z$1.useState(0);z$1.useEffect(()=>{r.setRenderInstance({rerender:()=>{a(u=>u+1);}});},[]);let d=r.getComponentProps();return z$1.createElement(ue,{...d,key:o})};try{n=render(z$1.createElement(i),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(o){console.warn("Ink rendering failed, continuing without interactive UI:",o instanceof Error?o.message:String(o));}}try{await L.initialize();let i=new Zr,o=new kt;r.intro(Oe.bold("\u{1F9F9} Cleaning up sessions"));let a="cleanup-feedItem-1",d={id:a,name:"Finding sessions to delete",status:b.RUNNING,currentMessages:[R("Finding sessions...")]};await r.addFeedItem(d);let u=await i.getSessionsToDelete(e,t);if(u.length===0)return await r.updateFeedItem(a,{currentMessages:[R("No sessions to delete")],status:b.SUCCESS}),await new Promise(f=>setTimeout(f,400)),r.outro(Oe.bold("\u2728 No cleanup needed!")),S.newline(),S.success("No sessions need to be cleaned up."),S.newline(),0;let p=u.map(f=>f.id),I=await i.getCleanupStats(p),v=o.formatStorageSize(I.storageToFree);await r.updateFeedItem(a,{currentMessages:[R(`Found ${u.length} session(s) to delete`)],status:b.SUCCESS}),await new Promise(f=>setTimeout(f,400));let c="cleanup-feedItem-2",h={id:c,name:"Confirm deletion",status:b.RUNNING,currentMessages:[R("Waiting for confirmation...")]};await r.addFeedItem(h),await new Promise(f=>setTimeout(f,200));let g=!1;if(e===void 0&&t===void 0){let f=`This will delete ${I.sessionsToDelete} session(s) and free ${v} storage. Type 'delete' to confirm or 'no' to cancel:`;g=(await sa(r,c,f)).toLowerCase().trim()==="delete";}else if(e!==void 0){let T=`This will retain ${(await i.getAllSessions()).filter(P=>!p.includes(P.id)).length} session(s) from the last ${e} days and delete ${I.sessionsToDelete} session(s), freeing ${v} storage. Continue? (y/N)`;g=await kn(r,c,T,!1);}else if(t!==void 0){let f=`This will retain the last ${t} session(s) and delete ${I.sessionsToDelete} session(s), freeing ${v} storage. Continue? (y/N)`;g=await kn(r,c,f,!1);}if(!g)return await r.updateFeedItem(c,{currentMessages:[R("Cleanup cancelled")],status:b.CANCELLED}),await new Promise(f=>setTimeout(f,400)),r.outro(Oe.bold("\u274C Cleanup cancelled")),S.newline(),S.info("Cleanup operation was cancelled."),S.newline(),0;await r.updateFeedItem(c,{currentMessages:[R("Deleting sessions...")],status:b.RUNNING});let y=e==null&&t==null;await i.deleteSessions(p,y),await r.updateFeedItem(c,{currentMessages:[R(`Successfully deleted ${I.sessionsToDelete} session(s)`)],status:b.SUCCESS}),await new Promise(f=>setTimeout(f,400)),r.outro(Oe.bold("\u2728 Cleanup completed!")),S.newline(),S.success("Cleanup completed successfully!"),S.newline();let m=await o.getTestSessionCount(),w=await o.getScenarioCount(),l=await o.getStorageSize(),C=o.formatStorageSize(l);return S.info("Updated Statistics:",{bold:!0}),S.newline(),S.info(`Test Sessions: ${Oe.cyan(m.toString())}`),S.info(`Scenarios: ${Oe.cyan(w.toString())}`),S.info(`Storage Used: ${Oe.cyan(C)}`),S.newline(),0}catch(i){return r.onLog("error","Cleanup failed"),S.newline(),S.error("Failed to clean up sessions"),i instanceof Error?S.error(i.message):S.error(String(i)),S.newline(),1}finally{if(n)try{n.unmount();}catch{}}}async function Un(e,t,s,r,n){await Re(t),process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let i=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",o=new oe("normal"),a=null;if(i){let d=()=>{let[u,p]=z$1.useState(0);z$1.useEffect(()=>{o.setRenderInstance({rerender:()=>{p(v=>v+1);}});},[]);let I=o.getComponentProps();return z$1.createElement(ue,{...I,key:u})};try{a=render(z$1.createElement(d),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(u){console.warn("Ink rendering failed, continuing without interactive UI:",u instanceof Error?u.message:String(u));}}o.intro(Oe.bold("\u{1F4CA} Opening report server"));try{await L.initialize();let d=new Bt;return d.initialize(e),await d.openReport(s,r,o,n),o.outro(Oe.bold("\u2728 Report server closed")),0}catch(d){return o.onLog("error","Failed to open report"),S.newline(),S.error(`Failed to open report: ${d instanceof Error?d.message:String(d)}`),1}finally{if(a)try{a.unmount();}catch{}}}var Hn=250,wt="archive-report";async function Gn(e,t,s,r,n){await Re(t),await L.initialize();let i=r;if(n&&(i=await L.sessionRepository.getLastSessionId(),!i))return S.error("No test sessions found"),1;if(!i)return S.error("Either --session-id or --last is required"),1;process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let o=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",a=new oe("normal"),d=null;if(o){let u=()=>{let[p,I]=z$1.useState(0);z$1.useEffect(()=>{a.setRenderInstance({rerender:()=>I(c=>c+1)});},[]);let v=a.getComponentProps();return z$1.createElement(ue,{...v,key:p})};try{d=render(z$1.createElement(u),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(p){console.warn("Ink rendering failed, continuing without interactive UI:",p instanceof Error?p.message:String(p));}}a.intro(Oe.bold("\u{1F4E6} Archiving report"));try{let u=new Bt;if(u.initialize(e),await a.addFeedItem({id:wt,name:`Archiving reports for test session ${i}`,status:b.RUNNING,noBorder:!0}),await u.archiveReport(s,i)!==0)return await a.updateFeedItem(wt,{status:b.FAILED,currentMessages:[R("Archive failed")]}),a.outro(Oe.bold("Archive failed")),1;let I=B.join(s,`devassure-results-${i}.zip`),v=!1,c=setInterval(()=>{v||k.existsSync(I)&&(v=!0,clearInterval(c));},Hn),h=3e4,g=Date.now();for(;!v&&Date.now()-g<h;)await new Promise(m=>setTimeout(m,Hn));if(clearInterval(c),k.existsSync(I))await a.removeFeedItem(wt,"success"),S.newline(),S.success(`Test reports are archived in ${I}`,{icon:"\u{1F4E6}",bold:!0,textColor:"green"});else return await a.updateFeedItem(wt,{status:b.FAILED,currentMessages:[R("Archive completed but zip file was not found")]}),await new Promise(m=>setTimeout(m,200)),1;return a.outro(Oe.bold("\u2728 Archive complete")),0}catch(u){try{await a.updateFeedItem(wt,{status:b.FAILED,currentMessages:[R(u instanceof Error?u.message:String(u))]}),await new Promise(p=>setTimeout(p,400));}catch{S.error("Archive failed!");}return S.newline(),S.error(`Failed to archive report: ${u instanceof Error?u.message:String(u)}`),1}finally{if(d&&typeof d.unmount=="function")try{d.unmount();}catch{}}}async function Wn(e,t){process.stdin.isTTY&&(process.stdin.setEncoding("utf8"),process.stdin.resume());let s=process.stdin.isTTY&&typeof process.stdin.setRawMode=="function",r=new oe("normal"),n=null;if(s){let i=()=>{let[o,a]=z$1.useState(0);z$1.useEffect(()=>{r.setRenderInstance({rerender:()=>a(u=>u+1)});},[]);let d=r.getComponentProps();return z$1.createElement(ue,{...d,key:o})};try{n=render(z$1.createElement(i),{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exitOnCtrlC:!1,patchConsole:!0});}catch(o){console.warn("Ink rendering failed, continuing without interactive UI:",o instanceof Error?o.message:String(o));}}e.setCallbacks(i=>{i.feedItems.forEach(o=>{r.updateFeedItem(o.id,o).catch(()=>{r.addFeedItem(o).catch(()=>{});});}),i.progress&&r.setProgress(i.progress);},i=>{r.updateFeedItem(i.id,i).catch(()=>{r.addFeedItem(i).catch(()=>{});});},i=>r.cancelAllFeedItems(i)),r.intro(Oe.bold("Setting up DevAssure agent"));try{return await ws(e,{force:t.force}),r.outro(Oe.green("Setup complete.")),0}catch(i){return S.error(i instanceof Error?i.message:String(i)),1}finally{if(n)try{n.unmount();}catch{}}}var Qt=class{constructor(t="1.0.0"){this.feedItems=new Map;this.snapshots=[];this.promptResolvers=new Map;this.version=t;}setCallbacks(t,s,r){this.onSnapshotCallback=t,this.onFeedItemCallback=s,this.onMarkActiveFeedItemsCancelledCallback=r;}async userPrompt(t,s){return new Promise((r,n)=>{let i=`prompt-${Date.now()}-${Math.random()}`,o=new AbortController;if(this.promptResolvers.set(i,{resolve:r,reject:n,abortController:o}),s){if(s.aborted){n(new Error("Prompt cancelled"));return}s.addEventListener("abort",()=>{o.abort();let a=this.promptResolvers.get(i);a&&(a.reject(new Error("Prompt cancelled")),this.promptResolvers.delete(i));});}this.emitPromptRequest(i,t);})}resolvePrompt(t,s){let r=this.promptResolvers.get(t);r&&(r.resolve(s),this.promptResolvers.delete(t));}rejectPrompt(t,s){let r=this.promptResolvers.get(t);r&&(r.reject(s),this.promptResolvers.delete(t));}emitPromptRequest(t,s){this.pendingPrompts=this.pendingPrompts||new Map,this.pendingPrompts.set(t,s);}getPendingPrompts(){return this.pendingPrompts||new Map}onSnapshot(t){this.snapshots.push(t),t.feedItems.forEach(s=>{this.feedItems.set(s.id,s);}),this.onSnapshotCallback&&this.onSnapshotCallback(t);}onFeedItem(t){this.feedItems.set(t.id,t),this.onFeedItemCallback&&this.onFeedItemCallback(t);}async openExternal(t){await oa(t);}getPaths(){return {baseDirectory:Te(),dataDirectory:ms(),secretsDirectory:Je(),binDirectory:Pe()}}getRuntime(){return {source:"cli",version:this.version}}track(t){}markActiveFeedItemsCancelled(t){return this.onMarkActiveFeedItemsCancelledCallback?.(t)}getLogLevel(){return S.isDebugEnabled()?"debug":S.getLogLevel()}getFeedItems(){return Array.from(this.feedItems.values())}getLatestSnapshot(){return this.snapshots.length>0?this.snapshots[this.snapshots.length-1]:null}};var aa="https://devassures3bucket.s3.us-east-1.amazonaws.com/agent-versions/devassure-cli-version.json",ca=5e3,la=720*60*1e3,ua="devassure-cli-version.json";function Yn(){return B.join(ft(),ua)}async function da(){try{let e=await $.readFile(Yn(),"utf8"),t=JSON.parse(e);return typeof t.timestamp!="number"||Date.now()-t.timestamp>=la?null:t}catch{return null}}async function pa(e){try{await $.mkdir(ft(),{recursive:!0});let t={...e,timestamp:Date.now()};await $.writeFile(Yn(),JSON.stringify(t,null,2),"utf8");}catch{}}async function Ge(e){try{let t=await da(),s;if(t)s=t;else {let d=await fetch(aa,{signal:AbortSignal.timeout(ca)});if(!d.ok)return;s=await d.json(),await pa(s);}let r=s.minimum_working_version,n=s.recommended_version;if(typeof r!="string"||typeof n!="string")return;let i=St.valid(e),o=St.valid(r),a=St.valid(n);if(!i||!o||!a)return;if(St.lt(e,r)){S.warning(`Your version of DevAssure CLI (${e}) is no longer supported. Update DevAssure CLI for accurate results: npm install -g @devassure/cli`);return}St.lt(e,n)&&S.info(`A newer version of the DevAssureCLI (${n}) is available. To update: npm install -g @devassure/cli`,{textColor:"grey",icon:N.DOT,iconColor:"grey"});}catch{}}var Q=new Command,_e=Os(),fe=new Qt(_e),Ee=new Ur,se=new xr,ga=new zr,je=new Kr,es=$r();es&&se.initialize(es.apiKey,es.host,es.enabled!==false,false,fe,()=>le.getUser());var Zn=async(e,t,s,r,n,i,o)=>hs(e,t,s,r,n??true,i,o,Ee);Ee.initialize(fe,Zn,se);ga.initialize(Ee,Zn);je.initialize(fe);He.initialize();var qn=false;async function he(){qn||(await L.initialize(),qn=true);}Q.name("devassure").description("CLI application for DevAssure").version(_e).option("--debug","Enable debug logging for all commands (dev mode only, falls back to verbose in prod)").hook("preAction",e=>{e.opts().debug&&(S.setDebugEnabled(true),S.isDebugEnabled()&&S.debug("Debug mode enabled"));});Q.command("version").description("Print the version of the app").action(()=>{console.log(_e),process.exit(0);});Q.command("help").description("Show help information").action(()=>{ts(),process.exit(0);});Q.command("login").description("Login to DevAssure").action(async()=>{await he();let e=await En(fe,Ee,se);await se.shutdown(),process.exit(e);});Q.command("logout").description("Logout from DevAssure").action(async()=>{let e=await In();await se.shutdown(),process.exit(e);});Q.command("init").description("Initialize DevAssure configuration").action(async()=>{await he();let e=await bn(fe,je,se);await se.shutdown(),process.exit(e);});Q.command("new-session").description("Create a new test session").option("--path <path>","Project path (default: current directory)").action(async e=>{await he();let t=await Ls(fe,je,Ee,e.path);await se.shutdown(),process.exit(t);});Q.command("new").description("Create a new test session (alias for new-session)").option("--path <path>","Project path (default: current directory)").action(async e=>{await he();let t=await Ls(fe,je,Ee,e.path);await se.shutdown(),process.exit(t);});Q.command("resume").description("Resume a test session by session ID").option("--id <session-id>","Session ID to resume").option("--path <path>","Project path (default: current directory)").action(async e=>{e.id||(S.error("Session ID is required. Use --id=<session-id>"),process.exit(1)),await he();let t=await Fn(fe,je,Ee,e.id,e.path);await se.shutdown(),process.exit(t);});Q.command("run-tests").description("Run tests (same as new but uses current directory as test cases directory)").option("--path <path>","Project path (default: current directory)").option("--tag <tags>","Comma-separated tag values").option("--tags <tags>","Comma-separated tag values (alias for --tag)").option("--priority <priorities>","Comma-separated priority values").option("--priorities <priorities>","Comma-separated priority values (alias for --priority)").option("--folder <folders>","Comma-separated folder paths").option("--folders <folders>","Comma-separated folder paths (alias for --folder)").option("--query <query>","Search query string").option("--queries <query>","Search query string (alias for --query)").option("--filter <filter>","Raw filter string (takes precedence over other filter parameters)").option("--filters <filter>","Raw filter string (alias for --filter)").option("--csv <path>","Path to CSV file with test cases (relative or absolute)").option("--archive <folder>","Archive folder path").option("--environment <env>","Environment name (e.g. staging, production)").action(async e=>{await he();let t=await As(fe,je,Ee,e.path,e.tag||e.tags,e.priority||e.priorities,e.folder||e.folders,e.query||e.queries,e.filter||e.filters,e.csv,e.archive,e.environment);await Ge(_e),await se.shutdown(),process.exit(t);});Q.command("run").description("Run tests (alias for run-tests)").option("--path <path>","Project path (default: current directory)").option("--tag <tags>","Comma-separated tag values").option("--tags <tags>","Comma-separated tag values (alias for --tag)").option("--priority <priorities>","Comma-separated priority values").option("--priorities <priorities>","Comma-separated priority values (alias for --priority)").option("--folder <folders>","Comma-separated folder paths").option("--folders <folders>","Comma-separated folder paths (alias for --folder)").option("--query <query>","Search query string").option("--queries <query>","Search query string (alias for --query)").option("--filter <filter>","Raw filter string (takes precedence over other filter parameters)").option("--filters <filter>","Raw filter string (alias for --filter)").option("--csv <path>","Path to CSV file with test cases (relative or absolute)").option("--archive <folder>","Archive folder path").option("--environment <env>","Environment name (e.g. staging, production)").action(async e=>{await he();let t=await As(fe,je,Ee,e.path,e.tag||e.tags,e.priority||e.priorities,e.folder||e.folders,e.query||e.queries,e.filter||e.filters,e.csv,e.archive,e.environment);await Ge(_e),await se.shutdown(),process.exit(t);});Q.command("add-token <token_value>").description("Add and validate authentication token").action(async e=>{await he();let t=await Nn(fe,Ee,se,e);await se.shutdown(),process.exit(t);});Q.command("stats").description("Show statistics about sessions, scenarios, and storage").action(async()=>{await he();let e=await Mn();await Ge(_e),await se.shutdown(),process.exit(e);});Q.command("summary").description("Print summary for a test session").option("--session-id <sessionId>","Session ID to summarize").option("--last","Use last session ID from database").option("--json","Output summary as JSON").action(async e=>{!e.sessionId&&!e.last&&(S.error("Either --session-id or --last is required"),process.exit(1)),await he();let t=await On(e.sessionId,e.last,e.json);await se.shutdown(),process.exit(t);});Q.command("cleanup").description("Clean up old sessions").option("--retain-days <days>","Retain sessions from the last N days").option("--retain-sessions <count>","Retain the last N sessions").action(async e=>{await he();let t=e.retainDays?parseInt(e.retainDays,10):void 0,s=e.retainSessions?parseInt(e.retainSessions,10):void 0,r=await Bn(t,s);await Ge(_e),await se.shutdown(),process.exit(r);});Q.command("archive-report").description("Archive report results for a test session").requiredOption("--output-dir <dir>","Output directory for the report").option("--session-id <sessionId>","Session ID to archive").option("--last","Use last session ID from database").action(async e=>{!e.sessionId&&!e.last&&(S.error("Either --session-id or --last is required"),process.exit(1)),await he();let t=await Gn(fe,Ee,e.outputDir,e.sessionId,e.last);await Ge(_e),await se.shutdown(),process.exit(t);});Q.command("open-report").description("Open report server for a test session").option("--session-id <sessionId>","Session ID to open report for").option("--last","Open report for the last executed session").option("--archive <path>","Archive file to open").action(async e=>{e.archive&&!k.existsSync(e.archive)&&(S.error(`Archive file not found: ${e.archive}`),process.exit(1)),await he();let t=await Un(fe,Ee,e.sessionId,e.last,e.archive);await Ge(_e),await se.shutdown(),process.exit(t);});Q.command("setup").description("Download/setup DevAssure agent").option("--force","Remove existing agent in bin and re-download latest").action(async e=>{let t=await Wn(fe,{force:e.force});await se.shutdown(),process.exit(t);});Q.parseAsync(process.argv).then(()=>{process.argv.slice(2).length||(console.log(_e),console.log(""),ts());});
|