shiplightai 0.1.7 → 0.1.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/dist/cjs/index.cjs +1 -1
- package/dist/cli.js +8 -8
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -14,7 +14,7 @@ await page.waitForTimeout(2000);
|
|
|
14
14
|
`);for(let n of r)e+=` // ${n}
|
|
15
15
|
`;return e}generatePostlude(){return""}}});function rt(e){if(!e)return"desktop";for(let t of Ki)if(t.test(e))return"mobile";return"desktop"}var Ki,nt=m(()=>{"use strict";Ki=[/iphone/i,/ipad/i,/android/i,/pixel/i,/galaxy/i,/mobile/i,/nexus/i,/blackberry/i,/kindle/i]});function ot(e,t){if(!e||typeof e!="string")return e;let i=t instanceof Map?Object.fromEntries(t):t,r=o=>{let a=o.startsWith("$")?o.slice(1):o,s=i[a]??i[`$${a}`];return s!=null?String(s):void 0},n=e;return n=n.replace(/\{\{\s*\$?([^}]+?)\s*\}\}/g,(o,a)=>{let s=r(a.trim());return s!==void 0?s:o}),n=n.replace(/<secret>\$?([\w-]+)<\/secret>/g,(o,a)=>{let s=r(a);return s!==void 0?s:o}),n=n.replace(/\$\{([^}]+)\}/g,(o,a)=>{let s=r(a.trim());return s!==void 0?s:o}),n=n.replace(/\$([a-zA-Z_]\w*)/g,(o,a)=>{let s=r(a);return s!==void 0?s:o}),n}var at=m(()=>{"use strict"});function st(e){return e?e.startsWith(b)?"android":e.startsWith(M)?"ios":"web":"web"}function ct(e){return e?e.startsWith(b)||e.startsWith(M):!1}function lt(e){return!!e&&e.startsWith(b)}function ut(e){return!!e&&e.startsWith(M)}function ht(e){return e.startsWith(b)?e.slice(b.length):e.startsWith(M)?e.slice(M.length):e}function pt(e){return`${b}${e}`}function dt(e){return`${M}${e}`}function ae(e){return e?e.startsWith("http://")||e.startsWith("https://"):!1}function ft(e){return e?!ae(e):!1}function Te(e){return e?ae(e)?["web"]:["android","ios"]:["web","android","ios"]}function gt(e,t){if(!t)return!0;let i=Te(t);return e==="desktop"||e==="mobile"?i.includes("web"):i.includes(e)}var b,M,se=m(()=>{"use strict";b="android:",M="ios:"});function mt(e){return e.startsWith(M)?e:`${M}${e}`}function wt(e){let t=e.iosVersion?` (iOS ${e.iosVersion})`:"";return e.deviceType==="simulator"?`${e.name}${t} - Simulator`:`${e.name}${t}`}function St(e){return!!(/^[0-9a-fA-F]{40}$/.test(e)||/^[0-9a-fA-F]{8}-[0-9a-fA-F]{16}$/.test(e))}var _t=m(()=>{"use strict";se()});var be,ce,Me,ke,Pe,Ae,ve,xe,Ee,Oe,F,Le,q,Ie,De,J,yt,Z,Tt,bt,le,Mt,kt,Pt,At,vt=m(()=>{"use strict";be="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",ce=112,Me=1920,ke=1080,Pe=1920,Ae=1080-ce,ve=1280,xe=720,Ee=500,Oe=500,F="Desktop Chrome",Le=(e=>(e.Chromium="chromium",e.Firefox="firefox",e.Webkit="webkit",e))(Le||{}),q={"Blackberry PlayBook":{name:"Blackberry PlayBook",userAgent:"Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/26.0 Safari/536.2+",screen:{width:600,height:1024},viewport:{width:600,height:1024},deviceScaleFactor:1,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"BlackBerry Z30":{name:"BlackBerry Z30",userAgent:"Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/26.0 Mobile Safari/537.10+",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"Galaxy Note 3":{name:"Galaxy Note 3",userAgent:"Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/26.0 Mobile Safari/534.30",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"Galaxy Note II":{name:"Galaxy Note II",userAgent:"Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/26.0 Mobile Safari/534.30",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"Galaxy S III":{name:"Galaxy S III",userAgent:"Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/26.0 Mobile Safari/534.30",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"Galaxy S5":{name:"Galaxy S5",userAgent:"Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Galaxy S8":{name:"Galaxy S8",userAgent:"Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:360,height:740},viewport:{width:360,height:740},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Galaxy S9+":{name:"Galaxy S9+",userAgent:"Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:320,height:658},viewport:{width:320,height:658},deviceScaleFactor:4.5,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Galaxy S24":{name:"Galaxy S24",userAgent:"Mozilla/5.0 (Linux; Android 14; SM-S921U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:360,height:780},viewport:{width:360,height:780},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Galaxy A55":{name:"Galaxy A55",userAgent:"Mozilla/5.0 (Linux; Android 14; SM-A556B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:480,height:1040},viewport:{width:480,height:1040},deviceScaleFactor:2.25,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Galaxy Tab S4":{name:"Galaxy Tab S4",userAgent:"Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:712,height:1138},viewport:{width:712,height:1138},deviceScaleFactor:2.25,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Galaxy Tab S9":{name:"Galaxy Tab S9",userAgent:"Mozilla/5.0 (Linux; Android 14; SM-X710) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:640,height:1024},viewport:{width:640,height:1024},deviceScaleFactor:2.5,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"iPad (gen 5)":{name:"iPad (gen 5)",userAgent:"Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:768,height:1024},viewport:{width:768,height:1024},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPad (gen 6)":{name:"iPad (gen 6)",userAgent:"Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:768,height:1024},viewport:{width:768,height:1024},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPad (gen 7)":{name:"iPad (gen 7)",userAgent:"Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:810,height:1080},viewport:{width:810,height:1080},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPad (gen 11)":{name:"iPad (gen 11)",userAgent:"Mozilla/5.0 (iPad; CPU OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/19E241 Safari/604.1",screen:{width:656,height:944},viewport:{width:656,height:944},deviceScaleFactor:2.5,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPad Mini":{name:"iPad Mini",userAgent:"Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:768,height:1024},viewport:{width:768,height:1024},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPad Pro 11":{name:"iPad Pro 11",userAgent:"Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:834,height:1194},viewport:{width:834,height:1194},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 6":{name:"iPhone 6",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/26.0 Mobile/15A372 Safari/604.1",screen:{width:375,height:667},viewport:{width:375,height:667},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 6 Plus":{name:"iPhone 6 Plus",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/26.0 Mobile/15A372 Safari/604.1",screen:{width:414,height:736},viewport:{width:414,height:736},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 7":{name:"iPhone 7",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/26.0 Mobile/15A372 Safari/604.1",screen:{width:375,height:667},viewport:{width:375,height:667},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 7 Plus":{name:"iPhone 7 Plus",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/26.0 Mobile/15A372 Safari/604.1",screen:{width:414,height:736},viewport:{width:414,height:736},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 8":{name:"iPhone 8",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/26.0 Mobile/15A372 Safari/604.1",screen:{width:375,height:667},viewport:{width:375,height:667},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 8 Plus":{name:"iPhone 8 Plus",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/26.0 Mobile/15A372 Safari/604.1",screen:{width:414,height:736},viewport:{width:414,height:736},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone SE":{name:"iPhone SE",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/26.0 Mobile/14E304 Safari/602.1",screen:{width:320,height:568},viewport:{width:320,height:568},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone SE (3rd gen)":{name:"iPhone SE (3rd gen)",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/26.0 Mobile/19E241 Safari/602.1",screen:{width:375,height:667},viewport:{width:375,height:667},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone X":{name:"iPhone X",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/26.0 Mobile/15A372 Safari/604.1",screen:{width:375,height:812},viewport:{width:375,height:812},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone XR":{name:"iPhone XR",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:414,height:896},viewport:{width:414,height:896},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 11":{name:"iPhone 11",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:414,height:896},viewport:{width:414,height:715},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 11 Pro":{name:"iPhone 11 Pro",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:375,height:812},viewport:{width:375,height:635},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 11 Pro Max":{name:"iPhone 11 Pro Max",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:414,height:896},viewport:{width:414,height:715},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 12":{name:"iPhone 12",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:390,height:844},viewport:{width:390,height:664},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 12 Pro":{name:"iPhone 12 Pro",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:390,height:844},viewport:{width:390,height:664},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 12 Pro Max":{name:"iPhone 12 Pro Max",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:428,height:926},viewport:{width:428,height:746},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 12 Mini":{name:"iPhone 12 Mini",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:375,height:812},viewport:{width:375,height:629},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 13":{name:"iPhone 13",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:390,height:844},viewport:{width:390,height:664},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 13 Pro":{name:"iPhone 13 Pro",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:390,height:844},viewport:{width:390,height:664},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 13 Pro Max":{name:"iPhone 13 Pro Max",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:428,height:926},viewport:{width:428,height:746},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 13 Mini":{name:"iPhone 13 Mini",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:375,height:812},viewport:{width:375,height:629},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 14":{name:"iPhone 14",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:390,height:844},viewport:{width:390,height:664},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 14 Plus":{name:"iPhone 14 Plus",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:428,height:926},viewport:{width:428,height:746},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 14 Pro":{name:"iPhone 14 Pro",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:393,height:852},viewport:{width:393,height:660},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 14 Pro Max":{name:"iPhone 14 Pro Max",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:430,height:932},viewport:{width:430,height:740},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 15":{name:"iPhone 15",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:393,height:852},viewport:{width:393,height:659},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 15 Plus":{name:"iPhone 15 Plus",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:430,height:932},viewport:{width:430,height:739},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 15 Pro":{name:"iPhone 15 Pro",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:393,height:852},viewport:{width:393,height:659},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"iPhone 15 Pro Max":{name:"iPhone 15 Pro Max",userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",screen:{width:430,height:932},viewport:{width:430,height:739},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"Kindle Fire HDX":{name:"Kindle Fire HDX",userAgent:"Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true",screen:{width:800,height:1280},viewport:{width:800,height:1280},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"LG Optimus L70":{name:"LG Optimus L70",userAgent:"Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:384,height:640},viewport:{width:384,height:640},deviceScaleFactor:1.25,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Microsoft Lumia 550":{name:"Microsoft Lumia 550",userAgent:"Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36 Edge/14.14263",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Microsoft Lumia 950":{name:"Microsoft Lumia 950",userAgent:"Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36 Edge/14.14263",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:4,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nexus 10":{name:"Nexus 10",userAgent:"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:800,height:1280},viewport:{width:800,height:1280},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nexus 4":{name:"Nexus 4",userAgent:"Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:384,height:640},viewport:{width:384,height:640},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nexus 5":{name:"Nexus 5",userAgent:"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nexus 5X":{name:"Nexus 5X",userAgent:"Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:412,height:732},viewport:{width:412,height:732},deviceScaleFactor:2.625,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nexus 6":{name:"Nexus 6",userAgent:"Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:412,height:732},viewport:{width:412,height:732},deviceScaleFactor:3.5,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nexus 6P":{name:"Nexus 6P",userAgent:"Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:412,height:732},viewport:{width:412,height:732},deviceScaleFactor:3.5,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nexus 7":{name:"Nexus 7",userAgent:"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:600,height:960},viewport:{width:600,height:960},deviceScaleFactor:2,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nokia Lumia 520":{name:"Nokia Lumia 520",userAgent:"Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)",screen:{width:320,height:533},viewport:{width:320,height:533},deviceScaleFactor:1.5,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Nokia N9":{name:"Nokia N9",userAgent:"Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",screen:{width:480,height:854},viewport:{width:480,height:854},deviceScaleFactor:1,isMobile:!0,hasTouch:!0,defaultBrowserType:"webkit"},"Pixel 2":{name:"Pixel 2",userAgent:"Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:411,height:731},viewport:{width:411,height:731},deviceScaleFactor:2.625,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Pixel 2 XL":{name:"Pixel 2 XL",userAgent:"Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:411,height:823},viewport:{width:411,height:823},deviceScaleFactor:3.5,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Pixel 3":{name:"Pixel 3",userAgent:"Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:393,height:786},viewport:{width:393,height:786},deviceScaleFactor:2.75,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Pixel 4":{name:"Pixel 4",userAgent:"Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:353,height:745},viewport:{width:353,height:745},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Pixel 4a (5G)":{name:"Pixel 4a (5G)",userAgent:"Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:412,height:892},viewport:{width:412,height:765},deviceScaleFactor:2.63,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Pixel 5":{name:"Pixel 5",userAgent:"Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:393,height:851},viewport:{width:393,height:727},deviceScaleFactor:2.75,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Pixel 7":{name:"Pixel 7",userAgent:"Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:412,height:915},viewport:{width:412,height:839},deviceScaleFactor:2.625,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Moto G4":{name:"Moto G4",userAgent:"Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Mobile Safari/537.36",screen:{width:360,height:640},viewport:{width:360,height:640},deviceScaleFactor:3,isMobile:!0,hasTouch:!0,defaultBrowserType:"chromium"},"Desktop Chrome HiDPI":{name:"Desktop Chrome HiDPI",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:1792,height:1120},viewport:{width:1280,height:720},deviceScaleFactor:2,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium"},"Desktop Edge HiDPI":{name:"Desktop Edge HiDPI",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36 Edg/141.0.7390.16",screen:{width:1792,height:1120},viewport:{width:1280,height:720},deviceScaleFactor:2,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium"},"Desktop Firefox HiDPI":{name:"Desktop Firefox HiDPI",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0.1) Gecko/20100101 Firefox/142.0.1",screen:{width:1792,height:1120},viewport:{width:1280,height:720},deviceScaleFactor:2,isMobile:!1,hasTouch:!1,defaultBrowserType:"firefox"},"Desktop Safari":{name:"Desktop Safari",userAgent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",screen:{width:1792,height:1120},viewport:{width:1280,height:720},deviceScaleFactor:2,isMobile:!1,hasTouch:!1,defaultBrowserType:"webkit"},"Desktop Chrome":{name:"Desktop Chrome",displayName:"Playwright Chromium",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:1920,height:1080},viewport:{width:1920,height:1080},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium"},"Desktop Chrome Medium Resolution":{name:"Desktop Chrome Medium Resolution",displayName:"Playwright Chromium",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:1280,height:720},viewport:{width:1280,height:720},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium"},"Desktop Chrome (Branded)":{name:"Desktop Chrome (Branded)",displayName:"Google Chrome",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:1920,height:1080},viewport:{width:1920,height:1080},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium",channel:"chrome"},"Desktop Chrome Medium Resolution (Branded)":{name:"Desktop Chrome Medium Resolution (Branded)",displayName:"Google Chrome",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36",screen:{width:1280,height:720},viewport:{width:1280,height:720},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium",channel:"chrome"},"Desktop Edge":{name:"Desktop Edge",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36 Edg/141.0.7390.16",screen:{width:1920,height:1080},viewport:{width:1280,height:720},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium"},"Desktop Edge (Branded)":{name:"Desktop Edge (Branded)",displayName:"Microsoft Edge",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36 Edg/141.0.7390.16",screen:{width:1920,height:1080},viewport:{width:1920,height:1080},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium",channel:"msedge"},"Desktop Edge Medium Resolution (Branded)":{name:"Desktop Edge Medium Resolution (Branded)",displayName:"Microsoft Edge",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.7390.16 Safari/537.36 Edg/141.0.7390.16",screen:{width:1280,height:720},viewport:{width:1280,height:720},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"chromium",channel:"msedge"},"Desktop Firefox":{name:"Desktop Firefox",userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0.1) Gecko/20100101 Firefox/142.0.1",screen:{width:1920,height:1080},viewport:{width:1280,height:720},deviceScaleFactor:1,isMobile:!1,hasTouch:!1,defaultBrowserType:"firefox"}},Ie=(e=>(e.Desktop="desktop",e.Mobile="mobile",e))(Ie||{}),De={desktop:["Desktop Chrome","Desktop Chrome Medium Resolution","Desktop Chrome (Branded)","Desktop Chrome Medium Resolution (Branded)","Desktop Edge (Branded)","Desktop Edge Medium Resolution (Branded)","Desktop Safari"],mobile:["iPhone 15 Pro Max","iPhone 15 Pro","iPhone 15 Plus","iPhone 15","iPhone 14 Pro Max","iPhone 14 Pro","iPhone 14 Plus","iPhone 14","iPhone 13 Pro Max","iPhone 13 Pro","iPhone 13","iPhone 13 Mini","iPhone 12 Pro Max","iPhone 12 Pro","iPhone 12","iPhone 12 Mini","iPhone 11 Pro Max","iPhone 11 Pro","iPhone 11","iPhone XR","iPhone X","iPhone SE (3rd gen)","iPhone SE","iPhone 8 Plus","iPhone 8","iPhone 7 Plus","iPhone 7","iPhone 6 Plus","iPhone 6","Galaxy S24","Galaxy A55","Galaxy S9+","Galaxy S8","Galaxy S5","Galaxy Note 3","Galaxy Note II","Galaxy S III","Pixel 7","Pixel 5","Pixel 4a (5G)","Pixel 4","Pixel 3","Pixel 2 XL","Pixel 2","Nexus 6P","Nexus 6","Nexus 5X","Nexus 5","Nexus 4","Moto G4","LG Optimus L70","Microsoft Lumia 950","Microsoft Lumia 550","Nokia Lumia 520","Nokia N9","BlackBerry Z30"]},J=(e,t=!1)=>{let i=["chromium"];return t&&i.push("webkit"),De[e].map(r=>q[r]).filter(r=>r.defaultBrowserType&&i.includes(r.defaultBrowserType))},yt=()=>Object.keys(q),Z=e=>q[e],Tt={desktop:{label:"Desktop",type:"desktop",devices:J("desktop")},mobile:{label:"Mobile Web",type:"mobile",devices:J("mobile")}},bt={desktop:{label:"Desktop",type:"desktop",devices:J("desktop",!0)},mobile:{label:"Mobile Web",type:"mobile",devices:J("mobile",!0)}},le=(e,t=!1)=>{let i={userAgent:be,viewport:{width:Pe,height:Ae},isMobile:!1,hasTouch:!1};if(!e||e===F)return i;let r=Z(e);if(!r)return i;let{width:n,height:o}=r.viewport,a=Math.max(Ee/n,1),s=Math.max(Oe/o,1),l=Math.max(a,s),c={width:Math.round(n*l),height:Math.round(o*l)};return{userAgent:r.userAgent,viewport:t?c:r.viewport,isMobile:r.isMobile,hasTouch:r.hasTouch}},Mt=e=>{let t={width:Me,height:ke};if(!e||e===F)return t;let i=le(e);return i.viewport?{width:i.viewport.width,height:i.viewport.height+ce}:t},kt=e=>{let t={width:ve,height:xe};if(!e||e===F)return t;let i=le(e);return i.viewport?{width:i.viewport.width,height:i.viewport.height}:t},Pt=e=>!e||e===F?void 0:Z(e)?.channel,At=e=>!e||e===F?"chromium":Z(e)?.defaultBrowserType??"chromium"});var $e,Ce,xt=m(()=>{"use strict";$e=(e=>(e.PASSWORD="password",e.OAUTH2="oauth2",e.SSO="sso",e.API="api",e))($e||{}),Ce=(e=>(e.SMS="sms",e.EMAIL="email",e.TOTP="totp",e))(Ce||{})});var h,We,ue,Ne,B,Ge,Ke,He,O,he,Fe=m(()=>{"use strict";h=require("zod"),We=h.z.enum(["JS_CODE","AI_MODE"]),ue=h.z.object({type:We,expression:h.z.string()}),Ne=h.z.enum(["DRAFT","STEP","ACTION","IF_ELSE","WHILE_LOOP"]),B=h.z.object({uid:h.z.string(),type:Ne}),Ge=h.z.object({action_data:h.z.object({action_name:h.z.string(),kwargs:h.z.record(h.z.any()).optional(),args:h.z.array(h.z.any()).optional()}),action_description:h.z.string().optional(),url:h.z.string().optional(),xpath:h.z.string().nullable().optional(),locator:h.z.string().nullable().optional(),css_selector:h.z.string().nullable().optional(),unique_selector:h.z.string().nullable().optional(),element_index:h.z.number().nullable().optional(),frame_path:h.z.array(h.z.any()).optional(),artifacts:h.z.record(h.z.any()).optional(),feedback:h.z.string().optional(),original_browser_use_action:h.z.any().optional()}).passthrough(),Ke=B.extend({type:h.z.literal("DRAFT"),description:h.z.string()}),He=B.extend({type:h.z.literal("ACTION"),description:h.z.string(),action_entity:Ge.optional(),locator:h.z.string().optional(),use_pure_vision:h.z.boolean().optional()}),O=h.z.lazy(()=>h.z.union([Ke,He,B.extend({type:h.z.literal("STEP"),description:h.z.string().optional().default(""),statements:h.z.array(O),reference_id:h.z.number().optional()}),B.extend({type:h.z.literal("IF_ELSE"),description:h.z.string().optional(),condition:ue,then:h.z.array(O),else:h.z.array(O).optional()}),B.extend({type:h.z.literal("WHILE_LOOP"),description:h.z.string().optional(),condition:ue,body:h.z.array(O),timeout_ms:h.z.number().optional()})])),he=h.z.object({version:h.z.string().optional(),goal:h.z.string(),url:h.z.string(),final_feedback:h.z.string().optional(),completed:h.z.boolean().optional(),success:h.z.boolean().optional(),statements:h.z.array(O),teardown:h.z.array(O).optional(),last_modified_at:h.z.string().optional()})});function Ot(e,t){let i={...t?.test_case_id!==void 0?{test_case_id:t.test_case_id}:{},goal:e.goal,url:e.url,statements:e.statements.map(j)};return e.final_feedback&&(i.final_feedback=e.final_feedback),e.teardown&&e.teardown.length>0&&(i.teardown=e.teardown.map(j)),(0,Q.stringify)(i,{lineWidth:120,defaultKeyType:"PLAIN",defaultStringType:"PLAIN"})}function j(e){switch(e.type){case"DRAFT":return Hi(e);case"ACTION":return Fi(e);case"STEP":return Ri(e);case"IF_ELSE":return Ui(e);case"WHILE_LOOP":return zi(e)}}function Hi(e){return e.description}function Fi(e){if((e.action_entity?.action_data?.action_name??e.action_entity?.action?.action_name)==="verify"){let o=(e.action_entity?.action_data?.kwargs??e.action_entity?.action?.kwargs)?.statement;if(typeof o=="string"&&!e.action_entity?.locator&&!e.action_entity?.xpath)return`VERIFY: ${o}`}if(!e.action_entity)return e.description;let i={description:e.description},r=Bi(e.action_entity);return r&&(i.action_entity=r),e.locator&&(i.locator=e.locator),e.use_pure_vision&&(i.use_pure_vision=!0),i}function Bi(e){let t={},i=!1,r=e.action_data??e.action;return r&&(t.action_data={action_name:r.action_name},r.kwargs&&Object.keys(r.kwargs).length>0&&(t.action_data.kwargs=r.kwargs),r.args&&r.args.length>0&&(t.action_data.args=r.args),i=!0),e.locator&&(t.locator=e.locator,i=!0),e.xpath&&(t.xpath=e.xpath,i=!0),i?t:void 0}function Ri(e){let t={STEP:e.description,statements:e.statements.map(j)};return e.reference_id!==void 0&&(t.reference_id=e.reference_id),t}function Ui(e){let t={IF:Lt(e.condition),THEN:e.then.map(j)};return e.else&&e.else.length>0&&(t.ELSE=e.else.map(j)),t}function zi(e){let t={WHILE:Lt(e.condition),DO:e.body.map(j)};return e.timeout_ms!==void 0&&(t.timeout_ms=e.timeout_ms),t}function Lt(e){return e.type==="JS_CODE"?`js:${e.expression}`:e.expression}function It(e){try{let t=(0,Q.parse)(e);if(!t||typeof t!="object")return{};let i={};return typeof t.test_case_id=="number"&&Number.isFinite(t.test_case_id)&&(i.test_case_id=t.test_case_id),i}catch{return{}}}function pe(e){if(e.length>Et)throw new Error(`YAML input too large (${e.length} bytes, max ${Et})`);let t=(0,Q.parse)(e);if(!t||typeof t!="object")throw new Error("Invalid YAML: expected an object at root level");let i={version:"1.2.0",goal:t.goal,url:t.url,statements:Y(t.statements??[])};t.final_feedback&&(i.final_feedback=t.final_feedback),t.teardown&&Array.isArray(t.teardown)&&(i.teardown=Y(t.teardown));let r=he.safeParse(i);if(!r.success)throw new Error(`Invalid TestFlow after YAML conversion: ${JSON.stringify(r.error.errors)}`);return r.data}function Y(e){if(!Array.isArray(e))throw new Error("Expected an array of statements");return e.map(Vi)}function Vi(e){if(typeof e=="string")return Xi(e);if(typeof e!="object"||e===null)throw new Error(`Invalid statement: expected string or object, got ${typeof e}`);let t=e;if("IF"in t)return Ji(t);if("WHILE"in t)return ji(t);if("STEP"in t)return Yi(t);if("action_entity"in t)return qi(t);if("description"in t&&typeof t.description=="string")return{uid:(0,L.v4)(),type:"DRAFT",description:t.description};throw new Error(`Cannot infer statement type from object: ${JSON.stringify(t)}`)}function Xi(e){let t=e.match(/^VERIFY:\s*(.+)$/i);return t?{uid:(0,L.v4)(),type:"ACTION",description:`Verify: ${t[1]}`,action_entity:{action_description:`Verify: ${t[1]}`,action_data:{action_name:"verify",kwargs:{statement:t[1]}}}}:{uid:(0,L.v4)(),type:"DRAFT",description:e}}function Dt(e){if(typeof e!="string")throw new Error(`Condition must be a string, got ${typeof e}`);return e.startsWith("js:")?{type:"JS_CODE",expression:e.slice(3)}:{type:"AI_MODE",expression:e}}function Ji(e){let t=Dt(e.IF),i=e.THEN;if(!Array.isArray(i))throw new Error("IF_ELSE requires a THEN array");let r={uid:(0,L.v4)(),type:"IF_ELSE",condition:t,then:Y(i)};return"ELSE"in e&&Array.isArray(e.ELSE)&&(r.else=Y(e.ELSE)),r}function ji(e){let t=Dt(e.WHILE),i=e.DO;if(!Array.isArray(i))throw new Error("WHILE_LOOP requires a DO array");let r={uid:(0,L.v4)(),type:"WHILE_LOOP",condition:t,body:Y(i)};return typeof e.timeout_ms=="number"&&(r.timeout_ms=e.timeout_ms),r}function Yi(e){let t=typeof e.STEP=="string"?e.STEP:"";if(!Array.isArray(e.statements))throw new Error("STEP requires a statements array");let i={uid:(0,L.v4)(),type:"STEP",description:t,statements:Y(e.statements)};return typeof e.reference_id=="number"&&(i.reference_id=e.reference_id),i}function qi(e){let t=typeof e.description=="string"?e.description:"",i=e.action_entity,r;i&&(r={action_description:t,...i});let n={uid:(0,L.v4)(),type:"ACTION",description:t};return r&&(n.action_entity=r),typeof e.locator=="string"&&(n.locator=e.locator),typeof e.use_pure_vision=="boolean"&&(n.use_pure_vision=e.use_pure_vision),n}var Q,L,Et,$t=m(()=>{"use strict";Fe();Q=require("yaml"),L=require("uuid");Et=1024*1024});function Be(e){for(let t of e){if(t.type==="STEP"&&t.reference_id)return!0;let i=P(t);for(let r of i)if(Be(r.statements))return!0}return!1}function Gt(e){let t=new Set;function i(r){for(let n of r){n.type==="STEP"&&n.reference_id&&t.add(n.reference_id);let o=P(n);for(let a of o)i(a.statements)}}return i(e),Array.from(t)}function Ft(e){if(!e?.statements||!Array.isArray(e.statements))return{};let t={};return W(e.statements,"main",t),e.teardown&&Array.isArray(e.teardown)&&W(e.teardown,"teardown",t),t}function I(e,t,i){let r=e+".",n=t.filter(([u])=>u===e||u.startsWith(r));if(n.length===0)return[];let o=[],a=new Set;for(let[u]of n){let d=u===e?"":u.slice(r.length);if(!d)continue;let g=d.split(".")[0];a.has(g)||a.add(g)}let s=Array.from(a);s.sort((u,d)=>{let g=/^\d+$/.test(u)?parseInt(u,10):-1,_=/^\d+$/.test(d)?parseInt(d,10):-1;return g>=0&&_>=0?g-_:u==="then"&&d==="else"?-1:u==="else"&&d==="then"||u==="body"?1:d==="body"?-1:u.localeCompare(d)});function l(u){return i[u]}function c(u){let d=u.match(/^(IF|WHILE)\s+([\s\S]+)$/);return{type:"JS_CODE",expression:(d?d[2].trim():u)||"true"}}for(let u of s){let d=e?`${e}.${u}`:u,g=l(d),_=g?.description??"",V=d;if(u==="then"){let f=`${e}.then`,E=`${e}.else`,y=I(f,t,i),K=I(E,t,i),ne=l(e),Ii=ne?c(ne.description):{type:"JS_CODE",expression:"true"};o.push({uid:e,type:"IF_ELSE",condition:Ii,then:y,...K.length>0?{else:K}:{}});continue}if(u==="else")continue;if(u==="body"){let f=`${e}.body`,E=I(f,t,i),y=l(e),K=y?c(y.description):{type:"JS_CODE",expression:"true"};o.push({uid:e,type:"WHILE_LOOP",condition:K,body:E});continue}let w=`${e}.${u}`,re=t.some(([f])=>f.startsWith(w+".then.")||f===w+".then"),X=t.some(([f])=>f.startsWith(w+".else.")||f===w+".else"),ye=t.some(([f])=>f.startsWith(w+".body.")||f===w+".body"),G=t.filter(([f])=>{if(!f.startsWith(w+"."))return!1;let y=f.slice(w.length+1).split(".")[0];return/^\d+$/.test(y)&&y!=="then"&&y!=="else"&&y!=="body"});if(re||X){let f=w+".then",E=w+".else",y=I(f,t,i),K=I(E,t,i),ne=g?c(_):{type:"JS_CODE",expression:"true"};o.push({uid:d,type:"IF_ELSE",condition:ne,then:y,...K.length>0?{else:K}:{}})}else if(ye){let f=w+".body",E=I(f,t,i),y=g?c(_):{type:"JS_CODE",expression:"true"};o.push({uid:d,type:"WHILE_LOOP",condition:y,body:E})}else if(G.length>0){let f=I(w,t,i);o.push({uid:d,type:"STEP",description:_||"Group",statements:f})}else o.push({uid:d,type:"ACTION",description:_||"Action",action_entity:g?.action_entity})}return o}function Bt(e){let t=Object.entries(e),i=r=>{let n=r+".";return t.some(([a])=>a===r||a.startsWith(n))?I(r,t,e):[]};return{before:i("before"),main:i("main"),teardown:i("teardown"),after:i("after")}}var P,T,D,$,C,Ct,Wt,Nt,Zi,Qi,Kt,Ht,W,Re=m(()=>{"use strict";P=e=>{let t=[];switch(e.type){case"STEP":e.statements&&t.push({key:"statements",statements:e.statements});break;case"IF_ELSE":e.then&&t.push({key:"then",statements:e.then}),e.else&&t.push({key:"else",statements:e.else});break;case"WHILE_LOOP":e.body&&t.push({key:"body",statements:e.body});break}return t},T=(e,t,i=void 0,r="root")=>{for(let n=0;n<e.length;n++){let o=e[n],a=o.uid;if(a===t)return{stableId:a,path:[n],statement:o,parent:i,containerKey:r,index:n};let s=P(o);for(let l of s){let c=T(l.statements,t,o,l.key);if(c)return{...c,path:[n,l.key,...c.path]}}}return null},D=(e,t,i)=>{let r=T(e,t);if(!r)return null;let{statement:n,parent:o,containerKey:a,index:s}=r,l=null;switch(n.type){case"DRAFT":case"ACTION":l=$(e,r)||C(e,r);break;case"STEP":if(n.statements&&n.statements.length>0)return n.statements[0];l=$(e,r)||C(e,r);break;case"IF_ELSE":if(i===!0&&n.then&&n.then.length>0)return n.then[0];if(i===!1&&n.else&&n.else.length>0)return n.else[0];l=$(e,r)||C(e,r);break;case"WHILE_LOOP":if(i===!0&&n.body&&n.body.length>0)return n.body[0];l=$(e,r)||C(e,r);break;default:l=$(e,r)||C(e,r);break}if(o&&o.type==="WHILE_LOOP"&&a==="body"){if(!l)return o;let c=T(e,l.uid);if(!c||c.parent!==o)return o}return l},$=(e,t)=>{if(!t.parent)return e[t.index+1]||null;let r=P(t.parent).find(n=>n.key===t.containerKey);return r&&t.index+1<r.statements.length?r.statements[t.index+1]:null},C=(e,t)=>{if(!t.parent)return null;let i=t.parent.uid,r=T(e,i);return r?$(e,r)||C(e,r):null},Ct=e=>{let t=[],i=r=>{for(let n of r){t.push(n);let o=P(n);for(let a of o)i(a.statements)}};return i(e),t},Wt=e=>{switch(e.type){case"DRAFT":case"ACTION":return!0;case"STEP":return!0;case"IF_ELSE":case"WHILE_LOOP":return!0;default:return!1}},Nt=(e,t,i)=>{if(!T(e,t))return null;if(i===null){let s=[],l=t;for(;l!==null&&T(e,l);)if(s.push(l),l=D(e,l)?.uid||null,s.length>1e3)return null;return s}if(!T(e,i))return null;if(t===i)return[];let o=[],a=t;for(;a&&a!==i;){let s=T(e,a);if(!s)break;if(o.push(a),s.statement.type==="IF_ELSE"){let l=Zi(s.statement,i);l?a=D(e,a,l==="then")?.uid||null:a=D(e,a)?.uid||null}else s.statement.type==="WHILE_LOOP"?Qi(s.statement,i)?a=D(e,a,!0)?.uid||null:a=D(e,a,!1)?.uid||null:a=D(e,a)?.uid||null;if(o.length>1e3)return null}return a===i?o:null},Zi=(e,t)=>{if(e.type!=="IF_ELSE")return null;let i=e;return i.then&&T(i.then,t)?"then":i.else&&T(i.else,t)?"else":null},Qi=(e,t)=>{if(e.type!=="WHILE_LOOP")return!1;let i=e;return!!(i.body&&T(i.body,t))};Kt=e=>e.startsWith("ai_")?!0:["js_code","function","assert","verify","wait_for_download_complete","extract_activation_code","extract_email_content"].includes(e),Ht=e=>!["js_code","function","assert","ai_assert","verify","ai_extract","ai_wait_until","upload_file","login","extract_activation_code","extract_email_content","ai_step"].includes(e),W=(e,t,i)=>{e.forEach((r,n)=>{let o=`${t}.${n}`;r.type==="DRAFT"?i[o]={description:r.description||"Draft",action_entity:void 0}:r.type==="ACTION"?i[o]={description:r.description||"Action",action_entity:r.action_entity}:r.type==="STEP"&&r.statements?W(r.statements,o,i):r.type==="IF_ELSE"?(i[o]={description:"IF "+(r.condition?.expression||""),action_entity:void 0},r.then&&W(r.then,`${o}.then`,i),r.else&&W(r.else,`${o}.else`,i)):r.type==="WHILE_LOOP"&&(i[o]={description:"WHILE "+(r.condition?.expression||""),action_entity:void 0},r.body&&W(r.body,`${o}.body`,i))})}});function Rt(){return{version:"1.0",entries:{}}}function Ut(e,t){return{action_entity:e,updated_at:new Date().toISOString(),updated_by:{source:"runner",test_run_id:t}}}function zt(e,t){let i=t?.entries[e.uid],r=i?.action_entity??e.action_entity;return e.locator&&r?{...r,locator:e.locator}:i?i.action_entity:e.action_entity?e.action_entity:null}function Vt(e,t,i,r){return e.entries[t]={action_entity:i,updated_at:new Date().toISOString(),updated_by:r},e}function Xt(e,t){let i=e??{version:"1.0",entries:{}};for(let[r,n]of t)i.entries[r]=n;return i}function Jt(e){return e?Object.keys(e.entries).length===0:!0}function jt(e){return e?Object.keys(e.entries).length:0}function Yt(e,t){if(!t||Object.keys(t.entries).length===0)return e;let i=Ue(e.statements,t),r=e.teardown?Ue(e.teardown,t):void 0;return{...e,statements:i,teardown:r}}function Ue(e,t){return e.map(i=>er(i,t))}function er(e,t){if(e.type==="ACTION"){let n=e,o=t.entries[n.uid];return o?{...n,action_entity:o.action_entity}:n}let i=P(e);if(i.length===0)return e;let r={};for(let n of i)r[n.key]=Ue(n.statements,t);return{...e,...r}}var qt=m(()=>{"use strict";Re()});var ze,Ve,de,Zt=m(()=>{"use strict";ze=(e=>(e.DRAFT="DRAFT",e.STEP="STEP",e.ACTION="ACTION",e.IF_ELSE="IF_ELSE",e.WHILE_LOOP="WHILE_LOOP",e))(ze||{}),Ve=(e=>(e.JS_CODE="JS_CODE",e.AI_MODE="AI_MODE",e))(Ve||{}),de=18e4});var Qt,ti=m(()=>{"use strict";Qt=class ei{data={};sensitive=new Set;get(t){return this.data[t]}set(t,i,r=!1){this.data[t]=i,r?this.sensitive.add(t):this.sensitive.has(t)&&this.sensitive.delete(t)}getAll(){return{...this.data}}isSensitive(t){return this.sensitive.has(t)}getAllSensitiveKeys(){return new Set(this.sensitive)}delete(t){return this.sensitive.delete(t),delete this.data[t]}clear(){this.data={},this.sensitive.clear()}has(t){return t in this.data}get size(){return Object.keys(this.data).length}merge(t){for(let[i,r]of Object.entries(t.getAll()))this.set(i,r,t.isSensitive(i))}toJSON(){return{data:{...this.data},sensitiveKeys:Array.from(this.sensitive)}}static fromJSON(t){let i=new ei;if(t.data){let r=new Set(t.sensitiveKeys||[]);for(let[n,o]of Object.entries(t.data))i.set(n,o,r.has(n))}return i}}});function ii(e){return{copilot:e?.models?.copilot||Xe,webagent:e?.models?.webagent||Je}}function ri(e=process.env){if(e.WEB_AGENT_MODEL)return e.WEB_AGENT_MODEL;if(e.ANTHROPIC_API_KEY)return je;if(e.GOOGLE_API_KEY)return Ye}var Xe,Je,je,Ye,ni=m(()=>{"use strict";Xe="claude-sonnet-4-5",Je="gemini-2.5-pro",je="claude-haiku-4-5",Ye="gemini-2.5-pro"});var qe,oi=m(()=>{"use strict";qe=(e=>(e.INITIALIZING="initializing",e.READY="ready",e.PROCESSING="processing",e.STOPPING="stopping",e.WAITING_USER="waiting_user",e.COMPLETED="completed",e.FAILED="failed",e))(qe||{})});function ai(e){let t=e.trim();if(!t||t.startsWith("List of devices"))return null;let i=t.split(/\s+/);if(i.length<2)return null;let r=i[0],n=i[1],o="usb";return r.startsWith("emulator-")?o="emulator":r.includes(":")&&(o="wifi"),{id:r,state:n,connectionType:o}}function si(e){return e.startsWith(b)?e:`${b}${e}`}function ci(e){return e.model?`${e.model} (${e.id})`:e.connectionType==="emulator"?`Android Emulator (${e.id})`:e.id}var li=m(()=>{"use strict";se()});var ui={};Qe(ui,{ADDRESS_BAR_HEIGHT:()=>ce,ANDROID_DEVICE_PREFIX:()=>b,ActionEntitySchema:()=>Ge,ActionSchema:()=>He,AgentStatus:()=>qe,BaseStatementSchema:()=>B,BrowserType:()=>Le,ConditionSchema:()=>ue,ConditionType:()=>Ve,ConditionTypeSchema:()=>We,DEFAULT_ANTHROPIC_MODEL:()=>je,DEFAULT_COPILOT_MODEL:()=>Xe,DEFAULT_DEVICE_NAME:()=>F,DEFAULT_GOOGLE_MODEL:()=>Ye,DEFAULT_WEBAGENT_MODEL:()=>Je,DEFAULT_WHILE_LOOP_TIMEOUT_MS:()=>de,DEVICE_CATEGORIES:()=>De,DeviceType:()=>Ie,DraftSchema:()=>Ke,IOS_DEVICE_PREFIX:()=>M,LoginType:()=>$e,MIN_WINDOW_HEIGHT:()=>Oe,MIN_WINDOW_WIDTH:()=>Ee,NodeJSCodeCommon:()=>tt,PLAYWRIGHT_DEVICES:()=>q,RECORD_VIDEO_HEIGHT:()=>xe,RECORD_VIDEO_WIDTH:()=>ve,StatementSchema:()=>O,StatementType:()=>ze,StatementTypeSchema:()=>Ne,TestFlowSchema:()=>he,TwoFactorAuthType:()=>Ce,UI_DEVICE_CATEGORIES:()=>Tt,UI_DEVICE_CATEGORIES_ELECTRON:()=>bt,USER_AGENT:()=>be,VIEWPORT_HEIGHT:()=>Ae,VIEWPORT_WIDTH:()=>Pe,VariableStore:()=>Qt,WINDOW_HEIGHT:()=>ke,WINDOW_WIDTH:()=>Me,actionStepsMapToTestFlowSections:()=>Bt,allowPureVisionAction:()=>Ht,collectActionSteps:()=>W,createAndroidDeviceName:()=>pt,createEmptyStore:()=>Rt,createIOSDeviceName:()=>dt,createRunnerStoreEntry:()=>Ut,extractActionStepsFromTestFlow:()=>Ft,extractDeviceIdentifier:()=>ht,extractYamlMetadata:()=>It,findNextAfterContainer:()=>C,findNextSibling:()=>$,findNextStatement:()=>D,findPathBetweenStatements:()=>Nt,findStatementPathById:()=>T,getAllDeviceNames:()=>yt,getAllReferenceIds:()=>Gt,getAllStatementsInOrder:()=>Ct,getAndroidDeviceDisplayName:()=>ci,getBrowserWindowSize:()=>Mt,getCompatiblePlatforms:()=>Te,getDeviceBrowserType:()=>At,getDeviceByName:()=>Z,getDeviceChannel:()=>Pt,getDeviceOptions:()=>le,getDevicesByCategory:()=>J,getIOSDeviceDisplayName:()=>wt,getLoginConfigPlatform:()=>rt,getRecordVideoSize:()=>kt,getStatementContainers:()=>P,getStoreSize:()=>jt,getTestPlatformFromDeviceName:()=>st,hasReferenceIds:()=>Be,isAndroidDevice:()=>lt,isAppPackage:()=>ft,isDynamicAction:()=>Kt,isExecutableStatement:()=>Wt,isIOSDevice:()=>ut,isNativeDevice:()=>ct,isPhysicalDeviceUDID:()=>St,isPlatformCompatibleWithUrl:()=>gt,isStoreEmpty:()=>Jt,isWebUrl:()=>ae,mergeActionEntitiesIntoTestFlow:()=>Yt,mergeStoreUpdates:()=>Xt,parseAdbDeviceLine:()=>ai,replaceVariables:()=>ot,resolveActionEntity:()=>zt,resolveModelFromEnv:()=>ri,resolveModels:()=>ii,testFlowToYaml:()=>Ot,toAndroidDeviceName:()=>si,toIOSDeviceName:()=>mt,updateStoreEntry:()=>Vt,yamlToTestFlow:()=>pe});var fe=m(()=>{"use strict";it();nt();at();_t();vt();xt();$t();Fe();qt();Re();Zt();ti();ni();oi();li();se()});var Tr={};Qe(Tr,{authSetup:()=>vi,resolveLoginConfig:()=>_e,shiplightConfig:()=>Li});module.exports=Gi(Tr);var x=H(require("fs"),1),k=H(require("path"),1),Ei=H(require("dotenv"),1),Oi=require("glob");var v=require("fs"),Mi=require("path"),ki=require("glob");var ge=require("yaml");fe();var pi=require("fs"),te=require("path"),ee=require("yaml"),hi=5;function di(e,t){let i={expandingPaths:new Set([(0,te.resolve)(t)]),depth:0,referencedPaths:new Set},r={...e};return Array.isArray(r.statements)&&(r.statements=R(r.statements,t,i)),Array.isArray(r.teardown)&&(r.teardown=R(r.teardown,t,i)),{doc:r,referencedTemplatePaths:Array.from(i.referencedPaths)}}function R(e,t,i){let r=[];for(let n of e)if(tr(n)){let o=ir(n,t,i);r.push(...o)}else r.push(rr(n,t,i));return r}function tr(e){return typeof e=="object"&&e!==null&&typeof e.template=="string"}function ir(e,t,i){if(i.depth>=hi)throw new Error(`Template expansion exceeded maximum depth of ${hi}. Check for deeply nested or circular template references.`);let r=(0,te.resolve)((0,te.dirname)(t),e.template);if(i.expandingPaths.has(r))throw new Error(`Circular template reference detected: ${r} is already being expanded. Stack: ${Array.from(i.expandingPaths).join(" \u2192 ")} \u2192 ${r}`);i.referencedPaths.add(r);let n;try{n=(0,pi.readFileSync)(r,"utf-8")}catch(u){throw new Error(`Failed to read template file: ${r} (referenced from ${t}): ${u.message}`)}let o=(0,ee.parse)(n);if(!o||typeof o!="object")throw new Error(`Invalid template file: ${r} \u2014 expected a YAML object`);let a=o.params||[],s=e.params||{};for(let u of a)if(!(u in s))throw new Error(`Template ${e.template} requires param "${u}" but it was not provided. Required params: [${a.join(", ")}]`);let l=o.statements;if(!Array.isArray(l))throw new Error(`Template ${e.template} must have a "statements" array`);if(Object.keys(s).length>0){let d=(0,ee.stringify)(l);for(let[g,_]of Object.entries(s))d=d.replaceAll(`{{${g}}}`,String(_));l=(0,ee.parse)(d)}let c={expandingPaths:new Set([...i.expandingPaths,r]),depth:i.depth+1,referencedPaths:i.referencedPaths};return R(l,r,c)}function rr(e,t,i){if(typeof e!="object"||e===null)return e;let r={...e};return Array.isArray(r.statements)&&(r.statements=R(r.statements,t,i)),Array.isArray(r.THEN)&&(r.THEN=R(r.THEN,t,i)),Array.isArray(r.ELSE)&&(r.ELSE=R(r.ELSE,t,i)),Array.isArray(r.DO)&&(r.DO=R(r.DO,t,i)),r}function fi(e,t){let i=(0,ge.parse)(e),r=i?.name,n=i?.tags,o=i?.use;i&&(i.name!==void 0||i.tags!==void 0||i.use!==void 0)&&(delete i.name,delete i.tags,delete i.use);let a=[];if(t&&i&&typeof i=="object"){let c=di(i,t);i=c.doc,a=c.referencedTemplatePaths}let s=(0,ge.stringify)(i);return{testFlow:pe(s),name:r,tags:n,use:o,referencedTemplatePaths:a}}fe();function me(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function N(e){return e.replace(/\r\n/g," ").replace(/\n/g," ").replace(/\r/g," ").trim()}function nr(e){let t=e.frame_path;return!t||t.length===0?"page":`page.frameLocator('${t[0]}')`}function or(e){let t=e.xpath;return typeof t=="string"&&t.trim()?!t.startsWith("xpath=")&&!t.startsWith("/")&&!t.startsWith("//")?`xpath=//${t}`:t.startsWith("xpath=")?t:`xpath=${t}`:null}function Ze(e){let t=nr(e),i=e.locator;if(typeof i=="string"&&i.trim())return i=i.trim(),i.endsWith("first()")?`${t}.${i}`:`${t}.${i}.first()`;let r=or(e);if(r){let n=JSON.stringify(r);return`${t}.locator(${n}).first()`}return null}var ar=["ai_action","ai_step","ai_assert","ai_extract","ai_wait_until","verify","assert"],sr=["js_code","function","wait","wait_for_download_complete","wait_for_page_ready","extract_email_content","extract_activation_code"];function gi(e){let t=e.action_data?.action_name;return!t||(t==="verify"||t==="ai_assert"||t==="assert")&&e.action_data?.kwargs?.code?!1:ar.includes(t)}function mi(e){let t=e.action_data?.action_name;return!t||(t==="verify"||t==="ai_assert"||t==="assert")&&e.action_data?.kwargs?.code?!1:!sr.includes(t)}var S=new Map;function p(e,t){S.set(e,t)}function _i(e){return S.get(e)}function U(e,t,i=[]){let r=[...i];return t.locator?r.push(`locator: ${JSON.stringify(t.locator)}`):t.xpath&&r.push(`xpath: ${JSON.stringify(t.xpath)}`),t.frame_path&&t.frame_path.length>0&&r.push(`frame_path: ${JSON.stringify(t.frame_path)}`),r.length===0?[`await agent.execAction("${e}", page, {});`]:[`await agent.execAction("${e}", page, {`,...r.map(n=>` ${n},`),"});"]}p("click",e=>{let t=Ze(e);return t?[`await ${t}.click({ timeout: ${5e3} });`]:['await agent.execAction("click", page, {});']});p("click_element",S.get("click"));p("click_element_by_index",S.get("click"));p("double_click",e=>U("double_click",e));p("double_click_on_element",S.get("double_click"));p("right_click",e=>U("right_click",e));p("right_click_on_element",S.get("right_click"));p("hover",e=>U("hover",e));p("hover_element_by_index",S.get("hover"));p("input_text",e=>{let t=e.action_data?.kwargs?.text??e.action_data?.kwargs?.value??"";return U("input_text",e,[`action_data: { kwargs: { text: ${JSON.stringify(t)} } }`])});p("fill",S.get("input_text"));p("clear_input",e=>U("clear_input",e));p("press",e=>{let t=e.action_data?.kwargs?.keys;return[`await page.keyboard.press(${JSON.stringify(t)});`]});p("send_keys",S.get("press"));p("send_keys_on_element",e=>{let t=Ze(e),i=e.action_data?.kwargs?.keys||"";return t?[`await ${t}.press(${JSON.stringify(i)}, { timeout: ${5e3} });`]:['await agent.execAction("send_keys_on_element", page, {',` action_data: { kwargs: { keys: ${JSON.stringify(i)} } },`,"});"]});p("select_dropdown_option",e=>{let t=e.action_data?.kwargs?.text||e.action_data?.kwargs?.option||"";return U("select_dropdown_option",e,[`action_data: { kwargs: { text: ${JSON.stringify(t)} } }`])});p("scroll",e=>{let t=e.action_data?.kwargs?.down??!0;return[`await page.evaluate('window.scrollBy(0, window.innerHeight * ${(e.action_data?.kwargs?.num_pages??1)*(t?1:-1)})');`]});p("scroll_down",S.get("scroll"));p("scroll_up",S.get("scroll"));p("scroll_element",S.get("scroll"));p("scroll_to_text",e=>{let t=e.action_data?.kwargs?.text||"";return[`await page.getByText(${JSON.stringify(t)}, { exact: false }).first().scrollIntoViewIfNeeded();`]});p("scroll_on_element",e=>U("scroll_on_element",e,[`action_data: { kwargs: ${JSON.stringify(e.action_data?.kwargs||{})} }`]));p("go_to_url",e=>{let t=e.action_data?.kwargs?.url||"";return e.action_data?.kwargs?.new_tab===!0?['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(t)}, new_tab: true } },`,"});"]:['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(t)} } },`,"});"]});p("open_tab",S.get("go_to_url"));p("go_back",()=>['await agent.execAction("go_back", page, {});']);p("reload_page",()=>['await agent.execAction("reload_page", page, {});']);p("wait",e=>[`await page.waitForTimeout(${(e.action_data?.kwargs?.seconds||1)*1e3});`]);p("wait_for_page_ready",()=>["await page.waitForLoadState('domcontentloaded');"]);p("verify",(e,t)=>{let i=e.action_data?.kwargs;if(i?.code)return i.code.split(`
|
|
16
16
|
`);let r=i?.statement||e.action_description;return r?[`await agent.assert(page, ${JSON.stringify(r)}, '${t||""}');`]:["// Skipping verify: missing statement or code"]});p("ai_assert",S.get("verify"));p("assert",S.get("verify"));p("ai_action",(e,t)=>{let i=e.action_data?.kwargs?.statement;if(!i)return["// Skipping ai_action: missing statement"];let r=JSON.stringify(i),n=e.action_data?.kwargs?.use_pure_vision;return[`await agent.execute(page, ${r}, '${t||""}', ${n});`]});p("ai_step",(e,t)=>{let i=e.action_data?.kwargs?.statement;return i?[`await agent.run(page, ${JSON.stringify(i)}, '${t||""}');`]:["// Skipping ai_step: missing statement"]});p("ai_extract",(e,t)=>{let i=e.action_data?.kwargs?.element_description,r=e.action_data?.kwargs?.variable_name;if(!i||!r)return["// Skipping ai_extract: missing element_description or variable_name"];let n=JSON.stringify(i),o=JSON.stringify(r);return[`await agent.extract(page, ${n}, ${o}, '${t||""}');`]});p("ai_wait_until",(e,t)=>{let i=e.action_data?.kwargs?.condition,r=e.action_data?.kwargs?.timeout_seconds||60;return i?[`await agent.waitUntilCondition(page, ${JSON.stringify(i)}, ${r}, '${t||""}');`]:["// Skipping ai_wait_until: missing condition"]});p("save_variable",e=>{let t=e.action_data?.kwargs?.name||"",i=e.action_data?.kwargs?.value;return['await agent.execAction("save_variable", page, {',` action_data: { kwargs: { name: ${JSON.stringify(t)}, value: ${JSON.stringify(i)} } },`,"});"]});p("js_code",e=>{let t=e.action_data?.kwargs?.code;if(!t)return["// Skipping js_code: missing code"];let i=["{"],r=t.split(`
|
|
17
|
-
`);for(let n of r)i.push(` ${n}`);return i.push("}"),i});p("function",(e,t,i)=>{let r=e.action_data?.kwargs||{},n=r.functionName;if(n&&n.includes("#")){let[a,s]=n.split("#");if(a&&s){let l=a.replace(/\.(ts|js|mjs)$/,""),c=`import { ${s} } from '${l}';`;i?.imports?.add(c);let u={...r,functionName:s},d=wi(u);return d?[d.endsWith(";")?d:`${d};`]:["// Skipping function: invalid export pattern"]}}let o=wi(r);return o?[o.endsWith(";")?o:`${o};`]:["// Skipping function: missing functionName"]});p("generate_2fa_code",e=>{let t=e.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(t)} } },`,"});"]});p("upload_file",e=>{let t=e.action_data?.kwargs||{},i=[],r={};return t.paths?r.paths=t.paths:t.path&&(r.path=t.path),t.use_file_input&&(r.use_file_input=!0),i.push(`action_data: { kwargs: ${JSON.stringify(r)} }`),e.locator?i.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&i.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&i.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("upload_file", page, {',...i.map(n=>` ${n},`),"});"]});p("wait_for_download_complete",e=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${e.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);p("switch_tab",e=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${e.action_data?.kwargs?.page_id??0} } },`,"});"]);p("close_tab",e=>{let t=e.action_data?.kwargs?.page_id;return t=t??e.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${t} } },`,"});"]});p("set_date_for_native_date_picker",e=>{let t=e.action_data?.kwargs?.date??"",i=[];return i.push(`action_data: { kwargs: { date: ${JSON.stringify(t)} } }`),e.locator?i.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&i.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&i.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...i.map(r=>` ${r},`),"});"]});p("done",()=>["// Done - no action needed"]);function wi(e){let t=e.functionName;if(!t)return null;let i={},r=e.parameterNames||[],n=e.parameterValues||e.args||[];if(r.forEach((l,c)=>{c<n.length&&(i[l]=n[c])}),Object.keys(i).length===0)return`await ${t}()`;let o=["page","testContext","request","agentServices"],a=["undefined","null","true","false"],s=Object.entries(i).map(([l,c])=>{let u=String(c);return c==null?"undefined":o.includes(l)&&o.includes(u)||a.includes(u)||/^-?\d+(\.\d+)?$/.test(u)?u:u.startsWith("$")?`agent.agentServices.readVariable('${u.substring(1)}')`:`"${u}"`});return`await ${t}(${s.join(", ")})`}function A(e,t,i,r="main"){let n=[];for(let o=0;o<e.length;o++){let a=e[o],s=`${r}.${o}`,l=cr(a,t,s,i);l.length>0&&(n.push(...l),o<e.length-1&&n.push(""))}return n}function cr(e,t,i,r){let n=" ".repeat(t);switch(e.type){case"DRAFT":return lr(e,t,i);case"ACTION":return ur(e,t,i,r);case"STEP":return hr(e,t,i,r);case"IF_ELSE":return pr(e,t,i,r);case"WHILE_LOOP":return dr(e,t,i,r);default:return[`${n}// Unknown statement type: ${e.type}`]}}function lr(e,t,i){let r=" ".repeat(t),n=e.description?.trim()||"";if(!n)return[`${r}// ${i}: Skipping - no description`];let o=JSON.stringify(n);return[`${r}// ${i}: ${N(n)}`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.run(page, ${o}, '${i}');`]}function ur(e,t,i,r){let n=" ".repeat(t),o=e.description,a=e.uid,l=r.actionEntityStore?.entries[e.uid]?.action_entity??e.action_entity;if(!l){if(!o)return[`${n}// ${i}: Skipping - no description`];let G=JSON.stringify(o),f=!!e.use_pure_vision;return[`${n}// ${i}: ${N(o)}`,`${n}page = agent.agentServices.validatePage(page);`,`${n}await agent.execute(page, ${G}, '${i}', ${f});`]}let c=e.locator?{...l,locator:e.locator}:l;o&&o!==c.action_description&&(c={...c,action_description:o});let u=c.action_data?.action_name||"",d=c.action_description||"",g=_i(u);if(!g)return[`${n}// ${i}: Unknown action: ${u}`];let _={imports:r.imports},V=g(c,i,_);if(gi(c))return[`${n}// ${i}: ${N(d)}`,`${n}page = agent.agentServices.validatePage(page);`,...V.map(G=>`${n}${G}`)];let w=JSON.stringify(d),re=V.map(G=>`${n} ${G}`),X=mi(c),ye=a?`'${a}'`:"undefined";return[`${n}// ${i}: ${N(d)}`,`${n}page = agent.agentServices.validatePage(page);`,`${n}await agent.step(page, async () => {`,...re,`${n}}, ${w}, '${i}', ${ye}, ${X});`]}function hr(e,t,i,r){let n=" ".repeat(t),o=[];e.description&&e.description.trim()&&o.push(`${n}// Step: ${N(e.description)}`);let a=A(e.statements,t,r,i);return o.push(...a),o}function pr(e,t,i,r){let n=" ".repeat(t),o=[];if(o.push(`${n}// ${i}: Conditional check`),e.condition.type==="JS_CODE")o.push(`${n}if (${e.condition.expression}) {`);else{o.push(`${n}// AI Condition: ${N(e.condition.expression)}`);let s=JSON.stringify(e.condition.expression);o.push(`${n}if (await agent.evaluate(page, ${s}, "${i}")) {`)}let a=A(e.then,t+1,r,`${i}.then`);if(o.push(...a),e.else&&e.else.length>0){o.push(`${n}} else {`);let s=A(e.else,t+1,r,`${i}.else`);o.push(...s)}return o.push(`${n}}`),o}function dr(e,t,i,r){let n=" ".repeat(t),o=[];o.push(`${n}// ${i}: Loop`);let a=e.timeout_ms??de,s=a/1e3,l=e.timeout_ms?`While loop exceeded timeout of ${s}s`:`While loop exceeded default timeout of ${s}s`,c=`loop_${i.replace(/\./g,"_")}`;if(o.push(`${n}const ${c}_start = Date.now();`),o.push(`${n}const ${c}_timeout = ${a};`),o.push(`${n}const ${c}_check = () => {`),o.push(`${n} if (Date.now() - ${c}_start > ${c}_timeout) {`),o.push(`${n} throw new Error('${l}');`),o.push(`${n} }`),o.push(`${n} return true;`),o.push(`${n}};`),e.condition.type==="JS_CODE")o.push(`${n}while (${c}_check() && (${e.condition.expression})) {`);else{o.push(`${n}// AI Loop Condition: ${N(e.condition.expression)}`);let d=JSON.stringify(e.condition.expression);o.push(`${n}while (${c}_check() && await agent.evaluate(page, ${d}, "${i}")) {`)}let u=A(e.body,t+1,r,`${i}.body`);return o.push(...u),o.push(`${n}}`),o}var yi={name:"shiplightai",version:"0.1.
|
|
17
|
+
`);for(let n of r)i.push(` ${n}`);return i.push("}"),i});p("function",(e,t,i)=>{let r=e.action_data?.kwargs||{},n=r.functionName;if(n&&n.includes("#")){let[a,s]=n.split("#");if(a&&s){let l=a.replace(/\.(ts|js|mjs)$/,""),c=`import { ${s} } from '${l}';`;i?.imports?.add(c);let u={...r,functionName:s},d=wi(u);return d?[d.endsWith(";")?d:`${d};`]:["// Skipping function: invalid export pattern"]}}let o=wi(r);return o?[o.endsWith(";")?o:`${o};`]:["// Skipping function: missing functionName"]});p("generate_2fa_code",e=>{let t=e.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(t)} } },`,"});"]});p("upload_file",e=>{let t=e.action_data?.kwargs||{},i=[],r={};return t.paths?r.paths=t.paths:t.path&&(r.path=t.path),t.use_file_input&&(r.use_file_input=!0),i.push(`action_data: { kwargs: ${JSON.stringify(r)} }`),e.locator?i.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&i.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&i.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("upload_file", page, {',...i.map(n=>` ${n},`),"});"]});p("wait_for_download_complete",e=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${e.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);p("switch_tab",e=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${e.action_data?.kwargs?.page_id??0} } },`,"});"]);p("close_tab",e=>{let t=e.action_data?.kwargs?.page_id;return t=t??e.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${t} } },`,"});"]});p("set_date_for_native_date_picker",e=>{let t=e.action_data?.kwargs?.date??"",i=[];return i.push(`action_data: { kwargs: { date: ${JSON.stringify(t)} } }`),e.locator?i.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&i.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&i.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...i.map(r=>` ${r},`),"});"]});p("done",()=>["// Done - no action needed"]);function wi(e){let t=e.functionName;if(!t)return null;let i={},r=e.parameterNames||[],n=e.parameterValues||e.args||[];if(r.forEach((l,c)=>{c<n.length&&(i[l]=n[c])}),Object.keys(i).length===0)return`await ${t}()`;let o=["page","testContext","request","agentServices"],a=["undefined","null","true","false"],s=Object.entries(i).map(([l,c])=>{let u=String(c);return c==null?"undefined":o.includes(l)&&o.includes(u)||a.includes(u)||/^-?\d+(\.\d+)?$/.test(u)?u:u.startsWith("$")?`agent.agentServices.readVariable('${u.substring(1)}')`:`"${u}"`});return`await ${t}(${s.join(", ")})`}function A(e,t,i,r="main"){let n=[];for(let o=0;o<e.length;o++){let a=e[o],s=`${r}.${o}`,l=cr(a,t,s,i);l.length>0&&(n.push(...l),o<e.length-1&&n.push(""))}return n}function cr(e,t,i,r){let n=" ".repeat(t);switch(e.type){case"DRAFT":return lr(e,t,i);case"ACTION":return ur(e,t,i,r);case"STEP":return hr(e,t,i,r);case"IF_ELSE":return pr(e,t,i,r);case"WHILE_LOOP":return dr(e,t,i,r);default:return[`${n}// Unknown statement type: ${e.type}`]}}function lr(e,t,i){let r=" ".repeat(t),n=e.description?.trim()||"";if(!n)return[`${r}// ${i}: Skipping - no description`];let o=JSON.stringify(n);return[`${r}// ${i}: ${N(n)}`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.run(page, ${o}, '${i}');`]}function ur(e,t,i,r){let n=" ".repeat(t),o=e.description,a=e.uid,l=r.actionEntityStore?.entries[e.uid]?.action_entity??e.action_entity;if(!l){if(!o)return[`${n}// ${i}: Skipping - no description`];let G=JSON.stringify(o),f=!!e.use_pure_vision;return[`${n}// ${i}: ${N(o)}`,`${n}page = agent.agentServices.validatePage(page);`,`${n}await agent.execute(page, ${G}, '${i}', ${f});`]}let c=e.locator?{...l,locator:e.locator}:l;o&&o!==c.action_description&&(c={...c,action_description:o});let u=c.action_data?.action_name||"",d=c.action_description||"",g=_i(u);if(!g)return[`${n}// ${i}: Unknown action: ${u}`];let _={imports:r.imports},V=g(c,i,_);if(gi(c))return[`${n}// ${i}: ${N(d)}`,`${n}page = agent.agentServices.validatePage(page);`,...V.map(G=>`${n}${G}`)];let w=JSON.stringify(d),re=V.map(G=>`${n} ${G}`),X=mi(c),ye=a?`'${a}'`:"undefined";return[`${n}// ${i}: ${N(d)}`,`${n}page = agent.agentServices.validatePage(page);`,`${n}await agent.step(page, async () => {`,...re,`${n}}, ${w}, '${i}', ${ye}, ${X});`]}function hr(e,t,i,r){let n=" ".repeat(t),o=[];e.description&&e.description.trim()&&o.push(`${n}// Step: ${N(e.description)}`);let a=A(e.statements,t,r,i);return o.push(...a),o}function pr(e,t,i,r){let n=" ".repeat(t),o=[];if(o.push(`${n}// ${i}: Conditional check`),e.condition.type==="JS_CODE")o.push(`${n}if (${e.condition.expression}) {`);else{o.push(`${n}// AI Condition: ${N(e.condition.expression)}`);let s=JSON.stringify(e.condition.expression);o.push(`${n}if (await agent.evaluate(page, ${s}, "${i}")) {`)}let a=A(e.then,t+1,r,`${i}.then`);if(o.push(...a),e.else&&e.else.length>0){o.push(`${n}} else {`);let s=A(e.else,t+1,r,`${i}.else`);o.push(...s)}return o.push(`${n}}`),o}function dr(e,t,i,r){let n=" ".repeat(t),o=[];o.push(`${n}// ${i}: Loop`);let a=e.timeout_ms??de,s=a/1e3,l=e.timeout_ms?`While loop exceeded timeout of ${s}s`:`While loop exceeded default timeout of ${s}s`,c=`loop_${i.replace(/\./g,"_")}`;if(o.push(`${n}const ${c}_start = Date.now();`),o.push(`${n}const ${c}_timeout = ${a};`),o.push(`${n}const ${c}_check = () => {`),o.push(`${n} if (Date.now() - ${c}_start > ${c}_timeout) {`),o.push(`${n} throw new Error('${l}');`),o.push(`${n} }`),o.push(`${n} return true;`),o.push(`${n}};`),e.condition.type==="JS_CODE")o.push(`${n}while (${c}_check() && (${e.condition.expression})) {`);else{o.push(`${n}// AI Loop Condition: ${N(e.condition.expression)}`);let d=JSON.stringify(e.condition.expression);o.push(`${n}while (${c}_check() && await agent.evaluate(page, ${d}, "${i}")) {`)}let u=A(e.body,t+1,r,`${i}.body`);return o.push(...u),o.push(`${n}}`),o}var yi={name:"shiplightai",version:"0.1.8",type:"module",description:"Shiplight CLI for running and debugging .test.yaml files",main:"dist/index.js",types:"dist/index.d.ts",bin:{shiplight:"dist/cli.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/cjs/index.cjs",default:"./dist/index.js"},"./fixture":{types:"./dist/fixture.d.ts",import:"./dist/fixture.js",require:"./dist/cjs/fixture.cjs",default:"./dist/fixture.js"}},files:["dist","README.md"],publishConfig:{registry:"https://registry.npmjs.org",access:"public"},scripts:{build:"tsup","build:cli":"tsup",clean:"rm -rf dist",dev:"tsup --watch",test:"playwright test",typecheck:"tsc --noEmit"},dependencies:{"@babel/plugin-transform-typescript":"^7.27.0","@babel/preset-env":"^7.26.9","@babel/preset-typescript":"^7.27.0","@anthropic-ai/claude-agent-sdk":"^0.1.72","@modelcontextprotocol/sdk":"^0.5.0",axios:"^1.6.0",dotenv:"^16.0.3",express:"^4.21.0",glob:"^13.0.0",open:"^10.1.0",sharp:"^0.34.5",uuid:"^11.1.0",yaml:"^2.8.0",zod:"^3.22.0","zod-to-json-schema":"^3.24.6"},devDependencies:{"@playwright/test":"1.55.0","@shiplightai/sdk-pro":"workspace:*","@types/express":"^4.17.21","@types/node":"^24.0.0",copilot3:"workspace:*","mcp-tools":"workspace:*","sdk-core":"workspace:*","sdk-internal":"workspace:*","shiplight-types":"workspace:*",tsup:"^8.3.5",typescript:"5.5.4","web-session":"workspace:*"},peerDependencies:{"@playwright/test":">=1.40.0","@shiplightai/sdk-pro":">=0.2.0"},engines:{node:">=22.0.0"},keywords:["playwright","yaml","testing","automation","ai","shiplight","mcp"],author:"Shiplight",license:"MIT"};var we=yi.version;function Ti(e,t){let i=[];i.push(`// @generated by shiplightai v${we}`),i.push(...gr()),i.push(""),t?.use&&Object.keys(t.use).length>0&&(i.push(`test.use(${JSON.stringify(t.use,null,2)});`),i.push(""));let r=t?.testName||e.goal||"Generated test",n=t?.tags&&t.tags.length>0?t.tags.map(c=>`@${c}`).join(" ")+" ":"";i.push(`test('${n}${me(r)}', async ({ page, agent }) => {`);let o=t?.startingUrl||e.url;if(o){let c;try{c=new URL(o).pathname}catch{c=o}i.push(` await page.goto('${me(c)}', { waitUntil: 'domcontentloaded' });`),i.push("")}let a=new Set,s={imports:a};if(e.teardown&&e.teardown.length>0){if(i.push(" try {"),e.statements&&e.statements.length>0){i.push(" // Test steps");let u=A(e.statements,2,s);i.push(...u)}i.push(" } finally {"),i.push(" // Teardown");let c=A(e.teardown,2,s,"teardown");i.push(...c),i.push(" }")}else if(e.statements&&e.statements.length>0){i.push(" // Test steps");let c=A(e.statements,1,s);i.push(...c)}if(i.push("});"),a.size>0){let c=0;for(let d=0;d<i.length;d++)i[d].startsWith("import ")&&(c=d+1);let u=Array.from(a);i.splice(c,0,...u)}return i.join(`
|
|
18
18
|
`)}function gr(){return["import { test, expect } from 'shiplightai/fixture';"]}function bi(e){try{return(0,v.statSync)(e).mtimeMs}catch{return 0}}var mr=`// @generated by shiplightai v${we}`;function wr(e,t){if(!(0,v.existsSync)(e)||(0,v.readFileSync)(e,"utf-8").split(`
|
|
19
19
|
`,1)[0]!==mr)return!1;let r=bi(e);for(let n of t)if(bi(n)>r)return!1;return!0}function Pi(e){let t=(0,ki.globSync)("**/*.test.yaml",{cwd:e.cwd,ignore:["**/node_modules/**"]}),i=[];for(let r of t){let n=(0,Mi.resolve)(e.cwd,r),o=n.replace(/\.test\.yaml$/,".yaml.spec.ts"),a=(0,v.readFileSync)(n,"utf-8");try{let{testFlow:s,name:l,tags:c,use:u,referencedTemplatePaths:d}=fi(a,n);if(wr(o,[n,...d]))continue;let g=Ti(s,{testName:l,tags:c,use:u});(0,v.writeFileSync)(o,g)}catch(s){console.error(`[shiplight] Failed to transpile ${r}:`,s),i.push({file:r,error:s})}}if(i.length>0)throw new Error(`[shiplight] Transpilation failed for ${i.length} file(s):
|
|
20
20
|
`+i.map(r=>` - ${r.file}`).join(`
|
package/dist/cli.js
CHANGED
|
@@ -4868,9 +4868,9 @@ Workflow: get_dom \u2192 act \u2192 get_dom \u2192 act \u2192 ... until done
|
|
|
4868
4868
|
act returns: { success, actions: [{ action_entity, success, error? }] }
|
|
4869
4869
|
|
|
4870
4870
|
**Action parameters:** See resource \`shiplight://schemas/action-entity\`
|
|
4871
|
-
`}}});var
|
|
4871
|
+
`}}});var dO,Lle=Q(()=>{"use strict";dO=["click","double_click","right_click","hover","input_text","clear_input","press","send_keys_on_element","select_dropdown_option","get_dropdown_options","set_date_for_native_date_picker","scroll","scroll_to_text","scroll_on_element","go_to_url","go_back","reload_page","switch_tab","close_tab","wait","wait_for_page_ready","wait_for_download_complete","upload_file","save_variable","verify","ai_extract","ai_wait_until","generate_2fa_code"]});import{zodToJsonSchema as gUn}from"zod-to-json-schema";function EUn(e,t){let r=[];r.push(`## Supported Actions
|
|
4872
4872
|
`);for(let n of t){let i=e.get(n);if(!i)continue;let s=gUn(i.schema,{$refStrategy:"none"});r.push(`#### ${i.name}`),r.push(i.description),r.push("```json"),r.push(JSON.stringify(s,null,2)),r.push("```\n")}return r.join(`
|
|
4873
|
-
`)}function
|
|
4873
|
+
`)}function aRt(){return`# TestFlow JSON Schema v1.2.0
|
|
4874
4874
|
|
|
4875
4875
|
## Overview
|
|
4876
4876
|
|
|
@@ -5010,7 +5010,7 @@ interface WhileLoop {
|
|
|
5010
5010
|
2. **STEP Usage**: Only wrap 2+ related actions. Single actions should be ACTION at top level.
|
|
5011
5011
|
3. **Verification**: Use \`action_name: "verify"\` with \`kwargs: { statement: "..." }\` \u2014 avoid vague "Verify X works"
|
|
5012
5012
|
4. **YAML**: Cloud tools (\`save_test_case\`, \`get_test_case\`) accept YAML strings directly. Use \`output_format: "yaml"\` for YAML output.
|
|
5013
|
-
`}function
|
|
5013
|
+
`}function uRt(){return`# TestFlow YAML Format v1.2.0
|
|
5014
5014
|
|
|
5015
5015
|
## Overview
|
|
5016
5016
|
|
|
@@ -5358,7 +5358,7 @@ statements:
|
|
|
5358
5358
|
teardown:
|
|
5359
5359
|
- Cancel the order if still pending
|
|
5360
5360
|
\`\`\`
|
|
5361
|
-
`}async function
|
|
5361
|
+
`}async function lRt(){await CMe();let e=bMe();return`# ActionEntity Schema & Action Parameters
|
|
5362
5362
|
|
|
5363
5363
|
## Overview
|
|
5364
5364
|
|
|
@@ -5419,7 +5419,7 @@ ${EUn(e,dO)}
|
|
|
5419
5419
|
\`\`\`json
|
|
5420
5420
|
{"verify": {"statement": "The success message is displayed", "description": "Verify submission succeeded"}}
|
|
5421
5421
|
\`\`\`
|
|
5422
|
-
`}function UMe(){return aRt}async function qMe(e){switch(e){case"shiplight://schemas/testflow-json-v1.2.0":return uRt();case"shiplight://schemas/testflow-yaml-v1.2.0":return lRt();case"shiplight://schemas/action-entity":return await cRt();default:return}}var aRt,dRt=Q(()=>{"use strict";Lle();Ff();aRt=[{uri:"shiplight://schemas/testflow-json-v1.2.0",name:"TestFlow JSON Schema v1.2.0",description:"JSON schema for TestFlow format used by cloud API tools (save_test_case, get_test_case)",mimeType:"text/markdown"},{uri:"shiplight://schemas/testflow-yaml-v1.2.0",name:"TestFlow YAML Format v1.2.0",description:"YAML format for local .test.yaml files used by shiplightai \u2014 includes templates, variables, use block, and Playwright integration",mimeType:"text/markdown"},{uri:"shiplight://schemas/action-entity",name:"ActionEntity Schema & Action Parameters",description:"Detailed parameter documentation for supported browser actions",mimeType:"text/markdown"}]});var fRt=F((Xjo,pRt)=>{"use strict";pRt.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var jMe=F((Zjo,mRt)=>{"use strict";var JY=fRt(),hRt={};for(let e of Object.keys(JY))hRt[JY[e]]=e;var zn={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};mRt.exports=zn;for(let e of Object.keys(zn)){if(!("channels"in zn[e]))throw new Error("missing channels property: "+e);if(!("labels"in zn[e]))throw new Error("missing channel labels property: "+e);if(zn[e].labels.length!==zn[e].channels)throw new Error("channel and label counts mismatch: "+e);let{channels:t,labels:r}=zn[e];delete zn[e].channels,delete zn[e].labels,Object.defineProperty(zn[e],"channels",{value:t}),Object.defineProperty(zn[e],"labels",{value:r})}zn.rgb.hsl=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.min(t,r,n),s=Math.max(t,r,n),o=s-i,a,u;s===i?a=0:t===s?a=(r-n)/o:r===s?a=2+(n-t)/o:n===s&&(a=4+(t-r)/o),a=Math.min(a*60,360),a<0&&(a+=360);let l=(i+s)/2;return s===i?u=0:l<=.5?u=o/(s+i):u=o/(2-s-i),[a,u*100,l*100]};zn.rgb.hsv=function(e){let t,r,n,i,s,o=e[0]/255,a=e[1]/255,u=e[2]/255,l=Math.max(o,a,u),c=l-Math.min(o,a,u),d=function(p){return(l-p)/6/c+1/2};return c===0?(i=0,s=0):(s=c/l,t=d(o),r=d(a),n=d(u),o===l?i=n-r:a===l?i=1/3+t-n:u===l&&(i=2/3+r-t),i<0?i+=1:i>1&&(i-=1)),[i*360,s*100,l*100]};zn.rgb.hwb=function(e){let t=e[0],r=e[1],n=e[2],i=zn.rgb.hsl(e)[0],s=1/255*Math.min(t,Math.min(r,n));return n=1-1/255*Math.max(t,Math.max(r,n)),[i,s*100,n*100]};zn.rgb.cmyk=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.min(1-t,1-r,1-n),s=(1-t-i)/(1-i)||0,o=(1-r-i)/(1-i)||0,a=(1-n-i)/(1-i)||0;return[s*100,o*100,a*100,i*100]};function yUn(e,t){return(e[0]-t[0])**2+(e[1]-t[1])**2+(e[2]-t[2])**2}zn.rgb.keyword=function(e){let t=hRt[e];if(t)return t;let r=1/0,n;for(let i of Object.keys(JY)){let s=JY[i],o=yUn(e,s);o<r&&(r=o,n=i)}return n};zn.keyword.rgb=function(e){return JY[e]};zn.rgb.xyz=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255;t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92;let i=t*.4124+r*.3576+n*.1805,s=t*.2126+r*.7152+n*.0722,o=t*.0193+r*.1192+n*.9505;return[i*100,s*100,o*100]};zn.rgb.lab=function(e){let t=zn.rgb.xyz(e),r=t[0],n=t[1],i=t[2];r/=95.047,n/=100,i/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let s=116*n-16,o=500*(r-n),a=200*(n-i);return[s,o,a]};zn.hsl.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,i,s,o;if(r===0)return o=n*255,[o,o,o];n<.5?i=n*(1+r):i=n+r-n*r;let a=2*n-i,u=[0,0,0];for(let l=0;l<3;l++)s=t+1/3*-(l-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(i-a)*6*s:2*s<1?o=i:3*s<2?o=a+(i-a)*(2/3-s)*6:o=a,u[l]=o*255;return u};zn.hsl.hsv=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,i=r,s=Math.max(n,.01);n*=2,r*=n<=1?n:2-n,i*=s<=1?s:2-s;let o=(n+r)/2,a=n===0?2*i/(s+i):2*r/(n+r);return[t,a*100,o*100]};zn.hsv.rgb=function(e){let t=e[0]/60,r=e[1]/100,n=e[2]/100,i=Math.floor(t)%6,s=t-Math.floor(t),o=255*n*(1-r),a=255*n*(1-r*s),u=255*n*(1-r*(1-s));switch(n*=255,i){case 0:return[n,u,o];case 1:return[a,n,o];case 2:return[o,n,u];case 3:return[o,a,n];case 4:return[u,o,n];case 5:return[n,o,a]}};zn.hsv.hsl=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,i=Math.max(n,.01),s,o;o=(2-r)*n;let a=(2-r)*i;return s=r*i,s/=a<=1?a:2-a,s=s||0,o/=2,[t,s*100,o*100]};zn.hwb.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,i=r+n,s;i>1&&(r/=i,n/=i);let o=Math.floor(6*t),a=1-n;s=6*t-o,(o&1)!==0&&(s=1-s);let u=r+s*(a-r),l,c,d;switch(o){default:case 6:case 0:l=a,c=u,d=r;break;case 1:l=u,c=a,d=r;break;case 2:l=r,c=a,d=u;break;case 3:l=r,c=u,d=a;break;case 4:l=u,c=r,d=a;break;case 5:l=a,c=r,d=u;break}return[l*255,c*255,d*255]};zn.cmyk.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,i=e[3]/100,s=1-Math.min(1,t*(1-i)+i),o=1-Math.min(1,r*(1-i)+i),a=1-Math.min(1,n*(1-i)+i);return[s*255,o*255,a*255]};zn.xyz.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,i,s,o;return i=t*3.2406+r*-1.5372+n*-.4986,s=t*-.9689+r*1.8758+n*.0415,o=t*.0557+r*-.204+n*1.057,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,i=Math.min(Math.max(0,i),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[i*255,s*255,o*255]};zn.xyz.lab=function(e){let t=e[0],r=e[1],n=e[2];t/=95.047,r/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let i=116*r-16,s=500*(t-r),o=200*(r-n);return[i,s,o]};zn.lab.xyz=function(e){let t=e[0],r=e[1],n=e[2],i,s,o;s=(t+16)/116,i=r/500+s,o=s-n/200;let a=s**3,u=i**3,l=o**3;return s=a>.008856?a:(s-16/116)/7.787,i=u>.008856?u:(i-16/116)/7.787,o=l>.008856?l:(o-16/116)/7.787,i*=95.047,s*=100,o*=108.883,[i,s,o]};zn.lab.lch=function(e){let t=e[0],r=e[1],n=e[2],i;i=Math.atan2(n,r)*360/2/Math.PI,i<0&&(i+=360);let o=Math.sqrt(r*r+n*n);return[t,o,i]};zn.lch.lab=function(e){let t=e[0],r=e[1],i=e[2]/360*2*Math.PI,s=r*Math.cos(i),o=r*Math.sin(i);return[t,s,o]};zn.rgb.ansi16=function(e,t=null){let[r,n,i]=e,s=t===null?zn.rgb.hsv(e)[2]:t;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(r/255));return s===2&&(o+=60),o};zn.hsv.ansi16=function(e){return zn.rgb.ansi16(zn.hsv.rgb(e),e[2])};zn.rgb.ansi256=function(e){let t=e[0],r=e[1],n=e[2];return t===r&&r===n?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)};zn.ansi16.rgb=function(e){let t=e%10;if(t===0||t===7)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];let r=(~~(e>50)+1)*.5,n=(t&1)*r*255,i=(t>>1&1)*r*255,s=(t>>2&1)*r*255;return[n,i,s]};zn.ansi256.rgb=function(e){if(e>=232){let s=(e-232)*10+8;return[s,s,s]}e-=16;let t,r=Math.floor(e/36)/5*255,n=Math.floor((t=e%36)/6)/5*255,i=t%6/5*255;return[r,n,i]};zn.rgb.hex=function(e){let r=(((Math.round(e[0])&255)<<16)+((Math.round(e[1])&255)<<8)+(Math.round(e[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};zn.hex.rgb=function(e){let t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let r=t[0];t[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let n=parseInt(r,16),i=n>>16&255,s=n>>8&255,o=n&255;return[i,s,o]};zn.rgb.hcg=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.max(Math.max(t,r),n),s=Math.min(Math.min(t,r),n),o=i-s,a,u;return o<1?a=s/(1-o):a=0,o<=0?u=0:i===t?u=(r-n)/o%6:i===r?u=2+(n-t)/o:u=4+(t-r)/o,u/=6,u%=1,[u*360,o*100,a*100]};zn.hsl.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=r<.5?2*t*r:2*t*(1-r),i=0;return n<1&&(i=(r-.5*n)/(1-n)),[e[0],n*100,i*100]};zn.hsv.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=t*r,i=0;return n<1&&(i=(r-n)/(1-n)),[e[0],n*100,i*100]};zn.hcg.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100;if(r===0)return[n*255,n*255,n*255];let i=[0,0,0],s=t%1*6,o=s%1,a=1-o,u=0;switch(Math.floor(s)){case 0:i[0]=1,i[1]=o,i[2]=0;break;case 1:i[0]=a,i[1]=1,i[2]=0;break;case 2:i[0]=0,i[1]=1,i[2]=o;break;case 3:i[0]=0,i[1]=a,i[2]=1;break;case 4:i[0]=o,i[1]=0,i[2]=1;break;default:i[0]=1,i[1]=0,i[2]=a}return u=(1-r)*n,[(r*i[0]+u)*255,(r*i[1]+u)*255,(r*i[2]+u)*255]};zn.hcg.hsv=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t),i=0;return n>0&&(i=t/n),[e[0],i*100,n*100]};zn.hcg.hsl=function(e){let t=e[1]/100,n=e[2]/100*(1-t)+.5*t,i=0;return n>0&&n<.5?i=t/(2*n):n>=.5&&n<1&&(i=t/(2*(1-n))),[e[0],i*100,n*100]};zn.hcg.hwb=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t);return[e[0],(n-t)*100,(1-n)*100]};zn.hwb.hcg=function(e){let t=e[1]/100,n=1-e[2]/100,i=n-t,s=0;return i<1&&(s=(n-i)/(1-i)),[e[0],i*100,s*100]};zn.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]};zn.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]};zn.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]};zn.gray.hsl=function(e){return[0,0,e[0]]};zn.gray.hsv=zn.gray.hsl;zn.gray.hwb=function(e){return[0,100,e[0]]};zn.gray.cmyk=function(e){return[0,0,0,e[0]]};zn.gray.lab=function(e){return[e[0],0,0]};zn.gray.hex=function(e){let t=Math.round(e[0]/100*255)&255,n=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(n.length)+n};zn.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}});var gRt=F((eHo,ARt)=>{"use strict";var Qle=jMe();function CUn(){let e={},t=Object.keys(Qle);for(let r=t.length,n=0;n<r;n++)e[t[n]]={distance:-1,parent:null};return e}function bUn(e){let t=CUn(),r=[e];for(t[e].distance=0;r.length;){let n=r.pop(),i=Object.keys(Qle[n]);for(let s=i.length,o=0;o<s;o++){let a=i[o],u=t[a];u.distance===-1&&(u.distance=t[n].distance+1,u.parent=n,r.unshift(a))}}return t}function wUn(e,t){return function(r){return t(e(r))}}function vUn(e,t){let r=[t[e].parent,e],n=Qle[t[e].parent][e],i=t[e].parent;for(;t[i].parent;)r.unshift(t[i].parent),n=wUn(Qle[t[i].parent][i],n),i=t[i].parent;return n.conversion=r,n}ARt.exports=function(e){let t=bUn(e),r={},n=Object.keys(t);for(let i=n.length,s=0;s<i;s++){let o=n[s];t[o].parent!==null&&(r[o]=vUn(o,t))}return r}});var yRt=F((tHo,ERt)=>{"use strict";var HMe=jMe(),xUn=gRt(),pO={},BUn=Object.keys(HMe);function DUn(e){let t=function(...r){let n=r[0];return n==null?n:(n.length>1&&(r=n),e(r))};return"conversion"in e&&(t.conversion=e.conversion),t}function SUn(e){let t=function(...r){let n=r[0];if(n==null)return n;n.length>1&&(r=n);let i=e(r);if(typeof i=="object")for(let s=i.length,o=0;o<s;o++)i[o]=Math.round(i[o]);return i};return"conversion"in e&&(t.conversion=e.conversion),t}BUn.forEach(e=>{pO[e]={},Object.defineProperty(pO[e],"channels",{value:HMe[e].channels}),Object.defineProperty(pO[e],"labels",{value:HMe[e].labels});let t=xUn(e);Object.keys(t).forEach(n=>{let i=t[n];pO[e][n]=SUn(i),pO[e][n].raw=DUn(i)})});ERt.exports=pO});var BRt=F((rHo,xRt)=>{"use strict";var CRt=(e,t)=>(...r)=>`\x1B[${e(...r)+t}m`,bRt=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};5;${n}m`},wRt=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};2;${n[0]};${n[1]};${n[2]}m`},Ule=e=>e,vRt=(e,t,r)=>[e,t,r],fO=(e,t,r)=>{Object.defineProperty(e,t,{get:()=>{let n=r();return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0}),n},enumerable:!0,configurable:!0})},$Me,hO=(e,t,r,n)=>{$Me===void 0&&($Me=yRt());let i=n?10:0,s={};for(let[o,a]of Object.entries($Me)){let u=o==="ansi16"?"ansi":o;o===t?s[u]=e(r,i):typeof a=="object"&&(s[u]=e(a[t],i))}return s};function _Un(){let e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(let[r,n]of Object.entries(t)){for(let[i,s]of Object.entries(n))t[i]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},n[i]=t[i],e.set(s[0],s[1]);Object.defineProperty(t,r,{value:n,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="\x1B[39m",t.bgColor.close="\x1B[49m",fO(t.color,"ansi",()=>hO(CRt,"ansi16",Ule,!1)),fO(t.color,"ansi256",()=>hO(bRt,"ansi256",Ule,!1)),fO(t.color,"ansi16m",()=>hO(wRt,"rgb",vRt,!1)),fO(t.bgColor,"ansi",()=>hO(CRt,"ansi16",Ule,!0)),fO(t.bgColor,"ansi256",()=>hO(bRt,"ansi256",Ule,!0)),fO(t.bgColor,"ansi16m",()=>hO(wRt,"rgb",vRt,!0)),t}Object.defineProperty(xRt,"exports",{enumerable:!0,get:_Un})});var GMe=F((nHo,DRt)=>{"use strict";DRt.exports=(e,t=process.argv)=>{let r=e.startsWith("-")?"":e.length===1?"-":"--",n=t.indexOf(r+e),i=t.indexOf("--");return n!==-1&&(i===-1||n<i)}});var qle=F((iHo,_Rt)=>{"use strict";var IUn=ne("os"),SRt=ne("tty"),vy=GMe(),{env:gh}=process,Px;vy("no-color")||vy("no-colors")||vy("color=false")||vy("color=never")?Px=0:(vy("color")||vy("colors")||vy("color=true")||vy("color=always"))&&(Px=1);"FORCE_COLOR"in gh&&(gh.FORCE_COLOR==="true"?Px=1:gh.FORCE_COLOR==="false"?Px=0:Px=gh.FORCE_COLOR.length===0?1:Math.min(parseInt(gh.FORCE_COLOR,10),3));function VMe(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function WMe(e,t){if(Px===0)return 0;if(vy("color=16m")||vy("color=full")||vy("color=truecolor"))return 3;if(vy("color=256"))return 2;if(e&&!t&&Px===void 0)return 0;let r=Px||0;if(gh.TERM==="dumb")return r;if(process.platform==="win32"){let n=IUn.release().split(".");return Number(n[0])>=10&&Number(n[2])>=10586?Number(n[2])>=14931?3:2:1}if("CI"in gh)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(n=>n in gh)||gh.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in gh)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(gh.TEAMCITY_VERSION)?1:0;if(gh.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in gh){let n=parseInt((gh.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(gh.TERM_PROGRAM){case"iTerm.app":return n>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(gh.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(gh.TERM)||"COLORTERM"in gh?1:r}function TUn(e){let t=WMe(e,e&&e.isTTY);return VMe(t)}_Rt.exports={supportsColor:TUn,stdout:VMe(WMe(!0,SRt.isatty(1))),stderr:VMe(WMe(!0,SRt.isatty(2)))}});var TRt=F((sHo,IRt)=>{"use strict";var FUn=(e,t,r)=>{let n=e.indexOf(t);if(n===-1)return e;let i=t.length,s=0,o="";do o+=e.substr(s,n-s)+t+r,s=n+i,n=e.indexOf(t,s);while(n!==-1);return o+=e.substr(s),o},kUn=(e,t,r,n)=>{let i=0,s="";do{let o=e[n-1]==="\r";s+=e.substr(i,(o?n-1:n)-i)+t+(o?`\r
|
|
5422
|
+
`}function QMe(){return oRt}async function UMe(e){switch(e){case"shiplight://schemas/testflow-json-v1.2.0":return aRt();case"shiplight://schemas/testflow-yaml-v1.2.0":return uRt();case"shiplight://schemas/action-entity":return await lRt();default:return}}var oRt,cRt=Q(()=>{"use strict";Lle();Ff();oRt=[{uri:"shiplight://schemas/testflow-json-v1.2.0",name:"TestFlow JSON Schema v1.2.0",description:"JSON schema for TestFlow format used by cloud API tools (save_test_case, get_test_case)",mimeType:"text/markdown"},{uri:"shiplight://schemas/testflow-yaml-v1.2.0",name:"TestFlow YAML Format v1.2.0",description:"YAML format for local .test.yaml files used by shiplightai \u2014 includes templates, variables, use block, and Playwright integration",mimeType:"text/markdown"},{uri:"shiplight://schemas/action-entity",name:"ActionEntity Schema & Action Parameters",description:"Detailed parameter documentation for supported browser actions",mimeType:"text/markdown"}]});var qMe,dRt=Q(()=>{"use strict";qMe=class{tools=new Map;registerAll(e,t){for(let r of e.toolDefinitions){let n=this.findMethodForTool(t,r.name);n&&this.tools.set(r.name,{definition:r,handler:t[n].bind(t)})}return this}registerTools(e,t,r){for(let n of r){let i=this.findDefinitionForMethod(e.toolDefinitions,n);i&&this.tools.set(i.name,{definition:i,handler:t[n].bind(t)})}return this}registerTool(e,t){return this.tools.set(e.name,{definition:e,handler:t}),this}build(){return{tools:Array.from(this.tools.values()).map(r=>r.definition),handleToolCall:async(r,n,i)=>{let s=this.tools.get(r);if(!s)throw new Error(`Unknown tool: ${r}`);return s.handler(n,i)}}}getRegisteredToolNames(){return Array.from(this.tools.keys())}hasToolRegistered(e){return this.tools.has(e)}findMethodForTool(e,t){let n={new_session:"newSession",save_storage_state:"saveStorageState",close_session:"closeSession",close_all:"closeAllSessions",get_session_state:"getCurrentState",navigate:"navigate",get_page_info:"getPageInfo",get_dom:"getDom",take_screenshot:"takeScreenshot",act:"act",get_locator:"getLocator",update_variables:"updateVariables",clear_execution_history:"clearExecutionHistory",get_browser_console_logs:"getConsoleLogs",get_browser_network_logs:"getNetworkLogs",clear_logs:"clearLogs",get_local_artifact:"getLocalArtifact",list_environments:"listEnvironments",list_test_accounts:"listTestAccounts",get_test_account:"getTestAccount",create_test_account:"createTestAccount",list_folders:"listFolders",create_folder:"createFolder",get_folder:"getFolder",get_test_case:"getTestCase",run_test_case:"runTestCase",save_test_case:"saveTestCase",run_test_flow:"runTestFlow",list_test_runs:"listTestRuns",get_test_run_details:"getTestRunDetails",get_test_case_result:"getTestCaseResult",get_test_case_result_steps:"getTestCaseResultSteps",get_step_artifacts:"getStepArtifacts",init_local_project:"initLocalProject",export_yaml_to_test:"exportYamlToTest"}[t];return n&&typeof e[n]=="function"?n:null}findDefinitionForMethod(e,t){let n={newSession:["new_session"],saveStorageState:["save_storage_state"],closeSession:["close_session"],closeAllSessions:["close_all"],getCurrentState:["get_session_state"],navigate:["navigate"],getPageInfo:["get_page_info"],getDom:["get_dom"],takeScreenshot:["take_screenshot"],act:["act"],getLocator:["get_locator"],updateVariables:["update_variables"],clearExecutionHistory:["clear_execution_history"],getConsoleLogs:["get_browser_console_logs"],getNetworkLogs:["get_browser_network_logs"],clearLogs:["clear_logs"],getLocalArtifact:["get_local_artifact"],listEnvironments:["list_environments"],listTestAccounts:["list_test_accounts"],getTestAccount:["get_test_account"],createTestAccount:["create_test_account"],listFolders:["list_folders"],createFolder:["create_folder"],getFolder:["get_folder"],getTestCase:["get_test_case"],runTestCase:["run_test_case"],saveTestCase:["save_test_case"],runTestFlow:["run_test_flow"],listTestRuns:["list_test_runs"],getTestRunDetails:["get_test_run_details"],getTestCaseResult:["get_test_case_result"],getTestCaseResultSteps:["get_test_case_result_steps"],getStepArtifacts:["get_step_artifacts"],initLocalProject:["init_local_project"],exportYamlToTest:["export_yaml_to_test"]}[t];if(!n)return null;for(let i of n){let s=e.find(o=>o.name===i);if(s)return s}return null}}});var fRt=F((Xjo,pRt)=>{"use strict";pRt.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var jMe=F((Zjo,mRt)=>{"use strict";var JY=fRt(),hRt={};for(let e of Object.keys(JY))hRt[JY[e]]=e;var zn={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};mRt.exports=zn;for(let e of Object.keys(zn)){if(!("channels"in zn[e]))throw new Error("missing channels property: "+e);if(!("labels"in zn[e]))throw new Error("missing channel labels property: "+e);if(zn[e].labels.length!==zn[e].channels)throw new Error("channel and label counts mismatch: "+e);let{channels:t,labels:r}=zn[e];delete zn[e].channels,delete zn[e].labels,Object.defineProperty(zn[e],"channels",{value:t}),Object.defineProperty(zn[e],"labels",{value:r})}zn.rgb.hsl=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.min(t,r,n),s=Math.max(t,r,n),o=s-i,a,u;s===i?a=0:t===s?a=(r-n)/o:r===s?a=2+(n-t)/o:n===s&&(a=4+(t-r)/o),a=Math.min(a*60,360),a<0&&(a+=360);let l=(i+s)/2;return s===i?u=0:l<=.5?u=o/(s+i):u=o/(2-s-i),[a,u*100,l*100]};zn.rgb.hsv=function(e){let t,r,n,i,s,o=e[0]/255,a=e[1]/255,u=e[2]/255,l=Math.max(o,a,u),c=l-Math.min(o,a,u),d=function(p){return(l-p)/6/c+1/2};return c===0?(i=0,s=0):(s=c/l,t=d(o),r=d(a),n=d(u),o===l?i=n-r:a===l?i=1/3+t-n:u===l&&(i=2/3+r-t),i<0?i+=1:i>1&&(i-=1)),[i*360,s*100,l*100]};zn.rgb.hwb=function(e){let t=e[0],r=e[1],n=e[2],i=zn.rgb.hsl(e)[0],s=1/255*Math.min(t,Math.min(r,n));return n=1-1/255*Math.max(t,Math.max(r,n)),[i,s*100,n*100]};zn.rgb.cmyk=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.min(1-t,1-r,1-n),s=(1-t-i)/(1-i)||0,o=(1-r-i)/(1-i)||0,a=(1-n-i)/(1-i)||0;return[s*100,o*100,a*100,i*100]};function yUn(e,t){return(e[0]-t[0])**2+(e[1]-t[1])**2+(e[2]-t[2])**2}zn.rgb.keyword=function(e){let t=hRt[e];if(t)return t;let r=1/0,n;for(let i of Object.keys(JY)){let s=JY[i],o=yUn(e,s);o<r&&(r=o,n=i)}return n};zn.keyword.rgb=function(e){return JY[e]};zn.rgb.xyz=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255;t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92;let i=t*.4124+r*.3576+n*.1805,s=t*.2126+r*.7152+n*.0722,o=t*.0193+r*.1192+n*.9505;return[i*100,s*100,o*100]};zn.rgb.lab=function(e){let t=zn.rgb.xyz(e),r=t[0],n=t[1],i=t[2];r/=95.047,n/=100,i/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let s=116*n-16,o=500*(r-n),a=200*(n-i);return[s,o,a]};zn.hsl.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,i,s,o;if(r===0)return o=n*255,[o,o,o];n<.5?i=n*(1+r):i=n+r-n*r;let a=2*n-i,u=[0,0,0];for(let l=0;l<3;l++)s=t+1/3*-(l-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(i-a)*6*s:2*s<1?o=i:3*s<2?o=a+(i-a)*(2/3-s)*6:o=a,u[l]=o*255;return u};zn.hsl.hsv=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,i=r,s=Math.max(n,.01);n*=2,r*=n<=1?n:2-n,i*=s<=1?s:2-s;let o=(n+r)/2,a=n===0?2*i/(s+i):2*r/(n+r);return[t,a*100,o*100]};zn.hsv.rgb=function(e){let t=e[0]/60,r=e[1]/100,n=e[2]/100,i=Math.floor(t)%6,s=t-Math.floor(t),o=255*n*(1-r),a=255*n*(1-r*s),u=255*n*(1-r*(1-s));switch(n*=255,i){case 0:return[n,u,o];case 1:return[a,n,o];case 2:return[o,n,u];case 3:return[o,a,n];case 4:return[u,o,n];case 5:return[n,o,a]}};zn.hsv.hsl=function(e){let t=e[0],r=e[1]/100,n=e[2]/100,i=Math.max(n,.01),s,o;o=(2-r)*n;let a=(2-r)*i;return s=r*i,s/=a<=1?a:2-a,s=s||0,o/=2,[t,s*100,o*100]};zn.hwb.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100,i=r+n,s;i>1&&(r/=i,n/=i);let o=Math.floor(6*t),a=1-n;s=6*t-o,(o&1)!==0&&(s=1-s);let u=r+s*(a-r),l,c,d;switch(o){default:case 6:case 0:l=a,c=u,d=r;break;case 1:l=u,c=a,d=r;break;case 2:l=r,c=a,d=u;break;case 3:l=r,c=u,d=a;break;case 4:l=u,c=r,d=a;break;case 5:l=a,c=r,d=u;break}return[l*255,c*255,d*255]};zn.cmyk.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,i=e[3]/100,s=1-Math.min(1,t*(1-i)+i),o=1-Math.min(1,r*(1-i)+i),a=1-Math.min(1,n*(1-i)+i);return[s*255,o*255,a*255]};zn.xyz.rgb=function(e){let t=e[0]/100,r=e[1]/100,n=e[2]/100,i,s,o;return i=t*3.2406+r*-1.5372+n*-.4986,s=t*-.9689+r*1.8758+n*.0415,o=t*.0557+r*-.204+n*1.057,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,i=Math.min(Math.max(0,i),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[i*255,s*255,o*255]};zn.xyz.lab=function(e){let t=e[0],r=e[1],n=e[2];t/=95.047,r/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let i=116*r-16,s=500*(t-r),o=200*(r-n);return[i,s,o]};zn.lab.xyz=function(e){let t=e[0],r=e[1],n=e[2],i,s,o;s=(t+16)/116,i=r/500+s,o=s-n/200;let a=s**3,u=i**3,l=o**3;return s=a>.008856?a:(s-16/116)/7.787,i=u>.008856?u:(i-16/116)/7.787,o=l>.008856?l:(o-16/116)/7.787,i*=95.047,s*=100,o*=108.883,[i,s,o]};zn.lab.lch=function(e){let t=e[0],r=e[1],n=e[2],i;i=Math.atan2(n,r)*360/2/Math.PI,i<0&&(i+=360);let o=Math.sqrt(r*r+n*n);return[t,o,i]};zn.lch.lab=function(e){let t=e[0],r=e[1],i=e[2]/360*2*Math.PI,s=r*Math.cos(i),o=r*Math.sin(i);return[t,s,o]};zn.rgb.ansi16=function(e,t=null){let[r,n,i]=e,s=t===null?zn.rgb.hsv(e)[2]:t;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(r/255));return s===2&&(o+=60),o};zn.hsv.ansi16=function(e){return zn.rgb.ansi16(zn.hsv.rgb(e),e[2])};zn.rgb.ansi256=function(e){let t=e[0],r=e[1],n=e[2];return t===r&&r===n?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)};zn.ansi16.rgb=function(e){let t=e%10;if(t===0||t===7)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];let r=(~~(e>50)+1)*.5,n=(t&1)*r*255,i=(t>>1&1)*r*255,s=(t>>2&1)*r*255;return[n,i,s]};zn.ansi256.rgb=function(e){if(e>=232){let s=(e-232)*10+8;return[s,s,s]}e-=16;let t,r=Math.floor(e/36)/5*255,n=Math.floor((t=e%36)/6)/5*255,i=t%6/5*255;return[r,n,i]};zn.rgb.hex=function(e){let r=(((Math.round(e[0])&255)<<16)+((Math.round(e[1])&255)<<8)+(Math.round(e[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};zn.hex.rgb=function(e){let t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let r=t[0];t[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let n=parseInt(r,16),i=n>>16&255,s=n>>8&255,o=n&255;return[i,s,o]};zn.rgb.hcg=function(e){let t=e[0]/255,r=e[1]/255,n=e[2]/255,i=Math.max(Math.max(t,r),n),s=Math.min(Math.min(t,r),n),o=i-s,a,u;return o<1?a=s/(1-o):a=0,o<=0?u=0:i===t?u=(r-n)/o%6:i===r?u=2+(n-t)/o:u=4+(t-r)/o,u/=6,u%=1,[u*360,o*100,a*100]};zn.hsl.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=r<.5?2*t*r:2*t*(1-r),i=0;return n<1&&(i=(r-.5*n)/(1-n)),[e[0],n*100,i*100]};zn.hsv.hcg=function(e){let t=e[1]/100,r=e[2]/100,n=t*r,i=0;return n<1&&(i=(r-n)/(1-n)),[e[0],n*100,i*100]};zn.hcg.rgb=function(e){let t=e[0]/360,r=e[1]/100,n=e[2]/100;if(r===0)return[n*255,n*255,n*255];let i=[0,0,0],s=t%1*6,o=s%1,a=1-o,u=0;switch(Math.floor(s)){case 0:i[0]=1,i[1]=o,i[2]=0;break;case 1:i[0]=a,i[1]=1,i[2]=0;break;case 2:i[0]=0,i[1]=1,i[2]=o;break;case 3:i[0]=0,i[1]=a,i[2]=1;break;case 4:i[0]=o,i[1]=0,i[2]=1;break;default:i[0]=1,i[1]=0,i[2]=a}return u=(1-r)*n,[(r*i[0]+u)*255,(r*i[1]+u)*255,(r*i[2]+u)*255]};zn.hcg.hsv=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t),i=0;return n>0&&(i=t/n),[e[0],i*100,n*100]};zn.hcg.hsl=function(e){let t=e[1]/100,n=e[2]/100*(1-t)+.5*t,i=0;return n>0&&n<.5?i=t/(2*n):n>=.5&&n<1&&(i=t/(2*(1-n))),[e[0],i*100,n*100]};zn.hcg.hwb=function(e){let t=e[1]/100,r=e[2]/100,n=t+r*(1-t);return[e[0],(n-t)*100,(1-n)*100]};zn.hwb.hcg=function(e){let t=e[1]/100,n=1-e[2]/100,i=n-t,s=0;return i<1&&(s=(n-i)/(1-i)),[e[0],i*100,s*100]};zn.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]};zn.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]};zn.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]};zn.gray.hsl=function(e){return[0,0,e[0]]};zn.gray.hsv=zn.gray.hsl;zn.gray.hwb=function(e){return[0,100,e[0]]};zn.gray.cmyk=function(e){return[0,0,0,e[0]]};zn.gray.lab=function(e){return[e[0],0,0]};zn.gray.hex=function(e){let t=Math.round(e[0]/100*255)&255,n=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(n.length)+n};zn.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}});var gRt=F((eHo,ARt)=>{"use strict";var Qle=jMe();function CUn(){let e={},t=Object.keys(Qle);for(let r=t.length,n=0;n<r;n++)e[t[n]]={distance:-1,parent:null};return e}function bUn(e){let t=CUn(),r=[e];for(t[e].distance=0;r.length;){let n=r.pop(),i=Object.keys(Qle[n]);for(let s=i.length,o=0;o<s;o++){let a=i[o],u=t[a];u.distance===-1&&(u.distance=t[n].distance+1,u.parent=n,r.unshift(a))}}return t}function wUn(e,t){return function(r){return t(e(r))}}function vUn(e,t){let r=[t[e].parent,e],n=Qle[t[e].parent][e],i=t[e].parent;for(;t[i].parent;)r.unshift(t[i].parent),n=wUn(Qle[t[i].parent][i],n),i=t[i].parent;return n.conversion=r,n}ARt.exports=function(e){let t=bUn(e),r={},n=Object.keys(t);for(let i=n.length,s=0;s<i;s++){let o=n[s];t[o].parent!==null&&(r[o]=vUn(o,t))}return r}});var yRt=F((tHo,ERt)=>{"use strict";var HMe=jMe(),xUn=gRt(),pO={},BUn=Object.keys(HMe);function DUn(e){let t=function(...r){let n=r[0];return n==null?n:(n.length>1&&(r=n),e(r))};return"conversion"in e&&(t.conversion=e.conversion),t}function SUn(e){let t=function(...r){let n=r[0];if(n==null)return n;n.length>1&&(r=n);let i=e(r);if(typeof i=="object")for(let s=i.length,o=0;o<s;o++)i[o]=Math.round(i[o]);return i};return"conversion"in e&&(t.conversion=e.conversion),t}BUn.forEach(e=>{pO[e]={},Object.defineProperty(pO[e],"channels",{value:HMe[e].channels}),Object.defineProperty(pO[e],"labels",{value:HMe[e].labels});let t=xUn(e);Object.keys(t).forEach(n=>{let i=t[n];pO[e][n]=SUn(i),pO[e][n].raw=DUn(i)})});ERt.exports=pO});var BRt=F((rHo,xRt)=>{"use strict";var CRt=(e,t)=>(...r)=>`\x1B[${e(...r)+t}m`,bRt=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};5;${n}m`},wRt=(e,t)=>(...r)=>{let n=e(...r);return`\x1B[${38+t};2;${n[0]};${n[1]};${n[2]}m`},Ule=e=>e,vRt=(e,t,r)=>[e,t,r],fO=(e,t,r)=>{Object.defineProperty(e,t,{get:()=>{let n=r();return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0}),n},enumerable:!0,configurable:!0})},$Me,hO=(e,t,r,n)=>{$Me===void 0&&($Me=yRt());let i=n?10:0,s={};for(let[o,a]of Object.entries($Me)){let u=o==="ansi16"?"ansi":o;o===t?s[u]=e(r,i):typeof a=="object"&&(s[u]=e(a[t],i))}return s};function _Un(){let e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(let[r,n]of Object.entries(t)){for(let[i,s]of Object.entries(n))t[i]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},n[i]=t[i],e.set(s[0],s[1]);Object.defineProperty(t,r,{value:n,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="\x1B[39m",t.bgColor.close="\x1B[49m",fO(t.color,"ansi",()=>hO(CRt,"ansi16",Ule,!1)),fO(t.color,"ansi256",()=>hO(bRt,"ansi256",Ule,!1)),fO(t.color,"ansi16m",()=>hO(wRt,"rgb",vRt,!1)),fO(t.bgColor,"ansi",()=>hO(CRt,"ansi16",Ule,!0)),fO(t.bgColor,"ansi256",()=>hO(bRt,"ansi256",Ule,!0)),fO(t.bgColor,"ansi16m",()=>hO(wRt,"rgb",vRt,!0)),t}Object.defineProperty(xRt,"exports",{enumerable:!0,get:_Un})});var GMe=F((nHo,DRt)=>{"use strict";DRt.exports=(e,t=process.argv)=>{let r=e.startsWith("-")?"":e.length===1?"-":"--",n=t.indexOf(r+e),i=t.indexOf("--");return n!==-1&&(i===-1||n<i)}});var qle=F((iHo,_Rt)=>{"use strict";var IUn=ne("os"),SRt=ne("tty"),vy=GMe(),{env:gh}=process,Px;vy("no-color")||vy("no-colors")||vy("color=false")||vy("color=never")?Px=0:(vy("color")||vy("colors")||vy("color=true")||vy("color=always"))&&(Px=1);"FORCE_COLOR"in gh&&(gh.FORCE_COLOR==="true"?Px=1:gh.FORCE_COLOR==="false"?Px=0:Px=gh.FORCE_COLOR.length===0?1:Math.min(parseInt(gh.FORCE_COLOR,10),3));function VMe(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function WMe(e,t){if(Px===0)return 0;if(vy("color=16m")||vy("color=full")||vy("color=truecolor"))return 3;if(vy("color=256"))return 2;if(e&&!t&&Px===void 0)return 0;let r=Px||0;if(gh.TERM==="dumb")return r;if(process.platform==="win32"){let n=IUn.release().split(".");return Number(n[0])>=10&&Number(n[2])>=10586?Number(n[2])>=14931?3:2:1}if("CI"in gh)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(n=>n in gh)||gh.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in gh)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(gh.TEAMCITY_VERSION)?1:0;if(gh.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in gh){let n=parseInt((gh.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(gh.TERM_PROGRAM){case"iTerm.app":return n>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(gh.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(gh.TERM)||"COLORTERM"in gh?1:r}function TUn(e){let t=WMe(e,e&&e.isTTY);return VMe(t)}_Rt.exports={supportsColor:TUn,stdout:VMe(WMe(!0,SRt.isatty(1))),stderr:VMe(WMe(!0,SRt.isatty(2)))}});var TRt=F((sHo,IRt)=>{"use strict";var FUn=(e,t,r)=>{let n=e.indexOf(t);if(n===-1)return e;let i=t.length,s=0,o="";do o+=e.substr(s,n-s)+t+r,s=n+i,n=e.indexOf(t,s);while(n!==-1);return o+=e.substr(s),o},kUn=(e,t,r,n)=>{let i=0,s="";do{let o=e[n-1]==="\r";s+=e.substr(i,(o?n-1:n)-i)+t+(o?`\r
|
|
5423
5423
|
`:`
|
|
5424
5424
|
`)+r,i=n+1,n=e.indexOf(`
|
|
5425
5425
|
`,i)}while(n!==-1);return s+=e.substr(i),s};IRt.exports={stringReplaceAll:FUn,stringEncaseCRLFWithFirstIndex:kUn}});var PRt=F((oHo,NRt)=>{"use strict";var RUn=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,FRt=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,NUn=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,PUn=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,OUn=new Map([["n",`
|
|
@@ -8088,7 +8088,7 @@ export default defineConfig({
|
|
|
8088
8088
|
});
|
|
8089
8089
|
`);let o=["node_modules/","test-results/","playwright-report/",".env",""].join(`
|
|
8090
8090
|
`);Kw.writeFileSync(u7.join(r,".gitignore"),o);let a=["# Shiplight API token (required) \u2014 get yours at https://app.shiplight.ai/settings/api-tokens","SHIPLIGHT_API_TOKEN=","","# AI model API keys (at least one required)","GOOGLE_API_KEY=","ANTHROPIC_API_KEY=","","# Optional: override the default AI model (default: gemini-2.5-pro)","# SHIPLIGHT_MODEL=gemini-2.5-pro","","# Optional: override starting URL for all tests","# PLAYWRIGHT_STARTING_URL=",""].join(`
|
|
8091
|
-
`);return Kw.writeFileSync(u7.join(r,".env.example"),a),Kw.writeFileSync(u7.join(n,".gitkeep"),""),JSON.stringify({success:!0,project_path:r,files_created:["package.json","playwright.config.ts",".gitignore",".env.example","tests/.gitkeep"],next_steps:["Copy .env.example to .env and set SHIPLIGHT_API_TOKEN (from https://app.shiplight.ai/settings/api-tokens) and at least one AI model API key","Run: npm install","Run: npx playwright install","Export test flows with export_yaml_to_test","Run: npx playwright test"]})}static exportYamlToTestTool={name:"export_yaml_to_test",description:"Convert a YAML test flow into a standalone Playwright .test.ts file. The generated test uses @shiplightai/sdk-pro with an inline agent \u2014 no cloud runner needed. Use init_local_project first to scaffold the project, then export tests into the tests/ directory.",inputSchema:Zqr(F1.object({yaml:F1.string().describe("YAML test flow string"),output_path:F1.string().describe("Absolute path for the output .test.ts file (e.g., /path/to/project/tests/login.test.ts)"),test_name:F1.string().optional().describe("Override the test name (defaults to the flow's goal)"),starting_url:F1.string().optional().describe("Override the starting URL from the test flow")}),{$refStrategy:"none"})};async exportYamlToTest(t){let{yaml:r,output_path:n,test_name:i,starting_url:s}=F1.object({yaml:F1.string(),output_path:F1.string(),test_name:F1.string().optional(),starting_url:F1.string().optional()}).parse(t),o=Kqr(r,{testName:i,startingUrl:s}),a=u7.dirname(n);return Kw.mkdirSync(a,{recursive:!0}),Kw.writeFileSync(n,o),JSON.stringify({success:!0,output_path:n,size_bytes:Buffer.byteLength(o,"utf8")})}static toolDefinitions=[hct.initLocalProjectTool,hct.exportYamlToTestTool]}});import{z as dR}from"zod";import{zodToJsonSchema as o6s}from"zod-to-json-schema";var Hba,l8e=Q(()=>{"use strict";iRt();sRt();
|
|
8091
|
+
`);return Kw.writeFileSync(u7.join(r,".env.example"),a),Kw.writeFileSync(u7.join(n,".gitkeep"),""),JSON.stringify({success:!0,project_path:r,files_created:["package.json","playwright.config.ts",".gitignore",".env.example","tests/.gitkeep"],next_steps:["Copy .env.example to .env and set SHIPLIGHT_API_TOKEN (from https://app.shiplight.ai/settings/api-tokens) and at least one AI model API key","Run: npm install","Run: npx playwright install","Export test flows with export_yaml_to_test","Run: npx playwright test"]})}static exportYamlToTestTool={name:"export_yaml_to_test",description:"Convert a YAML test flow into a standalone Playwright .test.ts file. The generated test uses @shiplightai/sdk-pro with an inline agent \u2014 no cloud runner needed. Use init_local_project first to scaffold the project, then export tests into the tests/ directory.",inputSchema:Zqr(F1.object({yaml:F1.string().describe("YAML test flow string"),output_path:F1.string().describe("Absolute path for the output .test.ts file (e.g., /path/to/project/tests/login.test.ts)"),test_name:F1.string().optional().describe("Override the test name (defaults to the flow's goal)"),starting_url:F1.string().optional().describe("Override the starting URL from the test flow")}),{$refStrategy:"none"})};async exportYamlToTest(t){let{yaml:r,output_path:n,test_name:i,starting_url:s}=F1.object({yaml:F1.string(),output_path:F1.string(),test_name:F1.string().optional(),starting_url:F1.string().optional()}).parse(t),o=Kqr(r,{testName:i,startingUrl:s}),a=u7.dirname(n);return Kw.mkdirSync(a,{recursive:!0}),Kw.writeFileSync(n,o),JSON.stringify({success:!0,output_path:n,size_bytes:Buffer.byteLength(o,"utf8")})}static toolDefinitions=[hct.initLocalProjectTool,hct.exportYamlToTestTool]}});import{z as dR}from"zod";import{zodToJsonSchema as o6s}from"zod-to-json-schema";var Hba,l8e=Q(()=>{"use strict";iRt();sRt();cRt();dRt();mjr();Ble();Lle();Vl();Hba=class Ajr{constructor(t){this.backend=t}static runTestFlowTool={name:"run_test_flow",description:`Execute a complete TestFlow in an existing browser session, returning per-statement pass/fail results. No test case is created. Use this to validate a test flow before saving it.
|
|
8092
8092
|
|
|
8093
8093
|
The flow is executed statement by statement:
|
|
8094
8094
|
- ACTION with action_entity: replays using cached locator (fast)
|
|
@@ -8098,7 +8098,7 @@ The flow is executed statement by statement:
|
|
|
8098
8098
|
- IF_ELSE: evaluates condition, then executes the matching branch
|
|
8099
8099
|
- WHILE_LOOP: loops while condition is true (respects timeout_ms)
|
|
8100
8100
|
|
|
8101
|
-
IMPORTANT: Read 'shiplight://schemas/testflow-json-v1.2.0' resource for the flow format.`,inputSchema:o6s(dR.object({session_id:dR.string().describe("Session ID from new_session"),flow:dR.any().describe("Test flow JSON object (must match TestFlow schema)")}),{$refStrategy:"none"})};async runTestFlow(t){let{session_id:r,flow:n}=dR.object({session_id:dR.string(),flow:dR.any()}).parse(t);if(!this.backend.getSession(r))throw new Error(`Session ${r} not found`);let s;try{s=wy.parse(n)}catch(p){throw p instanceof dR.ZodError?new Error(`Invalid TestFlow schema: ${JSON.stringify(p.errors)}`):p}let o=this.backend.getPage(r),a=this.backend.getWebAgent(r);s.url&&await o.goto(s.url,{waitUntil:"domcontentloaded"});let u=[],l=await this.executeStatements(s.statements,o,a,u),c=this.countResults(u),d={success:l,url:o.url(),results:u,statements_passed:c.passed,statements_failed:c.failed,statements_total:c.total};return JSON.stringify(d)}async executeStatements(t,r,n,i){let s=!0;for(let o of t){let a=await this.executeStatement(o,r,n);if(i.push(a),!a.success){s=!1;break}}return s}async executeStatement(t,r,n){let i=this.getStatementDescription(t),s={uid:t.uid,type:t.type,description:i,success:!1};try{switch(t.type){case DE.DRAFT:return await this.executeDraft(t,r,n,s);case DE.ACTION:return await this.executeAction(t,r,n,s);case DE.STEP:return await this.executeStep(t,r,n,s);case DE.IF_ELSE:return await this.executeIfElse(t,r,n,s);case DE.WHILE_LOOP:return await this.executeWhileLoop(t,r,n,s);default:return{...s,error:`Unknown statement type: ${t.type}`}}}catch(o){return{...s,error:o instanceof Error?o.message:String(o)}}}async executeDraft(t,r,n,i){let s=await n.run(r,t.description);return{...i,success:s.success,error:s.success?void 0:s.details||"Draft execution failed"}}async executeAction(t,r,n,i){if(t.action_entity){let s=t.action_entity.action_data?.action_name;return s?(await n.execAction(s,r,t.action_entity),{...i,success:!0}):{...i,error:"action_entity missing action_data.action_name"}}else{let s=await n.execute(r,t.description);return{...i,success:s.success,error:s.success?void 0:s.details||"Action execution failed"}}}async executeStep(t,r,n,i){let s=Mle(t),o=[],a=!0;for(let u of s)if(!await this.executeStatements(u.statements,r,n,o)){a=!1;break}return{...i,success:a,children:o,error:a?void 0:"One or more child statements failed"}}async executeIfElse(t,r,n,i){let s=t.condition.expression,o=await n.evaluate(r,s),a=[],u=!0;return o&&t.then&&t.then.length>0?u=await this.executeStatements(t.then,r,n,a):!o&&t.else&&t.else.length>0&&(u=await this.executeStatements(t.else,r,n,a)),{...i,success:u,children:a,description:`${i.description} (condition=${o})`}}async executeWhileLoop(t,r,n,i){let o=t.condition.expression,a=t.timeout_ms??cO,u=Date.now(),l=[],c=0;for(;;){if(Date.now()-u>a)return{...i,success:!1,children:l,error:`While loop timed out after ${a}ms (${c} iterations)`};if(c>=100)return{...i,success:!1,children:l,error:"While loop exceeded max iterations (100)"};if(!await n.evaluate(r,o))break;if(t.body&&t.body.length>0){let p=[],f=await this.executeStatements(t.body,r,n,p);if(l.push(...p),!f)return{...i,success:!1,children:l,error:`While loop body failed on iteration ${c+1}`}}c++}return{...i,success:!0,children:l,description:`${i.description} (${c} iterations)`}}getStatementDescription(t){switch(t.type){case DE.DRAFT:case DE.ACTION:case DE.STEP:return t.description||t.type;case DE.IF_ELSE:return`IF ${t.condition.expression}`;case DE.WHILE_LOOP:return`WHILE ${t.condition.expression}`;default:let r=t;return"Unknown statement"}}countResults(t){let r=0,n=0,i=0;for(let s of t)if(i++,s.success?r++:n++,s.children){let o=this.countResults(s.children);r+=o.passed,n+=o.failed,i+=o.total}return{passed:r,failed:n,total:i}}static toolDefinitions=[Ajr.runTestFlowTool]}});var mct,a6s,gjr,Ejr=Q(()=>{"use strict";mct=class e{static _instance;_logLevel;constructor(){switch(process.env.LOG_LEVEL?.toUpperCase()){case"ERROR":this._logLevel=1;break;case"WARN":this._logLevel=2;break;case"INFO":this._logLevel=3;break;case"DEBUG":this._logLevel=4;break;default:this._logLevel=3}}static getInstance(){return e._instance||(e._instance=new e),e._instance}setLevel(t){this._logLevel=t}debug(...t){this._logLevel>=4&&console.error("[DEBUG]",...t)}info(...t){this._logLevel>=3&&console.error("[INFO]",...t)}warn(...t){this._logLevel>=2&&console.error("[WARN]",...t)}error(...t){this._logLevel>=1&&console.error("[ERROR]",...t)}log(...t){this.info(...t)}},a6s=mct.getInstance(),gjr=a6s});var bjr={};Hs(bjr,{startMcp:()=>A6s});import{Server as u6s}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as l6s}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as c6s,ListToolsRequestSchema as d6s,ListResourcesRequestSchema as p6s,ReadResourceRequestSchema as f6s,ListPromptsRequestSchema as h6s,GetPromptRequestSchema as m6s,ErrorCode as gre,McpError as Ere}from"@modelcontextprotocol/sdk/types.js";import yjr from"axios";async function A6s(e){let t=e.includes("--cloud");await new Act(t).run()}var Cjr,Act,wjr=Q(()=>{"use strict";l8e();Vl();Ff();Ejr();process.env.PWDEBUG="console";Cjr="shiplight://environments",Act=class{constructor(t=!1){this.cloudMode=t;let r=process.env.API_BASE_URL||"https://api.shiplight.ai",n=NMe(),i=process.env.TERMINATION_TIMEOUT?parseInt(process.env.TERMINATION_TIMEOUT,10):null;this.server=new u6s({name:"shiplight-mcp",version:"1.0.0"},{capabilities:{tools:{},resources:{},prompts:{}}});let s={};process.env.GOOGLE_API_KEY&&(s.GOOGLE_API_KEY=process.env.GOOGLE_API_KEY),process.env.ANTHROPIC_API_KEY&&(s.ANTHROPIC_API_KEY=process.env.ANTHROPIC_API_KEY),Object.keys(s).length>0&&Xb({env:s}),this.sessionBackend=new zY({runDir:void 0,terminationTimeout:i}),this.apiClient=this.cloudMode&&process.env.API_TOKEN?new PMe({apiBaseUrl:r,getApiToken:()=>process.env.API_TOKEN}):null,this.sessionTools=new e8e(this.sessionBackend,this.apiClient,n),this.browserTools=new n8e(this.sessionBackend),this.debugTools=new i8e(this.sessionBackend),this.localTestTools=new u8e,this.registry=new QMe,this.registry.registerAll(e8e,this.sessionTools).registerAll(n8e,this.browserTools).registerAll(i8e,this.debugTools).registerAll(u8e,this.localTestTools),this.cloudMode&&(this.testCaseTools=new o8e(this.apiClient),this.testResultTools=new a8e(this.apiClient),this.dataTools=new s8e(this.apiClient),this.registry.registerAll(o8e,this.testCaseTools).registerAll(a8e,this.testResultTools).registerAll(s8e,this.dataTools)),this.setupHandlers()}server;registry;sessionBackend;apiClient;sessionTools;browserTools;debugTools;testCaseTools=null;testResultTools=null;dataTools=null;localTestTools;setupHandlers(){let{tools:t,handleToolCall:r}=this.registry.build();this.server.setRequestHandler(d6s,async()=>({tools:t})),this.server.setRequestHandler(c6s,async n=>{try{let{name:i,arguments:s}=n.params;return{content:[{type:"text",text:await r(i,s)}]}}catch(i){let s=i instanceof Error?i.message:String(i);throw yjr.isAxiosError(i)&&i.response?.status===401&&(s="Authentication required. Contact info@shiplight.ai to get access to cloud services and advanced features."),new Ere(gre.InternalError,s)}}),this.server.setRequestHandler(p6s,async()=>({resources:[...UMe(),...this.cloudMode?[{uri:Cjr,name:"Environments",description:"List testing environments (same data as the list_environments tool).",mimeType:"application/json"}]:[]]})),this.server.setRequestHandler(f6s,async n=>{let{uri:i}=n.params;if(i===Cjr){if(!this.apiClient)throw new Ere(gre.InternalError,"The environments resource requires a Shiplight API token. Set API_TOKEN in your MCP server configuration.");try{let o=await this.apiClient.listEnvironments();return{contents:[{uri:i,mimeType:"application/json",text:JSON.stringify({environments:o.map(a=>({id:a.id,name:a.name,url:a.url}))},null,2)}]}}catch(o){let a=o instanceof Error?o.message:String(o);throw yjr.isAxiosError(o)&&o.response?.status===401&&(a="Authentication required. Provide API_TOKEN in the MCP server configuration to access cloud resources."),new Ere(gre.InternalError,a)}}let s=await qMe(i);if(!s)throw new Ere(gre.InvalidRequest,`Unknown resource: ${i}`);return{contents:[{uri:i,mimeType:"text/markdown",text:s}]}}),this.server.setRequestHandler(h6s,async()=>({prompts:LMe().map(i=>({name:i.name,description:i.description}))})),this.server.setRequestHandler(m6s,async n=>{let{name:i}=n.params,s=MMe(i);if(!s)throw new Ere(gre.InvalidRequest,`Unknown prompt: ${i}`);return{messages:[{role:"user",content:{type:"text",text:s}}]}})}async run(){let t=new l6s;await this.server.connect(t),gjr.info("Shiplight MCP Server running on stdio")}}});import*as c8e from"fs";import*as pR from"path";function vjr(e){let t=null,r=process.env.SHIPLIGHT_LOGIN_EMAIL,n=process.env.SHIPLIGHT_LOGIN_PASSWORD;return r&&n&&(t={username:r,password:n}),t||(t=g6s(e)),t?(process.env.SHIPLIGHT_LOGIN_URL&&(t.loginUrl=process.env.SHIPLIGHT_LOGIN_URL),process.env.SHIPLIGHT_LOGIN_TOTP_SECRET&&(t.totpSecret=process.env.SHIPLIGHT_LOGIN_TOTP_SECRET),t):null}function g6s(e){let t=pR.resolve(e),r=pR.resolve(process.cwd());for(;;){for(let i of["shiplight.config.json","login.config.json"]){let s=pR.join(t,i);if(c8e.existsSync(s))try{let o=JSON.parse(c8e.readFileSync(s,"utf-8"));if(o.username&&o.password)return{username:o.username,password:o.password,loginUrl:o.url,totpSecret:o.totp_secret}}catch{}}if(t===r)break;let n=pR.dirname(t);if(n===t)break;t=n}return null}var xjr=Q(()=>{"use strict"});var Bjr=Q(()=>{"use strict"});var yre,Ej,E6s,y6s,Djr,C6s,b6s,Oh=Q(()=>{"use strict";Vl();yre=(e=>(e.Draft="Draft",e.Active="Active",e))(yre||{}),Ej=process.env.S3_BUCKET_SUFFIX||"",E6s=`loggia-test-runs${Ej}`,y6s=`loggia-int-runs${Ej}`,Djr=`loggia-storage-states${Ej}`,C6s=`loggia-agent-tasks${Ej}`,b6s=`loggia-agent-api${Ej}`});var ig=Q(()=>{"use strict"});import d8a from"axios";var Sjr=Q(()=>{"use strict";Bjr();Oh();ig()});var _jr,d8e=Q(()=>{"use strict";_jr=class{static normalizeFields(e,t,r=[]){let n={};for(let[i,s]of Object.entries(e)){if(r.includes(i)||r.includes(t[i]))continue;let o=t[i]||i;n[o]=s}return n}static denormalizeFields(e,t){let r={},n={};for(let[i,s]of Object.entries(t))n[s]=i;for(let[i,s]of Object.entries(e)){let o=n[i]||i;r[o]=s}return r}}});var Ijr,f8e=Q(()=>{"use strict";d8e();Ijr=class p8e{constructor(t,r,n,i,s,o,a,u,l,c,d,p,f,m,g,C,b,w,B){this.id=t,this.organizationId=r,this.username=n,this.password=i,this.isShared=s,this.inUse=o,this.skipOauthScript=a,this.lastUsedAt=u,this.createdAt=l,this.updatedAt=c,this.lastUsedTestCaseResult=d,this.authCreds=p,this.name=f,this.lastRefreshAt=m,this.environmentId=g,this.loginConfig=C,this.cachedLoginActions=b,this.loginValidationExprs=w,this.loginHints=B}static normalizeRequestFields(t){return _jr.normalizeFields(t,p8e.FIELD_MAPPINGS,p8e.PROTECTED_FIELDS)}static fromEntity(t){return new p8e(t.id,t.organization_id,t.username,t.password,t.is_shared,t.in_use,t.skip_oauth_script,t.last_used_at?new Date(t.last_used_at):void 0,t.created_at?new Date(t.created_at):void 0,t.updated_at?new Date(t.updated_at):void 0,t.last_used_test_case_result,t.auth_creds,t.name,t.last_refresh_at?new Date(t.last_refresh_at):void 0,t.environment_id,t.login_config,t.cached_login_actions,t.login_validation_exprs,t.login_hints)}toEntity(){return{id:this.id,organization_id:this.organizationId,username:this.username,password:this.password,is_shared:this.isShared,in_use:this.inUse,skip_oauth_script:this.skipOauthScript,last_used_at:this.lastUsedAt?.toISOString(),created_at:this.createdAt?.toISOString(),updated_at:this.updatedAt?.toISOString(),last_used_test_case_result:this.lastUsedTestCaseResult,auth_creds:this.authCreds,name:this.name,last_refresh_at:this.lastRefreshAt?.toISOString(),environment_id:this.environmentId,login_config:this.loginConfig,cached_login_actions:this.cachedLoginActions,login_validation_exprs:this.loginValidationExprs,login_hints:this.loginHints}}};Ijr.FIELD_MAPPINGS={environmentId:"environment_id",isShared:"is_shared",inUse:"in_use",skipOauthScript:"skip_oauth_script",lastUsedAt:"last_used_at",createdAt:"created_at",updatedAt:"updated_at",lastUsedTestCaseResult:"last_used_test_case_result",authCreds:"auth_creds",lastRefreshAt:"last_refresh_at",organizationId:"organization_id",loginConfig:"login_config",cachedLoginActions:"cached_login_actions",loginValidationExprs:"login_validation_exprs",loginHints:"login_hints"};Ijr.PROTECTED_FIELDS=["id","organization_id","created_at","updated_at"]});import b8a from"axios";var gct=Q(()=>{"use strict";f8e();Oh()});var Tjr=Q(()=>{"use strict";gct();f8e();d8e();Oh();ig()});var B6s,D6s,Ect,S6s,_6s,I6s,cr,jC=Q(()=>{"use strict";B6s=1,D6s=2,Ect=3,S6s=4,_6s=class Cre{constructor(){this._logLevel=Ect}static getInstance(){return Cre._instance||(Cre._instance=new Cre),Cre._instance}setLevel(t){this._logLevel=t}log(...t){this._logLevel>=Ect&&console.log(...t)}debug(...t){this._logLevel>=S6s&&console.debug(...t)}info(...t){this._logLevel>=Ect&&console.log(...t)}warn(...t){this._logLevel>=D6s&&console.warn(...t)}error(...t){this._logLevel>=B6s&&console.error(...t)}},I6s=_6s.getInstance(),cr=I6s});var h8e=Q(()=>{"use strict";jC()});var m8e=Q(()=>{"use strict";h8e()});var Zw,e4,Fjr=Q(()=>{"use strict";Zw=e=>({setHttpHandler(t){e.httpHandler=t},httpHandler(){return e.httpHandler},updateHttpClientConfig(t,r){e.httpHandler?.updateHttpClientConfig(t,r)},httpHandlerConfigs(){return e.httpHandler.httpHandlerConfigs()}}),e4=e=>({httpHandler:e.httpHandler()})});var kjr=Q(()=>{"use strict";Fjr()});var Rjr=Q(()=>{"use strict"});var Njr,Pjr=Q(()=>{"use strict";(function(e){e.HEADER="header",e.QUERY="query"})(Njr||(Njr={}))});var Ojr,Mjr=Q(()=>{"use strict";(function(e){e.HEADER="header",e.QUERY="query"})(Ojr||(Ojr={}))});var Ljr=Q(()=>{"use strict"});var Qjr=Q(()=>{"use strict"});var Ujr=Q(()=>{"use strict"});var qjr=Q(()=>{"use strict"});var jjr=Q(()=>{"use strict";Pjr();Mjr();Ljr();Qjr();Ujr();qjr()});var Hjr=Q(()=>{"use strict"});var $jr=Q(()=>{"use strict"});var Gjr=Q(()=>{"use strict"});var Vjr=Q(()=>{"use strict"});var Wjr=Q(()=>{"use strict"});var Yjr=Q(()=>{"use strict"});var zjr=Q(()=>{"use strict"});var Jjr=Q(()=>{"use strict";Wjr();Yjr();zjr()});var Kjr=Q(()=>{"use strict"});var Xjr=Q(()=>{"use strict"});var yj,Zjr=Q(()=>{"use strict";(function(e){e.HTTP="http",e.HTTPS="https"})(yj||(yj={}))});var eHr=Q(()=>{"use strict"});var tHr=Q(()=>{"use strict"});var rHr=Q(()=>{"use strict"});var nHr=Q(()=>{"use strict"});var iHr=Q(()=>{"use strict"});var sHr=Q(()=>{"use strict";eHr();tHr();rHr();nHr();iHr()});var oHr=Q(()=>{"use strict"});var Cj,aHr=Q(()=>{"use strict";(function(e){e.MD5="md5",e.CRC32="crc32",e.CRC32C="crc32c",e.SHA1="sha1",e.SHA256="sha256"})(Cj||(Cj={}))});var uHr=Q(()=>{"use strict"});var lHr=Q(()=>{"use strict"});var cHr=Q(()=>{"use strict";uHr();lHr();aHr()});var dHr=Q(()=>{"use strict"});var pHr,fHr=Q(()=>{"use strict";(function(e){e[e.HEADER=0]="HEADER",e[e.TRAILER=1]="TRAILER"})(pHr||(pHr={}))});var hHr=Q(()=>{"use strict"});var mHr=Q(()=>{"use strict"});var AHr=Q(()=>{"use strict"});var gHr=Q(()=>{"use strict"});var EHr=Q(()=>{"use strict"});var yHr=Q(()=>{"use strict";mHr();AHr();gHr();EHr()});var CHr=Q(()=>{"use strict"});var bre,bHr=Q(()=>{"use strict";bre="__smithy_context"});var wHr=Q(()=>{"use strict"});var l7,vHr=Q(()=>{"use strict";(function(e){e.PROFILE="profile",e.SSO_SESSION="sso-session",e.SERVICES="services"})(l7||(l7={}))});var xHr=Q(()=>{"use strict"});var BHr=Q(()=>{"use strict"});var DHr=Q(()=>{"use strict"});var SHr=Q(()=>{"use strict"});var _Hr=Q(()=>{"use strict"});var IHr=Q(()=>{"use strict"});var THr=Q(()=>{"use strict"});var FHr=Q(()=>{"use strict"});var kHr=Q(()=>{"use strict"});var RHr=Q(()=>{"use strict"});var NHr=Q(()=>{"use strict"});var PHr=Q(()=>{"use strict"});var OHr=Q(()=>{"use strict"});var MHr=Q(()=>{"use strict"});var LHr,QHr=Q(()=>{"use strict";(function(e){e.HTTP_0_9="http/0.9",e.HTTP_1_0="http/1.0",e.TDS_8_0="tds/8.0"})(LHr||(LHr={}))});var UHr=Q(()=>{"use strict"});var qHr=Q(()=>{"use strict"});var jHr=Q(()=>{"use strict"});var HHr=Q(()=>{"use strict"});var $Hr=Q(()=>{"use strict"});var GHr=Q(()=>{"use strict"});var VHr=Q(()=>{"use strict"});var dS=Q(()=>{"use strict";Rjr();jjr();Hjr();$jr();Gjr();Vjr();Jjr();Kjr();Xjr();Zjr();sHr();oHr();cHr();dHr();fHr();hHr();yHr();CHr();bHr();wHr();vHr();xHr();BHr();DHr();SHr();_Hr();IHr();THr();FHr();kHr();RHr();NHr();PHr();OHr();MHr();QHr();UHr();qHr();jHr();HHr();$Hr();GHr();VHr()});var WHr=Q(()=>{"use strict"});var YHr=Q(()=>{"use strict"});var zHr=Q(()=>{"use strict"});function T6s(e){return Object.keys(e).reduce((t,r)=>{let n=e[r];return{...t,[r]:Array.isArray(n)?[...n]:n}},{})}var ys,JHr=Q(()=>{"use strict";ys=class e{method;protocol;hostname;port;path;query;headers;username;password;fragment;body;constructor(t){this.method=t.method||"GET",this.hostname=t.hostname||"localhost",this.port=t.port,this.query=t.query||{},this.headers=t.headers||{},this.body=t.body,this.protocol=t.protocol?t.protocol.slice(-1)!==":"?`${t.protocol}:`:t.protocol:"https:",this.path=t.path?t.path.charAt(0)!=="/"?`/${t.path}`:t.path:"/",this.username=t.username,this.password=t.password,this.fragment=t.fragment}static clone(t){let r=new e({...t,headers:{...t.headers}});return r.query&&(r.query=T6s(r.query)),r}static isInstance(t){if(!t)return!1;let r=t;return"method"in r&&"protocol"in r&&"hostname"in r&&"path"in r&&typeof r.query=="object"&&typeof r.headers=="object"}clone(){return e.clone(this)}}});var qm,KHr=Q(()=>{"use strict";qm=class{statusCode;reason;headers;body;constructor(t){this.statusCode=t.statusCode,this.reason=t.reason,this.headers=t.headers||{},this.body=t.body}static isInstance(t){if(!t)return!1;let r=t;return typeof r.statusCode=="number"&&typeof r.headers=="object"}}});var XHr=Q(()=>{"use strict"});var ZHr=Q(()=>{"use strict"});var Fa=Q(()=>{"use strict";kjr();WHr();YHr();zHr();JHr();KHr();XHr();ZHr()});function F6s(e){return t=>async r=>{let{request:n}=r;if(e.expectContinueHeader!==!1&&ys.isInstance(n)&&n.body&&e.runtime==="node"&&e.requestHandler?.constructor?.name!=="FetchHttpHandler"){let i=!0;if(typeof e.expectContinueHeader=="number")try{i=(Number(n.headers?.["content-length"])??e.bodyLengthChecker?.(n.body)??1/0)>=e.expectContinueHeader}catch{}else i=!!e.expectContinueHeader;i&&(n.headers.Expect="100-continue")}return t({...r,request:n})}}var k6s,e$r,t$r=Q(()=>{"use strict";Fa();k6s={step:"build",tags:["SET_EXPECT_HEADER","EXPECT_HEADER"],name:"addExpectContinueMiddleware",override:!0},e$r=e=>({applyToStack:t=>{t.add(F6s(e),k6s)}})});var HC,A8e,fR,g8e,ka,r$r,wre,$C=Q(()=>{"use strict";HC={WHEN_SUPPORTED:"WHEN_SUPPORTED",WHEN_REQUIRED:"WHEN_REQUIRED"},A8e=HC.WHEN_SUPPORTED,fR={WHEN_SUPPORTED:"WHEN_SUPPORTED",WHEN_REQUIRED:"WHEN_REQUIRED"},g8e=HC.WHEN_SUPPORTED;(function(e){e.MD5="MD5",e.CRC32="CRC32",e.CRC32C="CRC32C",e.CRC64NVME="CRC64NVME",e.SHA1="SHA1",e.SHA256="SHA256"})(ka||(ka={}));(function(e){e.HEADER="header",e.TRAILER="trailer"})(r$r||(r$r={}));wre=ka.CRC32});var pS,bj,yct=Q(()=>{"use strict";(function(e){e.ENV="env",e.CONFIG="shared config entry"})(pS||(pS={}));bj=(e,t,r,n)=>{if(!(t in e))return;let i=e[t].toUpperCase();if(!Object.values(r).includes(i))throw new TypeError(`Cannot load ${n} '${t}'. Expected one of ${Object.values(r)}, got '${e[t]}'.`);return i}});var R6s,N6s,n$r,i$r=Q(()=>{"use strict";$C();yct();R6s="AWS_REQUEST_CHECKSUM_CALCULATION",N6s="request_checksum_calculation",n$r={environmentVariableSelector:e=>bj(e,R6s,HC,pS.ENV),configFileSelector:e=>bj(e,N6s,HC,pS.CONFIG),default:A8e}});var P6s,O6s,s$r,o$r=Q(()=>{"use strict";$C();yct();P6s="AWS_RESPONSE_CHECKSUM_VALIDATION",O6s="response_checksum_validation",s$r={environmentVariableSelector:e=>bj(e,P6s,fR,pS.ENV),configFileSelector:e=>bj(e,O6s,fR,pS.CONFIG),default:g8e}});var Cct,bct=Q(()=>{"use strict";Cct={CrtCrc64Nvme:null}});var a$r,t4,u$r=Q(()=>{"use strict";a$r={warningEmitted:!1},t4=e=>{e&&!a$r.warningEmitted&&parseInt(e.substring(1,e.indexOf(".")))<18&&(a$r.warningEmitted=!0,process.emitWarning(`NodeDeprecationWarning: The AWS SDK for JavaScript (v3) will
|
|
8101
|
+
IMPORTANT: Read 'shiplight://schemas/testflow-json-v1.2.0' resource for the flow format.`,inputSchema:o6s(dR.object({session_id:dR.string().describe("Session ID from new_session"),flow:dR.any().describe("Test flow JSON object (must match TestFlow schema)")}),{$refStrategy:"none"})};async runTestFlow(t){let{session_id:r,flow:n}=dR.object({session_id:dR.string(),flow:dR.any()}).parse(t);if(!this.backend.getSession(r))throw new Error(`Session ${r} not found`);let s;try{s=wy.parse(n)}catch(p){throw p instanceof dR.ZodError?new Error(`Invalid TestFlow schema: ${JSON.stringify(p.errors)}`):p}let o=this.backend.getPage(r),a=this.backend.getWebAgent(r);s.url&&await o.goto(s.url,{waitUntil:"domcontentloaded"});let u=[],l=await this.executeStatements(s.statements,o,a,u),c=this.countResults(u),d={success:l,url:o.url(),results:u,statements_passed:c.passed,statements_failed:c.failed,statements_total:c.total};return JSON.stringify(d)}async executeStatements(t,r,n,i){let s=!0;for(let o of t){let a=await this.executeStatement(o,r,n);if(i.push(a),!a.success){s=!1;break}}return s}async executeStatement(t,r,n){let i=this.getStatementDescription(t),s={uid:t.uid,type:t.type,description:i,success:!1};try{switch(t.type){case DE.DRAFT:return await this.executeDraft(t,r,n,s);case DE.ACTION:return await this.executeAction(t,r,n,s);case DE.STEP:return await this.executeStep(t,r,n,s);case DE.IF_ELSE:return await this.executeIfElse(t,r,n,s);case DE.WHILE_LOOP:return await this.executeWhileLoop(t,r,n,s);default:return{...s,error:`Unknown statement type: ${t.type}`}}}catch(o){return{...s,error:o instanceof Error?o.message:String(o)}}}async executeDraft(t,r,n,i){let s=await n.run(r,t.description);return{...i,success:s.success,error:s.success?void 0:s.details||"Draft execution failed"}}async executeAction(t,r,n,i){if(t.action_entity){let s=t.action_entity.action_data?.action_name;return s?(await n.execAction(s,r,t.action_entity),{...i,success:!0}):{...i,error:"action_entity missing action_data.action_name"}}else{let s=await n.execute(r,t.description);return{...i,success:s.success,error:s.success?void 0:s.details||"Action execution failed"}}}async executeStep(t,r,n,i){let s=Mle(t),o=[],a=!0;for(let u of s)if(!await this.executeStatements(u.statements,r,n,o)){a=!1;break}return{...i,success:a,children:o,error:a?void 0:"One or more child statements failed"}}async executeIfElse(t,r,n,i){let s=t.condition.expression,o=await n.evaluate(r,s),a=[],u=!0;return o&&t.then&&t.then.length>0?u=await this.executeStatements(t.then,r,n,a):!o&&t.else&&t.else.length>0&&(u=await this.executeStatements(t.else,r,n,a)),{...i,success:u,children:a,description:`${i.description} (condition=${o})`}}async executeWhileLoop(t,r,n,i){let o=t.condition.expression,a=t.timeout_ms??cO,u=Date.now(),l=[],c=0;for(;;){if(Date.now()-u>a)return{...i,success:!1,children:l,error:`While loop timed out after ${a}ms (${c} iterations)`};if(c>=100)return{...i,success:!1,children:l,error:"While loop exceeded max iterations (100)"};if(!await n.evaluate(r,o))break;if(t.body&&t.body.length>0){let p=[],f=await this.executeStatements(t.body,r,n,p);if(l.push(...p),!f)return{...i,success:!1,children:l,error:`While loop body failed on iteration ${c+1}`}}c++}return{...i,success:!0,children:l,description:`${i.description} (${c} iterations)`}}getStatementDescription(t){switch(t.type){case DE.DRAFT:case DE.ACTION:case DE.STEP:return t.description||t.type;case DE.IF_ELSE:return`IF ${t.condition.expression}`;case DE.WHILE_LOOP:return`WHILE ${t.condition.expression}`;default:let r=t;return"Unknown statement"}}countResults(t){let r=0,n=0,i=0;for(let s of t)if(i++,s.success?r++:n++,s.children){let o=this.countResults(s.children);r+=o.passed,n+=o.failed,i+=o.total}return{passed:r,failed:n,total:i}}static toolDefinitions=[Ajr.runTestFlowTool]}});var mct,a6s,gjr,Ejr=Q(()=>{"use strict";mct=class e{static _instance;_logLevel;constructor(){switch(process.env.LOG_LEVEL?.toUpperCase()){case"ERROR":this._logLevel=1;break;case"WARN":this._logLevel=2;break;case"INFO":this._logLevel=3;break;case"DEBUG":this._logLevel=4;break;default:this._logLevel=3}}static getInstance(){return e._instance||(e._instance=new e),e._instance}setLevel(t){this._logLevel=t}debug(...t){this._logLevel>=4&&console.error("[DEBUG]",...t)}info(...t){this._logLevel>=3&&console.error("[INFO]",...t)}warn(...t){this._logLevel>=2&&console.error("[WARN]",...t)}error(...t){this._logLevel>=1&&console.error("[ERROR]",...t)}log(...t){this.info(...t)}},a6s=mct.getInstance(),gjr=a6s});var bjr={};Hs(bjr,{startMcp:()=>A6s});import{Server as u6s}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as l6s}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as c6s,ListToolsRequestSchema as d6s,ListResourcesRequestSchema as p6s,ReadResourceRequestSchema as f6s,ListPromptsRequestSchema as h6s,GetPromptRequestSchema as m6s,ErrorCode as gre,McpError as Ere}from"@modelcontextprotocol/sdk/types.js";import yjr from"axios";async function A6s(e){let t=e.includes("--cloud");await new Act(t).run()}var Cjr,Act,wjr=Q(()=>{"use strict";l8e();Vl();Ff();Ejr();process.env.PWDEBUG="console";Cjr="shiplight://environments",Act=class{constructor(t=!1){this.cloudMode=t;let r=process.env.API_BASE_URL||"https://api.shiplight.ai",n=NMe(),i=process.env.TERMINATION_TIMEOUT?parseInt(process.env.TERMINATION_TIMEOUT,10):null;this.server=new u6s({name:"shiplight-mcp",version:"1.0.0"},{capabilities:{tools:{},resources:{},prompts:{}}});let s={};process.env.GOOGLE_API_KEY&&(s.GOOGLE_API_KEY=process.env.GOOGLE_API_KEY),process.env.ANTHROPIC_API_KEY&&(s.ANTHROPIC_API_KEY=process.env.ANTHROPIC_API_KEY),Object.keys(s).length>0&&Xb({env:s}),this.sessionBackend=new zY({runDir:void 0,terminationTimeout:i}),this.apiClient=this.cloudMode&&process.env.API_TOKEN?new PMe({apiBaseUrl:r,getApiToken:()=>process.env.API_TOKEN}):null,this.sessionTools=new e8e(this.sessionBackend,this.apiClient,n),this.browserTools=new n8e(this.sessionBackend),this.debugTools=new i8e(this.sessionBackend),this.localTestTools=new u8e,this.registry=new qMe,this.registry.registerAll(e8e,this.sessionTools).registerAll(n8e,this.browserTools).registerAll(i8e,this.debugTools).registerAll(u8e,this.localTestTools),this.cloudMode&&(this.testCaseTools=new o8e(this.apiClient),this.testResultTools=new a8e(this.apiClient),this.dataTools=new s8e(this.apiClient),this.registry.registerAll(o8e,this.testCaseTools).registerAll(a8e,this.testResultTools).registerAll(s8e,this.dataTools)),this.setupHandlers()}server;registry;sessionBackend;apiClient;sessionTools;browserTools;debugTools;testCaseTools=null;testResultTools=null;dataTools=null;localTestTools;setupHandlers(){let{tools:t,handleToolCall:r}=this.registry.build();this.server.setRequestHandler(d6s,async()=>({tools:t})),this.server.setRequestHandler(c6s,async n=>{try{let{name:i,arguments:s}=n.params;return{content:[{type:"text",text:await r(i,s)}]}}catch(i){let s=i instanceof Error?i.message:String(i);throw yjr.isAxiosError(i)&&i.response?.status===401&&(s="Authentication required. Contact info@shiplight.ai to get access to cloud services and advanced features."),new Ere(gre.InternalError,s)}}),this.server.setRequestHandler(p6s,async()=>({resources:[...QMe(),...this.cloudMode?[{uri:Cjr,name:"Environments",description:"List testing environments (same data as the list_environments tool).",mimeType:"application/json"}]:[]]})),this.server.setRequestHandler(f6s,async n=>{let{uri:i}=n.params;if(i===Cjr){if(!this.apiClient)throw new Ere(gre.InternalError,"The environments resource requires a Shiplight API token. Set API_TOKEN in your MCP server configuration.");try{let o=await this.apiClient.listEnvironments();return{contents:[{uri:i,mimeType:"application/json",text:JSON.stringify({environments:o.map(a=>({id:a.id,name:a.name,url:a.url}))},null,2)}]}}catch(o){let a=o instanceof Error?o.message:String(o);throw yjr.isAxiosError(o)&&o.response?.status===401&&(a="Authentication required. Provide API_TOKEN in the MCP server configuration to access cloud resources."),new Ere(gre.InternalError,a)}}let s=await UMe(i);if(!s)throw new Ere(gre.InvalidRequest,`Unknown resource: ${i}`);return{contents:[{uri:i,mimeType:"text/markdown",text:s}]}}),this.server.setRequestHandler(h6s,async()=>({prompts:LMe().map(i=>({name:i.name,description:i.description}))})),this.server.setRequestHandler(m6s,async n=>{let{name:i}=n.params,s=MMe(i);if(!s)throw new Ere(gre.InvalidRequest,`Unknown prompt: ${i}`);return{messages:[{role:"user",content:{type:"text",text:s}}]}})}async run(){let t=new l6s;await this.server.connect(t),gjr.info("Shiplight MCP Server running on stdio")}}});import*as c8e from"fs";import*as pR from"path";function vjr(e){let t=null,r=process.env.SHIPLIGHT_LOGIN_EMAIL,n=process.env.SHIPLIGHT_LOGIN_PASSWORD;return r&&n&&(t={username:r,password:n}),t||(t=g6s(e)),t?(process.env.SHIPLIGHT_LOGIN_URL&&(t.loginUrl=process.env.SHIPLIGHT_LOGIN_URL),process.env.SHIPLIGHT_LOGIN_TOTP_SECRET&&(t.totpSecret=process.env.SHIPLIGHT_LOGIN_TOTP_SECRET),t):null}function g6s(e){let t=pR.resolve(e),r=pR.resolve(process.cwd());for(;;){for(let i of["shiplight.config.json","login.config.json"]){let s=pR.join(t,i);if(c8e.existsSync(s))try{let o=JSON.parse(c8e.readFileSync(s,"utf-8"));if(o.username&&o.password)return{username:o.username,password:o.password,loginUrl:o.url,totpSecret:o.totp_secret}}catch{}}if(t===r)break;let n=pR.dirname(t);if(n===t)break;t=n}return null}var xjr=Q(()=>{"use strict"});var Bjr=Q(()=>{"use strict"});var yre,Ej,E6s,y6s,Djr,C6s,b6s,Oh=Q(()=>{"use strict";Vl();yre=(e=>(e.Draft="Draft",e.Active="Active",e))(yre||{}),Ej=process.env.S3_BUCKET_SUFFIX||"",E6s=`loggia-test-runs${Ej}`,y6s=`loggia-int-runs${Ej}`,Djr=`loggia-storage-states${Ej}`,C6s=`loggia-agent-tasks${Ej}`,b6s=`loggia-agent-api${Ej}`});var ig=Q(()=>{"use strict"});import d8a from"axios";var Sjr=Q(()=>{"use strict";Bjr();Oh();ig()});var _jr,d8e=Q(()=>{"use strict";_jr=class{static normalizeFields(e,t,r=[]){let n={};for(let[i,s]of Object.entries(e)){if(r.includes(i)||r.includes(t[i]))continue;let o=t[i]||i;n[o]=s}return n}static denormalizeFields(e,t){let r={},n={};for(let[i,s]of Object.entries(t))n[s]=i;for(let[i,s]of Object.entries(e)){let o=n[i]||i;r[o]=s}return r}}});var Ijr,f8e=Q(()=>{"use strict";d8e();Ijr=class p8e{constructor(t,r,n,i,s,o,a,u,l,c,d,p,f,m,g,C,b,w,B){this.id=t,this.organizationId=r,this.username=n,this.password=i,this.isShared=s,this.inUse=o,this.skipOauthScript=a,this.lastUsedAt=u,this.createdAt=l,this.updatedAt=c,this.lastUsedTestCaseResult=d,this.authCreds=p,this.name=f,this.lastRefreshAt=m,this.environmentId=g,this.loginConfig=C,this.cachedLoginActions=b,this.loginValidationExprs=w,this.loginHints=B}static normalizeRequestFields(t){return _jr.normalizeFields(t,p8e.FIELD_MAPPINGS,p8e.PROTECTED_FIELDS)}static fromEntity(t){return new p8e(t.id,t.organization_id,t.username,t.password,t.is_shared,t.in_use,t.skip_oauth_script,t.last_used_at?new Date(t.last_used_at):void 0,t.created_at?new Date(t.created_at):void 0,t.updated_at?new Date(t.updated_at):void 0,t.last_used_test_case_result,t.auth_creds,t.name,t.last_refresh_at?new Date(t.last_refresh_at):void 0,t.environment_id,t.login_config,t.cached_login_actions,t.login_validation_exprs,t.login_hints)}toEntity(){return{id:this.id,organization_id:this.organizationId,username:this.username,password:this.password,is_shared:this.isShared,in_use:this.inUse,skip_oauth_script:this.skipOauthScript,last_used_at:this.lastUsedAt?.toISOString(),created_at:this.createdAt?.toISOString(),updated_at:this.updatedAt?.toISOString(),last_used_test_case_result:this.lastUsedTestCaseResult,auth_creds:this.authCreds,name:this.name,last_refresh_at:this.lastRefreshAt?.toISOString(),environment_id:this.environmentId,login_config:this.loginConfig,cached_login_actions:this.cachedLoginActions,login_validation_exprs:this.loginValidationExprs,login_hints:this.loginHints}}};Ijr.FIELD_MAPPINGS={environmentId:"environment_id",isShared:"is_shared",inUse:"in_use",skipOauthScript:"skip_oauth_script",lastUsedAt:"last_used_at",createdAt:"created_at",updatedAt:"updated_at",lastUsedTestCaseResult:"last_used_test_case_result",authCreds:"auth_creds",lastRefreshAt:"last_refresh_at",organizationId:"organization_id",loginConfig:"login_config",cachedLoginActions:"cached_login_actions",loginValidationExprs:"login_validation_exprs",loginHints:"login_hints"};Ijr.PROTECTED_FIELDS=["id","organization_id","created_at","updated_at"]});import b8a from"axios";var gct=Q(()=>{"use strict";f8e();Oh()});var Tjr=Q(()=>{"use strict";gct();f8e();d8e();Oh();ig()});var B6s,D6s,Ect,S6s,_6s,I6s,cr,jC=Q(()=>{"use strict";B6s=1,D6s=2,Ect=3,S6s=4,_6s=class Cre{constructor(){this._logLevel=Ect}static getInstance(){return Cre._instance||(Cre._instance=new Cre),Cre._instance}setLevel(t){this._logLevel=t}log(...t){this._logLevel>=Ect&&console.log(...t)}debug(...t){this._logLevel>=S6s&&console.debug(...t)}info(...t){this._logLevel>=Ect&&console.log(...t)}warn(...t){this._logLevel>=D6s&&console.warn(...t)}error(...t){this._logLevel>=B6s&&console.error(...t)}},I6s=_6s.getInstance(),cr=I6s});var h8e=Q(()=>{"use strict";jC()});var m8e=Q(()=>{"use strict";h8e()});var Zw,e4,Fjr=Q(()=>{"use strict";Zw=e=>({setHttpHandler(t){e.httpHandler=t},httpHandler(){return e.httpHandler},updateHttpClientConfig(t,r){e.httpHandler?.updateHttpClientConfig(t,r)},httpHandlerConfigs(){return e.httpHandler.httpHandlerConfigs()}}),e4=e=>({httpHandler:e.httpHandler()})});var kjr=Q(()=>{"use strict";Fjr()});var Rjr=Q(()=>{"use strict"});var Njr,Pjr=Q(()=>{"use strict";(function(e){e.HEADER="header",e.QUERY="query"})(Njr||(Njr={}))});var Ojr,Mjr=Q(()=>{"use strict";(function(e){e.HEADER="header",e.QUERY="query"})(Ojr||(Ojr={}))});var Ljr=Q(()=>{"use strict"});var Qjr=Q(()=>{"use strict"});var Ujr=Q(()=>{"use strict"});var qjr=Q(()=>{"use strict"});var jjr=Q(()=>{"use strict";Pjr();Mjr();Ljr();Qjr();Ujr();qjr()});var Hjr=Q(()=>{"use strict"});var $jr=Q(()=>{"use strict"});var Gjr=Q(()=>{"use strict"});var Vjr=Q(()=>{"use strict"});var Wjr=Q(()=>{"use strict"});var Yjr=Q(()=>{"use strict"});var zjr=Q(()=>{"use strict"});var Jjr=Q(()=>{"use strict";Wjr();Yjr();zjr()});var Kjr=Q(()=>{"use strict"});var Xjr=Q(()=>{"use strict"});var yj,Zjr=Q(()=>{"use strict";(function(e){e.HTTP="http",e.HTTPS="https"})(yj||(yj={}))});var eHr=Q(()=>{"use strict"});var tHr=Q(()=>{"use strict"});var rHr=Q(()=>{"use strict"});var nHr=Q(()=>{"use strict"});var iHr=Q(()=>{"use strict"});var sHr=Q(()=>{"use strict";eHr();tHr();rHr();nHr();iHr()});var oHr=Q(()=>{"use strict"});var Cj,aHr=Q(()=>{"use strict";(function(e){e.MD5="md5",e.CRC32="crc32",e.CRC32C="crc32c",e.SHA1="sha1",e.SHA256="sha256"})(Cj||(Cj={}))});var uHr=Q(()=>{"use strict"});var lHr=Q(()=>{"use strict"});var cHr=Q(()=>{"use strict";uHr();lHr();aHr()});var dHr=Q(()=>{"use strict"});var pHr,fHr=Q(()=>{"use strict";(function(e){e[e.HEADER=0]="HEADER",e[e.TRAILER=1]="TRAILER"})(pHr||(pHr={}))});var hHr=Q(()=>{"use strict"});var mHr=Q(()=>{"use strict"});var AHr=Q(()=>{"use strict"});var gHr=Q(()=>{"use strict"});var EHr=Q(()=>{"use strict"});var yHr=Q(()=>{"use strict";mHr();AHr();gHr();EHr()});var CHr=Q(()=>{"use strict"});var bre,bHr=Q(()=>{"use strict";bre="__smithy_context"});var wHr=Q(()=>{"use strict"});var l7,vHr=Q(()=>{"use strict";(function(e){e.PROFILE="profile",e.SSO_SESSION="sso-session",e.SERVICES="services"})(l7||(l7={}))});var xHr=Q(()=>{"use strict"});var BHr=Q(()=>{"use strict"});var DHr=Q(()=>{"use strict"});var SHr=Q(()=>{"use strict"});var _Hr=Q(()=>{"use strict"});var IHr=Q(()=>{"use strict"});var THr=Q(()=>{"use strict"});var FHr=Q(()=>{"use strict"});var kHr=Q(()=>{"use strict"});var RHr=Q(()=>{"use strict"});var NHr=Q(()=>{"use strict"});var PHr=Q(()=>{"use strict"});var OHr=Q(()=>{"use strict"});var MHr=Q(()=>{"use strict"});var LHr,QHr=Q(()=>{"use strict";(function(e){e.HTTP_0_9="http/0.9",e.HTTP_1_0="http/1.0",e.TDS_8_0="tds/8.0"})(LHr||(LHr={}))});var UHr=Q(()=>{"use strict"});var qHr=Q(()=>{"use strict"});var jHr=Q(()=>{"use strict"});var HHr=Q(()=>{"use strict"});var $Hr=Q(()=>{"use strict"});var GHr=Q(()=>{"use strict"});var VHr=Q(()=>{"use strict"});var dS=Q(()=>{"use strict";Rjr();jjr();Hjr();$jr();Gjr();Vjr();Jjr();Kjr();Xjr();Zjr();sHr();oHr();cHr();dHr();fHr();hHr();yHr();CHr();bHr();wHr();vHr();xHr();BHr();DHr();SHr();_Hr();IHr();THr();FHr();kHr();RHr();NHr();PHr();OHr();MHr();QHr();UHr();qHr();jHr();HHr();$Hr();GHr();VHr()});var WHr=Q(()=>{"use strict"});var YHr=Q(()=>{"use strict"});var zHr=Q(()=>{"use strict"});function T6s(e){return Object.keys(e).reduce((t,r)=>{let n=e[r];return{...t,[r]:Array.isArray(n)?[...n]:n}},{})}var ys,JHr=Q(()=>{"use strict";ys=class e{method;protocol;hostname;port;path;query;headers;username;password;fragment;body;constructor(t){this.method=t.method||"GET",this.hostname=t.hostname||"localhost",this.port=t.port,this.query=t.query||{},this.headers=t.headers||{},this.body=t.body,this.protocol=t.protocol?t.protocol.slice(-1)!==":"?`${t.protocol}:`:t.protocol:"https:",this.path=t.path?t.path.charAt(0)!=="/"?`/${t.path}`:t.path:"/",this.username=t.username,this.password=t.password,this.fragment=t.fragment}static clone(t){let r=new e({...t,headers:{...t.headers}});return r.query&&(r.query=T6s(r.query)),r}static isInstance(t){if(!t)return!1;let r=t;return"method"in r&&"protocol"in r&&"hostname"in r&&"path"in r&&typeof r.query=="object"&&typeof r.headers=="object"}clone(){return e.clone(this)}}});var qm,KHr=Q(()=>{"use strict";qm=class{statusCode;reason;headers;body;constructor(t){this.statusCode=t.statusCode,this.reason=t.reason,this.headers=t.headers||{},this.body=t.body}static isInstance(t){if(!t)return!1;let r=t;return typeof r.statusCode=="number"&&typeof r.headers=="object"}}});var XHr=Q(()=>{"use strict"});var ZHr=Q(()=>{"use strict"});var Fa=Q(()=>{"use strict";kjr();WHr();YHr();zHr();JHr();KHr();XHr();ZHr()});function F6s(e){return t=>async r=>{let{request:n}=r;if(e.expectContinueHeader!==!1&&ys.isInstance(n)&&n.body&&e.runtime==="node"&&e.requestHandler?.constructor?.name!=="FetchHttpHandler"){let i=!0;if(typeof e.expectContinueHeader=="number")try{i=(Number(n.headers?.["content-length"])??e.bodyLengthChecker?.(n.body)??1/0)>=e.expectContinueHeader}catch{}else i=!!e.expectContinueHeader;i&&(n.headers.Expect="100-continue")}return t({...r,request:n})}}var k6s,e$r,t$r=Q(()=>{"use strict";Fa();k6s={step:"build",tags:["SET_EXPECT_HEADER","EXPECT_HEADER"],name:"addExpectContinueMiddleware",override:!0},e$r=e=>({applyToStack:t=>{t.add(F6s(e),k6s)}})});var HC,A8e,fR,g8e,ka,r$r,wre,$C=Q(()=>{"use strict";HC={WHEN_SUPPORTED:"WHEN_SUPPORTED",WHEN_REQUIRED:"WHEN_REQUIRED"},A8e=HC.WHEN_SUPPORTED,fR={WHEN_SUPPORTED:"WHEN_SUPPORTED",WHEN_REQUIRED:"WHEN_REQUIRED"},g8e=HC.WHEN_SUPPORTED;(function(e){e.MD5="MD5",e.CRC32="CRC32",e.CRC32C="CRC32C",e.CRC64NVME="CRC64NVME",e.SHA1="SHA1",e.SHA256="SHA256"})(ka||(ka={}));(function(e){e.HEADER="header",e.TRAILER="trailer"})(r$r||(r$r={}));wre=ka.CRC32});var pS,bj,yct=Q(()=>{"use strict";(function(e){e.ENV="env",e.CONFIG="shared config entry"})(pS||(pS={}));bj=(e,t,r,n)=>{if(!(t in e))return;let i=e[t].toUpperCase();if(!Object.values(r).includes(i))throw new TypeError(`Cannot load ${n} '${t}'. Expected one of ${Object.values(r)}, got '${e[t]}'.`);return i}});var R6s,N6s,n$r,i$r=Q(()=>{"use strict";$C();yct();R6s="AWS_REQUEST_CHECKSUM_CALCULATION",N6s="request_checksum_calculation",n$r={environmentVariableSelector:e=>bj(e,R6s,HC,pS.ENV),configFileSelector:e=>bj(e,N6s,HC,pS.CONFIG),default:A8e}});var P6s,O6s,s$r,o$r=Q(()=>{"use strict";$C();yct();P6s="AWS_RESPONSE_CHECKSUM_VALIDATION",O6s="response_checksum_validation",s$r={environmentVariableSelector:e=>bj(e,P6s,fR,pS.ENV),configFileSelector:e=>bj(e,O6s,fR,pS.CONFIG),default:g8e}});var Cct,bct=Q(()=>{"use strict";Cct={CrtCrc64Nvme:null}});var a$r,t4,u$r=Q(()=>{"use strict";a$r={warningEmitted:!1},t4=e=>{e&&!a$r.warningEmitted&&parseInt(e.substring(1,e.indexOf(".")))<18&&(a$r.warningEmitted=!0,process.emitWarning(`NodeDeprecationWarning: The AWS SDK for JavaScript (v3) will
|
|
8102
8102
|
no longer support Node.js 16.x on January 6, 2025.
|
|
8103
8103
|
|
|
8104
8104
|
To continue receiving updates to AWS services, bug fixes, and security
|
|
@@ -8815,7 +8815,7 @@ url: ${e}
|
|
|
8815
8815
|
statements:
|
|
8816
8816
|
- description: "TODO: Add your first step"
|
|
8817
8817
|
`});var s8n={};Hs(s8n,{runTests:()=>qxo});import{spawn as Uxo}from"child_process";import*as n8n from"fs";import*as i8n from"path";async function qxo(e){(e.includes("--help")||e.includes("-h"))&&(console.log("Usage: shiplight run [playwright-args...]"),console.log(""),console.log("Delegates to `npx playwright test` with all arguments forwarded."),console.log("Auto-detects playwright.config.ts in the current directory."),console.log(""),console.log("Examples:"),console.log(" shiplight run # run all tests"),console.log(" shiplight run --headed # run tests with browser visible"),console.log(" shiplight run tests/login.test.ts # run a specific test"),console.log(" shiplight run --grep 'login' # filter tests by name"),process.exit(0));let t=process.cwd();["playwright.config.ts","playwright.config.js","playwright.config.mjs"].some(o=>n8n.existsSync(i8n.join(t,o)))||(console.warn("Warning: No playwright.config.ts found in current directory."),console.warn(`Make sure you're running from your project root.
|
|
8818
|
-
`));let i=Uxo("npx",["playwright","test",...e],{stdio:"inherit",shell:!0,cwd:t}),s=await new Promise(o=>{i.on("close",a=>o(a??1))});process.exit(s)}var o8n=Q(()=>{"use strict"});var a8n=F((WSu,jxo)=>{jxo.exports={name:"shiplightai",version:"0.1.
|
|
8818
|
+
`));let i=Uxo("npx",["playwright","test",...e],{stdio:"inherit",shell:!0,cwd:t}),s=await new Promise(o=>{i.on("close",a=>o(a??1))});process.exit(s)}var o8n=Q(()=>{"use strict"});var a8n=F((WSu,jxo)=>{jxo.exports={name:"shiplightai",version:"0.1.8",type:"module",description:"Shiplight CLI for running and debugging .test.yaml files",main:"dist/index.js",types:"dist/index.d.ts",bin:{shiplight:"dist/cli.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/cjs/index.cjs",default:"./dist/index.js"},"./fixture":{types:"./dist/fixture.d.ts",import:"./dist/fixture.js",require:"./dist/cjs/fixture.cjs",default:"./dist/fixture.js"}},files:["dist","README.md"],publishConfig:{registry:"https://registry.npmjs.org",access:"public"},scripts:{build:"tsup","build:cli":"tsup",clean:"rm -rf dist",dev:"tsup --watch",test:"playwright test",typecheck:"tsc --noEmit"},dependencies:{"@babel/plugin-transform-typescript":"^7.27.0","@babel/preset-env":"^7.26.9","@babel/preset-typescript":"^7.27.0","@anthropic-ai/claude-agent-sdk":"^0.1.72","@modelcontextprotocol/sdk":"^0.5.0",axios:"^1.6.0",dotenv:"^16.0.3",express:"^4.21.0",glob:"^13.0.0",open:"^10.1.0",sharp:"^0.34.5",uuid:"^11.1.0",yaml:"^2.8.0",zod:"^3.22.0","zod-to-json-schema":"^3.24.6"},devDependencies:{"@playwright/test":"1.55.0","@shiplightai/sdk-pro":"workspace:*","@types/express":"^4.17.21","@types/node":"^24.0.0",copilot3:"workspace:*","mcp-tools":"workspace:*","sdk-core":"workspace:*","sdk-internal":"workspace:*","shiplight-types":"workspace:*",tsup:"^8.3.5",typescript:"5.5.4","web-session":"workspace:*"},peerDependencies:{"@playwright/test":">=1.40.0","@shiplightai/sdk-pro":">=0.2.0"},engines:{node:">=22.0.0"},keywords:["playwright","yaml","testing","automation","ai","shiplight","mcp"],author:"Shiplight",license:"MIT"}});import Hxo from"dotenv";Hxo.config();function u8n(){console.log(`
|
|
8819
8819
|
Usage: shiplight <command> [options]
|
|
8820
8820
|
|
|
8821
8821
|
Commands:
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createRequire as __createRequire } from "module";
|
|
|
2
2
|
const require = __createRequire(import.meta.url);
|
|
3
3
|
import{Da as j,da as C}from"./chunk-437WOFND.js";import*as _ from"fs";import*as d from"path";import Pt from"dotenv";import{globSync as Lt}from"glob";import{readFileSync as z,writeFileSync as $t,statSync as St,existsSync as xt}from"fs";import{resolve as kt}from"path";import{globSync as At}from"glob";import{parse as at,stringify as ot}from"yaml";import{readFileSync as tt}from"fs";import{resolve as D,dirname as et}from"path";import{parse as R,stringify as nt}from"yaml";var J=5;function H(t,e){let n={expandingPaths:new Set([D(e)]),depth:0,referencedPaths:new Set},r={...t};return Array.isArray(r.statements)&&(r.statements=y(r.statements,e,n)),Array.isArray(r.teardown)&&(r.teardown=y(r.teardown,e,n)),{doc:r,referencedTemplatePaths:Array.from(n.referencedPaths)}}function y(t,e,n){let r=[];for(let s of t)if(rt(s)){let i=st(s,e,n);r.push(...i)}else r.push(it(s,e,n));return r}function rt(t){return typeof t=="object"&&t!==null&&typeof t.template=="string"}function st(t,e,n){if(n.depth>=J)throw new Error(`Template expansion exceeded maximum depth of ${J}. Check for deeply nested or circular template references.`);let r=D(et(e),t.template);if(n.expandingPaths.has(r))throw new Error(`Circular template reference detected: ${r} is already being expanded. Stack: ${Array.from(n.expandingPaths).join(" \u2192 ")} \u2192 ${r}`);n.referencedPaths.add(r);let s;try{s=tt(r,"utf-8")}catch(l){throw new Error(`Failed to read template file: ${r} (referenced from ${e}): ${l.message}`)}let i=R(s);if(!i||typeof i!="object")throw new Error(`Invalid template file: ${r} \u2014 expected a YAML object`);let c=i.params||[],p=t.params||{};for(let l of c)if(!(l in p))throw new Error(`Template ${t.template} requires param "${l}" but it was not provided. Required params: [${c.join(", ")}]`);let g=i.statements;if(!Array.isArray(g))throw new Error(`Template ${t.template} must have a "statements" array`);if(Object.keys(p).length>0){let u=nt(g);for(let[h,x]of Object.entries(p))u=u.replaceAll(`{{${h}}}`,String(x));g=R(u)}let a={expandingPaths:new Set([...n.expandingPaths,r]),depth:n.depth+1,referencedPaths:n.referencedPaths};return y(g,r,a)}function it(t,e,n){if(typeof t!="object"||t===null)return t;let r={...t};return Array.isArray(r.statements)&&(r.statements=y(r.statements,e,n)),Array.isArray(r.THEN)&&(r.THEN=y(r.THEN,e,n)),Array.isArray(r.ELSE)&&(r.ELSE=y(r.ELSE,e,n)),Array.isArray(r.DO)&&(r.DO=y(r.DO,e,n)),r}function F(t,e){let n=at(t),r=n?.name,s=n?.tags,i=n?.use;n&&(n.name!==void 0||n.tags!==void 0||n.use!==void 0)&&(delete n.name,delete n.tags,delete n.use);let c=[];if(e&&n&&typeof n=="object"){let a=H(n,e);n=a.doc,c=a.referencedTemplatePaths}let p=ot(n);return{testFlow:C(p),name:r,tags:s,use:i,referencedTemplatePaths:c}}function v(t){return t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function w(t){return t.replace(/\r\n/g," ").replace(/\n/g," ").replace(/\r/g," ").trim()}function ct(t){let e=t.frame_path;return!e||e.length===0?"page":`page.frameLocator('${e[0]}')`}function pt(t){let e=t.xpath;return typeof e=="string"&&e.trim()?!e.startsWith("xpath=")&&!e.startsWith("/")&&!e.startsWith("//")?`xpath=//${e}`:e.startsWith("xpath=")?e:`xpath=${e}`:null}function L(t){let e=ct(t),n=t.locator;if(typeof n=="string"&&n.trim())return n=n.trim(),n.endsWith("first()")?`${e}.${n}`:`${e}.${n}.first()`;let r=pt(t);if(r){let s=JSON.stringify(r);return`${e}.locator(${s}).first()`}return null}var lt=["ai_action","ai_step","ai_assert","ai_extract","ai_wait_until","verify","assert"],gt=["js_code","function","wait","wait_for_download_complete","wait_for_page_ready","extract_email_content","extract_activation_code"];function G(t){let e=t.action_data?.action_name;return!e||(e==="verify"||e==="ai_assert"||e==="assert")&&t.action_data?.kwargs?.code?!1:lt.includes(e)}function M(t){let e=t.action_data?.action_name;return!e||(e==="verify"||e==="ai_assert"||e==="assert")&&t.action_data?.kwargs?.code?!1:!gt.includes(e)}var f=new Map;function o(t,e){f.set(t,e)}function Y(t){return f.get(t)}function $(t,e,n=[]){let r=[...n];return e.locator?r.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&r.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&r.push(`frame_path: ${JSON.stringify(e.frame_path)}`),r.length===0?[`await agent.execAction("${t}", page, {});`]:[`await agent.execAction("${t}", page, {`,...r.map(s=>` ${s},`),"});"]}o("click",t=>{let e=L(t);return e?[`await ${e}.click({ timeout: ${5e3} });`]:['await agent.execAction("click", page, {});']});o("click_element",f.get("click"));o("click_element_by_index",f.get("click"));o("double_click",t=>$("double_click",t));o("double_click_on_element",f.get("double_click"));o("right_click",t=>$("right_click",t));o("right_click_on_element",f.get("right_click"));o("hover",t=>$("hover",t));o("hover_element_by_index",f.get("hover"));o("input_text",t=>{let e=t.action_data?.kwargs?.text??t.action_data?.kwargs?.value??"";return $("input_text",t,[`action_data: { kwargs: { text: ${JSON.stringify(e)} } }`])});o("fill",f.get("input_text"));o("clear_input",t=>$("clear_input",t));o("press",t=>{let e=t.action_data?.kwargs?.keys;return[`await page.keyboard.press(${JSON.stringify(e)});`]});o("send_keys",f.get("press"));o("send_keys_on_element",t=>{let e=L(t),n=t.action_data?.kwargs?.keys||"";return e?[`await ${e}.press(${JSON.stringify(n)}, { timeout: ${5e3} });`]:['await agent.execAction("send_keys_on_element", page, {',` action_data: { kwargs: { keys: ${JSON.stringify(n)} } },`,"});"]});o("select_dropdown_option",t=>{let e=t.action_data?.kwargs?.text||t.action_data?.kwargs?.option||"";return $("select_dropdown_option",t,[`action_data: { kwargs: { text: ${JSON.stringify(e)} } }`])});o("scroll",t=>{let e=t.action_data?.kwargs?.down??!0;return[`await page.evaluate('window.scrollBy(0, window.innerHeight * ${(t.action_data?.kwargs?.num_pages??1)*(e?1:-1)})');`]});o("scroll_down",f.get("scroll"));o("scroll_up",f.get("scroll"));o("scroll_element",f.get("scroll"));o("scroll_to_text",t=>{let e=t.action_data?.kwargs?.text||"";return[`await page.getByText(${JSON.stringify(e)}, { exact: false }).first().scrollIntoViewIfNeeded();`]});o("scroll_on_element",t=>$("scroll_on_element",t,[`action_data: { kwargs: ${JSON.stringify(t.action_data?.kwargs||{})} }`]));o("go_to_url",t=>{let e=t.action_data?.kwargs?.url||"";return t.action_data?.kwargs?.new_tab===!0?['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(e)}, new_tab: true } },`,"});"]:['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(e)} } },`,"});"]});o("open_tab",f.get("go_to_url"));o("go_back",()=>['await agent.execAction("go_back", page, {});']);o("reload_page",()=>['await agent.execAction("reload_page", page, {});']);o("wait",t=>[`await page.waitForTimeout(${(t.action_data?.kwargs?.seconds||1)*1e3});`]);o("wait_for_page_ready",()=>["await page.waitForLoadState('domcontentloaded');"]);o("verify",(t,e)=>{let n=t.action_data?.kwargs;if(n?.code)return n.code.split(`
|
|
4
4
|
`);let r=n?.statement||t.action_description;return r?[`await agent.assert(page, ${JSON.stringify(r)}, '${e||""}');`]:["// Skipping verify: missing statement or code"]});o("ai_assert",f.get("verify"));o("assert",f.get("verify"));o("ai_action",(t,e)=>{let n=t.action_data?.kwargs?.statement;if(!n)return["// Skipping ai_action: missing statement"];let r=JSON.stringify(n),s=t.action_data?.kwargs?.use_pure_vision;return[`await agent.execute(page, ${r}, '${e||""}', ${s});`]});o("ai_step",(t,e)=>{let n=t.action_data?.kwargs?.statement;return n?[`await agent.run(page, ${JSON.stringify(n)}, '${e||""}');`]:["// Skipping ai_step: missing statement"]});o("ai_extract",(t,e)=>{let n=t.action_data?.kwargs?.element_description,r=t.action_data?.kwargs?.variable_name;if(!n||!r)return["// Skipping ai_extract: missing element_description or variable_name"];let s=JSON.stringify(n),i=JSON.stringify(r);return[`await agent.extract(page, ${s}, ${i}, '${e||""}');`]});o("ai_wait_until",(t,e)=>{let n=t.action_data?.kwargs?.condition,r=t.action_data?.kwargs?.timeout_seconds||60;return n?[`await agent.waitUntilCondition(page, ${JSON.stringify(n)}, ${r}, '${e||""}');`]:["// Skipping ai_wait_until: missing condition"]});o("save_variable",t=>{let e=t.action_data?.kwargs?.name||"",n=t.action_data?.kwargs?.value;return['await agent.execAction("save_variable", page, {',` action_data: { kwargs: { name: ${JSON.stringify(e)}, value: ${JSON.stringify(n)} } },`,"});"]});o("js_code",t=>{let e=t.action_data?.kwargs?.code;if(!e)return["// Skipping js_code: missing code"];let n=["{"],r=e.split(`
|
|
5
|
-
`);for(let s of r)n.push(` ${s}`);return n.push("}"),n});o("function",(t,e,n)=>{let r=t.action_data?.kwargs||{},s=r.functionName;if(s&&s.includes("#")){let[c,p]=s.split("#");if(c&&p){let g=c.replace(/\.(ts|js|mjs)$/,""),a=`import { ${p} } from '${g}';`;n?.imports?.add(a);let l={...r,functionName:p},u=U(l);return u?[u.endsWith(";")?u:`${u};`]:["// Skipping function: invalid export pattern"]}}let i=U(r);return i?[i.endsWith(";")?i:`${i};`]:["// Skipping function: missing functionName"]});o("generate_2fa_code",t=>{let e=t.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(e)} } },`,"});"]});o("upload_file",t=>{let e=t.action_data?.kwargs||{},n=[],r={};return e.paths?r.paths=e.paths:e.path&&(r.path=e.path),e.use_file_input&&(r.use_file_input=!0),n.push(`action_data: { kwargs: ${JSON.stringify(r)} }`),t.locator?n.push(`locator: ${JSON.stringify(t.locator)}`):t.xpath&&n.push(`xpath: ${JSON.stringify(t.xpath)}`),t.frame_path&&t.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(t.frame_path)}`),['await agent.execAction("upload_file", page, {',...n.map(s=>` ${s},`),"});"]});o("wait_for_download_complete",t=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${t.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);o("switch_tab",t=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${t.action_data?.kwargs?.page_id??0} } },`,"});"]);o("close_tab",t=>{let e=t.action_data?.kwargs?.page_id;return e=e??t.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${e} } },`,"});"]});o("set_date_for_native_date_picker",t=>{let e=t.action_data?.kwargs?.date??"",n=[];return n.push(`action_data: { kwargs: { date: ${JSON.stringify(e)} } }`),t.locator?n.push(`locator: ${JSON.stringify(t.locator)}`):t.xpath&&n.push(`xpath: ${JSON.stringify(t.xpath)}`),t.frame_path&&t.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(t.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...n.map(r=>` ${r},`),"});"]});o("done",()=>["// Done - no action needed"]);function U(t){let e=t.functionName;if(!e)return null;let n={},r=t.parameterNames||[],s=t.parameterValues||t.args||[];if(r.forEach((g,a)=>{a<s.length&&(n[g]=s[a])}),Object.keys(n).length===0)return`await ${e}()`;let i=["page","testContext","request","agentServices"],c=["undefined","null","true","false"],p=Object.entries(n).map(([g,a])=>{let l=String(a);return a==null?"undefined":i.includes(g)&&i.includes(l)||c.includes(l)||/^-?\d+(\.\d+)?$/.test(l)?l:l.startsWith("$")?`agent.agentServices.readVariable('${l.substring(1)}')`:`"${l}"`});return`await ${e}(${p.join(", ")})`}function m(t,e,n,r="main"){let s=[];for(let i=0;i<t.length;i++){let c=t[i],p=`${r}.${i}`,g=ut(c,e,p,n);g.length>0&&(s.push(...g),i<t.length-1&&s.push(""))}return s}function ut(t,e,n,r){let s=" ".repeat(e);switch(t.type){case"DRAFT":return ft(t,e,n);case"ACTION":return dt(t,e,n,r);case"STEP":return mt(t,e,n,r);case"IF_ELSE":return _t(t,e,n,r);case"WHILE_LOOP":return ht(t,e,n,r);default:return[`${s}// Unknown statement type: ${t.type}`]}}function ft(t,e,n){let r=" ".repeat(e),s=t.description?.trim()||"";if(!s)return[`${r}// ${n}: Skipping - no description`];let i=JSON.stringify(s);return[`${r}// ${n}: ${w(s)}`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.run(page, ${i}, '${n}');`]}function dt(t,e,n,r){let s=" ".repeat(e),i=t.description,c=t.uid,g=r.actionEntityStore?.entries[t.uid]?.action_entity??t.action_entity;if(!g){if(!i)return[`${s}// ${n}: Skipping - no description`];let A=JSON.stringify(i),Z=!!t.use_pure_vision;return[`${s}// ${n}: ${w(i)}`,`${s}page = agent.agentServices.validatePage(page);`,`${s}await agent.execute(page, ${A}, '${n}', ${Z});`]}let a=t.locator?{...g,locator:t.locator}:g;i&&i!==a.action_description&&(a={...a,action_description:i});let l=a.action_data?.action_name||"",u=a.action_description||"",h=Y(l);if(!h)return[`${s}// ${n}: Unknown action: ${l}`];let x={imports:r.imports},k=h(a,n,x);if(G(a))return[`${s}// ${n}: ${w(u)}`,`${s}page = agent.agentServices.validatePage(page);`,...k.map(A=>`${s}${A}`)];let P=JSON.stringify(u),I=k.map(A=>`${s} ${A}`),O=M(a),Q=c?`'${c}'`:"undefined";return[`${s}// ${n}: ${w(u)}`,`${s}page = agent.agentServices.validatePage(page);`,`${s}await agent.step(page, async () => {`,...I,`${s}}, ${P}, '${n}', ${Q}, ${O});`]}function mt(t,e,n,r){let s=" ".repeat(e),i=[];t.description&&t.description.trim()&&i.push(`${s}// Step: ${w(t.description)}`);let c=m(t.statements,e,r,n);return i.push(...c),i}function _t(t,e,n,r){let s=" ".repeat(e),i=[];if(i.push(`${s}// ${n}: Conditional check`),t.condition.type==="JS_CODE")i.push(`${s}if (${t.condition.expression}) {`);else{i.push(`${s}// AI Condition: ${w(t.condition.expression)}`);let p=JSON.stringify(t.condition.expression);i.push(`${s}if (await agent.evaluate(page, ${p}, "${n}")) {`)}let c=m(t.then,e+1,r,`${n}.then`);if(i.push(...c),t.else&&t.else.length>0){i.push(`${s}} else {`);let p=m(t.else,e+1,r,`${n}.else`);i.push(...p)}return i.push(`${s}}`),i}function ht(t,e,n,r){let s=" ".repeat(e),i=[];i.push(`${s}// ${n}: Loop`);let c=t.timeout_ms??j,p=c/1e3,g=t.timeout_ms?`While loop exceeded timeout of ${p}s`:`While loop exceeded default timeout of ${p}s`,a=`loop_${n.replace(/\./g,"_")}`;if(i.push(`${s}const ${a}_start = Date.now();`),i.push(`${s}const ${a}_timeout = ${c};`),i.push(`${s}const ${a}_check = () => {`),i.push(`${s} if (Date.now() - ${a}_start > ${a}_timeout) {`),i.push(`${s} throw new Error('${g}');`),i.push(`${s} }`),i.push(`${s} return true;`),i.push(`${s}};`),t.condition.type==="JS_CODE")i.push(`${s}while (${a}_check() && (${t.condition.expression})) {`);else{i.push(`${s}// AI Loop Condition: ${w(t.condition.expression)}`);let u=JSON.stringify(t.condition.expression);i.push(`${s}while (${a}_check() && await agent.evaluate(page, ${u}, "${n}")) {`)}let l=m(t.body,e+1,r,`${n}.body`);return i.push(...l),i.push(`${s}}`),i}var V={name:"shiplightai",version:"0.1.
|
|
5
|
+
`);for(let s of r)n.push(` ${s}`);return n.push("}"),n});o("function",(t,e,n)=>{let r=t.action_data?.kwargs||{},s=r.functionName;if(s&&s.includes("#")){let[c,p]=s.split("#");if(c&&p){let g=c.replace(/\.(ts|js|mjs)$/,""),a=`import { ${p} } from '${g}';`;n?.imports?.add(a);let l={...r,functionName:p},u=U(l);return u?[u.endsWith(";")?u:`${u};`]:["// Skipping function: invalid export pattern"]}}let i=U(r);return i?[i.endsWith(";")?i:`${i};`]:["// Skipping function: missing functionName"]});o("generate_2fa_code",t=>{let e=t.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(e)} } },`,"});"]});o("upload_file",t=>{let e=t.action_data?.kwargs||{},n=[],r={};return e.paths?r.paths=e.paths:e.path&&(r.path=e.path),e.use_file_input&&(r.use_file_input=!0),n.push(`action_data: { kwargs: ${JSON.stringify(r)} }`),t.locator?n.push(`locator: ${JSON.stringify(t.locator)}`):t.xpath&&n.push(`xpath: ${JSON.stringify(t.xpath)}`),t.frame_path&&t.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(t.frame_path)}`),['await agent.execAction("upload_file", page, {',...n.map(s=>` ${s},`),"});"]});o("wait_for_download_complete",t=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${t.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);o("switch_tab",t=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${t.action_data?.kwargs?.page_id??0} } },`,"});"]);o("close_tab",t=>{let e=t.action_data?.kwargs?.page_id;return e=e??t.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${e} } },`,"});"]});o("set_date_for_native_date_picker",t=>{let e=t.action_data?.kwargs?.date??"",n=[];return n.push(`action_data: { kwargs: { date: ${JSON.stringify(e)} } }`),t.locator?n.push(`locator: ${JSON.stringify(t.locator)}`):t.xpath&&n.push(`xpath: ${JSON.stringify(t.xpath)}`),t.frame_path&&t.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(t.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...n.map(r=>` ${r},`),"});"]});o("done",()=>["// Done - no action needed"]);function U(t){let e=t.functionName;if(!e)return null;let n={},r=t.parameterNames||[],s=t.parameterValues||t.args||[];if(r.forEach((g,a)=>{a<s.length&&(n[g]=s[a])}),Object.keys(n).length===0)return`await ${e}()`;let i=["page","testContext","request","agentServices"],c=["undefined","null","true","false"],p=Object.entries(n).map(([g,a])=>{let l=String(a);return a==null?"undefined":i.includes(g)&&i.includes(l)||c.includes(l)||/^-?\d+(\.\d+)?$/.test(l)?l:l.startsWith("$")?`agent.agentServices.readVariable('${l.substring(1)}')`:`"${l}"`});return`await ${e}(${p.join(", ")})`}function m(t,e,n,r="main"){let s=[];for(let i=0;i<t.length;i++){let c=t[i],p=`${r}.${i}`,g=ut(c,e,p,n);g.length>0&&(s.push(...g),i<t.length-1&&s.push(""))}return s}function ut(t,e,n,r){let s=" ".repeat(e);switch(t.type){case"DRAFT":return ft(t,e,n);case"ACTION":return dt(t,e,n,r);case"STEP":return mt(t,e,n,r);case"IF_ELSE":return _t(t,e,n,r);case"WHILE_LOOP":return ht(t,e,n,r);default:return[`${s}// Unknown statement type: ${t.type}`]}}function ft(t,e,n){let r=" ".repeat(e),s=t.description?.trim()||"";if(!s)return[`${r}// ${n}: Skipping - no description`];let i=JSON.stringify(s);return[`${r}// ${n}: ${w(s)}`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.run(page, ${i}, '${n}');`]}function dt(t,e,n,r){let s=" ".repeat(e),i=t.description,c=t.uid,g=r.actionEntityStore?.entries[t.uid]?.action_entity??t.action_entity;if(!g){if(!i)return[`${s}// ${n}: Skipping - no description`];let A=JSON.stringify(i),Z=!!t.use_pure_vision;return[`${s}// ${n}: ${w(i)}`,`${s}page = agent.agentServices.validatePage(page);`,`${s}await agent.execute(page, ${A}, '${n}', ${Z});`]}let a=t.locator?{...g,locator:t.locator}:g;i&&i!==a.action_description&&(a={...a,action_description:i});let l=a.action_data?.action_name||"",u=a.action_description||"",h=Y(l);if(!h)return[`${s}// ${n}: Unknown action: ${l}`];let x={imports:r.imports},k=h(a,n,x);if(G(a))return[`${s}// ${n}: ${w(u)}`,`${s}page = agent.agentServices.validatePage(page);`,...k.map(A=>`${s}${A}`)];let P=JSON.stringify(u),I=k.map(A=>`${s} ${A}`),O=M(a),Q=c?`'${c}'`:"undefined";return[`${s}// ${n}: ${w(u)}`,`${s}page = agent.agentServices.validatePage(page);`,`${s}await agent.step(page, async () => {`,...I,`${s}}, ${P}, '${n}', ${Q}, ${O});`]}function mt(t,e,n,r){let s=" ".repeat(e),i=[];t.description&&t.description.trim()&&i.push(`${s}// Step: ${w(t.description)}`);let c=m(t.statements,e,r,n);return i.push(...c),i}function _t(t,e,n,r){let s=" ".repeat(e),i=[];if(i.push(`${s}// ${n}: Conditional check`),t.condition.type==="JS_CODE")i.push(`${s}if (${t.condition.expression}) {`);else{i.push(`${s}// AI Condition: ${w(t.condition.expression)}`);let p=JSON.stringify(t.condition.expression);i.push(`${s}if (await agent.evaluate(page, ${p}, "${n}")) {`)}let c=m(t.then,e+1,r,`${n}.then`);if(i.push(...c),t.else&&t.else.length>0){i.push(`${s}} else {`);let p=m(t.else,e+1,r,`${n}.else`);i.push(...p)}return i.push(`${s}}`),i}function ht(t,e,n,r){let s=" ".repeat(e),i=[];i.push(`${s}// ${n}: Loop`);let c=t.timeout_ms??j,p=c/1e3,g=t.timeout_ms?`While loop exceeded timeout of ${p}s`:`While loop exceeded default timeout of ${p}s`,a=`loop_${n.replace(/\./g,"_")}`;if(i.push(`${s}const ${a}_start = Date.now();`),i.push(`${s}const ${a}_timeout = ${c};`),i.push(`${s}const ${a}_check = () => {`),i.push(`${s} if (Date.now() - ${a}_start > ${a}_timeout) {`),i.push(`${s} throw new Error('${g}');`),i.push(`${s} }`),i.push(`${s} return true;`),i.push(`${s}};`),t.condition.type==="JS_CODE")i.push(`${s}while (${a}_check() && (${t.condition.expression})) {`);else{i.push(`${s}// AI Loop Condition: ${w(t.condition.expression)}`);let u=JSON.stringify(t.condition.expression);i.push(`${s}while (${a}_check() && await agent.evaluate(page, ${u}, "${n}")) {`)}let l=m(t.body,e+1,r,`${n}.body`);return i.push(...l),i.push(`${s}}`),i}var V={name:"shiplightai",version:"0.1.8",type:"module",description:"Shiplight CLI for running and debugging .test.yaml files",main:"dist/index.js",types:"dist/index.d.ts",bin:{shiplight:"dist/cli.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/cjs/index.cjs",default:"./dist/index.js"},"./fixture":{types:"./dist/fixture.d.ts",import:"./dist/fixture.js",require:"./dist/cjs/fixture.cjs",default:"./dist/fixture.js"}},files:["dist","README.md"],publishConfig:{registry:"https://registry.npmjs.org",access:"public"},scripts:{build:"tsup","build:cli":"tsup",clean:"rm -rf dist",dev:"tsup --watch",test:"playwright test",typecheck:"tsc --noEmit"},dependencies:{"@babel/plugin-transform-typescript":"^7.27.0","@babel/preset-env":"^7.26.9","@babel/preset-typescript":"^7.27.0","@anthropic-ai/claude-agent-sdk":"^0.1.72","@modelcontextprotocol/sdk":"^0.5.0",axios:"^1.6.0",dotenv:"^16.0.3",express:"^4.21.0",glob:"^13.0.0",open:"^10.1.0",sharp:"^0.34.5",uuid:"^11.1.0",yaml:"^2.8.0",zod:"^3.22.0","zod-to-json-schema":"^3.24.6"},devDependencies:{"@playwright/test":"1.55.0","@shiplightai/sdk-pro":"workspace:*","@types/express":"^4.17.21","@types/node":"^24.0.0",copilot3:"workspace:*","mcp-tools":"workspace:*","sdk-core":"workspace:*","sdk-internal":"workspace:*","shiplight-types":"workspace:*",tsup:"^8.3.5",typescript:"5.5.4","web-session":"workspace:*"},peerDependencies:{"@playwright/test":">=1.40.0","@shiplightai/sdk-pro":">=0.2.0"},engines:{node:">=22.0.0"},keywords:["playwright","yaml","testing","automation","ai","shiplight","mcp"],author:"Shiplight",license:"MIT"};var N=V.version;function K(t,e){let n=[];n.push(`// @generated by shiplightai v${N}`),n.push(...yt()),n.push(""),e?.use&&Object.keys(e.use).length>0&&(n.push(`test.use(${JSON.stringify(e.use,null,2)});`),n.push(""));let r=e?.testName||t.goal||"Generated test",s=e?.tags&&e.tags.length>0?e.tags.map(a=>`@${a}`).join(" ")+" ":"";n.push(`test('${s}${v(r)}', async ({ page, agent }) => {`);let i=e?.startingUrl||t.url;if(i){let a;try{a=new URL(i).pathname}catch{a=i}n.push(` await page.goto('${v(a)}', { waitUntil: 'domcontentloaded' });`),n.push("")}let c=new Set,p={imports:c};if(t.teardown&&t.teardown.length>0){if(n.push(" try {"),t.statements&&t.statements.length>0){n.push(" // Test steps");let l=m(t.statements,2,p);n.push(...l)}n.push(" } finally {"),n.push(" // Teardown");let a=m(t.teardown,2,p,"teardown");n.push(...a),n.push(" }")}else if(t.statements&&t.statements.length>0){n.push(" // Test steps");let a=m(t.statements,1,p);n.push(...a)}if(n.push("});"),c.size>0){let a=0;for(let u=0;u<n.length;u++)n[u].startsWith("import ")&&(a=u+1);let l=Array.from(c);n.splice(a,0,...l)}return n.join(`
|
|
6
6
|
`)}function yt(){return["import { test, expect } from 'shiplightai/fixture';"]}function q(t){try{return St(t).mtimeMs}catch{return 0}}var Tt=`// @generated by shiplightai v${N}`;function Ot(t,e){if(!xt(t)||z(t,"utf-8").split(`
|
|
7
7
|
`,1)[0]!==Tt)return!1;let r=q(t);for(let s of e)if(q(s)>r)return!1;return!0}function B(t){let e=At("**/*.test.yaml",{cwd:t.cwd,ignore:["**/node_modules/**"]}),n=[];for(let r of e){let s=kt(t.cwd,r),i=s.replace(/\.test\.yaml$/,".yaml.spec.ts"),c=z(s,"utf-8");try{let{testFlow:p,name:g,tags:a,use:l,referencedTemplatePaths:u}=F(c,s);if(Ot(i,[s,...u]))continue;let h=K(p,{testName:g,tags:a,use:l});$t(i,h)}catch(p){console.error(`[shiplight] Failed to transpile ${r}:`,p),n.push({file:r,error:p})}}if(n.length>0)throw new Error(`[shiplight] Transpilation failed for ${n.length} file(s):
|
|
8
8
|
`+n.map(r=>` - ${r.file}`).join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shiplightai",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Shiplight CLI for running and debugging .test.yaml files",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"web-session": "workspace:*"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
73
|
-
"@playwright/test": "1.
|
|
73
|
+
"@playwright/test": ">=1.40.0",
|
|
74
74
|
"@shiplightai/sdk-pro": ">=0.2.0"
|
|
75
75
|
},
|
|
76
76
|
"engines": {
|