agent-afk 5.132.2 → 5.132.3

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
@@ -316,7 +316,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
316
316
 
317
317
  ${t}`}var Kde,Nx=y(()=>{"use strict";Kde=new Set(["script","style","noscript","template","svg"])});function zde(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 OB(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function Vde(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 DB(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??zde,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(!qde.has(d.status)||u===o)return d;let p=Vde(d,s)??OB(u,i,s);F("[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=OB(u,i,s);F("[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 qde,$B=y(()=>{"use strict";de();qde=new Set([429,502,503,504])});import{BlockList as Yde,isIP as Ux}from"node:net";import{lookup as Jde}from"node:dns/promises";import{Agent as Xde}from"undici";function LB(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function tpe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Bx(e){let t=Ux(e);return t===0?!1:epe.check(e,t===4?"ipv4":"ipv6")}async function NB(e){return Jde(e,{all:!0,verbatim:!0})}async function jx(e,t={}){if(t.allowPrivateHosts??LB())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=tpe(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(Ux(r)!==0)return Bx(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??NB,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(Bx(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Rp(e,t={}){let n=await jx(e,t);if(!n.allowed)throw new ir(n.reason)}async function uy(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<=FB;s++){await Rp(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??LB())?{dispatcher:npe}:{}},l=await DB(e,i,a,r.retry??{});if(!rpe.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 ir(`too many redirects (>${FB}) starting from ${t}`)}var Qde,Zde,epe,ir,npe,FB,rpe,Hx=y(()=>{"use strict";B();$B();Qde=[["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]],Zde=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],epe=(()=>{let e=new Yde;for(let[t,n]of Qde)e.addSubnet(t,n,"ipv4");for(let[t,n]of Zde)e.addSubnet(t,n,"ipv6");return e})(),ir=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};npe=new Xde({connect:{lookup(e,t,n){NB(e).then(r=>{let o=r.find(s=>Bx(s.address));if(o!==void 0){n(new ir(`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,Ux(i.address))},r=>n(r,"",0))}}});FB=20,rpe=new Set([301,302,303,307,308])});import{readFileSync as ope}from"node:fs";import{join as ipe}from"path";function spe(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function BB(e,t){return spe(t).test(e)}function cpe(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(ape.has(t))return!0;if(lpe.has(t))return!1}return!1}function UB(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function upe(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function jB(e){let t=e===void 0||e.trim()===""?"default":e.trim();return xd(t),t}function dpe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function ppe(e){try{return ope(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function mpe(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")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=jB(t.defaultProfile)),n}function HB(e){let t=e?.env??v,n=e?.readFileSync??ppe,r=e?.surface??t.AGENT_SURFACE,o=cpe(t.AFK_BROWSER_HEADLESS,r),i=UB(t.AFK_BROWSER_ALLOWED_DOMAINS),s=UB(t.AFK_BROWSER_BLOCKED_DOMAINS),a=dpe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=upe(t.AFK_BROWSER_BACKEND),c=jB(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():ipe(Qn(),"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=mpe(u,g);return h.configPath=p,h}function dy(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(BB(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>BB(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var ape,lpe,py=y(()=>{"use strict";B();H();ape=new Set(["daemon","subagent","telegram","afk"]),lpe=new Set(["repl","interactive","cli"])});import{existsSync as fpe,readFileSync as gpe}from"node:fs";import{createRequire as hpe}from"node:module";import{dirname as ype,join as bpe}from"node:path";function GB(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<wpe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function an(e){let t=GB(e);return KB.some(n=>t.includes(n))}function vpe(){try{let t=hpe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(gpe(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=bpe(ype(t),o);return fpe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function xp(){return WB??=vpe()??Spe,WB}function Wx(e){return e.includes("install chromium")}function Nn(e,t){let n=GB(e),r=t?.latched===!0?` ${kpe}`:"";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: ${xp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${xp()}). Or pick a different tool.${r}`}function Ap(e,t,n=!1){if(!an(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
318
318
 
319
- ${Nn(e,{headless:t,latched:n})}`,{cause:e})}var KB,Spe,wpe,WB,kpe,my=y(()=>{"use strict";KB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Spe="pnpm exec playwright install chromium",wpe=4;kpe="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 Ws from"node:fs";import fy from"node:path";import{randomBytes as Tpe}from"node:crypto";import{chromium as Epe}from"playwright";function Rpe(){try{return"5.132.2"}catch{}try{let e=fy.resolve(import.meta.dirname,"../../../package.json"),t=Ws.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var xpe,gy,qB=y(()=>{"use strict";my();H();de();xpe=Rpe(),gy=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=Epe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=Ap(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),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/${xpe}`}}loadStorageState(t){let n=Ad(t);try{if(!Ws.existsSync(n))return;let r=JSON.parse(Ws.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ad(t);if(!Ws.existsSync(r))return;let o=await n.storageState(),i=fy.join(fy.dirname(r),`.${fy.basename(r)}.${process.pid}.${Tpe(4).toString("hex")}.tmp`);Ws.writeFileSync(i,JSON.stringify(o),{mode:384}),Ws.chmodSync(i,384),Ws.renameSync(i,r),F("[browser/vault] saved session",{profile:t,file:r})}catch(r){F("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Ape}from"crypto";function zB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Cpe.test(e.label))}function VB(e){return Ape("sha256").update(e,"utf8").digest("hex").slice(0,8)}function YB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Cpe,hy=y(()=>{"use strict";Cpe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as _pe}from"node:crypto";function Ipe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Ppe(e,t,n){return`el_${_pe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Mpe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function JB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function QB(e,t){let n=e.role??"",r=e.name??"";XB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])QB(i,t)}async function Ope(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},ZB).catch(()=>[])}async function Dpe(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},ZB).catch(()=>[])}function $pe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function yy(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=$pe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Ope(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,S=!1;d!==null?(b=[],QB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Dpe(e)).filter(D=>XB.has(D.role??"")));let w=new Map;for(let M of p){let D=JB(M.name),j=w.get(D);(!j||j.bbox.w===0&&M.bbox.w>0)&&w.set(D,M)}let k=b.map(M=>({ax:M,dom:w.get(JB(M.name??""))})),T=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);T.sort((M,D)=>{let j=M.dom?.bbox.y??0,L=D.dom?.bbox.y??0;if(j!==L)return j-L;let z=M.dom?.bbox.x??0,U=D.dom?.bbox.x??0;return z-U}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((M,D)=>{let j=M.ax.role??"generic",L=M.ax.name??"",z=Ppe(j,L,D),U=M.dom?.bbox??{x:0,y:0,w:0,h:0},W=M.dom?.type??null,K=null;M.ax.value!==void 0&&M.ax.value!==null&&(K=String(M.ax.value)),M.ax.checked!==void 0&&(K=String(M.ax.checked)),zB({role:j,kind:W})&&(K="[redacted]");let P={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(P.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(P.selected=M.ax.selected),M.ax.expanded!==void 0&&(P.expanded=M.ax.expanded);let V;M.dom?.testId?V=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(V=`#${M.dom.id}`);let $={id:z,role:j,label:Ipe(L),kind:W,value:K,state:P,bbox:U};return V!==void 0&&($.selector=V),$}),_="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?_="loading":M==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=Mpe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var XB,ZB,eU=y(()=>{"use strict";hy();XB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);ZB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function tU(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 Kx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>tU(e,i)))).filter(o=>o!==null)}async function Fpe(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 Gx(e,t,n){switch(t.kind){case"element_id":return Lpe(e,t,n);case"selector":return Npe(e,t);case"semantic":return Bpe(e,t)}}async function Lpe(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 Kx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Npe(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 Kx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Bpe(e,t){return t.role!==void 0?Upe(e,t.text,t.role):jpe(e,t.text,t)}async function Upe(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 Kx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function jpe(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 Fpe(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 S=await tU(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var nU=y(()=>{"use strict"});async function qx(e,t,n,r){let o=e.url();if(o===n)return null;let i=dy(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 rU=y(()=>{"use strict";py()});import{randomBytes as Hpe}from"crypto";import{mkdir as Wpe,stat as Kpe,writeFile as Gpe}from"fs/promises";import{join as zx}from"path";import{gzip as qpe}from"zlib";import{promisify as zpe}from"util";function Vpe(e){return zx(yn(e),"browser")}function Ype(e){return zx(Vpe(e),"screenshots")}function Jpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Xpe(){return Hpe(3).toString("hex")}async function Vx(e,t,n){if(t.length>oU)throw new Error(`writeScreenshotSidecar: buffer exceeds ${oU} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Ype(e);await Wpe(r,{recursive:!0});let o=`${Jpe()}-${Xpe()}-${n}.png`,i=zx(r,o);await Gpe(i,t);let{size:s}=await Kpe(i);return{path:i,bytes:s}}var yXe,oU,iU=y(()=>{"use strict";H();hy();yXe=zpe(qpe);oU=5*1024*1024});var aU={};oo(aU,{PlaywrightProvider:()=>Yx});function sU(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 Yx,lU=y(()=>{"use strict";qB();eU();nU();py();rU();iU();Yx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new gy(t)}async open(t){let n=dy(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 qx(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 yy(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 yy(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 Gx(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${sU(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 qx(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 yy(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 Gx(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${sU(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 Vx(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 Vx(n,o,r);return i}catch{return null}}}});var Gs={};oo(Gs,{__resetBrowserRegistryForTests:()=>nme,browserProviderActive:()=>eme,closeBrowserProvider:()=>Jx,getBrowserProvider:()=>Zpe,peekBrowserProvider:()=>tme});function cU(){Promise.resolve(Jx()).then(()=>{process.exit(130)})}function uU(){Promise.resolve(Jx()).then(()=>{process.exit(143)})}function dU(){Dr=null}function Qpe(){by||(process.on("SIGINT",cU),process.on("SIGTERM",uU),process.on("exit",dU),by=!0)}function pU(){by&&(process.removeListener("SIGINT",cU),process.removeListener("SIGTERM",uU),process.removeListener("exit",dU),by=!1)}async function Zpe(e){return Dr!==null?Dr:(Ks!==null||(Ks=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(lU(),aU)),n=HB(e),r=new t(n);return Qpe(),Dr=r,Ks=null,r})()),Ks)}async function Jx(){if(Dr===null)return;let e=Dr;Dr=null,Ks=null,pU(),await e.shutdown()}function eme(){return Dr!==null}function tme(){return Dr}function nme(){Dr=null,Ks=null,pU()}var Dr,Ks,by,qs=y(()=>{"use strict";py();Dr=null,Ks=null,by=!1});async function mU(e,t){try{return await IB(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function lme(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(qs(),Gs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function fU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??lme,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await uy(n,e,{headers:ame,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(sme.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(ime.test(p)&&!ome.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await mU(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof ir||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=Lx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Rp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Rp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Rp(d.finalUrl,o);let p=await mU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=Lx({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 ir)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 ome,ime,sme,ame,gU=y(()=>{"use strict";PB();Nx();Hx();de();ome=/(text\/html|application\/xhtml\+xml)/i,ime=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,sme=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,ame={"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 dme(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(cme,{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),ume),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(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 hU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?dme({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 yU(e,t){if(t.length===0)return`# Search results for "${e}"
319
+ ${Nn(e,{headless:t,latched:n})}`,{cause:e})}var KB,Spe,wpe,WB,kpe,my=y(()=>{"use strict";KB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Spe="pnpm exec playwright install chromium",wpe=4;kpe="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 Ws from"node:fs";import fy from"node:path";import{randomBytes as Tpe}from"node:crypto";import{chromium as Epe}from"playwright";function Rpe(){try{return"5.132.3"}catch{}try{let e=fy.resolve(import.meta.dirname,"../../../package.json"),t=Ws.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var xpe,gy,qB=y(()=>{"use strict";my();H();de();xpe=Rpe(),gy=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=Epe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=Ap(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),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/${xpe}`}}loadStorageState(t){let n=Ad(t);try{if(!Ws.existsSync(n))return;let r=JSON.parse(Ws.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ad(t);if(!Ws.existsSync(r))return;let o=await n.storageState(),i=fy.join(fy.dirname(r),`.${fy.basename(r)}.${process.pid}.${Tpe(4).toString("hex")}.tmp`);Ws.writeFileSync(i,JSON.stringify(o),{mode:384}),Ws.chmodSync(i,384),Ws.renameSync(i,r),F("[browser/vault] saved session",{profile:t,file:r})}catch(r){F("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Ape}from"crypto";function zB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Cpe.test(e.label))}function VB(e){return Ape("sha256").update(e,"utf8").digest("hex").slice(0,8)}function YB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Cpe,hy=y(()=>{"use strict";Cpe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as _pe}from"node:crypto";function Ipe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Ppe(e,t,n){return`el_${_pe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Mpe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function JB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function QB(e,t){let n=e.role??"",r=e.name??"";XB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])QB(i,t)}async function Ope(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},ZB).catch(()=>[])}async function Dpe(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},ZB).catch(()=>[])}function $pe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function yy(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=$pe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Ope(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,S=!1;d!==null?(b=[],QB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Dpe(e)).filter(D=>XB.has(D.role??"")));let w=new Map;for(let M of p){let D=JB(M.name),j=w.get(D);(!j||j.bbox.w===0&&M.bbox.w>0)&&w.set(D,M)}let k=b.map(M=>({ax:M,dom:w.get(JB(M.name??""))})),T=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);T.sort((M,D)=>{let j=M.dom?.bbox.y??0,L=D.dom?.bbox.y??0;if(j!==L)return j-L;let z=M.dom?.bbox.x??0,U=D.dom?.bbox.x??0;return z-U}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((M,D)=>{let j=M.ax.role??"generic",L=M.ax.name??"",z=Ppe(j,L,D),U=M.dom?.bbox??{x:0,y:0,w:0,h:0},W=M.dom?.type??null,K=null;M.ax.value!==void 0&&M.ax.value!==null&&(K=String(M.ax.value)),M.ax.checked!==void 0&&(K=String(M.ax.checked)),zB({role:j,kind:W})&&(K="[redacted]");let P={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(P.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(P.selected=M.ax.selected),M.ax.expanded!==void 0&&(P.expanded=M.ax.expanded);let V;M.dom?.testId?V=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(V=`#${M.dom.id}`);let $={id:z,role:j,label:Ipe(L),kind:W,value:K,state:P,bbox:U};return V!==void 0&&($.selector=V),$}),_="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?_="loading":M==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=Mpe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var XB,ZB,eU=y(()=>{"use strict";hy();XB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);ZB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function tU(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 Kx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>tU(e,i)))).filter(o=>o!==null)}async function Fpe(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 Gx(e,t,n){switch(t.kind){case"element_id":return Lpe(e,t,n);case"selector":return Npe(e,t);case"semantic":return Bpe(e,t)}}async function Lpe(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 Kx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Npe(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 Kx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Bpe(e,t){return t.role!==void 0?Upe(e,t.text,t.role):jpe(e,t.text,t)}async function Upe(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 Kx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function jpe(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 Fpe(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 S=await tU(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var nU=y(()=>{"use strict"});async function qx(e,t,n,r){let o=e.url();if(o===n)return null;let i=dy(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 rU=y(()=>{"use strict";py()});import{randomBytes as Hpe}from"crypto";import{mkdir as Wpe,stat as Kpe,writeFile as Gpe}from"fs/promises";import{join as zx}from"path";import{gzip as qpe}from"zlib";import{promisify as zpe}from"util";function Vpe(e){return zx(yn(e),"browser")}function Ype(e){return zx(Vpe(e),"screenshots")}function Jpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Xpe(){return Hpe(3).toString("hex")}async function Vx(e,t,n){if(t.length>oU)throw new Error(`writeScreenshotSidecar: buffer exceeds ${oU} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Ype(e);await Wpe(r,{recursive:!0});let o=`${Jpe()}-${Xpe()}-${n}.png`,i=zx(r,o);await Gpe(i,t);let{size:s}=await Kpe(i);return{path:i,bytes:s}}var yXe,oU,iU=y(()=>{"use strict";H();hy();yXe=zpe(qpe);oU=5*1024*1024});var aU={};oo(aU,{PlaywrightProvider:()=>Yx});function sU(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 Yx,lU=y(()=>{"use strict";qB();eU();nU();py();rU();iU();Yx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new gy(t)}async open(t){let n=dy(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 qx(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 yy(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 yy(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 Gx(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${sU(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 qx(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 yy(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 Gx(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${sU(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 Vx(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 Vx(n,o,r);return i}catch{return null}}}});var Gs={};oo(Gs,{__resetBrowserRegistryForTests:()=>nme,browserProviderActive:()=>eme,closeBrowserProvider:()=>Jx,getBrowserProvider:()=>Zpe,peekBrowserProvider:()=>tme});function cU(){Promise.resolve(Jx()).then(()=>{process.exit(130)})}function uU(){Promise.resolve(Jx()).then(()=>{process.exit(143)})}function dU(){Dr=null}function Qpe(){by||(process.on("SIGINT",cU),process.on("SIGTERM",uU),process.on("exit",dU),by=!0)}function pU(){by&&(process.removeListener("SIGINT",cU),process.removeListener("SIGTERM",uU),process.removeListener("exit",dU),by=!1)}async function Zpe(e){return Dr!==null?Dr:(Ks!==null||(Ks=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(lU(),aU)),n=HB(e),r=new t(n);return Qpe(),Dr=r,Ks=null,r})()),Ks)}async function Jx(){if(Dr===null)return;let e=Dr;Dr=null,Ks=null,pU(),await e.shutdown()}function eme(){return Dr!==null}function tme(){return Dr}function nme(){Dr=null,Ks=null,pU()}var Dr,Ks,by,qs=y(()=>{"use strict";py();Dr=null,Ks=null,by=!1});async function mU(e,t){try{return await IB(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function lme(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(qs(),Gs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function fU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??lme,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await uy(n,e,{headers:ame,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(sme.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(ime.test(p)&&!ome.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await mU(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof ir||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=Lx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Rp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Rp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Rp(d.finalUrl,o);let p=await mU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=Lx({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 ir)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 ome,ime,sme,ame,gU=y(()=>{"use strict";PB();Nx();Hx();de();ome=/(text\/html|application\/xhtml\+xml)/i,ime=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,sme=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,ame={"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 dme(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(cme,{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),ume),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(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 hU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?dme({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 yU(e,t){if(t.length===0)return`# Search results for "${e}"
320
320
 
321
321
  (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(`
322
322
  `).trimEnd()}var cme,ume,bU=y(()=>{"use strict";it();cme="https://api.exa.ai/search",ume=10});function Sy(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 zs=y(()=>{"use strict";my()});function yme(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=pme;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,mme)}let a=fme;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,gme)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function Xx(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:co(e,t),truncated:!0}}function bme(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=yme(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 jx(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 uy(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof ir?{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=Xx(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await fU(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=Xx(MB(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 ir)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=an(p)&&!Wx(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${xp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=hU({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:hme,timeoutMs:s.timeoutMs,signal:a.signal}),f=Xx(yU(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 pme,mme,fme,gme,hme,SU,wU=y(()=>{"use strict";gU();bU();Hx();ii();Nx();zs();pme=3e4,mme=12e4,fme=1e5,gme=1e6,hme=10;SU=bme()});import{existsSync as kU,mkdirSync as Sme,readFileSync as wme,renameSync as vme,unlinkSync as kme,writeFileSync as Tme}from"node:fs";import{dirname as vU,join as Eme}from"node:path";import{randomBytes as Rme}from"node:crypto";function Tn(e){let t=e??NE();if(!kU(t))return[];try{let n=wme(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 di(e,t){let n=t??NE();Sme(vU(n),{recursive:!0});let r=Eme(vU(n),`.schedules.json.${process.pid}.${Rme(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{Tme(r,o,"utf-8"),vme(r,n)}catch(i){try{kU(r)&&kme(r)}catch{}throw i}}function wy(e,t){let n=Tn(t),r=n.map(l=>l.id),o=xme(e.name),i=Ame(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),di(n,t),a}function vy(e,t){let n=Tn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(di(o,t),!0)}function Cp(e,t){return Tn(t).find(n=>n.id===e)}function xme(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Ame(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function ky(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 Ty=y(()=>{"use strict";H()});import{existsSync as Cme,readFileSync as _me}from"node:fs";import{join as Ime}from"node:path";async function Bn(e,t,n){let r,o;try{let i=Ime(_g("default"),"port");if(!Cme(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=_me(i,"utf-8").trim(),a=Pme(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 Pme(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 pi,Qx=y(()=>{"use strict";H();pi="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 Mme}from"node:fs";import{readFile as Ome}from"node:fs/promises";var TU,EU,RU,xU,AU=y(()=>{"use strict";Ty();H();Qx();TU=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=wy({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 Bn("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 Bn("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:pi}})}},EU=async(e,t)=>{let n=Tn();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})))}},RU=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=wr();if(!Mme(i))return{content:JSON.stringify([])};let s;try{let c=await Ome(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1876,7 +1876,7 @@ ${T}
1876
1876
  ${E}`})}return{fileBlocks:l,warnings:c}}function B7(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function U7(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}}B();N();function j7(e){return{startedAt:e,received:!1}}function H7(e){return e.received?{}:{turnStartedAt:e.startedAt}}function W7(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function K7(e){Ve()&&(e??{fn:console.log}).fn(m.dim(" \u25E6 waiting for response\u2026"))}zv();async function G7(e,t,n,r,o="summary",i,s){let a=$X(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=j7(l);K7(i),gu(process.stdout,Qm(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,k=!1,T={abort:null},E=0,R=3e3,_=[],C=new Map,x=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,I=()=>{let U=r.subagentControl;U?.hasPromotableForeground()&&U7(U,M,r.onQueuedUserMessage).then(({jobs:W,flushedText:K,flushedPreview:P})=>{let V=(i??{fn:console.log}).fn;for(let $ of W)V(m.dim(` \u2192 subagent backgrounded as ${$.jobId}: ${$.label}`));K!==void 0&&V(m.dim(` \u2192 queued message sent to this turn: ${B7(P??K)}`))}).catch(()=>{})},M=r.getCompositor?r.getCompositor():null,D=()=>new ju({out:Hu(i),thinkingMode:o,...x?{activeSkillName:x}:{},onCancel:()=>{t.interrupt().catch(U=>{We()&&console.error(" "+m.error("session.interrupt() failed:"),U)})},...r.subagentControl?{onBackground:I}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...M?{compositor:M}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...H7(c)}),j=D(),L=async()=>{if(!h){h=!0;try{await j.dispose()}catch{}}},z=async()=>{await j.arm();let U=j.getCompositor();if(i&&U){let W=U;i.fn=K=>W.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(U),r.setInterruptNotifier?.(W=>j.setInterrupting(W)),r.rearmStatus?.()};try{M?M.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{w=!0,j.setSoftStopping(!0),t.interrupt().catch(te=>{We()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),te)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(te=>{We()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),te)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch($=>{We()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),$)})}),await z(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(I);let{fileBlocks:U,warnings:W}=N7(e.text,{rootDir:process.cwd()});for(let $ of W)(i??{fn:console.log}).fn(m.dim(` @-file: ${$}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let K=U.length>0||e.attachments.length>0?await L7(e.text,e.attachments,void 0,U,t.sessionId):e.text,P=t.sendMessageStream(K);if(await ic(($,te)=>{j.process($,te)},async()=>{for await(let $ of P){if(w||k)break;let te=W7(c,$,f);if($.type==="chunk"&&$.chunk.type==="content"?(u=p?M7(u,$.chunk.content):u+$.chunk.content,p=!1,f=!0):$.type==="message"&&!f&&(u=$.message.content),$.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let Q=$.chunk,me={toolName:Q.toolName,toolUseId:Q.toolUseId,input:Q.toolInput,...Q.toolInputRaw!==void 0&&{inputRaw:Q.toolInputRaw}};C.set(Q.toolUseId,me),_.push(me)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let Q=$.chunk;d=u.length,p=!0;let me=C.get(Q.toolUseId);if(me&&(me.result=Q.content,me.isError=Q.isError,C.delete(Q.toolUseId)),r.onContextProgress){let Z=Date.now();if(Z-E>=R){E=Z;try{let Se=r.onContextProgress();Se instanceof Promise&&await Se}catch(Se){We()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),Se)}}}}if($.type==="paused"){if(r.setPausedState?.(!0),await L(),M&&$.autoResume===!0){let Q=new AbortController;T.abort=Q;let me=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Z=me?`Keep waiting \u2014 auto-resumes at ${me}`:"Keep waiting \u2014 auto-resume in progress",Se="Switch model / provider (type /model after)",Oe="Stop waiting",Vt=[m.warning(" \u23F3 Usage limit reached.")+(me?m.dim(` Auto-resumes at ${me}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];fn(M,{header:Vt,options:[Z,Se,Oe],signal:Q.signal,initialIndex:0}).then(ge=>{if(T.abort=null,!ge)return;let ce=ge[0];ce===void 0||ce===Z||(k=!0,ce===Se&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Qe=>{We()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Qe)}))}).catch(ge=>{We()&&console.error(" "+m.error("picker promise rejected:"),ge)})}else(i??{fn:console.log}).fn($$({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),T.abort?.abort(),T.abort=null;let Q=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,_.length=0,C.clear(),b=!1,S=void 0,g=!1,j=D(),h=!1,await z(),(i??{fn:console.log}).fn(m.success(Q));continue}if($.type==="error"){await L(),vl(fl($.error)),g=!0;continue}j.process($),te&&j.notifyFirstContent(),$.type==="done"&&(b=!0,S=$.metadata)}}),await L(),w){let $=i?i.fn:console.log,te=M?M.getPendingCount():0,Q=te>0?` \xB7 ${te} queued`:"";$(m.warning(`\u23F8 Stopped${Q} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),$("")}if(k){let $=i?i.fn:console.log;$(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(b&&!w&&!k){wa(n,a,u,S,_),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),fu(process.stdout),W4(process.stdout,"afk: turn complete");let $=Q=>{i?i.fn(Q):console.log(Q)},te=OT(u);if(te){$(O7(te)),$("");let Q=X8(_);if(r.onTerminalState)try{r.onTerminalState(te,{doneHasCorroboratingEvidence:Q})}catch{}if(n.permissionMode==="autonomous"){let me=te.kind==="done"&&Tp().verifyDone===!0&&!Q;Z8(te,void 0,{unverified:me})}}if(lO(S,n,$),r.onAfterTurn){let Q=r.onAfterTurn();Q instanceof Promise&&await Q.catch(()=>{})}}}catch(U){await L(),g||vl(fl(U))}finally{await L(),gu(process.stdout,Qm(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),T.abort?.abort(),T.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Wi();var g$e=5e3,h$e=3,y$e="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function b$e(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function q7(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 I=>{We()&&(h=jk(I)),await Af(e.session.current),We()&&(b=MM())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,k=!1,T=!1,E,R,_,C=(()=>{let I=parseInt(e.options.maxTurns,10);return I>0?I:void 0})(),x=0;for(g.onInjectable=()=>{x>=h$e||!o.isAwaitingInput()||!o.bufferIsEmpty()||(x++,fu(process.stdout),S={text:y$e,attachments:[]},o.abortPendingRead())};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let P of b)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),b=[]}let I=f.drainNotifications();for(let{job:P,result:V}of I){let $=V.errorReason===void 0?"\u2713":"\u2717",te=V.errorReason==="abort"?"killed":V.errorReason==="timeout"?"timed out":V.errorReason==="signal-killed"?"killed by signal":`exit ${V.exitCode??0}`,Q=Math.max(0,Math.round(V.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${$} [${P.id}] ${te} \xB7 ${Q}s \xB7 `)+P.command)}let M=g.drainNotifications();for(let{job:P}of M){let V=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",$=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,te=ie(P.label,60);e.replRenderer.writeLine(m.dim(` ${V} [${P.jobId}] subagent ${P.status} \xB7 ${$}s \xB7 `)+te)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let P of D)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let j,L;if(S===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,S={text:P.message,attachments:[]})}if(S!==void 0){let P=S;S=void 0;let V=Xu(e.stats.permissionMode),$=Ra({buffer:P.text,promptText:V,isTTY:!!process.stdout.isTTY,attachmentSummary:Au([...P.attachments])});e.replRenderer.writeLine($),j=P.text.trim(),L=P.attachments}else{let P=w;w=void 0;let V=await o.readLine({promptFn:()=>Xu(e.stats.permissionMode),...P!==void 0?{initialBuffer:P}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{AT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});j=V.text.trim(),L=V.attachments}if(!j&&L.length===0)continue;if(j.startsWith("!")){let P=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(k||(k=!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(j))){e.statusLine.rearm();continue}}let z=!1;if(j.startsWith("/")){let P=await q4(j,e.slashCtx,L);if(P.handled){if(P.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((j==="/clear"||j.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),E=void 0),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){S={text:P.result.message,attachments:L??[]},e.statusLine.rearm();continue}if(P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="prefill"){w=P.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}z=!0}a.push(j),await b$e(e,j);let U=j;if(z){let P=cP(j);if(P){let V=P.name.replace(/^\//,"").split(":").pop()??"";if(V&&AM(V)){let $={skillName:V,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},te=e.session.current.sessionId,Q=Na(te),me=Date.now();F(`[afk trace] preflight.start commandName=${V}`);let Z=!1,Se=await La($,{cwd:e.stats.cwd??process.cwd(),artifactDir:Q},Oe=>{We()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${V}) failed: `)+(Oe instanceof Error?Oe.message:String(Oe)))});Z=Se!==null,F(`[afk trace] preflight.end commandName=${V} durationMs=${Date.now()-me} success=${Z}`),U=IM(Se?.manifestBlock,j)}}}let W=f.drainInjections();W.length>0&&(U=W+U);let K=g.drainInjections();if(K.length>0&&(U=K+U),E!==void 0&&(U=E+`
1877
1877
 
1878
1878
  `+U,E=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:U,sessionId:e.stats.sessionId},V=await e.hookRegistry.dispatch(P);V.injectContext&&(U=V.injectContext+U)}catch(P){if(P instanceof Ae){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(P.reason?m.dim(`: ${ae(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Cr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(R=void 0,_=void 0,await G7({text:U,attachments:L},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onQueuedUserMessage(P){await t.appendQueuedUser(P)},async onTurnComplete(P,V){if(await t.appendTurn(P,V),e.stats.sessionId)try{Hi(e.stats)}catch($){T||(T=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+($ instanceof Error?$.message:String($))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,V)=>{p?.push(P),R=P.kind,_=V?.doneHasCorroboratingEvidence},setActiveCompositor:P=>{n.activeCompositor=P,P===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(P,V)=>{c.repaint(P),u?.onStage(P,V)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Xu(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},..._!==void 0?{doneHasCorroboratingEvidence:_}:{}},void 0,g$e);P.injectContext&&P.injectContext.trim().length>0&&(E=P.injectContext)}catch(P){if(P instanceof Ct)throw P;P instanceof Cr?(F("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):P instanceof Ae?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(P.reason??"no reason given")}`)):F("[stop hook] unexpected error: "+String(P))}}}function S$e(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 z7(e,t,n,r){let o=await VQ(),i=new xT({rl:e.rl,history:o,statusLine:e.statusLine}),s=S$e(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await f7(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=P7(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start()},await q7(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)}}gp();Vl();import{execFile as w$e}from"node:child_process";import{dirname as v$e,isAbsolute as k$e,resolve as T$e}from"node:path";import{promisify as E$e}from"node:util";var V7=E$e(w$e),R$e=3e3,x$e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function A$e(){let t=(await V7("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=k$e(t)?t:T$e(process.cwd(),t);return v$e(n)}async function Y7(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await A$e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),R$e)});try{let o=jn({execFile:V7,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=>x$e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}nh();gp();import{promises as C$e}from"node:fs";import{dirname as _$e,join as Q7}from"node:path";import{randomBytes as I$e}from"node:crypto";var P$e=["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(`
1879
- `),J7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,uO=30,M$e=1024,O$e=8e3,D$e="haiku";async function $$e(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=B$e(n,M$e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??O$e),s=t.signal?U$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await xl({token:t.token,model:t.model??D$e,system:P$e,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=F$e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=_$e(t.worktreePath);return await L$e(l,c)}function F$e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(J7.test(t)&&t.length<=uO)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>uO)break;o=s}return J7.test(o)?o:null}async function L$e(e,t){if(!await N$e(Q7(t,e)))return e;let n=I$e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,uO-5)}-${n}`}async function N$e(e){try{return await C$e.access(e),!0}catch{return!1}}function B$e(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 U$e(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 Z7(e){let t,n,r=Q7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await $$e(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=`${ny(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return X7(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 X7(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 X7(e,t){e&&e.setCwd(t),j$e(t)}function j$e(e){try{process.chdir(e)}catch{}}ft();Tt();pl();Xr();H();import{spawn as tZ}from"child_process";import{existsSync as nZ,mkdirSync as q$e,readFileSync as rZ,unlinkSync as eZ,writeFileSync as oZ}from"fs";import{get as z$e}from"https";import{join as iZ}from"path";import{readFileSync as H$e}from"fs";import{dirname as W$e,join as K$e}from"path";import{fileURLToPath as G$e}from"url";function eo(){try{return"5.132.2"}catch{}try{let e=W$e(G$e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(H$e(K$e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}N();B();var V$e=64*1024,Y$e=10800*1e3,J$e=800,X$e=3600*1e3,Q$e="update-check.json",Z$e="pending-update.json";function dO(){return iZ(cl(),Q$e)}function Gf(){return iZ(cl(),Z$e)}function pO(){let e=cl();nZ(e)||q$e(e,{recursive:!0})}function sZ(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 aZ(){try{let e=rZ(dO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function lZ(){try{pO();let e=`
1879
+ `),J7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,uO=30,M$e=1024,O$e=8e3,D$e="haiku";async function $$e(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=B$e(n,M$e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??O$e),s=t.signal?U$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await xl({token:t.token,model:t.model??D$e,system:P$e,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=F$e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=_$e(t.worktreePath);return await L$e(l,c)}function F$e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(J7.test(t)&&t.length<=uO)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>uO)break;o=s}return J7.test(o)?o:null}async function L$e(e,t){if(!await N$e(Q7(t,e)))return e;let n=I$e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,uO-5)}-${n}`}async function N$e(e){try{return await C$e.access(e),!0}catch{return!1}}function B$e(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 U$e(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 Z7(e){let t,n,r=Q7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await $$e(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=`${ny(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return X7(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 X7(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 X7(e,t){e&&e.setCwd(t),j$e(t)}function j$e(e){try{process.chdir(e)}catch{}}ft();Tt();pl();Xr();H();import{spawn as tZ}from"child_process";import{existsSync as nZ,mkdirSync as q$e,readFileSync as rZ,unlinkSync as eZ,writeFileSync as oZ}from"fs";import{get as z$e}from"https";import{join as iZ}from"path";import{readFileSync as H$e}from"fs";import{dirname as W$e,join as K$e}from"path";import{fileURLToPath as G$e}from"url";function eo(){try{return"5.132.3"}catch{}try{let e=W$e(G$e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(H$e(K$e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}N();B();var V$e=64*1024,Y$e=10800*1e3,J$e=800,X$e=3600*1e3,Q$e="update-check.json",Z$e="pending-update.json";function dO(){return iZ(cl(),Q$e)}function Gf(){return iZ(cl(),Z$e)}function pO(){let e=cl();nZ(e)||q$e(e,{recursive:!0})}function sZ(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 aZ(){try{let e=rZ(dO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function lZ(){try{pO();let e=`
1880
1880
  const https = require('https');
1881
1881
  const fs = require('fs');
1882
1882
  const url = 'https://registry.npmjs.org/agent-afk/latest';