assuremind 1.4.1 โ†’ 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@ Describe tests in plain English. AI generates Playwright code. Run anywhere.
12
12
  > ### ๐ŸŒ Website โ€” [https://assuremind.in/](https://assuremind.in/)
13
13
  > ### ๐Ÿ’ฌ Community Hub โ€” [https://assuremind.in/community/](https://assuremind.in/community/)
14
14
  > Report bugs ยท request features ยท share ideas & feedback ยท ask questions.
15
- > ๐Ÿ“ง Contact: [assuremind.contact@gmail.com](mailto:assuremind.contact@gmail.com)
15
+ > ### ๐Ÿ“ง Contact: [assuremind.contact@gmail.com](mailto:assuremind.contact@gmail.com)
16
16
 
17
17
  ---
18
18
 
package/dist/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var wf=Object.create;var hn=Object.defineProperty;var bf=Object.getOwnPropertyDescriptor;var vf=Object.getOwnPropertyNames;var xf=Object.getPrototypeOf,Sf=Object.prototype.hasOwnProperty;var b=(r,e)=>()=>(r&&(e=r(r=0)),e);var Et=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Q=(r,e)=>{for(var t in e)hn(r,t,{get:e[t],enumerable:!0})},fc=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of vf(e))!Sf.call(r,n)&&n!==t&&hn(r,n,{get:()=>e[n],enumerable:!(s=bf(e,n))||s.enumerable});return r};var x=(r,e,t)=>(t=r!=null?wf(xf(r)):{},fc(e||!r||!r.__esModule?hn(t,"default",{value:r,enumerable:!0}):t,r)),et=r=>fc(hn({},"__esModule",{value:!0}),r);var Cf,y,m=b(()=>{"use strict";Cf=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,y=Cf()});function Pe(r){process.stdout.write(`${L.success("\u2713")} ${r}
2
+ "use strict";var wf=Object.create;var hn=Object.defineProperty;var bf=Object.getOwnPropertyDescriptor;var vf=Object.getOwnPropertyNames;var xf=Object.getPrototypeOf,Sf=Object.prototype.hasOwnProperty;var b=(r,e,t)=>()=>{if(t)throw t[0];try{return r&&(e=r(r=0)),e}catch(s){throw t=[s],s}};var Et=(r,e)=>()=>{try{return e||r((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}},Q=(r,e)=>{for(var t in e)hn(r,t,{get:e[t],enumerable:!0})},fc=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of vf(e))!Sf.call(r,n)&&n!==t&&hn(r,n,{get:()=>e[n],enumerable:!(s=bf(e,n))||s.enumerable});return r};var x=(r,e,t)=>(t=r!=null?wf(xf(r)):{},fc(e||!r||!r.__esModule?hn(t,"default",{value:r,enumerable:!0}):t,r)),et=r=>fc(hn({},"__esModule",{value:!0}),r);var Cf,y,m=b(()=>{"use strict";Cf=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,y=Cf()});function Pe(r){process.stdout.write(`${L.success("\u2713")} ${r}
3
3
  `)}function W(r){process.stderr.write(`${L.error("\u2717")} ${r}
4
4
  `)}function Ge(r){process.stdout.write(`${L.warn("\u26A0")} ${r}
5
5
  `)}function V(r){process.stdout.write(`${L.info("\u2139")} ${r}
@@ -103,7 +103,7 @@ ${s}`,"variables","INVALID_VARIABLES")}return t.data}async function sl(r,e){let
103
103
  ${s}`,"variables","INVALID_VARIABLES")}await K(r,t.data),hh.debug({path:r},"Variables written")}async function ba(r){let e=dr.default.join(r,Ks,wa);return rs(e)}async function va(r,e){let t=dr.default.join(r,Ks,yh(e));return rs(t)}async function rt(r,e){let t=await ba(r),s=e?await va(r,e):{},n={...t,...s},i={};for(let[a,o]of Object.entries(n))i[a]=tl(o);return i}async function nl(r,e,t){let s=dr.default.join(r,Ks,wa);await Xs.default.ensureDir(dr.default.dirname(s));let n=await rs(s);n[e]=t,await sl(s,n)}async function il(r,e){let t=dr.default.join(r,Ks,wa),s=await rs(t);if(!(e in s))throw new oe(`Variable "${e}" not found in global variables.`,t,"VARIABLE_NOT_FOUND");delete s[e],await sl(t,s)}async function al(r){let e=dr.default.join(r,Ks);return await Xs.default.pathExists(e)?(await Xs.default.readdir(e,{withFileTypes:!0})).filter(s=>s.isFile()&&s.name.endsWith(".json")).map(s=>dr.default.join(e,s.name)):[]}var dr,Xs,hh,Ks,wa,pr=b(()=>{"use strict";m();dr=x(require("path")),Xs=x(require("fs-extra"));rl();te();N();ze();hh=E("variable-store"),Ks="variables",wa="global.json"});function wh(r){let e=r.trim();return/^https?:\/\//i.test(e)?e:e.startsWith("/")?`{{BASE_URL}}${e}`:/^[\w-]+\.[\w.-]+/.test(e)?`https://${e}`:e}function $r(r){return(r??"").trim().replace(/^(?:the|a|an)\s+/i,"").replace(/\s+(?:field|input|box|textbox|dropdown|drop-down|menu|list|selector|element)$/i,"").trim()}function xa(r){let e=$r(r);return/\b(?:pass(?:word|code|phrase)?|pwd)\b/i.test(e)?`page.getByLabel('${e}')`:/\b(?:number|amount|quantity|qty|age|count)\b/i.test(e)?`page.getByRole('spinbutton', { name: '${e}' })`:`page.getByRole('textbox', { name: '${e}' })`}function Sa(r,e,t){let s=$r(e),i=[`await ${s?`page.getByLabel('${s}')`:`page.locator('input[type="file"]')`}.setInputFiles('${r}');`];return t?i.push(`await expect(page.getByText('${t}')).toBeVisible();`):i.push("await page.waitForLoadState('networkidle');"),i.join(`
104
104
  `)}function ol(r,e){let t=$r(r);return["const downloadPromise = page.waitForEvent('download');",`await ${e==="button"?`page.getByRole('button', { name: '${t}' })`:e==="link"?`page.getByRole('link', { name: '${t}' })`:`page.getByText('${t}')`}.click();`,"const download = await downloadPromise;","await download.path();"].join(`
105
105
  `)}var cl,kn,ll=b(()=>{"use strict";m();cl=[{regex:/^(?:go to|navigate to|open|visit)\s+(.+)$/i,gen:r=>`await page.goto('${wh(r[1]??"")}');`},{regex:/^(?:go|navigate)\s+back$/i,gen:()=>"await page.goBack();"},{regex:/^refresh\s+(?:the\s+)?page$/i,gen:()=>"await page.reload();"},{regex:/^download\s+(?:the\s+)?(?:file\s+)?(?:by\s+clicking\s+)?["']?(.+?)["']?(\s+button|\s+link)?$/i,gen:r=>ol((r[1]??"").trim(),(r[2]??"").trim().toLowerCase())},{regex:/^click\s+(?:the\s+)?(?:on\s+)?["']?(.+?)["']?(\s+button|\s+link)?\s+(?:to\s+download|and\s+wait\s+for\s+(?:the\s+)?download)$/i,gen:r=>ol((r[1]??"").trim(),(r[2]??"").trim().toLowerCase())},{regex:/^(?:select|choose|click|tick|pick)\s+(?:the\s+)?(?:on\s+)?["']?(.+?)["']?\s+radio(?:\s+button)?$/i,gen:r=>`await page.getByRole('radio', { name: '${$r(r[1]??"")}' }).check();`},{regex:/^click\s+(?:the\s+)?(?:on\s+)?["'](.+?)["'](\s+button|\s+link|\s+tab|\s+menu)?$/i,gen:r=>{let e=r[1]??"",t=(r[2]??"").trim().toLowerCase();return t==="button"?`await page.getByRole('button', { name: '${e}' }).click();`:t==="link"?`await page.getByRole('link', { name: '${e}' }).click();`:`await page.getByText('${e}').click();`}},{regex:/^click\s+(?:the\s+)?(?:on\s+)?(\w[\w\s]{0,30}?)(\s+button|\s+link|\s+tab)?$/i,gen:r=>{let e=(r[1]??"").trim(),t=(r[2]??"").trim().toLowerCase();return t==="button"?`await page.getByRole('button', { name: '${e}' }).click();`:t==="link"?`await page.getByRole('link', { name: '${e}' }).click();`:`await page.getByText('${e}').click();`}},{regex:/^double\s+click\s+(?:the\s+)?(?:on\s+)?["']?(.+?)["']?$/i,gen:r=>`await page.getByText('${r[1]}').dblclick();`},{regex:/^right\s+click\s+(?:the\s+)?(?:on\s+)?["']?(.+?)["']?$/i,gen:r=>`await page.getByText('${r[1]}').click({ button: 'right' });`},{regex:/^(?:type|enter|fill|input)\s+["']?(.+?)["']?\s+(?:in|into)\s+(?:the\s+)?(.+)$/i,gen:r=>`await ${xa(r[2]??"")}.fill('${r[1]}');`},{regex:/^clear\s+(?:the\s+)?(.+?)(?:\s+field)?$/i,gen:r=>`await ${xa(r[1]??"")}.clear();`},{regex:/^upload\s+(?:the\s+)?(?:file\s+)?["']?(.+?)["']?\s+(?:to|into|in|on)\s+(?:the\s+)?(.+?)\s+and\s+wait\s+for\s+["'](.+?)["']$/i,gen:r=>Sa(r[1]??"",r[2]??"",r[3]??"")},{regex:/^upload\s+(?:the\s+)?(?:file\s+)?["']?(.+?)["']?\s+(?:to|into|in|on)\s+(?:the\s+)?(.+)$/i,gen:r=>Sa(r[1]??"",r[2]??"","")},{regex:/^upload\s+(?:the\s+)?(?:file\s+)?["']?(.+?)["']?$/i,gen:r=>Sa(r[1]??"","","")},{regex:/^(?:verify|check|assert|ensure|confirm)\s+(?:that\s+)?["'](.+?)["']\s+(?:is\s+)?(?:visible|shown|displayed|present|appears)$/i,gen:r=>`await expect(page.getByText('${r[1]}')).toBeVisible();`},{regex:/^(?:verify|check|assert)\s+(?:that\s+)?["'](.+?)["']\s+(?:is\s+)?(?:not visible|hidden|not shown|gone|disappeared|not present)$/i,gen:r=>`await expect(page.getByText('${r[1]}')).not.toBeVisible();`},{regex:/^(?:verify|check)\s+(?:the\s+)?(?:page\s+)?title\s+(?:is|contains)\s+["'](.+?)["']$/i,gen:r=>`await expect(page).toHaveTitle(/${r[1]}/);`},{regex:/^(?:verify|check)\s+(?:the\s+)?url\s+(?:is|contains|matches)\s+["'](.+?)["']$/i,gen:r=>`await expect(page).toHaveURL(/${(r[1]??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}/);`},{regex:/^(?:verify|check)\s+(?:the\s+)?["'](.+?)["']\s+(?:field|input)\s+(?:has value|contains|equals)\s+["'](.+?)["']$/i,gen:r=>`await expect(page.getByLabel('${r[1]}')).toHaveValue('${r[2]}');`},{regex:/^soft\s+(?:verify|check|assert|ensure|confirm)\s+(?:that\s+)?["'](.+?)["']\s+(?:is\s+)?(?:visible|shown|displayed|present|appears)$/i,gen:r=>`await expect.soft(page.getByText('${r[1]}')).toBeVisible();`},{regex:/^soft\s+(?:verify|check|assert)\s+(?:that\s+)?["'](.+?)["']\s+(?:is\s+)?(?:not visible|hidden|not shown|gone|disappeared|not present)$/i,gen:r=>`await expect.soft(page.getByText('${r[1]}')).not.toBeVisible();`},{regex:/^soft\s+(?:verify|check)\s+(?:the\s+)?(?:page\s+)?title\s+(?:is|contains)\s+["'](.+?)["']$/i,gen:r=>`await expect.soft(page).toHaveTitle(/${r[1]}/);`},{regex:/^soft\s+(?:verify|check)\s+(?:the\s+)?url\s+(?:is|contains|matches)\s+["'](.+?)["']$/i,gen:r=>`await expect.soft(page).toHaveURL(/${(r[1]??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}/);`},{regex:/^soft\s+(?:verify|check)\s+(?:the\s+)?["'](.+?)["']\s+(?:field|input)\s+(?:has value|contains|equals)\s+["'](.+?)["']$/i,gen:r=>`await expect.soft(page.getByLabel('${r[1]}')).toHaveValue('${r[2]}');`},{regex:/^press\s+(.+)$/i,gen:r=>`await page.keyboard.press('${(r[1]??"").trim()}');`},{regex:/^(?:type|enter|fill)\s+["']?(.+?)["']?\s+(?:and\s+)?press\s+enter$/i,gen:r=>`await page.keyboard.type('${r[1]}');
106
- await page.keyboard.press('Enter');`},{regex:/^select\s+["'](.+?)["']\s+from\s+(?:the\s+)?(.+)$/i,gen:r=>`await page.getByRole('combobox', { name: '${$r(r[2]??"")}' }).selectOption('${r[1]}');`},{regex:/^check\s+(?:the\s+)?["']?(.+?)["']?(?:\s+checkbox)?$/i,gen:r=>`await page.getByRole('checkbox', { name: '${$r(r[1]??"")}' }).check();`},{regex:/^uncheck\s+(?:the\s+)?["']?(.+?)["']?(?:\s+checkbox)?$/i,gen:r=>`await page.getByRole('checkbox', { name: '${$r(r[1]??"")}' }).uncheck();`},{regex:/^wait\s+(?:for\s+)?(\d+)\s+seconds?$/i,gen:r=>`await page.waitForTimeout(${parseInt(r[1]??"1",10)*1e3});`},{regex:/^wait\s+(?:for\s+)?(?:the\s+)?page\s+(?:to\s+)?load$/i,gen:()=>"await page.waitForLoadState('networkidle');"},{regex:/^scroll\s+(down|up)$/i,gen:r=>`await page.evaluate(() => window.scrollBy(0, ${(r[1]??"").toLowerCase()==="down"?500:-500}));`},{regex:/^scroll\s+to\s+(top|bottom)$/i,gen:r=>`await page.evaluate(() => window.scrollTo(0, ${(r[1]??"").toLowerCase()==="top"?0:"document.body.scrollHeight"}));`},{regex:/^hover\s+(?:over\s+)?(?:the\s+)?["']?(.+?)["']?$/i,gen:r=>`await page.getByText('${r[1]}').hover();`},{regex:/^take\s+(?:a\s+)?screenshot$/i,gen:()=>`await page.screenshot({ path: 'results/screenshots/step_${Date.now()}.png', fullPage: true });`},{regex:/^(?:focus|tab to)\s+(?:the\s+)?(.+?)(?:\s+field)?$/i,gen:r=>`await ${xa(r[1]??"")}.focus();`}],kn=class{tryMatch(e){for(let t of cl){let s=e.match(t.regex);if(s!==null)return t.gen(s)}return null}get patternCount(){return cl.length}}});function bh(r){return(0,ul.createHash)("sha256").update(r,"utf8").digest("hex")}function vh(r){try{return new URL(r).pathname.split("/").map(s=>/^\d+$/.test(s)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s)||/^[a-z0-9-]{8,}$/i.test(s)&&/-/.test(s)?"*":s).join("/")}catch{return r}}function dl(r,e){let t=r.toLowerCase().replace(/\s+/g," ").trim(),s=vh(e);return bh(`${t}|${s}`).slice(0,16)}var ul,pl=b(()=>{"use strict";m();ul=require("crypto")});var ml,Ca,ss,xh,Sh,ns,Ea=b(()=>{"use strict";m();ml=x(require("path")),Ca=x(require("fs-extra"));pl();N();ze();ss=E("code-cache"),xh=ml.default.join("results",".code-cache.json"),Sh=3e4,ns=class{constructor(e=xh){this.persistPath=e}cache=new Map;dirty=!1;persistTimer=null;generateKey(e,t){return dl(e,t)}get(e){let t=this.cache.get(e);return t?t.failCount>=2?(this.cache.delete(e),this.dirty=!0,ss.debug({key:e},"Cache entry invalidated after 2 failures"),null):(t.lastUsedAt=Date.now(),t):null}set(e,t,s){this.cache.set(e,{code:t,urlPattern:s,successCount:0,failCount:0,createdAt:Date.now(),lastUsedAt:Date.now()}),this.dirty=!0}recordPass(e){let t=this.cache.get(e);t&&(t.successCount++,t.failCount=0,this.dirty=!0)}recordFail(e){let t=this.cache.get(e);t&&(t.failCount++,t.failCount>=2&&(this.cache.delete(e),ss.debug({key:e},"Cache entry removed after 2 failures")),this.dirty=!0)}get size(){return this.cache.size}async persist(){if(this.dirty)try{let e=Object.fromEntries(this.cache.entries());await K(this.persistPath,e),this.dirty=!1,ss.debug({entries:this.cache.size,path:this.persistPath},"Cache persisted")}catch(e){ss.warn({err:e},"Failed to persist code cache")}}async load(){if(await Ca.default.pathExists(this.persistPath))try{let e=await Ca.default.readJson(this.persistPath);this.cache.clear();for(let[t,s]of Object.entries(e))this.cache.set(t,s);ss.debug({entries:this.cache.size,path:this.persistPath},"Cache loaded")}catch(e){ss.warn({err:e},"Failed to load code cache \u2014 starting fresh")}}startAutoSave(){if(this.persistTimer)return;this.persistTimer=setInterval(()=>{this.persist()},Sh),this.persistTimer.unref&&this.persistTimer.unref();let e=()=>{this.persist()};process.once("exit",e),process.once("SIGINT",e),process.once("SIGTERM",e)}stopAutoSave(){this.persistTimer&&(clearInterval(this.persistTimer),this.persistTimer=null)}}});var Ch,An,gl=b(()=>{"use strict";m();Ch=[/table|grid|chart|graph|calendar|datepicker/i,/drag|drop|resize|reorder|sortable/i,/verify.*(count|greater|less|between|exactly|more than|fewer)/i,/wait\s+until|disappears|loading\s+(?:is\s+)?(?:done|complete|finished)/i,/(?:first|second|third|last|nth|\d+(?:st|nd|rd|th))\s+(?:item|row|card|element|result)/i,/if\s+|conditional|depending|based on/i,/iframe|shadow\s*dom|popup|modal|dialog|alert/i,/upload|download|file|attachment/i,/hover\s+.*then|right.click|double.click/i,/api|network|request|response|intercept/i,/(?:store|save|capture|extract)\s+.*(?:variable|value|text)/i,/multi.?select|autocomplete|typeahead|combobox/i],An=class{classify(e){let t=Ch.filter(s=>s.test(e)).length;return t>=2?"complex":t===1?"medium":"simple"}}});var Ia,$n,fl=b(()=>{"use strict";m();At();N();Ia=E("batch-processor"),$n=class{constructor(e,t){this.templateEngine=e;this.cache=t}async batchGenerate(e,t){let s=new Map,n=[];for(let o=0;o<e.length;o++){let{instruction:c,context:l}=e[o],u=this.templateEngine.tryMatch(c);if(u!==null){s.set(o,u);continue}let d=this.cache.generateKey(c,l.url),p=this.cache.get(d);if(p!==null){s.set(o,p.code);continue}n.push({index:o,instruction:c,context:l})}if(Ia.debug({total:e.length,local:s.size,needsAI:n.length},"Batch resolution"),n.length===0)return s;let i=n.map(o=>({instruction:o.instruction,context:o.context})),a=await t.batchGenerateCode(i);for(let o=0;o<n.length;o++){let c=n[o],l=a[o];if(!l){Ia.warn({instruction:c.instruction},"AI returned empty code for step");continue}let u;try{u=De(l)}catch(p){Ia.warn({instruction:c.instruction,err:p},"Skipping unsafe/invalid batch result");continue}s.set(c.index,u);let d=this.cache.generateKey(c.instruction,c.context.url);this.cache.set(d,u,c.context.url)}return s}}});function Eh(r){return r.includes("'")?`"${r.replace(/"/g,'\\"')}"`:`'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`}function hl(r){return r.split("||").map(e=>e.trim()).filter(Boolean).map(e=>`frameLocator(${Eh(e)})`).join(".")+"."}function Ih(r){let e=new Map;for(let t of r.split(`
106
+ await page.keyboard.press('Enter');`},{regex:/^select\s+["'](.+?)["']\s+from\s+(?:the\s+)?(.+)$/i,gen:r=>`await page.getByRole('combobox', { name: '${$r(r[2]??"")}' }).selectOption('${r[1]}');`},{regex:/^check\s+(?:the\s+)?["']?(.+?)["']?(?:\s+checkbox)?$/i,gen:r=>`await page.getByRole('checkbox', { name: '${$r(r[1]??"")}' }).check();`},{regex:/^uncheck\s+(?:the\s+)?["']?(.+?)["']?(?:\s+checkbox)?$/i,gen:r=>`await page.getByRole('checkbox', { name: '${$r(r[1]??"")}' }).uncheck();`},{regex:/^wait\s+(?:for\s+)?(\d+)\s+seconds?$/i,gen:r=>`await page.waitForTimeout(${parseInt(r[1]??"1",10)*1e3});`},{regex:/^wait\s+(?:for\s+)?(?:the\s+)?page\s+(?:to\s+)?load$/i,gen:()=>"await page.waitForLoadState('networkidle');"},{regex:/^scroll\s+(down|up)$/i,gen:r=>`await page.evaluate(() => window.scrollBy(0, ${(r[1]??"").toLowerCase()==="down"?500:-500}));`},{regex:/^scroll\s+to\s+(top|bottom)$/i,gen:r=>`await page.evaluate(() => window.scrollTo(0, ${(r[1]??"").toLowerCase()==="top"?0:"document.body.scrollHeight"}));`},{regex:/^hover\s+(?:over\s+)?(?:the\s+)?["']?(.+?)["']?$/i,gen:r=>`await page.getByText('${r[1]}').hover();`},{regex:/^take\s+(?:a\s+)?screenshot$/i,gen:()=>`await page.screenshot({ path: 'results/screenshots/step_${Date.now()}.png', fullPage: true });`},{regex:/^(?:focus|tab to)\s+(?:the\s+)?(.+?)(?:\s+field)?$/i,gen:r=>`await ${xa(r[1]??"")}.focus();`}],kn=class{tryMatch(e){for(let t of cl){let s=e.match(t.regex);if(s!==null)return t.gen(s)}return null}get patternCount(){return cl.length}}});function bh(r){return(0,ul.createHash)("sha256").update(r,"utf8").digest("hex")}function vh(r){try{return new URL(r).pathname.split("/").map(s=>/^\d+$/.test(s)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s)||/^[a-z0-9-]{8,}$/i.test(s)&&/-/.test(s)?"*":s).join("/")}catch{return r}}function dl(r,e){let t=r.toLowerCase().replace(/\s+/g," ").trim(),s=vh(e);return bh(`${t}|${s}`).slice(0,16)}var ul,pl=b(()=>{"use strict";m();ul=require("crypto")});var ml,Ca,ss,xh,Sh,ns,Ea=b(()=>{"use strict";m();ml=x(require("path")),Ca=x(require("fs-extra"));pl();N();ze();ss=E("code-cache"),xh=ml.default.join("results",".code-cache.json"),Sh=3e4,ns=class{constructor(e=xh){this.persistPath=e}persistPath;cache=new Map;dirty=!1;persistTimer=null;generateKey(e,t){return dl(e,t)}get(e){let t=this.cache.get(e);return t?t.failCount>=2?(this.cache.delete(e),this.dirty=!0,ss.debug({key:e},"Cache entry invalidated after 2 failures"),null):(t.lastUsedAt=Date.now(),t):null}set(e,t,s){this.cache.set(e,{code:t,urlPattern:s,successCount:0,failCount:0,createdAt:Date.now(),lastUsedAt:Date.now()}),this.dirty=!0}recordPass(e){let t=this.cache.get(e);t&&(t.successCount++,t.failCount=0,this.dirty=!0)}recordFail(e){let t=this.cache.get(e);t&&(t.failCount++,t.failCount>=2&&(this.cache.delete(e),ss.debug({key:e},"Cache entry removed after 2 failures")),this.dirty=!0)}get size(){return this.cache.size}async persist(){if(this.dirty)try{let e=Object.fromEntries(this.cache.entries());await K(this.persistPath,e),this.dirty=!1,ss.debug({entries:this.cache.size,path:this.persistPath},"Cache persisted")}catch(e){ss.warn({err:e},"Failed to persist code cache")}}async load(){if(await Ca.default.pathExists(this.persistPath))try{let e=await Ca.default.readJson(this.persistPath);this.cache.clear();for(let[t,s]of Object.entries(e))this.cache.set(t,s);ss.debug({entries:this.cache.size,path:this.persistPath},"Cache loaded")}catch(e){ss.warn({err:e},"Failed to load code cache \u2014 starting fresh")}}startAutoSave(){if(this.persistTimer)return;this.persistTimer=setInterval(()=>{this.persist()},Sh),this.persistTimer.unref&&this.persistTimer.unref();let e=()=>{this.persist()};process.once("exit",e),process.once("SIGINT",e),process.once("SIGTERM",e)}stopAutoSave(){this.persistTimer&&(clearInterval(this.persistTimer),this.persistTimer=null)}}});var Ch,An,gl=b(()=>{"use strict";m();Ch=[/table|grid|chart|graph|calendar|datepicker/i,/drag|drop|resize|reorder|sortable/i,/verify.*(count|greater|less|between|exactly|more than|fewer)/i,/wait\s+until|disappears|loading\s+(?:is\s+)?(?:done|complete|finished)/i,/(?:first|second|third|last|nth|\d+(?:st|nd|rd|th))\s+(?:item|row|card|element|result)/i,/if\s+|conditional|depending|based on/i,/iframe|shadow\s*dom|popup|modal|dialog|alert/i,/upload|download|file|attachment/i,/hover\s+.*then|right.click|double.click/i,/api|network|request|response|intercept/i,/(?:store|save|capture|extract)\s+.*(?:variable|value|text)/i,/multi.?select|autocomplete|typeahead|combobox/i],An=class{classify(e){let t=Ch.filter(s=>s.test(e)).length;return t>=2?"complex":t===1?"medium":"simple"}}});var Ia,$n,fl=b(()=>{"use strict";m();At();N();Ia=E("batch-processor"),$n=class{constructor(e,t){this.templateEngine=e;this.cache=t}templateEngine;cache;async batchGenerate(e,t){let s=new Map,n=[];for(let o=0;o<e.length;o++){let{instruction:c,context:l}=e[o],u=this.templateEngine.tryMatch(c);if(u!==null){s.set(o,u);continue}let d=this.cache.generateKey(c,l.url),p=this.cache.get(d);if(p!==null){s.set(o,p.code);continue}n.push({index:o,instruction:c,context:l})}if(Ia.debug({total:e.length,local:s.size,needsAI:n.length},"Batch resolution"),n.length===0)return s;let i=n.map(o=>({instruction:o.instruction,context:o.context})),a=await t.batchGenerateCode(i);for(let o=0;o<n.length;o++){let c=n[o],l=a[o];if(!l){Ia.warn({instruction:c.instruction},"AI returned empty code for step");continue}let u;try{u=De(l)}catch(p){Ia.warn({instruction:c.instruction,err:p},"Skipping unsafe/invalid batch result");continue}s.set(c.index,u);let d=this.cache.generateKey(c.instruction,c.context.url);this.cache.set(d,u,c.context.url)}return s}}});function Eh(r){return r.includes("'")?`"${r.replace(/"/g,'\\"')}"`:`'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`}function hl(r){return r.split("||").map(e=>e.trim()).filter(Boolean).map(e=>`frameLocator(${Eh(e)})`).join(".")+"."}function Ih(r){let e=new Map;for(let t of r.split(`
107
107
  `)){if(!t.trim())continue;let s=t.match(/frame="([^"]*)"/),n=s?s[1]:null,i=[],a=t.match(/^[\w-]+\s+"([^"]*)"/);a&&i.push(a[1]);for(let o of t.matchAll(/(?:text|label|aria-label|placeholder)="([^"]*)"/g))i.push(o[1]);for(let o of i){let c=o.trim().toLowerCase();if(!c)continue;let l=e.get(c);l?l.frame!==n&&(l.ambiguous=!0):e.set(c,{frame:n,ambiguous:!1})}}return e}function yl(r,e){if(!e)return null;let t=r.get(e.trim().toLowerCase());return!t||t.ambiguous||!t.frame?null:t.frame}function wl(r,e){if(!r||!e||!e.includes("frame=")||!r.includes("page.getBy"))return r;let t=Ih(e);if(t.size===0)return r;let s=r;return s=s.replace(/\bpage\.getByRole\((['"])[^'"]+\1\s*,\s*\{[^}]*\}/g,n=>{let i=n.match(/name:\s*(['"])([^'"]*)\1/),a=yl(t,i?.[2]);return a?n.replace(/^page\./,`page.${hl(a)}`):n}),s=s.replace(/\bpage\.getBy(?:Text|Label|Placeholder)\((['"])([^'"]+)\1/g,(n,i,a)=>{let o=yl(t,a);return o?n.replace(/^page\./,`page.${hl(o)}`):n}),s}var bl=b(()=>{"use strict";m()});function Th(r){return(r.match(/^(\s*)/)?.[1]??"").replace(/\t/g," ").length}function kh(r,e){if(r)return`iframe[name='${r}']`;let t=e.match(/title=([^\s\]]+)/i);return t?`iframe[title='${t[1]}']`:"iframe"}function _n(r){if(!r||!r.trim())return{title:"",interactiveElements:"",accessibilityTree:""};let e=r.split(`
