agent-afk 5.112.5 → 5.112.6

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
@@ -314,7 +314,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
314
314
 
315
315
  ${t}`}var pae,QE=y(()=>{"use strict";pae=new Set(["script","style","noscript","template","svg"])});function gae(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 nL(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function hae(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 rL(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??gae,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(!fae.has(d.status)||u===o)return d;let p=hae(d,s)??nL(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=nL(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var fae,oL=y(()=>{"use strict";me();fae=new Set([429,502,503,504])});import{BlockList as yae,isIP as eR}from"node:net";import{lookup as bae}from"node:dns/promises";import{Agent as wae}from"undici";function sL(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Tae(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function ZE(e){let t=eR(e);return t===0?!1:kae.check(e,t===4?"ipv4":"ipv6")}async function aL(e){return bae(e,{all:!0,verbatim:!0})}async function tR(e,t={}){if(t.allowPrivateHosts??sL())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=Tae(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(eR(r)!==0)return ZE(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??aL,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(ZE(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Dd(e,t={}){let n=await tR(e,t);if(!n.allowed)throw new zn(n.reason)}async function lh(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<=iL;s++){await Dd(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??sL())?{dispatcher:Eae}:{}},l=await rL(e,i,a,r.retry??{});if(!Rae.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 zn(`too many redirects (>${iL}) starting from ${t}`)}var Sae,vae,kae,zn,Eae,iL,Rae,nR=y(()=>{"use strict";j();oL();Sae=[["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]],vae=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],kae=(()=>{let e=new yae;for(let[t,n]of Sae)e.addSubnet(t,n,"ipv4");for(let[t,n]of vae)e.addSubnet(t,n,"ipv6");return e})(),zn=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Eae=new wae({connect:{lookup(e,t,n){aL(e).then(r=>{let o=r.find(s=>ZE(s.address));if(o!==void 0){n(new zn(`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,eR(i.address))},r=>n(r,"",0))}}});iL=20,Rae=new Set([301,302,303,307,308])});import{readFileSync as xae}from"node:fs";import{join as Aae}from"path";function Cae(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function lL(e,t){return Cae(t).test(e)}function Pae(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(_ae.has(t))return!0;if(Iae.has(t))return!1}return!1}function cL(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Mae(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 uL(e){let t=e===void 0||e.trim()===""?"default":e.trim();return ju(t),t}function Oae(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function $ae(e){try{return xae(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Dae(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=uL(t.defaultProfile)),n}function dL(e){let t=e?.env??k,n=e?.readFileSync??$ae,r=e?.surface??t.AGENT_SURFACE,o=Pae(t.AFK_BROWSER_HEADLESS,r),i=cL(t.AFK_BROWSER_ALLOWED_DOMAINS),s=cL(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Oae(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Mae(t.AFK_BROWSER_BACKEND),c=uL(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():Aae(jn(),"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=Dae(u,g);return h.configPath=p,h}function ch(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(lL(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>lL(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var _ae,Iae,uh=y(()=>{"use strict";j();K();_ae=new Set(["daemon","subagent","telegram","afk"]),Iae=new Set(["repl","interactive","cli"])});import{existsSync as Fae,readFileSync as Lae}from"node:fs";import{createRequire as Nae}from"node:module";import{dirname as Bae,join as Uae}from"node:path";function fL(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Wae&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function Yt(e){let t=fL(e);return mL.some(n=>t.includes(n))}function Hae(){try{let t=Nae(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(Lae(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=Uae(Bae(t),o);return Fae(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Fd(){return pL??=Hae()??jae,pL}function rR(e){return e.includes("install chromium")}function xn(e,t){let n=fL(e),r=t?.latched===!0?` ${Kae}`:"";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: ${Fd()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Fd()}). Or pick a different tool.${r}`}function Ld(e,t,n=!1){if(!Yt(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
316
316
 
317
- ${xn(e,{headless:t,latched:n})}`,{cause:e})}var mL,jae,Wae,pL,Kae,dh=y(()=>{"use strict";mL=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],jae="pnpm exec playwright install chromium",Wae=4;Kae="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 ks from"node:fs";import ph from"node:path";import{randomBytes as Gae}from"node:crypto";import{chromium as qae}from"playwright";function zae(){try{return"5.112.5"}catch{}try{let e=ph.resolve(import.meta.dirname,"../../../package.json"),t=ks.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Vae,mh,gL=y(()=>{"use strict";dh();K();me();Vae=zae(),mh=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=qae.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=Ld(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/${Vae}`}}loadStorageState(t){let n=Wu(t);try{if(!ks.existsSync(n))return;let r=JSON.parse(ks.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Wu(t);if(!ks.existsSync(r))return;let o=await n.storageState(),i=ph.join(ph.dirname(r),`.${ph.basename(r)}.${process.pid}.${Gae(4).toString("hex")}.tmp`);ks.writeFileSync(i,JSON.stringify(o),{mode:384}),ks.chmodSync(i,384),ks.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Jae}from"crypto";function hL(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Yae.test(e.label))}function yL(e){return Jae("sha256").update(e,"utf8").digest("hex").slice(0,8)}function bL(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Yae,fh=y(()=>{"use strict";Yae=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Xae}from"node:crypto";function Qae(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Zae(e,t,n){return`el_${Xae("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function ele(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function wL(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function vL(e,t){let n=e.role??"",r=e.name??"";SL.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])vL(i,t)}async function tle(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},kL).catch(()=>[])}async function nle(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},kL).catch(()=>[])}function rle(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function gh(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=rle(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tle(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],vL(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await nle(e)).filter($=>SL.has($.role??"")));let S=new Map;for(let P of p){let $=wL(P.name),q=S.get($);(!q||q.bbox.w===0&&P.bbox.w>0)&&S.set($,P)}let v=b.map(P=>({ax:P,dom:S.get(wL(P.name??""))})),E=r?v:v.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,$)=>{let q=P.dom?.bbox.y??0,F=$.dom?.bbox.y??0;if(q!==F)return q-F;let W=P.dom?.bbox.x??0,G=$.dom?.bbox.x??0;return W-G}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((P,$)=>{let q=P.ax.role??"generic",F=P.ax.name??"",W=Zae(q,F,$),G=P.dom?.bbox??{x:0,y:0,w:0,h:0},I=P.dom?.type??null,L=null;P.ax.value!==void 0&&P.ax.value!==null&&(L=String(P.ax.value)),P.ax.checked!==void 0&&(L=String(P.ax.checked)),hL({role:q,kind:I})&&(L="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let D;P.dom?.testId?D=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(D=`#${P.dom.id}`);let H={id:W,role:q,label:Qae(F),kind:I,value:L,state:O,bbox:G};return D!==void 0&&(H.selector=D),H}),M="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?M="loading":P==="interactive"?M="navigating":M="idle"}catch{M="navigating"}M!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let _=ele(f),x=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:_,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:M,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var SL,kL,TL=y(()=>{"use strict";fh();SL=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kL="a[href], button, input, select, textarea, [role], [tabindex], label"});async function EL(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 oR(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>EL(e,i)))).filter(o=>o!==null)}async function ole(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 iR(e,t,n){switch(t.kind){case"element_id":return ile(e,t,n);case"selector":return sle(e,t);case"semantic":return ale(e,t)}}async function ile(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 oR(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function sle(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 oR(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function ale(e,t){return t.role!==void 0?lle(e,t.text,t.role):cle(e,t.text,t)}async function lle(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 oR(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function cle(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 ole(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await EL(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var RL=y(()=>{"use strict"});async function sR(e,t,n,r){let o=e.url();if(o===n)return null;let i=ch(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 xL=y(()=>{"use strict";uh()});import{randomBytes as ule}from"crypto";import{mkdir as dle,stat as ple,writeFile as mle}from"fs/promises";import{join as aR}from"path";import{gzip as fle}from"zlib";import{promisify as gle}from"util";function hle(e){return aR(dr(e),"browser")}function yle(e){return aR(hle(e),"screenshots")}function ble(){return new Date().toISOString().replace(/[:.]/g,"-")}function wle(){return ule(3).toString("hex")}async function lR(e,t,n){if(t.length>AL)throw new Error(`writeScreenshotSidecar: buffer exceeds ${AL} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=yle(e);await dle(r,{recursive:!0});let o=`${ble()}-${wle()}-${n}.png`,i=aR(r,o);await mle(i,t);let{size:s}=await ple(i);return{path:i,bytes:s}}var qGe,AL,CL=y(()=>{"use strict";K();fh();qGe=gle(fle);AL=5*1024*1024});var IL={};Fo(IL,{PlaywrightProvider:()=>cR});function _L(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 cR,PL=y(()=>{"use strict";gL();TL();RL();uh();xL();CL();cR=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new mh(t)}async open(t){let n=ch(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 sR(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 gh(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 gh(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 iR(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${_L(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 sR(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 gh(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 iR(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${_L(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 lR(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 lR(n,o,r);return i}catch{return null}}}});var Es={};Fo(Es,{__resetBrowserRegistryForTests:()=>Ele,browserProviderActive:()=>kle,closeBrowserProvider:()=>uR,getBrowserProvider:()=>vle,peekBrowserProvider:()=>Tle});function ML(){Promise.resolve(uR()).then(()=>{process.exit(130)})}function OL(){Promise.resolve(uR()).then(()=>{process.exit(143)})}function $L(){Ar=null}function Sle(){hh||(process.on("SIGINT",ML),process.on("SIGTERM",OL),process.on("exit",$L),hh=!0)}function DL(){hh&&(process.removeListener("SIGINT",ML),process.removeListener("SIGTERM",OL),process.removeListener("exit",$L),hh=!1)}async function vle(e){return Ar!==null?Ar:(Ts!==null||(Ts=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(PL(),IL)),n=dL(e),r=new t(n);return Sle(),Ar=r,Ts=null,r})()),Ts)}async function uR(){if(Ar===null)return;let e=Ar;Ar=null,Ts=null,DL(),await e.shutdown()}function kle(){return Ar!==null}function Tle(){return Ar}function Ele(){Ar=null,Ts=null,DL()}var Ar,Ts,hh,Rs=y(()=>{"use strict";uh();Ar=null,Ts=null,hh=!1});async function FL(e,t){try{return await ZF(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Ile(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Rs(),Es));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function LL(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Ile,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await lh(n,e,{headers:_le,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Cle.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(Ale.test(p)&&!xle.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await FL(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof zn||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=XE({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Dd(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Dd(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Dd(d.finalUrl,o);let p=await FL(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=XE({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 zn)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 xle,Ale,Cle,_le,NL=y(()=>{"use strict";eL();QE();nR();me();xle=/(text\/html|application\/xhtml\+xml)/i,Ale=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Cle=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,_le={"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 Ole(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Ple,{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),Mle),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=Ye(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 BL(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Ole({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 UL(e,t){if(t.length===0)return`# Search results for "${e}"
317
+ ${xn(e,{headless:t,latched:n})}`,{cause:e})}var mL,jae,Wae,pL,Kae,dh=y(()=>{"use strict";mL=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],jae="pnpm exec playwright install chromium",Wae=4;Kae="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 ks from"node:fs";import ph from"node:path";import{randomBytes as Gae}from"node:crypto";import{chromium as qae}from"playwright";function zae(){try{return"5.112.6"}catch{}try{let e=ph.resolve(import.meta.dirname,"../../../package.json"),t=ks.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Vae,mh,gL=y(()=>{"use strict";dh();K();me();Vae=zae(),mh=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=qae.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=Ld(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/${Vae}`}}loadStorageState(t){let n=Wu(t);try{if(!ks.existsSync(n))return;let r=JSON.parse(ks.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Wu(t);if(!ks.existsSync(r))return;let o=await n.storageState(),i=ph.join(ph.dirname(r),`.${ph.basename(r)}.${process.pid}.${Gae(4).toString("hex")}.tmp`);ks.writeFileSync(i,JSON.stringify(o),{mode:384}),ks.chmodSync(i,384),ks.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Jae}from"crypto";function hL(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Yae.test(e.label))}function yL(e){return Jae("sha256").update(e,"utf8").digest("hex").slice(0,8)}function bL(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Yae,fh=y(()=>{"use strict";Yae=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Xae}from"node:crypto";function Qae(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Zae(e,t,n){return`el_${Xae("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function ele(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function wL(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function vL(e,t){let n=e.role??"",r=e.name??"";SL.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])vL(i,t)}async function tle(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},kL).catch(()=>[])}async function nle(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},kL).catch(()=>[])}function rle(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function gh(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=rle(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tle(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],vL(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await nle(e)).filter($=>SL.has($.role??"")));let S=new Map;for(let P of p){let $=wL(P.name),q=S.get($);(!q||q.bbox.w===0&&P.bbox.w>0)&&S.set($,P)}let v=b.map(P=>({ax:P,dom:S.get(wL(P.name??""))})),E=r?v:v.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,$)=>{let q=P.dom?.bbox.y??0,F=$.dom?.bbox.y??0;if(q!==F)return q-F;let W=P.dom?.bbox.x??0,G=$.dom?.bbox.x??0;return W-G}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((P,$)=>{let q=P.ax.role??"generic",F=P.ax.name??"",W=Zae(q,F,$),G=P.dom?.bbox??{x:0,y:0,w:0,h:0},I=P.dom?.type??null,L=null;P.ax.value!==void 0&&P.ax.value!==null&&(L=String(P.ax.value)),P.ax.checked!==void 0&&(L=String(P.ax.checked)),hL({role:q,kind:I})&&(L="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let D;P.dom?.testId?D=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(D=`#${P.dom.id}`);let H={id:W,role:q,label:Qae(F),kind:I,value:L,state:O,bbox:G};return D!==void 0&&(H.selector=D),H}),M="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?M="loading":P==="interactive"?M="navigating":M="idle"}catch{M="navigating"}M!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let _=ele(f),x=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:_,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:M,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var SL,kL,TL=y(()=>{"use strict";fh();SL=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kL="a[href], button, input, select, textarea, [role], [tabindex], label"});async function EL(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 oR(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>EL(e,i)))).filter(o=>o!==null)}async function ole(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 iR(e,t,n){switch(t.kind){case"element_id":return ile(e,t,n);case"selector":return sle(e,t);case"semantic":return ale(e,t)}}async function ile(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 oR(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function sle(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 oR(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function ale(e,t){return t.role!==void 0?lle(e,t.text,t.role):cle(e,t.text,t)}async function lle(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 oR(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function cle(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 ole(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await EL(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var RL=y(()=>{"use strict"});async function sR(e,t,n,r){let o=e.url();if(o===n)return null;let i=ch(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 xL=y(()=>{"use strict";uh()});import{randomBytes as ule}from"crypto";import{mkdir as dle,stat as ple,writeFile as mle}from"fs/promises";import{join as aR}from"path";import{gzip as fle}from"zlib";import{promisify as gle}from"util";function hle(e){return aR(dr(e),"browser")}function yle(e){return aR(hle(e),"screenshots")}function ble(){return new Date().toISOString().replace(/[:.]/g,"-")}function wle(){return ule(3).toString("hex")}async function lR(e,t,n){if(t.length>AL)throw new Error(`writeScreenshotSidecar: buffer exceeds ${AL} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=yle(e);await dle(r,{recursive:!0});let o=`${ble()}-${wle()}-${n}.png`,i=aR(r,o);await mle(i,t);let{size:s}=await ple(i);return{path:i,bytes:s}}var qGe,AL,CL=y(()=>{"use strict";K();fh();qGe=gle(fle);AL=5*1024*1024});var IL={};Fo(IL,{PlaywrightProvider:()=>cR});function _L(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 cR,PL=y(()=>{"use strict";gL();TL();RL();uh();xL();CL();cR=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new mh(t)}async open(t){let n=ch(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 sR(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 gh(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 gh(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 iR(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${_L(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 sR(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 gh(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 iR(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${_L(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 lR(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 lR(n,o,r);return i}catch{return null}}}});var Es={};Fo(Es,{__resetBrowserRegistryForTests:()=>Ele,browserProviderActive:()=>kle,closeBrowserProvider:()=>uR,getBrowserProvider:()=>vle,peekBrowserProvider:()=>Tle});function ML(){Promise.resolve(uR()).then(()=>{process.exit(130)})}function OL(){Promise.resolve(uR()).then(()=>{process.exit(143)})}function $L(){Ar=null}function Sle(){hh||(process.on("SIGINT",ML),process.on("SIGTERM",OL),process.on("exit",$L),hh=!0)}function DL(){hh&&(process.removeListener("SIGINT",ML),process.removeListener("SIGTERM",OL),process.removeListener("exit",$L),hh=!1)}async function vle(e){return Ar!==null?Ar:(Ts!==null||(Ts=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(PL(),IL)),n=dL(e),r=new t(n);return Sle(),Ar=r,Ts=null,r})()),Ts)}async function uR(){if(Ar===null)return;let e=Ar;Ar=null,Ts=null,DL(),await e.shutdown()}function kle(){return Ar!==null}function Tle(){return Ar}function Ele(){Ar=null,Ts=null,DL()}var Ar,Ts,hh,Rs=y(()=>{"use strict";uh();Ar=null,Ts=null,hh=!1});async function FL(e,t){try{return await ZF(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Ile(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Rs(),Es));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function LL(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Ile,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await lh(n,e,{headers:_le,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Cle.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(Ale.test(p)&&!xle.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await FL(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof zn||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=XE({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Dd(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Dd(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Dd(d.finalUrl,o);let p=await FL(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=XE({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 zn)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 xle,Ale,Cle,_le,NL=y(()=>{"use strict";eL();QE();nR();me();xle=/(text\/html|application\/xhtml\+xml)/i,Ale=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Cle=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,_le={"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 Ole(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Ple,{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),Mle),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=Ye(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 BL(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Ole({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 UL(e,t){if(t.length===0)return`# Search results for "${e}"
318
318
 
319
319
  (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(`
320
320
  `).trimEnd()}var Ple,Mle,jL=y(()=>{"use strict";Tr();Ple="https://api.exa.ai/search",Mle=10});function yh(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 xs=y(()=>{"use strict";dh()});function Ble(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=$le;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,Dle)}let a=Fle;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,Lle)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function dR(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Zr(e,t),truncated:!0}}function Ule(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=Ble(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 tR(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 lh(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof zn?{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=dR(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await LL(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=dR(tL(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 zn)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=Yt(p)&&!rR(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Fd()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=BL({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:Nle,timeoutMs:s.timeoutMs,signal:a.signal}),f=dR(UL(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 $le,Dle,Fle,Lle,Nle,WL,HL=y(()=>{"use strict";NL();jL();nR();zo();QE();xs();$le=3e4,Dle=12e4,Fle=1e5,Lle=1e6,Nle=10;WL=Ule()});import{existsSync as GL,mkdirSync as jle,readFileSync as Wle,renameSync as Hle,unlinkSync as Kle,writeFileSync as Gle}from"node:fs";import{dirname as KL,join as qle}from"node:path";import{randomBytes as zle}from"node:crypto";function An(e){let t=e??Zk();if(!GL(t))return[];try{let n=Wle(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 As(e,t){let n=t??Zk();jle(KL(n),{recursive:!0});let r=qle(KL(n),`.schedules.json.${process.pid}.${zle(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{Gle(r,o,"utf-8"),Hle(r,n)}catch(i){try{GL(r)&&Kle(r)}catch{}throw i}}function bh(e,t){let n=An(t),r=n.map(l=>l.id),o=Vle(e.name),i=Jle(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),As(n,t),a}function wh(e,t){let n=An(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(As(o,t),!0)}function Nd(e,t){return An(t).find(n=>n.id===e)}function Vle(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Jle(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function qL(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 Sh=y(()=>{"use strict";K()});import{existsSync as Yle,readFileSync as Xle}from"node:fs";import{join as Qle}from"node:path";async function Vn(e,t,n){let r;try{let o=Qle(Cf("default"),"port");if(!Yle(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=Xle(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var Qo,pR=y(()=>{"use strict";K();Qo="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 Zle}from"node:fs";import{readFile as ece}from"node:fs/promises";var zL,VL,JL,YL,XL=y(()=>{"use strict";Sh();K();pR();zL=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=bh({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 Vn("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 Vn("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:Qo}})}},VL=async(e,t)=>{let n=An();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})))}},JL=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=cr();if(!Zle(i))return{content:JSON.stringify([])};let s;try{let c=await ece(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1862,7 +1862,7 @@ ${E}
1862
1862
  ${T}`})}return{fileBlocks:l,warnings:c}}function P3(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function M3(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}}mS();async function O3(e,t,n,r,o="summary",i,s){let a=nJ(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),Mc(process.stdout,Zp(process.cwd(),!0));let l="",c=0,u=!1,d=!1,p=!1,f=!1,g=!1,h,b=!1,w=!1,S={abort:null},v=0,E=3e3,T=[],A=new Map,M=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,_=()=>{let F=r.subagentControl;F?.hasPromotableForeground()&&M3(F,x,r.onQueuedUserMessage).then(({jobs:W,flushedText:G,flushedPreview:I})=>{let L=(i??{fn:console.log}).fn;for(let O of W)L(m.dim(` \u2192 subagent backgrounded as ${O.jobId}: ${O.label}`));G!==void 0&&L(m.dim(` \u2192 queued message sent to this turn: ${P3(I??G)}`))}).catch(()=>{})},x=r.getCompositor?r.getCompositor():null,C=()=>new nu({out:ru(i),thinkingMode:o,...M?{activeSkillName:M}:{},onCancel:()=>{t.interrupt().catch(F=>{He()&&console.error(" "+m.error("session.interrupt() failed:"),F)})},...r.subagentControl?{onBackground:_}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...x?{compositor:x}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),P=C(),$=async()=>{if(!f){f=!0;try{await P.dispose()}catch{}}},q=async()=>{await P.arm();let F=P.getCompositor();if(i&&F){let W=F;i.fn=G=>W.commitAbove(G),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(F),r.setInterruptNotifier?.(W=>P.setInterrupting(W)),r.rearmStatus?.()};try{x?x.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{b=!0,P.setSoftStopping(!0),t.interrupt().catch(D=>{He()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),D)});let O=r.subagentControl;O?.hasActiveForeground()&&O.cancelActiveForeground().catch(D=>{He()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),D)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{w=!0,t.interrupt().catch(O=>{He()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),O)})}),await q(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(_);let{fileBlocks:F,warnings:W}=I3(e.text,{rootDir:process.cwd()});for(let O of W)(i??{fn:console.log}).fn(m.dim(` @-file: ${O}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let G=F.length>0||e.attachments.length>0?await _3(e.text,e.attachments,void 0,F,t.sessionId):e.text,I=t.sendMessageStream(G);if(await Cl((O,D)=>{P.process(O,D)},async()=>{for await(let O of I){if(b||w)break;if(O.type==="chunk"&&O.chunk.type==="content"?(l=u?A3(l,O.chunk.content):l+O.chunk.content,u=!1,d=!0):O.type==="message"&&!d&&(l=O.message.content),O.type==="stream_retry"&&(l=l.slice(0,c),u=l.length>0),O.type==="chunk"&&O.chunk.type==="tool_use_detail"){let D=O.chunk,H={toolName:D.toolName,toolUseId:D.toolUseId,input:D.toolInput,...D.toolInputRaw!==void 0&&{inputRaw:D.toolInputRaw}};A.set(D.toolUseId,H),T.push(H)}else if(O.type==="chunk"&&O.chunk.type==="tool_result"){let D=O.chunk;c=l.length,u=!0;let H=A.get(D.toolUseId);if(H&&(H.result=D.content,H.isError=D.isError,A.delete(D.toolUseId)),r.onContextProgress){let ne=Date.now();if(ne-v>=E){v=ne;try{let ee=r.onContextProgress();ee instanceof Promise&&await ee}catch(ee){He()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),ee)}}}}if(O.type==="paused"){if(r.setPausedState?.(!0),await $(),x&&O.autoResume===!0){let D=new AbortController;S.abort=D;let H=O.resetsAt?O.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,ne=H?`Keep waiting \u2014 auto-resumes at ${H}`:"Keep waiting \u2014 auto-resume in progress",ee="Switch model / provider (type /model after)",X="Stop waiting",le=[m.warning(" \u23F3 Usage limit reached.")+(H?m.dim(` Auto-resumes at ${H}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Nn(x,{header:le,options:[ne,ee,X],signal:D.signal,initialIndex:0}).then(z=>{if(S.abort=null,!z)return;let ke=z[0];ke===void 0||ke===ne||(w=!0,ke===ee&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(ce=>{He()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),ce)}))}).catch(z=>{He()&&console.error(" "+m.error("picker promise rejected:"),z)})}else(i??{fn:console.log}).fn(bO({reason:O.reason,...O.resetsAt!==void 0?{resetsAt:O.resetsAt}:{},...O.accountId!==void 0?{accountId:O.accountId}:{},...O.autoResume!==void 0?{autoResume:O.autoResume}:{}}));continue}if(O.type==="resumed"){r.setPausedState?.(!1),S.abort?.abort(),S.abort=null;let D=O.hotSwapped&&O.accountId?`\u25B6 Resumed on ${O.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,d=!1,T.length=0,A.clear(),g=!1,h=void 0,p=!1,P=C(),f=!1,await q(),(i??{fn:console.log}).fn(m.success(D));continue}if(O.type==="error"){await $(),za(Ua(O.error)),p=!0;continue}P.process(O),O.type==="done"&&(g=!0,h=O.metadata)}}),await $(),b){let O=i?i.fn:console.log,D=x?x.getPendingCount():0,H=D>0?` \xB7 ${D} queued`:"";O(m.warning(`\u23F8 Stopped${H} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),O("")}if(w){let O=i?i.fn:console.log;O(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),O("")}if(g&&!b&&!w){Js(n,a,l,h,T),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Pc(process.stdout),gz(process.stdout,"afk: turn complete");let O=H=>{i?i.fn(H):console.log(H)},D=Jv(l);if(D){O(C3(D)),O("");let H=s6(T);if(r.onTerminalState)try{r.onTerminalState(D,{doneHasCorroboratingEvidence:H})}catch{}if(n.permissionMode==="autonomous"){let ne=D.kind==="done"&&Od().verifyDone===!0&&!H;l6(D,void 0,{unverified:ne})}}if(x_e(h,n,O),r.onAfterTurn){let H=r.onAfterTurn();H instanceof Promise&&await H.catch(()=>{})}}}catch(F){await $(),p||za(Ua(F))}finally{await $(),Mc(process.stdout,Zp(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),S.abort?.abort(),S.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function R_e(e,t){let n=Math.round(e*100),r=he(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${he(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function x_e(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(Ce(e.durationMs)),e.totalCostUsd!==void 0&&r.push(St(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(he(o+i)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let s=SI(t),a=nt(t.model),l=R_e(s,a);if(l.text!==null){let u=l.tier==="over"||l.tier==="near"?m.error:l.tier==="caution"?m.warning:m.dim;n(u(l.text))}let c=x3(WS(ty()),new Date,{autoResume:KF()});if(c.text!==null){let u=c.tier==="over"||c.tier==="near"?m.error:c.tier==="caution"?m.warning:m.dim;n(u(c.text))}n("")}Ei();var A_e=5e3,C_e=3,__e="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function I_e(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function $3(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,verdictLedger:d,shellPassthrough:p,bgResultNotifier:f}=s,g=null,h=[];e.session.current.waitForInitialization().then(async _=>{He()&&(g=av(_)),await Am(e.session.current),He()&&(h=gI())}).catch(()=>{});let b=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,S=!1,v=!1,E,T,A,M=0;for(f.onInjectable=()=>{M>=C_e||!o.isAwaitingInput()||!o.bufferIsEmpty()||(M++,Pc(process.stdout),b={text:__e,attachments:[]},o.abortPendingRead())};;){if(g&&(e.replRenderer.writeLine(g),e.replRenderer.writeLine(""),g=null),h.length>0){for(let I of h)e.replRenderer.writeLine(I);e.replRenderer.writeLine(""),h=[]}let _=p.drainNotifications();for(let{job:I,result:L}of _){let O=L.errorReason===void 0?"\u2713":"\u2717",D=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,H=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${O} [${I.id}] ${D} \xB7 ${H}s \xB7 `)+I.command)}let x=f.drainNotifications();for(let{job:I}of x){let L=I.status==="completed"?"\u2713":I.status==="failed"?"\u2717":"\u2298",O=I.endedAt!==void 0?Math.max(0,Math.round((I.endedAt-I.startedAt)/100)/10):0,D=se(I.label,60);e.replRenderer.writeLine(m.dim(` ${L} [${I.jobId}] subagent ${I.status} \xB7 ${O}s \xB7 `)+D)}let C=l.renderIfChanged(e.stats.sessionId);if(C.length>0){for(let I of C)e.replRenderer.writeLine(I);e.replRenderer.writeLine("")}let P,$;if(b===void 0){let I=await e.session.current.takePendingPlanExitSeed();I!==void 0&&(e.stats.permissionMode=I.mode,b={text:I.message,attachments:[]})}if(b!==void 0){let I=b;b=void 0;let L=du(e.stats.permissionMode),O=ea({buffer:I.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:Kc([...I.attachments])});e.replRenderer.writeLine(O),P=I.text.trim(),$=I.attachments}else{let I=w;w=void 0;let L=await o.readLine({promptFn:()=>du(e.stats.permissionMode),...I!==void 0?{initialBuffer:I}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{Kv(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});P=L.text.trim(),$=L.attachments}if(!P&&$.length===0)continue;if(P.startsWith("!")){let I=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!I&&(S||(S=!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 p.dispatch(P))){e.statusLine.rearm();continue}}let q=!1;if(P.startsWith("/")){let I=await bz(P,e.slashCtx,$);if(I.handled){if(I.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((P==="/clear"||P.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),d.reset(),E=void 0),I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="submit"){b={text:I.result.message,attachments:$??[]},e.statusLine.rearm();continue}if(I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="prefill"){w=I.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}q=!0}a.push(P),await I_e(e,P);let F=P;if(q){let I=XC(P);if(I){let L=I.name.replace(/^\//,"").split(":").pop()??"";if(L&&uI(L)){let O={skillName:L,rawArgs:I.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},D=e.session.current.sessionId,H=da(D),ne=Date.now();B(`[afk trace] preflight.start commandName=${L}`);let ee=!1,X=await ua(O,{cwd:e.stats.cwd??process.cwd(),artifactDir:H},le=>{He()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${L}) failed: `)+(le instanceof Error?le.message:String(le)))});ee=X!==null,B(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-ne} success=${ee}`),F=mI(X?.manifestBlock,P)}}}let W=p.drainInjections();W.length>0&&(F=W+F);let G=f.drainInjections();if(G.length>0&&(F=G+F),E!==void 0&&(F=E+`
1863
1863
 
1864
1864
  `+F,E=void 0),e.hookRegistry)try{let I={event:"UserPromptSubmit",prompt:F,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(I);L.injectContext&&(F=L.injectContext+F)}catch(I){if(I instanceof xe){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(I.reason?m.dim(`: ${Ye(I.reason)}`):"")),e.statusLine.rearm();continue}if(I instanceof wr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${I.timeoutMs}ms`)),e.statusLine.rearm();continue}throw I}if(T=void 0,A=void 0,await O3({text:F,attachments:$},e.session.current,e.stats,{setInFlight(I){n.turnInFlight=I},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(I){await t.appendUser(I)},async onQueuedUserMessage(I){await t.appendQueuedUser(I)},async onTurnComplete(I,L){if(await t.appendTurn(I,L),e.stats.sessionId)try{Ti(e.stats)}catch(O){v||(v=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(O instanceof Error?O.message:String(O))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(I,L)=>{d?.push(I),T=I.kind,A=L?.doneHasCorroboratingEvidence},setActiveCompositor:I=>{n.activeCompositor=I},setInterruptNotifier:I=>{n.notifyInterrupting=I},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:I=>o.setBackgroundHandler(I),setSoftStopHandler:i,setPausedState:I=>o.setPausedState(I),setPauseInterruptHandler:I=>o.setPauseInterruptHandler(I),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(ir(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:(I,L)=>{c.repaint(I),u?.onStage(I,L)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(du(e.stats.permissionMode))),e.hookRegistry)try{let I=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...T!==void 0?{terminalState:T}:{},...A!==void 0?{doneHasCorroboratingEvidence:A}:{}},void 0,A_e);I.injectContext&&I.injectContext.trim().length>0&&(E=I.injectContext)}catch(I){if(I instanceof kt)throw I;I instanceof wr?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):I instanceof xe?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${Ye(I.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(I))}}}function P_e(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function D3(e,t,n,r){let o=await e3(),i=new Hv({rl:e.rl,history:o,statusLine:e.statusLine}),s=P_e(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await a3(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=E3(e,n),await $3(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),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)}}Rd();vl();import{execFile as M_e}from"node:child_process";import{dirname as O_e,isAbsolute as $_e,resolve as D_e}from"node:path";import{promisify as F_e}from"node:util";var F3=F_e(M_e),L_e=3e3,N_e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function B_e(){let t=(await F3("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=$_e(t)?t:D_e(process.cwd(),t);return O_e(n)}async function L3(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await B_e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),L_e)});try{let o=_n({execFile:F3,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=>N_e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}tg();Rd();import{promises as U_e}from"node:fs";import{dirname as j_e,join as U3}from"node:path";import{randomBytes as W_e}from"node:crypto";var H_e=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
1865
- `),N3=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,qP=30,K_e=1024,G_e=8e3,q_e="haiku";async function z_e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=X_e(n,K_e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??G_e),s=t.signal?Q_e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Za({token:t.token,model:t.model??q_e,system:H_e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=V_e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=j_e(t.worktreePath);return await J_e(l,c)}function V_e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(N3.test(t)&&t.length<=qP)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>qP)break;o=s}return N3.test(o)?o:null}async function J_e(e,t){if(!await Y_e(U3(t,e)))return e;let n=W_e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,qP-5)}-${n}`}async function Y_e(e){try{return await U_e.access(e),!0}catch{return!1}}function X_e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Q_e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function j3(e){let t,n,r=U3(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await z_e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${eh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return B3(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 B3(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 B3(e,t){e&&e.setCwd(t),Z_e(t)}function Z_e(e){try{process.chdir(e)}catch{}}lt();At();Na();Wr();K();import{spawn as H3}from"child_process";import{existsSync as K3,mkdirSync as oIe,readFileSync as G3,unlinkSync as W3,writeFileSync as q3}from"fs";import{get as iIe}from"https";import{join as z3}from"path";import{readFileSync as eIe}from"fs";import{dirname as tIe,join as nIe}from"path";import{fileURLToPath as rIe}from"url";function Gr(){try{return"5.112.5"}catch{}try{let e=tIe(rIe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(eIe(nIe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}U();j();var sIe=64*1024,aIe=10800*1e3,lIe=800,cIe=3600*1e3,uIe="update-check.json",dIe="pending-update.json";function zP(){return z3(Da(),uIe)}function Km(){return z3(Da(),dIe)}function VP(){let e=Da();K3(e)||oIe(e,{recursive:!0})}function V3(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 J3(){try{let e=G3(zP(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Y3(){try{VP();let e=`
1865
+ `),N3=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,qP=30,K_e=1024,G_e=8e3,q_e="haiku";async function z_e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=X_e(n,K_e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??G_e),s=t.signal?Q_e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Za({token:t.token,model:t.model??q_e,system:H_e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=V_e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=j_e(t.worktreePath);return await J_e(l,c)}function V_e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(N3.test(t)&&t.length<=qP)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>qP)break;o=s}return N3.test(o)?o:null}async function J_e(e,t){if(!await Y_e(U3(t,e)))return e;let n=W_e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,qP-5)}-${n}`}async function Y_e(e){try{return await U_e.access(e),!0}catch{return!1}}function X_e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Q_e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function j3(e){let t,n,r=U3(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await z_e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${eh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return B3(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 B3(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 B3(e,t){e&&e.setCwd(t),Z_e(t)}function Z_e(e){try{process.chdir(e)}catch{}}lt();At();Na();Wr();K();import{spawn as H3}from"child_process";import{existsSync as K3,mkdirSync as oIe,readFileSync as G3,unlinkSync as W3,writeFileSync as q3}from"fs";import{get as iIe}from"https";import{join as z3}from"path";import{readFileSync as eIe}from"fs";import{dirname as tIe,join as nIe}from"path";import{fileURLToPath as rIe}from"url";function Gr(){try{return"5.112.6"}catch{}try{let e=tIe(rIe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(eIe(nIe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}U();j();var sIe=64*1024,aIe=10800*1e3,lIe=800,cIe=3600*1e3,uIe="update-check.json",dIe="pending-update.json";function zP(){return z3(Da(),uIe)}function Km(){return z3(Da(),dIe)}function VP(){let e=Da();K3(e)||oIe(e,{recursive:!0})}function V3(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 J3(){try{let e=G3(zP(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Y3(){try{VP();let e=`
1866
1866
  const https = require('https');
1867
1867
  const fs = require('fs');
1868
1868
  const url = 'https://registry.npmjs.org/agent-afk/latest';