agent-afk 5.209.4 → 5.209.5

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/cli.mjs CHANGED
@@ -436,7 +436,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
436
436
 
437
437
  ${t}`}var CEe,WP=y(()=>{"use strict";CEe=new Set(["script","style","noscript","template","svg"])});function IEe(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function AG(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function MEe(e,t){let n=e.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,t)}async function CG(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??IEe,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!PEe.has(d.status)||u===o)return d;let p=MEe(d,s)??AG(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=AG(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var PEe,_G=y(()=>{"use strict";fe();PEe=new Set([429,502,503,504])});import{BlockList as OEe,isIP as GP}from"node:net";import{lookup as $Ee}from"node:dns/promises";import{Agent as DEe}from"undici";function IG(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function BEe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function KP(e){let t=GP(e);return t===0?!1:NEe.check(e,t===4?"ipv4":"ipv6")}async function MG(e){return $Ee(e,{all:!0,verbatim:!0})}async function Xa(e,t={}){if(t.allowPrivateHosts??IG())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" 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=BEe(n.hostname),o=(a,l)=>`refusing to fetch ${l} \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(GP(r)!==0)return KP(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??MG,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(KP(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function $f(e,t={}){let n=await Xa(e,t);if(!n.allowed)throw new en(n.reason)}async function os(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=PG;s++){await $f(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??IG())?{dispatcher:UEe}:{}},l=await CG(e,i,a,r.retry??{});if(!jEe.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new en(`too many redirects (>${PG}) starting from ${t}`)}var LEe,FEe,NEe,en,UEe,PG,jEe,Qa=y(()=>{"use strict";F();_G();LEe=[["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]],FEe=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],NEe=(()=>{let e=new OEe;for(let[t,n]of LEe)e.addSubnet(t,n,"ipv4");for(let[t,n]of FEe)e.addSubnet(t,n,"ipv6");return e})(),en=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};UEe=new DEe({connect:{lookup(e,t,n){MG(e).then(r=>{let o=r.find(s=>KP(s.address));if(o!==void 0){n(new en(`refusing to connect to ${e} (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 i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,GP(i.address))},r=>n(r,"",0))}}});PG=20,jEe=new Set([301,302,303,307,308])});var zP={};lt(zP,{enforceDomainPolicy:()=>Fr,loadBrowserConfig:()=>qP});import{readFileSync as HEe}from"node:fs";import{join as WEe}from"path";function KEe(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function OG(e,t){return KEe(t).test(e)}function zEe(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(GEe.has(t))return!0;if(qEe.has(t))return!1}return!1}function $G(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function VEe(e){if(e===void 0||e==="")return"auto";if(e==="playwright"||e==="agent-browser"||e==="auto")return e;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${e}`)}function DG(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Bc(t),t}function JEe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function YEe(e){try{return HEe(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function XEe(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright"||t.backend==="agent-browser"||t.backend==="auto")n.backend=t.backend;else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=DG(t.defaultProfile)),n}function qP(e){let t=e?.env??k,n=e?.readFileSync??YEe,r=e?.surface??t.AGENT_SURFACE,o=zEe(t.AFK_BROWSER_HEADLESS,r),i=$G(t.AFK_BROWSER_ALLOWED_DOMAINS),s=$G(t.AFK_BROWSER_BLOCKED_DOMAINS),a=JEe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=VEe(t.AFK_BROWSER_BACKEND),c=DG(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():WEe(vn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=XEe(u,g);return h.configPath=p,h}function Fr(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(OG(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>OG(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var GEe,qEe,is=y(()=>{"use strict";F();U();GEe=new Set(["daemon","subagent","telegram","afk"]),qEe=new Set(["repl","interactive","cli"])});import{readFileSync as QEe}from"node:fs";import{join as ZEe}from"node:path";import{homedir as exe}from"node:os";function nxe(e){let t=e??txe,n;try{n=QEe(t,"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 i;try{i=new URL(o.url)}catch{return null}let{hostname:s,protocol:a}=i;if(!(s==="127.0.0.1"||s==="localhost"||s==="::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 rxe(e){try{return process.kill(e,0),!0}catch{return!1}}async function oxe(e,t,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),i=await fetch(`${e}/health`,{method:"GET",headers:{Authorization:`Bearer ${t}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),i.ok}catch{return!1}}async function VP(e){let t=nxe(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:rxe(t.pid)?await oxe(t.url,t.token)?{available:!0,connection:t,reason:null}:{available:!1,connection:t,reason:`health probe failed at ${t.url}`}:{available:!1,connection:t,reason:`stale connection file: PID ${t.pid} not alive`}}var txe,LG=y(()=>{"use strict";txe=ZEe(exe(),".config","agent-browser","connection.json")});async function FG(e){let{config:t,surface:n}=e;if(t.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(t.backend==="agent-browser"){let s=Date.now(),a=await VP(),l=Date.now()-s;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:l,availability:a}}if(n&&ixe.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(t.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await VP(),i=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:i,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:i,availability:o}}var ixe,NG=y(()=>{"use strict";LG();ixe=new Set(["daemon","subagent"])});import{createHash as sxe}from"crypto";function BG(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&axe.test(e.label))}function UG(e){return sxe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function jG(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var axe,oS=y(()=>{"use strict";axe=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as lxe}from"crypto";import{mkdir as cxe,stat as uxe,writeFile as dxe}from"fs/promises";import{join as JP}from"path";import{gzip as pxe}from"zlib";import{promisify as mxe}from"util";function fxe(e){return JP(Xt(e),"browser")}function gxe(e){return JP(fxe(e),"screenshots")}function hxe(){return new Date().toISOString().replace(/[:.]/g,"-")}function yxe(){return lxe(3).toString("hex")}async function Pu(e,t,n){if(t.length>HG)throw new Error(`writeScreenshotSidecar: buffer exceeds ${HG} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=gxe(e);await cxe(r,{recursive:!0});let o=`${hxe()}-${yxe()}-${n}.png`,i=JP(r,o);await dxe(i,t);let{size:s}=await uxe(i);return{path:i,bytes:s}}var Nct,HG,YP=y(()=>{"use strict";U();oS();Nct=mxe(pxe);HG=5*1024*1024});var iS,WG=y(()=>{"use strict";fe();iS=class{baseUrl;token;constructor(t){this.baseUrl=t.url,this.token=t.token}async call(t,n,r=3e4){let o={version:1,method:t,params:n},i=new AbortController,s=setTimeout(()=>i.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:i.signal});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Agent Browser ${t} failed (HTTP ${a.status}): ${c}`)}let l=await a.json();if(l.ok===!1){let c=l.error,u=c?.code??"UNKNOWN",d=c?.message??JSON.stringify(l);throw new Error(`Agent Browser ${t} failed: [${String(u)}] ${String(d)}`)}return l.result}finally{clearTimeout(s)}}async listTabs(){return this.call("tabs.list",null)}async openTab(t){return{tabId:(await this.call("tabs.open",{url:t},6e4)).id}}async closeTab(t){await this.call("page.eval",{id:t,script:"window.close()"}).catch(n=>{B("[browser/agent-browser] closeTab window.close() failed (tab leak expected)",{tabId:t,err:n})})}async read(t,n){return this.call("page.read",{id:t,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(t,n){return this.call("page.inspect",{id:t,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(t,n){await this.call("page.click",{id:t,elementId:n})}async fill(t,n,r){await this.call("page.fill",{id:t,elementId:n,value:r})}async press(t,n,r){await this.call("page.press",{id:t,key:n,...r?{elementId:r}:{}})}async select(t,n,r){await this.call("page.select",{id:t,elementId:n,value:r})}async waitFor(t,n,r){await this.call("page.wait",{id:t,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(t,n){return this.call("page.eval",{id:t,script:n})}async screenshot(t){return this.call("page.screenshot",{id:t})}}});function XP(e){return{id:e.id,role:e.role,label:e.label,kind:e.kind,value:e.value,state:{disabled:e.disabled,...e.checked!==void 0?{checked:e.checked}:{},...e.selected!==void 0?{selected:e.selected}:{},...e.expanded!==void 0?{expanded:e.expanded}:{}},bbox:e.bbox,...e.selector?{selector:e.selector}:{}}}function KG(e,t){switch(t.kind){case"element_id":if(e.has(t.elementId))return t.elementId;throw new Error(`Element ${t.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function QP(e,t,n,r,o,i){switch(n){case"click":await e.click(t,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await e.fill(t,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await e.press(t,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await e.select(t,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 s=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await e.evalScript(t,`document.querySelector('[data-element-id="${s}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await e.waitFor(t,"element",{value:r,timeout:i??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function GG(e,t){if(t.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await e.client.inspect(e.tabId,{mode:"interactive",query:t.target.text,limit:10}),r=n;if(t.target.role){let l=t.target.role.toLowerCase();r=n.filter(c=>c.role.toLowerCase()===l)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${t.target.text}"`+(t.target.role?`, role="${t.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:t.target.text,...t.target.role?{role:t.target.role}:{}},candidates:r.slice(0,5).map(XP)};let i=r[0].id;await QP(e.client,e.tabId,t.action,i,t.value,t.timeoutMs);let s=await e.client.read(e.tabId,{mode:"main"}),a=Fr(s.url,e.config);return a.allowed?{elementId:i}:{outcome:"blocked_by_policy",url:s.url,reason:`action navigated to blocked domain: ${a.reason}`}}var qG=y(()=>{"use strict";is()});var zG={};lt(zG,{AgentBrowserProvider:()=>ZP});var ZP,VG=y(()=>{"use strict";is();YP();WG();qG();ZP=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new iS(n)}async open(t){let n=Fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let r=this.sessions.get(t.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(t.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:t.timeoutMs??3e4});else{let{tabId:s}=await this.client.openTab(t.url);await this.client.waitFor(s,"load",{timeout:t.timeoutMs??3e4}),r={tabId:s,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(t.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),i=Fr(o.url,this.config);return i.allowed?this.buildObservation(r,t.sessionId,t.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: ${i.reason}`})}async observe(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);return this.buildObservation(n,t.sessionId,t.screenshot,t.maxElements,"browser_observe")}async act(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);let r=KG(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await GG({client:this.client,config:this.config,tabId:n.tabId},t);return"outcome"in s?s:(n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"))}throw t.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(t.target)}`)}await QP(this.client,n.tabId,t.action,r,t.value,t.timeoutMs),n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),i=Fr(o.url,this.config);return i.allowed?this.buildObservation(n,t.sessionId,t.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: ${i.reason}`})}async render(t){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);if(t.target!==void 0||t.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"),i=o.length>=24?o.readUInt32BE(16):0,s=o.length>=24?o.readUInt32BE(20):0;return{path:(await Pu(t.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:i,height:s,dataBase64:r.data,mediaType:"image/png"}}async extract(t){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(t){let n=this.sessions.get(t.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(t.sessionId)}}describe(t){let n=this.sessions.get(t);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let t=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(t),this.sessions.clear()}async buildObservation(t,n,r,o,i="browser_open"){let[s,a]=await Promise.all([this.client.read(t.tabId,{mode:"main",budget:4e3}),this.client.inspect(t.tabId,{mode:"interactive",limit:o??80})]),l=a.elements.map(XP),c=o??80,u=l.slice(0,c);t.observationCounter+=1,t.knownElements=new Map(u.map(h=>[h.id,h])),t.currentUrl=s.url,t.currentTitle=s.title;let d=[];l.length>c&&d.push(`page has ${l.length} interactive elements; showing first ${c}`);let p=null;if(r)try{let h=await this.client.screenshot(t.tabId),b=Buffer.from(h.data,"base64");p=(await Pu(n,b,i)).path}catch{d.push("screenshot capture failed")}let f=`obs_${t.observationCounter.toString(36)}`,g={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:s.url,title:s.title,textSummary:s.content.slice(0,4e3),interactive:u,status:g,warnings:d,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as bxe,readFileSync as wxe}from"node:fs";import{createRequire as Sxe}from"node:module";import{dirname as vxe,join as kxe}from"node:path";function XG(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Exe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function An(e){let t=XG(e);return YG.some(n=>t.includes(n))}function xxe(){try{let t=Sxe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(wxe(t,"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 i=kxe(vxe(t),o);return bxe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Df(){return JG??=xxe()??Txe,JG}function eI(e){return e.includes("install chromium")}function lr(e,t){let n=XG(e),r=t?.latched===!0?` ${Rxe}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.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: ${Df()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Df()}). Or pick a different tool.${r}`}function Iu(e,t,n=!1){if(!An(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
438
438
 
439
- ${lr(e,{headless:t,latched:n})}`,{cause:e})}var YG,Txe,Exe,JG,Rxe,sS=y(()=>{"use strict";YG=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Txe="pnpm exec playwright install chromium",Exe=4;Rxe="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 Za from"node:fs";import aS from"node:path";import{randomBytes as Axe}from"node:crypto";function Cxe(){try{return"5.209.4"}catch{}try{let e=aS.resolve(import.meta.dirname,"../../../package.json"),t=Za.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var _xe,lS,QG=y(()=>{"use strict";sS();U();fe();_xe=Cxe(),lS=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}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 t;try{({chromium:t}=await import("playwright"))}catch(n){let r=Iu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Iu(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(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{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",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);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(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),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 t=[...this.sessions.keys()];if(await Promise.all(t.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/${_xe}`}}loadStorageState(t){let n=Uc(t);try{if(!Za.existsSync(n))return;let r=JSON.parse(Za.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Uc(t);if(!Za.existsSync(r))return;let o=await n.storageState(),i=aS.join(aS.dirname(r),`.${aS.basename(r)}.${process.pid}.${Axe(4).toString("hex")}.tmp`);Za.writeFileSync(i,JSON.stringify(o),{mode:384}),Za.chmodSync(i,384),Za.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Pxe}from"node:crypto";function Ixe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Mxe(e,t,n){return`el_${Pxe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Oxe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function ZG(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function t2(e,t){let n=e.role??"",r=e.name??"";e2.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])t2(i,t)}async function $xe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},n2).catch(()=>[])}async function Dxe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},n2).catch(()=>[])}function Lxe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function cS(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Lxe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=$xe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],t2(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await Dxe(e)).filter(M=>e2.has(M.role??"")));let S=new Map;for(let _ of p){let M=ZG(_.name),N=S.get(M);(!N||N.bbox.w===0&&_.bbox.w>0)&&S.set(M,_)}let v=b.map(_=>({ax:_,dom:S.get(ZG(_.name??""))})),E=r?v:v.filter(_=>_.dom?_.dom.bbox.w>0||_.dom.bbox.h>0:!0);E.sort((_,M)=>{let N=_.dom?.bbox.y??0,O=M.dom?.bbox.y??0;if(N!==O)return N-O;let j=_.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((_,M)=>{let N=_.ax.role??"generic",O=_.ax.name??"",j=Mxe(N,O,M),q=_.dom?.bbox??{x:0,y:0,w:0,h:0},H=_.dom?.type??null,W=null;_.ax.value!==void 0&&_.ax.value!==null&&(W=String(_.ax.value)),_.ax.checked!==void 0&&(W=String(_.ax.checked)),BG({role:N,kind:H})&&(W="[redacted]");let X={disabled:_.ax.disabled??!1};_.ax.checked!==void 0&&(X.checked=_.ax.checked===!0||_.ax.checked==="mixed"),_.ax.selected!==void 0&&(X.selected=_.ax.selected),_.ax.expanded!==void 0&&(X.expanded=_.ax.expanded);let D;_.dom?.testId?D=`[data-testid="${_.dom.testId}"]`:_.dom?.id&&(D=`#${_.dom.id}`);let G={id:j,role:N,label:Ixe(O),kind:H,value:W,state:X,bbox:q};return D!==void 0&&(G.selector=D),G}),C="idle";try{let _=await e.evaluate(()=>document.readyState);_==="loading"?C="loading":_==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let I=Oxe(f),A=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:I,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var e2,n2,r2=y(()=>{"use strict";oS();e2=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);n2="a[href], button, input, select, textarea, [role], [tabindex], label"});async function o2(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>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 tI(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>o2(e,i)))).filter(o=>o!==null)}async function Fxe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function nI(e,t,n){switch(t.kind){case"element_id":return Nxe(e,t,n);case"selector":return Bxe(e,t);case"semantic":return Uxe(e,t)}}async function Nxe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await tI(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Bxe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await tI(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Uxe(e,t){return t.role!==void 0?jxe(e,t.text,t.role):Hxe(e,t.text,t)}async function jxe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await tI(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Hxe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Fxe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await o2(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var i2=y(()=>{"use strict"});async function rI(e,t,n,r){let o=e.url();if(o===n)return null;let i=Fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var s2=y(()=>{"use strict";is()});var iI={};lt(iI,{PlaywrightProvider:()=>oI});function a2(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var oI,sI=y(()=>{"use strict";QG();r2();i2();is();s2();YP();oI=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new lS(t)}async open(t){let n=Fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await rI(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await cS(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await cS(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,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),i=r.url(),s=t.timeoutMs??3e4,a=await nI(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${a2(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await rI(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await cS(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,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),i;if(t.target!==void 0){let u=await nI(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${a2(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Pu(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);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(t){let n=this.sessions.get(t);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(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Pu(n,o,r);return i}catch{return null}}}});var tl={};lt(tl,{__resetBrowserRegistryForTests:()=>Vxe,browserProviderActive:()=>Gxe,closeBrowserProvider:()=>lI,getBrowserProvider:()=>Kxe,getLastRoutingDecision:()=>zxe,peekBrowserProvider:()=>qxe});function l2(){Promise.resolve(lI()).then(()=>{process.exit(130)})}function c2(){Promise.resolve(lI()).then(()=>{process.exit(143)})}function u2(){Ao=null}function Wxe(){uS||(process.on("SIGINT",l2),process.on("SIGTERM",c2),process.on("exit",u2),uS=!0)}function d2(){uS&&(process.removeListener("SIGINT",l2),process.removeListener("SIGTERM",c2),process.removeListener("exit",u2),uS=!1)}async function Kxe(e){return Ao!==null?Ao:(el!==null||(el=(async()=>{let t=qP(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await FG({config:t,surface:n});aI=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(VG(),zG)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sI(),iI));o=new i(t)}return Wxe(),Ao=o,el=null,o})()),el)}async function lI(){if(Ao===null)return;let e=Ao;Ao=null,el=null,d2(),await e.shutdown()}function Gxe(){return Ao!==null}function qxe(){return Ao}function zxe(){return aI}function Vxe(){Ao=null,el=null,aI=null,d2()}var Ao,el,uS,aI,nl=y(()=>{"use strict";is();NG();F();Ao=null,el=null,uS=!1,aI=null});async function p2(e,t){try{return await EG(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function eRe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(nl(),tl)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sI(),iI)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(is(),zP)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function m2(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??eRe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await os(n,e,{headers:Zxe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Qxe.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 d.text();if(Xxe.test(p)&&!Yxe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await p2(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof en||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=HP({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await $f(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>$f(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await $f(d.finalUrl,o);let p=await p2(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=HP({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof en)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Yxe,Xxe,Qxe,Zxe,f2=y(()=>{"use strict";xG();WP();Qa();fe();Yxe=/(text\/html|application\/xhtml\+xml)/i,Xxe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Qxe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Zxe={"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 rRe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(tRe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),nRe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function g2(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?rRe({apiKey:e.exaApiKey,fetchFn:e.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 h2(e,t){if(t.length===0)return`# Search results for "${e}"
439
+ ${lr(e,{headless:t,latched:n})}`,{cause:e})}var YG,Txe,Exe,JG,Rxe,sS=y(()=>{"use strict";YG=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Txe="pnpm exec playwright install chromium",Exe=4;Rxe="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 Za from"node:fs";import aS from"node:path";import{randomBytes as Axe}from"node:crypto";function Cxe(){try{return"5.209.5"}catch{}try{let e=aS.resolve(import.meta.dirname,"../../../package.json"),t=Za.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var _xe,lS,QG=y(()=>{"use strict";sS();U();fe();_xe=Cxe(),lS=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}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 t;try{({chromium:t}=await import("playwright"))}catch(n){let r=Iu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Iu(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(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{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",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);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(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),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 t=[...this.sessions.keys()];if(await Promise.all(t.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/${_xe}`}}loadStorageState(t){let n=Uc(t);try{if(!Za.existsSync(n))return;let r=JSON.parse(Za.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Uc(t);if(!Za.existsSync(r))return;let o=await n.storageState(),i=aS.join(aS.dirname(r),`.${aS.basename(r)}.${process.pid}.${Axe(4).toString("hex")}.tmp`);Za.writeFileSync(i,JSON.stringify(o),{mode:384}),Za.chmodSync(i,384),Za.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Pxe}from"node:crypto";function Ixe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Mxe(e,t,n){return`el_${Pxe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Oxe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function ZG(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function t2(e,t){let n=e.role??"",r=e.name??"";e2.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])t2(i,t)}async function $xe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},n2).catch(()=>[])}async function Dxe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},n2).catch(()=>[])}function Lxe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function cS(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Lxe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=$xe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],t2(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await Dxe(e)).filter(M=>e2.has(M.role??"")));let S=new Map;for(let _ of p){let M=ZG(_.name),N=S.get(M);(!N||N.bbox.w===0&&_.bbox.w>0)&&S.set(M,_)}let v=b.map(_=>({ax:_,dom:S.get(ZG(_.name??""))})),E=r?v:v.filter(_=>_.dom?_.dom.bbox.w>0||_.dom.bbox.h>0:!0);E.sort((_,M)=>{let N=_.dom?.bbox.y??0,O=M.dom?.bbox.y??0;if(N!==O)return N-O;let j=_.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((_,M)=>{let N=_.ax.role??"generic",O=_.ax.name??"",j=Mxe(N,O,M),q=_.dom?.bbox??{x:0,y:0,w:0,h:0},H=_.dom?.type??null,W=null;_.ax.value!==void 0&&_.ax.value!==null&&(W=String(_.ax.value)),_.ax.checked!==void 0&&(W=String(_.ax.checked)),BG({role:N,kind:H})&&(W="[redacted]");let X={disabled:_.ax.disabled??!1};_.ax.checked!==void 0&&(X.checked=_.ax.checked===!0||_.ax.checked==="mixed"),_.ax.selected!==void 0&&(X.selected=_.ax.selected),_.ax.expanded!==void 0&&(X.expanded=_.ax.expanded);let D;_.dom?.testId?D=`[data-testid="${_.dom.testId}"]`:_.dom?.id&&(D=`#${_.dom.id}`);let G={id:j,role:N,label:Ixe(O),kind:H,value:W,state:X,bbox:q};return D!==void 0&&(G.selector=D),G}),C="idle";try{let _=await e.evaluate(()=>document.readyState);_==="loading"?C="loading":_==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let I=Oxe(f),A=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:I,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var e2,n2,r2=y(()=>{"use strict";oS();e2=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);n2="a[href], button, input, select, textarea, [role], [tabindex], label"});async function o2(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>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 tI(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>o2(e,i)))).filter(o=>o!==null)}async function Fxe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function nI(e,t,n){switch(t.kind){case"element_id":return Nxe(e,t,n);case"selector":return Bxe(e,t);case"semantic":return Uxe(e,t)}}async function Nxe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await tI(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Bxe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await tI(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Uxe(e,t){return t.role!==void 0?jxe(e,t.text,t.role):Hxe(e,t.text,t)}async function jxe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await tI(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Hxe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Fxe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await o2(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var i2=y(()=>{"use strict"});async function rI(e,t,n,r){let o=e.url();if(o===n)return null;let i=Fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var s2=y(()=>{"use strict";is()});var iI={};lt(iI,{PlaywrightProvider:()=>oI});function a2(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var oI,sI=y(()=>{"use strict";QG();r2();i2();is();s2();YP();oI=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new lS(t)}async open(t){let n=Fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await rI(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await cS(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await cS(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,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),i=r.url(),s=t.timeoutMs??3e4,a=await nI(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${a2(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await rI(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await cS(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,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),i;if(t.target!==void 0){let u=await nI(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${a2(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Pu(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);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(t){let n=this.sessions.get(t);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(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Pu(n,o,r);return i}catch{return null}}}});var tl={};lt(tl,{__resetBrowserRegistryForTests:()=>Vxe,browserProviderActive:()=>Gxe,closeBrowserProvider:()=>lI,getBrowserProvider:()=>Kxe,getLastRoutingDecision:()=>zxe,peekBrowserProvider:()=>qxe});function l2(){Promise.resolve(lI()).then(()=>{process.exit(130)})}function c2(){Promise.resolve(lI()).then(()=>{process.exit(143)})}function u2(){Ao=null}function Wxe(){uS||(process.on("SIGINT",l2),process.on("SIGTERM",c2),process.on("exit",u2),uS=!0)}function d2(){uS&&(process.removeListener("SIGINT",l2),process.removeListener("SIGTERM",c2),process.removeListener("exit",u2),uS=!1)}async function Kxe(e){return Ao!==null?Ao:(el!==null||(el=(async()=>{let t=qP(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await FG({config:t,surface:n});aI=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(VG(),zG)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sI(),iI));o=new i(t)}return Wxe(),Ao=o,el=null,o})()),el)}async function lI(){if(Ao===null)return;let e=Ao;Ao=null,el=null,d2(),await e.shutdown()}function Gxe(){return Ao!==null}function qxe(){return Ao}function zxe(){return aI}function Vxe(){Ao=null,el=null,aI=null,d2()}var Ao,el,uS,aI,nl=y(()=>{"use strict";is();NG();F();Ao=null,el=null,uS=!1,aI=null});async function p2(e,t){try{return await EG(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function eRe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(nl(),tl)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sI(),iI)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(is(),zP)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function m2(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??eRe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await os(n,e,{headers:Zxe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Qxe.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 d.text();if(Xxe.test(p)&&!Yxe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await p2(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof en||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=HP({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await $f(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>$f(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await $f(d.finalUrl,o);let p=await p2(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=HP({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof en)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Yxe,Xxe,Qxe,Zxe,f2=y(()=>{"use strict";xG();WP();Qa();fe();Yxe=/(text\/html|application\/xhtml\+xml)/i,Xxe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Qxe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Zxe={"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 rRe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(tRe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),nRe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function g2(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?rRe({apiKey:e.exaApiKey,fetchFn:e.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 h2(e,t){if(t.length===0)return`# Search results for "${e}"
440
440
 
441
441
  (no results)`;let n=[`# Search results for "${e}"`,""];return t.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(`
442
442
  `).trimEnd()}var tRe,nRe,y2=y(()=>{"use strict";Fe();tRe="https://api.exa.ai/search",nRe=10});function dS(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var rl=y(()=>{"use strict";sS()});function cRe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.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,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=oRe;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,iRe)}let a=sRe;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,aRe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function cI(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:$r(e,t),truncated:!0}}function uRe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=cRe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await Xa(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await os(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof en?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=cI(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await m2(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=cI(RG(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof en)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=An(p)&&!eI(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Df()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=g2({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:lRe,timeoutMs:s.timeoutMs,signal:a.signal}),f=cI(h2(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var oRe,iRe,sRe,aRe,lRe,b2,w2=y(()=>{"use strict";f2();y2();Qa();yo();WP();rl();oRe=3e4,iRe=12e4,sRe=1e5,aRe=1e6,lRe=10;b2=uRe()});function mRe(e){return dRe.has(e)?"low":e==="DELETE"?"high":"medium"}function fRe(e){return pRe.has(e)}function yRe(e){let t={};return e.forEach((n,r)=>{let o=r.toLowerCase();hRe.has(o)||gRe.some(i=>o.startsWith(i))||(t[r]=n)}),t}function bRe(e,t){if(e==null)return{serialized:void 0,inferredContentType:void 0};let n=Object.keys(t).some(o=>o.toLowerCase()==="content-type");return typeof e=="string"?{serialized:e,inferredContentType:n?void 0:"text/plain"}:{serialized:JSON.stringify(e),inferredContentType:n?void 0:"application/json"}}function wRe(e,t,n){let r=Buffer.byteLength(e,"utf8"),o=e,i=!1;if(r>n&&(o=$r(e,n),i=!0),!i&&/application\/json/i.test(t))try{return{body:JSON.parse(o),truncated:!1}}catch{}return{body:o,truncated:i}}async function k2(e){let{url:t,method:n,signal:r,domainCheck:o,recordEffect:i}=e,s=Math.min(e.maxResponseBytes??uI,dI),a={...e.headers},l=e.fetchFn??globalThis.fetch,c=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},u=mRe(n);if(o!==void 0){let A=o(t);if(!A.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${A.reason}`),{name:"DomainPolicyError"})}let d=await Xa(t,c);if(!d.allowed)throw new en(d.reason);let{serialized:p,inferredContentType:f}=bRe(e.body,a);f!==void 0&&(a["content-type"]=f);let g={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},b=fRe(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},w=Date.now(),S;try{S=await os(l,t,g,{...c,retry:b})}catch(A){throw A instanceof en,A}let v=Date.now()-w,E=S.headers.get("content-type")??"",T;try{let A=S.body?.getReader();if(!A)T="";else{let P=[],_=0,M=s*2;for(;;){let{done:N,value:O}=await A.read();if(N||!O)break;if(P.push(O),_+=O.byteLength,_>=M){await A.cancel();break}}T=new TextDecoder().decode(Buffer.concat(P,_))}}catch{T=""}let{body:x,truncated:C}=wRe(T,E,s),I=yRe(S.headers);return i!==void 0&&Promise.resolve(i({url:t,method:n,status:S.status,risk:u,timing_ms:v})).catch(()=>{}),{status:S.status,headers:I,body:x,truncated:C,timing_ms:v,risk:u}}function T2(e){if(typeof e!="string"||e.trim().length===0)return{error:"method must be a non-empty string (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)"};let t=e.trim().toUpperCase(),n=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"];return n.includes(t)?t:{error:`method "${e}" is not supported \u2014 must be one of: ${n.join(", ")}`}}var S2,v2,uI,dI,dRe,pRe,gRe,hRe,E2=y(()=>{"use strict";Qa();yo();S2=3e4,v2=12e4,uI=1e5,dI=1e6,dRe=new Set(["GET","HEAD","OPTIONS"]),pRe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);gRe=["set-cookie","x-"],hRe=new Set(["server","via","age","vary","authorization","www-authenticate"])});function SRe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e;if(typeof t.url!="string"||t.url.length===0)return{error:'Invalid input: "url" must be a non-empty string'};let n;try{n=new URL(t.url)}catch{return{error:`Invalid input: "${t.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=T2(t.method);if(typeof o=="object"&&"error"in o)return{error:`Invalid input: ${o.error}`};let i=o,s;if(t.body!==void 0&&t.body!==null){if(typeof t.body!="string"&&typeof t.body!="object")return{error:'Invalid input: "body" must be a string, object, or array'};s=t.body}let a={};if(t.headers!==void 0){if(typeof t.headers!="object"||t.headers===null||Array.isArray(t.headers))return{error:'Invalid input: "headers" must be a string-keyed object'};let d=t.headers;for(let[p,f]of Object.entries(d)){if(typeof f!="string")return{error:`Invalid input: header value for "${p}" must be a string`};a[p]=f}}let l=S2;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:'Invalid input: "timeout_ms" must be a positive finite number'};l=Math.min(t.timeout_ms,v2)}let c=uI;if(t.max_response_bytes!==void 0){if(typeof t.max_response_bytes!="number"||!Number.isFinite(t.max_response_bytes)||t.max_response_bytes<=0)return{error:'Invalid input: "max_response_bytes" must be a positive finite number'};c=Math.min(t.max_response_bytes,dI)}let u;if(t.credential!==void 0){if(typeof t.credential!="string"||t.credential.length===0)return{error:'Invalid input: "credential" must be a non-empty string (an env var name)'};u=t.credential}return{url:r,method:i,body:s,headers:a,timeoutMs:l,maxResponseBytes:c,credential:u}}function vRe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;async function r(){if(e.domainCheck!==void 0)return e.domainCheck;try{let{loadBrowserConfig:o,enforceDomainPolicy:i}=await Promise.resolve().then(()=>(is(),zP)),s=o();return a=>i(a,s)}catch{return}}return async(o,i)=>{if(typeof t!="function")return{content:"web_request unavailable: global fetch() is not present (agent-afk requires Node 20+).",isError:!0};let s=SRe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let p=i.reason;return{content:`web_request aborted: ${p instanceof Error?p.message:String(p??"aborted")}`,isError:!0}}let a={...s.headers};if(s.credential!==void 0){let p=n[s.credential];if(p===void 0||p.trim().length===0)return{content:`web_request credential error: environment variable "${s.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(g=>g.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 l=new AbortController,c=()=>l.abort(i.reason),u,d=()=>{let p=l.signal.reason;return p instanceof Error?p.message:String(p??"aborted")};try{i.addEventListener("abort",c,{once:!0}),u=setTimeout(()=>{l.abort(new Error(`web_request timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let p=await r(),f={url:s.url,method:s.method,body:s.body,headers:a,maxResponseBytes:s.maxResponseBytes,signal:l.signal,fetchFn:t,lookupFn:e.lookupFn,domainCheck:p,recordEffect:e.recordEffect},g;try{g=await k2(f)}catch(S){if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};if(S instanceof en)return{content:`web_request blocked: ${S.message}`,isError:!0};let v=S instanceof Error&&S.name==="DomainPolicyError"?"blocked":"network error",E=S instanceof Error?S.message:String(S);return{content:`web_request ${v}: ${E}`,isError:!0}}if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};let h=g.body;if(typeof h=="string")h=mt(h);else if(typeof h=="object"&&h!==null){let S=mt(JSON.stringify(h));try{h=JSON.parse(S)}catch{h=S}}let b={status:g.status,headers:g.headers,body:h,timing_ms:g.timing_ms,...g.truncated?{truncated:!0}:{}};return{content:JSON.stringify(b,null,2),...g.truncated?{truncated:!0}:{}}}finally{u!==void 0&&clearTimeout(u),i.removeEventListener("abort",c)}}}var x2,R2=y(()=>{"use strict";E2();Qa();Pr();x2=vRe()});import{existsSync as C2,mkdirSync as kRe,readFileSync as TRe,renameSync as ERe,unlinkSync as xRe,writeFileSync as RRe}from"node:fs";import{dirname as A2,join as ARe}from"node:path";import{randomBytes as CRe}from"node:crypto";function Kt(e){let t=e??ob();if(!C2(t))return[];try{let n=TRe(t,"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 ${t}: ${r}`),[]}}function Nr(e,t){let n=t??ob();kRe(A2(n),{recursive:!0});let r=ARe(A2(n),`.schedules.json.${process.pid}.${CRe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{RRe(r,o,"utf-8"),ERe(r,n)}catch(i){try{C2(r)&&xRe(r)}catch{}throw i}}function Mu(e,t){let n=Kt(t),r=n.map(l=>l.id),o=_Re(e.name),i=PRe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Nr(n,t),a}function Ou(e,t){let n=Kt(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Nr(o,t),!0)}function ol(e,t){return Kt(t).find(n=>n.id===e)}function _Re(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function PRe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function ss(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Lf=y(()=>{"use strict";U()});import{existsSync as IRe,readFileSync as MRe}from"node:fs";import{join as ORe}from"node:path";async function ft(e,t,n){let r,o;try{let i=ORe(va("default"),"port");if(!IRe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=MRe(i,"utf-8").trim(),a=pI(s);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 i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function pI(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var Hn,pS=y(()=>{"use strict";U();Hn="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 $Re}from"node:fs";import{readFile as DRe}from"node:fs/promises";var _2,P2,I2,M2,O2=y(()=>{"use strict";Lf();U();pS();_2=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;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 i=Mu({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}),s=i.enabled?await ft("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await ft("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:Hn}})}},P2=async(e,t)=>{let n=Kt();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})))}},I2=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;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,i=Nn();if(!$Re(i))return{content:JSON.stringify([])};let s;try{let c=await DRe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -2181,7 +2181,7 @@ ${E}
2181
2181
  ${T}`})}return{fileBlocks:l,warnings:c}}function Qle(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function Zle(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}F();L();F();nt();L();$l();function ece(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function tce(e,t){He()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function nce(e,t,n,r){if(!He())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=$e(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${be(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function rce(e,t,n,r){if(!He())return;let{subagentId:o,agentType:i}=n,s=$e(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${be(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var eA=class{state;writer;ttfb;constructor(t,n){this.state=ece(),this.writer=t,this.ttfb=n}onToolStart(t){tce(this.state,t)}onToolResult(t,n){nce(this.state,t,n,this.writer)}onSubagentEvent(t,n){rce(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function oce(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function ice(e){return e.received?{}:{turnStartedAt:e.startedAt}}function sce(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function ace(e,t=process.stdout,n){if(!He()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new eA(e,n)))}fe();L();var QVe=3e3;async function lce(e,t){if(!e)return t;let n=Date.now();if(n-t<QVe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){qe()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}L();fe();wt();ta();var ZVe="Keep waiting \u2014 auto-resume in progress",cce="Switch model / provider (type /model after)",eJe="Stop waiting";async function uce(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:ZVe,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];On(r,{header:p,options:[d,cce,eJe],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===cce&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{qe()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{qe()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(vj({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}tx();async function dce(e,t,n,r,o="summary",i,s){let a=pte(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=oce(l);ace(i,process.stdout,c),sp(process.stdout,yh(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,w,S=!1,v=!1,E={abort:null},T=0,x=[],C=new Map,I=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&Zle(j,P,r.onQueuedUserMessage).then(({jobs:q,flushedText:H,flushedPreview:W})=>{let X=(i??{fn:console.log}).fn;for(let D of q)X(m.dim(` \u2192 subagent backgrounded as ${D.jobId}: ${D.label}`));q.some(D=>D.sharesWorktree)&&X(m.warning("\u26A0 Background child is writing to your worktree \u2014 edits may conflict until it finishes")),H!==void 0&&X(m.dim(` \u2192 queued message sent to this turn: ${Qle(W??H)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,_=()=>new Pp({out:Mp(i),thinkingMode:o,...I?{activeSkillName:I}:{},onCancel:()=>{t.interrupt().catch(j=>{qe()&&console.error(" "+m.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:A}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...P?{compositor:P}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...ice(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),M=_();r.bashTailSetter&&(r.bashTailSetter.current=(j,q)=>M.setBashOutputTail(j,q));let N=async()=>{if(!h){h=!0,r.bashTailSetter&&(r.bashTailSetter.current=void 0);try{await M.dispose()}catch{}}},O=async()=>{await M.arm();let j=M.getCompositor();if(i&&j){let q=j;i.fn=H=>q.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(q=>M.setInterrupting(q)),r.rearmStatus?.()};try{P?P.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,M.setSoftStopping(!0),t.interrupt().catch(Z=>{qe()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),Z)});let K=r.subagentControl;K?.hasActiveForeground()&&K.cancelActiveForeground().catch(Z=>{qe()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),Z)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{v=!0,t.interrupt().catch(K=>{qe()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),K)})}),await O(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A),r.setTaskViewHandler?.(qle(r));let{fileBlocks:j,warnings:q}=Xle(e.text,{rootDir:process.cwd()});for(let K of q)(i??{fn:console.log}).fn(m.dim(` @-file: ${K}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let H=j.length>0||e.attachments.length>0?await Yle(e.text,e.attachments,void 0,j,t.sessionId):e.text,W=t.sendMessageStream(H);await Vu((K,Z)=>{M.process(K,Z),Z&&c.plainHooks?.onSubagentEvent(K,Z)},async()=>{for await(let K of W){if(S||v)break;let Z=sce(c,K,f);if(K.type==="chunk"&&K.chunk.type==="content"?(u=p?Kle(u,K.chunk.content):u+K.chunk.content,p=!1,f=!0):K.type==="message"&&!f&&(u=K.message.content),K.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),K.type==="chunk"&&K.chunk.type==="tool_use_detail"){let ce=K.chunk,ne={toolName:ce.toolName,toolUseId:ce.toolUseId,input:ce.toolInput,...ce.toolInputRaw!==void 0&&{inputRaw:ce.toolInputRaw}};C.set(ce.toolUseId,ne),x.push(ne),c.plainHooks?.onToolStart(ce)}else if(K.type==="chunk"&&K.chunk.type==="tool_result"){let ce=K.chunk;d=u.length,p=!0;let ne=C.get(ce.toolUseId);ne&&(ne.result=ce.content,ne.isError=ce.isError,C.delete(ce.toolUseId)),c.plainHooks?.onToolResult(ce,ne?.toolName),T=await lce(r.onContextProgress,T)}if(K.type==="paused"){await uce({event:K,session:t,borrowedCompositor:P,pickerRef:E,completionWriter:i,disposeRendererOnce:N,setPausedState:r.setPausedState,onPauseInterrupt:()=>{v=!0}});continue}if(K.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let ce=K.hotSwapped&&K.accountId?`\u25B6 Resumed on ${K.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,x.length=0,C.clear(),b=!1,w=void 0,g=!1,M=_(),h=!1,await O(),(i??{fn:console.log}).fn(m.success(ce));continue}if(K.type==="error"){await N(),Zc(Kc(K.error)),g=!0;continue}M.process(K),Z&&(c.plainHooks?.onFirstContent(process.stdout),M.notifyFirstContent()),K.type==="done"&&(b=!0,w=K.metadata)}});let D=!1;if(b&&!S&&!v){let K=Hle(M.getPendingBuffer());K>=0?M.stripPendingTerminalState(K):fy(u)!==null&&(D=!0)}await N();let G=i?i.fn:console.log;if(S){let K=P?P.getPendingCount():0,Z=K>0?` \xB7 ${K} queued`:"";G(m.warning(`\u23F8 Stopped${Z} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),G("")}if(v&&(G(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),G("")),b&&!S&&!v){Ul(n,a,u,w,x),await r.onTurnComplete?.(a,u).catch(()=>{}),ip(process.stdout),SZ(process.stdout,"afk: turn complete");let K=ce=>{i?i.fn(ce):console.log(ce)},Z=fy(u);if(Z&&!D){K(Gle(Z,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:x.length})),K("");let ce=HF(x),ne=Boe(x);if(r.onTerminalState)try{r.onTerminalState(Z,{doneHasCorroboratingEvidence:ne,doneEvidenceClassification:ce})}catch{}if(n.permissionMode==="autonomous"){let Ie=Z.kind==="done"&&If().verifyDone===!0&&!ne;joe(Z,void 0,{unverified:Ie})}}if(qN(w,n,K),zN(K,process.stdout),r.onAfterTurn){let ce=r.onAfterTurn();ce instanceof Promise&&await ce.catch(()=>{})}}}catch(j){await N(),g||Zc(Kc(j))}finally{await N(),sp(process.stdout,yh(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setTaskViewHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Ks();Im();var tJe=5e3,nJe=3,rJe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function oJe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function pce(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async _=>{qe()&&(h=rR(_)),await zh(e.session.current),qe()&&(b=uF())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,v=!1,E=!1,T;e.clearPendingStopInjection=()=>{T=void 0};let x,C,I,A=(()=>{let _=parseInt(e.options.maxTurns,10);return _>0?_:void 0})(),P=0;for(g.onInjectable=()=>{P>=nJe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(P++,ip(process.stdout),w={text:rJe,attachments:[]},o.abortPendingRead())};;){if(P=0,h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let D of b)e.replRenderer.writeLine(D);e.replRenderer.writeLine(""),b=[]}let _=f.drainNotifications();for(let{job:D,result:G}of _){let K=G.errorReason===void 0?"\u2713":"\u2717",Z=G.errorReason==="abort"?"killed":G.errorReason==="timeout"?"timed out":G.errorReason==="signal-killed"?"killed by signal":`exit ${G.exitCode??0}`,ce=Math.max(0,Math.round(G.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${K} [${D.id}] ${Z} \xB7 ${ce}s \xB7 `)+D.command)}let M=g.drainNotifications();for(let{job:D}of M){let G=D.status==="completed"?"\u2713":D.status==="failed"?"\u2717":"\u2298",K=D.endedAt!==void 0?Math.max(0,Math.round((D.endedAt-D.startedAt)/100)/10):0,Z=ee(D.label,60);e.replRenderer.writeLine(m.dim(` ${G} [${D.jobId}] subagent ${D.status} \xB7 ${K}s \xB7 `)+Z)}let N=l.renderIfChanged(e.stats.sessionId);if(N.length>0){for(let D of N)e.replRenderer.writeLine(D);e.replRenderer.writeLine("")}let O,j;if(w===void 0){let D=await e.session.current.takePendingPlanExitSeed();D!==void 0&&(e.stats.permissionMode=D.mode,w={text:D.message,attachments:[]})}if(w!==void 0){let D=w;w=void 0;let G=jp(e.stats.permissionMode),K=ql({buffer:D.text,promptText:G,isTTY:!!process.stdout.isTTY,attachmentSummary:hp([...D.attachments])});e.replRenderer.writeLine(K),O=D.text.trim(),j=D.attachments}else{let D=S;S=void 0;let G=await o.readLine({promptFn:()=>jp(e.stats.permissionMode),...D!==void 0?{initialBuffer:D}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{zR(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});O=G.text.trim(),j=G.attachments}if(!O&&j.length===0)continue;if(O.startsWith("!")){let D=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!D&&(v||(v=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(O))){e.statusLine.rearm();continue}}let q=!1;if(O.startsWith("/")){let D=await ID(O,e.slashCtx,j);if(D.handled){if(D.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),D.result!==null&&typeof D.result=="object"&&"kind"in D.result&&D.result.kind==="submit"){w={text:D.result.message,attachments:j??[]},e.statusLine.rearm();continue}if(D.result!==null&&typeof D.result=="object"&&"kind"in D.result&&D.result.kind==="prefill"){S=D.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}q=!0}a.push(O),await oJe(e,O);let H=O;if(q){let D=EE(O);if(D){let G=D.name.replace(/^\//,"").split(":").pop()??"";if(G&&_x(G)){let K={skillName:G,rawArgs:D.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},Z=e.session.current.sessionId,ce=Zs(Z),ne=Date.now();B(`[afk trace] preflight.start commandName=${G}`);let Ie=!1,ze=await Qs(K,{cwd:e.stats.cwd??process.cwd(),artifactDir:ce},to=>{qe()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${G}) failed: `)+(to instanceof Error?to.message:String(to)))});Ie=ze!==null,B(`[afk trace] preflight.end commandName=${G} durationMs=${Date.now()-ne} success=${Ie}`),H=Px(ze?.manifestBlock,O)}}}let W=f.drainInjections();W.length>0&&(H=W+H);let X=g.drainInjections();if(X.length>0&&(H=X+H),T!==void 0&&(H=T+`
2182
2182
 
2183
2183
  `+H,T=void 0),e.hookRegistry)try{let D={event:"UserPromptSubmit",prompt:H,sessionId:e.stats.sessionId},G=await e.hookRegistry.dispatch(D);G.injectContext&&(H=G.injectContext+H)}catch(D){if(D instanceof Ce){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(D.reason?m.dim(`: ${se(D.reason)}`):"")),e.statusLine.rearm();continue}if(D instanceof go){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${D.timeoutMs}ms`)),e.statusLine.rearm();continue}throw D}if(x=C=I=void 0,Cj(),Mj(),await dce({text:H,attachments:j},e.session.current,e.stats,{setInFlight(D){n.turnInFlight=D},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(D){await t.appendUser(D)},async onQueuedUserMessage(D){await t.appendQueuedUser(D)},async onTurnComplete(D,G){if(await t.appendTurn(D,G),e.stats.sessionId)try{Ws(e.stats)}catch(K){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(K instanceof Error?K.message:String(K))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(vr(e.stats,e.contextSampler,e.gitStatusSampler,A)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(D,G)=>{p?.push(D),x=D.kind,C=G?.doneHasCorroboratingEvidence,I=G?.doneEvidenceClassification},setActiveCompositor:D=>{n.activeCompositor=D,D===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:D=>{n.notifyInterrupting=D},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:D=>o.setBackgroundHandler(D),setTaskViewHandler:D=>o.setTaskViewHandler(D),setSoftStopHandler:i,setPausedState:D=>o.setPausedState(D),setPauseInterruptHandler:D=>o.setPauseInterruptHandler(D),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(vr(e.stats,e.contextSampler,e.gitStatusSampler,A)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(D,G)=>{c.repaint(D),u?.onStage(D,G)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{},bashTailSetter:e.bashTailSetter},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(jp(e.stats.permissionMode))),e.hookRegistry)try{let D=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...x!==void 0?{terminalState:x}:{},...C!==void 0?{doneHasCorroboratingEvidence:C}:{},...I!==void 0?{doneEvidenceClassification:I}:{}},void 0,tJe);D.injectContext&&D.injectContext.trim().length>0&&(T=D.injectContext)}catch(D){if(D instanceof Ut)throw D;D instanceof go?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):D instanceof Ce?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${se(D.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(D))}}}function iJe(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function mce(e,t,n,r){let o=await nle(),i=new qR({rl:e.rl,history:o,statusLine:e.statusLine}),s=iJe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await Ele(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=jle(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await pce(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Tf();$u();import{execFile as sJe}from"node:child_process";import{dirname as aJe,isAbsolute as lJe,resolve as cJe}from"node:path";import{promisify as uJe}from"node:util";var fce=uJe(sJe),dJe=3e3,pJe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function mJe(){let t=(await fce("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=lJe(t)?t:cJe(process.cwd(),t);return aJe(n)}async function gce(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await mJe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),dJe)});try{let o=ur({execFile:fce,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>pJe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}jb();Tf();import{promises as fJe}from"node:fs";import{dirname as gJe,join as bce}from"node:path";import{randomBytes as hJe}from"node:crypto";var yJe=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
2184
- `),hce=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,JN=30,bJe=1024,wJe=8e3,SJe="haiku";async function vJe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=xJe(n,bJe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??wJe),s=t.signal?RJe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ru({token:t.token,model:t.model??SJe,system:yJe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=kJe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=gJe(t.worktreePath);return await TJe(l,c)}function kJe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(hce.test(t)&&t.length<=JN)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>JN)break;o=s}return hce.test(o)?o:null}async function TJe(e,t){if(!await EJe(bce(t,e)))return e;let n=hJe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,JN-5)}-${n}`}async function EJe(e){try{return await fJe.access(e),!0}catch{return!1}}function xJe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function RJe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function wce(e){let t,n,r=bce(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await vJe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Yw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return yce(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return yce(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function yce(e,t){e&&e.setCwd(t),AJe(t)}function AJe(e){try{process.chdir(e)}catch{}}yt();kt();Hc();Wo();U();import{spawn as vce}from"child_process";import{existsSync as kce,mkdirSync as MJe,readFileSync as Tce,unlinkSync as Sce,writeFileSync as Ece}from"fs";import{get as OJe}from"https";import{join as xce}from"path";import{readFileSync as CJe}from"fs";import{dirname as _Je,join as PJe}from"path";import{fileURLToPath as IJe}from"url";function Tr(){try{return"5.209.4"}catch{}try{let e=_Je(IJe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(CJe(PJe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var $Je=64*1024,DJe=10800*1e3,LJe=800,FJe=3600*1e3,NJe="update-check.json",BJe="pending-update.json";function YN(){return xce(Sa(),NJe)}function gy(){return xce(Sa(),BJe)}function XN(){let e=Sa();kce(e)||MJe(e,{recursive:!0})}function Rce(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Ace(){try{let e=Tce(YN(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Cce(){try{XN();let e=`
2184
+ `),hce=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,JN=30,bJe=1024,wJe=8e3,SJe="haiku";async function vJe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=xJe(n,bJe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??wJe),s=t.signal?RJe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ru({token:t.token,model:t.model??SJe,system:yJe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=kJe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=gJe(t.worktreePath);return await TJe(l,c)}function kJe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(hce.test(t)&&t.length<=JN)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>JN)break;o=s}return hce.test(o)?o:null}async function TJe(e,t){if(!await EJe(bce(t,e)))return e;let n=hJe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,JN-5)}-${n}`}async function EJe(e){try{return await fJe.access(e),!0}catch{return!1}}function xJe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function RJe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function wce(e){let t,n,r=bce(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await vJe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Yw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return yce(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return yce(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function yce(e,t){e&&e.setCwd(t),AJe(t)}function AJe(e){try{process.chdir(e)}catch{}}yt();kt();Hc();Wo();U();import{spawn as vce}from"child_process";import{existsSync as kce,mkdirSync as MJe,readFileSync as Tce,unlinkSync as Sce,writeFileSync as Ece}from"fs";import{get as OJe}from"https";import{join as xce}from"path";import{readFileSync as CJe}from"fs";import{dirname as _Je,join as PJe}from"path";import{fileURLToPath as IJe}from"url";function Tr(){try{return"5.209.5"}catch{}try{let e=_Je(IJe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(CJe(PJe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var $Je=64*1024,DJe=10800*1e3,LJe=800,FJe=3600*1e3,NJe="update-check.json",BJe="pending-update.json";function YN(){return xce(Sa(),NJe)}function gy(){return xce(Sa(),BJe)}function XN(){let e=Sa();kce(e)||MJe(e,{recursive:!0})}function Rce(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Ace(){try{let e=Tce(YN(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Cce(){try{XN();let e=`
2185
2185
  const https = require('https');
2186
2186
  const fs = require('fs');
2187
2187
  const url = 'https://registry.npmjs.org/agent-afk/latest';
package/dist/index.mjs CHANGED
@@ -280,7 +280,7 @@ Send a message to start one, or /new for a fresh session.`}function C_(t){return
280
280
 
281
281
  ${e}`}var U1,um=m(()=>{"use strict";U1=new Set(["script","style","noscript","template","svg"])});function j1(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 j_(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function H1(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 H_(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??j1,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(!B1.has(u.status)||d===o)return u;let p=H1(u,i)??j_(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=j_(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 B1,W_=m(()=>{"use strict";Q();B1=new Set([429,502,503,504])});import{BlockList as W1,isIP as fm}from"node:net";import{lookup as K1}from"node:dns/promises";import{Agent as G1}from"undici";function G_(){let t=w.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function J1(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function pm(t){let e=fm(t);return e===0?!1:z1.check(t,e===4?"ipv4":"ipv6")}async function q_(t){return K1(t,{all:!0,verbatim:!0})}async function Jn(t,e={}){if(e.allowPrivateHosts??G_())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=J1(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(fm(r)!==0)return pm(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??q_,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(pm(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Ws(t,e={}){let n=await Jn(t,e);if(!n.allowed)throw new ve(n.reason)}async function sn(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<=K_;i++){await Ws(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??G_())?{dispatcher:V1}:{}},c=await H_(t,s,a,r.retry??{});if(!Y1.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 ve(`too many redirects (>${K_}) starting from ${e}`)}var q1,X1,z1,ve,V1,K_,Y1,Vn=m(()=>{"use strict";P();W_();q1=[["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]],X1=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],z1=(()=>{let t=new W1;for(let[e,n]of q1)t.addSubnet(e,n,"ipv4");for(let[e,n]of X1)t.addSubnet(e,n,"ipv6");return t})(),ve=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};V1=new G1({connect:{lookup(t,e,n){q_(t).then(r=>{let o=r.find(i=>pm(i.address));if(o!==void 0){n(new ve(`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,fm(s.address))},r=>n(r,"",0))}}});K_=20,Y1=new Set([301,302,303,307,308])});var gm={};qo(gm,{enforceDomainPolicy:()=>ft,loadBrowserConfig:()=>mm});import{readFileSync as Q1}from"node:fs";import{join as Z1}from"path";function eK(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function X_(t,e){return eK(e).test(t)}function rK(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(tK.has(e))return!0;if(nK.has(e))return!1}return!1}function z_(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function oK(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 J_(t){let e=t===void 0||t.trim()===""?"default":t.trim();return yp(e),e}function sK(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function iK(t){try{return Q1(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function aK(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=J_(e.defaultProfile)),n}function mm(t){let e=t?.env??w,n=t?.readFileSync??iK,r=t?.surface??e.AGENT_SURFACE,o=rK(e.AFK_BROWSER_HEADLESS,r),s=z_(e.AFK_BROWSER_ALLOWED_DOMAINS),i=z_(e.AFK_BROWSER_BLOCKED_DOMAINS),a=sK(e.AFK_BROWSER_DOM_SNAPSHOTS),c=oK(e.AFK_BROWSER_BACKEND),l=J_(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():Z1(Yo(),"browser.json"),f=n(p);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=aK(d,g);return h.configPath=p,h}function ft(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(X_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>X_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var tK,nK,an=m(()=>{"use strict";P();M();tK=new Set(["daemon","subagent","telegram","afk"]),nK=new Set(["repl","interactive","cli"])});import{readFileSync as cK}from"node:fs";import{join as lK}from"node:path";import{homedir as dK}from"node:os";function pK(t){let e=t??uK,n;try{n=cK(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 fK(t){try{return process.kill(t,0),!0}catch{return!1}}async function mK(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 hm(t){let e=pK(t);return e===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:fK(e.pid)?await mK(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 uK,V_=m(()=>{"use strict";uK=lK(dK(),".config","agent-browser","connection.json")});async function Y_(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 hm(),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&&gK.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 hm(),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 gK,Q_=m(()=>{"use strict";V_();gK=new Set(["daemon","subagent"])});import{createHash as hK}from"crypto";function Z_(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&yK.test(t.label))}function eT(t){return hK("sha256").update(t,"utf8").digest("hex").slice(0,8)}function tT(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var yK,Hc=m(()=>{"use strict";yK=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as bK}from"crypto";import{mkdir as wK,stat as SK,writeFile as kK}from"fs/promises";import{join as ym}from"path";import{gzip as vK}from"zlib";import{promisify as _K}from"util";function TK(t){return ym(gt(t),"browser")}function EK(t){return ym(TK(t),"screenshots")}function AK(){return new Date().toISOString().replace(/[:.]/g,"-")}function xK(){return bK(3).toString("hex")}async function Xr(t,e,n){if(e.length>nT)throw new Error(`writeScreenshotSidecar: buffer exceeds ${nT} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=EK(t);await wK(r,{recursive:!0});let o=`${AK()}-${xK()}-${n}.png`,s=ym(r,o);await kK(s,e);let{size:i}=await SK(s);return{path:s,bytes:i}}var sie,nT,bm=m(()=>{"use strict";M();Hc();sie=_K(vK);nT=5*1024*1024});var Wc,rT=m(()=>{"use strict";Q();Wc=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 l=await a.text().catch(()=>"");throw new Error(`Agent Browser ${e} failed (HTTP ${a.status}): ${l}`)}let c=await a.json();if(c.ok===!1){let l=c.error,d=l?.code??"UNKNOWN",u=l?.message??JSON.stringify(c);throw new Error(`Agent Browser ${e} failed: [${String(d)}] ${String(u)}`)}return c.result}finally{clearTimeout(i)}}async listTabs(){return this.call("tabs.list",null)}async openTab(e){return{tabId:(await this.call("tabs.open",{url:e},6e4)).id}}async closeTab(e){await this.call("page.eval",{id:e,script:"window.close()"}).catch(n=>{D("[browser/agent-browser] closeTab window.close() failed (tab leak expected)",{tabId:e,err:n})})}async read(e,n){return this.call("page.read",{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",{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",{id:e,elementId:n})}async fill(e,n,r){await this.call("page.fill",{id:e,elementId:n,value:r})}async press(e,n,r){await this.call("page.press",{id:e,key:n,...r?{elementId:r}:{}})}async select(e,n,r){await this.call("page.select",{id:e,elementId:n,value:r})}async waitFor(e,n,r){await this.call("page.wait",{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",{id:e,script:n})}async screenshot(e){return this.call("page.screenshot",{id:e})}}});function wm(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 oT(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 Sm(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 sT(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(wm)};let s=r[0].id;await Sm(t.client,t.tabId,e.action,s,e.value,e.timeoutMs);let i=await t.client.read(t.tabId,{mode:"main"}),a=ft(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 iT=m(()=>{"use strict";an()});var aT={};qo(aT,{AgentBrowserProvider:()=>km});var km,cT=m(()=>{"use strict";an();bm();rT();iT();km=class{name="agent-browser";config;client;sessions=new Map;constructor(e,n){this.config=e,this.client=new Wc(n)}async open(e){let n=ft(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=ft(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=oT(n.knownElements,e.target);if(r===null){if(e.target.kind==="semantic"){let i=await sT({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 Sm(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=ft(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 Xr(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(wm),l=o??80,d=c.slice(0,l);e.observationCounter+=1,e.knownElements=new Map(d.map(h=>[h.id,h])),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 h=await this.client.screenshot(e.tabId),y=Buffer.from(h.data,"base64");p=(await Xr(n,y,s)).path}catch{u.push("screenshot capture failed")}let f=`obs_${e.observationCounter.toString(36)}`,g={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:g,warnings:u,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as RK,readFileSync as IK}from"node:fs";import{createRequire as CK}from"node:module";import{dirname as PK,join as MK}from"node:path";function uT(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<DK&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function Ue(t){let e=uT(t);return dT.some(n=>e.includes(n))}function FK(){try{let e=CK(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(IK(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=MK(PK(e),o);return RK(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function Ks(){return lT??=FK()??OK,lT}function vm(t){return t.includes("install chromium")}function nt(t,e){let n=uT(t),r=e?.latched===!0?` ${LK}`:"";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: ${Ks()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Ks()}). Or pick a different tool.${r}`}function Kc(t,e,n=!1){if(!Ue(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
282
282
 
283
- ${nt(t,{headless:e,latched:n})}`,{cause:t})}var dT,OK,DK,lT,LK,_m=m(()=>{"use strict";dT=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],OK="pnpm exec playwright install chromium",DK=4;LK="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 Yn from"node:fs";import Gc from"node:path";import{randomBytes as NK}from"node:crypto";function UK(){try{return"5.209.4"}catch{}try{let t=Gc.resolve(import.meta.dirname,"../../../package.json"),e=Yn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var $K,qc,pT=m(()=>{"use strict";_m();M();Q();$K=UK(),qc=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=Kc(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=Kc(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/${$K}`}}loadStorageState(e){let n=bp(e);try{if(!Yn.existsSync(n))return;let r=JSON.parse(Yn.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=bp(e);if(!Yn.existsSync(r))return;let o=await n.storageState(),s=Gc.join(Gc.dirname(r),`.${Gc.basename(r)}.${process.pid}.${NK(4).toString("hex")}.tmp`);Yn.writeFileSync(s,JSON.stringify(o),{mode:384}),Yn.chmodSync(s,384),Yn.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 BK}from"node:crypto";function jK(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function HK(t,e,n){return`el_${BK("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function WK(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function fT(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function gT(t,e){let n=t.role??"",r=t.name??"";mT.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])gT(s,e)}async function KK(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},hT).catch(()=>[])}async function GK(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 h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="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,g={role:l,name:c,disabled:p};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},hT).catch(()=>[])}function qK(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Xc(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=qK(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=KK(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,g,h]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],gT(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await GK(t)).filter(C=>mT.has(C.role??"")));let S=new Map;for(let T of p){let C=fT(T.name),N=S.get(C);(!N||N.bbox.w===0&&T.bbox.w>0)&&S.set(C,T)}let k=y.map(T=>({ax:T,dom:S.get(fT(T.name??""))})),_=r?k:k.filter(T=>T.dom?T.dom.bbox.w>0||T.dom.bbox.h>0:!0);_.sort((T,C)=>{let N=T.dom?.bbox.y??0,O=C.dom?.bbox.y??0;if(N!==O)return N-O;let U=T.dom?.bbox.x??0,L=C.dom?.bbox.x??0;return U-L}),_.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=_.slice(0,n).map((T,C)=>{let N=T.ax.role??"generic",O=T.ax.name??"",U=HK(N,O,C),L=T.dom?.bbox??{x:0,y:0,w:0,h:0},$=T.dom?.type??null,q=null;T.ax.value!==void 0&&T.ax.value!==null&&(q=String(T.ax.value)),T.ax.checked!==void 0&&(q=String(T.ax.checked)),Z_({role:N,kind:$})&&(q="[redacted]");let K={disabled:T.ax.disabled??!1};T.ax.checked!==void 0&&(K.checked=T.ax.checked===!0||T.ax.checked==="mixed"),T.ax.selected!==void 0&&(K.selected=T.ax.selected),T.ax.expanded!==void 0&&(K.expanded=T.ax.expanded);let ne;T.dom?.testId?ne=`[data-testid="${T.dom.testId}"]`:T.dom?.id&&(ne=`#${T.dom.id}`);let xn={id:U,role:N,label:jK(O),kind:$,value:q,state:K,bbox:L};return ne!==void 0&&(xn.selector=ne),xn}),A="idle";try{let T=await t.evaluate(()=>document.readyState);T==="loading"?A="loading":T==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="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 F=WK(f),v=`obs_${e.observationCounter.toString(36)}`,x=new Date().toISOString();return{observationId:v,url:g,title:h,textSummary:F,interactive:R,status:{httpStatus:e.httpStatus??null,loadingState:A,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:x}}var mT,hT,yT=m(()=>{"use strict";Hc();mT=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);hT="a[href], button, input, select, textarea, [role], [tabindex], label"});async function bT(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 Tm(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>bT(t,s)))).filter(o=>o!==null)}async function XK(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 Em(t,e,n){switch(e.kind){case"element_id":return zK(t,e,n);case"selector":return JK(t,e);case"semantic":return VK(t,e)}}async function zK(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 Tm(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function JK(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 Tm(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function VK(t,e){return e.role!==void 0?YK(t,e.text,e.role):QK(t,e.text,e)}async function YK(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 Tm(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function QK(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 XK(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await bT(y.locator,y.index);if(b!==null){let S=`${b.role}:${b.label}:${h}`,k=0;for(let _=0;_<S.length;_++)k=k*31+S.charCodeAt(_)>>>0;f.push({...b,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var wT=m(()=>{"use strict"});async function Am(t,e,n,r){let o=t.url();if(o===n)return null;let s=ft(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 ST=m(()=>{"use strict";an()});var Rm={};qo(Rm,{PlaywrightProvider:()=>xm});function kT(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 xm,Im=m(()=>{"use strict";pT();yT();wT();an();ST();bm();xm=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new qc(e)}async open(e){let n=ft(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 Am(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 Xc(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 Xc(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 Em(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${kT(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(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await Am(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 Xc(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),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 Em(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${kT(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 Xr(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 Xr(n,o,r);return s}catch{return null}}}});var Zn={};qo(Zn,{__resetBrowserRegistryForTests:()=>oG,browserProviderActive:()=>tG,closeBrowserProvider:()=>Pm,getBrowserProvider:()=>eG,getLastRoutingDecision:()=>rG,peekBrowserProvider:()=>nG});function vT(){Promise.resolve(Pm()).then(()=>{process.exit(130)})}function _T(){Promise.resolve(Pm()).then(()=>{process.exit(143)})}function TT(){Et=null}function ZK(){zc||(process.on("SIGINT",vT),process.on("SIGTERM",_T),process.on("exit",TT),zc=!0)}function ET(){zc&&(process.removeListener("SIGINT",vT),process.removeListener("SIGTERM",_T),process.removeListener("exit",TT),zc=!1)}async function eG(t){return Et!==null?Et:(Qn!==null||(Qn=(async()=>{let e=mm(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??w.AGENT_SURFACE,r=await Y_({config:e,surface:n});Cm=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(cT(),aT)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(Im(),Rm));o=new s(e)}return ZK(),Et=o,Qn=null,o})()),Qn)}async function Pm(){if(Et===null)return;let t=Et;Et=null,Qn=null,ET(),await t.shutdown()}function tG(){return Et!==null}function nG(){return Et}function rG(){return Cm}function oG(){Et=null,Qn=null,Cm=null,ET()}var Et,Qn,zc,Cm,er=m(()=>{"use strict";an();Q_();P();Et=null,Qn=null,zc=!1,Cm=null});async function AT(t,e){try{return await U_(t,e)}catch(n){return D("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function dG(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(er(),Zn)),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(()=>(Im(),Rm)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(an(),gm)),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 xT(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??dG,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await sn(n,t,{headers:lG,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(cG.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(aG.test(p)&&!iG.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await AT(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof ve||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=dm({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await Ws(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>Ws(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await Ws(u.finalUrl,o);let p=await AT(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=dm({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 ve)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,g=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=u,g}}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 iG,aG,cG,lG,RT=m(()=>{"use strict";$_();um();Vn();Q();iG=/(text\/html|application\/xhtml\+xml)/i,aG=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,cG=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,lG={"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 fG(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(uG,{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),pG),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=ue(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 IT(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?fG({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 CT(t,e){if(e.length===0)return`# Search results for "${t}"
283
+ ${nt(t,{headless:e,latched:n})}`,{cause:t})}var dT,OK,DK,lT,LK,_m=m(()=>{"use strict";dT=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],OK="pnpm exec playwright install chromium",DK=4;LK="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 Yn from"node:fs";import Gc from"node:path";import{randomBytes as NK}from"node:crypto";function UK(){try{return"5.209.5"}catch{}try{let t=Gc.resolve(import.meta.dirname,"../../../package.json"),e=Yn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var $K,qc,pT=m(()=>{"use strict";_m();M();Q();$K=UK(),qc=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=Kc(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=Kc(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/${$K}`}}loadStorageState(e){let n=bp(e);try{if(!Yn.existsSync(n))return;let r=JSON.parse(Yn.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=bp(e);if(!Yn.existsSync(r))return;let o=await n.storageState(),s=Gc.join(Gc.dirname(r),`.${Gc.basename(r)}.${process.pid}.${NK(4).toString("hex")}.tmp`);Yn.writeFileSync(s,JSON.stringify(o),{mode:384}),Yn.chmodSync(s,384),Yn.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 BK}from"node:crypto";function jK(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function HK(t,e,n){return`el_${BK("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function WK(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function fT(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function gT(t,e){let n=t.role??"",r=t.name??"";mT.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])gT(s,e)}async function KK(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},hT).catch(()=>[])}async function GK(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 h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="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,g={role:l,name:c,disabled:p};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},hT).catch(()=>[])}function qK(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Xc(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=qK(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=KK(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,g,h]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],gT(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await GK(t)).filter(C=>mT.has(C.role??"")));let S=new Map;for(let T of p){let C=fT(T.name),N=S.get(C);(!N||N.bbox.w===0&&T.bbox.w>0)&&S.set(C,T)}let k=y.map(T=>({ax:T,dom:S.get(fT(T.name??""))})),_=r?k:k.filter(T=>T.dom?T.dom.bbox.w>0||T.dom.bbox.h>0:!0);_.sort((T,C)=>{let N=T.dom?.bbox.y??0,O=C.dom?.bbox.y??0;if(N!==O)return N-O;let U=T.dom?.bbox.x??0,L=C.dom?.bbox.x??0;return U-L}),_.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=_.slice(0,n).map((T,C)=>{let N=T.ax.role??"generic",O=T.ax.name??"",U=HK(N,O,C),L=T.dom?.bbox??{x:0,y:0,w:0,h:0},$=T.dom?.type??null,q=null;T.ax.value!==void 0&&T.ax.value!==null&&(q=String(T.ax.value)),T.ax.checked!==void 0&&(q=String(T.ax.checked)),Z_({role:N,kind:$})&&(q="[redacted]");let K={disabled:T.ax.disabled??!1};T.ax.checked!==void 0&&(K.checked=T.ax.checked===!0||T.ax.checked==="mixed"),T.ax.selected!==void 0&&(K.selected=T.ax.selected),T.ax.expanded!==void 0&&(K.expanded=T.ax.expanded);let ne;T.dom?.testId?ne=`[data-testid="${T.dom.testId}"]`:T.dom?.id&&(ne=`#${T.dom.id}`);let xn={id:U,role:N,label:jK(O),kind:$,value:q,state:K,bbox:L};return ne!==void 0&&(xn.selector=ne),xn}),A="idle";try{let T=await t.evaluate(()=>document.readyState);T==="loading"?A="loading":T==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="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 F=WK(f),v=`obs_${e.observationCounter.toString(36)}`,x=new Date().toISOString();return{observationId:v,url:g,title:h,textSummary:F,interactive:R,status:{httpStatus:e.httpStatus??null,loadingState:A,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:x}}var mT,hT,yT=m(()=>{"use strict";Hc();mT=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);hT="a[href], button, input, select, textarea, [role], [tabindex], label"});async function bT(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 Tm(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>bT(t,s)))).filter(o=>o!==null)}async function XK(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 Em(t,e,n){switch(e.kind){case"element_id":return zK(t,e,n);case"selector":return JK(t,e);case"semantic":return VK(t,e)}}async function zK(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 Tm(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function JK(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 Tm(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function VK(t,e){return e.role!==void 0?YK(t,e.text,e.role):QK(t,e.text,e)}async function YK(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 Tm(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function QK(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 XK(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await bT(y.locator,y.index);if(b!==null){let S=`${b.role}:${b.label}:${h}`,k=0;for(let _=0;_<S.length;_++)k=k*31+S.charCodeAt(_)>>>0;f.push({...b,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var wT=m(()=>{"use strict"});async function Am(t,e,n,r){let o=t.url();if(o===n)return null;let s=ft(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 ST=m(()=>{"use strict";an()});var Rm={};qo(Rm,{PlaywrightProvider:()=>xm});function kT(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 xm,Im=m(()=>{"use strict";pT();yT();wT();an();ST();bm();xm=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new qc(e)}async open(e){let n=ft(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 Am(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 Xc(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 Xc(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 Em(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${kT(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(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await Am(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 Xc(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),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 Em(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${kT(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 Xr(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 Xr(n,o,r);return s}catch{return null}}}});var Zn={};qo(Zn,{__resetBrowserRegistryForTests:()=>oG,browserProviderActive:()=>tG,closeBrowserProvider:()=>Pm,getBrowserProvider:()=>eG,getLastRoutingDecision:()=>rG,peekBrowserProvider:()=>nG});function vT(){Promise.resolve(Pm()).then(()=>{process.exit(130)})}function _T(){Promise.resolve(Pm()).then(()=>{process.exit(143)})}function TT(){Et=null}function ZK(){zc||(process.on("SIGINT",vT),process.on("SIGTERM",_T),process.on("exit",TT),zc=!0)}function ET(){zc&&(process.removeListener("SIGINT",vT),process.removeListener("SIGTERM",_T),process.removeListener("exit",TT),zc=!1)}async function eG(t){return Et!==null?Et:(Qn!==null||(Qn=(async()=>{let e=mm(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??w.AGENT_SURFACE,r=await Y_({config:e,surface:n});Cm=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(cT(),aT)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(Im(),Rm));o=new s(e)}return ZK(),Et=o,Qn=null,o})()),Qn)}async function Pm(){if(Et===null)return;let t=Et;Et=null,Qn=null,ET(),await t.shutdown()}function tG(){return Et!==null}function nG(){return Et}function rG(){return Cm}function oG(){Et=null,Qn=null,Cm=null,ET()}var Et,Qn,zc,Cm,er=m(()=>{"use strict";an();Q_();P();Et=null,Qn=null,zc=!1,Cm=null});async function AT(t,e){try{return await U_(t,e)}catch(n){return D("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function dG(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(er(),Zn)),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(()=>(Im(),Rm)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(an(),gm)),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 xT(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??dG,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await sn(n,t,{headers:lG,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(cG.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(aG.test(p)&&!iG.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await AT(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof ve||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=dm({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await Ws(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>Ws(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await Ws(u.finalUrl,o);let p=await AT(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=dm({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 ve)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,g=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=u,g}}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 iG,aG,cG,lG,RT=m(()=>{"use strict";$_();um();Vn();Q();iG=/(text\/html|application\/xhtml\+xml)/i,aG=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,cG=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,lG={"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 fG(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(uG,{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),pG),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=ue(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 IT(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?fG({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 CT(t,e){if(e.length===0)return`# Search results for "${t}"
284
284
 
285
285
  (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(`
286
286
  `).trimEnd()}var uG,pG,PT=m(()=>{"use strict";Qe();uG="https://api.exa.ai/search",pG=10});function Jc(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 tr=m(()=>{"use strict";_m()});function wG(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=mG;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,gG)}let a=hG;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,yG)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Mm(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:kt(t,e),truncated:!0}}function SG(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=wG(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 Jn(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 h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await sn(e,i.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:h instanceof ve?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,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(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=Mm(f,i.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await xT(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=Mm(B_(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 ve)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=Ue(p)&&!vm(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Ks()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let u=IT({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:bG,timeoutMs:i.timeoutMs,signal:a.signal}),f=Mm(CT(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 mG,gG,hG,yG,bG,MT,OT=m(()=>{"use strict";RT();PT();Vn();vt();um();tr();mG=3e4,gG=12e4,hG=1e5,yG=1e6,bG=10;MT=SG()});function _G(t){return kG.has(t)?"low":t==="DELETE"?"high":"medium"}function TG(t){return vG.has(t)}function xG(t){let e={};return t.forEach((n,r)=>{let o=r.toLowerCase();AG.has(o)||EG.some(s=>o.startsWith(s))||(e[r]=n)}),e}function RG(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 IG(t,e,n){let r=Buffer.byteLength(t,"utf8"),o=t,s=!1;if(r>n&&(o=kt(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 LT(t){let{url:e,method:n,signal:r,domainCheck:o,recordEffect:s}=t,i=Math.min(t.maxResponseBytes??Om,Dm),a={...t.headers},c=t.fetchFn??globalThis.fetch,l=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},d=_G(n);if(o!==void 0){let v=o(e);if(!v.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${v.reason}`),{name:"DomainPolicyError"})}let u=await Jn(e,l);if(!u.allowed)throw new ve(u.reason);let{serialized:p,inferredContentType:f}=RG(t.body,a);f!==void 0&&(a["content-type"]=f);let g={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},y=TG(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},b=Date.now(),S;try{S=await sn(c,e,g,{...l,retry:y})}catch(v){throw v instanceof ve,v}let k=Date.now()-b,_=S.headers.get("content-type")??"",E;try{let v=S.body?.getReader();if(!v)E="";else{let x=[],T=0,C=i*2;for(;;){let{done:N,value:O}=await v.read();if(N||!O)break;if(x.push(O),T+=O.byteLength,T>=C){await v.cancel();break}}E=new TextDecoder().decode(Buffer.concat(x,T))}}catch{E=""}let{body:R,truncated:A}=IG(E,_,i),F=xG(S.headers);return s!==void 0&&Promise.resolve(s({url:e,method:n,status:S.status,risk:d,timing_ms:k})).catch(()=>{}),{status:S.status,headers:F,body:R,truncated:A,timing_ms:k,risk:d}}function NT(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 DT,FT,Om,Dm,kG,vG,EG,AG,UT=m(()=>{"use strict";Vn();vt();DT=3e4,FT=12e4,Om=1e5,Dm=1e6,kG=new Set(["GET","HEAD","OPTIONS"]),vG=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);EG=["set-cookie","x-"],AG=new Set(["server","via","age","vary","authorization","www-authenticate"])});function CG(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=NT(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=DT;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,FT)}let l=Om;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,Dm)}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 PG(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(()=>(an(),gm)),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=CG(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(g=>g.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},g;try{g=await LT(f)}catch(S){if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};if(S instanceof ve)return{content:`web_request blocked: ${S.message}`,isError:!0};let k=S instanceof Error&&S.name==="DomainPolicyError"?"blocked":"network error",_=S instanceof Error?S.message:String(S);return{content:`web_request ${k}: ${_}`,isError:!0}}if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};let h=g.body;if(typeof h=="string")h=ht(h);else if(typeof h=="object"&&h!==null){let S=ht(JSON.stringify(h));try{h=JSON.parse(S)}catch{h=S}}let y={status:g.status,headers:g.headers,body:h,timing_ms:g.timing_ms,...g.truncated?{truncated:!0}:{}};return{content:JSON.stringify(y,null,2),...g.truncated?{truncated:!0}:{}}}finally{d!==void 0&&clearTimeout(d),s.removeEventListener("abort",l)}}}var $T,BT=m(()=>{"use strict";UT();Vn();Pn();$T=PG()});import{existsSync as HT,mkdirSync as MG,readFileSync as OG,renameSync as DG,unlinkSync as FG,writeFileSync as LG}from"node:fs";import{dirname as jT,join as NG}from"node:path";import{randomBytes as UG}from"node:crypto";function nr(t){let e=t??fp();if(!HT(e))return[];try{let n=OG(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 Gs(t,e){let n=e??fp();MG(jT(n),{recursive:!0});let r=NG(jT(n),`.schedules.json.${process.pid}.${UG(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{LG(r,o,"utf-8"),DG(r,n)}catch(s){try{HT(r)&&FG(r)}catch{}throw s}}function WT(t,e){let n=nr(e),r=n.map(c=>c.id),o=$G(t.name),s=BG(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),Gs(n,e),a}function KT(t,e){let n=nr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(Gs(o,e),!0)}function GT(t,e){return nr(e).find(n=>n.id===t)}function $G(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function BG(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}function qT(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 XT=m(()=>{"use strict";M()});import{existsSync as jG,readFileSync as HG}from"node:fs";import{join as WG}from"node:path";async function zr(t,e,n){let r,o;try{let s=WG(aw("default"),"port");if(!jG(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=HG(s,"utf-8").trim(),a=KG(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 KG(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 Fm,zT=m(()=>{"use strict";M();Fm="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 GG}from"node:fs";import{readFile as qG}from"node:fs/promises";var JT,VT,YT,QT,ZT=m(()=>{"use strict";XT();M();zT();JT=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=WT({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 zr("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 zr("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:Fm}})}},VT=async(t,e)=>{let n=nr();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})))}},YT=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=ha();if(!GG(s))return{content:JSON.stringify([])};let i;try{let l=await qG(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`