108
108
  `),t="",s=[],n=[];for(let l of e){let u=l.trim();if(!u||u==="-")continue;let d=Th(l);for(;n.length>0&&d<=n[n.length-1].indent;)n.pop();let p=u.match(/^-?\s*Page\s+"([^"]*)"/i);if(p){t=p[1]??"";continue}let g=u.match(/^-?\s*([\w-]+)(?:\s+"([^"]*)")?(?:\s+\[([^\]]*)\])?/);if(!g)continue;let f=g[1].toLowerCase(),h=g[2]??"",S=g[3]??"";if(f==="iframe"||f==="frame"){let k=n.length>0?n[n.length-1].chain:"",T=kh(h,S),P=k?`${k}||${T}`:T;n.push({indent:d,chain:P});continue}if(h.length>80&&(h=h.slice(0,79)+"\u2026"),!h&&!S)continue;let I=Ph.has(f),v=Rh.has(f);if(I||v){let k=n.length>0?n[n.length-1].chain:null;s.push({role:f,name:h,attrs:S,isInteractive:I,frame:k})}}let i=s.filter(l=>l.isInteractive),a=s.filter(l=>!l.isInteractive),c=[...i,...a].slice(0,120).map(l=>{let u=`${l.role} "${l.name}"`;return l.attrs&&(u+=` [${l.attrs}]`),l.frame&&(u+=` frame="${l.frame}"`),u});return{title:t,interactiveElements:c.join(`
