agent-afk 5.128.0 → 5.128.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -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,Mx=y(()=>{"use strict";kde=new Set(["script","style","noscript","template","svg"])});function Rde(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 EB(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function xde(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 RB(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Rde,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(!Ede.has(d.status)||u===o)return d;let m=xde(d,s)??EB(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:m}),await d.body?.cancel().catch(()=>{}),await a(m,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let m=EB(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var Ede,xB=y(()=>{"use strict";pe();Ede=new Set([429,502,503,504])});import{BlockList as Ade,isIP as Dx}from"node:net";import{lookup as Cde}from"node:dns/promises";import{Agent as _de}from"undici";function CB(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Ode(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Ox(e){let t=Dx(e);return t===0?!1:Mde.check(e,t===4?"ipv4":"ipv6")}async function _B(e){return Cde(e,{all:!0,verbatim:!0})}async function $x(e,t={}){if(t.allowPrivateHosts??CB())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=Ode(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(Dx(r)!==0)return Ox(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??_B,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(Ox(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Ep(e,t={}){let n=await $x(e,t);if(!n.allowed)throw new ir(n.reason)}async function sy(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<=AB;s++){await Ep(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??CB())?{dispatcher:Dde}:{}},l=await RB(e,i,a,r.retry??{});if(!$de.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 (>${AB}) starting from ${t}`)}var Ide,Pde,Mde,ir,Dde,AB,$de,Fx=y(()=>{"use strict";N();xB();Ide=[["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]],Pde=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Mde=(()=>{let e=new Ade;for(let[t,n]of Ide)e.addSubnet(t,n,"ipv4");for(let[t,n]of Pde)e.addSubnet(t,n,"ipv6");return e})(),ir=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Dde=new _de({connect:{lookup(e,t,n){_B(e).then(r=>{let o=r.find(s=>Ox(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,Dx(i.address))},r=>n(r,"",0))}}});AB=20,$de=new Set([301,302,303,307,308])});import{readFileSync as Fde}from"node:fs";import{join as Lde}from"path";function Nde(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function IB(e,t){return Nde(t).test(e)}function jde(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(Bde.has(t))return!0;if(Ude.has(t))return!1}return!1}function PB(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Hde(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 MB(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Rd(t),t}function Wde(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Kde(e){try{return Fde(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Gde(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=MB(t.defaultProfile)),n}function OB(e){let t=e?.env??k,n=e?.readFileSync??Kde,r=e?.surface??t.AGENT_SURFACE,o=jde(t.AFK_BROWSER_HEADLESS,r),i=PB(t.AFK_BROWSER_ALLOWED_DOMAINS),s=PB(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Wde(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Hde(t.AFK_BROWSER_BACKEND),c=MB(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,m=d!==void 0&&d.trim()!==""?d.trim():Lde(Qn(),"browser.json"),f=n(m);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${m}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=Gde(u,g);return h.configPath=m,h}function ay(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(IB(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>IB(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Bde,Ude,ly=y(()=>{"use strict";N();j();Bde=new Set(["daemon","subagent","telegram","afk"]),Ude=new Set(["repl","interactive","cli"])});import{existsSync as qde,readFileSync as zde}from"node:fs";import{createRequire as Vde}from"node:module";import{dirname as Yde,join as Jde}from"node:path";function FB(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Qde&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function an(e){let t=FB(e);return $B.some(n=>t.includes(n))}function Zde(){try{let t=Vde(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(zde(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=Jde(Yde(t),o);return qde(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Rp(){return DB??=Zde()??Xde,DB}function Lx(e){return e.includes("install chromium")}function Nn(e,t){let n=FB(e),r=t?.latched===!0?` ${epe}`:"";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: ${Rp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Rp()}). Or pick a different tool.${r}`}function xp(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 $B,Xde,Qde,DB,epe,cy=y(()=>{"use strict";$B=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Xde="pnpm exec playwright install chromium",Qde=4;epe="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 Hs from"node:fs";import uy from"node:path";import{randomBytes as tpe}from"node:crypto";import{chromium as npe}from"playwright";function rpe(){try{return"5.128.0"}catch{}try{let e=uy.resolve(import.meta.dirname,"../../../package.json"),t=Hs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ope,dy,LB=y(()=>{"use strict";cy();j();pe();ope=rpe(),dy=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=npe.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=xp(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(m){throw i??m}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/${ope}`}}loadStorageState(t){let n=xd(t);try{if(!Hs.existsSync(n))return;let r=JSON.parse(Hs.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=xd(t);if(!Hs.existsSync(r))return;let o=await n.storageState(),i=uy.join(uy.dirname(r),`.${uy.basename(r)}.${process.pid}.${tpe(4).toString("hex")}.tmp`);Hs.writeFileSync(i,JSON.stringify(o),{mode:384}),Hs.chmodSync(i,384),Hs.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as ipe}from"crypto";function NB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&spe.test(e.label))}function BB(e){return ipe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function UB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var spe,py=y(()=>{"use strict";spe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as ape}from"node:crypto";function lpe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function cpe(e,t,n){return`el_${ape("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function upe(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 WB(e,t){let n=e.role??"",r=e.name??"";HB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])WB(i,t)}async function dpe(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},KB).catch(()=>[])}async function ppe(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,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},KB).catch(()=>[])}function mpe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function my(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=mpe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=dpe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,m,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],WB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await ppe(e)).filter(M=>HB.has(M.role??"")));let w=new Map;for(let P of m){let M=jB(P.name),W=w.get(M);(!W||W.bbox.w===0&&P.bbox.w>0)&&w.set(M,P)}let T=b.map(P=>({ax:P,dom:w.get(jB(P.name??""))})),E=r?T:T.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,M)=>{let W=P.dom?.bbox.y??0,F=M.dom?.bbox.y??0;if(W!==F)return W-F;let X=P.dom?.bbox.x??0,U=M.dom?.bbox.x??0;return X-U}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((P,M)=>{let W=P.ax.role??"generic",F=P.ax.name??"",X=cpe(W,F,M),U=P.dom?.bbox??{x:0,y:0,w:0,h:0},H=P.dom?.type??null,K=null;P.ax.value!==void 0&&P.ax.value!==null&&(K=String(P.ax.value)),P.ax.checked!==void 0&&(K=String(P.ax.checked)),NB({role:W,kind:H})&&(K="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let $={id:X,role:W,label:lpe(F),kind:H,value:K,state:O,bbox:U};return z!==void 0&&($.selector=z),$}),C="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?C="loading":P==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="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 _=upe(f),R=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:R,url:g,title:h,textSummary:_,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var HB,KB,GB=y(()=>{"use strict";py();HB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);KB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function qB(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 Nx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>qB(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 Bx(e,t,n){switch(t.kind){case"element_id":return gpe(e,t,n);case"selector":return hpe(e,t);case"semantic":return ype(e,t)}}async function gpe(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 Nx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function hpe(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 Nx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function ype(e,t){return t.role!==void 0?bpe(e,t.text,t.role):Spe(e,t.text,t)}async function bpe(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 Nx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Spe(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 m=d.slice(0,5),f=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let S=await qB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,T=0;for(let E=0;E<w.length;E++)T=T*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${T.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var zB=y(()=>{"use strict"});async function Ux(e,t,n,r){let o=e.url();if(o===n)return null;let i=ay(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 VB=y(()=>{"use strict";ly()});import{randomBytes as wpe}from"crypto";import{mkdir as vpe,stat as kpe,writeFile as Tpe}from"fs/promises";import{join as jx}from"path";import{gzip as Epe}from"zlib";import{promisify as Rpe}from"util";function xpe(e){return jx(yn(e),"browser")}function Ape(e){return jx(xpe(e),"screenshots")}function Cpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function _pe(){return wpe(3).toString("hex")}async function Hx(e,t,n){if(t.length>YB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${YB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Ape(e);await vpe(r,{recursive:!0});let o=`${Cpe()}-${_pe()}-${n}.png`,i=jx(r,o);await Tpe(i,t);let{size:s}=await kpe(i);return{path:i,bytes:s}}var _Je,YB,JB=y(()=>{"use strict";j();py();_Je=Rpe(Epe);YB=5*1024*1024});var QB={};ro(QB,{PlaywrightProvider:()=>Wx});function XB(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 Wx,ZB=y(()=>{"use strict";LB();GB();zB();ly();VB();JB();Wx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dy(t)}async open(t){let n=ay(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 Ux(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 my(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 my(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 Bx(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${XB(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 Ux(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await my(r,{observationCounter:o.observationCounter,screenshotPath:m,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 Bx(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${XB(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 Hx(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 Hx(n,o,r);return i}catch{return null}}}});var Ks={};ro(Ks,{__resetBrowserRegistryForTests:()=>Dpe,browserProviderActive:()=>Mpe,closeBrowserProvider:()=>Kx,getBrowserProvider:()=>Ppe,peekBrowserProvider:()=>Ope});function eU(){Promise.resolve(Kx()).then(()=>{process.exit(130)})}function tU(){Promise.resolve(Kx()).then(()=>{process.exit(143)})}function nU(){Dr=null}function Ipe(){fy||(process.on("SIGINT",eU),process.on("SIGTERM",tU),process.on("exit",nU),fy=!0)}function rU(){fy&&(process.removeListener("SIGINT",eU),process.removeListener("SIGTERM",tU),process.removeListener("exit",nU),fy=!1)}async function Ppe(e){return Dr!==null?Dr:(Ws!==null||(Ws=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(ZB(),QB)),n=OB(e),r=new t(n);return Ipe(),Dr=r,Ws=null,r})()),Ws)}async function Kx(){if(Dr===null)return;let e=Dr;Dr=null,Ws=null,rU(),await e.shutdown()}function Mpe(){return Dr!==null}function Ope(){return Dr}function Dpe(){Dr=null,Ws=null,rU()}var Dr,Ws,fy,Gs=y(()=>{"use strict";ly();Dr=null,Ws=null,fy=!1});async function oU(e,t){try{return await vB(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Upe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Gs(),Ks));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function iU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Upe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await sy(n,e,{headers:Bpe,signal:t.signal},o);l=d.status,a=d.url||e;let m=d.headers.get("content-type")??"";if(d.ok){if(Npe.test(m))throw new Error(`web_scrape markdown mode received binary content (${m.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Lpe.test(m)&&!Fpe.test(m))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await oU(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=Px({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Ep(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Ep(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Ep(d.finalUrl,o);let m=await oU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||m.textLength>=i.textLength){let f=Px({html:d.html,extractedTextLength:m.textLength});return{title:m.title,markdown:m.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 m=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 (${m}).`);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 Fpe,Lpe,Npe,Bpe,sU=y(()=>{"use strict";kB();Mx();Fx();pe();Fpe=/(text\/html|application\/xhtml\+xml)/i,Lpe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Npe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Bpe={"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 Wpe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(jpe,{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),Hpe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ve(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 aU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Wpe({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 lU(e,t){if(t.length===0)return`# Search results for "${e}"
319
+ ${Nn(e,{headless:t,latched:n})}`,{cause:e})}var $B,Xde,Qde,DB,epe,cy=y(()=>{"use strict";$B=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Xde="pnpm exec playwright install chromium",Qde=4;epe="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 Hs from"node:fs";import uy from"node:path";import{randomBytes as tpe}from"node:crypto";import{chromium as npe}from"playwright";function rpe(){try{return"5.128.2"}catch{}try{let e=uy.resolve(import.meta.dirname,"../../../package.json"),t=Hs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ope,dy,LB=y(()=>{"use strict";cy();j();pe();ope=rpe(),dy=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=npe.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=xp(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(m){throw i??m}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/${ope}`}}loadStorageState(t){let n=xd(t);try{if(!Hs.existsSync(n))return;let r=JSON.parse(Hs.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=xd(t);if(!Hs.existsSync(r))return;let o=await n.storageState(),i=uy.join(uy.dirname(r),`.${uy.basename(r)}.${process.pid}.${tpe(4).toString("hex")}.tmp`);Hs.writeFileSync(i,JSON.stringify(o),{mode:384}),Hs.chmodSync(i,384),Hs.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as ipe}from"crypto";function NB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&spe.test(e.label))}function BB(e){return ipe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function UB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var spe,py=y(()=>{"use strict";spe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as ape}from"node:crypto";function lpe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function cpe(e,t,n){return`el_${ape("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function upe(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 WB(e,t){let n=e.role??"",r=e.name??"";HB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])WB(i,t)}async function dpe(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},KB).catch(()=>[])}async function ppe(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,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},KB).catch(()=>[])}function mpe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function my(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=mpe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=dpe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,m,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],WB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await ppe(e)).filter(M=>HB.has(M.role??"")));let w=new Map;for(let P of m){let M=jB(P.name),W=w.get(M);(!W||W.bbox.w===0&&P.bbox.w>0)&&w.set(M,P)}let T=b.map(P=>({ax:P,dom:w.get(jB(P.name??""))})),E=r?T:T.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,M)=>{let W=P.dom?.bbox.y??0,F=M.dom?.bbox.y??0;if(W!==F)return W-F;let X=P.dom?.bbox.x??0,U=M.dom?.bbox.x??0;return X-U}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((P,M)=>{let W=P.ax.role??"generic",F=P.ax.name??"",X=cpe(W,F,M),U=P.dom?.bbox??{x:0,y:0,w:0,h:0},H=P.dom?.type??null,K=null;P.ax.value!==void 0&&P.ax.value!==null&&(K=String(P.ax.value)),P.ax.checked!==void 0&&(K=String(P.ax.checked)),NB({role:W,kind:H})&&(K="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let $={id:X,role:W,label:lpe(F),kind:H,value:K,state:O,bbox:U};return z!==void 0&&($.selector=z),$}),C="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?C="loading":P==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="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 _=upe(f),R=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:R,url:g,title:h,textSummary:_,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var HB,KB,GB=y(()=>{"use strict";py();HB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);KB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function qB(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 Nx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>qB(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 Bx(e,t,n){switch(t.kind){case"element_id":return gpe(e,t,n);case"selector":return hpe(e,t);case"semantic":return ype(e,t)}}async function gpe(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 Nx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function hpe(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 Nx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function ype(e,t){return t.role!==void 0?bpe(e,t.text,t.role):Spe(e,t.text,t)}async function bpe(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 Nx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Spe(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 m=d.slice(0,5),f=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let S=await qB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,T=0;for(let E=0;E<w.length;E++)T=T*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${T.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var zB=y(()=>{"use strict"});async function Ux(e,t,n,r){let o=e.url();if(o===n)return null;let i=ay(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 VB=y(()=>{"use strict";ly()});import{randomBytes as wpe}from"crypto";import{mkdir as vpe,stat as kpe,writeFile as Tpe}from"fs/promises";import{join as jx}from"path";import{gzip as Epe}from"zlib";import{promisify as Rpe}from"util";function xpe(e){return jx(yn(e),"browser")}function Ape(e){return jx(xpe(e),"screenshots")}function Cpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function _pe(){return wpe(3).toString("hex")}async function Hx(e,t,n){if(t.length>YB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${YB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Ape(e);await vpe(r,{recursive:!0});let o=`${Cpe()}-${_pe()}-${n}.png`,i=jx(r,o);await Tpe(i,t);let{size:s}=await kpe(i);return{path:i,bytes:s}}var _Je,YB,JB=y(()=>{"use strict";j();py();_Je=Rpe(Epe);YB=5*1024*1024});var QB={};ro(QB,{PlaywrightProvider:()=>Wx});function XB(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 Wx,ZB=y(()=>{"use strict";LB();GB();zB();ly();VB();JB();Wx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dy(t)}async open(t){let n=ay(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 Ux(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 my(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 my(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 Bx(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${XB(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 Ux(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await my(r,{observationCounter:o.observationCounter,screenshotPath:m,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 Bx(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${XB(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 Hx(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 Hx(n,o,r);return i}catch{return null}}}});var Ks={};ro(Ks,{__resetBrowserRegistryForTests:()=>Dpe,browserProviderActive:()=>Mpe,closeBrowserProvider:()=>Kx,getBrowserProvider:()=>Ppe,peekBrowserProvider:()=>Ope});function eU(){Promise.resolve(Kx()).then(()=>{process.exit(130)})}function tU(){Promise.resolve(Kx()).then(()=>{process.exit(143)})}function nU(){Dr=null}function Ipe(){fy||(process.on("SIGINT",eU),process.on("SIGTERM",tU),process.on("exit",nU),fy=!0)}function rU(){fy&&(process.removeListener("SIGINT",eU),process.removeListener("SIGTERM",tU),process.removeListener("exit",nU),fy=!1)}async function Ppe(e){return Dr!==null?Dr:(Ws!==null||(Ws=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(ZB(),QB)),n=OB(e),r=new t(n);return Ipe(),Dr=r,Ws=null,r})()),Ws)}async function Kx(){if(Dr===null)return;let e=Dr;Dr=null,Ws=null,rU(),await e.shutdown()}function Mpe(){return Dr!==null}function Ope(){return Dr}function Dpe(){Dr=null,Ws=null,rU()}var Dr,Ws,fy,Gs=y(()=>{"use strict";ly();Dr=null,Ws=null,fy=!1});async function oU(e,t){try{return await vB(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Upe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Gs(),Ks));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function iU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Upe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await sy(n,e,{headers:Bpe,signal:t.signal},o);l=d.status,a=d.url||e;let m=d.headers.get("content-type")??"";if(d.ok){if(Npe.test(m))throw new Error(`web_scrape markdown mode received binary content (${m.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Lpe.test(m)&&!Fpe.test(m))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await oU(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=Px({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Ep(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Ep(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Ep(d.finalUrl,o);let m=await oU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||m.textLength>=i.textLength){let f=Px({html:d.html,extractedTextLength:m.textLength});return{title:m.title,markdown:m.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 m=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 (${m}).`);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 Fpe,Lpe,Npe,Bpe,sU=y(()=>{"use strict";kB();Mx();Fx();pe();Fpe=/(text\/html|application\/xhtml\+xml)/i,Lpe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Npe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Bpe={"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 Wpe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(jpe,{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),Hpe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ve(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 aU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Wpe({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 lU(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 jpe,Hpe,cU=y(()=>{"use strict";ct();jpe="https://api.exa.ai/search",Hpe=10});function gy(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 qs=y(()=>{"use strict";cy()});function Ype(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=Kpe;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,Gpe)}let a=qpe;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,zpe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function Gx(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:lo(e,t),truncated:!0}}function Jpe(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=Ype(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 m=await $x(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!m.allowed)return{content:`web_scrape blocked: ${m.reason}`,isError:!0}}if(s.mode==="raw"){let m;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};m=await sy(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(!m.ok)return{content:`web_scrape HTTP ${m.status} ${m.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await m.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=Gx(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let m=await iU(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(m.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=Gx(TB(m.markdown,m.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(m){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(m instanceof ir)return{content:`web_scrape blocked: ${m.message}`,isError:!0};let f=m instanceof Error?m.message:String(m),g=an(m)&&!Lx(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Rp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=aU({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let m=await d.search(s.query,{limit:Vpe,timeoutMs:s.timeoutMs,signal:a.signal}),f=Gx(lU(s.query,m),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(m){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${m instanceof Error?m.message:String(m)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var Kpe,Gpe,qpe,zpe,Vpe,uU,dU=y(()=>{"use strict";sU();cU();Fx();oi();Mx();qs();Kpe=3e4,Gpe=12e4,qpe=1e5,zpe=1e6,Vpe=10;uU=Jpe()});import{existsSync as mU,mkdirSync as Xpe,readFileSync as Qpe,renameSync as Zpe,unlinkSync as eme,writeFileSync as tme}from"node:fs";import{dirname as pU,join as nme}from"node:path";import{randomBytes as rme}from"node:crypto";function Tn(e){let t=e??PE();if(!mU(t))return[];try{let n=Qpe(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 ui(e,t){let n=t??PE();Xpe(pU(n),{recursive:!0});let r=nme(pU(n),`.schedules.json.${process.pid}.${rme(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{tme(r,o,"utf-8"),Zpe(r,n)}catch(i){try{mU(r)&&eme(r)}catch{}throw i}}function hy(e,t){let n=Tn(t),r=n.map(l=>l.id),o=ome(e.name),i=ime(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),ui(n,t),a}function yy(e,t){let n=Tn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(ui(o,t),!0)}function Ap(e,t){return Tn(t).find(n=>n.id===e)}function ome(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function ime(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function by(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 Sy=y(()=>{"use strict";j()});import{existsSync as sme,readFileSync as ame}from"node:fs";import{join as lme}from"node:path";async function Bn(e,t,n){let r;try{let o=lme(xg("default"),"port");if(!sme(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=ame(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var di,qx=y(()=>{"use strict";j();di="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 cme}from"node:fs";import{readFile as ume}from"node:fs/promises";var fU,gU,hU,yU,bU=y(()=>{"use strict";Sy();j();qx();fU=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=hy({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:di}})}},gU=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})))}},hU=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(!cme(i))return{content:JSON.stringify([])};let s;try{let c=await ume(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1873,7 +1873,7 @@ ${E}
1873
1873
  ${v}`})}return{fileBlocks:l,warnings:c}}function E7(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function R7(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}}N();L();function x7(e){return{startedAt:e,received:!1}}function A7(e){return e.received?{}:{turnStartedAt:e.startedAt}}function C7(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function _7(e){ze()&&(e??{fn:console.log}).fn(p.dim(" \u25E6 waiting for response\u2026"))}jv();async function I7(e,t,n,r,o="summary",i,s){let a=vX(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=x7(l);_7(i),fu(process.stdout,Jm(process.cwd(),!0));let u="",d=0,m=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,T=!1,E={abort:null},v=0,A=3e3,C=[],_=new Map,R=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,I=()=>{let U=r.subagentControl;U?.hasPromotableForeground()&&R7(U,P,r.onQueuedUserMessage).then(({jobs:H,flushedText:K,flushedPreview:O})=>{let z=(i??{fn:console.log}).fn;for(let $ of H)z(p.dim(` \u2192 subagent backgrounded as ${$.jobId}: ${$.label}`));K!==void 0&&z(p.dim(` \u2192 queued message sent to this turn: ${E7(O??K)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,M=()=>new Uu({out:ju(i),thinkingMode:o,...R?{activeSkillName:R}:{},onCancel:()=>{t.interrupt().catch(U=>{He()&&console.error(" "+p.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}:{},...P?{compositor:P}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...A7(c)}),W=M(),F=async()=>{if(!h){h=!0;try{await W.dispose()}catch{}}},X=async()=>{await W.arm();let U=W.getCompositor();if(i&&U){let H=U;i.fn=K=>H.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(U),r.setInterruptNotifier?.(H=>W.setInterrupting(H)),r.rearmStatus?.()};try{P?P.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{w=!0,W.setSoftStopping(!0),t.interrupt().catch(te=>{He()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),te)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(te=>{He()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),te)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{T=!0,t.interrupt().catch($=>{He()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),$)})}),await X(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(I);let{fileBlocks:U,warnings:H}=T7(e.text,{rootDir:process.cwd()});for(let $ of H)(i??{fn:console.log}).fn(p.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 k7(e.text,e.attachments,void 0,U,t.sessionId):e.text,O=t.sendMessageStream(K);if(await oc(($,te)=>{W.process($,te)},async()=>{for await(let $ of O){if(w||T)break;let te=C7(c,$,f);if($.type==="chunk"&&$.chunk.type==="content"?(u=m?y7(u,$.chunk.content):u+$.chunk.content,m=!1,f=!0):$.type==="message"&&!f&&(u=$.message.content),$.type==="stream_retry"&&(u=u.slice(0,d),m=u.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let Z=$.chunk,Q={toolName:Z.toolName,toolUseId:Z.toolUseId,input:Z.toolInput,...Z.toolInputRaw!==void 0&&{inputRaw:Z.toolInputRaw}};_.set(Z.toolUseId,Q),C.push(Q)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let Z=$.chunk;d=u.length,m=!0;let Q=_.get(Z.toolUseId);if(Q&&(Q.result=Z.content,Q.isError=Z.isError,_.delete(Z.toolUseId)),r.onContextProgress){let ae=Date.now();if(ae-v>=A){v=ae;try{let _e=r.onContextProgress();_e instanceof Promise&&await _e}catch(_e){He()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),_e)}}}}if($.type==="paused"){if(r.setPausedState?.(!0),await F(),P&&$.autoResume===!0){let Z=new AbortController;E.abort=Z;let Q=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,ae=Q?`Keep waiting \u2014 auto-resumes at ${Q}`:"Keep waiting \u2014 auto-resume in progress",_e="Switch model / provider (type /model after)",Vt="Stop waiting",je=[p.warning(" \u23F3 Usage limit reached.")+(Q?p.dim(` Auto-resumes at ${Q}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];fn(P,{header:je,options:[ae,_e,Vt],signal:Z.signal,initialIndex:0}).then(Pe=>{if(E.abort=null,!Pe)return;let ce=Pe[0];ce===void 0||ce===ae||(T=!0,ce===_e&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(tt=>{He()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),tt)}))}).catch(Pe=>{He()&&console.error(" "+p.error("picker promise rejected:"),Pe)})}else(i??{fn:console.log}).fn(A$({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let Z=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";u="",d=0,m=!1,f=!1,C.length=0,_.clear(),b=!1,S=void 0,g=!1,W=M(),h=!1,await X(),(i??{fn:console.log}).fn(p.success(Z));continue}if($.type==="error"){await F(),wl(ml($.error)),g=!0;continue}W.process($),te&&W.notifyFirstContent(),$.type==="done"&&(b=!0,S=$.metadata)}}),await F(),w){let $=i?i.fn:console.log,te=P?P.getPendingCount():0,Z=te>0?` \xB7 ${te} queued`:"";$(p.warning(`\u23F8 Stopped${Z} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),$("")}if(T){let $=i?i.fn:console.log;$(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(b&&!w&&!T){Sa(n,a,u,S,C),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),mu(process.stdout),_4(process.stdout,"afk: turn complete");let $=Z=>{i?i.fn(Z):console.log(Z)},te=AT(u);if(te){$(b7(te)),$("");let Z=L8(C);if(r.onTerminalState)try{r.onTerminalState(te,{doneHasCorroboratingEvidence:Z})}catch{}if(n.permissionMode==="autonomous"){let Q=te.kind==="done"&&kp().verifyDone===!0&&!Z;B8(te,void 0,{unverified:Q})}}if(eO(S,n,$),r.onAfterTurn){let Z=r.onAfterTurn();Z instanceof Promise&&await Z.catch(()=>{})}}}catch(U){await F(),g||wl(ml(U))}finally{await F(),fu(process.stdout,Jm(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),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Hi();var IDe=5e3,PDe=3,MDe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function ODe(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(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function P7(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:m,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async I=>{He()&&(h=Fk(I)),await Rf(e.session.current),He()&&(b=EM())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,T=!1,E=!1,v,A,C,_=(()=>{let I=parseInt(e.options.maxTurns,10);return I>0?I:void 0})(),R=0;for(g.onInjectable=()=>{R>=PDe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(R++,mu(process.stdout),S={text:MDe,attachments:[]},o.abortPendingRead())};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let O of b)e.replRenderer.writeLine(O);e.replRenderer.writeLine(""),b=[]}let I=f.drainNotifications();for(let{job:O,result:z}of I){let $=z.errorReason===void 0?"\u2713":"\u2717",te=z.errorReason==="abort"?"killed":z.errorReason==="timeout"?"timed out":z.errorReason==="signal-killed"?"killed by signal":`exit ${z.exitCode??0}`,Z=Math.max(0,Math.round(z.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${$} [${O.id}] ${te} \xB7 ${Z}s \xB7 `)+O.command)}let P=g.drainNotifications();for(let{job:O}of P){let z=O.status==="completed"?"\u2713":O.status==="failed"?"\u2717":"\u2298",$=O.endedAt!==void 0?Math.max(0,Math.round((O.endedAt-O.startedAt)/100)/10):0,te=ie(O.label,60);e.replRenderer.writeLine(p.dim(` ${z} [${O.jobId}] subagent ${O.status} \xB7 ${$}s \xB7 `)+te)}let M=l.renderIfChanged(e.stats.sessionId);if(M.length>0){for(let O of M)e.replRenderer.writeLine(O);e.replRenderer.writeLine("")}let W,F;if(S===void 0){let O=await e.session.current.takePendingPlanExitSeed();O!==void 0&&(e.stats.permissionMode=O.mode,S={text:O.message,attachments:[]})}if(S!==void 0){let O=S;S=void 0;let z=Ju(e.stats.permissionMode),$=Ea({buffer:O.text,promptText:z,isTTY:!!process.stdout.isTTY,attachmentSummary:xu([...O.attachments])});e.replRenderer.writeLine($),W=O.text.trim(),F=O.attachments}else{let O=w;w=void 0;let z=await o.readLine({promptFn:()=>Ju(e.stats.permissionMode),...O!==void 0?{initialBuffer:O}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{vT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});W=z.text.trim(),F=z.attachments}if(!W&&F.length===0)continue;if(W.startsWith("!")){let O=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!O&&(T||(T=!0,e.replRenderer.writeLine(p.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(W))){e.statusLine.rearm();continue}}let X=!1;if(W.startsWith("/")){let O=await M4(W,e.slashCtx,F);if(O.handled){if(O.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((W==="/clear"||W.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),m.reset(),v=void 0),O.result!==null&&typeof O.result=="object"&&"kind"in O.result&&O.result.kind==="submit"){S={text:O.result.message,attachments:F??[]},e.statusLine.rearm();continue}if(O.result!==null&&typeof O.result=="object"&&"kind"in O.result&&O.result.kind==="prefill"){w=O.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}X=!0}a.push(W),await ODe(e,W);let U=W;if(X){let O=tP(W);if(O){let z=O.name.replace(/^\//,"").split(":").pop()??"";if(z&&SM(z)){let $={skillName:z,rawArgs:O.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},te=e.session.current.sessionId,Z=La(te),Q=Date.now();B(`[afk trace] preflight.start commandName=${z}`);let ae=!1,_e=await Fa($,{cwd:e.stats.cwd??process.cwd(),artifactDir:Z},Vt=>{He()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${z}) failed: `)+(Vt instanceof Error?Vt.message:String(Vt)))});ae=_e!==null,B(`[afk trace] preflight.end commandName=${z} durationMs=${Date.now()-Q} success=${ae}`),U=kM(_e?.manifestBlock,W)}}}let H=f.drainInjections();H.length>0&&(U=H+U);let K=g.drainInjections();if(K.length>0&&(U=K+U),v!==void 0&&(U=v+`
1874
1874
 
1875
1875
  `+U,v=void 0),e.hookRegistry)try{let O={event:"UserPromptSubmit",prompt:U,sessionId:e.stats.sessionId},z=await e.hookRegistry.dispatch(O);z.injectContext&&(U=z.injectContext+U)}catch(O){if(O instanceof Re){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(O.reason?p.dim(`: ${ve(O.reason)}`):"")),e.statusLine.rearm();continue}if(O instanceof Cr){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${O.timeoutMs}ms`)),e.statusLine.rearm();continue}throw O}if(A=void 0,C=void 0,await I7({text:U,attachments:F},e.session.current,e.stats,{setInFlight(O){n.turnInFlight=O},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(O){await t.appendUser(O)},async onQueuedUserMessage(O){await t.appendQueuedUser(O)},async onTurnComplete(O,z){if(await t.appendTurn(O,z),e.stats.sessionId)try{ji(e.stats)}catch($){E||(E=!0,e.replRenderer.writeLine(p.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,_)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(O,z)=>{m?.push(O),A=O.kind,C=z?.doneHasCorroboratingEvidence},setActiveCompositor:O=>{n.activeCompositor=O,O===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:O=>{n.notifyInterrupting=O},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:O=>o.setBackgroundHandler(O),setSoftStopHandler:i,setPausedState:O=>o.setPausedState(O),setPauseInterruptHandler:O=>o.setPauseInterruptHandler(O),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,_)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(O,z)=>{c.repaint(O),u?.onStage(O,z)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ju(e.stats.permissionMode))),e.hookRegistry)try{let O=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...A!==void 0?{terminalState:A}:{},...C!==void 0?{doneHasCorroboratingEvidence:C}:{}},void 0,IDe);O.injectContext&&O.injectContext.trim().length>0&&(v=O.injectContext)}catch(O){if(O instanceof At)throw O;O instanceof Cr?(B("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):O instanceof Re?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${ve(O.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(O))}}}function DDe(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 M7(e,t,n,r){let o=await OQ(),i=new wT({rl:e.rl,history:o,statusLine:e.statusLine}),s=DDe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await ZQ(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=h7(e,n),await P7(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)}}fp();zl();import{execFile as $De}from"node:child_process";import{dirname as FDe,isAbsolute as LDe,resolve as NDe}from"node:path";import{promisify as BDe}from"node:util";var O7=BDe($De),UDe=3e3,jDe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function HDe(){let t=(await O7("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=LDe(t)?t:NDe(process.cwd(),t);return FDe(n)}async function D7(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await HDe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),UDe)});try{let o=jn({execFile:O7,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=>jDe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Zg();fp();import{promises as WDe}from"node:fs";import{dirname as KDe,join as L7}from"node:path";import{randomBytes as GDe}from"node:crypto";var qDe=["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(`
1876
- `),$7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,nO=30,zDe=1024,VDe=8e3,YDe="haiku";async function JDe(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=e$e(n,zDe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??VDe),s=t.signal?t$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rl({token:t.token,model:t.model??YDe,system:qDe,user:r,maxTokens:32,signal:s})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=XDe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=KDe(t.worktreePath);return await QDe(l,c)}function XDe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if($7.test(t)&&t.length<=nO)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>nO)break;o=s}return $7.test(o)?o:null}async function QDe(e,t){if(!await ZDe(L7(t,e)))return e;let n=GDe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,nO-5)}-${n}`}async function ZDe(e){try{return await WDe.access(e),!0}catch{return!1}}function e$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 t$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 N7(e){let t,n,r=L7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await JDe(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=`${Qh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return F7(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 F7(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 F7(e,t){e&&e.setCwd(t),n$e(t)}function n$e(e){try{process.chdir(e)}catch{}}ft();kt();dl();Jr();j();import{spawn as U7}from"child_process";import{existsSync as j7,mkdirSync as a$e,readFileSync as H7,unlinkSync as B7,writeFileSync as W7}from"fs";import{get as l$e}from"https";import{join as K7}from"path";import{readFileSync as r$e}from"fs";import{dirname as o$e,join as i$e}from"path";import{fileURLToPath as s$e}from"url";function Zr(){try{return"5.128.0"}catch{}try{let e=o$e(s$e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(r$e(i$e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();N();var c$e=64*1024,u$e=10800*1e3,d$e=800,p$e=3600*1e3,m$e="update-check.json",f$e="pending-update.json";function rO(){return K7(ll(),m$e)}function Hf(){return K7(ll(),f$e)}function oO(){let e=ll();j7(e)||a$e(e,{recursive:!0})}function G7(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 q7(){try{let e=H7(rO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function z7(){try{oO();let e=`
1876
+ `),$7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,nO=30,zDe=1024,VDe=8e3,YDe="haiku";async function JDe(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=e$e(n,zDe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??VDe),s=t.signal?t$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rl({token:t.token,model:t.model??YDe,system:qDe,user:r,maxTokens:32,signal:s})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=XDe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=KDe(t.worktreePath);return await QDe(l,c)}function XDe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if($7.test(t)&&t.length<=nO)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>nO)break;o=s}return $7.test(o)?o:null}async function QDe(e,t){if(!await ZDe(L7(t,e)))return e;let n=GDe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,nO-5)}-${n}`}async function ZDe(e){try{return await WDe.access(e),!0}catch{return!1}}function e$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 t$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 N7(e){let t,n,r=L7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await JDe(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=`${Qh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return F7(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 F7(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 F7(e,t){e&&e.setCwd(t),n$e(t)}function n$e(e){try{process.chdir(e)}catch{}}ft();kt();dl();Jr();j();import{spawn as U7}from"child_process";import{existsSync as j7,mkdirSync as a$e,readFileSync as H7,unlinkSync as B7,writeFileSync as W7}from"fs";import{get as l$e}from"https";import{join as K7}from"path";import{readFileSync as r$e}from"fs";import{dirname as o$e,join as i$e}from"path";import{fileURLToPath as s$e}from"url";function Zr(){try{return"5.128.2"}catch{}try{let e=o$e(s$e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(r$e(i$e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();N();var c$e=64*1024,u$e=10800*1e3,d$e=800,p$e=3600*1e3,m$e="update-check.json",f$e="pending-update.json";function rO(){return K7(ll(),m$e)}function Hf(){return K7(ll(),f$e)}function oO(){let e=ll();j7(e)||a$e(e,{recursive:!0})}function G7(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 q7(){try{let e=H7(rO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function z7(){try{oO();let e=`
1877
1877
  const https = require('https');
1878
1878
  const fs = require('fs');
1879
1879
  const url = 'https://registry.npmjs.org/agent-afk/latest';