agent-afk 5.145.0 → 5.145.1

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
@@ -377,7 +377,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
377
377
 
378
378
  ${t}`}var Ime,iA=y(()=>{"use strict";Ime=new Set(["script","style","noscript","template","svg"])});function Ome(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 IU(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function Dme(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 PU(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Ome,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(!Mme.has(d.status)||u===o)return d;let p=Dme(d,s)??IU(u,i,s);F("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=IU(u,i,s);F("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var Mme,MU=y(()=>{"use strict";ue();Mme=new Set([429,502,503,504])});import{BlockList as $me,isIP as aA}from"node:net";import{lookup as Fme}from"node:dns/promises";import{Agent as Lme}from"undici";function DU(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function jme(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function sA(e){let t=aA(e);return t===0?!1:Ume.check(e,t===4?"ipv4":"ipv6")}async function $U(e){return Fme(e,{all:!0,verbatim:!0})}async function lA(e,t={}){if(t.allowPrivateHosts??DU())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=jme(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(aA(r)!==0)return sA(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??$U,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(sA(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Np(e,t={}){let n=await lA(e,t);if(!n.allowed)throw new lr(n.reason)}async function Ry(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<=OU;s++){await Np(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??DU())?{dispatcher:Hme}:{}},l=await PU(e,i,a,r.retry??{});if(!Wme.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 lr(`too many redirects (>${OU}) starting from ${t}`)}var Nme,Bme,Ume,lr,Hme,OU,Wme,cA=y(()=>{"use strict";U();MU();Nme=[["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]],Bme=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Ume=(()=>{let e=new $me;for(let[t,n]of Nme)e.addSubnet(t,n,"ipv4");for(let[t,n]of Bme)e.addSubnet(t,n,"ipv6");return e})(),lr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Hme=new Lme({connect:{lookup(e,t,n){$U(e).then(r=>{let o=r.find(s=>sA(s.address));if(o!==void 0){n(new lr(`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,aA(i.address))},r=>n(r,"",0))}}});OU=20,Wme=new Set([301,302,303,307,308])});import{readFileSync as Kme}from"node:fs";import{join as Gme}from"path";function qme(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function FU(e,t){return qme(t).test(e)}function Jme(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(zme.has(t))return!0;if(Vme.has(t))return!1}return!1}function LU(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Yme(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 NU(e){let t=e===void 0||e.trim()===""?"default":e.trim();return $d(t),t}function Xme(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Qme(e){try{return Kme(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Zme(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=NU(t.defaultProfile)),n}function BU(e){let t=e?.env??v,n=e?.readFileSync??Qme,r=e?.surface??t.AGENT_SURFACE,o=Jme(t.AFK_BROWSER_HEADLESS,r),i=LU(t.AFK_BROWSER_ALLOWED_DOMAINS),s=LU(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Xme(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Yme(t.AFK_BROWSER_BACKEND),c=NU(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():Gme(tr(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Zme(u,g);return h.configPath=p,h}function xy(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(FU(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>FU(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var zme,Vme,Ay=y(()=>{"use strict";U();H();zme=new Set(["daemon","subagent","telegram","afk"]),Vme=new Set(["repl","interactive","cli"])});import{existsSync as efe,readFileSync as tfe}from"node:fs";import{createRequire as nfe}from"node:module";import{dirname as rfe,join as ofe}from"node:path";function HU(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<sfe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function un(e){let t=HU(e);return jU.some(n=>t.includes(n))}function afe(){try{let t=nfe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(tfe(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=ofe(rfe(t),o);return efe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Bp(){return UU??=afe()??ife,UU}function uA(e){return e.includes("install chromium")}function Un(e,t){let n=HU(e),r=t?.latched===!0?` ${lfe}`:"";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: ${Bp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Bp()}). Or pick a different tool.${r}`}function Up(e,t,n=!1){if(!un(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
379
379
 
380
- ${Un(e,{headless:t,latched:n})}`,{cause:e})}var jU,ife,sfe,UU,lfe,Cy=y(()=>{"use strict";jU=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],ife="pnpm exec playwright install chromium",sfe=4;lfe="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 Vs from"node:fs";import _y from"node:path";import{randomBytes as cfe}from"node:crypto";import{chromium as ufe}from"playwright";function dfe(){try{return"5.145.0"}catch{}try{let e=_y.resolve(import.meta.dirname,"../../../package.json"),t=Vs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var pfe,Iy,WU=y(()=>{"use strict";Cy();H();ue();pfe=dfe(),Iy=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=ufe.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=Up(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${pfe}`}}loadStorageState(t){let n=Fd(t);try{if(!Vs.existsSync(n))return;let r=JSON.parse(Vs.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Fd(t);if(!Vs.existsSync(r))return;let o=await n.storageState(),i=_y.join(_y.dirname(r),`.${_y.basename(r)}.${process.pid}.${cfe(4).toString("hex")}.tmp`);Vs.writeFileSync(i,JSON.stringify(o),{mode:384}),Vs.chmodSync(i,384),Vs.renameSync(i,r),F("[browser/vault] saved session",{profile:t,file:r})}catch(r){F("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as mfe}from"crypto";function KU(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&ffe.test(e.label))}function GU(e){return mfe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function qU(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var ffe,Py=y(()=>{"use strict";ffe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as gfe}from"node:crypto";function hfe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function yfe(e,t,n){return`el_${gfe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function bfe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function zU(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function JU(e,t){let n=e.role??"",r=e.name??"";VU.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])JU(i,t)}async function Sfe(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},YU).catch(()=>[])}async function wfe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},YU).catch(()=>[])}function vfe(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=vfe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Sfe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],JU(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await wfe(e)).filter(D=>VU.has(D.role??"")));let w=new Map;for(let P of p){let D=zU(P.name),L=w.get(D);(!L||L.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(zU(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let L=P.dom?.bbox.y??0,B=D.dom?.bbox.y??0;if(L!==B)return L-B;let G=P.dom?.bbox.x??0,K=D.dom?.bbox.x??0;return G-K}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let L=P.ax.role??"generic",B=P.ax.name??"",G=yfe(L,B,D),K=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,q=null;P.ax.value!==void 0&&P.ax.value!==null&&(q=String(P.ax.value)),P.ax.checked!==void 0&&(q=String(P.ax.checked)),KU({role:L,kind:W})&&(q="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let j={id:G,role:L,label:hfe(B),kind:W,value:q,state:M,bbox:K};return $!==void 0&&(j.selector=$),j}),I="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?I="loading":P==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=bfe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var VU,YU,XU=y(()=>{"use strict";Py();VU=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);YU="a[href], button, input, select, textarea, [role], [tabindex], label"});async function QU(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 dA(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>QU(e,i)))).filter(o=>o!==null)}async function kfe(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 pA(e,t,n){switch(t.kind){case"element_id":return Tfe(e,t,n);case"selector":return Efe(e,t);case"semantic":return Rfe(e,t)}}async function Tfe(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 dA(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Efe(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 dA(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Rfe(e,t){return t.role!==void 0?xfe(e,t.text,t.role):Afe(e,t.text,t)}async function xfe(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 dA(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Afe(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 kfe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await QU(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var ZU=y(()=>{"use strict"});async function mA(e,t,n,r){let o=e.url();if(o===n)return null;let i=xy(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 ej=y(()=>{"use strict";Ay()});import{randomBytes as Cfe}from"crypto";import{mkdir as _fe,stat as Ife,writeFile as Pfe}from"fs/promises";import{join as fA}from"path";import{gzip as Mfe}from"zlib";import{promisify as Ofe}from"util";function Dfe(e){return fA(wn(e),"browser")}function $fe(e){return fA(Dfe(e),"screenshots")}function Ffe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Lfe(){return Cfe(3).toString("hex")}async function gA(e,t,n){if(t.length>tj)throw new Error(`writeScreenshotSidecar: buffer exceeds ${tj} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=$fe(e);await _fe(r,{recursive:!0});let o=`${Ffe()}-${Lfe()}-${n}.png`,i=fA(r,o);await Pfe(i,t);let{size:s}=await Ife(i);return{path:i,bytes:s}}var A5e,tj,nj=y(()=>{"use strict";H();Py();A5e=Ofe(Mfe);tj=5*1024*1024});var oj={};ao(oj,{PlaywrightProvider:()=>hA});function rj(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 hA,ij=y(()=>{"use strict";WU();XU();ZU();Ay();ej();nj();hA=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Iy(t)}async open(t){let n=xy(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 mA(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 pA(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${rj(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 mA(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await My(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await pA(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${rj(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 gA(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 gA(n,o,r);return i}catch{return null}}}});var Ys={};ao(Ys,{__resetBrowserRegistryForTests:()=>Hfe,browserProviderActive:()=>Ufe,closeBrowserProvider:()=>yA,getBrowserProvider:()=>Bfe,peekBrowserProvider:()=>jfe});function sj(){Promise.resolve(yA()).then(()=>{process.exit(130)})}function aj(){Promise.resolve(yA()).then(()=>{process.exit(143)})}function lj(){Nr=null}function Nfe(){Oy||(process.on("SIGINT",sj),process.on("SIGTERM",aj),process.on("exit",lj),Oy=!0)}function cj(){Oy&&(process.removeListener("SIGINT",sj),process.removeListener("SIGTERM",aj),process.removeListener("exit",lj),Oy=!1)}async function Bfe(e){return Nr!==null?Nr:(Js!==null||(Js=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(ij(),oj)),n=BU(e),r=new t(n);return Nfe(),Nr=r,Js=null,r})()),Js)}async function yA(){if(Nr===null)return;let e=Nr;Nr=null,Js=null,cj(),await e.shutdown()}function Ufe(){return Nr!==null}function jfe(){return Nr}function Hfe(){Nr=null,Js=null,cj()}var Nr,Js,Oy,Xs=y(()=>{"use strict";Ay();Nr=null,Js=null,Oy=!1});async function uj(e,t){try{return await AU(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Vfe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Xs(),Ys));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function dj(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Vfe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Ry(n,e,{headers:zfe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(qfe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Gfe.test(p)&&!Kfe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await uj(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof lr||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=oA({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Np(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Np(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Np(d.finalUrl,o);let p=await uj(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=oA({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof lr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Kfe,Gfe,qfe,zfe,pj=y(()=>{"use strict";CU();iA();cA();ue();Kfe=/(text\/html|application\/xhtml\+xml)/i,Gfe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,qfe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,zfe={"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 Xfe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Jfe,{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),Yfe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function mj(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Xfe({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 fj(e,t){if(t.length===0)return`# Search results for "${e}"
380
+ ${Un(e,{headless:t,latched:n})}`,{cause:e})}var jU,ife,sfe,UU,lfe,Cy=y(()=>{"use strict";jU=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],ife="pnpm exec playwright install chromium",sfe=4;lfe="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 Vs from"node:fs";import _y from"node:path";import{randomBytes as cfe}from"node:crypto";import{chromium as ufe}from"playwright";function dfe(){try{return"5.145.1"}catch{}try{let e=_y.resolve(import.meta.dirname,"../../../package.json"),t=Vs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var pfe,Iy,WU=y(()=>{"use strict";Cy();H();ue();pfe=dfe(),Iy=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=ufe.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=Up(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${pfe}`}}loadStorageState(t){let n=Fd(t);try{if(!Vs.existsSync(n))return;let r=JSON.parse(Vs.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Fd(t);if(!Vs.existsSync(r))return;let o=await n.storageState(),i=_y.join(_y.dirname(r),`.${_y.basename(r)}.${process.pid}.${cfe(4).toString("hex")}.tmp`);Vs.writeFileSync(i,JSON.stringify(o),{mode:384}),Vs.chmodSync(i,384),Vs.renameSync(i,r),F("[browser/vault] saved session",{profile:t,file:r})}catch(r){F("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as mfe}from"crypto";function KU(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&ffe.test(e.label))}function GU(e){return mfe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function qU(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var ffe,Py=y(()=>{"use strict";ffe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as gfe}from"node:crypto";function hfe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function yfe(e,t,n){return`el_${gfe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function bfe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function zU(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function JU(e,t){let n=e.role??"",r=e.name??"";VU.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])JU(i,t)}async function Sfe(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},YU).catch(()=>[])}async function wfe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},YU).catch(()=>[])}function vfe(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=vfe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Sfe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],JU(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await wfe(e)).filter(D=>VU.has(D.role??"")));let w=new Map;for(let P of p){let D=zU(P.name),L=w.get(D);(!L||L.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(zU(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let L=P.dom?.bbox.y??0,B=D.dom?.bbox.y??0;if(L!==B)return L-B;let G=P.dom?.bbox.x??0,K=D.dom?.bbox.x??0;return G-K}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let L=P.ax.role??"generic",B=P.ax.name??"",G=yfe(L,B,D),K=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,q=null;P.ax.value!==void 0&&P.ax.value!==null&&(q=String(P.ax.value)),P.ax.checked!==void 0&&(q=String(P.ax.checked)),KU({role:L,kind:W})&&(q="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let j={id:G,role:L,label:hfe(B),kind:W,value:q,state:M,bbox:K};return $!==void 0&&(j.selector=$),j}),I="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?I="loading":P==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=bfe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var VU,YU,XU=y(()=>{"use strict";Py();VU=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);YU="a[href], button, input, select, textarea, [role], [tabindex], label"});async function QU(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 dA(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>QU(e,i)))).filter(o=>o!==null)}async function kfe(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 pA(e,t,n){switch(t.kind){case"element_id":return Tfe(e,t,n);case"selector":return Efe(e,t);case"semantic":return Rfe(e,t)}}async function Tfe(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 dA(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Efe(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 dA(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Rfe(e,t){return t.role!==void 0?xfe(e,t.text,t.role):Afe(e,t.text,t)}async function xfe(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 dA(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Afe(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 kfe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await QU(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var ZU=y(()=>{"use strict"});async function mA(e,t,n,r){let o=e.url();if(o===n)return null;let i=xy(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 ej=y(()=>{"use strict";Ay()});import{randomBytes as Cfe}from"crypto";import{mkdir as _fe,stat as Ife,writeFile as Pfe}from"fs/promises";import{join as fA}from"path";import{gzip as Mfe}from"zlib";import{promisify as Ofe}from"util";function Dfe(e){return fA(wn(e),"browser")}function $fe(e){return fA(Dfe(e),"screenshots")}function Ffe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Lfe(){return Cfe(3).toString("hex")}async function gA(e,t,n){if(t.length>tj)throw new Error(`writeScreenshotSidecar: buffer exceeds ${tj} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=$fe(e);await _fe(r,{recursive:!0});let o=`${Ffe()}-${Lfe()}-${n}.png`,i=fA(r,o);await Pfe(i,t);let{size:s}=await Ife(i);return{path:i,bytes:s}}var A5e,tj,nj=y(()=>{"use strict";H();Py();A5e=Ofe(Mfe);tj=5*1024*1024});var oj={};ao(oj,{PlaywrightProvider:()=>hA});function rj(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 hA,ij=y(()=>{"use strict";WU();XU();ZU();Ay();ej();nj();hA=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Iy(t)}async open(t){let n=xy(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 mA(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 pA(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${rj(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 mA(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await My(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await pA(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${rj(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 gA(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 gA(n,o,r);return i}catch{return null}}}});var Ys={};ao(Ys,{__resetBrowserRegistryForTests:()=>Hfe,browserProviderActive:()=>Ufe,closeBrowserProvider:()=>yA,getBrowserProvider:()=>Bfe,peekBrowserProvider:()=>jfe});function sj(){Promise.resolve(yA()).then(()=>{process.exit(130)})}function aj(){Promise.resolve(yA()).then(()=>{process.exit(143)})}function lj(){Nr=null}function Nfe(){Oy||(process.on("SIGINT",sj),process.on("SIGTERM",aj),process.on("exit",lj),Oy=!0)}function cj(){Oy&&(process.removeListener("SIGINT",sj),process.removeListener("SIGTERM",aj),process.removeListener("exit",lj),Oy=!1)}async function Bfe(e){return Nr!==null?Nr:(Js!==null||(Js=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(ij(),oj)),n=BU(e),r=new t(n);return Nfe(),Nr=r,Js=null,r})()),Js)}async function yA(){if(Nr===null)return;let e=Nr;Nr=null,Js=null,cj(),await e.shutdown()}function Ufe(){return Nr!==null}function jfe(){return Nr}function Hfe(){Nr=null,Js=null,cj()}var Nr,Js,Oy,Xs=y(()=>{"use strict";Ay();Nr=null,Js=null,Oy=!1});async function uj(e,t){try{return await AU(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Vfe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Xs(),Ys));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function dj(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Vfe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Ry(n,e,{headers:zfe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(qfe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Gfe.test(p)&&!Kfe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await uj(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof lr||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=oA({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Np(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Np(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Np(d.finalUrl,o);let p=await uj(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=oA({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof lr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Kfe,Gfe,qfe,zfe,pj=y(()=>{"use strict";CU();iA();cA();ue();Kfe=/(text\/html|application\/xhtml\+xml)/i,Gfe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,qfe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,zfe={"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 Xfe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Jfe,{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),Yfe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function mj(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Xfe({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 fj(e,t){if(t.length===0)return`# Search results for "${e}"
381
381
 
382
382
  (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(`
383
383
  `).trimEnd()}var Jfe,Yfe,gj=y(()=>{"use strict";at();Jfe="https://api.exa.ai/search",Yfe=10});function Dy(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 rge(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=Qfe;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,Zfe)}let a=ege;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,tge)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function bA(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:fo(e,t),truncated:!0}}function oge(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=rge(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await lA(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Ry(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof lr?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=bA(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await dj(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=bA(_U(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof lr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=un(p)&&!uA(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Bp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=mj({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:nge,timeoutMs:s.timeoutMs,signal:a.signal}),f=bA(fj(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var Qfe,Zfe,ege,tge,nge,hj,yj=y(()=>{"use strict";pj();gj();cA();ci();iA();Qs();Qfe=3e4,Zfe=12e4,ege=1e5,tge=1e6,nge=10;hj=oge()});import{existsSync as Sj,mkdirSync as ige,readFileSync as sge,renameSync as age,unlinkSync as lge,writeFileSync as cge}from"node:fs";import{dirname as bj,join as uge}from"node:path";import{randomBytes as dge}from"node:crypto";function Rn(e){let t=e??tR();if(!Sj(t))return[];try{let n=sge(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 fi(e,t){let n=t??tR();ige(bj(n),{recursive:!0});let r=uge(bj(n),`.schedules.json.${process.pid}.${dge(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{cge(r,o,"utf-8"),age(r,n)}catch(i){try{Sj(r)&&lge(r)}catch{}throw i}}function $y(e,t){let n=Rn(t),r=n.map(l=>l.id),o=pge(e.name),i=mge(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),fi(n,t),a}function Fy(e,t){let n=Rn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(fi(o,t),!0)}function jp(e,t){return Rn(t).find(n=>n.id===e)}function pge(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function mge(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function Ly(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 Ny=y(()=>{"use strict";H()});import{existsSync as fge,readFileSync as gge}from"node:fs";import{join as hge}from"node:path";async function jn(e,t,n){let r,o;try{let i=hge(jg("default"),"port");if(!fge(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=gge(i,"utf-8").trim(),a=yge(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function yge(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var gi,SA=y(()=>{"use strict";H();gi="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 bge}from"node:fs";import{readFile as Sge}from"node:fs/promises";var wj,vj,kj,Tj,Ej=y(()=>{"use strict";Ny();H();SA();wj=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=$y({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 jn("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 jn("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:gi}})}},vj=async(e,t)=>{let n=Rn();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})))}},kj=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=Tr();if(!bge(i))return{content:JSON.stringify([])};let s;try{let c=await Sge(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1949,7 +1949,7 @@ ${T}
1949
1949
  ${E}`})}return{fileBlocks:l,warnings:c}}function zZ(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function VZ(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}}U();N();U();dt();N();ka();function JZ(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function YZ(e,t){Fe()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function XZ(e,t,n,r){if(!Fe())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Pe(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${ve(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function QZ(e,t,n,r){if(!Fe())return;let{subagentId:o,agentType:i}=n,s=Pe(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${ve(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var YT=class{state;writer;ttfb;constructor(t,n){this.state=JZ(),this.writer=t,this.ttfb=n}onToolStart(t){YZ(this.state,t)}onToolResult(t,n){XZ(this.state,t,n,this.writer)}onSubagentEvent(t,n){QZ(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function ZZ(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function eee(e){return e.received?{}:{turnStartedAt:e.startedAt}}function tee(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function nee(e,t=process.stdout,n){if(!Fe()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new YT(e,n)))}ue();N();var iLe=3e3;async function ree(e,t){if(!e)return t;let n=Date.now();if(n-t<iLe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){We()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}ck();async function oee(e,t,n,r,o="summary",i,s){let a=H6(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=ZZ(l);nee(i,process.stdout,c),Eu(process.stdout,uf(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,k=!1,T={abort:null},E=0,R=[],I=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,x=()=>{let G=r.subagentControl;G?.hasPromotableForeground()&&VZ(G,_,r.onQueuedUserMessage).then(({jobs:K,flushedText:W,flushedPreview:q})=>{let M=(i??{fn:console.log}).fn;for(let $ of K)M(m.dim(` \u2192 subagent backgrounded as ${$.jobId}: ${$.label}`));W!==void 0&&M(m.dim(` \u2192 queued message sent to this turn: ${zZ(q??W)}`))}).catch(()=>{})},_=r.getCompositor?r.getCompositor():null,P=()=>new Yu({out:Xu(i),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch(G=>{We()&&console.error(" "+m.error("session.interrupt() failed:"),G)})},...r.subagentControl?{onBackground:x}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},..._?{compositor:_}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...eee(c)}),D=P(),L=async()=>{if(!h){h=!0;try{await D.dispose()}catch{}}},B=async()=>{await D.arm();let G=D.getCompositor();if(i&&G){let K=G;i.fn=W=>K.commitAbove(W),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(G),r.setInterruptNotifier?.(K=>D.setInterrupting(K)),r.rearmStatus?.()};try{_?_.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{w=!0,D.setSoftStopping(!0),t.interrupt().catch(j=>{We()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),j)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(j=>{We()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),j)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch($=>{We()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),$)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(x);let{fileBlocks:G,warnings:K}=qZ(e.text,{rootDir:process.cwd()});for(let $ of K)(i??{fn:console.log}).fn(m.dim(` @-file: ${$}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let W=G.length>0||e.attachments.length>0?await GZ(e.text,e.attachments,void 0,G,t.sessionId):e.text,q=t.sendMessageStream(W);if(await fc(($,j)=>{D.process($,j),j&&c.plainHooks?.onSubagentEvent($,j)},async()=>{for await(let $ of q){if(w||k)break;let j=tee(c,$,f);if($.type==="chunk"&&$.chunk.type==="content"?(u=p?UZ(u,$.chunk.content):u+$.chunk.content,p=!1,f=!0):$.type==="message"&&!f&&(u=$.message.content),$.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let X=$.chunk,ee={toolName:X.toolName,toolUseId:X.toolUseId,input:X.toolInput,...X.toolInputRaw!==void 0&&{inputRaw:X.toolInputRaw}};I.set(X.toolUseId,ee),R.push(ee),c.plainHooks?.onToolStart(X)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let X=$.chunk;d=u.length,p=!0;let ee=I.get(X.toolUseId);ee&&(ee.result=X.content,ee.isError=X.isError,I.delete(X.toolUseId)),c.plainHooks?.onToolResult(X,ee?.toolName),E=await ree(r.onContextProgress,E)}if($.type==="paused"){if(r.setPausedState?.(!0),await L(),_&&$.autoResume===!0){let X=new AbortController;T.abort=X;let ee=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Ie=ee?`Keep waiting \u2014 auto-resumes at ${ee}`:"Keep waiting \u2014 auto-resume in progress",re="Switch model / provider (type /model after)",Se="Stop waiting",$e=[m.warning(" \u23F3 Usage limit reached.")+(ee?m.dim(` Auto-resumes at ${ee}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];hn(_,{header:$e,options:[Ie,re,Se],signal:X.signal,initialIndex:0}).then(Sn=>{if(T.abort=null,!Sn)return;let Ve=Sn[0];Ve===void 0||Ve===Ie||(k=!0,Ve===re&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Xt=>{We()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Xt)}))}).catch(Sn=>{We()&&console.error(" "+m.error("picker promise rejected:"),Sn)})}else(i??{fn:console.log}).fn(uF({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),T.abort?.abort(),T.abort=null;let X=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,R.length=0,I.clear(),b=!1,S=void 0,g=!1,D=P(),h=!1,await B(),(i??{fn:console.log}).fn(m.success(X));continue}if($.type==="error"){await L(),_l(kl($.error)),g=!0;continue}D.process($),j&&(c.plainHooks?.onFirstContent(process.stdout),D.notifyFirstContent()),$.type==="done"&&(b=!0,S=$.metadata)}}),await L(),w){let $=i?i.fn:console.log,j=_?_.getPendingCount():0,X=j>0?` \xB7 ${j} queued`:"";$(m.warning(`\u23F8 Stopped${X} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),$("")}if(k){let $=i?i.fn:console.log;$(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(b&&!w&&!k){Aa(n,a,u,S,R),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),Tu(process.stdout),J4(process.stdout,"afk: turn complete");let $=X=>{i?i.fn(X):console.log(X)},j=JT(u);if(j){$(jZ(j)),$("");let X=i9(R);if(r.onTerminalState)try{r.onTerminalState(j,{doneHasCorroboratingEvidence:X})}catch{}if(n.permissionMode==="autonomous"){let ee=j.kind==="done"&&Fp().verifyDone===!0&&!X;a9(j,void 0,{unverified:ee})}}if(LO(S,n,$),r.onAfterTurn){let X=r.onAfterTurn();X instanceof Promise&&await X.catch(()=>{})}}}catch(G){await L(),g||_l(kl(G))}finally{await L(),Eu(process.stdout,uf(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),T.abort?.abort(),T.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}zi();var sLe=5e3,aLe=3,lLe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function cLe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function iee(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async _=>{We()&&(h=rT(_)),await Nf(e.session.current),We()&&(b=i0())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,k=!1,T=!1,E,R,I,C=(()=>{let _=parseInt(e.options.maxTurns,10);return _>0?_:void 0})(),x=0;for(g.onInjectable=()=>{x>=aLe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(x++,Tu(process.stdout),S={text:lLe,attachments:[]},o.abortPendingRead())};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let M of b)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),b=[]}let _=f.drainNotifications();for(let{job:M,result:$}of _){let j=$.errorReason===void 0?"\u2713":"\u2717",X=$.errorReason==="abort"?"killed":$.errorReason==="timeout"?"timed out":$.errorReason==="signal-killed"?"killed by signal":`exit ${$.exitCode??0}`,ee=Math.max(0,Math.round($.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${j} [${M.id}] ${X} \xB7 ${ee}s \xB7 `)+M.command)}let P=g.drainNotifications();for(let{job:M}of P){let $=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",j=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,X=ie(M.label,60);e.replRenderer.writeLine(m.dim(` ${$} [${M.jobId}] subagent ${M.status} \xB7 ${j}s \xB7 `)+X)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let M of D)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let L,B;if(S===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,S={text:M.message,attachments:[]})}if(S!==void 0){let M=S;S=void 0;let $=sd(e.stats.permissionMode),j=Ma({buffer:M.text,promptText:$,isTTY:!!process.stdout.isTTY,attachmentSummary:Fu([...M.attachments])});e.replRenderer.writeLine(j),L=M.text.trim(),B=M.attachments}else{let M=w;w=void 0;let $=await o.readLine({promptFn:()=>sd(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{WT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});L=$.text.trim(),B=$.attachments}if(!L&&B.length===0)continue;if(L.startsWith("!")){let M=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(k||(k=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(L))){e.statusLine.rearm();continue}}let G=!1;if(L.startsWith("/")){let M=await Q4(L,e.slashCtx,B);if(M.handled){if(M.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((L==="/clear"||L.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),E=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){S={text:M.result.message,attachments:B??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){w=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}G=!0}a.push(L),await cLe(e,L);let K=L;if(G){let M=MP(L);if(M){let $=M.name.replace(/^\//,"").split(":").pop()??"";if($&&e0($)){let j={skillName:$,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},X=e.session.current.sessionId,ee=qa(X),Ie=Date.now();F(`[afk trace] preflight.start commandName=${$}`);let re=!1,Se=await Ga(j,{cwd:e.stats.cwd??process.cwd(),artifactDir:ee},$e=>{We()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${$}) failed: `)+($e instanceof Error?$e.message:String($e)))});re=Se!==null,F(`[afk trace] preflight.end commandName=${$} durationMs=${Date.now()-Ie} success=${re}`),K=r0(Se?.manifestBlock,L)}}}let W=f.drainInjections();W.length>0&&(K=W+K);let q=g.drainInjections();if(q.length>0&&(K=q+K),E!==void 0&&(K=E+`
1950
1950
 
1951
1951
  `+K,E=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:K,sessionId:e.stats.sessionId},$=await e.hookRegistry.dispatch(M);$.injectContext&&(K=$.injectContext+K)}catch(M){if(M instanceof xe){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${ae(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Pr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(R=void 0,I=void 0,await oee({text:K,attachments:B},e.session.current,e.stats,{setInFlight(M){n.turnInFlight=M},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(M){await t.appendUser(M)},async onQueuedUserMessage(M){await t.appendQueuedUser(M)},async onTurnComplete(M,$){if(await t.appendTurn(M,$),e.stats.sessionId)try{qi(e.stats)}catch(j){T||(T=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(j instanceof Error?j.message:String(j))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(Yn(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,$)=>{p?.push(M),R=M.kind,I=$?.doneHasCorroboratingEvidence},setActiveCompositor:M=>{n.activeCompositor=M,M===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:M=>{n.notifyInterrupting=M},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:M=>o.setBackgroundHandler(M),setSoftStopHandler:i,setPausedState:M=>o.setPausedState(M),setPauseInterruptHandler:M=>o.setPauseInterruptHandler(M),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Yn(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(M,$)=>{c.repaint(M),u?.onStage(M,$)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(sd(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},...I!==void 0?{doneHasCorroboratingEvidence:I}:{}},void 0,sLe);M.injectContext&&M.injectContext.trim().length>0&&(E=M.injectContext)}catch(M){if(M instanceof _t)throw M;M instanceof Pr?(F("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof xe?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(M.reason??"no reason given")}`)):F("[stop hook] unexpected error: "+String(M))}}}function uLe(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 see(e,t,n,r){let o=await nZ(),i=new HT({rl:e.rl,history:o,statusLine:e.statusLine}),s=uLe(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await kZ(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=BZ(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await iee(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)}}Cp();rc();import{execFile as dLe}from"node:child_process";import{dirname as pLe,isAbsolute as mLe,resolve as fLe}from"node:path";import{promisify as gLe}from"node:util";var aee=gLe(dLe),hLe=3e3,yLe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function bLe(){let t=(await aee("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=mLe(t)?t:fLe(process.cwd(),t);return pLe(n)}async function lee(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await bLe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),hLe)});try{let o=Wn({execFile:aee,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=>yLe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}fh();Cp();import{promises as SLe}from"node:fs";import{dirname as wLe,join as dee}from"node:path";import{randomBytes as vLe}from"node:crypto";var kLe=["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(`
1952
- `),cee=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,BO=30,TLe=1024,ELe=8e3,RLe="haiku";async function xLe(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=ILe(n,TLe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??ELe),s=t.signal?PLe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Dl({token:t.token,model:t.model??RLe,system:kLe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=ALe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=wLe(t.worktreePath);return await CLe(l,c)}function ALe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(cee.test(t)&&t.length<=BO)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>BO)break;o=s}return cee.test(o)?o:null}async function CLe(e,t){if(!await _Le(dee(t,e)))return e;let n=vLe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,BO-5)}-${n}`}async function _Le(e){try{return await SLe.access(e),!0}catch{return!1}}function ILe(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 PLe(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 pee(e){let t,n,r=dee(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await xLe(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=`${yy(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return uee(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 uee(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 uee(e,t){e&&e.setCwd(t),MLe(t)}function MLe(e){try{process.chdir(e)}catch{}}ht();Rt();wl();eo();H();import{spawn as fee}from"child_process";import{existsSync as gee,mkdirSync as LLe,readFileSync as hee,unlinkSync as mee,writeFileSync as yee}from"fs";import{get as NLe}from"https";import{join as bee}from"path";import{readFileSync as OLe}from"fs";import{dirname as DLe,join as $Le}from"path";import{fileURLToPath as FLe}from"url";function ro(){try{return"5.145.0"}catch{}try{let e=DLe(FLe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(OLe($Le(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}N();U();var BLe=64*1024,ULe=10800*1e3,jLe=800,HLe=3600*1e3,WLe="update-check.json",KLe="pending-update.json";function UO(){return bee(yl(),WLe)}function rg(){return bee(yl(),KLe)}function jO(){let e=yl();gee(e)||LLe(e,{recursive:!0})}function See(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 wee(){try{let e=hee(UO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function vee(){try{jO();let e=`
1952
+ `),cee=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,BO=30,TLe=1024,ELe=8e3,RLe="haiku";async function xLe(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=ILe(n,TLe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??ELe),s=t.signal?PLe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Dl({token:t.token,model:t.model??RLe,system:kLe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=ALe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=wLe(t.worktreePath);return await CLe(l,c)}function ALe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(cee.test(t)&&t.length<=BO)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>BO)break;o=s}return cee.test(o)?o:null}async function CLe(e,t){if(!await _Le(dee(t,e)))return e;let n=vLe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,BO-5)}-${n}`}async function _Le(e){try{return await SLe.access(e),!0}catch{return!1}}function ILe(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 PLe(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 pee(e){let t,n,r=dee(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await xLe(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=`${yy(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return uee(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 uee(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 uee(e,t){e&&e.setCwd(t),MLe(t)}function MLe(e){try{process.chdir(e)}catch{}}ht();Rt();wl();eo();H();import{spawn as fee}from"child_process";import{existsSync as gee,mkdirSync as LLe,readFileSync as hee,unlinkSync as mee,writeFileSync as yee}from"fs";import{get as NLe}from"https";import{join as bee}from"path";import{readFileSync as OLe}from"fs";import{dirname as DLe,join as $Le}from"path";import{fileURLToPath as FLe}from"url";function ro(){try{return"5.145.1"}catch{}try{let e=DLe(FLe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(OLe($Le(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}N();U();var BLe=64*1024,ULe=10800*1e3,jLe=800,HLe=3600*1e3,WLe="update-check.json",KLe="pending-update.json";function UO(){return bee(yl(),WLe)}function rg(){return bee(yl(),KLe)}function jO(){let e=yl();gee(e)||LLe(e,{recursive:!0})}function See(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 wee(){try{let e=hee(UO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function vee(){try{jO();let e=`
1953
1953
  const https = require('https');
1954
1954
  const fs = require('fs');
1955
1955
  const url = 'https://registry.npmjs.org/agent-afk/latest';