agent-afk 5.213.1 → 5.213.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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 Cxe,tI=y(()=>{"use strict";Cxe=new Set(["script","style","noscript","template","svg"])});function Ixe(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 r2(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function Mxe(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 o2(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Ixe,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(!Pxe.has(d.status)||u===o)return d;let p=Mxe(d,s)??r2(u,i,s);U("[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=r2(u,i,s);U("[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 Pxe,i2=y(()=>{"use strict";ge();Pxe=new Set([429,502,503,504])});import{BlockList as Oxe,isIP as rI}from"node:net";import{lookup as $xe}from"node:dns/promises";import{Agent as Dxe}from"undici";function a2(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Bxe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function nI(e){let t=rI(e);return t===0?!1:Nxe.check(e,t===4?"ipv4":"ipv6")}async function l2(e){return $xe(e,{all:!0,verbatim:!0})}async function el(e,t={}){if(t.allowPrivateHosts??a2())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=Bxe(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(rI(r)!==0)return nI(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??l2,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(nI(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Wf(e,t={}){let n=await el(e,t);if(!n.allowed)throw new nn(n.reason)}async function ss(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<=s2;s++){await Wf(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??a2())?{dispatcher:Uxe}:{}},l=await o2(e,i,a,r.retry??{});if(!jxe.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 nn(`too many redirects (>${s2}) starting from ${t}`)}var Lxe,Fxe,Nxe,nn,Uxe,s2,jxe,tl=y(()=>{"use strict";F();i2();Lxe=[["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]],Fxe=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Nxe=(()=>{let e=new Oxe;for(let[t,n]of Lxe)e.addSubnet(t,n,"ipv4");for(let[t,n]of Fxe)e.addSubnet(t,n,"ipv6");return e})(),nn=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Uxe=new Dxe({connect:{lookup(e,t,n){l2(e).then(r=>{let o=r.find(s=>nI(s.address));if(o!==void 0){n(new nn(`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,rI(i.address))},r=>n(r,"",0))}}});s2=20,jxe=new Set([301,302,303,307,308])});var iI={};lt(iI,{enforceDomainPolicy:()=>Br,loadBrowserConfig:()=>oI});import{readFileSync as Hxe}from"node:fs";import{join as Wxe}from"path";function Kxe(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function c2(e,t){return Kxe(t).test(e)}function zxe(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(Gxe.has(t))return!0;if(qxe.has(t))return!1}return!1}function u2(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Vxe(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 d2(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Wc(t),t}function Jxe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Yxe(e){try{return Hxe(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Xxe(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=d2(t.defaultProfile)),n}function oI(e){let t=e?.env??k,n=e?.readFileSync??Yxe,r=e?.surface??t.AGENT_SURFACE,o=zxe(t.AFK_BROWSER_HEADLESS,r),i=u2(t.AFK_BROWSER_ALLOWED_DOMAINS),s=u2(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Jxe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Vxe(t.AFK_BROWSER_BACKEND),c=d2(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():Wxe(kn(),"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=Xxe(u,g);return h.configPath=p,h}function Br(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(c2(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>c2(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Gxe,qxe,as=y(()=>{"use strict";F();B();Gxe=new Set(["daemon","subagent","telegram","afk"]),qxe=new Set(["repl","interactive","cli"])});import{readFileSync as Qxe}from"node:fs";import{join as Zxe}from"node:path";import{homedir as eRe}from"node:os";function nRe(e){let t=e??tRe,n;try{n=Qxe(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 rRe(e){try{return process.kill(e,0),!0}catch{return!1}}async function oRe(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 sI(e){let t=nRe(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:rRe(t.pid)?await oRe(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 tRe,p2=y(()=>{"use strict";tRe=Zxe(eRe(),".config","agent-browser","connection.json")});async function m2(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 sI(),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&&iRe.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 sI(),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 iRe,f2=y(()=>{"use strict";p2();iRe=new Set(["daemon","subagent"])});import{createHash as sRe}from"crypto";function g2(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&aRe.test(e.label))}function h2(e){return sRe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function y2(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var aRe,pS=y(()=>{"use strict";aRe=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as lRe}from"crypto";import{mkdir as cRe,stat as uRe,writeFile as dRe}from"fs/promises";import{join as aI}from"path";import{gzip as pRe}from"zlib";import{promisify as mRe}from"util";function fRe(e){return aI(Zt(e),"browser")}function gRe(e){return aI(fRe(e),"screenshots")}function hRe(){return new Date().toISOString().replace(/[:.]/g,"-")}function yRe(){return lRe(3).toString("hex")}async function Ou(e,t,n){if(t.length>b2)throw new Error(`writeScreenshotSidecar: buffer exceeds ${b2} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=gRe(e);await cRe(r,{recursive:!0});let o=`${hRe()}-${yRe()}-${n}.png`,i=aI(r,o);await dRe(i,t);let{size:s}=await uRe(i);return{path:i,bytes:s}}var ddt,b2,lI=y(()=>{"use strict";B();pS();ddt=mRe(pRe);b2=5*1024*1024});var mS,w2=y(()=>{"use strict";ge();mS=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=>{U("[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 cI(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 S2(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 uI(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 v2(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(cI)};let i=r[0].id;await uI(e.client,e.tabId,t.action,i,t.value,t.timeoutMs);let s=await e.client.read(e.tabId,{mode:"main"}),a=Br(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 k2=y(()=>{"use strict";as()});var T2={};lt(T2,{AgentBrowserProvider:()=>dI});var dI,E2=y(()=>{"use strict";as();lI();w2();k2();dI=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new mS(n)}async open(t){let n=Br(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=Br(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=S2(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await v2({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 uI(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=Br(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 Ou(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(cI),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 Ou(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 bRe,readFileSync as wRe}from"node:fs";import{createRequire as SRe}from"node:module";import{dirname as vRe,join as kRe}from"node:path";function A2(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<ERe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function Cn(e){let t=A2(e);return R2.some(n=>t.includes(n))}function xRe(){try{let t=SRe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(wRe(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=kRe(vRe(t),o);return bRe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Kf(){return x2??=xRe()??TRe,x2}function pI(e){return e.includes("install chromium")}function ur(e,t){let n=A2(e),r=t?.latched===!0?` ${RRe}`:"";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: ${Kf()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Kf()}). Or pick a different tool.${r}`}function $u(e,t,n=!1){if(!Cn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
438
438
 
439
- ${ur(e,{headless:t,latched:n})}`,{cause:e})}var R2,TRe,ERe,x2,RRe,fS=y(()=>{"use strict";R2=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],TRe="pnpm exec playwright install chromium",ERe=4;RRe="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 nl from"node:fs";import gS from"node:path";import{randomBytes as ARe}from"node:crypto";function CRe(){try{return"5.213.1"}catch{}try{let e=gS.resolve(import.meta.dirname,"../../../package.json"),t=nl.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var _Re,hS,C2=y(()=>{"use strict";fS();B();ge();_Re=CRe(),hS=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=$u(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=$u(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/${_Re}`}}loadStorageState(t){let n=Kc(t);try{if(!nl.existsSync(n))return;let r=JSON.parse(nl.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Kc(t);if(!nl.existsSync(r))return;let o=await n.storageState(),i=gS.join(gS.dirname(r),`.${gS.basename(r)}.${process.pid}.${ARe(4).toString("hex")}.tmp`);nl.writeFileSync(i,JSON.stringify(o),{mode:384}),nl.chmodSync(i,384),nl.renameSync(i,r),U("[browser/vault] saved session",{profile:t,file:r})}catch(r){U("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as PRe}from"node:crypto";function IRe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function MRe(e,t,n){return`el_${PRe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function ORe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function _2(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function I2(e,t){let n=e.role??"",r=e.name??"";P2.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])I2(i,t)}async function $Re(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},M2).catch(()=>[])}async function DRe(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},M2).catch(()=>[])}function LRe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function yS(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=LRe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=$Re(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=[],I2(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await DRe(e)).filter(M=>P2.has(M.role??"")));let S=new Map;for(let _ of p){let M=_2(_.name),N=S.get(M);(!N||N.bbox.w===0&&_.bbox.w>0)&&S.set(M,_)}let v=b.map(_=>({ax:_,dom:S.get(_2(_.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 H=_.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return H-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??"",H=MRe(N,O,M),q=_.dom?.bbox??{x:0,y:0,w:0,h:0},W=_.dom?.type??null,K=null;_.ax.value!==void 0&&_.ax.value!==null&&(K=String(_.ax.value)),_.ax.checked!==void 0&&(K=String(_.ax.checked)),g2({role:N,kind:W})&&(K="[redacted]");let Y={disabled:_.ax.disabled??!1};_.ax.checked!==void 0&&(Y.checked=_.ax.checked===!0||_.ax.checked==="mixed"),_.ax.selected!==void 0&&(Y.selected=_.ax.selected),_.ax.expanded!==void 0&&(Y.expanded=_.ax.expanded);let ie;_.dom?.testId?ie=`[data-testid="${_.dom.testId}"]`:_.dom?.id&&(ie=`#${_.dom.id}`);let $={id:H,role:N,label:IRe(O),kind:W,value:K,state:Y,bbox:q};return ie!==void 0&&($.selector=ie),$}),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=ORe(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 P2,M2,O2=y(()=>{"use strict";pS();P2=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);M2="a[href], button, input, select, textarea, [role], [tabindex], label"});async function $2(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 mI(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>$2(e,i)))).filter(o=>o!==null)}async function FRe(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 fI(e,t,n){switch(t.kind){case"element_id":return NRe(e,t,n);case"selector":return BRe(e,t);case"semantic":return URe(e,t)}}async function NRe(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 mI(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function BRe(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 mI(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function URe(e,t){return t.role!==void 0?jRe(e,t.text,t.role):HRe(e,t.text,t)}async function jRe(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 mI(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function HRe(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 FRe(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 $2(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 D2=y(()=>{"use strict"});async function gI(e,t,n,r){let o=e.url();if(o===n)return null;let i=Br(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 L2=y(()=>{"use strict";as()});var yI={};lt(yI,{PlaywrightProvider:()=>hI});function F2(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 hI,bI=y(()=>{"use strict";C2();O2();D2();as();L2();lI();hI=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new hS(t)}async open(t){let n=Br(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 gI(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 yS(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 yS(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 fI(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${F2(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 gI(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 yS(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 fI(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${F2(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 Ou(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 Ou(n,o,r);return i}catch{return null}}}});var ol={};lt(ol,{__resetBrowserRegistryForTests:()=>VRe,browserProviderActive:()=>GRe,closeBrowserProvider:()=>SI,getBrowserProvider:()=>KRe,getLastRoutingDecision:()=>zRe,peekBrowserProvider:()=>qRe});function N2(){Promise.resolve(SI()).then(()=>{process.exit(130)})}function B2(){Promise.resolve(SI()).then(()=>{process.exit(143)})}function U2(){Co=null}function WRe(){bS||(process.on("SIGINT",N2),process.on("SIGTERM",B2),process.on("exit",U2),bS=!0)}function j2(){bS&&(process.removeListener("SIGINT",N2),process.removeListener("SIGTERM",B2),process.removeListener("exit",U2),bS=!1)}async function KRe(e){return Co!==null?Co:(rl!==null||(rl=(async()=>{let t=oI(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await m2({config:t,surface:n});wI=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(E2(),T2)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(bI(),yI));o=new i(t)}return WRe(),Co=o,rl=null,o})()),rl)}async function SI(){if(Co===null)return;let e=Co;Co=null,rl=null,j2(),await e.shutdown()}function GRe(){return Co!==null}function qRe(){return Co}function zRe(){return wI}function VRe(){Co=null,rl=null,wI=null,j2()}var Co,rl,bS,wI,il=y(()=>{"use strict";as();f2();F();Co=null,rl=null,bS=!1,wI=null});async function H2(e,t){try{return await e2(e,t)}catch(n){return U("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function eAe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(il(),ol)),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(()=>(bI(),yI)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(as(),iI)),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 W2(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??eAe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await ss(n,e,{headers:ZRe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(QRe.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(XRe.test(p)&&!YRe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await H2(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof nn||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=eI({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Wf(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Wf(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Wf(d.finalUrl,o);let p=await H2(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=eI({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 nn)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 YRe,XRe,QRe,ZRe,K2=y(()=>{"use strict";t2();tI();tl();ge();YRe=/(text\/html|application\/xhtml\+xml)/i,XRe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,QRe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,ZRe={"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 rAe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(tAe,{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),nAe),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()!==""?rAe({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 q2(e,t){if(t.length===0)return`# Search results for "${e}"
439
+ ${ur(e,{headless:t,latched:n})}`,{cause:e})}var R2,TRe,ERe,x2,RRe,fS=y(()=>{"use strict";R2=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],TRe="pnpm exec playwright install chromium",ERe=4;RRe="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 nl from"node:fs";import gS from"node:path";import{randomBytes as ARe}from"node:crypto";function CRe(){try{return"5.213.2"}catch{}try{let e=gS.resolve(import.meta.dirname,"../../../package.json"),t=nl.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var _Re,hS,C2=y(()=>{"use strict";fS();B();ge();_Re=CRe(),hS=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=$u(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=$u(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/${_Re}`}}loadStorageState(t){let n=Kc(t);try{if(!nl.existsSync(n))return;let r=JSON.parse(nl.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Kc(t);if(!nl.existsSync(r))return;let o=await n.storageState(),i=gS.join(gS.dirname(r),`.${gS.basename(r)}.${process.pid}.${ARe(4).toString("hex")}.tmp`);nl.writeFileSync(i,JSON.stringify(o),{mode:384}),nl.chmodSync(i,384),nl.renameSync(i,r),U("[browser/vault] saved session",{profile:t,file:r})}catch(r){U("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as PRe}from"node:crypto";function IRe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function MRe(e,t,n){return`el_${PRe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function ORe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function _2(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function I2(e,t){let n=e.role??"",r=e.name??"";P2.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])I2(i,t)}async function $Re(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},M2).catch(()=>[])}async function DRe(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},M2).catch(()=>[])}function LRe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function yS(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=LRe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=$Re(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=[],I2(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await DRe(e)).filter(M=>P2.has(M.role??"")));let S=new Map;for(let _ of p){let M=_2(_.name),N=S.get(M);(!N||N.bbox.w===0&&_.bbox.w>0)&&S.set(M,_)}let v=b.map(_=>({ax:_,dom:S.get(_2(_.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 H=_.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return H-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??"",H=MRe(N,O,M),q=_.dom?.bbox??{x:0,y:0,w:0,h:0},W=_.dom?.type??null,K=null;_.ax.value!==void 0&&_.ax.value!==null&&(K=String(_.ax.value)),_.ax.checked!==void 0&&(K=String(_.ax.checked)),g2({role:N,kind:W})&&(K="[redacted]");let Y={disabled:_.ax.disabled??!1};_.ax.checked!==void 0&&(Y.checked=_.ax.checked===!0||_.ax.checked==="mixed"),_.ax.selected!==void 0&&(Y.selected=_.ax.selected),_.ax.expanded!==void 0&&(Y.expanded=_.ax.expanded);let ie;_.dom?.testId?ie=`[data-testid="${_.dom.testId}"]`:_.dom?.id&&(ie=`#${_.dom.id}`);let $={id:H,role:N,label:IRe(O),kind:W,value:K,state:Y,bbox:q};return ie!==void 0&&($.selector=ie),$}),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=ORe(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 P2,M2,O2=y(()=>{"use strict";pS();P2=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);M2="a[href], button, input, select, textarea, [role], [tabindex], label"});async function $2(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 mI(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>$2(e,i)))).filter(o=>o!==null)}async function FRe(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 fI(e,t,n){switch(t.kind){case"element_id":return NRe(e,t,n);case"selector":return BRe(e,t);case"semantic":return URe(e,t)}}async function NRe(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 mI(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function BRe(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 mI(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function URe(e,t){return t.role!==void 0?jRe(e,t.text,t.role):HRe(e,t.text,t)}async function jRe(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 mI(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function HRe(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 FRe(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 $2(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 D2=y(()=>{"use strict"});async function gI(e,t,n,r){let o=e.url();if(o===n)return null;let i=Br(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 L2=y(()=>{"use strict";as()});var yI={};lt(yI,{PlaywrightProvider:()=>hI});function F2(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 hI,bI=y(()=>{"use strict";C2();O2();D2();as();L2();lI();hI=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new hS(t)}async open(t){let n=Br(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 gI(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 yS(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 yS(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 fI(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${F2(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 gI(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 yS(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 fI(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${F2(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 Ou(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 Ou(n,o,r);return i}catch{return null}}}});var ol={};lt(ol,{__resetBrowserRegistryForTests:()=>VRe,browserProviderActive:()=>GRe,closeBrowserProvider:()=>SI,getBrowserProvider:()=>KRe,getLastRoutingDecision:()=>zRe,peekBrowserProvider:()=>qRe});function N2(){Promise.resolve(SI()).then(()=>{process.exit(130)})}function B2(){Promise.resolve(SI()).then(()=>{process.exit(143)})}function U2(){Co=null}function WRe(){bS||(process.on("SIGINT",N2),process.on("SIGTERM",B2),process.on("exit",U2),bS=!0)}function j2(){bS&&(process.removeListener("SIGINT",N2),process.removeListener("SIGTERM",B2),process.removeListener("exit",U2),bS=!1)}async function KRe(e){return Co!==null?Co:(rl!==null||(rl=(async()=>{let t=oI(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await m2({config:t,surface:n});wI=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(E2(),T2)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(bI(),yI));o=new i(t)}return WRe(),Co=o,rl=null,o})()),rl)}async function SI(){if(Co===null)return;let e=Co;Co=null,rl=null,j2(),await e.shutdown()}function GRe(){return Co!==null}function qRe(){return Co}function zRe(){return wI}function VRe(){Co=null,rl=null,wI=null,j2()}var Co,rl,bS,wI,il=y(()=>{"use strict";as();f2();F();Co=null,rl=null,bS=!1,wI=null});async function H2(e,t){try{return await e2(e,t)}catch(n){return U("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function eAe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(il(),ol)),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(()=>(bI(),yI)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(as(),iI)),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 W2(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??eAe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await ss(n,e,{headers:ZRe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(QRe.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(XRe.test(p)&&!YRe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await H2(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof nn||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=eI({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Wf(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Wf(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Wf(d.finalUrl,o);let p=await H2(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=eI({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 nn)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 YRe,XRe,QRe,ZRe,K2=y(()=>{"use strict";t2();tI();tl();ge();YRe=/(text\/html|application\/xhtml\+xml)/i,XRe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,QRe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,ZRe={"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 rAe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(tAe,{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),nAe),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()!==""?rAe({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 q2(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 tAe,nAe,z2=y(()=>{"use strict";Fe();tAe="https://api.exa.ai/search",nAe=10});function wS(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 sl=y(()=>{"use strict";fS()});function cAe(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=oAe;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,iAe)}let a=sAe;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,aAe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function vI(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Dr(e,t),truncated:!0}}function uAe(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=cAe(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 el(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 ss(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof nn?{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=vI(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await W2(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=vI(n2(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 nn)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=Cn(p)&&!pI(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Kf()}\`)`:"";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:lAe,timeoutMs:s.timeoutMs,signal:a.signal}),f=vI(q2(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 oAe,iAe,sAe,aAe,lAe,V2,J2=y(()=>{"use strict";K2();z2();tl();wo();tI();sl();oAe=3e4,iAe=12e4,sAe=1e5,aAe=1e6,lAe=10;V2=uAe()});function mAe(e){return dAe.has(e)?"low":e==="DELETE"?"high":"medium"}function fAe(e){return pAe.has(e)}function yAe(e){let t={};return e.forEach((n,r)=>{let o=r.toLowerCase();hAe.has(o)||gAe.some(i=>o.startsWith(i))||(t[r]=n)}),t}function bAe(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 wAe(e,t,n){let r=Buffer.byteLength(e,"utf8"),o=e,i=!1;if(r>n&&(o=Dr(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 Q2(e){let{url:t,method:n,signal:r,domainCheck:o,recordEffect:i}=e,s=Math.min(e.maxResponseBytes??kI,TI),a={...e.headers},l=e.fetchFn??globalThis.fetch,c=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},u=mAe(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 el(t,c);if(!d.allowed)throw new nn(d.reason);let{serialized:p,inferredContentType:f}=bAe(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=fAe(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},w=Date.now(),S;try{S=await ss(l,t,g,{...c,retry:b})}catch(A){throw A instanceof nn,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}=wAe(T,E,s),I=yAe(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 Z2(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 Y2,X2,kI,TI,dAe,pAe,gAe,hAe,eq=y(()=>{"use strict";tl();wo();Y2=3e4,X2=12e4,kI=1e5,TI=1e6,dAe=new Set(["GET","HEAD","OPTIONS"]),pAe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);gAe=["set-cookie","x-"],hAe=new Set(["server","via","age","vary","authorization","www-authenticate"])});function SAe(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=Z2(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=Y2;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,X2)}let c=kI;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,TI)}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 vAe(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(()=>(as(),iI)),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=SAe(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 Q2(f)}catch(S){if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};if(S instanceof nn)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 tq,nq=y(()=>{"use strict";eq();tl();Ir();tq=vAe()});import{existsSync as oq,mkdirSync as kAe,readFileSync as TAe,renameSync as EAe,unlinkSync as xAe,writeFileSync as RAe}from"node:fs";import{dirname as rq,join as AAe}from"node:path";import{randomBytes as CAe}from"node:crypto";function qt(e){let t=e??mb();if(!oq(t))return[];try{let n=TAe(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 Ur(e,t){let n=t??mb();kAe(rq(n),{recursive:!0});let r=AAe(rq(n),`.schedules.json.${process.pid}.${CAe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{RAe(r,o,"utf-8"),EAe(r,n)}catch(i){try{oq(r)&&xAe(r)}catch{}throw i}}function Du(e,t){let n=qt(t),r=n.map(l=>l.id),o=_Ae(e.name),i=PAe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Ur(n,t),a}function Lu(e,t){let n=qt(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Ur(o,t),!0)}function al(e,t){return qt(t).find(n=>n.id===e)}function _Ae(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function PAe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function ls(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 Gf=y(()=>{"use strict";B()});import{existsSync as IAe,readFileSync as MAe}from"node:fs";import{join as OAe}from"node:path";async function ft(e,t,n){let r,o;try{let i=OAe(Ea("default"),"port");if(!IAe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=MAe(i,"utf-8").trim(),a=EI(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 EI(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,SS=y(()=>{"use strict";B();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 $Ae}from"node:fs";import{readFile as DAe}from"node:fs/promises";var iq,sq,aq,lq,cq=y(()=>{"use strict";Gf();B();SS();iq=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=Du({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}})}},sq=async(e,t)=>{let n=qt();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})))}},aq=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(!$Ae(i))return{content:JSON.stringify([])};let s;try{let c=await DAe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -2043,8 +2043,8 @@ ${c}`)}o.push({type:"text",text:i});let l=Lx(e,{skillName:"init",out:Bp(),onCanc
2043
2043
  `).length;r.success("Copied last response (plain) "+m.dim(`(${d} chars, ${p} line${p===1?"":"s"})`)+m.dim(" to clipboard"))}else r.warn("Clipboard write failed \u2014 the full response is in /transcript.");return"continue"}if(a)return r.warn(`Unknown argument "${a}". Usage: /copy (whole response), /copy N (code block N), or /copy plain (strip markdown).`),"continue";if(ms(s)){let c=s.length,u=s.split(`
2044
2044
  `).length;r.success("Copied last response "+m.dim(`(${c} chars, ${u} line${u===1?"":"s"})`)+m.dim(" to clipboard"))}else r.warn("Clipboard write failed \u2014 the full response is in /transcript.");return"continue"}}});import{access as mze,constants as fze,mkdir as gze,readFile as hze}from"fs/promises";import{execSync as yze}from"child_process";async function bze(){return await Jw("anthropic-direct")??Ns()?{name:"Anthropic API Key",state:"pass",detail:"ANTHROPIC_API_KEY set"}:{name:"Anthropic API Key",state:"fail",fix:"Set ANTHROPIC_API_KEY or run `afk login`"}}async function wze(){return eE()?{name:"Codex/OpenAI API Key",state:"pass",detail:"OPENAI_API_KEY or CODEX_API_KEY set"}:{name:"Codex/OpenAI API Key",state:"warn",fix:"Set OPENAI_API_KEY or CODEX_API_KEY to use Codex models"}}async function Sze(){let{resolveXaiAuth:e}=await Promise.resolve().then(()=>($s(),D3)),t=e(void 0,void 0);return t.apiKey?{name:"xAI / Grok auth",state:"pass",detail:`${t.mode==="oauth"?"SuperGrok OAuth":"XAI_API_KEY"} (\u2026${t.last4??"????"})`}:t.source==="ambiguous-auth"?{name:"xAI / Grok auth",state:"warn",detail:"both XAI_API_KEY and SuperGrok OAuth present",fix:"Choose `--provider xai` or `--provider xai-oauth` explicitly"}:{name:"xAI / Grok auth",state:"warn",fix:"Set XAI_API_KEY or run `afk provider auth xai login` for SuperGrok / SuperGrok Heavy / X Premium+"}}async function vze(){try{let t=`${yze("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(k.PATH??"").split(":").map(r=>r.replace(/\/$/,"")).includes(t)?{name:"npm bin on PATH",state:"pass",detail:t}:{name:"npm bin on PATH",state:"fail",detail:t,fix:`Add ${t} to PATH: echo 'export PATH="${t}:$PATH"' >> ~/.zshrc`}}catch{return{name:"npm bin on PATH",state:"warn",detail:"could not query npm prefix"}}}async function MN(e,t){let n=t();try{return await mze(n,fze.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await gze(n,{recursive:!0}),{name:e,state:"pass",detail:`${n} (created)`}}catch{return{name:e,state:"fail",detail:n,fix:`Unable to create or write to ${n}`}}}}async function kze(){let e=Tn();try{let t=await hze(e,"utf-8");return JSON.parse(t),{name:"Config File",state:"pass",detail:`${e} (valid JSON)`}}catch(t){return t.code==="ENOENT"?{name:"Config File",state:"pass",detail:"no config file (using defaults)"}:{name:"Config File",state:"fail",detail:e,fix:`Unable to parse config file: ${t instanceof Error?t.message:"unknown error"}`}}}async function Tze(){let e=TC();return e.length===0?null:{name:"Required env vars",state:"fail",detail:`Missing: ${e.map(t=>t.name).join(", ")}`,fix:"Set these env vars before running. See docs/env-registry.md for descriptions."}}async function Eze(){let e=k.AFK_TELEGRAM_BOT_TOKEN;if(!e)return null;try{let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),r=await fetch(`https://api.telegram.org/bot${e}/getMe`,{signal:t.signal});if(clearTimeout(n),r.ok){let i=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:i?`@${i}`:"connected"}}return{name:"Telegram Bot",state:"fail",fix:`Telegram API returned ${r.status}. Check AFK_TELEGRAM_BOT_TOKEN.`}}catch(t){return t.name==="AbortError"?{name:"Telegram Bot",state:"warn",detail:"connection timeout"}:{name:"Telegram Bot",state:"warn",detail:`network error: ${t instanceof Error?t.message:"unknown"}`}}}async function xze(e={}){let t;if(e.detected!==void 0)t=e.detected;else try{t=aS()}catch{return null}let n=e.trusted??gn()??{},r=t.filter(i=>i.present&&(i.plugins.length>0||i.skills.length>0)&&n[i.binary]===void 0);return r.length===0?null:{name:"Cross-tool import available",state:"warn",detail:r.map(i=>`${i.label} (${i.plugins.length} plugins, ${i.skills.length} skills)`).join("; "),fix:"Run `afk migrate` to import them"}}function Rze(){return TH(!1).map(e=>({name:e.key,state:e.valid?"pass":"warn",detail:e.valid?`effective value ${e.effectiveValue} (${e.source})`:`invalid value ${JSON.stringify(e.rawValue)}; effective value ${e.effectiveValue} (fallback)`,...e.valid?{}:{fix:`Set ${e.key} to an integer in [1, ${e.maxValue}] or unset it to use the default.`}}))}async function PR(){let e=[];e.push(await bze()),e.push(await wze()),e.push(await Sze()),e.push(await vze()),e.push(await MN("Config Directory",kn)),e.push(await MN("State Directory",ce)),e.push(await MN("Logs Directory",Qo)),e.push(await kze()),e.push(...Rze());let t=await Tze();t!==null&&e.push(t);let n=await Eze();n!==null&&e.push(n);let r=await xze();return r!==null&&e.push(r),e}var ON=y(()=>{"use strict";F();lf();yt();kt();B();Ao()});function IR(e,t){return new Promise(n=>{let{header:r,initial:o="",help:i=Aze,validate:s,signal:a}=t;if(a?.aborted){n(null);return}let l=z.seed(o),c=null,u=!1,d=b=>{u||(u=!0,a&&a.removeEventListener("abort",p),e.exitPickerMode(),n(b))},p=()=>d(null);a&&a.addEventListener("abort",p,{once:!0});let h={renderRows:()=>{let b=[];for(let w of r)b.push(w);return b.push(_ze(l)),c!==null&&b.push(m.warning(" "+c)),b.push(m.dim(" "+i)),b},onKey:(b,w)=>{if(u)return;if(w.name==="escape"||w.ctrl&&w.name==="c"){d(null);return}if(w.name==="return"){if(s){let v=s(l.buffer);if(v!==null){c=v,e.repaintPicker();return}}d(l.buffer);return}let S=c!==null;if(w.name==="left"||w.ctrl&&w.name==="b"){l=z.moveLeft(l),c=null,e.repaintPicker();return}if(w.name==="right"||w.ctrl&&w.name==="f"){l=z.moveRight(l),c=null,e.repaintPicker();return}if(w.name==="home"||w.ctrl&&w.name==="a"){l=z.moveHome(l),c=null,e.repaintPicker();return}if(w.name==="end"||w.ctrl&&w.name==="e"){l=z.moveEnd(l),c=null,e.repaintPicker();return}if(w.name==="backspace"){l=z.backspace(l),c=null,e.repaintPicker();return}if(w.name==="delete"){l=z.deleteForward(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="w"){l=z.deleteWordBackward(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="u"){l=z.deleteToLineStart(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="k"){l=z.deleteToLineEnd(l),c=null,e.repaintPicker();return}if(b!==void 0&&b.length>0&&!Pze(b)){l=z.insert(l,b),c=null,e.repaintPicker();return}S&&(c=null,e.repaintPicker())}};e.enterPickerMode(h)})}function _ze(e){let{buffer:t,cursor:n}=e,r=t.slice(0,n),o=n>=t.length,i=o?"\u258F":t.charAt(n),s=n<t.length?t.slice(n+1):"",a=o?m.caret(i):m.caret.inverse(i);return` ${m.dim(Cze)} ${r}${a}${s}`}function Pze(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t<32||t===127}var Aze,Cze,$N=y(()=>{"use strict";L();wn();Aze="enter to submit \xB7 esc to cancel",Cze=">"});function Mze(e){return e==="model"||e.startsWith("models.")||e==="temperature"||e==="maxTokens"||e.startsWith("autoRouting.")?"Model & routing":e.startsWith("interactive.")?"Interactive":e.startsWith("telegram.")?"Telegram":e.startsWith("daemon.")||e==="systemPrompt"||e==="permissionMode"||e==="enableShellHooks"||e==="enablePluginHooks"||e==="updatePolicy"?"Advanced":"Session"}function Kae(e){let t=new Map;for(let r of e){let o=Mze(r.path),i=t.get(o);i?i.push(r):t.set(o,[r])}let n=[];for(let r of Ize){let o=t.get(r);o&&o.length>0&&n.push({name:r,keys:o})}return n}function MR(e){return e===void 0?"(unset)":e===null?"null":Array.isArray(e)?e.length===0?"(empty)":e.join(","):typeof e=="object"?JSON.stringify(e):String(e)}function Gae(e,t,n,r){let o=e.tier==="human"?"\u{1F512} ":" ",i=r?` ${m.warning(r)}`:"";return`${o}${e.path.padEnd(n)} ${MR(t)} (${e.type})${i}`}function qae(e){if(e.type==="boolean")return{kind:"pick",options:["true","false"]};if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0)return{kind:"pick",options:[...e.enumValues]};let t="enter to save \xB7 esc to cancel";return e.type==="number"&&e.clamp?t=`number ${`[${e.clamp.min}..${e.clamp.max}]${e.clamp.integer?" integer":""}`} \xB7 enter to save \xB7 esc to cancel`:e.type==="number"?t="number \xB7 enter to save \xB7 esc to cancel":e.type==="number-array"?t="comma-separated numbers \xB7 enter to save \xB7 esc to cancel":e.type==="model-slot"&&(t="model id (e.g. sonnet) \xB7 enter to save \xB7 esc to cancel"),{kind:"text",help:t}}function zae(e){return t=>{let n=IS(e,t);return n.ok?null:n.error}}var Ize,Vae=y(()=>{"use strict";L();cl();Ize=["Model & routing","Interactive","Session","Telegram","Advanced"]});function Jae(){let e=new Map,t=new Map,n=(r,o,i)=>{if(r.has(o))return r.get(o);let s=i();return r.set(o,s),s};return{raw:(r,o)=>n(e,r,o),validated:(r,o)=>n(t,r,o)}}var Yae,DN=y(()=>{"use strict";Yae={raw:(e,t)=>t(),validated:(e,t)=>t()}});import{readFileSync as Oze,existsSync as $ze}from"fs";function LN(e){return e.kind==="env"?`env ${e.via}`:e.kind==="default"?"default":oG[e.kind]}function Xae(e){if(e.source.kind==="default")return e.shadowedBy?`\u2190 default (${LN(e.shadowedBy)} active \u2014 see \u26A0)`:void 0;if(e.source.kind!=="user")return`\u2190 ${LN(e.source)}`}function OR(e){let t=e.shadowedBy;if(t)return t.kind==="env"?`${t.via} is set in the environment and overrides this file \u2014 unset it for this change to take effect.`:t.kind==="project"?e.source.kind==="default"?`${t.path} outranks the user config and is loaded INSTEAD of it (config files are not merged), so this key falls back to its default \u2014 set it in that file for this change to take effect.`:`${t.path} sets this key and outranks the user config \u2014 edit that file for this change to take effect.`:`${LN(t)} overrides this file.`}function Fze(e){if($ze(e))try{let t=JSON.parse(Oze(e,"utf-8"));return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0}catch{return}}function Nze(e){try{let t=lS(e);return t===void 0?void 0:BG(t)}catch{return}}function Bze(e){for(let t of Dze[e]??[]){if(!Dc(t))continue;let n=lb(t);if(n===void 0)return;let r=Lze[t];if(!(r&&!r(n)))return t}}function $R(e,t=Yae){let n=Qw(),r=n.find(s=>s.tier==="user"),o=r?Yf(t.raw(r.path,()=>Fze(r.path))??{},e):void 0,i=Bze(e);if(i!==void 0){let s=wa(i),a=lb(i),l=s?.secret===!0?Qf(a):a,c={kind:"env",via:i};return{path:e,effective:l,source:c,shadowedBy:c,userValue:o}}for(let s of n){let a=t.validated(s.path,()=>Nze(s.path));if(a===void 0)continue;let l=Yf(a,e),c={kind:s.tier,path:s.path},u=s.tier==="project"?{shadowedBy:c}:{};return{path:e,effective:l,source:l===void 0?{kind:"default"}:c,...u,userValue:o}}return{path:e,effective:void 0,source:{kind:"default"},userValue:o}}var Dze,Lze,FN=y(()=>{"use strict";F();cl();Uu();VP();FP();DN();Dze={model:["AFK_MODEL","CLAUDE_MODEL"],maxTokens:["AFK_MAX_TOKENS"],temperature:["AFK_TEMPERATURE"],systemPrompt:["AFK_SYSTEM_PROMPT"],"autoRouting.interactive":["AFK_AUTO_ROUTING"],"autoRouting.chat":["AFK_AUTO_ROUTING"],"autoRouting.telegram":["AFK_AUTO_ROUTING"],"autoRouting.daemon":["AFK_AUTO_ROUTING"],theme:["AFK_THEME"],"interactive.thinkingUi":["AFK_THINKING_UI"],"interactive.suggestGhost":["AFK_SUGGEST_GHOST"],"models.local":["AFK_MODEL_LOCAL"],"models.small":["AFK_MODEL_SMALL"],"models.medium":["AFK_MODEL_MEDIUM"],"models.large":["AFK_MODEL_LARGE"]},Lze={AFK_MAX_TOKENS:e=>Number.isInteger(Number(e)),AFK_TEMPERATURE:e=>Number.isFinite(Number(e))}});async function DR(e,t,n){let r=Uze[e];if(!r)return{applied:!1};if(!n)return{applied:!1,reason:"no live session on this surface"};try{return await r(t,n)}catch(o){return{applied:!1,reason:o instanceof Error?o.message:String(o)}}}var Uze,NN=y(()=>{"use strict";qc();Uze={model:async(e,t)=>(await t.setModel(e),t.noteModel?.(e),t.repaint?.(),{applied:!0,note:"applied to this session"}),theme:async(e,t)=>{let n=Ui(e);if(n===void 0)return{applied:!1,reason:`unrecognised theme "${e}"`};let r=co(n);return lo(r),t.repaint?.(),{applied:!0,note:`applied to this session${n==="auto"?` (auto \u2192 ${r})`:""}`}}}});async function Qae(e,t){let n=Kae(t.specs());if(n.length!==0)for(;;){let r=[m.bold(BN),m.dim("Changes apply on the next restart"),""],o=await e.pick(r,n.map(a=>`${a.name} \xB7 ${a.keys.length} setting${a.keys.length===1?"":"s"}`));if(o===null)return;let i=n[o];if(!i)return;let s=Math.min(28,Math.max(...i.keys.map(a=>a.path.length)));for(;;){let a=[m.bold(`${BN} \u203A ${i.name}`),""],l=Jae(),c=await e.pick(a,i.keys.map(d=>{let p=t.current(d.path),f=t.provenance?.(d.path,l),g=f?f.effective:p;return Gae(d,g,s,f?Xae(f):void 0)}));if(c===null)break;let u=i.keys[c];if(!u)break;await jze(e,t,u)}}}async function jze(e,t,n){let r=t.current(n.path),o=t.provenance?.(n.path),i=o?OR(o):void 0,s=[m.bold(`${BN} \u203A ${n.path}`),m.dim(n.description),m.dim(`current: ${MR(o?o.effective:r)}`),...i?[m.warning(`\u26A0 ${i}`)]:[],""],a=qae(n),l;if(a.kind==="pick"){let u=await e.pick(s,a.options);if(u===null)return;let d=a.options[u];if(d===void 0)return;l=d}else{let u=r===void 0?"":MR(r),d=await e.editText(s,u,a.help,zae(n));if(d===null)return;l=d}let c=!1;if(n.tier==="human"){if(await e.pick([m.warning(`Apply human-tier change to ${n.path}?`),m.dim("This setting is normally changed via `afk config` on the CLI."),""],[`Yes \u2014 set to "${l}"`,"No \u2014 cancel"])!==0)return;c=!0}try{let u=t.write(n.path,l,c),d=await t.applyLive?.(n.path,l),p=d?.applied===!0?d.note:mr;e.emit(`${m.success(" \u2713")} ${n.path} = ${m.bold(u)} ${m.dim(`\u2014 ${p}`)}`),d&&d.applied===!1&&d.reason!==void 0&&e.emit(`${m.warning(" \u26A0")} ${m.dim(`saved, but not applied live: ${d.reason}`)}`),i&&e.emit(`${m.warning(" \u26A0")} ${m.dim(i)}`)}catch(u){e.emit(`${m.error(" \u2717")} ${m.error(u instanceof Error?u.message:String(u))}`)}}function Zae(e){return{async pick(t,n){let r=await $n(e,{header:t,options:n});if(!r||r.length===0)return null;let o=n.indexOf(r[0]);return o>=0?o:null},async editText(t,n,r,o){return IR(e,{header:t,initial:n,help:r,validate:o})},emit(t){e.commitAbove(t)}}}function ele(e){return{specs:()=>UI,current:t=>Bu(t).value,write:(t,n,r)=>String(cs(t,n,r?{allowHumanOnly:!0}:void 0).value),provenance:(t,n)=>$R(t,n),applyLive:(t,n)=>DR(t,n,e)}}var BN,tle=y(()=>{"use strict";L();ra();$N();cl();Vae();Uu();FN();DN();NN();BN="\u2699 Settings"});function nle(e){return{setModel:async t=>{await e.session.current.setModel(t)},noteModel:t=>{e.stats.model=t},repaint:()=>{e.ui.repaintStatusLine(),e.getCompositor?.()?.repaint()}}}function LR(e){let t=k.AFK_MODEL??k.CLAUDE_MODEL,n=t??"sonnet",r=ae(t),o=k.ANTHROPIC_API_KEY||k.CLAUDE_CODE_OAUTH_TOKEN,i=k.OPENAI_API_KEY||k.CODEX_API_KEY,s=r==="anthropic"?o:i;if(e.line(),e.line(m.bold("Configuration")),e.line(ue()),e.line(` model ${m.info(t?n:`${n} (default)`)}`),e.line(` provider ${m.plan(r)}`),r==="anthropic"){let u=s?m.success("\u2713 set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):m.warning("\u26A0 not set \u2014 subprocess falls back to OAuth / keychain");e.line(` api key ${u}`)}else{let u=k.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY",d=s?m.success(`\u2713 set (${u})`):m.warning("\u26A0 not set \u2014 falling back to `codex login` state");e.line(` api key ${d}`)}e.line(` thinking ${k.AFK_THINKING?m.info(k.AFK_THINKING):m.dim("(unset \u2014 SDK default)")}`),e.line(` effort ${k.AFK_EFFORT?m.info(k.AFK_EFFORT):m.dim("(unset \u2014 SDK default)")}`);let a=Pu();e.line(` perm mode ${a==="bypassPermissions"?m.warning(`${a} (bypass \u2014 containment off)`):m.info(`${a} (containment on)`)}`),e.line(),e.line(m.bold("Environment variables")),e.line(ue());let l=[["AFK_MODEL",k.AFK_MODEL??m.dim("unset")],["CLAUDE_MODEL",k.CLAUDE_MODEL??m.dim("unset")],["ANTHROPIC_API_KEY",k.ANTHROPIC_API_KEY?m.success("set"):m.dim("unset")],["CLAUDE_CODE_OAUTH_TOKEN",k.CLAUDE_CODE_OAUTH_TOKEN?m.success("set"):m.dim("unset")],["OPENAI_API_KEY",k.OPENAI_API_KEY?m.success("set"):m.dim("unset")],["CODEX_API_KEY",k.CODEX_API_KEY?m.success("set"):m.dim("unset")],["AFK_THINKING",k.AFK_THINKING??m.dim("unset")],["AFK_EFFORT",k.AFK_EFFORT??m.dim("unset")]],c=Math.max(...l.map(([u])=>u.length))+2;for(let[u,d]of l)e.line(` ${m.meta(u.padEnd(c))} ${d}`);Hze(e),e.line()}function Hze(e){let{systemPromptSource:t,shadowedAfkMdPaths:n}=Ye();if(e.line(),e.line(m.bold("System prompt overlay")),e.line(ue()),e.line(` source ${t?m.info(t):m.dim("(none \u2014 framework base only)")}`),n!==void 0&&n.length>0){for(let r of n)e.line(` ${m.warning("\u26A0 shadowed")} ${m.dim(r)}`);e.line(` ${m.dim("a higher-precedence tier supplied the overlay; this file was not loaded")}`)}}async function Wze(e,t){let n=t.trim(),r=n.indexOf(" ");if(r===-1)return e.out.warn("Usage: /config set <key> <value>"),"continue";let o=n.slice(0,r).trim(),i=n.slice(r+1).trim(),s=PS(o);if(!s)return e.out.error(`Unknown config key: ${o} (type /config to browse settings)`),"continue";if(s.tier==="human")return e.out.warn(`${o} is human-tier \u2014 set it from the interactive menu (/config) or \`afk config set ${o} <value>\`.`),"continue";try{let a=OR($R(o));a&&e.out.warn(a);let l=cs(o,i),c=await DR(o,i,nle(e));e.out.success(`\u2713 set ${o} = ${String(l.value)} \u2014 ${c.applied?c.note:mr}`),!c.applied&&c.reason!==void 0&&e.out.warn(`saved, but not applied live: ${c.reason}`),a&&e.out.warn(a)}catch(a){e.out.error(a instanceof Error?a.message:String(a))}return"continue"}var Kze,Gze,rle,ole=y(()=>{"use strict";F();L();wt();Ue();Tt();ON();cl();Uu();tle();FN();NN();Kze={name:"/config",summary:"View or edit configuration \u2014 interactive settings menu on a TTY",usage:"/config [view | set <key> <value>]",hint:"Browse and edit config mid-session in an arrow-key settings menu. Rows show the value the loader will actually use and name the tier it came from, so an env var or project-local afk.config.json that overrides your change is visible before you make it. `model` and `theme` apply immediately; other keys apply on the next restart. Same store as `afk config`.",async handler(e,t){let n=t.trim();if(n==="view")return LR(e.out),"continue";if(n==="set"||n.startsWith("set "))return await Wze(e,n==="set"?"":n.slice(4));if(n.length>0&&n!=="edit"&&n!=="menu")return e.out.warn(`Unknown argument: ${n} (usage: /config [view | set <key> <value>])`),LR(e.out),"continue";let r=e.getCompositor?.()??null;if(!r)return LR(e.out),e.out.line(m.dim(" Interactive editing needs a TTY. Use `/config set <key> <value>` or `afk config`.")),"continue";try{await Qae(Zae(r),ele(nle(e)))}catch(o){e.out.error(`Could not open the settings menu: ${o instanceof Error?o.message:String(o)}`),e.out.line(m.dim(" Showing the read-only view instead:")),LR(e.out)}return"continue"}},Gze={name:"/doctor",summary:"Run system health checks (API keys, directories, config file, Telegram)",hint:"When something feels broken \u2014 API key missing, config file unreadable, Telegram bot unreachable. Same checks as `afk doctor` but surfaced mid-session without exiting.",async handler(e){let{out:t}=e;t.line(),t.line(m.bold("System health checks")),t.line(ue());let n;try{n=await PR()}catch(r){return t.error(`Health check failed: ${r instanceof Error?r.message:String(r)}`),"continue"}for(let r of n)for(let o of $b(r))t.line(o);return t.line(),t.line(Db(n)),t.line(),"continue"}},rle=[Kze,Gze]});var ile,sle=y(()=>{"use strict";L();ile={name:"/ghost",usage:"/ghost [on|off]",summary:"Toggle ghost-text suggestions mid-session",hint:"Pause or resume inline ghost-text suggestions (the dim text after the cursor). `/ghost off` suppresses all ghost text for the rest of this session \u2014 nothing new appears and nothing new is recorded to history. `/ghost on` resumes. For a permanent toggle, set `interactive.suggestGhost: false` in afk.config.json.",flags:["on","off"],async handler(e,t){let n=e.getCompositor?.();if(!n)return e.out.warn("Ghost text is not available on this surface."),"continue";if(!n.ghostEngine)return e.out.info(`Ghost text is ${m.dim("disabled")} (set at boot via AFK_SUGGEST_GHOST or interactive.suggestGhost).`),"continue";let r=t.trim().toLowerCase();if(!r){let o=n.ghostPaused?m.dim("paused"):m.brand("on");return e.out.info(`Ghost text: ${o} (session-scoped)`),"continue"}return r==="off"?(n.ghostPaused=!0,n.activeGhost=null,n.repaint(),e.out.success(`Ghost text paused for this session. Run ${m.brand("/ghost on")} to resume.`),"continue"):r==="on"?(n.ghostPaused=!1,n.repaint(),e.out.success("Ghost text resumed."),"continue"):(e.out.warn(`Unknown argument: "${r}". Usage: /ghost [on|off]`),"continue")}}});var qze,ale,lle=y(()=>{"use strict";L();qze=20,ale={name:"/suggestions",usage:"/suggestions [N | rm <index> | clear]",summary:"View or manage saved input history (ghost-text source)",hint:"List recent inputs that feed ghost-text suggestions. `/suggestions rm 3` removes entry #3. `/suggestions clear` wipes all history. Tip: prefix any input with a space to skip history recording.",async handler(e,t){let r=e.getCompositor?.()?.history;if(!r||typeof r.getEntries!="function")return e.out.warn("History is not available on this surface."),"continue";let o=t.trim();if(o==="clear"){if(typeof r.clear!="function")return e.out.warn("History clearing is not supported."),"continue";let c=r.length??0;return c===0?(e.out.info("History is already empty."),"continue"):(r.clear(),e.out.success(`Cleared ${c} history entries (memory + disk).`),"continue")}if(o.startsWith("rm ")){let c=o.slice(3).trim(),u=parseInt(c,10);if(Number.isNaN(u)||u<1)return e.out.warn(`Invalid index: "${c}". Use a number from the /suggestions list.`),"continue";let d=r.getEntries();if(u>d.length)return e.out.warn(`Index ${u} is out of range (${d.length} entries).`),"continue";let p=d.length-u,f=d[u-1];if(typeof r.removeAt!="function")return e.out.warn("History removal is not supported."),"continue";if(r.removeAt(p)){let h=f&&f.length>60?f.slice(0,57)+"...":f;e.out.success(`Removed #${u}: ${m.dim(h??"(unknown)")}`)}else e.out.warn(`Failed to remove entry #${u}.`);return"continue"}let i=o?parseInt(o,10):qze;if(Number.isNaN(i)||i<1)return e.out.warn("Usage: /suggestions [N | rm <index> | clear]"),"continue";let s=r.getEntries();if(s.length===0)return e.out.info("No history entries."),"continue";let a=s.slice(0,i),{out:l}=e;return l.line(),l.line(m.bold("Input history")+m.dim(` (${s.length} total, showing ${a.length} newest)`)),l.line(),a.forEach((c,u)=>{let d=m.meta(`#${u+1}`),p=c.length>80?c.slice(0,77)+"...":c;l.line(` ${d} ${p}`)}),l.line(),l.line(m.dim("Tip: prefix input with a space to skip history recording.")),l.line(),"continue"}}});import{existsSync as FR,readFileSync as cle,writeFileSync as UN}from"node:fs";import{join as qp}from"node:path";import{execFileSync as ule}from"node:child_process";function jN(){try{return ule("git",["rev-parse","--show-toplevel"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return process.cwd()}}function zze(){return{sections:[{name:"Invariants",prefix:"INV",entries:[]},{name:"Explicitly Rejected Patterns",prefix:"REJ",entries:[]},{name:"Taste Calls Made",prefix:"TST",entries:[]}],trailer:""}}function Vze(e){let t=jN(),n=Gd(t);if(!n)return e.out.warn("No SPINE.md found. Run /spine init to bootstrap one."),"continue";for(let r of n.sections){if(e.out.line(m.heading(`## ${r.name}`)),r.entries.length===0)e.out.line(m.meta(" (none)"));else for(let o of r.entries)e.out.line(` ${m.bold(o.id)} ${o.description} ${m.meta(`(${o.date}, ${o.sessionId})`)}`);e.out.line("")}return"continue"}function HN(e){if(!FR(e))return[];let t=cle(e,"utf-8").trim();return t?t.split(`
2045
2045
  `):[]}function Jze(e){let t=qp(ce(),"spine-pending.jsonl"),n=HN(t);if(n.length===0)return e.out.info("No pending SPINE items."),"continue";let r=Gd(jN());e.out.line(m.heading(`## Pending SPINE items (${n.length})`)),e.out.line("");for(let o=0;o<n.length;o++){let i=n[o];try{let s=JSON.parse(i),a=m.warning(`[${s.type}]`),l=typeof s.item.existingId=="string"?s.item.existingId:"",c=typeof s.item.description=="string"?s.item.description:"";if(e.out.line(` ${m.bold(String(o+1))}. ${a} ${l?`${m.bold(l)} `:""}${c}`),s.type==="contradicts"&&l&&r){let u=qd(r,l);u&&e.out.line(m.meta(` current: ${u.description}`))}e.out.line(m.meta(` session ${s.sessionId} ${s.ts}`))}catch{e.out.line(m.meta(` ${o+1}. [unparseable] ${i.slice(0,80)}`))}}return e.out.line(""),e.out.line(m.meta("To resolve: /spine dismiss <N> to remove an item, /spine dismiss-all to clear.")),e.out.line(m.meta("To accept a contradiction: edit SPINE.md directly, then dismiss the item.")),"continue"}async function Yze(e,t){let n=jN(),r=qp(n,"SPINE.md");if(FR(r)&&!t.includes("--force"))return e.out.warn(`SPINE.md already exists at ${r}.
2046
- Use /spine init --force to regenerate.`),"continue";e.out.info("Bootstrapping SPINE.md from codebase artifacts\u2026");let o=[];try{let d=ule("grep",["-rE","--include=*.ts","-h","Invariant:|Contract:",n],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).split(`
2047
- `).map(p=>p.trim()).filter(Boolean).slice(0,20);d.length>0&&o.push("### Discovered invariant/contract comments:",...d,"")}catch{}let i=qp(n,"CHANGELOG.md");if(FR(i))try{let u=cle(i,"utf-8").slice(0,2e3);o.push("### CHANGELOG excerpt:",u,"")}catch{}let s=["docs/adr","adr","docs/decisions"];for(let u of s){let d=qp(n,u);if(FR(d)){o.push(`### ADR directory found: ${u}`);break}}let a=o.length>0?o.join(`
2046
+ Use /spine init --force to regenerate.`),"continue";e.out.info("Bootstrapping SPINE.md from codebase artifacts\u2026");let o=[];try{let d=ule("rg",["--no-filename","-t","ts","-g","*.js","-g","*.mjs","-g","*.md","Invariant:|Contract:|History:",n],{encoding:"utf8",maxBuffer:524288,stdio:["ignore","pipe","ignore"]}).split(`
2047
+ `).map(p=>p.trim().slice(0,200)).filter(Boolean).slice(0,20);d.length>0&&o.push("### Discovered invariant/contract comments:",...d,"")}catch{}let i=qp(n,"CHANGELOG.md");if(FR(i))try{let u=cle(i,"utf-8").slice(0,2e3);o.push("### CHANGELOG excerpt:",u,"")}catch{}let s=["docs/adr","adr","docs/decisions"];for(let u of s){let d=qp(n,u);if(FR(d)){o.push(`### ADR directory found: ${u}`);break}}let a=o.length>0?o.join(`
2048
2048
  `):"(No seed material found \u2014 generating an empty skeleton)";e.out.line(""),e.out.line(m.heading("## SPINE.md Bootstrap")),e.out.line(""),e.out.line("Seed material gathered:"),e.out.line(m.meta(a.slice(0,800))),e.out.line(""),e.out.warn(`SPINE.md init is a guided process \u2014 the model should now review the seed material
2049
2049
  and draft entries. Writing a skeleton now for you to populate.`);let l=zze(),c=KT(l);return UN(r,c,"utf-8"),e.out.success(`Wrote SPINE.md skeleton to ${r}`),e.out.line(m.meta(`Tip: run /spine show to view it, then manually add entries or wait for the
2050
2050
  SessionEnd hook to auto-populate it after your next coding session.`)),"continue"}function Xze(e,t){let n=qp(ce(),"spine-pending.jsonl"),r=HN(n);if(r.length===0)return e.out.info("No pending SPINE items to dismiss."),"continue";let o=parseInt(t,10);return isNaN(o)||o<1||o>r.length?(e.out.warn(`Invalid index: ${t}. Use 1\u2013${r.length} (see /spine pending).`),"continue"):(r.splice(o-1,1),UN(n,r.length>0?r.join(`
@@ -2215,7 +2215,7 @@ ${E}
2215
2215
  ${T}`})}return{fileBlocks:l,warnings:c}}function zce(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function Vce(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();rt();L();Nl();function Jce(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function Yce(e,t){He()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function Xce(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 ${we(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function Qce(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 ${we(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var mA=class{state;writer;ttfb;constructor(t,n){this.state=Jce(),this.writer=t,this.ttfb=n}onToolStart(t){Yce(this.state,t)}onToolResult(t,n){Xce(this.state,t,n,this.writer)}onSubagentEvent(t,n){Qce(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function Zce(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function eue(e){return e.received?{}:{turnStartedAt:e.startedAt}}function tue(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function nue(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 mA(e,n)))}ge();L();var M4e=3e3;async function rue(e,t){if(!e)return t;let n=Date.now();if(n-t<M4e)return t;try{let r=e();r instanceof Promise&&await r}catch(r){ze()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}L();ge();wt();ra();var O4e="Keep waiting \u2014 auto-resume in progress",oue="Switch model / provider (type /model after)",$4e="Stop waiting";async function iue(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}`:O4e,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."),""];$n(r,{header:p,options:[d,oue,$4e],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===oue&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{ze()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{ze()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(Yj({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}px();async function sue(e,t,n,r,o="summary",i,s){let a=nne(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=Zce(l);nue(i,process.stdout,c),pp(process.stdout,Rh(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 H=r.subagentControl;H?.hasPromotableForeground()&&Vce(H,P,r.onQueuedUserMessage).then(({jobs:q,flushedText:W,flushedPreview:K})=>{let Y=(i??{fn:console.log}).fn;for(let ie of q)Y(m.dim(` \u2192 subagent backgrounded as ${ie.jobId}: ${ie.label}`));q.some(ie=>ie.sharesWorktree)&&Y(m.warning("\u26A0 Background child is writing to your worktree \u2014 edits may conflict until it finishes")),W!==void 0&&Y(m.dim(` \u2192 queued message sent to this turn: ${zce(K??W)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,_=()=>new Fp({out:Bp(i),thinkingMode:o,...I?{activeSkillName:I}:{},onCancel:()=>{t.interrupt().catch(H=>{ze()&&console.error(" "+m.error("session.interrupt() failed:"),H)})},...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}:{},...eue(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),M=_();r.bashTailSetter&&(r.bashTailSetter.current=(H,q)=>M.setBashOutputTail(H,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 H=M.getCompositor();if(i&&H){let q=H;i.fn=W=>q.commitAbove(W),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(H),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(X=>{ze()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),X)});let j=r.subagentControl;j?.hasActiveForeground()&&j.cancelActiveForeground().catch(X=>{ze()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),X)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{v=!0,t.interrupt().catch(j=>{ze()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),j)})}),await O(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A),r.setTaskViewHandler?.(jce(r));let{fileBlocks:H,warnings:q}=qce(e.text,{rootDir:process.cwd()});for(let j of q)(i??{fn:console.log}).fn(m.dim(` @-file: ${j}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let W=H.length>0||e.attachments.length>0?await Gce(e.text,e.attachments,void 0,H,t.sessionId):e.text,K=t.sendMessageStream(W);await Xu((j,X)=>{M.process(j,X),X&&c.plainHooks?.onSubagentEvent(j,X)},async()=>{for await(let j of K){if(S||v)break;let X=tue(c,j,f);if(j.type==="chunk"&&j.chunk.type==="content"?(u=p?Bce(u,j.chunk.content):u+j.chunk.content,p=!1,f=!0,r.onTextDelta?.(j.chunk.content.length)):j.type==="message"&&!f&&(u=j.message.content),j.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),j.type==="chunk"&&j.chunk.type==="tool_use_detail"){let le=j.chunk,Z={toolName:le.toolName,toolUseId:le.toolUseId,input:le.toolInput,...le.toolInputRaw!==void 0&&{inputRaw:le.toolInputRaw}};C.set(le.toolUseId,Z),x.push(Z),c.plainHooks?.onToolStart(le)}else if(j.type==="chunk"&&j.chunk.type==="tool_result"){let le=j.chunk;d=u.length,p=!0;let Z=C.get(le.toolUseId);Z&&(Z.result=le.content,Z.isError=le.isError,C.delete(le.toolUseId)),c.plainHooks?.onToolResult(le,Z?.toolName),T=await rue(r.onContextProgress,T)}if(j.type==="paused"){await iue({event:j,session:t,borrowedCompositor:P,pickerRef:E,completionWriter:i,disposeRendererOnce:N,setPausedState:r.setPausedState,onPauseInterrupt:()=>{v=!0}});continue}if(j.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let le=j.hotSwapped&&j.accountId?`\u25B6 Resumed on ${j.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(le));continue}if(j.type==="error"){await N(),ru(Vc(j.error)),g=!0;continue}M.process(j),X&&(c.plainHooks?.onFirstContent(process.stdout),M.notifyFirstContent()),j.type==="done"&&(b=!0,w=j.metadata)}});let ie=!1;if(b&&!S&&!v){let j=Fce(M.getPendingBuffer());j>=0?M.stripPendingTerminalState(j):ky(u)!==null&&(ie=!0)}await N();let $=i?i.fn:console.log;if(S){let j=P?P.getPendingCount():0,X=j>0?` \xB7 ${j} queued`:"";$(m.warning(`\u23F8 Stopped${X} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),$("")}if(v&&($(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")),b&&!S&&!v){Kl(n,a,u,w,x),await r.onTurnComplete?.(a,u).catch(()=>{}),dp(process.stdout),cee(process.stdout,"afk: turn complete");let j=le=>{i?i.fn(le):console.log(le)},X=ky(u);if(X&&!ie){j(Uce(X,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:x.length})),j("");let le=cN(x),Z=Pie(x);if(r.onTerminalState)try{r.onTerminalState(X,{doneHasCorroboratingEvidence:Z,doneEvidenceClassification:le})}catch{}if(n.permissionMode==="autonomous"){let Me=X.kind==="done"&&Uf().verifyDone===!0&&!Z;Mie(X,void 0,{unverified:Me})}}if(yB(w,n,j),bB(j,process.stdout),r.onAfterTurn){let le=r.onAfterTurn();le instanceof Promise&&await le.catch(()=>{})}}}catch(H){await N(),g||ru(Vc(H))}finally{await N(),pp(process.stdout,Rh(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?.()}}qs();Um();var fA=class{onRepaint;running=!1;smoothedRate=null;lastSampleMs=null;pendingChars=0;lastRepaintMs=0;constructor(t){this.onRepaint=t}start(){this.running=!0,this.smoothedRate=null,this.lastSampleMs=null,this.pendingChars=0,this.lastRepaintMs=0}update(t){if(!this.running||t<=0)return;this.pendingChars+=t;let n=Date.now();if(this.lastSampleMs===null){this.lastSampleMs=n;return}let r=n-this.lastSampleMs;if(r<50)return;if(r>3e3){this.lastSampleMs=n,this.pendingChars=0;return}let o=this.pendingChars/4/r*1e3;this.smoothedRate=this.smoothedRate===null?o:.25*o+(1-.25)*this.smoothedRate,this.lastSampleMs=n,this.pendingChars=0,this.onRepaint&&n-this.lastRepaintMs>=300&&(this.lastRepaintMs=n,this.onRepaint(this.smoothedRate))}getCurrentRate(){return this.running?this.smoothedRate:null}stop(){this.running=!1,this.smoothedRate=null,this.lastSampleMs=null,this.pendingChars=0,this.lastRepaintMs=0,this.onRepaint?.(null)}};L();async function aue(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)))}}}var D4e=5e3,L4e=3,F4e="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function lue(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 _=>{ze()&&(h=gR(_)),await ty(e.session.current),ze()&&(b=IF())}).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>=L4e||!o.isAwaitingInput()||!o.bufferIsEmpty()||(P++,dp(process.stdout),w={text:F4e,attachments:[]},o.abortPendingRead())};;){if(P=0,h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let $ of b)e.replRenderer.writeLine($);e.replRenderer.writeLine(""),b=[]}let _=f.drainNotifications();for(let{job:$,result:j}of _){let X=j.errorReason===void 0?"\u2713":"\u2717",le=j.errorReason==="abort"?"killed":j.errorReason==="timeout"?"timed out":j.errorReason==="signal-killed"?"killed by signal":`exit ${j.exitCode??0}`,Z=Math.max(0,Math.round(j.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${X} [${$.id}] ${le} \xB7 ${Z}s \xB7 `)+$.command)}let M=g.drainNotifications();for(let{job:$}of M){let j=$.status==="completed"?"\u2713":$.status==="failed"?"\u2717":"\u2298",X=$.endedAt!==void 0?Math.max(0,Math.round(($.endedAt-$.startedAt)/100)/10):0,le=ee($.label,60);e.replRenderer.writeLine(m.dim(` ${j} [${$.jobId}] subagent ${$.status} \xB7 ${X}s \xB7 `)+le)}let N=l.renderIfChanged(e.stats.sessionId);if(N.length>0){for(let $ of N)e.replRenderer.writeLine($);e.replRenderer.writeLine("")}let O,H;if(w===void 0){let $=await e.session.current.takePendingPlanExitSeed();$!==void 0&&(e.stats.permissionMode=$.mode,w={text:$.message,attachments:[]})}if(w!==void 0){let $=w;w=void 0;let j=Jp(e.stats.permissionMode),X=Yl({buffer:$.text,promptText:j,isTTY:!!process.stdout.isTTY,attachmentSummary:Tp([...$.attachments])});e.replRenderer.writeLine(X),O=$.text.trim(),H=$.attachments}else{let $=S;S=void 0;let j=await o.readLine({promptFn:()=>Jp(e.stats.permissionMode),...$!==void 0?{initialBuffer:$}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{sA(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});O=j.text.trim(),H=j.attachments}if(!O&&H.length===0)continue;if(O.startsWith("!")){let $=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!$&&(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 $=await QD(O,e.slashCtx,H);if($.handled){if($.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),$.result!==null&&typeof $.result=="object"&&"kind"in $.result&&$.result.kind==="submit"){w={text:$.result.message,attachments:H??[]},e.statusLine.rearm();continue}if($.result!==null&&typeof $.result=="object"&&"kind"in $.result&&$.result.kind==="prefill"){S=$.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}q=!0}a.push(O),await aue(e,O);let W=O;if(q){let $=$E(O);if($){let j=$.name.replace(/^\//,"").split(":").pop()??"";if(j&&jx(j)){let X={skillName:j,rawArgs:$.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},le=e.session.current.sessionId,Z=ta(le),Me=Date.now();U(`[afk trace] preflight.start commandName=${j}`);let Ve=!1,Xo=await ea(X,{cwd:e.stats.cwd??process.cwd(),artifactDir:Z},Ge=>{ze()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${j}) failed: `)+(Ge instanceof Error?Ge.message:String(Ge)))});Ve=Xo!==null,U(`[afk trace] preflight.end commandName=${j} durationMs=${Date.now()-Me} success=${Ve}`),W=Hx(Xo?.manifestBlock,O)}}}let K=f.drainInjections();K.length>0&&(W=K+W);let Y=g.drainInjections();if(Y.length>0&&(W=Y+W),T!==void 0&&(W=T+`
2216
2216
 
2217
2217
  `+W,T=void 0),e.hookRegistry)try{let $={event:"UserPromptSubmit",prompt:W,sessionId:e.stats.sessionId},j=await e.hookRegistry.dispatch($);j.injectContext&&(W=j.injectContext+W)}catch($){if($ instanceof Ce){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+($.reason?m.dim(`: ${se($.reason)}`):"")),e.statusLine.rearm();continue}if($ instanceof yo){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${$.timeoutMs}ms`)),e.statusLine.rearm();continue}throw $}x=C=I=void 0,r1(),a1();let ie=new fA($=>{e.statusLine.repaint({...Xn(e.stats,e.contextSampler,e.gitStatusSampler,A),tokPerSec:$??void 0})});if(ie.start(),await sue({text:W,attachments:H},e.session.current,e.stats,{setInFlight($){n.turnInFlight=$},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage($){await t.appendUser($)},async onQueuedUserMessage($){await t.appendQueuedUser($)},async onTurnComplete($,j){if(await t.appendTurn($,j),e.stats.sessionId)try{Gs(e.stats)}catch(X){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(X instanceof Error?X.message:String(X))))}},async onAfterTurn(){ie.stop(),await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(Xn(e.stats,e.contextSampler,e.gitStatusSampler,A)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:($,j)=>{p?.push($),x=$.kind,C=j?.doneHasCorroboratingEvidence,I=j?.doneEvidenceClassification},setActiveCompositor:$=>{n.activeCompositor=$,$===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:$=>{n.notifyInterrupting=$},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:$=>o.setBackgroundHandler($),setTaskViewHandler:$=>o.setTaskViewHandler($),setSoftStopHandler:i,setPausedState:$=>o.setPausedState($),setPauseInterruptHandler:$=>o.setPauseInterruptHandler($),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Xn(e.stats,e.contextSampler,e.gitStatusSampler,A)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:($,j)=>{c.repaint($),u?.onStage($,j)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{},bashTailSetter:e.bashTailSetter,onTextDelta:$=>ie.update($)},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Jp(e.stats.permissionMode))),e.hookRegistry)try{let $=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,D4e);$.injectContext&&$.injectContext.trim().length>0&&(T=$.injectContext)}catch($){if($ instanceof jt)throw $;$ instanceof yo?(U("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):$ instanceof Ce?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${se($.reason??"no reason given")}`)):U("[stop hook] unexpected error: "+String($))}}}function N4e(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 cue(e,t,n,r){let o=await Xle(),i=new iA({rl:e.rl,history:o,statusLine:e.statusLine}),s=N4e(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await wce(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=Lce(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 lue(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)}}Mf();Fu();import{execFile as B4e}from"node:child_process";import{dirname as U4e,isAbsolute as j4e,resolve as H4e}from"node:path";import{promisify as W4e}from"node:util";var uue=W4e(B4e),K4e=3e3,G4e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function q4e(){let t=(await uue("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=j4e(t)?t:H4e(process.cwd(),t);return U4e(n)}async function due(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await q4e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),K4e)});try{let o=pr({execFile:uue,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=>G4e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Vm();Mf();import{promises as z4e}from"node:fs";import{dirname as V4e,join as fue}from"node:path";import{randomBytes as J4e}from"node:crypto";var Y4e=["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(`
2218
- `),pue=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,SB=30,X4e=1024,Q4e=8e3,Z4e="haiku";async function eYe(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=oYe(n,X4e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Q4e),s=t.signal?iYe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Yi({token:t.token,model:t.model??Z4e,system:Y4e,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=tYe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=V4e(t.worktreePath);return await nYe(l,c)}function tYe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(pue.test(t)&&t.length<=SB)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>SB)break;o=s}return pue.test(o)?o:null}async function nYe(e,t){if(!await rYe(fue(t,e)))return e;let n=J4e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,SB-5)}-${n}`}async function rYe(e){try{return await z4e.access(e),!0}catch{return!1}}function oYe(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 iYe(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 gue(e){let t,n,r=fue(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await eYe(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=`${oS(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return mue(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 mue(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 mue(e,t){e&&e.setCwd(t),sYe(t)}function sYe(e){try{process.chdir(e)}catch{}}yt();Tt();qc();Go();B();import{spawn as yue}from"child_process";import{existsSync as bue,mkdirSync as dYe,readFileSync as wue,unlinkSync as hue,writeFileSync as Sue}from"fs";import{get as pYe}from"https";import{join as vue}from"path";import{readFileSync as aYe}from"fs";import{dirname as lYe,join as cYe}from"path";import{fileURLToPath as uYe}from"url";function Qn(){try{return"5.213.1"}catch{}try{let e=lYe(uYe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(aYe(cYe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var mYe=64*1024,fYe=10800*1e3,gYe=800,hYe=3600*1e3,yYe="update-check.json",bYe="pending-update.json";function vB(){return vue(Ta(),yYe)}function Ty(){return vue(Ta(),bYe)}function kB(){let e=Ta();bue(e)||dYe(e,{recursive:!0})}function kue(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 Tue(){try{let e=wue(vB(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Eue(){try{kB();let e=`
2218
+ `),pue=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,SB=30,X4e=1024,Q4e=8e3,Z4e="haiku";async function eYe(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=oYe(n,X4e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Q4e),s=t.signal?iYe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Yi({token:t.token,model:t.model??Z4e,system:Y4e,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=tYe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=V4e(t.worktreePath);return await nYe(l,c)}function tYe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(pue.test(t)&&t.length<=SB)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>SB)break;o=s}return pue.test(o)?o:null}async function nYe(e,t){if(!await rYe(fue(t,e)))return e;let n=J4e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,SB-5)}-${n}`}async function rYe(e){try{return await z4e.access(e),!0}catch{return!1}}function oYe(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 iYe(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 gue(e){let t,n,r=fue(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await eYe(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=`${oS(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return mue(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 mue(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 mue(e,t){e&&e.setCwd(t),sYe(t)}function sYe(e){try{process.chdir(e)}catch{}}yt();Tt();qc();Go();B();import{spawn as yue}from"child_process";import{existsSync as bue,mkdirSync as dYe,readFileSync as wue,unlinkSync as hue,writeFileSync as Sue}from"fs";import{get as pYe}from"https";import{join as vue}from"path";import{readFileSync as aYe}from"fs";import{dirname as lYe,join as cYe}from"path";import{fileURLToPath as uYe}from"url";function Qn(){try{return"5.213.2"}catch{}try{let e=lYe(uYe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(aYe(cYe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var mYe=64*1024,fYe=10800*1e3,gYe=800,hYe=3600*1e3,yYe="update-check.json",bYe="pending-update.json";function vB(){return vue(Ta(),yYe)}function Ty(){return vue(Ta(),bYe)}function kB(){let e=Ta();bue(e)||dYe(e,{recursive:!0})}function kue(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 Tue(){try{let e=wue(vB(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Eue(){try{kB();let e=`
2219
2219
  const https = require('https');
2220
2220
  const fs = require('fs');
2221
2221
  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 j1,um=m(()=>{"use strict";j1=new Set(["script","style","noscript","template","svg"])});function K1(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 G1(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??K1,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(!W1.has(u.status)||d===o)return u;let p=G1(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 W1,W_=m(()=>{"use strict";Q();W1=new Set([429,502,503,504])});import{BlockList as q1,isIP as fm}from"node:net";import{lookup as X1}from"node:dns/promises";import{Agent as z1}from"undici";function G_(){let t=w.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function Q1(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function pm(t){let e=fm(t);return e===0?!1:Y1.check(t,e===4?"ipv4":"ipv6")}async function q_(t){return X1(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=Q1(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 an(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:Z1}:{}},c=await H_(t,s,a,r.retry??{});if(!eK.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 J1,V1,Y1,ve,Z1,K_,eK,Vn=m(()=>{"use strict";P();W_();J1=[["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]],V1=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Y1=(()=>{let t=new q1;for(let[e,n]of J1)t.addSubnet(e,n,"ipv4");for(let[e,n]of V1)t.addSubnet(e,n,"ipv6");return t})(),ve=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};Z1=new z1({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,eK=new Set([301,302,303,307,308])});var gm={};qo(gm,{enforceDomainPolicy:()=>ft,loadBrowserConfig:()=>mm});import{readFileSync as tK}from"node:fs";import{join as nK}from"path";function rK(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function X_(t,e){return rK(e).test(t)}function iK(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(oK.has(e))return!0;if(sK.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 aK(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 cK(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function lK(t){try{return tK(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function dK(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??lK,r=t?.surface??e.AGENT_SURFACE,o=iK(e.AFK_BROWSER_HEADLESS,r),s=z_(e.AFK_BROWSER_ALLOWED_DOMAINS),i=z_(e.AFK_BROWSER_BLOCKED_DOMAINS),a=cK(e.AFK_BROWSER_DOM_SNAPSHOTS),c=aK(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():nK(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=dK(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 oK,sK,cn=m(()=>{"use strict";P();M();oK=new Set(["daemon","subagent","telegram","afk"]),sK=new Set(["repl","interactive","cli"])});import{readFileSync as uK}from"node:fs";import{join as pK}from"node:path";import{homedir as fK}from"node:os";function gK(t){let e=t??mK,n;try{n=uK(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 hK(t){try{return process.kill(t,0),!0}catch{return!1}}async function yK(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=gK(t);return e===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:hK(e.pid)?await yK(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 mK,V_=m(()=>{"use strict";mK=pK(fK(),".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&&bK.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 bK,Q_=m(()=>{"use strict";V_();bK=new Set(["daemon","subagent"])});import{createHash as wK}from"crypto";function Z_(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&SK.test(t.label))}function eT(t){return wK("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 SK,Hc=m(()=>{"use strict";SK=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as kK}from"crypto";import{mkdir as vK,stat as _K,writeFile as TK}from"fs/promises";import{join as ym}from"path";import{gzip as EK}from"zlib";import{promisify as AK}from"util";function xK(t){return ym(gt(t),"browser")}function RK(t){return ym(xK(t),"screenshots")}function IK(){return new Date().toISOString().replace(/[:.]/g,"-")}function CK(){return kK(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=RK(t);await vK(r,{recursive:!0});let o=`${IK()}-${CK()}-${n}.png`,s=ym(r,o);await TK(s,e);let{size:i}=await _K(s);return{path:s,bytes:i}}var die,nT,bm=m(()=>{"use strict";M();Hc();die=AK(EK);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";cn()});var aT={};qo(aT,{AgentBrowserProvider:()=>km});var km,cT=m(()=>{"use strict";cn();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 PK,readFileSync as MK}from"node:fs";import{createRequire as OK}from"node:module";import{dirname as DK,join as FK}from"node:path";function uT(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<NK&&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 UK(){try{let e=OK(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(MK(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=FK(DK(e),o);return PK(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function Ks(){return lT??=UK()??LK,lT}function vm(t){return t.includes("install chromium")}function nt(t,e){let n=uT(t),r=e?.latched===!0?` ${$K}`:"";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,LK,NK,lT,$K,_m=m(()=>{"use strict";dT=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],LK="pnpm exec playwright install chromium",NK=4;$K="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 BK}from"node:crypto";function jK(){try{return"5.213.1"}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 HK,qc,pT=m(()=>{"use strict";_m();M();Q();HK=jK(),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/${HK}`}}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}.${BK(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 WK}from"node:crypto";function KK(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function GK(t,e,n){return`el_${WK("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function qK(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 XK(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 zK(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 JK(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=JK(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=XK(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 zK(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=GK(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 Rn={id:U,role:N,label:KK(O),kind:$,value:q,state:K,bbox:L};return ne!==void 0&&(Rn.selector=ne),Rn}),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=qK(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 VK(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 YK(t,e,n);case"selector":return QK(t,e);case"semantic":return ZK(t,e)}}async function YK(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 QK(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 ZK(t,e){return e.role!==void 0?eG(t,e.text,e.role):tG(t,e.text,e)}async function eG(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 tG(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 VK(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";cn()});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();cn();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:()=>aG,browserProviderActive:()=>oG,closeBrowserProvider:()=>Pm,getBrowserProvider:()=>rG,getLastRoutingDecision:()=>iG,peekBrowserProvider:()=>sG});function vT(){Promise.resolve(Pm()).then(()=>{process.exit(130)})}function _T(){Promise.resolve(Pm()).then(()=>{process.exit(143)})}function TT(){Et=null}function nG(){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 rG(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 nG(),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 oG(){return Et!==null}function sG(){return Et}function iG(){return Cm}function aG(){Et=null,Qn=null,Cm=null,ET()}var Et,Qn,zc,Cm,er=m(()=>{"use strict";cn();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 fG(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(()=>(cn(),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??fG,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await an(n,t,{headers:pG,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(uG.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(dG.test(p)&&!lG.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 lG,dG,uG,pG,RT=m(()=>{"use strict";$_();um();Vn();Q();lG=/(text\/html|application\/xhtml\+xml)/i,dG=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uG=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,pG={"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 hG(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(mG,{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),gG),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()!==""?hG({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,LK,NK,lT,$K,_m=m(()=>{"use strict";dT=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],LK="pnpm exec playwright install chromium",NK=4;$K="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 BK}from"node:crypto";function jK(){try{return"5.213.2"}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 HK,qc,pT=m(()=>{"use strict";_m();M();Q();HK=jK(),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/${HK}`}}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}.${BK(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 WK}from"node:crypto";function KK(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function GK(t,e,n){return`el_${WK("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function qK(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 XK(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 zK(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 JK(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=JK(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=XK(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 zK(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=GK(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 Rn={id:U,role:N,label:KK(O),kind:$,value:q,state:K,bbox:L};return ne!==void 0&&(Rn.selector=ne),Rn}),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=qK(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 VK(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 YK(t,e,n);case"selector":return QK(t,e);case"semantic":return ZK(t,e)}}async function YK(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 QK(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 ZK(t,e){return e.role!==void 0?eG(t,e.text,e.role):tG(t,e.text,e)}async function eG(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 tG(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 VK(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";cn()});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();cn();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:()=>aG,browserProviderActive:()=>oG,closeBrowserProvider:()=>Pm,getBrowserProvider:()=>rG,getLastRoutingDecision:()=>iG,peekBrowserProvider:()=>sG});function vT(){Promise.resolve(Pm()).then(()=>{process.exit(130)})}function _T(){Promise.resolve(Pm()).then(()=>{process.exit(143)})}function TT(){Et=null}function nG(){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 rG(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 nG(),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 oG(){return Et!==null}function sG(){return Et}function iG(){return Cm}function aG(){Et=null,Qn=null,Cm=null,ET()}var Et,Qn,zc,Cm,er=m(()=>{"use strict";cn();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 fG(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(()=>(cn(),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??fG,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await an(n,t,{headers:pG,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(uG.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(dG.test(p)&&!lG.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 lG,dG,uG,pG,RT=m(()=>{"use strict";$_();um();Vn();Q();lG=/(text\/html|application\/xhtml\+xml)/i,dG=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uG=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,pG={"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 hG(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(mG,{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),gG),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()!==""?hG({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 mG,gG,PT=m(()=>{"use strict";Qe();mG="https://api.exa.ai/search",gG=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 vG(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=yG;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,bG)}let a=wG;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,SG)}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 _G(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=vG(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 an(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:kG,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 yG,bG,wG,SG,kG,MT,OT=m(()=>{"use strict";RT();PT();Vn();vt();um();tr();yG=3e4,bG=12e4,wG=1e5,SG=1e6,kG=10;MT=_G()});function AG(t){return TG.has(t)?"low":t==="DELETE"?"high":"medium"}function xG(t){return EG.has(t)}function CG(t){let e={};return t.forEach((n,r)=>{let o=r.toLowerCase();IG.has(o)||RG.some(s=>o.startsWith(s))||(e[r]=n)}),e}function PG(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 MG(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=AG(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}=PG(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=xG(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},b=Date.now(),S;try{S=await an(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}=MG(E,_,i),F=CG(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,TG,EG,RG,IG,UT=m(()=>{"use strict";Vn();vt();DT=3e4,FT=12e4,Om=1e5,Dm=1e6,TG=new Set(["GET","HEAD","OPTIONS"]),EG=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);RG=["set-cookie","x-"],IG=new Set(["server","via","age","vary","authorization","www-authenticate"])});function OG(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 DG(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(()=>(cn(),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=OG(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();Mn();$T=DG()});import{existsSync as HT,mkdirSync as FG,readFileSync as LG,renameSync as NG,unlinkSync as UG,writeFileSync as $G}from"node:fs";import{dirname as jT,join as BG}from"node:path";import{randomBytes as jG}from"node:crypto";function nr(t){let e=t??fp();if(!HT(e))return[];try{let n=LG(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();FG(jT(n),{recursive:!0});let r=BG(jT(n),`.schedules.json.${process.pid}.${jG(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{$G(r,o,"utf-8"),NG(r,n)}catch(s){try{HT(r)&&UG(r)}catch{}throw s}}function WT(t,e){let n=nr(e),r=n.map(c=>c.id),o=HG(t.name),s=WG(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 HG(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function WG(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 KG,readFileSync as GG}from"node:fs";import{join as qG}from"node:path";async function zr(t,e,n){let r,o;try{let s=qG(aw("default"),"port");if(!KG(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=GG(s,"utf-8").trim(),a=XG(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 XG(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 zG}from"node:fs";import{readFile as JG}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(!zG(s))return{content:JSON.stringify([])};let i;try{let l=await JG(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
package/dist/telegram.mjs CHANGED
@@ -395,7 +395,7 @@ ${o}`,paths:[e,n]}:o!==null?s={content:o,paths:[n]}:r!==null?s={content:r,paths:
395
395
 
396
396
  ${e}`}var pV,ty=h(()=>{"use strict";pV=new Set(["script","style","noscript","template","svg"])});function gV(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 sR(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function hV(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 iR(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??gV,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(!mV.has(u.status)||d===o)return u;let p=hV(u,i)??sR(d,s,i);O("[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=sR(d,s,i);O("[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 mV,aR=h(()=>{"use strict";se();mV=new Set([429,502,503,504])});import{BlockList as yV,isIP as ry}from"node:net";import{lookup as bV}from"node:dns/promises";import{Agent as wV}from"undici";function lR(){let t=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function TV(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function ny(t){let e=ry(t);return e===0?!1:vV.check(t,e===4?"ipv4":"ipv6")}async function dR(t){return bV(t,{all:!0,verbatim:!0})}async function Nr(t,e={}){if(e.allowPrivateHosts??lR())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=TV(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(ry(r)!==0)return ny(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??dR,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(ny(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function ra(t,e={}){let n=await Nr(t,e);if(!n.allowed)throw new Ce(n.reason)}async function Un(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<=cR;i++){await ra(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??lR())?{dispatcher:EV}:{}},c=await iR(t,s,a,r.retry??{});if(!_V.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 Ce(`too many redirects (>${cR}) starting from ${e}`)}var SV,kV,vV,Ce,EV,cR,_V,$r=h(()=>{"use strict";F();aR();SV=[["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]],kV=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],vV=(()=>{let t=new yV;for(let[e,n]of SV)t.addSubnet(e,n,"ipv4");for(let[e,n]of kV)t.addSubnet(e,n,"ipv6");return t})(),Ce=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};EV=new wV({connect:{lookup(t,e,n){dR(t).then(r=>{let o=r.find(i=>ny(i.address));if(o!==void 0){n(new Ce(`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,ry(s.address))},r=>n(r,"",0))}}});cR=20,_V=new Set([301,302,303,307,308])});var sy={};yo(sy,{enforceDomainPolicy:()=>It,loadBrowserConfig:()=>oy});import{readFileSync as xV}from"node:fs";import{join as AV}from"path";function RV(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function uR(t,e){return RV(e).test(t)}function PV(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(IV.has(e))return!0;if(CV.has(e))return!1}return!1}function pR(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function MV(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 fR(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Hm(e),e}function OV(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function DV(t){try{return xV(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function FV(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=fR(e.defaultProfile)),n}function oy(t){let e=t?.env??k,n=t?.readFileSync??DV,r=t?.surface??e.AGENT_SURFACE,o=PV(e.AFK_BROWSER_HEADLESS,r),s=pR(e.AFK_BROWSER_ALLOWED_DOMAINS),i=pR(e.AFK_BROWSER_BLOCKED_DOMAINS),a=OV(e.AFK_BROWSER_DOM_SNAPSHOTS),c=MV(e.AFK_BROWSER_BACKEND),l=fR(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():AV(sn(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=FV(d,m);return g.configPath=p,g}function It(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(uR(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>uR(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var IV,CV,Bn=h(()=>{"use strict";F();L();IV=new Set(["daemon","subagent","telegram","afk"]),CV=new Set(["repl","interactive","cli"])});import{readFileSync as LV}from"node:fs";import{join as NV}from"node:path";import{homedir as $V}from"node:os";function BV(t){let e=t??UV,n;try{n=LV(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 jV(t){try{return process.kill(t,0),!0}catch{return!1}}async function HV(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 iy(t){let e=BV(t);return e===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:jV(e.pid)?await HV(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 UV,mR=h(()=>{"use strict";UV=NV($V(),".config","agent-browser","connection.json")});async function gR(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 iy(),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&&WV.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 iy(),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 WV,hR=h(()=>{"use strict";mR();WV=new Set(["daemon","subagent"])});import{createHash as KV}from"crypto";function yR(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&qV.test(t.label))}function bR(t){return KV("sha256").update(t,"utf8").digest("hex").slice(0,8)}function wR(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var qV,Nd=h(()=>{"use strict";qV=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as GV}from"crypto";import{mkdir as XV,stat as zV,writeFile as JV}from"fs/promises";import{join as ay}from"path";import{gzip as VV}from"zlib";import{promisify as YV}from"util";function QV(t){return ay(it(t),"browser")}function ZV(t){return ay(QV(t),"screenshots")}function e4(){return new Date().toISOString().replace(/[:.]/g,"-")}function t4(){return GV(3).toString("hex")}async function Yo(t,e,n){if(e.length>SR)throw new Error(`writeScreenshotSidecar: buffer exceeds ${SR} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=ZV(t);await XV(r,{recursive:!0});let o=`${e4()}-${t4()}-${n}.png`,s=ay(r,o);await JV(s,e);let{size:i}=await zV(s);return{path:s,bytes:i}}var lwe,SR,cy=h(()=>{"use strict";L();Nd();lwe=YV(VV);SR=5*1024*1024});var $d,kR=h(()=>{"use strict";se();$d=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=>{O("[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 ly(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 vR(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 dy(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 TR(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(ly)};let s=r[0].id;await dy(t.client,t.tabId,e.action,s,e.value,e.timeoutMs);let i=await t.client.read(t.tabId,{mode:"main"}),a=It(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 ER=h(()=>{"use strict";Bn()});var _R={};yo(_R,{AgentBrowserProvider:()=>uy});var uy,xR=h(()=>{"use strict";Bn();cy();kR();ER();uy=class{name="agent-browser";config;client;sessions=new Map;constructor(e,n){this.config=e,this.client=new $d(n)}async open(e){let n=It(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=It(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=vR(n.knownElements,e.target);if(r===null){if(e.target.kind==="semantic"){let i=await TR({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 dy(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=It(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 Yo(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(ly),l=o??80,d=c.slice(0,l);e.observationCounter+=1,e.knownElements=new Map(d.map(g=>[g.id,g])),e.currentUrl=i.url,e.currentTitle=i.title;let u=[];c.length>l&&u.push(`page has ${c.length} interactive elements; showing first ${l}`);let p=null;if(r)try{let g=await this.client.screenshot(e.tabId),y=Buffer.from(g.data,"base64");p=(await Yo(n,y,s)).path}catch{u.push("screenshot capture failed")}let f=`obs_${e.observationCounter.toString(36)}`,m={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:i.url,title:i.title,textSummary:i.content.slice(0,4e3),interactive:d,status:m,warnings:u,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as n4,readFileSync as r4}from"node:fs";import{createRequire as o4}from"node:module";import{dirname as s4,join as i4}from"node:path";function IR(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<c4&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function ze(t){let e=IR(t);return RR.some(n=>e.includes(n))}function l4(){try{let e=o4(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(r4(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=i4(s4(e),o);return n4(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function oa(){return AR??=l4()??a4,AR}function py(t){return t.includes("install chromium")}function gt(t,e){let n=IR(t),r=e?.latched===!0?` ${d4}`:"";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: ${oa()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${oa()}). Or pick a different tool.${r}`}function Ud(t,e,n=!1){if(!ze(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
397
397
 
398
- ${gt(t,{headless:e,latched:n})}`,{cause:t})}var RR,a4,c4,AR,d4,fy=h(()=>{"use strict";RR=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],a4="pnpm exec playwright install chromium",c4=4;d4="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 Ur from"node:fs";import Bd from"node:path";import{randomBytes as u4}from"node:crypto";function p4(){try{return"5.213.1"}catch{}try{let t=Bd.resolve(import.meta.dirname,"../../../package.json"),e=Ur.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var f4,jd,CR=h(()=>{"use strict";fy();L();se();f4=p4(),jd=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=Ud(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=Ud(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/${f4}`}}loadStorageState(e){let n=Wm(e);try{if(!Ur.existsSync(n))return;let r=JSON.parse(Ur.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Wm(e);if(!Ur.existsSync(r))return;let o=await n.storageState(),s=Bd.join(Bd.dirname(r),`.${Bd.basename(r)}.${process.pid}.${u4(4).toString("hex")}.tmp`);Ur.writeFileSync(s,JSON.stringify(o),{mode:384}),Ur.chmodSync(s,384),Ur.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as m4}from"node:crypto";function g4(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function h4(t,e,n){return`el_${m4("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function y4(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function PR(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function OR(t,e){let n=t.role??"",r=t.name??"";MR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])OR(s,e)}async function b4(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},DR).catch(()=>[])}async function w4(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},DR).catch(()=>[])}function S4(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Hd(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=S4(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=b4(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],OR(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await w4(t)).filter(P=>MR.has(P.role??"")));let w=new Map;for(let E of p){let P=PR(E.name),H=w.get(P);(!H||H.bbox.w===0&&E.bbox.w>0)&&w.set(P,E)}let v=y.map(E=>({ax:E,dom:w.get(PR(E.name??""))})),x=r?v:v.filter(E=>E.dom?E.dom.bbox.w>0||E.dom.bbox.h>0:!0);x.sort((E,P)=>{let H=E.dom?.bbox.y??0,M=P.dom?.bbox.y??0;if(H!==M)return H-M;let $=E.dom?.bbox.x??0,U=P.dom?.bbox.x??0;return $-U}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=x.slice(0,n).map((E,P)=>{let H=E.ax.role??"generic",M=E.ax.name??"",$=h4(H,M,P),U=E.dom?.bbox??{x:0,y:0,w:0,h:0},B=E.dom?.type??null,j=null;E.ax.value!==void 0&&E.ax.value!==null&&(j=String(E.ax.value)),E.ax.checked!==void 0&&(j=String(E.ax.checked)),yR({role:H,kind:B})&&(j="[redacted]");let K={disabled:E.ax.disabled??!1};E.ax.checked!==void 0&&(K.checked=E.ax.checked===!0||E.ax.checked==="mixed"),E.ax.selected!==void 0&&(K.selected=E.ax.selected),E.ax.expanded!==void 0&&(K.expanded=E.ax.expanded);let Y;E.dom?.testId?Y=`[data-testid="${E.dom.testId}"]`:E.dom?.id&&(Y=`#${E.dom.id}`);let Ft={id:$,role:H,label:g4(M),kind:B,value:j,state:K,bbox:U};return Y!==void 0&&(Ft.selector=Y),Ft}),I="idle";try{let E=await t.evaluate(()=>document.readyState);E==="loading"?I="loading":E==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=y4(f),T=`obs_${e.observationCounter.toString(36)}`,R=new Date().toISOString();return{observationId:T,url:m,title:g,textSummary:C,interactive:_,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:R}}var MR,DR,FR=h(()=>{"use strict";Nd();MR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);DR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function LR(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 my(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>LR(t,s)))).filter(o=>o!==null)}async function k4(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 gy(t,e,n){switch(e.kind){case"element_id":return v4(t,e,n);case"selector":return T4(t,e);case"semantic":return E4(t,e)}}async function v4(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 my(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function T4(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 my(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function E4(t,e){return e.role!==void 0?_4(t,e.text,e.role):x4(t,e.text,e)}async function _4(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 my(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function x4(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 k4(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let b=await LR(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${g}`,v=0;for(let x=0;x<w.length;x++)v=v*31+w.charCodeAt(x)>>>0;f.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var NR=h(()=>{"use strict"});async function hy(t,e,n,r){let o=t.url();if(o===n)return null;let s=It(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 $R=h(()=>{"use strict";Bn()});var by={};yo(by,{PlaywrightProvider:()=>yy});function UR(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 yy,wy=h(()=>{"use strict";CR();FR();NR();Bn();$R();cy();yy=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new jd(e)}async open(e){let n=It(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 hy(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 Hd(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 Hd(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 gy(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${UR(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){l=y}else l=g}let u=await hy(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 Hd(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await gy(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${UR(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 Yo(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 Yo(n,o,r);return s}catch{return null}}}});var jr={};yo(jr,{__resetBrowserRegistryForTests:()=>M4,browserProviderActive:()=>I4,closeBrowserProvider:()=>ky,getBrowserProvider:()=>R4,getLastRoutingDecision:()=>P4,peekBrowserProvider:()=>C4});function BR(){Promise.resolve(ky()).then(()=>{process.exit(130)})}function jR(){Promise.resolve(ky()).then(()=>{process.exit(143)})}function HR(){Jt=null}function A4(){Wd||(process.on("SIGINT",BR),process.on("SIGTERM",jR),process.on("exit",HR),Wd=!0)}function WR(){Wd&&(process.removeListener("SIGINT",BR),process.removeListener("SIGTERM",jR),process.removeListener("exit",HR),Wd=!1)}async function R4(t){return Jt!==null?Jt:(Br!==null||(Br=(async()=>{let e=oy(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await gR({config:e,surface:n});Sy=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(xR(),_R)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(wy(),by));o=new s(e)}return A4(),Jt=o,Br=null,o})()),Br)}async function ky(){if(Jt===null)return;let t=Jt;Jt=null,Br=null,WR(),await t.shutdown()}function I4(){return Jt!==null}function C4(){return Jt}function P4(){return Sy}function M4(){Jt=null,Br=null,Sy=null,WR()}var Jt,Br,Wd,Sy,Hr=h(()=>{"use strict";Bn();hR();F();Jt=null,Br=null,Wd=!1,Sy=null});async function KR(t,e){try{return await nR(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function $4(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Hr(),jr)),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(()=>(wy(),by)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(Bn(),sy)),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 qR(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??$4,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Un(n,t,{headers:N4,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(L4.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(F4.test(p)&&!D4.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await KR(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof Ce||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=ey({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ra(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ra(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ra(u.finalUrl,o);let p=await KR(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=ey({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 Ce)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var D4,F4,L4,N4,GR=h(()=>{"use strict";rR();ty();$r();se();D4=/(text\/html|application\/xhtml\+xml)/i,F4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,L4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,N4={"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 j4(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(U4,{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),B4),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Z(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 XR(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?j4({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 zR(t,e){if(e.length===0)return`# Search results for "${t}"
398
+ ${gt(t,{headless:e,latched:n})}`,{cause:t})}var RR,a4,c4,AR,d4,fy=h(()=>{"use strict";RR=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],a4="pnpm exec playwright install chromium",c4=4;d4="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 Ur from"node:fs";import Bd from"node:path";import{randomBytes as u4}from"node:crypto";function p4(){try{return"5.213.2"}catch{}try{let t=Bd.resolve(import.meta.dirname,"../../../package.json"),e=Ur.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var f4,jd,CR=h(()=>{"use strict";fy();L();se();f4=p4(),jd=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=Ud(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=Ud(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/${f4}`}}loadStorageState(e){let n=Wm(e);try{if(!Ur.existsSync(n))return;let r=JSON.parse(Ur.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Wm(e);if(!Ur.existsSync(r))return;let o=await n.storageState(),s=Bd.join(Bd.dirname(r),`.${Bd.basename(r)}.${process.pid}.${u4(4).toString("hex")}.tmp`);Ur.writeFileSync(s,JSON.stringify(o),{mode:384}),Ur.chmodSync(s,384),Ur.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as m4}from"node:crypto";function g4(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function h4(t,e,n){return`el_${m4("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function y4(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function PR(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function OR(t,e){let n=t.role??"",r=t.name??"";MR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])OR(s,e)}async function b4(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},DR).catch(()=>[])}async function w4(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},DR).catch(()=>[])}function S4(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Hd(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=S4(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=b4(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],OR(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await w4(t)).filter(P=>MR.has(P.role??"")));let w=new Map;for(let E of p){let P=PR(E.name),H=w.get(P);(!H||H.bbox.w===0&&E.bbox.w>0)&&w.set(P,E)}let v=y.map(E=>({ax:E,dom:w.get(PR(E.name??""))})),x=r?v:v.filter(E=>E.dom?E.dom.bbox.w>0||E.dom.bbox.h>0:!0);x.sort((E,P)=>{let H=E.dom?.bbox.y??0,M=P.dom?.bbox.y??0;if(H!==M)return H-M;let $=E.dom?.bbox.x??0,U=P.dom?.bbox.x??0;return $-U}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=x.slice(0,n).map((E,P)=>{let H=E.ax.role??"generic",M=E.ax.name??"",$=h4(H,M,P),U=E.dom?.bbox??{x:0,y:0,w:0,h:0},B=E.dom?.type??null,j=null;E.ax.value!==void 0&&E.ax.value!==null&&(j=String(E.ax.value)),E.ax.checked!==void 0&&(j=String(E.ax.checked)),yR({role:H,kind:B})&&(j="[redacted]");let K={disabled:E.ax.disabled??!1};E.ax.checked!==void 0&&(K.checked=E.ax.checked===!0||E.ax.checked==="mixed"),E.ax.selected!==void 0&&(K.selected=E.ax.selected),E.ax.expanded!==void 0&&(K.expanded=E.ax.expanded);let Y;E.dom?.testId?Y=`[data-testid="${E.dom.testId}"]`:E.dom?.id&&(Y=`#${E.dom.id}`);let Ft={id:$,role:H,label:g4(M),kind:B,value:j,state:K,bbox:U};return Y!==void 0&&(Ft.selector=Y),Ft}),I="idle";try{let E=await t.evaluate(()=>document.readyState);E==="loading"?I="loading":E==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=y4(f),T=`obs_${e.observationCounter.toString(36)}`,R=new Date().toISOString();return{observationId:T,url:m,title:g,textSummary:C,interactive:_,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:R}}var MR,DR,FR=h(()=>{"use strict";Nd();MR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);DR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function LR(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 my(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>LR(t,s)))).filter(o=>o!==null)}async function k4(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 gy(t,e,n){switch(e.kind){case"element_id":return v4(t,e,n);case"selector":return T4(t,e);case"semantic":return E4(t,e)}}async function v4(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 my(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function T4(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 my(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function E4(t,e){return e.role!==void 0?_4(t,e.text,e.role):x4(t,e.text,e)}async function _4(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 my(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function x4(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 k4(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let b=await LR(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${g}`,v=0;for(let x=0;x<w.length;x++)v=v*31+w.charCodeAt(x)>>>0;f.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var NR=h(()=>{"use strict"});async function hy(t,e,n,r){let o=t.url();if(o===n)return null;let s=It(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 $R=h(()=>{"use strict";Bn()});var by={};yo(by,{PlaywrightProvider:()=>yy});function UR(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 yy,wy=h(()=>{"use strict";CR();FR();NR();Bn();$R();cy();yy=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new jd(e)}async open(e){let n=It(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 hy(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 Hd(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 Hd(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 gy(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${UR(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){l=y}else l=g}let u=await hy(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 Hd(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await gy(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${UR(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 Yo(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 Yo(n,o,r);return s}catch{return null}}}});var jr={};yo(jr,{__resetBrowserRegistryForTests:()=>M4,browserProviderActive:()=>I4,closeBrowserProvider:()=>ky,getBrowserProvider:()=>R4,getLastRoutingDecision:()=>P4,peekBrowserProvider:()=>C4});function BR(){Promise.resolve(ky()).then(()=>{process.exit(130)})}function jR(){Promise.resolve(ky()).then(()=>{process.exit(143)})}function HR(){Jt=null}function A4(){Wd||(process.on("SIGINT",BR),process.on("SIGTERM",jR),process.on("exit",HR),Wd=!0)}function WR(){Wd&&(process.removeListener("SIGINT",BR),process.removeListener("SIGTERM",jR),process.removeListener("exit",HR),Wd=!1)}async function R4(t){return Jt!==null?Jt:(Br!==null||(Br=(async()=>{let e=oy(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await gR({config:e,surface:n});Sy=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(xR(),_R)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(wy(),by));o=new s(e)}return A4(),Jt=o,Br=null,o})()),Br)}async function ky(){if(Jt===null)return;let t=Jt;Jt=null,Br=null,WR(),await t.shutdown()}function I4(){return Jt!==null}function C4(){return Jt}function P4(){return Sy}function M4(){Jt=null,Br=null,Sy=null,WR()}var Jt,Br,Wd,Sy,Hr=h(()=>{"use strict";Bn();hR();F();Jt=null,Br=null,Wd=!1,Sy=null});async function KR(t,e){try{return await nR(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function $4(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Hr(),jr)),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(()=>(wy(),by)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(Bn(),sy)),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 qR(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??$4,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Un(n,t,{headers:N4,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(L4.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(F4.test(p)&&!D4.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await KR(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof Ce||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=ey({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ra(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ra(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ra(u.finalUrl,o);let p=await KR(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=ey({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 Ce)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var D4,F4,L4,N4,GR=h(()=>{"use strict";rR();ty();$r();se();D4=/(text\/html|application\/xhtml\+xml)/i,F4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,L4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,N4={"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 j4(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(U4,{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),B4),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Z(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 XR(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?j4({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 zR(t,e){if(e.length===0)return`# Search results for "${t}"
399
399
 
400
400
  (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(`
401
401
  `).trimEnd()}var U4,B4,JR=h(()=>{"use strict";et();U4="https://api.exa.ai/search",B4=10});function Kd(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 Wr=h(()=>{"use strict";fy()});function X4(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=H4;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,W4)}let a=K4;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,q4)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function vy(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:_t(t,e),truncated:!0}}function z4(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=X4(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 Nr(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let g={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Un(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof Ce?{content:`web_scrape blocked: ${g.message}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let m=vy(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await qR(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=vy(oR(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 Ce)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=ze(p)&&!py(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${oa()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=XR({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:G4,timeoutMs:i.timeoutMs,signal:a.signal}),f=vy(zR(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 H4,W4,K4,q4,G4,VR,YR=h(()=>{"use strict";GR();JR();$r();Wt();ty();Wr();H4=3e4,W4=12e4,K4=1e5,q4=1e6,G4=10;VR=z4()});function Y4(t){return J4.has(t)?"low":t==="DELETE"?"high":"medium"}function Q4(t){return V4.has(t)}function t5(t){let e={};return t.forEach((n,r)=>{let o=r.toLowerCase();e5.has(o)||Z4.some(s=>o.startsWith(s))||(e[r]=n)}),e}function n5(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 r5(t,e,n){let r=Buffer.byteLength(t,"utf8"),o=t,s=!1;if(r>n&&(o=_t(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 eI(t){let{url:e,method:n,signal:r,domainCheck:o,recordEffect:s}=t,i=Math.min(t.maxResponseBytes??Ty,Ey),a={...t.headers},c=t.fetchFn??globalThis.fetch,l=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},d=Y4(n);if(o!==void 0){let T=o(e);if(!T.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${T.reason}`),{name:"DomainPolicyError"})}let u=await Nr(e,l);if(!u.allowed)throw new Ce(u.reason);let{serialized:p,inferredContentType:f}=n5(t.body,a);f!==void 0&&(a["content-type"]=f);let m={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},y=Q4(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},b=Date.now(),w;try{w=await Un(c,e,m,{...l,retry:y})}catch(T){throw T instanceof Ce,T}let v=Date.now()-b,x=w.headers.get("content-type")??"",A;try{let T=w.body?.getReader();if(!T)A="";else{let R=[],E=0,P=i*2;for(;;){let{done:H,value:M}=await T.read();if(H||!M)break;if(R.push(M),E+=M.byteLength,E>=P){await T.cancel();break}}A=new TextDecoder().decode(Buffer.concat(R,E))}}catch{A=""}let{body:_,truncated:I}=r5(A,x,i),C=t5(w.headers);return s!==void 0&&Promise.resolve(s({url:e,method:n,status:w.status,risk:d,timing_ms:v})).catch(()=>{}),{status:w.status,headers:C,body:_,truncated:I,timing_ms:v,risk:d}}function tI(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 QR,ZR,Ty,Ey,J4,V4,Z4,e5,nI=h(()=>{"use strict";$r();Wt();QR=3e4,ZR=12e4,Ty=1e5,Ey=1e6,J4=new Set(["GET","HEAD","OPTIONS"]),V4=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);Z4=["set-cookie","x-"],e5=new Set(["server","via","age","vary","authorization","www-authenticate"])});function o5(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=tI(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=QR;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,ZR)}let l=Ty;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,Ey)}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 s5(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(()=>(Bn(),sy)),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=o5(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let p=s.reason;return{content:`web_request aborted: ${p instanceof Error?p.message:String(p??"aborted")}`,isError:!0}}let a={...i.headers};if(i.credential!==void 0){let p=n[i.credential];if(p===void 0||p.trim().length===0)return{content:`web_request credential error: environment variable "${i.credential}" is not set. Set it in afk.env or export it in the shell before starting AFK.`,isError:!0};if(Object.keys(a).some(m=>m.toLowerCase()==="authorization"))return{content:'web_request credential error: both "credential" and an explicit Authorization header were provided. Use one or the other.',isError:!0};a.Authorization=`Bearer ${p}`}let c=new AbortController,l=()=>c.abort(s.reason),d,u=()=>{let p=c.signal.reason;return p instanceof Error?p.message:String(p??"aborted")};try{s.addEventListener("abort",l,{once:!0}),d=setTimeout(()=>{c.abort(new Error(`web_request timeout after ${i.timeoutMs}ms`))},i.timeoutMs);let p=await r(),f={url:i.url,method:i.method,body:i.body,headers:a,maxResponseBytes:i.maxResponseBytes,signal:c.signal,fetchFn:e,lookupFn:t.lookupFn,domainCheck:p,recordEffect:t.recordEffect},m;try{m=await eI(f)}catch(w){if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};if(w instanceof Ce)return{content:`web_request blocked: ${w.message}`,isError:!0};let v=w instanceof Error&&w.name==="DomainPolicyError"?"blocked":"network error",x=w instanceof Error?w.message:String(w);return{content:`web_request ${v}: ${x}`,isError:!0}}if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};let g=m.body;if(typeof g=="string")g=qe(g);else if(typeof g=="object"&&g!==null){let w=qe(JSON.stringify(g));try{g=JSON.parse(w)}catch{g=w}}let y={status:m.status,headers:m.headers,body:g,timing_ms:m.timing_ms,...m.truncated?{truncated:!0}:{}};return{content:JSON.stringify(y,null,2),...m.truncated?{truncated:!0}:{}}}finally{d!==void 0&&clearTimeout(d),s.removeEventListener("abort",l)}}}var rI,oI=h(()=>{"use strict";nI();$r();_n();rI=s5()});import{existsSync as iI,mkdirSync as i5,readFileSync as a5,renameSync as c5,unlinkSync as l5,writeFileSync as d5}from"node:fs";import{dirname as sI,join as u5}from"node:path";import{randomBytes as p5}from"node:crypto";function Kr(t){let e=t??$m();if(!iI(e))return[];try{let n=a5(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 sa(t,e){let n=e??$m();i5(sI(n),{recursive:!0});let r=u5(sI(n),`.schedules.json.${process.pid}.${p5(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{d5(r,o,"utf-8"),c5(r,n)}catch(s){try{iI(r)&&l5(r)}catch{}throw s}}function aI(t,e){let n=Kr(e),r=n.map(c=>c.id),o=f5(t.name),s=m5(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),sa(n,e),a}function cI(t,e){let n=Kr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(sa(o,e),!0)}function lI(t,e){return Kr(e).find(n=>n.id===t)}function f5(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function m5(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}function dI(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 uI=h(()=>{"use strict";L()});import{existsSync as g5,readFileSync as h5}from"node:fs";import{join as y5}from"node:path";async function Qo(t,e,n){let r,o;try{let s=y5(Wv("default"),"port");if(!g5(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=h5(s,"utf-8").trim(),a=b5(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 b5(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 _y,pI=h(()=>{"use strict";L();_y="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 w5}from"node:fs";import{readFile as S5}from"node:fs/promises";var fI,mI,gI,hI,yI=h(()=>{"use strict";uI();L();pI();fI=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=aI({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 Qo("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 Qo("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:_y}})}},mI=async(t,e)=>{let n=Kr();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})))}},gI=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=Wc();if(!w5(s))return{content:JSON.stringify([])};let i;try{let l=await S5(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "5.213.1",
3
+ "version": "5.213.2",
4
4
  "description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
5
5
  "main": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",