shiplightai 0.1.66 → 0.1.68

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.
@@ -4365,7 +4365,7 @@ ${p.join(`
4365
4365
  `)}function ed(e,t){let i=[],a=t?.version||"unknown";i.push(`// @generated by shiplightai v${a}`),i.push(...Zo()),i.push(""),t?.use&&Object.keys(t.use).length>0&&(i.push(`test.use(${JSON.stringify(t.use,null,2)});`),i.push(""));let n=new Set,o={imports:n,actionEntityStore:t?.actionEntityStore},r=t?.testName||"Test Suite",s=ia(t?.tags);i.push(`test.describe.serial('${s}${Se(r)}', () => {`),e.beforeAll&&e.beforeAll.length>0&&(i.push(...Pi("beforeAll",e.beforeAll,o,1)),i.push("")),e.beforeEach&&e.beforeEach.length>0&&(i.push(...Pi("beforeEach",e.beforeEach,o,1)),i.push(""));for(let c=0;c<e.tests.length;c++){let d=e.tests[c],h=d.timeout||d.skip!==void 0||d.fail!==void 0||d.only||d.slow?{timeout:d.timeout,skip:d.skip,fail:d.fail,only:d.only,slow:d.slow}:void 0;if(d.parameters&&d.parameters.length>0)for(let p of d.parameters){let g=qo(d.testFlow,p.values);i.push(...Li(g,`${Se(d.name)} [${Se(p.name)}]`,o,1,h)),i.push("")}else i.push(...Li(d.testFlow,Se(d.name),o,1,h)),(c<e.tests.length-1||e.afterEach||e.afterAll)&&i.push("")}return e.afterEach&&e.afterEach.length>0&&(i.push(...Pi("afterEach",e.afterEach,o,1)),i.push("")),e.afterAll&&e.afterAll.length>0&&i.push(...Pi("afterAll",e.afterAll,o,1)),i.push("});"),Qo(i,n),i.join(`
4366
4366
  `)}function ia(e){return e&&e.length>0?e.map(t=>`@${t}`).join(" ")+" ":""}var td=["testContext","request"];function Oi(e){let t=new Set;function i(a){for(let n of a)switch(n.type){case me.ACTION:{let r=n.action_entity?.action_data?.kwargs;if(r?.args&&Array.isArray(r.args))for(let s of r.args)typeof s=="string"&&td.includes(s)&&t.add(s);break}case me.STEP:i(n.statements);break;case me.IF_ELSE:{let o=n;i(o.then),o.else&&i(o.else);break}case me.WHILE_LOOP:i(n.body);break}}return i(e),t}function id(e){let t=Oi(e.statements??[]);if(e.teardown)for(let i of Oi(e.teardown))t.add(i);return t}function aa(e){return`{ ${["page","agent",...Array.from(e).sort()].join(", ")} }`}function Li(e,t,i,a=0,n){let o=" ".repeat(a),r=[],s=id(e),l=aa(s),c=n?.only?"test.only":"test";r.push(`${o}${c}('${t}', async (${l}) => {`),n?.skip===!0?r.push(`${o} test.skip();`):typeof n?.skip=="string"&&r.push(`${o} test.skip(true, '${Se(n.skip)}');`),n?.fail===!0?r.push(`${o} test.fail();`):typeof n?.fail=="string"&&r.push(`${o} test.fail(true, '${Se(n.fail)}');`),n?.slow&&r.push(`${o} test.slow();`),n?.timeout&&r.push(`${o} test.setTimeout(${n.timeout});`);let d=e.teardown&&e.teardown.length>0,h=a+1;if(d){if(r.push(`${o} try {`),e.statements&&e.statements.length>0){r.push(`${o} // Test steps`);let g=ge(e.statements,h+1,i);r.push(...g)}r.push(`${o} } finally {`),r.push(`${o} // Teardown`);let p=ge(e.teardown,h+1,i,"teardown");r.push(...p),r.push(`${o} }`)}else if(e.statements&&e.statements.length>0){r.push(`${o} // Test steps`);let p=ge(e.statements,h,i);r.push(...p)}return r.push(`${o}});`),r}function Vo(e,t,i){let a=[],n=Jo(t),o=Oi(n),r=aa(o);return a.push(`test.${e}(async (${r}) => {`),a.push(...ge(n,1,i,e)),a.push("});"),a}function Pi(e,t,i,a){let n=" ".repeat(a),o=[],r=Jo(t);if(e==="beforeAll"||e==="afterAll"){let l={...i,noAgent:!0};o.push(`${n}test.${e}(async ({ browser }, workerInfo) => {`),o.push(`${n} const page = await browser.newPage({ baseURL: workerInfo.project.use.baseURL });`),o.push(...ge(r,a+1,l,e)),o.push(`${n} await page.close();`),o.push(`${n}});`)}else{let l=Oi(r),c=aa(l);o.push(`${n}test.${e}(async (${c}) => {`),o.push(...ge(r,a+1,i,e)),o.push(`${n}});`)}return o}function Jo(e){let i=(0,Yo.stringify)({goal:"_hook",statements:e});return pe(i).statements??[]}function qo(e,t){let i=qn(e);for(let[a,n]of Object.entries(t))i=i.split(`<<${a}>>`).join(String(n));return pe(i)}function Zo(){return["import { test, expect } from 'shiplightai/fixture';"]}function Qo(e,t){if(t.size>0){let i=0;for(let n=0;n<e.length;n++)e[n].startsWith("import ")&&(i=n+1);let a=Array.from(t);e.splice(i,0,...a)}}var Xo=5;function tr(e,t,i){let a={expandingPaths:new Set([(0,qe.resolve)(t)]),depth:0,referencedPaths:new Set,basePath:i},n={...e};Array.isArray(n.statements)&&(n.statements=Re(n.statements,t,a)),Array.isArray(n.teardown)&&(n.teardown=Re(n.teardown,t,a));for(let o of["beforeAll","afterAll","beforeEach","afterEach"])Array.isArray(n[o])&&(n[o]=Re(n[o],t,a));return{doc:n,referencedTemplatePaths:Array.from(a.referencedPaths)}}function Re(e,t,i){let a=[];for(let n of e)if(nd(n)){let o=ad(n,t,i);a.push(o)}else a.push(od(n,t,i));return a}function nd(e){return typeof e=="object"&&e!==null&&typeof e.template=="string"}function ad(e,t,i){if(i.depth>=Xo)throw new Error(`Template expansion exceeded maximum depth of ${Xo}. Check for deeply nested or circular template references.`);let a=(0,qe.resolve)((0,qe.dirname)(t),e.template),n=!(0,Ni.existsSync)(a)&&i.basePath?(0,qe.resolve)(i.basePath,e.template):a;if(i.expandingPaths.has(n))throw new Error(`Circular template reference detected: ${n} is already being expanded. Stack: ${Array.from(i.expandingPaths).join(" \u2192 ")} \u2192 ${n}`);i.referencedPaths.add(n);let o;try{o=(0,Ni.readFileSync)(n,"utf-8")}catch(f){throw new Error(`Failed to read template file: ${n} (referenced from ${t}): ${f.message}`)}let r=(0,vt.parse)(o);if(!r||typeof r!="object")throw new Error(`Invalid template file: ${n} \u2014 expected a YAML object`);let s=r.params||[],l=e.params||{};for(let f of s)if(!(f in l))throw new Error(`Template ${e.template} requires param "${f}" but it was not provided. Required params: [${s.join(", ")}]`);let c=r.statements;if(!Array.isArray(c))throw new Error(`Template ${e.template} must have a "statements" array`);if(Object.keys(l).length>0){let y=(0,vt.stringify)(c);for(let[b,m]of Object.entries(l))y=y.split(`<<${b}>>`).join(String(m));c=(0,vt.parse)(y)}let d={expandingPaths:new Set([...i.expandingPaths,n]),depth:i.depth+1,referencedPaths:i.referencedPaths},h=Re(c,n,d),g={STEP:r.name||e.template.replace(/\.yaml$/,"").split("/").pop()||e.template,template_path:e.template,statements:h};return Object.keys(l).length>0&&(g.template_params=l),g}function od(e,t,i){if(typeof e!="object"||e===null)return e;let a={...e};return Array.isArray(a.statements)&&(a.statements=Re(a.statements,t,i)),Array.isArray(a.THEN)&&(a.THEN=Re(a.THEN,t,i)),Array.isArray(a.ELSE)&&(a.ELSE=Re(a.ELSE,t,i)),Array.isArray(a.DO)&&(a.DO=Re(a.DO,t,i)),a}var oa=class extends Error{constructor(e){super(e),this.name="YamlValidationError"}};function ra(e,t,i){let a=(0,_t.parse)(e),n=a?.name,o=a?.tags,r=a?.use;if(a&&(a.name!==void 0||a.tags!==void 0||a.use!==void 0)&&(delete a.name,delete a.tags,delete a.use),a?.suite){if(a.goal||a.statements)throw new oa('YAML file cannot have both "suite" and top-level "goal"/"statements". Use either suite format or single-test format.');return sd(a,n,o,r,t,i)}return rd(a,n,o,r,t,i)}function rd(e,t,i,a,n,o){let r=e?.beforeEach,s=e?.afterEach,l=ir(e?.parameters),c=e?.timeout,d=e?.skip,h=e?.fail,p=e?.only,g=e?.slow,f=e?.settings,y=a;if(f){let _={};f.auto_dismiss_modal!==void 0&&(_.autoDismissModal=!!f.auto_dismiss_modal),f.browser_timezone!==void 0&&f.browser_timezone!==null&&(_.timezoneId=String(f.browser_timezone)),f.browser_language!==void 0&&f.browser_language!==null&&(_.locale=String(f.browser_language)),f.extra_http_headers!==void 0&&f.extra_http_headers!==null&&typeof f.extra_http_headers=="object"&&(_.extraHTTPHeaders=f.extra_http_headers),Object.keys(_).length>0&&(y={...y,..._})}if(e&&(delete e.beforeEach,delete e.afterEach,delete e.parameters,delete e.timeout,delete e.skip,delete e.fail,delete e.only,delete e.slow,delete e.settings),e?.url)throw new oa(`The "url" field is not supported in local YAML tests. Use "base_url: ${e.url}" and add "- URL: /" as the first statement instead.`);e&&!e.goal&&t&&(e.goal=t);let b=[];if(n&&e&&typeof e=="object"){let _=tr(e,n,o);e=_.doc,b=_.referencedTemplatePaths}let m=(0,_t.stringify)(e),x=pe(m);return n&&(Je(x.statements??[],n,"main"),x.teardown&&Je(x.teardown,n,"teardown")),{testFlow:x,name:t,tags:i,use:y,beforeEach:r,afterEach:s,parameters:l,timeout:c,skip:d,fail:h,only:p,slow:g,referencedTemplatePaths:b}}function sd(e,t,i,a,n,o){let r=e.suite;if(!Array.isArray(r.tests)||r.tests.length===0)throw new Error('Suite must have a non-empty "tests" array.');let s=r.beforeAll,l=r.afterAll,c=r.beforeEach,d=r.afterEach,h=[],p=r.tests.map(y=>{if(!y.name)throw new Error('Each test in a suite must have a "name" field.');if(!Array.isArray(y.statements)||y.statements.length===0)throw new Error(`Suite test "${y.name}" must have a non-empty "statements" array.`);let b={goal:y.name,statements:y.statements};y.teardown&&(b.teardown=y.teardown);let m=[],x=b;if(n&&typeof b=="object"){let $=tr(b,n,o);x=$.doc,m=$.referencedTemplatePaths,h.push(...m)}let _=(0,_t.stringify)(x),E=pe(_),A=ir(y.parameters);return{testFlow:E,name:y.name,tags:Array.isArray(y.tags)?y.tags:void 0,parameters:A,timeout:y.timeout,skip:y.skip,fail:y.fail,only:y.only,slow:y.slow}}),g=r.base_url,f=g?{...a,baseURL:g}:a;return{suite:{beforeAll:s,afterAll:l,beforeEach:c,afterEach:d,tests:p},name:t,tags:i,use:f,referencedTemplatePaths:h}}function ir(e){if(!(!Array.isArray(e)||e.length===0))return e.map((t,i)=>{if(!t.name)throw new Error(`Parameter set at index ${i} must have a "name" field.`);if(!t.values||typeof t.values!="object")throw new Error(`Parameter set "${t.name}" must have a "values" object.`);return{name:t.name,values:t.values}})}function Je(e,t,i){for(let a=0;a<e.length;a++){let n=e[a],o=`${i}.${a}`,r=n.description||"";if(n.uid=ld(t,o,r),n.type===me.STEP)Je(n.statements,t,o);else if(n.type===me.IF_ELSE){let s=n;Je(s.then,t,`${o}.then`),s.else&&Je(s.else,t,`${o}.else`)}else n.type===me.WHILE_LOOP&&Je(n.body,t,`${o}.body`)}}function ld(e,t,i){let a=(0,er.createHash)("sha256").update(`${e}:${t}:${i}`).digest("hex");return`${a.slice(0,8)}-${a.slice(8,12)}-${a.slice(12,16)}-${a.slice(16,20)}-${a.slice(20,32)}`}function ar(e,t,i){let a=/\btemplate:\s/.test(e),n=/^suite:/m.test(e),o=a||n?null:Qn(e);if(o&&!o.valid)return{valid:!1,errors:o.errors,warnings:[],stats:o.stats};let r,s,l=[];try{let c=i?.parsed??ra(e,t);l=c.referencedTemplatePaths;let d={version:i?.version,actionEntityStore:i?.actionEntityStore},h=c.testFlow?.baseURL?{...c.use,baseURL:c.testFlow.baseURL}:c.use;c.suite?r=ed(c.suite,{...d,testName:c.name,tags:c.tags,use:c.use}):r=Qc(c.testFlow,{...d,testName:c.name,tags:c.tags,use:h,beforeEach:c.beforeEach,afterEach:c.afterEach,parameters:c.parameters,timeout:c.timeout,skip:c.skip,fail:c.fail,only:c.only,slow:c.slow});let p=r.split(`
4367
4367
  `).filter(g=>!g.startsWith("import ")).join(`
4368
- `);new Function(p),s=t.replace(/\.test\.yaml$/,".yaml.spec.ts"),(0,kt.mkdirSync)((0,nr.dirname)(s),{recursive:!0}),(0,kt.writeFileSync)(s,r)}catch(c){let d=c instanceof oa?"":c.message.includes("Unexpected token")?" This usually means a YAML escaping issue \u2014 in double-quoted strings, use \\\\/ instead of \\/ for regex patterns, or use single quotes / block scalars.":" This may indicate a transpiler bug \u2014 please report it.";return{valid:!1,errors:[`Transpilation failed: ${c.message}.${d}`],warnings:[],stats:o?.stats??{total:0,action:0,draft:0,coverage:0},referencedTemplatePaths:l}}return{valid:!0,errors:[],warnings:o?.warnings??[],stats:o?.stats??{total:0,action:0,draft:0,coverage:0},specFile:s,referencedTemplatePaths:l}}var sa="0.1.66";function or(e){try{return(0,Fe.statSync)(e).mtimeMs}catch{return 0}}var cd=`// @generated by shiplightai v${sa}`;function dd(e,t){if(!(0,Fe.existsSync)(e)||(0,Fe.readFileSync)(e,"utf-8").split(`
4368
+ `);new Function(p),s=t.replace(/\.test\.yaml$/,".yaml.spec.ts"),(0,kt.mkdirSync)((0,nr.dirname)(s),{recursive:!0}),(0,kt.writeFileSync)(s,r)}catch(c){let d=c instanceof oa?"":c.message.includes("Unexpected token")?" This usually means a YAML escaping issue \u2014 in double-quoted strings, use \\\\/ instead of \\/ for regex patterns, or use single quotes / block scalars.":" This may indicate a transpiler bug \u2014 please report it.";return{valid:!1,errors:[`Transpilation failed: ${c.message}.${d}`],warnings:[],stats:o?.stats??{total:0,action:0,draft:0,coverage:0},referencedTemplatePaths:l}}return{valid:!0,errors:[],warnings:o?.warnings??[],stats:o?.stats??{total:0,action:0,draft:0,coverage:0},specFile:s,referencedTemplatePaths:l}}var sa="0.1.68";function or(e){try{return(0,Fe.statSync)(e).mtimeMs}catch{return 0}}var cd=`// @generated by shiplightai v${sa}`;function dd(e,t){if(!(0,Fe.existsSync)(e)||(0,Fe.readFileSync)(e,"utf-8").split(`
4369
4369
  `,1)[0]!==cd)return!1;let a=or(e);for(let n of t)if(or(n)>a)return!1;return!0}function ud(e){let t=process.argv.slice(2),i=[],a=(0,Ze.resolve)(e);for(let n of t){if(n.startsWith("-"))continue;let o=n.endsWith(".yaml.spec.ts")?n.replace(/\.yaml\.spec\.ts$/,".test.yaml"):n;if(!o.endsWith(".test.yaml"))continue;let r=(0,Ze.resolve)(e,o);(0,Fe.existsSync)(r)&&i.push(r.startsWith(a)?r.slice(a.length+1):o)}return i.length>0?i:null}function sr(e){let t=ud(e.cwd),i=t??(0,rr.globSync)("**/*.test.yaml",{cwd:e.cwd,ignore:["**/node_modules/**"]}),a=[];for(let n of i){let o=(0,Ze.resolve)(e.cwd,n),r=o.replace(/\.test\.yaml$/,".yaml.spec.ts"),s=(0,Fe.readFileSync)(o,"utf-8");try{let l=ra(s,o,e.projectRoot??e.cwd),c=(0,Ze.relative)(e.cwd,o),d=e.actionEntityStores?.get(c)??e.actionEntityStores?.get("*");if(!(d&&Object.keys(d.entries).length>0)&&dd(r,[o,...l.referencedTemplatePaths]))continue;let p=ar(s,o,{version:sa,actionEntityStore:d,parsed:l});if(!p.valid)throw new Error(p.errors.join("; "))}catch(l){console.error(`[shiplight] Failed to transpile ${n}:`,l),a.push({file:n,error:l})}}if(a.length>0){let n=`[shiplight] Transpilation failed for ${a.length} file(s):
4370
4370
  `+a.map(o=>` - ${o.file}`).join(`
4371
4371
  `);if(t)throw new Error(n);console.warn(n+" (skipped)")}}var re=X(require("fs"),1),St=X(require("path"),1),gr=require("glob");Fi();function fr(e){let t=Ri().SHIPLIGHT_API_TOKEN;return process.env.CI&&t?new ha:new ua(e)}var vd=".shiplight/action-cache";function pr(e){return e.replace(/\//g,"__")+".json"}function _d(e){return e.replace(/\.json$/,"").replace(/__/g,"/")}var ua=class{constructor(t){this.cwd=t;this.cacheDir=St.join(t,vd)}isCloud=!1;cacheDir;async lookup(t){let i=new Map;if(t.length===0||!re.existsSync(this.cacheDir))return i;for(let a of t){let n=St.join(this.cacheDir,pr(a));try{if(re.existsSync(n)){let o=re.readFileSync(n,"utf-8");i.set(a,JSON.parse(o))}}catch{}}return i}async update(t){if(t.size===0)return 0;re.mkdirSync(this.cacheDir,{recursive:!0});let i=0;for(let[a,n]of t)try{let o=St.join(this.cacheDir,pr(a)),r=ea();if(re.existsSync(o))try{r=JSON.parse(re.readFileSync(o,"utf-8"))}catch{}let s={...r,entries:{...r.entries,...n.entries}};re.writeFileSync(o,JSON.stringify(s,null,2)),i++}catch{}return i}loadAll(){if(!re.existsSync(this.cacheDir))return;let t=(0,gr.globSync)("*.json",{cwd:this.cacheDir});if(t.length===0)return;let i=new Map,a=0;for(let n of t)try{let o=re.readFileSync(St.join(this.cacheDir,n),"utf-8"),r=JSON.parse(o),s=_d(n);i.set(s,r),a+=Object.keys(r.entries??{}).length}catch{}if(i.size!==0)return console.log(`[shiplight] Cache: loaded ${a} cached action entit${a===1?"y":"ies"} for ${i.size} test file${i.size!==1?"s":""}`),i}},ha=class{isCloud=!0;async lookup(t){let{lookupActionStores:i}=await Promise.resolve().then(()=>(da(),ca));return i(t)}async update(t){let{updateActionStores:i}=await Promise.resolve().then(()=>(da(),ca));return i(t)}loadAll(){}};Fi();function yr(e={}){e.dotenv!==!1&&kd(e.scanDir||process.cwd());let t=e.scanDir||process.cwd(),a=fr(t).loadAll();return sr({cwd:t,projectRoot:process.cwd(),actionEntityStores:a}),{reporter:[["list"],["shiplightai/reporter",{outputFolder:"shiplight-report",open:"never"}]]}}function xr(e,...t){return(0,br.defineConfig)(e,...t)}function kd(e){dr(e);for(let t of la(e))wr.default.config({path:t})}F();F();jt();nt();var ro=require("zod"),Sh=ro.z.object({instruction:ro.z.string().describe('The instruction of the operation to perform. Can only include one operation. Do not inlcude element indexes just describe the element, e.g. "select the text "Hello, world!" in "Hello, world!""')});function Dl(e){e.register({name:"perform_accurate_operation",description:"Perform an operation that requires accurate interaction like dragging or interacting with a specific area of an element. Only use this action when neccecary.",schema:Sh,usesElementIndex:!1,async execute(t,i){let{instruction:a}=t,n={page:i.page,agentServices:i.agentServices,domService:i.domService},o=await it(a,n,{});if(o.status==="error"||!o.actionEntity)return{success:!1,actionEntity:{action_description:a,action_data:{action_name:"perform_accurate_operation",kwargs:{instruction:a}}},error:o.error||"Failed to generate action"};let{actionEntity:r}=o,s=await Bt(r,n);return{success:s.success,actionEntity:r,message:s.success?`Successfully executed action: ${r.action_data?.action_name}`:void 0,error:s.error}}})}$e();F();var Rl=require("ai"),Fl=require("html-to-text");async function Eh(e,t,i){let{apiKey:a,domain:n}=e;if(!a||!n)throw new Error("Mailgun configuration missing. Please provide apiKey and domain");let o=[];try{let r=`https://api.mailgun.net/v3/${n}/events`,s={event:"accepted",limit:"10",ascending:"yes",recipient:t};if(i.from_email&&(s.from=i.from_email),i.since)s.begin=Math.floor(i.since/1e3).toString();else{let d=new Date(Date.now()-6e5);s.begin=Math.floor(d.getTime()/1e3).toString()}u.info(`Mailgun params: ${JSON.stringify(s)}`);let l=await fetch(r+"?"+new URLSearchParams(s),{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`api:${a}`).toString("base64")}`}});if(!l.ok){let d=await l.text();throw new Error(`Mailgun events API error: ${d}`)}let c=(await l.json()).items||[];for(let d of c.slice(0,10)){if(d.event!=="accepted")continue;let h=(d.storage||{}).url;if(u.info(`message_url: ${h}`),!h){let f=(d.message||{}).headers||{},y=f.subject||"",b=f.from||"",m=f.to||"";if(i.from_email&&!b.toLowerCase().includes(i.from_email.toLowerCase())||i.to_email&&!m.toLowerCase().includes(i.to_email.toLowerCase())||i.subject&&!y.toLowerCase().includes(i.subject.toLowerCase()))continue;o.push({subject:y,from:b,to:m,date:new Date(d.timestamp*1e3).toUTCString(),body:"Message body not available (Mailgun storage disabled)",message_id:f["message-id"]||""});continue}let p=h.split("/"),g=p[p.length-1];if(u.info(`Storage key: ${g}`),g){let f=`https://api.mailgun.net/v3/domains/${n}/messages/${g}`;try{let y=await fetch(f,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`api:${a}`).toString("base64")}`,Accept:"application/json"}});if(y.ok){let b=await y.json(),m=b.Subject||"",x=b.From||"",_=b.To||"",E=b.Date||"",A=b["Message-Id"]||"";u.info(`subject: ${m}`),u.info(`from_addr: ${x}`),u.info(`to_addr: ${_}`),u.info(`date: ${E}`),u.info(`message_id: ${A}`);let $=b["body-html"]||b["body-plain"]||"";if($&&$.includes("<")&&($=(0,Fl.convert)($)),u.info(`Body: ${$.substring(0,200)}...`),i.subject&&!m.toLowerCase().includes(i.subject.toLowerCase())||i.body_contains&&!$.toLowerCase().includes(i.body_contains.toLowerCase()))continue;o.push({subject:m,from:x,to:_,date:E,body:$,message_id:A});continue}else u.warn(`Messages API returned ${y.status}`)}catch(y){u.warn(`Failed to parse JSON response: ${y}`)}}try{let f=await fetch(h,{method:"GET",headers:{Authorization:`Basic ${Buffer.from(`api:${a}`).toString("base64")}`}});if(!f.ok){u.warn(`Could not fetch stored message: ${f.status}`);continue}let y=await f.text();u.info(`Fallback: Raw email length: ${y.length}`);let b=y.split(`