agent-afk 5.191.3 → 5.191.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/telegram.mjs CHANGED
@@ -319,7 +319,7 @@ ${o}`,paths:[e,n]}:o!==null?s={content:o,paths:[n]}:r!==null?s={content:r,paths:
319
319
 
320
320
  ${e}`}var iz,Sh=h(()=>{"use strict";iz=new Set(["script","style","noscript","template","svg"])});function lz(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function GA(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function dz(t,e){let n=t.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,e)}async function XA(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??lz,c=n.signal??void 0,l;for(let d=0;d<=o;d++){if(c?.aborted)throw c.reason??new Error("aborted");try{let u=await t(e,n);if(!cz.has(u.status)||d===o)return u;let p=dz(u,i)??GA(d,s,i);D("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,c)}catch(u){if(c?.aborted||(l=u,d===o))throw u;let p=GA(d,s,i);D("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,c)}}throw l??new Error("retryFetch: exhausted without a result")}var cz,zA=h(()=>{"use strict";ie();cz=new Set([429,502,503,504])});import{BlockList as uz,isIP as vh}from"node:net";import{lookup as pz}from"node:dns/promises";import{Agent as fz}from"undici";function VA(){let t=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function yz(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function kh(t){let e=vh(t);return e===0?!1:hz.check(t,e===4?"ipv4":"ipv6")}async function YA(t){return pz(t,{all:!0,verbatim:!0})}async function Pr(t,e={}){if(e.allowPrivateHosts??VA())return{allowed:!0};let n;try{n=new URL(t)}catch{return{allowed:!1,reason:`"${t}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=yz(n.hostname),o=(a,c)=>`refusing to fetch ${c} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(vh(r)!==0)return kh(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??YA,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(kh(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Xi(t,e={}){let n=await Pr(t,e);if(!n.allowed)throw new Ie(n.reason)}async function On(t,e,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},s=e;for(let i=0;i<=JA;i++){await Xi(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??VA())?{dispatcher:bz}:{}},c=await XA(t,s,a,r.retry??{});if(!wz.has(c.status))return c;let l=c.headers.get("location");if(l===null||l.trim()==="")return c;let d;try{d=new URL(l,c.url||s).toString()}catch{return c}await c.body?.cancel().catch(()=>{}),s=d}throw new Ie(`too many redirects (>${JA}) starting from ${e}`)}var mz,gz,hz,Ie,bz,JA,wz,Mr=h(()=>{"use strict";L();zA();mz=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],gz=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],hz=(()=>{let t=new uz;for(let[e,n]of mz)t.addSubnet(e,n,"ipv4");for(let[e,n]of gz)t.addSubnet(e,n,"ipv6");return t})(),Ie=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};bz=new fz({connect:{lookup(t,e,n){YA(t).then(r=>{let o=r.find(i=>kh(i.address));if(o!==void 0){n(new Ie(`refusing to connect to ${t} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let s=r[0];if(s===void 0){n(new Error(`DNS lookup returned no addresses for ${t}`),"",0);return}n(null,s.address,vh(s.address))},r=>n(r,"",0))}}});JA=20,wz=new Set([301,302,303,307,308])});var Eh={};Xs(Eh,{enforceDomainPolicy:()=>Ct,loadBrowserConfig:()=>Th});import{readFileSync as Sz}from"node:fs";import{join as kz}from"path";function vz(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function QA(t,e){return vz(e).test(t)}function _z(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(Tz.has(e))return!0;if(Ez.has(e))return!1}return!1}function ZA(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function Az(t){if(t===void 0||t==="")return"auto";if(t==="playwright"||t==="agent-browser"||t==="auto")return t;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${t}`)}function ex(t){let e=t===void 0||t.trim()===""?"default":t.trim();return ym(e),e}function xz(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function Rz(t){try{return Sz(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function Iz(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright"||e.backend==="agent-browser"||e.backend==="auto")n.backend=e.backend;else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=ex(e.defaultProfile)),n}function Th(t){let e=t?.env??k,n=t?.readFileSync??Rz,r=t?.surface??e.AGENT_SURFACE,o=_z(e.AFK_BROWSER_HEADLESS,r),s=ZA(e.AFK_BROWSER_ALLOWED_DOMAINS),i=ZA(e.AFK_BROWSER_BLOCKED_DOMAINS),a=xz(e.AFK_BROWSER_DOM_SNAPSHOTS),c=Az(e.AFK_BROWSER_BACKEND),l=ex(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:c,configPath:null,defaultProfile:l},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():kz(rn(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=Iz(d,m);return g.configPath=p,g}function Ct(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if(QA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>QA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Tz,Ez,Dn=h(()=>{"use strict";L();j();Tz=new Set(["daemon","subagent","telegram","afk"]),Ez=new Set(["repl","interactive","cli"])});import{readFileSync as Cz}from"node:fs";import{join as Pz}from"node:path";import{homedir as Mz}from"node:os";function Dz(t){let e=t??Oz,n;try{n=Cz(e,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(typeof r!="object"||r===null||Array.isArray(r))return null;let o=r;if(typeof o.url!="string"||typeof o.token!="string"||typeof o.pid!="number")return null;let s;try{s=new URL(o.url)}catch{return null}let{hostname:i,protocol:a}=s;if(!(i==="127.0.0.1"||i==="localhost"||i==="::1")||a!=="http:")throw new Error(`Agent Browser connection file contains an untrusted URL: ${o.url}. Only http://127.0.0.1 or http://localhost is permitted.`);return{url:o.url,token:o.token,pid:o.pid,version:typeof o.version=="string"?o.version:"unknown"}}function Fz(t){try{return process.kill(t,0),!0}catch{return!1}}async function Lz(t,e,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),s=await fetch(`${t}/health`,{method:"GET",headers:{Authorization:`Bearer ${e}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),s.ok}catch{return!1}}async function _h(t){let e=Dz(t);return e===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:Fz(e.pid)?await Lz(e.url,e.token)?{available:!0,connection:e,reason:null}:{available:!1,connection:e,reason:`health probe failed at ${e.url}`}:{available:!1,connection:e,reason:`stale connection file: PID ${e.pid} not alive`}}var Oz,tx=h(()=>{"use strict";Oz=Pz(Mz(),".config","agent-browser","connection.json")});async function nx(t){let{config:e,surface:n}=t;if(e.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(e.backend==="agent-browser"){let i=Date.now(),a=await _h(),c=Date.now()-i;if(!a.available)throw new Error(`AFK_BROWSER_BACKEND=agent-browser but Agent Browser is not available: ${a.reason}`);return{backend:"agent-browser",reason:"explicit config: backend=agent-browser",probeMs:c,availability:a}}if(n&&Nz.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(e.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await _h(),s=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:s,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:s,availability:o}}var Nz,rx=h(()=>{"use strict";tx();Nz=new Set(["daemon","subagent"])});import{createHash as $z}from"crypto";function ox(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&Uz.test(t.label))}function sx(t){return $z("sha256").update(t,"utf8").digest("hex").slice(0,8)}function ix(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var Uz,hd=h(()=>{"use strict";Uz=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as Bz}from"crypto";import{mkdir as jz,stat as Hz,writeFile as Wz}from"fs/promises";import{join as Ah}from"path";import{gzip as Kz}from"zlib";import{promisify as qz}from"util";function Gz(t){return Ah(it(t),"browser")}function Xz(t){return Ah(Gz(t),"screenshots")}function zz(){return new Date().toISOString().replace(/[:.]/g,"-")}function Jz(){return Bz(3).toString("hex")}async function Uo(t,e,n){if(e.length>ax)throw new Error(`writeScreenshotSidecar: buffer exceeds ${ax} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=Xz(t);await jz(r,{recursive:!0});let o=`${zz()}-${Jz()}-${n}.png`,s=Ah(r,o);await Wz(s,e);let{size:i}=await Hz(s);return{path:s,bytes:i}}var Kge,ax,xh=h(()=>{"use strict";j();hd();Kge=qz(Kz);ax=5*1024*1024});var yd,cx=h(()=>{"use strict";yd=class{baseUrl;token;constructor(e){this.baseUrl=e.url,this.token=e.token}async call(e,n,r=3e4){let o={version:1,method:e,params:n},s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let a=await fetch(`${this.baseUrl}/agent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`,Host:new URL(this.baseUrl).host},body:JSON.stringify(o),signal:s.signal});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Agent Browser ${e} failed (HTTP ${a.status}): ${c}`)}return await a.json()}finally{clearTimeout(i)}}async listTabs(){return(await this.call("tabs.list",null)).tabs}async openTab(e){return{tabId:(await this.call("tabs.open",{url:e},6e4)).tab_id}}async closeTab(e){await this.call("tabs.close",{tab_id:e})}async read(e,n){return this.call("page.read",{tab_id:e,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(e,n){return this.call("page.inspect",{tab_id:e,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(e,n){await this.call("page.click",{tab_id:e,element_id:n})}async fill(e,n,r){await this.call("page.fill",{tab_id:e,element_id:n,value:r})}async press(e,n,r){await this.call("page.press",{tab_id:e,key:n,...r?{element_id:r}:{}})}async select(e,n,r){await this.call("page.select",{tab_id:e,element_id:n,value:r})}async waitFor(e,n,r){await this.call("page.wait",{tab_id:e,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(e,n){return this.call("page.eval",{tab_id:e,script:n})}async screenshot(e){return this.call("page.screenshot",{tab_id:e})}}});function Rh(t){return{id:t.id,role:t.role,label:t.label,kind:t.kind,value:t.value,state:{disabled:t.disabled,...t.checked!==void 0?{checked:t.checked}:{},...t.selected!==void 0?{selected:t.selected}:{},...t.expanded!==void 0?{expanded:t.expanded}:{}},bbox:t.bbox,...t.selector?{selector:t.selector}:{}}}function lx(t,e){switch(e.kind){case"element_id":if(t.has(e.elementId))return e.elementId;throw new Error(`Element ${e.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function Ih(t,e,n,r,o,s){switch(n){case"click":await t.click(e,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await t.fill(e,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await t.press(e,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await t.select(e,r,o);break;case"hover":throw new Error("hover is not supported by Agent Browser; use element_id from a prior observation to target clicks instead");case"scroll_to":{let i=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await t.evalScript(e,`document.querySelector('[data-element-id="${i}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await t.waitFor(e,"element",{value:r,timeout:s??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function dx(t,e){if(e.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await t.client.inspect(t.tabId,{mode:"interactive",query:e.target.text,limit:10}),r=n;if(e.target.role){let c=e.target.role.toLowerCase();r=n.filter(l=>l.role.toLowerCase()===c)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${e.target.text}"`+(e.target.role?`, role="${e.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:e.target.text,...e.target.role?{role:e.target.role}:{}},candidates:r.slice(0,5).map(Rh)};let s=r[0].id;await Ih(t.client,t.tabId,e.action,s,e.value,e.timeoutMs);let i=await t.client.read(t.tabId,{mode:"main"}),a=Ct(i.url,t.config);return a.allowed?{elementId:s}:{outcome:"blocked_by_policy",url:i.url,reason:`action navigated to blocked domain: ${a.reason}`}}var ux=h(()=>{"use strict";Dn()});var px={};Xs(px,{AgentBrowserProvider:()=>Ch});var Ch,fx=h(()=>{"use strict";Dn();xh();cx();ux();Ch=class{name="agent-browser";config;client;sessions=new Map;constructor(e,n){this.config=e,this.client=new yd(n)}async open(e){let n=Ct(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let r=this.sessions.get(e.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(e.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:e.timeoutMs??3e4});else{let{tabId:i}=await this.client.openTab(e.url);await this.client.waitFor(i,"load",{timeout:e.timeoutMs??3e4}),r={tabId:i,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(e.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),s=Ct(o.url,this.config);return s.allowed?this.buildObservation(r,e.sessionId,e.screenshot,void 0,"browser_open"):(await this.client.evalScript(r.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`redirected to blocked domain: ${s.reason}`})}async observe(e){let n=this.sessions.get(e.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${e.sessionId}. Call browser_open first.`);return this.buildObservation(n,e.sessionId,e.screenshot,e.maxElements,"browser_observe")}async act(e){let n=this.sessions.get(e.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${e.sessionId}. Call browser_open first.`);let r=lx(n.knownElements,e.target);if(r===null){if(e.target.kind==="semantic"){let i=await dx({client:this.client,config:this.config,tabId:n.tabId},e);return"outcome"in i?i:(n.lastAction=`browser_act:${e.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,e.sessionId,e.screenshot,void 0,"browser_act"))}throw e.target.kind==="selector"?new Error("selector targets are not supported by Agent Browser; use element_id or semantic targets"):new Error(`Cannot resolve target: ${JSON.stringify(e.target)}`)}await Ih(this.client,n.tabId,e.action,r,e.value,e.timeoutMs),n.lastAction=`browser_act:${e.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),s=Ct(o.url,this.config);return s.allowed?this.buildObservation(n,e.sessionId,e.screenshot,void 0,"browser_act"):(await this.client.evalScript(n.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`action navigated to blocked domain: ${s.reason}`})}async render(e){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(e){let n=this.sessions.get(e.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${e.sessionId}. Call browser_open first.`);if(e.target!==void 0||e.fullPage)throw new Error("Agent Browser does not support element or full-page screenshots; omit target and fullPage.");let r=await this.client.screenshot(n.tabId),o=Buffer.from(r.data,"base64"),s=o.length>=24?o.readUInt32BE(16):0,i=o.length>=24?o.readUInt32BE(20):0;return{path:(await Uo(e.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:s,height:i,dataBase64:r.data,mediaType:"image/png"}}async extract(e){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(e){let n=this.sessions.get(e.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(e.sessionId)}}describe(e){let n=this.sessions.get(e);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let e=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(e),this.sessions.clear()}async buildObservation(e,n,r,o,s="browser_open"){let[i,a]=await Promise.all([this.client.read(e.tabId,{mode:"main",budget:4e3}),this.client.inspect(e.tabId,{mode:"interactive",limit:o??80})]),c=a.elements.map(Rh),l=o??80,d=c.slice(0,l);e.observationCounter+=1,e.knownElements=new Map(d.map(g=>[g.id,g])),e.currentUrl=i.url,e.currentTitle=i.title;let u=[];c.length>l&&u.push(`page has ${c.length} interactive elements; showing first ${l}`);let p=null;if(r)try{let g=await this.client.screenshot(e.tabId),y=Buffer.from(g.data,"base64");p=(await Uo(n,y,s)).path}catch{u.push("screenshot capture failed")}let f=`obs_${e.observationCounter.toString(36)}`,m={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:i.url,title:i.title,textSummary:i.content.slice(0,4e3),interactive:d,status:m,warnings:u,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as Vz,readFileSync as Yz}from"node:fs";import{createRequire as Qz}from"node:module";import{dirname as Zz,join as eJ}from"node:path";function hx(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<nJ&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function Xe(t){let e=hx(t);return gx.some(n=>e.includes(n))}function rJ(){try{let e=Qz(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(Yz(e,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let s=eJ(Zz(e),o);return Vz(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function zi(){return mx??=rJ()??tJ,mx}function Ph(t){return t.includes("install chromium")}function ht(t,e){let n=hx(t),r=e?.latched===!0?` ${oJ}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${zi()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${zi()}). Or pick a different tool.${r}`}function bd(t,e,n=!1){if(!Xe(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
321
321
 
322
- ${ht(t,{headless:e,latched:n})}`,{cause:t})}var gx,tJ,nJ,mx,oJ,Mh=h(()=>{"use strict";gx=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],tJ="pnpm exec playwright install chromium",nJ=4;oJ="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Or from"node:fs";import wd from"node:path";import{randomBytes as sJ}from"node:crypto";function iJ(){try{return"5.191.3"}catch{}try{let t=wd.resolve(import.meta.dirname,"../../../package.json"),e=Or.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var aJ,Sd,yx=h(()=>{"use strict";Mh();j();ie();aJ=iJ(),Sd=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let e;try{({chromium:e}=await import("playwright"))}catch(n){let r=bd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await e.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=bd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${aJ}`}}loadStorageState(e){let n=bm(e);try{if(!Or.existsSync(n))return;let r=JSON.parse(Or.readFileSync(n,"utf8"));return D("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){D("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=bm(e);if(!Or.existsSync(r))return;let o=await n.storageState(),s=wd.join(wd.dirname(r),`.${wd.basename(r)}.${process.pid}.${sJ(4).toString("hex")}.tmp`);Or.writeFileSync(s,JSON.stringify(o),{mode:384}),Or.chmodSync(s,384),Or.renameSync(s,r),D("[browser/vault] saved session",{profile:e,file:r})}catch(r){D("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as cJ}from"node:crypto";function lJ(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function dJ(t,e,n){return`el_${cJ("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function uJ(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function bx(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Sx(t,e){let n=t.role??"",r=t.name??"";wx.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Sx(s,e)}async function pJ(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},kx).catch(()=>[])}async function fJ(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},kx).catch(()=>[])}function mJ(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function kd(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=mJ(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=pJ(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],Sx(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await fJ(t)).filter(M=>wx.has(M.role??"")));let S=new Map;for(let I of p){let M=bx(I.name),H=S.get(M);(!H||H.bbox.w===0&&I.bbox.w>0)&&S.set(M,I)}let v=y.map(I=>({ax:I,dom:S.get(bx(I.name??""))})),_=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);_.sort((I,M)=>{let H=I.dom?.bbox.y??0,P=M.dom?.bbox.y??0;if(H!==P)return H-P;let N=I.dom?.bbox.x??0,F=M.dom?.bbox.x??0;return N-F}),_.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=_.slice(0,n).map((I,M)=>{let H=I.ax.role??"generic",P=I.ax.name??"",N=dJ(H,P,M),F=I.dom?.bbox??{x:0,y:0,w:0,h:0},$=I.dom?.type??null,B=null;I.ax.value!==void 0&&I.ax.value!==null&&(B=String(I.ax.value)),I.ax.checked!==void 0&&(B=String(I.ax.checked)),ox({role:H,kind:$})&&(B="[redacted]");let K={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(K.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(K.selected=I.ax.selected),I.ax.expanded!==void 0&&(K.expanded=I.ax.expanded);let Q;I.dom?.testId?Q=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(Q=`#${I.dom.id}`);let st={id:N,role:H,label:lJ(P),kind:$,value:B,state:K,bbox:F};return Q!==void 0&&(st.selector=Q),st}),x="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?x="loading":I==="interactive"?x="navigating":x="idle"}catch{x="navigating"}x!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=uJ(f),T=`obs_${e.observationCounter.toString(36)}`,E=new Date().toISOString();return{observationId:T,url:m,title:g,textSummary:C,interactive:R,status:{httpStatus:e.httpStatus??null,loadingState:x,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:E}}var wx,kx,vx=h(()=>{"use strict";hd();wx=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kx="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Tx(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Oh(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Tx(t,s)))).filter(o=>o!==null)}async function gJ(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Dh(t,e,n){switch(e.kind){case"element_id":return hJ(t,e,n);case"selector":return yJ(t,e);case"semantic":return bJ(t,e)}}async function hJ(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Oh(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function yJ(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Oh(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function bJ(t,e){return e.role!==void 0?wJ(t,e.text,e.role):SJ(t,e.text,e)}async function wJ(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Oh(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function SJ(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await gJ(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let b=await Tx(y.locator,y.index);if(b!==null){let S=`${b.role}:${b.label}:${g}`,v=0;for(let _=0;_<S.length;_++)v=v*31+S.charCodeAt(_)>>>0;f.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Ex=h(()=>{"use strict"});async function Fh(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ct(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var _x=h(()=>{"use strict";Dn()});var Nh={};Xs(Nh,{PlaywrightProvider:()=>Lh});function Ax(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Lh,$h=h(()=>{"use strict";yx();vx();Ex();Dn();_x();xh();Lh=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Sd(e)}async open(e){let n=Ct(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await Fh(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await kd(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await kd(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await Dh(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${Ax(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){l=y}else l=g}let u=await Fh(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await kd(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await Dh(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${Ax(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Uo(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Uo(n,o,r);return s}catch{return null}}}});var Fr={};Xs(Fr,{__resetBrowserRegistryForTests:()=>AJ,browserProviderActive:()=>TJ,closeBrowserProvider:()=>Bh,getBrowserProvider:()=>vJ,getLastRoutingDecision:()=>_J,peekBrowserProvider:()=>EJ});function xx(){Promise.resolve(Bh()).then(()=>{process.exit(130)})}function Rx(){Promise.resolve(Bh()).then(()=>{process.exit(143)})}function Ix(){Xt=null}function kJ(){vd||(process.on("SIGINT",xx),process.on("SIGTERM",Rx),process.on("exit",Ix),vd=!0)}function Cx(){vd&&(process.removeListener("SIGINT",xx),process.removeListener("SIGTERM",Rx),process.removeListener("exit",Ix),vd=!1)}async function vJ(t){return Xt!==null?Xt:(Dr!==null||(Dr=(async()=>{let e=Th(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await nx({config:e,surface:n});Uh=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(fx(),px)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>($h(),Nh));o=new s(e)}return kJ(),Xt=o,Dr=null,o})()),Dr)}async function Bh(){if(Xt===null)return;let t=Xt;Xt=null,Dr=null,Cx(),await t.shutdown()}function TJ(){return Xt!==null}function EJ(){return Xt}function _J(){return Uh}function AJ(){Xt=null,Dr=null,Uh=null,Cx()}var Xt,Dr,vd,Uh,Lr=h(()=>{"use strict";Dn();rx();L();Xt=null,Dr=null,vd=!1,Uh=null});async function Px(t,e){try{return await WA(t,e)}catch(n){return D("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function MJ(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Lr(),Fr)),r=await n();try{return await r.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:s}=await Promise.resolve().then(()=>($h(),Nh)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(Dn(),Eh)),a=i(),c=new s(a);try{return await c.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}finally{await c.shutdown()}}throw o}}async function Mx(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??MJ,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await On(n,t,{headers:PJ,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(CJ.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(IJ.test(p)&&!RJ.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await Px(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof Ie||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=wh({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await Xi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>Xi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await Xi(u.finalUrl,o);let p=await Px(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=wh({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof Ie)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var RJ,IJ,CJ,PJ,Ox=h(()=>{"use strict";KA();Sh();Mr();ie();RJ=/(text\/html|application\/xhtml\+xml)/i,IJ=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,CJ=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,PJ={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function FJ(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(OJ,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),DJ),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=ee(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function Dx(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?FJ({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function Fx(t,e){if(e.length===0)return`# Search results for "${t}"
322
+ ${ht(t,{headless:e,latched:n})}`,{cause:t})}var gx,tJ,nJ,mx,oJ,Mh=h(()=>{"use strict";gx=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],tJ="pnpm exec playwright install chromium",nJ=4;oJ="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Or from"node:fs";import wd from"node:path";import{randomBytes as sJ}from"node:crypto";function iJ(){try{return"5.191.4"}catch{}try{let t=wd.resolve(import.meta.dirname,"../../../package.json"),e=Or.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var aJ,Sd,yx=h(()=>{"use strict";Mh();j();ie();aJ=iJ(),Sd=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let e;try{({chromium:e}=await import("playwright"))}catch(n){let r=bd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await e.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=bd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${aJ}`}}loadStorageState(e){let n=bm(e);try{if(!Or.existsSync(n))return;let r=JSON.parse(Or.readFileSync(n,"utf8"));return D("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){D("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=bm(e);if(!Or.existsSync(r))return;let o=await n.storageState(),s=wd.join(wd.dirname(r),`.${wd.basename(r)}.${process.pid}.${sJ(4).toString("hex")}.tmp`);Or.writeFileSync(s,JSON.stringify(o),{mode:384}),Or.chmodSync(s,384),Or.renameSync(s,r),D("[browser/vault] saved session",{profile:e,file:r})}catch(r){D("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as cJ}from"node:crypto";function lJ(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function dJ(t,e,n){return`el_${cJ("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function uJ(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function bx(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Sx(t,e){let n=t.role??"",r=t.name??"";wx.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Sx(s,e)}async function pJ(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},kx).catch(()=>[])}async function fJ(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},kx).catch(()=>[])}function mJ(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function kd(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=mJ(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=pJ(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],Sx(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await fJ(t)).filter(M=>wx.has(M.role??"")));let S=new Map;for(let I of p){let M=bx(I.name),H=S.get(M);(!H||H.bbox.w===0&&I.bbox.w>0)&&S.set(M,I)}let v=y.map(I=>({ax:I,dom:S.get(bx(I.name??""))})),_=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);_.sort((I,M)=>{let H=I.dom?.bbox.y??0,P=M.dom?.bbox.y??0;if(H!==P)return H-P;let N=I.dom?.bbox.x??0,F=M.dom?.bbox.x??0;return N-F}),_.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=_.slice(0,n).map((I,M)=>{let H=I.ax.role??"generic",P=I.ax.name??"",N=dJ(H,P,M),F=I.dom?.bbox??{x:0,y:0,w:0,h:0},$=I.dom?.type??null,B=null;I.ax.value!==void 0&&I.ax.value!==null&&(B=String(I.ax.value)),I.ax.checked!==void 0&&(B=String(I.ax.checked)),ox({role:H,kind:$})&&(B="[redacted]");let K={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(K.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(K.selected=I.ax.selected),I.ax.expanded!==void 0&&(K.expanded=I.ax.expanded);let Q;I.dom?.testId?Q=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(Q=`#${I.dom.id}`);let st={id:N,role:H,label:lJ(P),kind:$,value:B,state:K,bbox:F};return Q!==void 0&&(st.selector=Q),st}),x="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?x="loading":I==="interactive"?x="navigating":x="idle"}catch{x="navigating"}x!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=uJ(f),T=`obs_${e.observationCounter.toString(36)}`,E=new Date().toISOString();return{observationId:T,url:m,title:g,textSummary:C,interactive:R,status:{httpStatus:e.httpStatus??null,loadingState:x,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:E}}var wx,kx,vx=h(()=>{"use strict";hd();wx=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kx="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Tx(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Oh(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Tx(t,s)))).filter(o=>o!==null)}async function gJ(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Dh(t,e,n){switch(e.kind){case"element_id":return hJ(t,e,n);case"selector":return yJ(t,e);case"semantic":return bJ(t,e)}}async function hJ(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Oh(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function yJ(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Oh(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function bJ(t,e){return e.role!==void 0?wJ(t,e.text,e.role):SJ(t,e.text,e)}async function wJ(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Oh(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function SJ(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await gJ(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let b=await Tx(y.locator,y.index);if(b!==null){let S=`${b.role}:${b.label}:${g}`,v=0;for(let _=0;_<S.length;_++)v=v*31+S.charCodeAt(_)>>>0;f.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Ex=h(()=>{"use strict"});async function Fh(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ct(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var _x=h(()=>{"use strict";Dn()});var Nh={};Xs(Nh,{PlaywrightProvider:()=>Lh});function Ax(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Lh,$h=h(()=>{"use strict";yx();vx();Ex();Dn();_x();xh();Lh=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Sd(e)}async open(e){let n=Ct(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await Fh(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await kd(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await kd(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await Dh(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${Ax(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){l=y}else l=g}let u=await Fh(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await kd(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await Dh(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${Ax(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Uo(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Uo(n,o,r);return s}catch{return null}}}});var Fr={};Xs(Fr,{__resetBrowserRegistryForTests:()=>AJ,browserProviderActive:()=>TJ,closeBrowserProvider:()=>Bh,getBrowserProvider:()=>vJ,getLastRoutingDecision:()=>_J,peekBrowserProvider:()=>EJ});function xx(){Promise.resolve(Bh()).then(()=>{process.exit(130)})}function Rx(){Promise.resolve(Bh()).then(()=>{process.exit(143)})}function Ix(){Xt=null}function kJ(){vd||(process.on("SIGINT",xx),process.on("SIGTERM",Rx),process.on("exit",Ix),vd=!0)}function Cx(){vd&&(process.removeListener("SIGINT",xx),process.removeListener("SIGTERM",Rx),process.removeListener("exit",Ix),vd=!1)}async function vJ(t){return Xt!==null?Xt:(Dr!==null||(Dr=(async()=>{let e=Th(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await nx({config:e,surface:n});Uh=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(fx(),px)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>($h(),Nh));o=new s(e)}return kJ(),Xt=o,Dr=null,o})()),Dr)}async function Bh(){if(Xt===null)return;let t=Xt;Xt=null,Dr=null,Cx(),await t.shutdown()}function TJ(){return Xt!==null}function EJ(){return Xt}function _J(){return Uh}function AJ(){Xt=null,Dr=null,Uh=null,Cx()}var Xt,Dr,vd,Uh,Lr=h(()=>{"use strict";Dn();rx();L();Xt=null,Dr=null,vd=!1,Uh=null});async function Px(t,e){try{return await WA(t,e)}catch(n){return D("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function MJ(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Lr(),Fr)),r=await n();try{return await r.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:s}=await Promise.resolve().then(()=>($h(),Nh)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(Dn(),Eh)),a=i(),c=new s(a);try{return await c.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}finally{await c.shutdown()}}throw o}}async function Mx(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??MJ,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await On(n,t,{headers:PJ,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(CJ.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(IJ.test(p)&&!RJ.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await Px(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof Ie||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=wh({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await Xi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>Xi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await Xi(u.finalUrl,o);let p=await Px(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=wh({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof Ie)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var RJ,IJ,CJ,PJ,Ox=h(()=>{"use strict";KA();Sh();Mr();ie();RJ=/(text\/html|application\/xhtml\+xml)/i,IJ=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,CJ=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,PJ={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function FJ(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(OJ,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),DJ),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=ee(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function Dx(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?FJ({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function Fx(t,e){if(e.length===0)return`# Search results for "${t}"
323
323
 
324
324
  (no results)`;let n=[`# Search results for "${t}"`,""];return e.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
325
325
  `).trimEnd()}var OJ,DJ,Lx=h(()=>{"use strict";ct();OJ="https://api.exa.ai/search",DJ=10});function Td(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var Nr=h(()=>{"use strict";Mh()});function jJ(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=LJ;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,NJ)}let a=$J;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,UJ)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function jh(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:At(t,e),truncated:!0}}function HJ(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env,r=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{};return async(o,s)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=jJ(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let u=s.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,c=()=>{a.abort(s.reason)},l,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",c,{once:!0}),l=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await Pr(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let g={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await On(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof Ie?{content:`web_scrape blocked: ${g.message}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let m=jh(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await Mx(i.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:i.timeoutMs,signal:a.signal,...t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let f=jh(qA(p.markdown,p.advisory),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof Ie)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=Xe(p)&&!Ph(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${zi()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=Dx({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(i.query,{limit:BJ,timeoutMs:i.timeoutMs,signal:a.signal}),f=jh(Fx(i.query,p),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),s.removeEventListener("abort",c)}}}var LJ,NJ,$J,UJ,BJ,Nx,$x=h(()=>{"use strict";Ox();Lx();Mr();Ht();Sh();Nr();LJ=3e4,NJ=12e4,$J=1e5,UJ=1e6,BJ=10;Nx=HJ()});function qJ(t){return WJ.has(t)?"low":t==="DELETE"?"high":"medium"}function GJ(t){return KJ.has(t)}function JJ(t){let e={};return t.forEach((n,r)=>{let o=r.toLowerCase();zJ.has(o)||XJ.some(s=>o.startsWith(s))||(e[r]=n)}),e}function VJ(t,e){if(t==null)return{serialized:void 0,inferredContentType:void 0};let n=Object.keys(e).some(o=>o.toLowerCase()==="content-type");return typeof t=="string"?{serialized:t,inferredContentType:n?void 0:"text/plain"}:{serialized:JSON.stringify(t),inferredContentType:n?void 0:"application/json"}}function YJ(t,e,n){let r=Buffer.byteLength(t,"utf8"),o=t,s=!1;if(r>n&&(o=At(t,n),s=!0),!s&&/application\/json/i.test(e))try{return{body:JSON.parse(o),truncated:!1}}catch{}return{body:o,truncated:s}}async function jx(t){let{url:e,method:n,signal:r,domainCheck:o,recordEffect:s}=t,i=Math.min(t.maxResponseBytes??Hh,Wh),a={...t.headers},c=t.fetchFn??globalThis.fetch,l=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},d=qJ(n);if(o!==void 0){let T=o(e);if(!T.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${T.reason}`),{name:"DomainPolicyError"})}let u=await Pr(e,l);if(!u.allowed)throw new Ie(u.reason);let{serialized:p,inferredContentType:f}=VJ(t.body,a);f!==void 0&&(a["content-type"]=f);let m={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},y=GJ(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},b=Date.now(),S;try{S=await On(c,e,m,{...l,retry:y})}catch(T){throw T instanceof Ie,T}let v=Date.now()-b,_=S.headers.get("content-type")??"",A;try{let T=S.body?.getReader();if(!T)A="";else{let E=[],I=0,M=i*2;for(;;){let{done:H,value:P}=await T.read();if(H||!P)break;if(E.push(P),I+=P.byteLength,I>=M){await T.cancel();break}}A=new TextDecoder().decode(Buffer.concat(E,I))}}catch{A=""}let{body:R,truncated:x}=YJ(A,_,i),C=JJ(S.headers);return s!==void 0&&Promise.resolve(s({url:e,method:n,status:S.status,risk:d,timing_ms:v})).catch(()=>{}),{status:S.status,headers:C,body:R,truncated:x,timing_ms:v,risk:d}}function Hx(t){if(typeof t!="string"||t.trim().length===0)return{error:"method must be a non-empty string (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)"};let e=t.trim().toUpperCase(),n=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"];return n.includes(e)?e:{error:`method "${t}" is not supported \u2014 must be one of: ${n.join(", ")}`}}var Ux,Bx,Hh,Wh,WJ,KJ,XJ,zJ,Wx=h(()=>{"use strict";Mr();Ht();Ux=3e4,Bx=12e4,Hh=1e5,Wh=1e6,WJ=new Set(["GET","HEAD","OPTIONS"]),KJ=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);XJ=["set-cookie","x-"],zJ=new Set(["server","via","age","vary","authorization","www-authenticate"])});function QJ(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t;if(typeof e.url!="string"||e.url.length===0)return{error:'Invalid input: "url" must be a non-empty string'};let n;try{n=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{error:`Invalid input: protocol "${n.protocol}" not supported (http/https only)`};n.username="",n.password="";let r=n.toString(),o=Hx(e.method);if(typeof o=="object"&&"error"in o)return{error:`Invalid input: ${o.error}`};let s=o,i;if(e.body!==void 0&&e.body!==null){if(typeof e.body!="string"&&typeof e.body!="object")return{error:'Invalid input: "body" must be a string, object, or array'};i=e.body}let a={};if(e.headers!==void 0){if(typeof e.headers!="object"||e.headers===null||Array.isArray(e.headers))return{error:'Invalid input: "headers" must be a string-keyed object'};let u=e.headers;for(let[p,f]of Object.entries(u)){if(typeof f!="string")return{error:`Invalid input: header value for "${p}" must be a string`};a[p]=f}}let c=Ux;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:'Invalid input: "timeout_ms" must be a positive finite number'};c=Math.min(e.timeout_ms,Bx)}let l=Hh;if(e.max_response_bytes!==void 0){if(typeof e.max_response_bytes!="number"||!Number.isFinite(e.max_response_bytes)||e.max_response_bytes<=0)return{error:'Invalid input: "max_response_bytes" must be a positive finite number'};l=Math.min(e.max_response_bytes,Wh)}let d;if(e.credential!==void 0){if(typeof e.credential!="string"||e.credential.length===0)return{error:'Invalid input: "credential" must be a non-empty string (an env var name)'};d=e.credential}return{url:r,method:s,body:i,headers:a,timeoutMs:c,maxResponseBytes:l,credential:d}}function ZJ(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;async function r(){if(t.domainCheck!==void 0)return t.domainCheck;try{let{loadBrowserConfig:o,enforceDomainPolicy:s}=await Promise.resolve().then(()=>(Dn(),Eh)),i=o();return a=>s(a,i)}catch{return}}return async(o,s)=>{if(typeof e!="function")return{content:"web_request unavailable: global fetch() is not present (agent-afk requires Node 20+).",isError:!0};let i=QJ(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let p=s.reason;return{content:`web_request aborted: ${p instanceof Error?p.message:String(p??"aborted")}`,isError:!0}}let a={...i.headers};if(i.credential!==void 0){let p=n[i.credential];if(p===void 0||p.trim().length===0)return{content:`web_request credential error: environment variable "${i.credential}" is not set. Set it in afk.env or export it in the shell before starting AFK.`,isError:!0};if(Object.keys(a).some(m=>m.toLowerCase()==="authorization"))return{content:'web_request credential error: both "credential" and an explicit Authorization header were provided. Use one or the other.',isError:!0};a.Authorization=`Bearer ${p}`}let c=new AbortController,l=()=>c.abort(s.reason),d,u=()=>{let p=c.signal.reason;return p instanceof Error?p.message:String(p??"aborted")};try{s.addEventListener("abort",l,{once:!0}),d=setTimeout(()=>{c.abort(new Error(`web_request timeout after ${i.timeoutMs}ms`))},i.timeoutMs);let p=await r(),f={url:i.url,method:i.method,body:i.body,headers:a,maxResponseBytes:i.maxResponseBytes,signal:c.signal,fetchFn:e,lookupFn:t.lookupFn,domainCheck:p,recordEffect:t.recordEffect},m;try{m=await jx(f)}catch(S){if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};if(S instanceof Ie)return{content:`web_request blocked: ${S.message}`,isError:!0};let v=S instanceof Error&&S.name==="DomainPolicyError"?"blocked":"network error",_=S instanceof Error?S.message:String(S);return{content:`web_request ${v}: ${_}`,isError:!0}}if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};let g=m.body;if(typeof g=="string")g=Ke(g);else if(typeof g=="object"&&g!==null){let S=Ke(JSON.stringify(g));try{g=JSON.parse(S)}catch{g=S}}let y={status:m.status,headers:m.headers,body:g,timing_ms:m.timing_ms,...m.truncated?{truncated:!0}:{}};return{content:JSON.stringify(y,null,2),...m.truncated?{truncated:!0}:{}}}finally{d!==void 0&&clearTimeout(d),s.removeEventListener("abort",l)}}}var Kx,qx=h(()=>{"use strict";Wx();Mr();vn();Kx=ZJ()});import{existsSync as Xx,mkdirSync as eV,readFileSync as tV,renameSync as nV,unlinkSync as rV,writeFileSync as oV}from"node:fs";import{dirname as Gx,join as sV}from"node:path";import{randomBytes as iV}from"node:crypto";function $r(t){let e=t??pm();if(!Xx(e))return[];try{let n=tV(e,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${e}: ${r}`),[]}}function Ji(t,e){let n=e??pm();eV(Gx(n),{recursive:!0});let r=sV(Gx(n),`.schedules.json.${process.pid}.${iV(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{oV(r,o,"utf-8"),nV(r,n)}catch(s){try{Xx(r)&&rV(r)}catch{}throw s}}function zx(t,e){let n=$r(e),r=n.map(c=>c.id),o=aV(t.name),s=cV(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),Ji(n,e),a}function Jx(t,e){let n=$r(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(Ji(o,e),!0)}function Vx(t,e){return $r(e).find(n=>n.id===t)}function aV(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function cV(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}function Yx(t){return{taskId:t.id,command:t.command,trigger:t.trigger??"cron",...t.cron!==void 0?{cronExpression:t.cron}:{},...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{},...t.notifyChat!==void 0?{notifyChat:t.notifyChat}:{}}}var Qx=h(()=>{"use strict";j()});import{existsSync as lV,readFileSync as dV}from"node:fs";import{join as uV}from"node:path";async function Bo(t,e,n){let r,o;try{let s=uV(jk("default"),"port");if(!lV(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=dV(s,"utf-8").trim(),a=pV(i);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let s=r.includes(":")?`[${r}]`:r,i=await fetch(`http://${s}:${o}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return i.ok?{synced:!0,detail:"synced"}:t==="POST"&&i.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&i.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${i.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function pV(t){let e=parseInt(t,10);if(String(e)===t&&!Number.isNaN(e))return e<1||e>65535?null:{host:"localhost",port:e};let n=t.lastIndexOf(":");if(n<1)return null;let r=t.slice(0,n),o=t.slice(n+1);if(!/^\d+$/.test(o))return null;let s=parseInt(o,10);return Number.isNaN(s)||s<1||s>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:s}}var Kh,Zx=h(()=>{"use strict";j();Kh="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as fV}from"node:fs";import{readFile as mV}from"node:fs/promises";var eR,tR,nR,rR,oR=h(()=>{"use strict";Qx();j();Zx();eR=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let s=zx({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),i=s.enabled?await Bo("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await Bo("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:Kh}})}},tR=async(t,e)=>{let n=$r();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},nR=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,s=xc();if(!fV(s))return{content:JSON.stringify([])};let i;try{let l=await mV(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
@@ -1275,7 +1275,7 @@ ${t}`:t}function Yn(t){return Ye(t)?{incomplete:!0,incompleteReason:t}:{}}functi
1275
1275
 
1276
1276
  [Subagent output was ${o} bytes \u2014 truncated to ${r} bytes. Full output could not be written to disk.]`,a=Buffer.byteLength(i,"utf8"),c=Math.max(r-a,Math.floor(r*.5));return{content:At(t,c)+i,capped:!0}}var ID,PD=h(()=>{"use strict";j();Ht();L();ID=32768});function MD(t,e,n){return!e||!n||e===n?t:`[subagent result \xB7 model=${e} (parent: ${n})]
1277
1277
 
1278
- ${t}`}var OD=h(()=>{"use strict"});async function DD(t){let{handle:e,signal:n,prompt:r,backgroundPrompt:o,idPrefix:s,model:i,parentModel:a,childManager:c,identity:l,traceWriter:d,depth:u,parentSessionId:p,registry:f,promotionTriggers:m,activeForegroundHandles:g}=t,y=()=>{e.cancel()};n.addEventListener("abort",y,{once:!0});let b=Date.now(),S=!1,v,_=new Promise(T=>{v=T}),A,R=new Promise(T=>{A=T});m.set(e.id,{fire:v,ready:R}),g.set(e.id,e);let x,C=e.runToResult(r);try{let T=await Promise.race([C.then(P=>({kind:"result",result:P})),_.then(P=>({kind:"promote",queuedNote:P}))]);if(T.kind==="promote")if(f){let P=t.isolationTeardown;try{P&&await Cp(P.repoRoot,P.worktreePath);let N=f.adoptRunning({handle:e,runPromise:C,prompt:o,model:i??"sonnet",provenance:"user",parentSessionId:p,...P?{onCleanup:async()=>{let K=await en(P);D(`background worktree teardown: ${JSON.stringify(K)}`)}}:{}});S=!0,n.removeEventListener("abort",y),A({jobId:N.jobId,label:N.label});let F={status:"running",jobId:N.jobId,subagentId:N.subagentId,label:N.label,message:`Subagent backgrounded by user (jobId=${N.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${N.jobId} remains available for manual replay.`},$=_D(T.queuedNote);return $!==void 0&&await Il(d,{jobId:N.jobId,subagentId:N.subagentId,byteLength:Buffer.byteLength($,"utf8")}),{content:JSON.stringify(F),...$!==void 0?{harnessUserMessage:{kind:"queued_user_message",text:$}}:{}}}catch(N){if(D("subagent-executor: promotion failed, staying foreground: "+(N instanceof Error?N.message:String(N))),P)try{await hD(P.repoRoot,P.worktreePath)}catch(F){D(`[isolation] failed to unlock worktree after promotion failure: ${String(F)}`)}A(null)}}else A(null);let E=T.kind==="result"?T.result:await C;if(E.status==="succeeded"&&E.message){let P=E.message.content,N=typeof P=="string"?P:JSON.stringify(P),F=E.trace;ms({...l,event:"subagent.completed",subagent_id:e.id,parent_session_id:p,status:E.status,duration_ms:Date.now()-b,content_chars:N.length,stop_reason:hn(E.stopReason),depth:u,tool_call_count:F?.toolCalls.length,thinking_present:F?.thinkingPresent,tool_names:F?.toolCalls.length?JSON.stringify([...new Set(F.toolCalls.map(Q=>Q.name))]):void 0});let $=MD(ys(N,E.stopReason),i,a),{content:B,capped:K}=CD($,p,e.id);return x={content:B,...Yn(E.stopReason),...K?{truncated:!0}:{}},x}let I=E.error?.message??"Subagent failed with no output",M=E.trace;ms({...l,event:"subagent.failed",subagent_id:e.id,id_prefix:s,parent_session_id:p,status:E.status,duration_ms:Date.now()-b,error_message:gn(I),schema_error:E.schemaError?gn(E.schemaError.message):void 0,partial_output_chars:Ew(E.partialOutput),stop_reason:hn(E.stopReason),depth:u,tool_call_count:M?.toolCalls.length,thinking_present:M?.thinkingPresent,tool_names:M?.toolCalls.length?JSON.stringify([...new Set(M.toolCalls.map(P=>P.name))]):void 0});let H=J0({status:E.status,errorMessage:I,schemaErrorMessage:E.schemaError?.message,partialOutput:E.partialOutput,subagentId:e.id});return x={content:JSON.stringify(H),isError:!0,...Yn(E.stopReason)},x}catch(T){let E=T instanceof Error?T.message:String(T);throw ms({...l,event:"subagent.failed",subagent_id:e.id,id_prefix:s,parent_session_id:p,status:"failed",duration_ms:Date.now()-b,error_message:gn(E),depth:u}),T}finally{if(m.delete(e.id),g.delete(e.id),A(null),!S){n.removeEventListener("abort",y),await c?.teardownAll(),await e.teardown({deferInjectContextToCaller:!0});let T=e.getLastStopInjectContext?.();if(dp(x,T),t.isolationTeardown){let{repoRoot:E,worktreePath:I}=t.isolationTeardown,M=await Cd({repoRoot:E,worktreePath:I});M.preserved&&D(`[isolation] preserved worktree ${I} (${M.reason?ny(M.reason):"unknown"}) \u2014 locked so the sweep will not reap it; recover via the worktree tool`)}}}}var FD=h(()=>{"use strict";Ae();ie();J();Ep();Zb();AD();PD();Vi();Pp();OD()});function N9(t){return t.isError===!0&&t.incompleteReason===hs}async function LD(t){let e=t.maxRedispatch??F9,n=t.delayMs??L9,r=await t.dispatch(0);for(let o=1;o<=e;o+=1){if(!N9(r)||t.signal.aborted||t.canRedispatch!==void 0&&!t.canRedispatch()||(n>0&&await je(n,t.signal),t.signal.aborted)||t.canRedispatch!==void 0&&!t.canRedispatch())return r;t.onRedispatch?.(o),r=await t.dispatch(o)}return r}var F9,L9,ND=h(()=>{"use strict";$n();Ae();F9=1,L9=1e3});function Mp(t,e){for(let n of e??[])t.push({type:"image",source:{type:"base64",media_type:n.mediaType,data:n.bytes.toString("base64")}})}var Iw=h(()=>{"use strict"});import{readFile as $9,stat as U9}from"node:fs/promises";import{extname as B9,isAbsolute as j9}from"node:path";function UD(){return new Error(`Agent tool image attachments exceed the ${Cw} byte (5 MiB) total limit`)}async function BD(t){if(t.paths.length>$D)throw new Error(`Agent tool supports at most ${$D} image attachments per dispatch`);let e={...t.resolveBase!==void 0?{resolveBase:t.resolveBase}:{},...t.readRoots!==void 0?{readRoots:t.readRoots}:{}},n=[],r=0;for(let o of t.paths){let s;if(!j9(o)&&(s=t.sessionId===void 0?void 0:t.registry?.get(t.sessionId,o),s===void 0)){let u=t.sessionId===void 0?[]:t.registry?.listIds(t.sessionId)??[];throw new Error(`Unknown inbound image id ${JSON.stringify(o)}; available ids for this session: `+(u.length>0?u.join(", "):"(none)"))}let i=s?.path??o,a=s?.mediaType??H9.get(B9(i).toLowerCase());if(a===void 0)throw new Error(`Unsupported image attachment ${JSON.stringify(o)}; expected .jpg, .jpeg, .png, .gif, or .webp`);let c=s===void 0?de(i,e,"read"):i;if(r+(await U9(c)).size>Cw)throw UD();let d=await $9(c);if(r+=d.byteLength,r>Cw)throw UD();n.push({mediaType:a,bytes:d})}return n}var $D,Cw,H9,jD=h(()=>{"use strict";Ee();$D=8,Cw=5*1024*1024,H9=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".gif","image/gif"],[".webp","image/webp"]])});import{createHash as W9}from"node:crypto";import{mkdir as K9,writeFile as q9}from"node:fs/promises";import{join as G9}from"node:path";function J9(t){return W9("sha256").update(t).digest("hex")}function V9(t,e,n){let r=Math.max(1,Math.round(n/1024));return`[image ${t} \xB7 ${e} \xB7 ${r} KB]`}async function HD(t,e,n,r=Zr){for(let o of n){let s=await r.put(e,o.bytes,o.mediaType);t.push({type:"text",text:V9(s.id,s.mediaType,s.sizeBytes)}),Mp(t,[o])}}function Y9(t){switch(t){case"image/jpeg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp"}}var X9,z9,Pw,Zr,Na=h(()=>{"use strict";j();Iw();X9=6,z9=new Map;Pw=class{constructor(e=z9,n=J9){this.entries=e;this.hashBytes=n}entries;hashBytes;get(e,n){return this.entries.get(e)?.get(n)}listIds(e){return[...this.entries.get(e)?.keys()??[]].sort()}clear(e){this.entries.delete(e)}async put(e,n,r){let o=this.hashBytes(n),s=this.entries.get(e)??new Map;this.entries.set(e,s);let i=X9,a=0;for(;;){let c=`img_${o.slice(0,i)}`,l=a===0?c:`${c}_${a}`,d=s.get(l);if(d===void 0){let u=im(e);await K9(u,{recursive:!0});let p=G9(u,`${l}${Y9(r)}`);await q9(p,n);let f={path:p,mediaType:r,sizeBytes:n.byteLength,digest:o};return s.set(l,f),{id:l,...f}}if(d.mediaType===r&&d.digest===o)return{id:l,...d};i<o.length?i=Math.min(o.length,i+2):a+=1}}};Zr=new Pw});function WD(t,e,n,r,o,s){let i="";return e&&!s(t)&&(i+=`WARNING: child model ${t} is not vision-capable; attached images were dropped.
1278
+ ${t}`}var OD=h(()=>{"use strict"});async function DD(t){let{handle:e,signal:n,prompt:r,backgroundPrompt:o,idPrefix:s,model:i,parentModel:a,childManager:c,identity:l,traceWriter:d,depth:u,parentSessionId:p,registry:f,promotionTriggers:m,activeForegroundHandles:g}=t,y=()=>{e.cancel()};n.addEventListener("abort",y,{once:!0});let b=Date.now(),S=!1,v,_=new Promise(T=>{v=T}),A,R=new Promise(T=>{A=T});m.set(e.id,{fire:v,ready:R}),g.set(e.id,e);let x,C=e.runToResult(r);try{let T=await Promise.race([C.then(P=>({kind:"result",result:P})),_.then(P=>({kind:"promote",queuedNote:P}))]);if(T.kind==="promote")if(f){let P=t.isolationTeardown;try{P&&await Cp(P.repoRoot,P.worktreePath);let N=f.adoptRunning({handle:e,runPromise:C,prompt:o,model:i??"sonnet",provenance:"user",parentSessionId:p,...P?{onCleanup:async()=>{let K=await en(P);D(`background worktree teardown: ${JSON.stringify(K)}`)}}:{}});S=!0,n.removeEventListener("abort",y),A({jobId:N.jobId,label:N.label,sharesWorktree:!P});let F={status:"running",jobId:N.jobId,subagentId:N.subagentId,label:N.label,message:`Subagent backgrounded by user (jobId=${N.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${N.jobId} remains available for manual replay.`},$=_D(T.queuedNote);return $!==void 0&&await Il(d,{jobId:N.jobId,subagentId:N.subagentId,byteLength:Buffer.byteLength($,"utf8")}),{content:JSON.stringify(F),...$!==void 0?{harnessUserMessage:{kind:"queued_user_message",text:$}}:{}}}catch(N){if(D("subagent-executor: promotion failed, staying foreground: "+(N instanceof Error?N.message:String(N))),P)try{await hD(P.repoRoot,P.worktreePath)}catch(F){D(`[isolation] failed to unlock worktree after promotion failure: ${String(F)}`)}A(null)}}else A(null);let E=T.kind==="result"?T.result:await C;if(E.status==="succeeded"&&E.message){let P=E.message.content,N=typeof P=="string"?P:JSON.stringify(P),F=E.trace;ms({...l,event:"subagent.completed",subagent_id:e.id,parent_session_id:p,status:E.status,duration_ms:Date.now()-b,content_chars:N.length,stop_reason:hn(E.stopReason),depth:u,tool_call_count:F?.toolCalls.length,thinking_present:F?.thinkingPresent,tool_names:F?.toolCalls.length?JSON.stringify([...new Set(F.toolCalls.map(Q=>Q.name))]):void 0});let $=MD(ys(N,E.stopReason),i,a),{content:B,capped:K}=CD($,p,e.id);return x={content:B,...Yn(E.stopReason),...K?{truncated:!0}:{}},x}let I=E.error?.message??"Subagent failed with no output",M=E.trace;ms({...l,event:"subagent.failed",subagent_id:e.id,id_prefix:s,parent_session_id:p,status:E.status,duration_ms:Date.now()-b,error_message:gn(I),schema_error:E.schemaError?gn(E.schemaError.message):void 0,partial_output_chars:Ew(E.partialOutput),stop_reason:hn(E.stopReason),depth:u,tool_call_count:M?.toolCalls.length,thinking_present:M?.thinkingPresent,tool_names:M?.toolCalls.length?JSON.stringify([...new Set(M.toolCalls.map(P=>P.name))]):void 0});let H=J0({status:E.status,errorMessage:I,schemaErrorMessage:E.schemaError?.message,partialOutput:E.partialOutput,subagentId:e.id});return x={content:JSON.stringify(H),isError:!0,...Yn(E.stopReason)},x}catch(T){let E=T instanceof Error?T.message:String(T);throw ms({...l,event:"subagent.failed",subagent_id:e.id,id_prefix:s,parent_session_id:p,status:"failed",duration_ms:Date.now()-b,error_message:gn(E),depth:u}),T}finally{if(m.delete(e.id),g.delete(e.id),A(null),!S){n.removeEventListener("abort",y),await c?.teardownAll(),await e.teardown({deferInjectContextToCaller:!0});let T=e.getLastStopInjectContext?.();if(dp(x,T),t.isolationTeardown){let{repoRoot:E,worktreePath:I}=t.isolationTeardown,M=await Cd({repoRoot:E,worktreePath:I});M.preserved&&D(`[isolation] preserved worktree ${I} (${M.reason?ny(M.reason):"unknown"}) \u2014 locked so the sweep will not reap it; recover via the worktree tool`)}}}}var FD=h(()=>{"use strict";Ae();ie();J();Ep();Zb();AD();PD();Vi();Pp();OD()});function N9(t){return t.isError===!0&&t.incompleteReason===hs}async function LD(t){let e=t.maxRedispatch??F9,n=t.delayMs??L9,r=await t.dispatch(0);for(let o=1;o<=e;o+=1){if(!N9(r)||t.signal.aborted||t.canRedispatch!==void 0&&!t.canRedispatch()||(n>0&&await je(n,t.signal),t.signal.aborted)||t.canRedispatch!==void 0&&!t.canRedispatch())return r;t.onRedispatch?.(o),r=await t.dispatch(o)}return r}var F9,L9,ND=h(()=>{"use strict";$n();Ae();F9=1,L9=1e3});function Mp(t,e){for(let n of e??[])t.push({type:"image",source:{type:"base64",media_type:n.mediaType,data:n.bytes.toString("base64")}})}var Iw=h(()=>{"use strict"});import{readFile as $9,stat as U9}from"node:fs/promises";import{extname as B9,isAbsolute as j9}from"node:path";function UD(){return new Error(`Agent tool image attachments exceed the ${Cw} byte (5 MiB) total limit`)}async function BD(t){if(t.paths.length>$D)throw new Error(`Agent tool supports at most ${$D} image attachments per dispatch`);let e={...t.resolveBase!==void 0?{resolveBase:t.resolveBase}:{},...t.readRoots!==void 0?{readRoots:t.readRoots}:{}},n=[],r=0;for(let o of t.paths){let s;if(!j9(o)&&(s=t.sessionId===void 0?void 0:t.registry?.get(t.sessionId,o),s===void 0)){let u=t.sessionId===void 0?[]:t.registry?.listIds(t.sessionId)??[];throw new Error(`Unknown inbound image id ${JSON.stringify(o)}; available ids for this session: `+(u.length>0?u.join(", "):"(none)"))}let i=s?.path??o,a=s?.mediaType??H9.get(B9(i).toLowerCase());if(a===void 0)throw new Error(`Unsupported image attachment ${JSON.stringify(o)}; expected .jpg, .jpeg, .png, .gif, or .webp`);let c=s===void 0?de(i,e,"read"):i;if(r+(await U9(c)).size>Cw)throw UD();let d=await $9(c);if(r+=d.byteLength,r>Cw)throw UD();n.push({mediaType:a,bytes:d})}return n}var $D,Cw,H9,jD=h(()=>{"use strict";Ee();$D=8,Cw=5*1024*1024,H9=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".gif","image/gif"],[".webp","image/webp"]])});import{createHash as W9}from"node:crypto";import{mkdir as K9,writeFile as q9}from"node:fs/promises";import{join as G9}from"node:path";function J9(t){return W9("sha256").update(t).digest("hex")}function V9(t,e,n){let r=Math.max(1,Math.round(n/1024));return`[image ${t} \xB7 ${e} \xB7 ${r} KB]`}async function HD(t,e,n,r=Zr){for(let o of n){let s=await r.put(e,o.bytes,o.mediaType);t.push({type:"text",text:V9(s.id,s.mediaType,s.sizeBytes)}),Mp(t,[o])}}function Y9(t){switch(t){case"image/jpeg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp"}}var X9,z9,Pw,Zr,Na=h(()=>{"use strict";j();Iw();X9=6,z9=new Map;Pw=class{constructor(e=z9,n=J9){this.entries=e;this.hashBytes=n}entries;hashBytes;get(e,n){return this.entries.get(e)?.get(n)}listIds(e){return[...this.entries.get(e)?.keys()??[]].sort()}clear(e){this.entries.delete(e)}async put(e,n,r){let o=this.hashBytes(n),s=this.entries.get(e)??new Map;this.entries.set(e,s);let i=X9,a=0;for(;;){let c=`img_${o.slice(0,i)}`,l=a===0?c:`${c}_${a}`,d=s.get(l);if(d===void 0){let u=im(e);await K9(u,{recursive:!0});let p=G9(u,`${l}${Y9(r)}`);await q9(p,n);let f={path:p,mediaType:r,sizeBytes:n.byteLength,digest:o};return s.set(l,f),{id:l,...f}}if(d.mediaType===r&&d.digest===o)return{id:l,...d};i<o.length?i=Math.min(o.length,i+2):a+=1}}};Zr=new Pw});function WD(t,e,n,r,o,s){let i="";return e&&!s(t)&&(i+=`WARNING: child model ${t} is not vision-capable; attached images were dropped.
1279
1279
 
1280
1280
  `),!o&&n!==void 0&&Q9.test(r)&&(i+=`WARNING: ${n} is read-only \u2014 write instructions were ignored. Findings are in the message below, not a file. Use a general-purpose agent when the task requires file output.
1281
1281
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "5.191.3",
3
+ "version": "5.191.4",
4
4
  "description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
5
5
  "main": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",