109
109
  `),accessibilityTree:r.slice(0,8e3)}}var Ph,Rh,Pa=b(()=>{"use strict";m();Ph=new Set(["button","link","textbox","checkbox","radio","combobox","listbox","menuitem","menuitemcheckbox","menuitemradio","option","searchbox","slider","spinbutton","switch","tab","treeitem"]),Rh=new Set(["heading","img","navigation","dialog","alert","alertdialog","status","progressbar","table","row","cell","columnheader","rowheader"])});function vl(r,e){let t=`Current page accessibility snapshot:
@@ -689,13 +689,13 @@ ${a}`,"healingReport","INVALID_HEALING_REPORT")}return i.data}async function nt(
689
689
  `);throw new X(`Cannot write invalid run result:
690
690
  ${n}`,"result","INVALID_RESULT")}let s=Wa(jr.default.join(r,zn),e.runId);await K(s,t.data),Ka.info({runId:e.runId,status:e.status},"Run result saved")}async function Br(r,e){let t=Wa(jr.default.join(r,zn),e);if(!await Mr.default.pathExists(t))throw new oe(`Run result not found for runId "${e}".`,t,"RESULT_NOT_FOUND");let s=await ue(t),n=Xa.safeParse(s);if(!n.success){let i=n.error.issues.map(a=>` \u2022 ${a.path.join(".")}: ${a.message}`).join(`
691
691
  `);throw new X(`Invalid run result at "${t}":
692
- ${i}`,"result","INVALID_RESULT")}return n.data}async function Ja(r){let e=jr.default.join(r,zn,ad);if(!await Mr.default.pathExists(e))return[];let s=(await Mr.default.readdir(e,{withFileTypes:!0})).filter(i=>i.isFile()&&i.name.endsWith(".json")).map(i=>i.name.replace(".json",""));return(await Promise.all(s.map(async i=>{let a=await Mr.default.stat(jr.default.join(e,`${i}.json`));return{id:i,mtime:a.mtimeMs}}))).sort((i,a)=>a.mtime-i.mtime).map(i=>i.id)}async function qn(r,e=20){let t=await Ja(r),s=[];for(let n of t.slice(0,e))try{let i=await Br(r,n);s.push({runId:i.runId,status:i.status,environment:i.environment,startedAt:i.startedAt,finishedAt:i.finishedAt,totalTests:i.totalTests,passed:i.passed,failed:i.failed,skipped:i.skipped,duration:i.duration,suiteIds:i.suites.map(a=>a.suiteId)})}catch(i){Ka.warn({runId:n,err:i},"Failed to read run result \u2014 skipping")}return s}async function cd(r,e){let t=Wa(jr.default.join(r,zn),e);if(!await Mr.default.pathExists(t))throw new oe(`Run result not found for runId "${e}".`,t,"RESULT_NOT_FOUND");await Mr.default.remove(t),Ka.info({runId:e},"Run result deleted")}var jr,Mr,Ka,zn,ad,Zs=b(()=>{"use strict";m();jr=x(require("path")),Mr=x(require("fs-extra"));id();te();N();ze();Ka=E("result-store"),zn="results",ad="runs"});function ld(r){let t=r.toLowerCase().replace(/\{\{[^}]+\}\}/g," __var__ ").replace(/"([^"]+)"/g,(n,i)=>` ${i} `).replace(/'([^']+)'/g,(n,i)=>` ${i} `).replace(/[^a-z0-9\s-]/g," ").trim().split(/\s+/).filter(n=>n.length>1&&!my.has(n)),s=[...t];for(let n=0;n<t.length-1;n++)s.push(`${t[n]}_${t[n+1]}`);return s}function gy(r){return(0,ud.createHash)("md5").update(r).digest().readUInt32LE(0)%Ya}var ud,Kn,Ya,my,Xn,dd=b(()=>{"use strict";m();ud=require("crypto"),Kn=require("fs-extra"),Ya=256,my=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","need","dare","ought","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","out","off","over","under","again","further","then","once","that","this","these","those","and","but","or","nor","not","so","very","just","than","too","also","it","its"]);Xn=class{constructor(e){this.vocabPath=e}vocab={docCount:0,termDocFreq:{}};dirty=!1;async load(){try{this.vocab=await(0,Kn.readJson)(this.vocabPath)}catch{this.vocab={docCount:0,termDocFreq:{}}}}async save(){this.dirty&&(await(0,Kn.outputJson)(this.vocabPath,this.vocab,{spaces:0}),this.dirty=!1)}addDocument(e){let t=new Set(ld(e));this.vocab.docCount++;for(let s of t)this.vocab.termDocFreq[s]=(this.vocab.termDocFreq[s]??0)+1;this.dirty=!0}addDocuments(e){for(let t of e)this.addDocument(t)}embed(e){let t=ld(e);if(t.length===0)return new Array(Ya).fill(0);let s={};for(let o of t)s[o]=(s[o]??0)+1;let n=new Array(Ya).fill(0),i=Math.max(this.vocab.docCount,1);for(let[o,c]of Object.entries(s)){let l=c/t.length,u=this.vocab.termDocFreq[o]??0,d=Math.log(1+i/(1+u)),p=l*d,g=gy(o);n[g]+=p}let a=Math.sqrt(n.reduce((o,c)=>o+c*c,0));if(a>0)for(let o=0;o<n.length;o++)n[o]/=a;return n}get documentCount(){return this.vocab.docCount}}});function pd(r,e){if(r.length!==e.length||r.length===0)return 0;let t=0,s=0,n=0;for(let a=0;a<r.length;a++)t+=r[a]*e[a],s+=r[a]*r[a],n+=e[a]*e[a];let i=Math.sqrt(s)*Math.sqrt(n);return i===0?0:t/i}var md=b(()=>{"use strict";m()});var cs,os,gd=b(()=>{"use strict";m();cs=require("fs-extra");md();os=class{constructor(e,t=500){this.filePath=e;this.maxEntries=t}documents=[];dirty=!1;async load(){if(await(0,cs.pathExists)(this.filePath))try{let e=await(0,cs.readJson)(this.filePath);this.documents=e.documents??[]}catch{this.documents=[]}}async persist(){if(!this.dirty)return;let e={version:1,documents:this.documents};await(0,cs.outputJson)(this.filePath,e,{spaces:0}),this.dirty=!1}add(e,t,s,n){this.documents=this.documents.filter(a=>a.id!==e);let i=Date.now();this.documents.push({id:e,text:t,vector:s,metadata:n,createdAt:i,updatedAt:i}),this.dirty=!0,this.documents.length>this.maxEntries&&this.prune()}update(e,t){let s=this.documents.find(n=>n.id===e);return s?(s.metadata={...s.metadata,...t},s.updatedAt=Date.now(),this.dirty=!0,!0):!1}remove(e){let t=this.documents.length;return this.documents=this.documents.filter(s=>s.id!==e),this.documents.length!==t?(this.dirty=!0,!0):!1}get(e){return this.documents.find(t=>t.id===e)}has(e){return this.documents.some(t=>t.id===e)}get size(){return this.documents.length}search(e,t=5,s=.5){let n=[];for(let i of this.documents){let a=pd(e,i.vector);a>=s&&n.push({id:i.id,text:i.text,metadata:i.metadata,score:a})}return n.sort((i,a)=>{if(Math.abs(i.score-a.score)>.001)return a.score-i.score;let o=this.documents.find(l=>l.id===i.id);return this.documents.find(l=>l.id===a.id).updatedAt-o.updatedAt}),n.slice(0,t)}prune(){let e=[...this.documents].sort((s,n)=>s.updatedAt-n.updatedAt),t=e.length-this.maxEntries;if(t>0){let s=new Set(e.slice(0,t).map(n=>n.id));this.documents=this.documents.filter(n=>!s.has(n.id))}}}});function hy(r,e){let t=`${r.toLowerCase().trim()}|${Qa(e)}`;return(0,fd.createHash)("sha256").update(t).digest("hex").slice(0,16)}function Qa(r){if(!r)return"";try{let e=new URL(r),t=e.pathname.replace(/\/\d+/g,"/*");return`${e.hostname}${t}`}catch{return r}}function yy(r,e,t){let s=e+t;if(s===0)return r;let n=e/s;return r*(1+.05*n)}function wy(r){return{id:r.id,instruction:r.metadata.instruction,code:r.metadata.code,urlPattern:r.metadata.urlPattern,score:r.score,successCount:r.metadata.successCount,failCount:r.metadata.failCount}}var fd,fy,Wn,hd=b(()=>{"use strict";m();fd=require("crypto"),fy=2,Wn=class{constructor(e,t){this.store=e;this.embedder=t}ingest(e,t,s){let n=hy(e,s),i=Qa(s),a=`${e} ${i}`,o=this.store.get(n);if(o){this.store.update(n,{...o.metadata,code:t,successCount:o.metadata.successCount+1,consecutiveFails:0});return}this.embedder.addDocument(a);let c=this.embedder.embed(a);this.store.add(n,a,c,{instruction:e,code:t,urlPattern:i,successCount:1,failCount:0,consecutiveFails:0})}retrieve(e,t="",s=3,n=.65){if(this.store.size===0)return[];let i=Qa(t),a=`${e} ${i}`,o=this.embedder.embed(a),l=this.store.search(o,s*2,n).map(u=>({...u,score:yy(u.score,u.metadata.successCount,u.metadata.failCount)}));return l.sort((u,d)=>d.score-u.score),l.slice(0,s).map(wy)}recordOutcome(e,t){let s=this.store.get(e);if(s)if(t)this.store.update(e,{...s.metadata,successCount:s.metadata.successCount+1,consecutiveFails:0});else{let n=s.metadata.consecutiveFails+1;if(n>=fy){this.store.remove(e);return}this.store.update(e,{...s.metadata,failCount:s.metadata.failCount+1,consecutiveFails:n})}}get size(){return this.store.size}}});function by(r,e){let t=`${r.toLowerCase().trim()}|${Jn(e)}`;return(0,yd.createHash)("sha256").update(t).digest("hex").slice(0,16)}function Jn(r){return r.replace(/\d+ms/g,"Nms").replace(/\d+/g,"N").replace(/["'][^"']*["']/g,"'...'").replace(/\s+/g," ").trim().slice(0,200)}function vy(r){if(!r)return"";try{let e=new URL(r);return`${e.hostname}${e.pathname.replace(/\/\d+/g,"/*")}`}catch{return r}}function xy(r){return{id:r.id,instruction:r.metadata.instruction,error:r.metadata.error,failedCode:r.metadata.failedCode,healedCode:r.metadata.healedCode,strategy:r.metadata.strategy,level:r.metadata.level,score:r.score,successCount:r.metadata.successCount}}var yd,Yn,wd=b(()=>{"use strict";m();yd=require("crypto"),Yn=class{constructor(e,t){this.store=e;this.embedder=t}ingest(e){let t=by(e.instruction,e.error),s=vy(e.url),n=`${e.instruction} ${Jn(e.error)}`,i=this.store.get(t);if(i){this.store.update(t,{...i.metadata,healedCode:e.healedCode,strategy:e.strategy,level:e.level,successCount:i.metadata.successCount+1});return}this.embedder.addDocument(n);let a=this.embedder.embed(n);this.store.add(t,n,a,{instruction:e.instruction,error:Jn(e.error),failedCode:e.failedCode,healedCode:e.healedCode,strategy:e.strategy,level:e.level,urlPattern:s,successCount:1})}retrieve(e,t,s=3,n=.6){if(this.store.size===0)return[];let i=`${e} ${Jn(t)}`,a=this.embedder.embed(i);return this.store.search(a,s,n).map(xy)}get size(){return this.store.size}}});function Sy(r,e){let t=`${r}|${e}`;return(0,vd.createHash)("sha256").update(t).digest("hex").slice(0,16)}function Cy(r){return r.replace(/\d+ms/g,"Nms").replace(/\d+/g,"N").replace(/["'][^"']*["']/g,"'...'").replace(/\s+/g," ").trim().slice(0,200)}function bd(r){if(!r)return"";try{let e=new URL(r);return`${e.hostname}${e.pathname.replace(/\/\d+/g,"/*")}`}catch{return r}}function Ey(r){let e=r.metadata.commonFixes;return{errorPattern:r.metadata.errorPattern,urlPattern:r.metadata.urlPattern,frequency:r.metadata.frequency,suggestedFix:e.length>0?e[e.length-1]:null,score:r.score}}var vd,Qn,xd=b(()=>{"use strict";m();vd=require("crypto"),Qn=class{constructor(e,t){this.store=e;this.embedder=t}record(e,t,s){let n=Cy(e),i=bd(t),a=Sy(n,i),o=`${n} ${i}`,c=this.store.get(a);if(c){let u=[...c.metadata.commonFixes];s&&!u.includes(s)&&(u.push(s),u.length>5&&u.shift()),this.store.update(a,{...c.metadata,frequency:c.metadata.frequency+1,lastSeen:Date.now(),commonFixes:u});return}this.embedder.addDocument(o);let l=this.embedder.embed(o);this.store.add(a,o,l,{errorPattern:n,urlPattern:i,frequency:1,lastSeen:Date.now(),commonFixes:s?[s]:[]})}getWarnings(e,t=5){if(this.store.size===0)return[];let s=bd(e),n=this.embedder.embed(s),a=this.store.search(n,t*2,.3).filter(o=>o.metadata.frequency>=2);return a.sort((o,c)=>c.metadata.frequency-o.metadata.frequency),a.slice(0,t).map(Ey)}get size(){return this.store.size}}});var ls,Sd,Za,Zn,Cd=b(()=>{"use strict";m();ls=require("path"),Sd=require("fs-extra");dd();gd();hd();wd();xd();N();Za=E("rag"),Zn=class r{codeCorpus;healingCorpus;errorCatalog;embedder;codeStore;healingStore;errorStore;constructor(e,t,s,n){this.embedder=e,this.codeStore=t,this.healingStore=s,this.errorStore=n,this.codeCorpus=new Wn(t,e),this.healingCorpus=new Yn(s,e),this.errorCatalog=new Qn(n,e)}static async create(e,t){let s=(0,ls.join)(e,"results",".rag");await(0,Sd.ensureDir)(s),Za.info({ragDir:s},"Initializing RAG manager");let n=new Xn((0,ls.join)(s,"idf-vocab.json"));await n.load();let i=new os((0,ls.join)(s,"code-corpus.json"),t.codeCorpus.maxEntries),a=new os((0,ls.join)(s,"healing-corpus.json"),t.healingCorpus.maxEntries),o=new os((0,ls.join)(s,"error-catalog.json"),t.errorCatalog.maxEntries);return await Promise.all([i.load(),a.load(),o.load()]),Za.info({codeCorpus:i.size,healingCorpus:a.size,errorCatalog:o.size,idfDocuments:n.documentCount},"RAG corpora loaded"),new r(n,i,a,o)}async persist(){await Promise.all([this.embedder.save(),this.codeStore.persist(),this.healingStore.persist(),this.errorStore.persist()]),Za.debug("RAG corpora persisted")}getStats(){return{codeCorpus:this.codeStore.size,healingCorpus:this.healingStore.size,errorCatalog:this.errorStore.size,idfVocab:this.embedder.documentCount}}}});function Py(r){let e=[];for(let t of Iy){t.regex.lastIndex=0;let s;for(;(s=t.regex.exec(r))!==null;)t.type==="getByRole"?e.push({selector:s[0],type:t.type,role:s[1],name:s[2]}):e.push({selector:s[0],type:t.type,name:s[1]})}return e}function Ry(r,e,t){let s=r.toLowerCase();for(let n of e){let i=n.match(/"([^"]+)"/);if(i&&i[1].toLowerCase()===s&&(!t||n.toLowerCase().startsWith(t.toLowerCase())))return n}for(let n of e){let i=n.match(/"([^"]+)"/);if(i){let a=i[1].toLowerCase();if((a.includes(s)||s.includes(a))&&(!t||n.toLowerCase().startsWith(t.toLowerCase())))return n}}if(t){let n=e.filter(i=>i.toLowerCase().startsWith(t.toLowerCase()));if(n.length>0){let i=0,a;for(let o of n){let c=o.match(/"([^"]+)"/);if(c){let l=Ty(s,c[1].toLowerCase());l>i&&(i=l,a=o)}}if(i>.3)return a}}}function Ty(r,e){if(r===e)return 1;let t=r.length>e.length?r:e,s=r.length>e.length?e:r;if(t.length===0)return 1;let n=0;for(let i=0;i<s.length;i++)t.includes(s[i])&&n++;return n/t.length}async function Id(r,e,t){let s=Py(t);if(s.length===0)return{url:e,ok:!0,total:0,matched:0,missing:0,checks:[]};await r.navigate(e);let n=await r.snapshot();if(!n)return Ed.warn({url:e},"Proactive check: snapshot returned null \u2014 skipping validation"),{url:e,ok:!0,total:s.length,matched:0,missing:0,checks:[]};let a=_n(n).interactiveElements.split(`
692
+ ${i}`,"result","INVALID_RESULT")}return n.data}async function Ja(r){let e=jr.default.join(r,zn,ad);if(!await Mr.default.pathExists(e))return[];let s=(await Mr.default.readdir(e,{withFileTypes:!0})).filter(i=>i.isFile()&&i.name.endsWith(".json")).map(i=>i.name.replace(".json",""));return(await Promise.all(s.map(async i=>{let a=await Mr.default.stat(jr.default.join(e,`${i}.json`));return{id:i,mtime:a.mtimeMs}}))).sort((i,a)=>a.mtime-i.mtime).map(i=>i.id)}async function qn(r,e=20){let t=await Ja(r),s=[];for(let n of t.slice(0,e))try{let i=await Br(r,n);s.push({runId:i.runId,status:i.status,environment:i.environment,startedAt:i.startedAt,finishedAt:i.finishedAt,totalTests:i.totalTests,passed:i.passed,failed:i.failed,skipped:i.skipped,duration:i.duration,suiteIds:i.suites.map(a=>a.suiteId)})}catch(i){Ka.warn({runId:n,err:i},"Failed to read run result \u2014 skipping")}return s}async function cd(r,e){let t=Wa(jr.default.join(r,zn),e);if(!await Mr.default.pathExists(t))throw new oe(`Run result not found for runId "${e}".`,t,"RESULT_NOT_FOUND");await Mr.default.remove(t),Ka.info({runId:e},"Run result deleted")}var jr,Mr,Ka,zn,ad,Zs=b(()=>{"use strict";m();jr=x(require("path")),Mr=x(require("fs-extra"));id();te();N();ze();Ka=E("result-store"),zn="results",ad="runs"});function ld(r){let t=r.toLowerCase().replace(/\{\{[^}]+\}\}/g," __var__ ").replace(/"([^"]+)"/g,(n,i)=>` ${i} `).replace(/'([^']+)'/g,(n,i)=>` ${i} `).replace(/[^a-z0-9\s-]/g," ").trim().split(/\s+/).filter(n=>n.length>1&&!my.has(n)),s=[...t];for(let n=0;n<t.length-1;n++)s.push(`${t[n]}_${t[n+1]}`);return s}function gy(r){return(0,ud.createHash)("md5").update(r).digest().readUInt32LE(0)%Ya}var ud,Kn,Ya,my,Xn,dd=b(()=>{"use strict";m();ud=require("crypto"),Kn=require("fs-extra"),Ya=256,my=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","need","dare","ought","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","out","off","over","under","again","further","then","once","that","this","these","those","and","but","or","nor","not","so","very","just","than","too","also","it","its"]);Xn=class{constructor(e){this.vocabPath=e}vocabPath;vocab={docCount:0,termDocFreq:{}};dirty=!1;async load(){try{this.vocab=await(0,Kn.readJson)(this.vocabPath)}catch{this.vocab={docCount:0,termDocFreq:{}}}}async save(){this.dirty&&(await(0,Kn.outputJson)(this.vocabPath,this.vocab,{spaces:0}),this.dirty=!1)}addDocument(e){let t=new Set(ld(e));this.vocab.docCount++;for(let s of t)this.vocab.termDocFreq[s]=(this.vocab.termDocFreq[s]??0)+1;this.dirty=!0}addDocuments(e){for(let t of e)this.addDocument(t)}embed(e){let t=ld(e);if(t.length===0)return new Array(Ya).fill(0);let s={};for(let o of t)s[o]=(s[o]??0)+1;let n=new Array(Ya).fill(0),i=Math.max(this.vocab.docCount,1);for(let[o,c]of Object.entries(s)){let l=c/t.length,u=this.vocab.termDocFreq[o]??0,d=Math.log(1+i/(1+u)),p=l*d,g=gy(o);n[g]+=p}let a=Math.sqrt(n.reduce((o,c)=>o+c*c,0));if(a>0)for(let o=0;o<n.length;o++)n[o]/=a;return n}get documentCount(){return this.vocab.docCount}}});function pd(r,e){if(r.length!==e.length||r.length===0)return 0;let t=0,s=0,n=0;for(let a=0;a<r.length;a++)t+=r[a]*e[a],s+=r[a]*r[a],n+=e[a]*e[a];let i=Math.sqrt(s)*Math.sqrt(n);return i===0?0:t/i}var md=b(()=>{"use strict";m()});var cs,os,gd=b(()=>{"use strict";m();cs=require("fs-extra");md();os=class{constructor(e,t=500){this.filePath=e;this.maxEntries=t}filePath;maxEntries;documents=[];dirty=!1;async load(){if(await(0,cs.pathExists)(this.filePath))try{let e=await(0,cs.readJson)(this.filePath);this.documents=e.documents??[]}catch{this.documents=[]}}async persist(){if(!this.dirty)return;let e={version:1,documents:this.documents};await(0,cs.outputJson)(this.filePath,e,{spaces:0}),this.dirty=!1}add(e,t,s,n){this.documents=this.documents.filter(a=>a.id!==e);let i=Date.now();this.documents.push({id:e,text:t,vector:s,metadata:n,createdAt:i,updatedAt:i}),this.dirty=!0,this.documents.length>this.maxEntries&&this.prune()}update(e,t){let s=this.documents.find(n=>n.id===e);return s?(s.metadata={...s.metadata,...t},s.updatedAt=Date.now(),this.dirty=!0,!0):!1}remove(e){let t=this.documents.length;return this.documents=this.documents.filter(s=>s.id!==e),this.documents.length!==t?(this.dirty=!0,!0):!1}get(e){return this.documents.find(t=>t.id===e)}has(e){return this.documents.some(t=>t.id===e)}get size(){return this.documents.length}search(e,t=5,s=.5){let n=[];for(let i of this.documents){let a=pd(e,i.vector);a>=s&&n.push({id:i.id,text:i.text,metadata:i.metadata,score:a})}return n.sort((i,a)=>{if(Math.abs(i.score-a.score)>.001)return a.score-i.score;let o=this.documents.find(l=>l.id===i.id);return this.documents.find(l=>l.id===a.id).updatedAt-o.updatedAt}),n.slice(0,t)}prune(){let e=[...this.documents].sort((s,n)=>s.updatedAt-n.updatedAt),t=e.length-this.maxEntries;if(t>0){let s=new Set(e.slice(0,t).map(n=>n.id));this.documents=this.documents.filter(n=>!s.has(n.id))}}}});function hy(r,e){let t=`${r.toLowerCase().trim()}|${Qa(e)}`;return(0,fd.createHash)("sha256").update(t).digest("hex").slice(0,16)}function Qa(r){if(!r)return"";try{let e=new URL(r),t=e.pathname.replace(/\/\d+/g,"/*");return`${e.hostname}${t}`}catch{return r}}function yy(r,e,t){let s=e+t;if(s===0)return r;let n=e/s;return r*(1+.05*n)}function wy(r){return{id:r.id,instruction:r.metadata.instruction,code:r.metadata.code,urlPattern:r.metadata.urlPattern,score:r.score,successCount:r.metadata.successCount,failCount:r.metadata.failCount}}var fd,fy,Wn,hd=b(()=>{"use strict";m();fd=require("crypto"),fy=2,Wn=class{constructor(e,t){this.store=e;this.embedder=t}store;embedder;ingest(e,t,s){let n=hy(e,s),i=Qa(s),a=`${e} ${i}`,o=this.store.get(n);if(o){this.store.update(n,{...o.metadata,code:t,successCount:o.metadata.successCount+1,consecutiveFails:0});return}this.embedder.addDocument(a);let c=this.embedder.embed(a);this.store.add(n,a,c,{instruction:e,code:t,urlPattern:i,successCount:1,failCount:0,consecutiveFails:0})}retrieve(e,t="",s=3,n=.65){if(this.store.size===0)return[];let i=Qa(t),a=`${e} ${i}`,o=this.embedder.embed(a),l=this.store.search(o,s*2,n).map(u=>({...u,score:yy(u.score,u.metadata.successCount,u.metadata.failCount)}));return l.sort((u,d)=>d.score-u.score),l.slice(0,s).map(wy)}recordOutcome(e,t){let s=this.store.get(e);if(s)if(t)this.store.update(e,{...s.metadata,successCount:s.metadata.successCount+1,consecutiveFails:0});else{let n=s.metadata.consecutiveFails+1;if(n>=fy){this.store.remove(e);return}this.store.update(e,{...s.metadata,failCount:s.metadata.failCount+1,consecutiveFails:n})}}get size(){return this.store.size}}});function by(r,e){let t=`${r.toLowerCase().trim()}|${Jn(e)}`;return(0,yd.createHash)("sha256").update(t).digest("hex").slice(0,16)}function Jn(r){return r.replace(/\d+ms/g,"Nms").replace(/\d+/g,"N").replace(/["'][^"']*["']/g,"'...'").replace(/\s+/g," ").trim().slice(0,200)}function vy(r){if(!r)return"";try{let e=new URL(r);return`${e.hostname}${e.pathname.replace(/\/\d+/g,"/*")}`}catch{return r}}function xy(r){return{id:r.id,instruction:r.metadata.instruction,error:r.metadata.error,failedCode:r.metadata.failedCode,healedCode:r.metadata.healedCode,strategy:r.metadata.strategy,level:r.metadata.level,score:r.score,successCount:r.metadata.successCount}}var yd,Yn,wd=b(()=>{"use strict";m();yd=require("crypto"),Yn=class{constructor(e,t){this.store=e;this.embedder=t}store;embedder;ingest(e){let t=by(e.instruction,e.error),s=vy(e.url),n=`${e.instruction} ${Jn(e.error)}`,i=this.store.get(t);if(i){this.store.update(t,{...i.metadata,healedCode:e.healedCode,strategy:e.strategy,level:e.level,successCount:i.metadata.successCount+1});return}this.embedder.addDocument(n);let a=this.embedder.embed(n);this.store.add(t,n,a,{instruction:e.instruction,error:Jn(e.error),failedCode:e.failedCode,healedCode:e.healedCode,strategy:e.strategy,level:e.level,urlPattern:s,successCount:1})}retrieve(e,t,s=3,n=.6){if(this.store.size===0)return[];let i=`${e} ${Jn(t)}`,a=this.embedder.embed(i);return this.store.search(a,s,n).map(xy)}get size(){return this.store.size}}});function Sy(r,e){let t=`${r}|${e}`;return(0,vd.createHash)("sha256").update(t).digest("hex").slice(0,16)}function Cy(r){return r.replace(/\d+ms/g,"Nms").replace(/\d+/g,"N").replace(/["'][^"']*["']/g,"'...'").replace(/\s+/g," ").trim().slice(0,200)}function bd(r){if(!r)return"";try{let e=new URL(r);return`${e.hostname}${e.pathname.replace(/\/\d+/g,"/*")}`}catch{return r}}function Ey(r){let e=r.metadata.commonFixes;return{errorPattern:r.metadata.errorPattern,urlPattern:r.metadata.urlPattern,frequency:r.metadata.frequency,suggestedFix:e.length>0?e[e.length-1]:null,score:r.score}}var vd,Qn,xd=b(()=>{"use strict";m();vd=require("crypto"),Qn=class{constructor(e,t){this.store=e;this.embedder=t}store;embedder;record(e,t,s){let n=Cy(e),i=bd(t),a=Sy(n,i),o=`${n} ${i}`,c=this.store.get(a);if(c){let u=[...c.metadata.commonFixes];s&&!u.includes(s)&&(u.push(s),u.length>5&&u.shift()),this.store.update(a,{...c.metadata,frequency:c.metadata.frequency+1,lastSeen:Date.now(),commonFixes:u});return}this.embedder.addDocument(o);let l=this.embedder.embed(o);this.store.add(a,o,l,{errorPattern:n,urlPattern:i,frequency:1,lastSeen:Date.now(),commonFixes:s?[s]:[]})}getWarnings(e,t=5){if(this.store.size===0)return[];let s=bd(e),n=this.embedder.embed(s),a=this.store.search(n,t*2,.3).filter(o=>o.metadata.frequency>=2);return a.sort((o,c)=>c.metadata.frequency-o.metadata.frequency),a.slice(0,t).map(Ey)}get size(){return this.store.size}}});var ls,Sd,Za,Zn,Cd=b(()=>{"use strict";m();ls=require("path"),Sd=require("fs-extra");dd();gd();hd();wd();xd();N();Za=E("rag"),Zn=class r{codeCorpus;healingCorpus;errorCatalog;embedder;codeStore;healingStore;errorStore;constructor(e,t,s,n){this.embedder=e,this.codeStore=t,this.healingStore=s,this.errorStore=n,this.codeCorpus=new Wn(t,e),this.healingCorpus=new Yn(s,e),this.errorCatalog=new Qn(n,e)}static async create(e,t){let s=(0,ls.join)(e,"results",".rag");await(0,Sd.ensureDir)(s),Za.info({ragDir:s},"Initializing RAG manager");let n=new Xn((0,ls.join)(s,"idf-vocab.json"));await n.load();let i=new os((0,ls.join)(s,"code-corpus.json"),t.codeCorpus.maxEntries),a=new os((0,ls.join)(s,"healing-corpus.json"),t.healingCorpus.maxEntries),o=new os((0,ls.join)(s,"error-catalog.json"),t.errorCatalog.maxEntries);return await Promise.all([i.load(),a.load(),o.load()]),Za.info({codeCorpus:i.size,healingCorpus:a.size,errorCatalog:o.size,idfDocuments:n.documentCount},"RAG corpora loaded"),new r(n,i,a,o)}async persist(){await Promise.all([this.embedder.save(),this.codeStore.persist(),this.healingStore.persist(),this.errorStore.persist()]),Za.debug("RAG corpora persisted")}getStats(){return{codeCorpus:this.codeStore.size,healingCorpus:this.healingStore.size,errorCatalog:this.errorStore.size,idfVocab:this.embedder.documentCount}}}});function Py(r){let e=[];for(let t of Iy){t.regex.lastIndex=0;let s;for(;(s=t.regex.exec(r))!==null;)t.type==="getByRole"?e.push({selector:s[0],type:t.type,role:s[1],name:s[2]}):e.push({selector:s[0],type:t.type,name:s[1]})}return e}function Ry(r,e,t){let s=r.toLowerCase();for(let n of e){let i=n.match(/"([^"]+)"/);if(i&&i[1].toLowerCase()===s&&(!t||n.toLowerCase().startsWith(t.toLowerCase())))return n}for(let n of e){let i=n.match(/"([^"]+)"/);if(i){let a=i[1].toLowerCase();if((a.includes(s)||s.includes(a))&&(!t||n.toLowerCase().startsWith(t.toLowerCase())))return n}}if(t){let n=e.filter(i=>i.toLowerCase().startsWith(t.toLowerCase()));if(n.length>0){let i=0,a;for(let o of n){let c=o.match(/"([^"]+)"/);if(c){let l=Ty(s,c[1].toLowerCase());l>i&&(i=l,a=o)}}if(i>.3)return a}}}function Ty(r,e){if(r===e)return 1;let t=r.length>e.length?r:e,s=r.length>e.length?e:r;if(t.length===0)return 1;let n=0;for(let i=0;i<s.length;i++)t.includes(s[i])&&n++;return n/t.length}async function Id(r,e,t){let s=Py(t);if(s.length===0)return{url:e,ok:!0,total:0,matched:0,missing:0,checks:[]};await r.navigate(e);let n=await r.snapshot();if(!n)return Ed.warn({url:e},"Proactive check: snapshot returned null \u2014 skipping validation"),{url:e,ok:!0,total:s.length,matched:0,missing:0,checks:[]};let a=_n(n).interactiveElements.split(`
693
693
  `).filter(Boolean),o=[];for(let u of s){let d=u.name??"",p=!1;for(let f of a){let h=f.match(/"([^"]+)"/);if(h&&h[1].toLowerCase()===d.toLowerCase())if(u.role){if(f.toLowerCase().startsWith(u.role.toLowerCase())){p=!0;break}}else{p=!0;break}}let g={selector:u.selector,type:u.type,found:p};if(!p){let f=Ry(d,a,u.role);f&&(g.suggestion=f)}o.push(g)}let c=o.filter(u=>u.found).length,l=o.filter(u=>!u.found).length;return Ed.info({url:e,total:o.length,matched:c,missing:l},"Proactive selector check complete"),{url:e,ok:l===0,total:o.length,matched:c,missing:l,checks:o}}var Ed,Iy,Pd=b(()=>{"use strict";m();Pa();N();Ed=E("proactive-checker"),Iy=[{regex:/getByRole\(\s*['"](\w+)['"]\s*,\s*\{[^}]*name:\s*['"]([^'"]+)['"]/g,type:"getByRole"},{regex:/getByLabel\(\s*['"]([^'"]+)['"]/g,type:"getByLabel"},{regex:/getByPlaceholder\(\s*['"]([^'"]+)['"]/g,type:"getByPlaceholder"},{regex:/getByText\(\s*['"]([^'"]+)['"]/g,type:"getByText"},{regex:/getByTestId\(\s*['"]([^'"]+)['"]/g,type:"getByTestId"}]});async function ky(r){if(!await ei.default.pathExists(r))return r;let e=yr.default.dirname(r),t=yr.default.extname(r),s=yr.default.basename(r,t);for(let n=1;n<1e3;n++){let i=yr.default.join(e,`${s} (${n})${t}`);if(!await ei.default.pathExists(i))return i}return r}var yr,ei,yt,Xt,ti,Rd=b(()=>{"use strict";m();yr=x(require("path")),ei=x(require("fs-extra")),yt=require("playwright");N();Xt=E("browser-manager");ti=class{browsers=new Map;pendingDownloads=new WeakMap;capturedDownloads=new WeakMap;async launchBrowser(e,t){let s=this.browsers.get(e);if(s)return s;let i=await(e==="firefox"?yt.firefox:e==="webkit"?yt.webkit:yt.chromium).launch({headless:t.headless});return this.browsers.set(e,i),Xt.info({browser:e,headless:t.headless},"Browser launched"),i}async newContext(e,t,s,n){let i=t.device&&yt.devices[t.device]?yt.devices[t.device]:null;t.device&&!i&&Xt.warn({device:t.device},"Unknown Playwright device \u2014 falling back to configured viewport");let a={...i??{},viewport:i?.viewport??t.viewport??{width:1280,height:720},storageState:void 0,acceptDownloads:!0};t.video!=="off"&&s&&(a.recordVideo={dir:s});let o=await e.newContext(a);return n&&(this.pendingDownloads.set(o,[]),this.capturedDownloads.set(o,[]),o.on("download",c=>{let l=(async()=>{try{await ei.default.ensureDir(n);let u=c.suggestedFilename()||"download",d=yr.default.basename(u).replace(/[^a-zA-Z0-9._-]+/g,"_")||"download",p=await ky(yr.default.join(n,d));await c.saveAs(p),this.capturedDownloads.get(o)?.push(p),Xt.info({file:yr.default.basename(p)},"Download captured")}catch(u){Xt.debug({err:u},"Failed to capture download")}})();this.pendingDownloads.get(o)?.push(l)})),await o.addInitScript(()=>{let c=`
694
694
  outline: 3px solid #3b82f6 !important;
695
695
  outline-offset: 3px !important;
696
696
  box-shadow: 0 0 0 6px rgba(59,130,246,0.20) !important;
697
697
  transition: outline 0.08s ease, box-shadow 0.08s ease !important;
698
- `,l=null;function u(){l&&(l.style.cssText=l.style.cssText.replace(/outline[^;]*;?/g,"").replace(/box-shadow[^;]*;?/g,"").replace(/transition[^;]*;?/g,""),l=null)}function d(p){!p||!(p instanceof HTMLElement)||(u(),l=p,l.style.cssText+=c,setTimeout(u,1800))}document.addEventListener("focus",p=>d(p.target),!0),document.addEventListener("mousedown",p=>d(p.target),!0)}),t.trace!=="off"&&await o.tracing.start({screenshots:!0,snapshots:!0,sources:!1}),o}async newPage(e){let t=await e.newPage(),s=[/Failed to load resource/i,/net::ERR_/i,/the server responded with a status of/i,/Access to .* has been blocked by CORS/i,/Mixed Content:/i,/favicon\.ico/i],n=[];return t.on("console",i=>{let a=i.text();s.some(o=>o.test(a))||n.push({type:i.type(),text:a,timestamp:Date.now()})}),t.on("pageerror",i=>{i.message?.includes("appendChild")&&i.message?.includes("null")||n.push({type:"error",text:`[PageError] ${i.message}`,timestamp:Date.now()})}),t.__consoleLogs=n,t}drainConsoleLogs(e){let t=e.__consoleLogs;if(!t)return[];let s=[...t];return t.length=0,s}apiContexts=[];async createApiOnlyPage(e){let t=await yt.request.newContext({baseURL:e||void 0});this.apiContexts.push(t);let s={request:t,url:()=>e??"",title:async()=>"",goto:async()=>null,waitForLoadState:async()=>{},setDefaultTimeout:()=>{},setDefaultNavigationTimeout:()=>{},screenshot:async()=>Buffer.alloc(0),video:()=>null,close:async()=>{}};return Xt.info("Created API-only request context (zero browser)"),s}async closeApiContexts(){for(let e of this.apiContexts)await e.dispose().catch(()=>{});this.apiContexts=[]}async closeContext(e,t,s){let n=this.pendingDownloads.get(e);if(n&&n.length>0){let i=new Promise(a=>setTimeout(a,15e3));await Promise.race([Promise.allSettled(n),i]),this.pendingDownloads.delete(e)}if(t.trace!=="off")try{s?await e.tracing.stop({path:s}):await e.tracing.stop()}catch(i){Xt.debug({err:i},"Tracing stop failed \u2014 ignoring")}await e.close().catch(i=>{Xt.debug({err:i},"Context close failed \u2014 ignoring")})}takeDownloads(e){let t=this.capturedDownloads.get(e)??[];return this.capturedDownloads.delete(e),[...t]}async closeAll(){await this.closeApiContexts();for(let[e,t]of this.browsers)try{await t.close(),Xt.debug({browser:e},"Browser closed")}catch(s){Xt.warn({err:s,browser:e},"Error closing browser")}this.browsers.clear()}get openBrowserCount(){return this.browsers.size}}});var Td,Ay,ri,kd=b(()=>{"use strict";m();N();Td=E("healing-budget"),Ay=[/timeout/i,/ECONNREFUSED/i,/ENOTFOUND/i,/ETIMEDOUT/i,/net::ERR/i,/ERR_NAME_NOT_RESOLVED/i,/DNS/i,/socket hang up/i],ri=class{constructor(e){this.dailyBudget=e}spent=0;healFailures=new Map;pageFailures=new Map;shouldHeal(e){if(this.spent>=this.dailyBudget)return Td.warn({spent:this.spent,budget:this.dailyBudget},"Daily healing budget exhausted"),{heal:!1,reason:"Daily budget exhausted"};let t=this.healFailures.get(e.stepId)??0;if(t>=3)return{heal:!1,reason:`Persistent failure \u2014 step "${e.stepId}" has failed healing ${t} times. Needs manual fix.`};if(this.isEnvironmental(e.error))return{heal:!1,reason:"Environmental error \u2014 retry instead"};let s=this.pageFailures.get(e.pageUrl)??[];return s.some(n=>n.stepId===e.stepId)||(s.push(e),this.pageFailures.set(e.pageUrl,s)),s.length>=3?{heal:!0,strategy:"batch",reason:`Batch heal \u2014 ${s.length} failures on ${e.pageUrl}, fix once for all`}:{heal:!0,strategy:"individual",reason:"Standard heal"}}recordSpend(e){this.spent+=e,Td.debug({spend:e,total:this.spent},"Healing budget spend recorded")}recordHealFailure(e){this.healFailures.set(e,(this.healFailures.get(e)??0)+1)}get totalSpent(){return this.spent}get remainingBudget(){return Math.max(0,this.dailyBudget-this.spent)}isEnvironmental(e){return Ay.some(t=>t.test(e))}}});var Ad,si,ni,$d=b(()=>{"use strict";m();Ad=require("crypto");Vn();N();si=E("healing-report"),ni=class{events=[];record(e){let t={id:(0,Ad.randomUUID)(),runId:e.runId,suiteId:e.suiteId,caseId:e.caseId,stepId:e.stepId,stepInstruction:e.stepInstruction,failedCode:e.failedCode,healedCode:e.healedCode,error:e.error,strategy:e.strategy,level:e.level,status:"pending",pageUrl:e.pageUrl,timestamp:new Date().toISOString()};this.events.push(t),si.info({stepId:e.stepId,strategy:e.strategy,level:e.level},"Healing event recorded")}get eventCount(){return this.events.length}async flush(e,t){if(this.events.length===0)return;let s={runId:t,generatedAt:new Date().toISOString(),totalHeals:this.events.length,accepted:0,rejected:0,pending:this.events.length,events:[...this.events]};try{await Xu(e,s),si.info({runId:t,count:this.events.length},"Healing report written")}catch(n){si.error({err:n,runId:t},"Failed to write healing report")}for(let n of this.events)try{await Ku(e,n)}catch(i){si.warn({err:i,eventId:n.id},"Failed to append pending healing event")}}}});function $y(r){let e=r.slice(r.lastIndexOf(".")).toLowerCase();return{".pdf":"application/pdf",".csv":"text/csv",".txt":"text/plain",".json":"application/json",".xml":"application/xml",".html":"text/html",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".zip":"application/zip",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xls":"application/vnd.ms-excel",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}[e]??"application/octet-stream"}function _d(r){switch(r){case"passed":return"passed";case"failed":return"failed";case"skipped":return"skipped";default:return"broken"}}function _y(r){return r==null?"\u2014":r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(2)}s`}function Ld(r,e){if(e==null)return"na";let t={fcp:[1800,3e3],lcp:[2500,4e3],cls:[.1,.25],ttfb:[800,1800],tbt:[200,600],si:[3400,5800],tti:[3800,7300],inp:[200,500]},[s,n]=t[r];return e<s?"good":e<n?"average":"poor"}function Ly(r){return r==null?"#94a3b8":r>=90?"#10b981":r>=50?"#f59e0b":"#ef4444"}function to(r,e,t){let s={good:"#10b981",average:"#f59e0b",poor:"#ef4444",na:"#94a3b8"},n=[{key:"fcp",abbr:"FCP",label:"First Contentful Paint"},{key:"lcp",abbr:"LCP",label:"Largest Contentful Paint"},{key:"cls",abbr:"CLS",label:"Cumulative Layout Shift"},{key:"ttfb",abbr:"TTFB",label:"Time to First Byte"},{key:"tbt",abbr:"TBT",label:"Total Blocking Time"},{key:"si",abbr:"SI",label:"Speed Index"},{key:"tti",abbr:"TTI",label:"Time to Interactive"},{key:"inp",abbr:"INP",label:"Interaction to Next Paint"}],i=(u,d)=>u==="cls"&&d!=null?d.toFixed(3):_y(d),a=(u,d)=>{let p=Ly(u),g=2*Math.PI*24,f=u!=null?u/100*g:0,h=u==null?"\u2014":u>=90?"Good":u>=50?"Needs Work":"Poor";return`
698
+ `,l=null;function u(){l&&(l.style.cssText=l.style.cssText.replace(/outline[^;]*;?/g,"").replace(/box-shadow[^;]*;?/g,"").replace(/transition[^;]*;?/g,""),l=null)}function d(p){!p||!(p instanceof HTMLElement)||(u(),l=p,l.style.cssText+=c,setTimeout(u,1800))}document.addEventListener("focus",p=>d(p.target),!0),document.addEventListener("mousedown",p=>d(p.target),!0)}),t.trace!=="off"&&await o.tracing.start({screenshots:!0,snapshots:!0,sources:!1}),o}async newPage(e){let t=await e.newPage(),s=[/Failed to load resource/i,/net::ERR_/i,/the server responded with a status of/i,/Access to .* has been blocked by CORS/i,/Mixed Content:/i,/favicon\.ico/i],n=[];return t.on("console",i=>{let a=i.text();s.some(o=>o.test(a))||n.push({type:i.type(),text:a,timestamp:Date.now()})}),t.on("pageerror",i=>{i.message?.includes("appendChild")&&i.message?.includes("null")||n.push({type:"error",text:`[PageError] ${i.message}`,timestamp:Date.now()})}),t.__consoleLogs=n,t}drainConsoleLogs(e){let t=e.__consoleLogs;if(!t)return[];let s=[...t];return t.length=0,s}apiContexts=[];async createApiOnlyPage(e){let t=await yt.request.newContext({baseURL:e||void 0});this.apiContexts.push(t);let s={request:t,url:()=>e??"",title:async()=>"",goto:async()=>null,waitForLoadState:async()=>{},setDefaultTimeout:()=>{},setDefaultNavigationTimeout:()=>{},screenshot:async()=>Buffer.alloc(0),video:()=>null,close:async()=>{}};return Xt.info("Created API-only request context (zero browser)"),s}async closeApiContexts(){for(let e of this.apiContexts)await e.dispose().catch(()=>{});this.apiContexts=[]}async closeContext(e,t,s){let n=this.pendingDownloads.get(e);if(n&&n.length>0){let i=new Promise(a=>setTimeout(a,15e3));await Promise.race([Promise.allSettled(n),i]),this.pendingDownloads.delete(e)}if(t.trace!=="off")try{s?await e.tracing.stop({path:s}):await e.tracing.stop()}catch(i){Xt.debug({err:i},"Tracing stop failed \u2014 ignoring")}await e.close().catch(i=>{Xt.debug({err:i},"Context close failed \u2014 ignoring")})}takeDownloads(e){let t=this.capturedDownloads.get(e)??[];return this.capturedDownloads.delete(e),[...t]}async closeAll(){await this.closeApiContexts();for(let[e,t]of this.browsers)try{await t.close(),Xt.debug({browser:e},"Browser closed")}catch(s){Xt.warn({err:s,browser:e},"Error closing browser")}this.browsers.clear()}get openBrowserCount(){return this.browsers.size}}});var Td,Ay,ri,kd=b(()=>{"use strict";m();N();Td=E("healing-budget"),Ay=[/timeout/i,/ECONNREFUSED/i,/ENOTFOUND/i,/ETIMEDOUT/i,/net::ERR/i,/ERR_NAME_NOT_RESOLVED/i,/DNS/i,/socket hang up/i],ri=class{constructor(e){this.dailyBudget=e}dailyBudget;spent=0;healFailures=new Map;pageFailures=new Map;shouldHeal(e){if(this.spent>=this.dailyBudget)return Td.warn({spent:this.spent,budget:this.dailyBudget},"Daily healing budget exhausted"),{heal:!1,reason:"Daily budget exhausted"};let t=this.healFailures.get(e.stepId)??0;if(t>=3)return{heal:!1,reason:`Persistent failure \u2014 step "${e.stepId}" has failed healing ${t} times. Needs manual fix.`};if(this.isEnvironmental(e.error))return{heal:!1,reason:"Environmental error \u2014 retry instead"};let s=this.pageFailures.get(e.pageUrl)??[];return s.some(n=>n.stepId===e.stepId)||(s.push(e),this.pageFailures.set(e.pageUrl,s)),s.length>=3?{heal:!0,strategy:"batch",reason:`Batch heal \u2014 ${s.length} failures on ${e.pageUrl}, fix once for all`}:{heal:!0,strategy:"individual",reason:"Standard heal"}}recordSpend(e){this.spent+=e,Td.debug({spend:e,total:this.spent},"Healing budget spend recorded")}recordHealFailure(e){this.healFailures.set(e,(this.healFailures.get(e)??0)+1)}get totalSpent(){return this.spent}get remainingBudget(){return Math.max(0,this.dailyBudget-this.spent)}isEnvironmental(e){return Ay.some(t=>t.test(e))}}});var Ad,si,ni,$d=b(()=>{"use strict";m();Ad=require("crypto");Vn();N();si=E("healing-report"),ni=class{events=[];record(e){let t={id:(0,Ad.randomUUID)(),runId:e.runId,suiteId:e.suiteId,caseId:e.caseId,stepId:e.stepId,stepInstruction:e.stepInstruction,failedCode:e.failedCode,healedCode:e.healedCode,error:e.error,strategy:e.strategy,level:e.level,status:"pending",pageUrl:e.pageUrl,timestamp:new Date().toISOString()};this.events.push(t),si.info({stepId:e.stepId,strategy:e.strategy,level:e.level},"Healing event recorded")}get eventCount(){return this.events.length}async flush(e,t){if(this.events.length===0)return;let s={runId:t,generatedAt:new Date().toISOString(),totalHeals:this.events.length,accepted:0,rejected:0,pending:this.events.length,events:[...this.events]};try{await Xu(e,s),si.info({runId:t,count:this.events.length},"Healing report written")}catch(n){si.error({err:n,runId:t},"Failed to write healing report")}for(let n of this.events)try{await Ku(e,n)}catch(i){si.warn({err:i,eventId:n.id},"Failed to append pending healing event")}}}});function $y(r){let e=r.slice(r.lastIndexOf(".")).toLowerCase();return{".pdf":"application/pdf",".csv":"text/csv",".txt":"text/plain",".json":"application/json",".xml":"application/xml",".html":"text/html",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".zip":"application/zip",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xls":"application/vnd.ms-excel",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}[e]??"application/octet-stream"}function _d(r){switch(r){case"passed":return"passed";case"failed":return"failed";case"skipped":return"skipped";default:return"broken"}}function _y(r){return r==null?"\u2014":r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(2)}s`}function Ld(r,e){if(e==null)return"na";let t={fcp:[1800,3e3],lcp:[2500,4e3],cls:[.1,.25],ttfb:[800,1800],tbt:[200,600],si:[3400,5800],tti:[3800,7300],inp:[200,500]},[s,n]=t[r];return e<s?"good":e<n?"average":"poor"}function Ly(r){return r==null?"#94a3b8":r>=90?"#10b981":r>=50?"#f59e0b":"#ef4444"}function to(r,e,t){let s={good:"#10b981",average:"#f59e0b",poor:"#ef4444",na:"#94a3b8"},n=[{key:"fcp",abbr:"FCP",label:"First Contentful Paint"},{key:"lcp",abbr:"LCP",label:"Largest Contentful Paint"},{key:"cls",abbr:"CLS",label:"Cumulative Layout Shift"},{key:"ttfb",abbr:"TTFB",label:"Time to First Byte"},{key:"tbt",abbr:"TBT",label:"Total Blocking Time"},{key:"si",abbr:"SI",label:"Speed Index"},{key:"tti",abbr:"TTI",label:"Time to Interactive"},{key:"inp",abbr:"INP",label:"Interaction to Next Paint"}],i=(u,d)=>u==="cls"&&d!=null?d.toFixed(3):_y(d),a=(u,d)=>{let p=Ly(u),g=2*Math.PI*24,f=u!=null?u/100*g:0,h=u==null?"\u2014":u>=90?"Good":u>=50?"Needs Work":"Poor";return`
699
699
  <div style="flex:1;display:flex;flex-direction:column;align-items:center;padding:10px 8px;border-radius:10px;background:${p}12;border:2px solid ${p}44;">
700
700
  <div style="position:relative;width:58px;height:58px;">
701
701
  <svg width="58" height="58" viewBox="0 0 60 60" style="transform:rotate(-90deg)">
@@ -789,7 +789,7 @@ ${i}`,"result","INVALID_RESULT")}return n.data}async function Ja(r){let e=jr.def
789
789
  `);await wr.default.writeFile(Me.default.join(this.resultsDir,"environment.properties"),t,"utf-8");let s;if(e.logFilePath)try{s=Me.default.basename(e.logFilePath),await this.copyAttachment(e.logFilePath).catch(()=>{}),eo.debug({logFile:s},"Log file copied to Allure results")}catch{eo.debug("Failed to copy log file to Allure results")}let n=0;for(let i of e.suites)for(let a of i.cases)await this.writeTestResult(i,a,s),n++;eo.info({dir:this.resultsDir,written:n},"Allure results written")}async writeTestResult(e,t,s){let n=(0,Od.randomUUID)(),i=new Date(t.startedAt).getTime(),a=new Date(t.finishedAt).getTime(),o=t.steps.find(p=>p.status==="failed"),c=[];if(t.videoPath){let p=Me.default.basename(t.videoPath),f=Me.default.extname(p).toLowerCase()===".mp4"?"video/mp4":"video/webm";c.push({name:"Video Recording",source:p,type:f})}if(t.tracePath){let p=Me.default.basename(t.tracePath);c.push({name:"Playwright Trace",source:p,type:"application/zip"})}s&&c.push({name:"Run Log",source:s,type:"text/plain"});for(let p of t.downloadPaths??[]){let g=Me.default.basename(p);c.push({name:`Downloaded: ${g}`,source:g,type:$y(g)})}let l=t.pageLoads??[];if(l.length>0){let p=l.some(h=>!h.lighthouseError&&h.score!=null),g=l.some(h=>!h.lighthouseError&&(h.a11yScore!=null||(h.a11yAudits?.length??0)>0)),f=l.some(h=>!h.lighthouseError&&(h.seoScore!=null||(h.seoAudits?.length??0)>0));if(p){let h=to(t.caseName,l,"performance"),S=`${n}-perf.html`;await wr.default.writeFile(Me.default.join(this.resultsDir,S),h,"utf-8"),c.push({name:"\u26A1 Performance Report",source:S,type:"text/html"})}if(g){let h=to(t.caseName,l,"accessibility"),S=`${n}-a11y.html`;await wr.default.writeFile(Me.default.join(this.resultsDir,S),h,"utf-8"),c.push({name:"\u267F Accessibility Report",source:S,type:"text/html"})}if(f){let h=to(t.caseName,l,"seo"),S=`${n}-seo.html`;await wr.default.writeFile(Me.default.join(this.resultsDir,S),h,"utf-8"),c.push({name:"\u{1F50D} SEO Report",source:S,type:"text/html"})}}let u={uuid:n,historyId:`${e.suiteId}::${t.caseId}::${e.browser}`,testCaseId:`${e.suiteId}::${t.caseId}`,fullName:`${e.suiteName} > ${t.caseName}`,name:t.caseName,status:_d(t.status),stage:"finished",start:i,stop:a,labels:[{name:"suite",value:e.suiteName},{name:"browser",value:e.browser},{name:"framework",value:"assuremind"},{name:"tag",value:`ENV: ${this.environment.toUpperCase()}`}],links:[],parameters:[],attachments:c,steps:t.steps.map(p=>this.buildStepResult(p,i)),...o?.error&&{statusDetails:{message:o.error}}},d=Me.default.join(this.resultsDir,`${n}-result.json`);await wr.default.writeJson(d,u,{spaces:2});for(let p of t.steps)p.screenshotPath&&await this.copyAttachment(p.screenshotPath).catch(()=>{});t.videoPath&&await this.copyAttachment(t.videoPath).catch(()=>{}),t.tracePath&&await this.copyAttachment(t.tracePath).catch(()=>{});for(let p of t.downloadPaths??[])await this.copyAttachment(p).catch(()=>{})}buildStepResult(e,t){let s=t,n=t+e.duration,i=[];if(e.screenshotPath){let a=Me.default.basename(e.screenshotPath);i.push({name:"Screenshot",source:a,type:"image/png"})}return{name:e.instruction,status:_d(e.status),stage:"finished",start:s,stop:n,attachments:i,parameters:[],steps:[]}}async copyAttachment(e){let t=Me.default.join(this.resultsDir,Me.default.basename(e));await wr.default.copy(e,t,{overwrite:!0})}}});function Dy(){try{let e=(0,Md.createRequire)(y??__filename).resolve("allure-commandline/package.json"),t=us.default.dirname(e);return us.default.join(t,"dist","bin",so?"allure.bat":"allure")}catch{return us.default.resolve(__dirname,so?"../node_modules/allure-commandline/dist/bin/allure.bat":"../node_modules/.bin/allure")}}async function jd(r,e){let t=us.default.join(r,"results","allure-results",e),s=us.default.join(r,"results","allure-report",e);if(!await ro.default.pathExists(t))return en.debug({resultsDir:t},"No allure-results dir for run \u2014 skipping report generation"),!1;if((await ro.default.readdir(t)).length===0)return en.debug({runId:e},"allure-results is empty \u2014 skipping report generation"),!1;try{return await Oy(Fy,["generate",t,"--output",s,"--clean","--single-file"],so?{shell:!0}:{}),en.info({reportDir:s,runId:e},"Allure HTML report generated"),!0}catch(i){let a=i instanceof Error?i.message:String(i);return a.includes("java")||a.includes("Java")||a.includes("JAVA")?en.warn("Allure report generation skipped \u2014 Java is not installed. Install Java (https://adoptium.net) to enable Allure HTML reports."):en.warn({err:a,runId:e},"Allure report generation failed"),!1}}var us,ro,Fd,Nd,Md,Oy,en,so,Fy,Bd=b(()=>{"use strict";m();us=x(require("path")),ro=x(require("fs-extra")),Fd=require("child_process"),Nd=require("util"),Md=require("module");N();Oy=(0,Nd.promisify)(Fd.execFile),en=E("allure-generator"),so=process.platform==="win32";Fy=Dy()});function ai(){return[{category:"person",methods:[{name:"fullName",example:C.faker.person.fullName()},{name:"firstName",example:C.faker.person.firstName()},{name:"lastName",example:C.faker.person.lastName()},{name:"middleName",example:C.faker.person.middleName()},{name:"sex",example:C.faker.person.sex()},{name:"prefix",example:C.faker.person.prefix()},{name:"suffix",example:C.faker.person.suffix()},{name:"jobTitle",example:C.faker.person.jobTitle()},{name:"jobArea",example:C.faker.person.jobArea()},{name:"jobType",example:C.faker.person.jobType()},{name:"bio",example:C.faker.person.bio()}]},{category:"internet",methods:[{name:"email",example:C.faker.internet.email()},{name:"userName",example:C.faker.internet.username()},{name:"password",example:C.faker.internet.password()},{name:"url",example:C.faker.internet.url()},{name:"domainName",example:C.faker.internet.domainName()},{name:"domainWord",example:C.faker.internet.domainWord()},{name:"ip",example:C.faker.internet.ip()},{name:"ipv6",example:C.faker.internet.ipv6()},{name:"mac",example:C.faker.internet.mac()},{name:"userAgent",example:C.faker.internet.userAgent()},{name:"emoji",example:C.faker.internet.emoji()}]},{category:"phone",methods:[{name:"number",example:C.faker.phone.number()},{name:"imei",example:C.faker.phone.imei()}]},{category:"location",methods:[{name:"streetAddress",example:C.faker.location.streetAddress()},{name:"street",example:C.faker.location.street()},{name:"city",example:C.faker.location.city()},{name:"state",example:C.faker.location.state()},{name:"zipCode",example:C.faker.location.zipCode()},{name:"country",example:C.faker.location.country()},{name:"countryCode",example:C.faker.location.countryCode()},{name:"county",example:C.faker.location.county()},{name:"latitude",example:String(C.faker.location.latitude())},{name:"longitude",example:String(C.faker.location.longitude())},{name:"timeZone",example:C.faker.location.timeZone()},{name:"buildingNumber",example:C.faker.location.buildingNumber()}]},{category:"company",methods:[{name:"name",example:C.faker.company.name()},{name:"catchPhrase",example:C.faker.company.catchPhrase()},{name:"buzzPhrase",example:C.faker.company.buzzPhrase()},{name:"buzzNoun",example:C.faker.company.buzzNoun()},{name:"buzzVerb",example:C.faker.company.buzzVerb()},{name:"buzzAdjective",example:C.faker.company.buzzAdjective()}]},{category:"finance",methods:[{name:"accountNumber",example:C.faker.finance.accountNumber()},{name:"accountName",example:C.faker.finance.accountName()},{name:"creditCardNumber",example:C.faker.finance.creditCardNumber()},{name:"creditCardCVV",example:C.faker.finance.creditCardCVV()},{name:"currencyCode",example:C.faker.finance.currencyCode()},{name:"currencyName",example:C.faker.finance.currencyName()},{name:"amount",example:C.faker.finance.amount()},{name:"iban",example:C.faker.finance.iban()},{name:"bic",example:C.faker.finance.bic()},{name:"bitcoinAddress",example:C.faker.finance.bitcoinAddress()},{name:"transactionType",example:C.faker.finance.transactionType()}]},{category:"date",methods:[{name:"past",example:C.faker.date.past().toISOString()},{name:"future",example:C.faker.date.future().toISOString()},{name:"recent",example:C.faker.date.recent().toISOString()},{name:"soon",example:C.faker.date.soon().toISOString()},{name:"birthdate",example:C.faker.date.birthdate().toISOString()},{name:"month",example:C.faker.date.month()},{name:"weekday",example:C.faker.date.weekday()}]},{category:"lorem",methods:[{name:"word",example:C.faker.lorem.word()},{name:"words",example:C.faker.lorem.words()},{name:"sentence",example:C.faker.lorem.sentence()},{name:"sentences",example:C.faker.lorem.sentences()},{name:"paragraph",example:C.faker.lorem.paragraph()},{name:"slug",example:C.faker.lorem.slug()},{name:"lines",example:C.faker.lorem.lines(1)}]},{category:"string",methods:[{name:"uuid",example:C.faker.string.uuid()},{name:"alphanumeric",example:C.faker.string.alphanumeric(10)},{name:"numeric",example:C.faker.string.numeric(6)},{name:"alpha",example:C.faker.string.alpha(8)},{name:"nanoid",example:C.faker.string.nanoid()},{name:"hexadecimal",example:C.faker.string.hexadecimal({length:8})},{name:"sample",example:C.faker.string.sample(12)}]},{category:"number",methods:[{name:"int",example:String(C.faker.number.int({max:9999}))},{name:"float",example:String(C.faker.number.float({max:100,fractionDigits:2}))}]},{category:"datatype",methods:[{name:"boolean",example:String(C.faker.datatype.boolean())}]},{category:"image",methods:[{name:"avatar",example:C.faker.image.avatar()},{name:"url",example:C.faker.image.url()}]},{category:"color",methods:[{name:"human",example:C.faker.color.human()},{name:"rgb",example:C.faker.color.rgb()},{name:"hex",example:C.faker.color.rgb({format:"hex"})}]},{category:"commerce",methods:[{name:"productName",example:C.faker.commerce.productName()},{name:"price",example:C.faker.commerce.price()},{name:"department",example:C.faker.commerce.department()},{name:"productDescription",example:C.faker.commerce.productDescription().slice(0,60)+"..."},{name:"isbn",example:C.faker.commerce.isbn()}]},{category:"vehicle",methods:[{name:"vehicle",example:C.faker.vehicle.vehicle()},{name:"manufacturer",example:C.faker.vehicle.manufacturer()},{name:"model",example:C.faker.vehicle.model()},{name:"vin",example:C.faker.vehicle.vin()},{name:"vrm",example:C.faker.vehicle.vrm()}]},{category:"system",methods:[{name:"fileName",example:C.faker.system.fileName()},{name:"mimeType",example:C.faker.system.mimeType()},{name:"fileExt",example:C.faker.system.fileExt()},{name:"filePath",example:C.faker.system.filePath()},{name:"semver",example:C.faker.system.semver()}]}]}function Ur(r,e){let t=C.faker[r],s=Ny[`${r}.${e}`]??e;if(!t||typeof t[s]!="function")return`[unknown: ${r}.${e}]`;let n=t[s]();return n instanceof Date?n.toISOString():String(n)}var C,Ny,no=b(()=>{"use strict";m();C=require("@faker-js/faker");Ny={"internet.userName":"username"}});function Hd(r){switch(r){case"FAKE_FIRST_NAME":return Ur("person","firstName");case"FAKE_LAST_NAME":return Ur("person","lastName");case"FAKE_AGE":return String(Math.floor(Math.random()*63)+18);case"FAKE_EMAIL":return Ur("internet","email");case"FAKE_PHONE":return Ur("phone","number");case"FAKE_PASSWORD":return Ur("internet","password")}let e=r.match(/^FAKE_NUMBER_(\d+)$/);if(e&&e[1]){let t=Math.max(1,parseInt(e[1],10)),s=t===1?0:Math.pow(10,t-1),n=Math.pow(10,t)-1;return String(Math.floor(Math.random()*(n-s+1))+s)}if(r.startsWith("FAKE_")){let t=r.slice(5),s=Ud[t];if(s)return Ur(s[0],s[1])}return null}var Ud,Vd=b(()=>{"use strict";m();no();Ud={};for(let r of ai())for(let e of r.methods){let t=`${r.category}_${e.name}`.toUpperCase();Ud[t]=[r.category,e.name]}});function Kt(r,e,t){let s=r.replace(/\{\{FILE:([^}]+)\}\}/g,(n,i)=>`fixtures/uploads/${i.trim().replace(/[^a-zA-Z0-9._-]+/g,"_")}`);return s=s.replace(new RegExp(My,"g"),(n,i)=>{if(i==="BASE_URL")return t;let a=Hd(i);return a!==null?a:e[i]??`{{${i}}}`}),s}var My,io=b(()=>{"use strict";m();Vd();My="\\{\\{([A-Z0-9_]+)\\}\\}"});async function wt(r,e,t,s="domcontentloaded",n){t&&(e.setDefaultTimeout(t),e.setDefaultNavigationTimeout(t));let i=t?ao.expect.configure({timeout:t}):ao.expect,a=n??{setVariable:()=>{},getVariable:()=>{}},c=new jy("page","expect","context",r)(e,i,a);c.catch(()=>{}),await c;let l=t?Math.min(t/2,1e4):1e4;try{await e.waitForLoadState(s,{timeout:l})}catch{}}var ao,jy,oi=b(()=>{"use strict";m();ao=require("@playwright/test"),jy=Object.getPrototypeOf(async function(){}).constructor});async function By(r,e){if(r===e)return null;let t=[],s=r;for(;s&&s!==e;){let n="iframe";try{let i=await s.frameElement();if(i){let a=await i.getAttribute("id").catch(()=>null),o=await i.getAttribute("name").catch(()=>null),c=await i.getAttribute("title").catch(()=>null);a?n=`#${a}`:o?n=`iframe[name='${o}']`:c&&(n=`iframe[title='${c}']`),await i.dispose().catch(()=>{})}}catch{}t.push(n),s=s.parentFrame()}return t.reverse().join("||")}async function tn(r,e,t){let s=r.url(),n=await r.title().catch(()=>""),i={maxElements:120,maxTextLen:80},a=await r.evaluate(Gd,i).catch(()=>[])??[],o=[],c=r.mainFrame();for(let d of r.frames())if(d!==c){if(o.length+a.length>=120)break;try{let p=await By(d,c);if(p===null)continue;let g=await d.evaluate(Gd,i).catch(()=>[])??[];for(let f of g)o.push(`${f} frame="${p}"`)}catch{}}let l=[...a,...o].slice(0,120).join(`
790
790
  `),u=await r.evaluate(({maxLen:d})=>document.body?.innerHTML?.slice(0,d)??"",{maxLen:8e3}).catch(()=>"");return{url:s,title:n,interactiveElements:l,htmlSnapshot:u,previousSteps:e,variables:t}}var Gd,zd=b(()=>{"use strict";m();Gd=({maxElements:r,maxTextLen:e})=>{let t=["button",'[role="button"]',"a[href]",'input:not([type="hidden"])',"textarea","select",'[role="link"]','[role="tab"]','[role="checkbox"]','[role="radio"]','[role="menuitem"]','[role="option"]','[role="combobox"]','[role="listbox"]','[role="switch"]'];function s(l){let u=l.getAttribute("aria-labelledby");return u?u.split(/\s+/).map(d=>document.getElementById(d)?.textContent?.trim()??"").filter(Boolean).join(" "):""}function n(l){let u=l.getAttribute("id");if(u){let p=document.querySelector(`label[for="${u}"]`);if(p)return(p.textContent??"").trim().slice(0,60)}let d=l.closest("label");if(d){let p=d.cloneNode(!0);return p.querySelectorAll("input,textarea,select").forEach(g=>g.remove()),(p.textContent??"").trim().slice(0,60)}return""}function i(l){let u=window.getComputedStyle(l);if(u.display==="none"||u.visibility==="hidden"||u.opacity==="0")return!1;let d=l.getBoundingClientRect();return d.width>0&&d.height>0}function a(l){return l.getAttribute("data-testid")??l.getAttribute("data-cy")??l.getAttribute("data-qa")??l.getAttribute("data-test")??""}let o=new Set,c=[];for(let l of t){if(c.length>=r)break;for(let u of Array.from(document.querySelectorAll(l))){if(c.length>=r)break;if(o.has(u)||!i(u))continue;o.add(u);let d=u.tagName.toLowerCase(),p=u.getAttribute("role")??d,g=(u.textContent??"").trim().replace(/\s+/g," ").slice(0,e),f=u.getAttribute("aria-label")??"",h=s(u),S=n(u),I=a(u),v=u.getAttribute("name")??"",k=u.getAttribute("id")??"",T=u.getAttribute("placeholder")??"",P=u.getAttribute("type")??"",j=d==="a"?(u.getAttribute("href")??"").slice(0,60):"",J=d==="select"||d==="input"?u.value?.slice(0,40):"",M=[`<${d}>`];I&&M.push(`data-testid="${I}"`),f&&M.push(`aria-label="${f}"`),h&&M.push(`aria-labelledby="${h}"`),S&&M.push(`label="${S}"`),T&&M.push(`placeholder="${T}"`),g&&M.push(`text="${g}"`),P&&M.push(`type="${P}"`),v&&M.push(`name="${v}"`),k&&M.push(`id="${k}"`),j&&M.push(`href="${j}"`),J&&M.push(`value="${J}"`),p!==d&&M.push(`role="${p}"`),c.push(M.join(" "))}}return c}});function Uy(r){return r.testId?`page.getByTestId('${r.testId}')`:r.ariaLabel?`page.getByRole('${r.role||r.tag}', { name: '${r.ariaLabel}' })`:r.labelText&&(r.tag==="input"||r.tag==="textarea"||r.tag==="select")?`page.getByLabel('${r.labelText}')`:r.placeholder?`page.getByPlaceholder('${r.placeholder}')`:r.tag==="a"&&r.text?`page.getByRole('link', { name: '${r.text}' })`:(r.tag==="button"||r.role==="button")&&r.text?`page.getByRole('button', { name: '${r.text}' })`:r.role&&r.text?`page.getByRole('${r.role}', { name: '${r.text}' })`:r.text?`page.getByText('${r.text}')`:r.id?`page.locator('#${r.id}')`:r.name?`page.locator('[name="${r.name}"]')`:r.inputType?`page.locator('${r.tag}[type="${r.inputType}"]')`:`page.locator('${r.tag}')`}async function co(r){let t=(await r.evaluate(()=>{let i=["button",'[role="button"]',"a[href]",'input:not([type="hidden"])',"textarea","select",'[role="link"]','[role="tab"]','[role="checkbox"]','[role="radio"]','[role="menuitem"]','[role="option"]','[role="combobox"]','[role="switch"]'];function a(p){let g=p.getAttribute("aria-labelledby");return g?g.split(/\s+/).map(f=>document.getElementById(f)?.textContent?.trim()??"").filter(Boolean).join(" "):""}function o(p){let g=p.getAttribute("id");if(g){let h=document.querySelector(`label[for="${g}"]`);if(h)return(h.textContent??"").trim().slice(0,60)}let f=p.closest("label");if(f){let h=f.cloneNode(!0);return h.querySelectorAll("input,textarea,select").forEach(S=>S.remove()),(h.textContent??"").trim().slice(0,60)}return""}let c=new Set,l=[],u=window.innerWidth,d=window.innerHeight;for(let p of i){for(let g of Array.from(document.querySelectorAll(p))){if(c.has(g))continue;let f=window.getComputedStyle(g);if(f.display==="none"||f.visibility==="hidden"||f.opacity==="0")continue;let h=g.getBoundingClientRect();if(h.width<=0||h.height<=0||h.right<0||h.bottom<0||h.left>u||h.top>d)continue;c.add(g);let S=g.tagName.toLowerCase(),I=g.getAttribute("role")??"",v=(g.textContent??"").trim().replace(/\s+/g," ").slice(0,60),k=g.getAttribute("aria-label")??"",T=a(g),P=o(g),j=g.getAttribute("data-testid")??g.getAttribute("data-cy")??g.getAttribute("data-qa")??g.getAttribute("data-test")??"",J=g.getAttribute("placeholder")??"",M=S==="a"?g.getAttribute("href")??"":"",Ee=g.getAttribute("id")??"",lt=g.getAttribute("name")??"",Ve=g.getAttribute("type")??"";if(l.push({tag:S,role:I,text:v,ariaLabel:k,ariaLabelledBy:T,labelText:P,testId:j,placeholder:J,href:M,id:Ee,name:lt,inputType:Ve,x:Math.round(h.left),y:Math.round(h.top),width:Math.round(h.width),height:Math.round(h.height)}),l.length>=80)break}if(l.length>=80)break}return l})).map((i,a)=>{let o=Uy(i),c=i.ariaLabel||i.labelText||i.text||i.placeholder||i.testId||i.href||`${i.tag}[${a}]`,l=`[${a+1}] ${i.tag}${i.role?`(${i.role})`:""} "${c.slice(0,50)}" \u2192 ${o}`;return{index:a+1,tag:i.tag,role:i.role||i.tag,selector:o,description:l,x:i.x,y:i.y,width:i.width,height:i.height}});await r.evaluate(({els:i,overlayId:a})=>{let o=document.getElementById(a);o&&o.remove();let c="http://www.w3.org/2000/svg",l=document.createElementNS(c,"svg");l.id=a,l.setAttribute("xmlns",c),l.style.cssText=["position:fixed","top:0","left:0","width:100%","height:100%","pointer-events:none","z-index:2147483647"].join(";");let u=(d,p)=>{let g=d.toLowerCase(),f=p.toLowerCase();return g==="button"||f==="button"?"#FF6B6B":g==="a"||f==="link"?"#96CEB4":g==="input"||g==="textarea"?"#4ECDC4":g==="select"||f==="combobox"?"#45B7D1":f==="menuitem"||f==="tab"?"#DDA0DD":"#FFE66D"};for(let d of i){let p=u(d.tag,d.role),g=document.createElementNS(c,"rect");g.setAttribute("x",String(d.x+1)),g.setAttribute("y",String(d.y+1)),g.setAttribute("width",String(Math.max(d.width-2,4))),g.setAttribute("height",String(Math.max(d.height-2,4))),g.setAttribute("fill","none"),g.setAttribute("stroke",p),g.setAttribute("stroke-width","2"),g.setAttribute("stroke-dasharray","4,3"),l.appendChild(g);let f=d.index>=10?22:16,h=16,S=d.index<d.x-f?d.x-f:d.x,I=d.y<h?d.y:d.y-h+2,v=document.createElementNS(c,"rect");v.setAttribute("x",String(S)),v.setAttribute("y",String(I)),v.setAttribute("width",String(f)),v.setAttribute("height",String(h)),v.setAttribute("fill",p),v.setAttribute("rx","3"),l.appendChild(v);let k=document.createElementNS(c,"text");k.setAttribute("x",String(S+f/2)),k.setAttribute("y",String(I+12)),k.setAttribute("fill","#000"),k.setAttribute("font-size","11"),k.setAttribute("font-family","monospace"),k.setAttribute("font-weight","bold"),k.setAttribute("text-anchor","middle"),k.textContent=String(d.index),l.appendChild(k)}document.documentElement.appendChild(l)},{els:t.map(i=>({index:i.index,x:i.x,y:i.y,width:i.width,height:i.height,tag:i.tag,role:i.role})),overlayId:oo});let s=await r.screenshot({type:"png",fullPage:!1});await r.evaluate(i=>document.getElementById(i)?.remove(),oo);let n=t.map(i=>i.description).join(`
791
791
  `);return{screenshot:s,elements:t,elementMap:n}}async function lo(r){await r.evaluate(e=>document.getElementById(e)?.remove(),oo).catch(()=>{})}var oo,qd=b(()=>{"use strict";m();oo="__testassuremind_som__"});function Xd(r){let e=r.replace(/^```[\w]*\n?/gm,"").replace(/^```\s*$/gm,"").trim();return e.includes("---")?e.split("---").map(t=>t.trim()).filter(t=>t.length>0):e.split(`
792
- `).map(t=>t.trim()).filter(t=>t.length>0&&t.startsWith("await"))}var $e,ci,Kd=b(()=>{"use strict";m();zd();qd();At();io();N();oi();Ar();$e=E("self-healing"),ci=class{constructor(e,t,s,n=!1){this.provider=e;this.maxLevel=t;this.ragManager=s;this.healAssertionLocators=n}async heal(e,t,s,n,i,a){if(t.failureKind==="assertion")return $e.info({stepId:e.id},"Assertion failure \u2014 skipping all healing levels (possible application bug)"),null;if(t.failureKind==="assertion-locator-missing"){if(!this.healAssertionLocators)return $e.info({stepId:e.id},"Assertion-locator heal disabled \u2014 skipping"),null;try{let c=await this.level2Regenerate(e,t,s,n,i,a);if(c!==null)return $e.info({stepId:e.id},"Assertion locator healed (matcher preserved)"),{...c,strategy:"regenerate"}}catch(c){$e.debug({err:c,stepId:e.id},"Assertion-locator heal attempt threw")}return null}let o=e.stepType==="api"||tt(e.instruction)==="api";for(let c=1;c<=this.maxLevel;c++){if(o&&(c===3||c===4)){$e.debug({stepId:e.id,level:c},`Skipping DOM-specific level ${c} for API step`);continue}$e.debug({stepId:e.id,level:c,isApi:o},`Attempting heal level ${c}`);try{let l=await this.tryLevel(c,e,t,s,n,i,a,o);if(l!==null)return $e.info({stepId:e.id,level:c,strategy:l.strategy},"Healing succeeded"),l}catch(l){$e.debug({err:l,level:c,stepId:e.id},`Level ${c} healing attempt threw`)}}return $e.warn({stepId:e.id,maxLevel:this.maxLevel},"All healing levels exhausted"),null}async tryLevel(e,t,s,n,i,a,o,c=!1){switch(e){case 1:return this.level1Retry(s,i);case 2:return c?this.level2ApiRegenerate(t,s,i,a,o):this.level2Regenerate(t,s,n,i,a,o);case 3:return this.level3MultiSelector(t,s,n,i,a,o);case 4:return this.level4Visual(t,i,a,o);case 5:return this.level5Decompose(t,s,n,i,a,o);case 6:return this.level6Manual(t,s);default:return null}}async level1Retry(e,t){return await t.waitForLoadState("networkidle",{timeout:5e3}).catch(()=>{}),await t.waitForTimeout(1e3),await wt(e.failedCode,t),{code:e.failedCode,level:1,strategy:"retry"}}async level2Regenerate(e,t,s,n,i,a){if(this.provider.supportsVision)try{let d=await co(n);$e.debug({stepId:e.id},"Level 2: using SoM vision healing");let p=await this.provider.analyzeWithSoM(d.screenshot,d.elementMap,e.instruction),g=Kt(De(p),i,a);return await wt(g,n),{code:g,level:2,strategy:"regenerate"}}catch(d){$e.debug({stepId:e.id,err:d},"SoM vision failed, falling back to text regeneration"),await lo(n)}let o=await tn(n,s,i),c="";if(this.ragManager)try{let d=this.ragManager.healingCorpus.retrieve(e.instruction,t.error,2);d.length>0&&(c=`
792
+ `).map(t=>t.trim()).filter(t=>t.length>0&&t.startsWith("await"))}var $e,ci,Kd=b(()=>{"use strict";m();zd();qd();At();io();N();oi();Ar();$e=E("self-healing"),ci=class{constructor(e,t,s,n=!1){this.provider=e;this.maxLevel=t;this.ragManager=s;this.healAssertionLocators=n}provider;maxLevel;ragManager;healAssertionLocators;async heal(e,t,s,n,i,a){if(t.failureKind==="assertion")return $e.info({stepId:e.id},"Assertion failure \u2014 skipping all healing levels (possible application bug)"),null;if(t.failureKind==="assertion-locator-missing"){if(!this.healAssertionLocators)return $e.info({stepId:e.id},"Assertion-locator heal disabled \u2014 skipping"),null;try{let c=await this.level2Regenerate(e,t,s,n,i,a);if(c!==null)return $e.info({stepId:e.id},"Assertion locator healed (matcher preserved)"),{...c,strategy:"regenerate"}}catch(c){$e.debug({err:c,stepId:e.id},"Assertion-locator heal attempt threw")}return null}let o=e.stepType==="api"||tt(e.instruction)==="api";for(let c=1;c<=this.maxLevel;c++){if(o&&(c===3||c===4)){$e.debug({stepId:e.id,level:c},`Skipping DOM-specific level ${c} for API step`);continue}$e.debug({stepId:e.id,level:c,isApi:o},`Attempting heal level ${c}`);try{let l=await this.tryLevel(c,e,t,s,n,i,a,o);if(l!==null)return $e.info({stepId:e.id,level:c,strategy:l.strategy},"Healing succeeded"),l}catch(l){$e.debug({err:l,level:c,stepId:e.id},`Level ${c} healing attempt threw`)}}return $e.warn({stepId:e.id,maxLevel:this.maxLevel},"All healing levels exhausted"),null}async tryLevel(e,t,s,n,i,a,o,c=!1){switch(e){case 1:return this.level1Retry(s,i);case 2:return c?this.level2ApiRegenerate(t,s,i,a,o):this.level2Regenerate(t,s,n,i,a,o);case 3:return this.level3MultiSelector(t,s,n,i,a,o);case 4:return this.level4Visual(t,i,a,o);case 5:return this.level5Decompose(t,s,n,i,a,o);case 6:return this.level6Manual(t,s);default:return null}}async level1Retry(e,t){return await t.waitForLoadState("networkidle",{timeout:5e3}).catch(()=>{}),await t.waitForTimeout(1e3),await wt(e.failedCode,t),{code:e.failedCode,level:1,strategy:"retry"}}async level2Regenerate(e,t,s,n,i,a){if(this.provider.supportsVision)try{let d=await co(n);$e.debug({stepId:e.id},"Level 2: using SoM vision healing");let p=await this.provider.analyzeWithSoM(d.screenshot,d.elementMap,e.instruction),g=Kt(De(p),i,a);return await wt(g,n),{code:g,level:2,strategy:"regenerate"}}catch(d){$e.debug({stepId:e.id,err:d},"SoM vision failed, falling back to text regeneration"),await lo(n)}let o=await tn(n,s,i),c="";if(this.ragManager)try{let d=this.ragManager.healingCorpus.retrieve(e.instruction,t.error,2);d.length>0&&(c=`
793
793
 
794
794
  Similar past fixes that worked:
795
795
  `+d.map((p,g)=>` ${g+1}. Error: ${p.error}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "assuremind",
3
- "version": "1.4.1",
3
+ "version": "1.4.2",
4
4
  "description": "AI-powered codeless UI & API automation framework",
5
5
  "author": "Deepak Hiremath",
6
6
  "license": "Apache-2.0",
@@ -122,5 +122,8 @@
122
122
  "tsup": "^8.3.0",
123
123
  "typescript": "^5.6.0",
124
124
  "vitest": "3.2.6"
125
+ },
126
+ "overrides": {
127
+ "esbuild": "^0.28.1"
125
128
  }
126
129
  }