agent-afk 5.149.4 → 5.149.5

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
@@ -382,7 +382,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
382
382
 
383
383
  ${t}`}var pfe,yA=y(()=>{"use strict";pfe=new Set(["script","style","noscript","template","svg"])});function gfe(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 JU(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function hfe(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 XU(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??gfe,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(!ffe.has(d.status)||u===o)return d;let p=hfe(d,s)??JU(u,i,s);F("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=JU(u,i,s);F("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var ffe,QU=y(()=>{"use strict";ue();ffe=new Set([429,502,503,504])});import{BlockList as yfe,isIP as SA}from"node:net";import{lookup as bfe}from"node:dns/promises";import{Agent as Sfe}from"undici";function ej(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Tfe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function bA(e){let t=SA(e);return t===0?!1:kfe.check(e,t===4?"ipv4":"ipv6")}async function tj(e){return bfe(e,{all:!0,verbatim:!0})}async function wA(e,t={}){if(t.allowPrivateHosts??ej())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=Tfe(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(SA(r)!==0)return bA(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??tj,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(bA(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function jp(e,t={}){let n=await wA(e,t);if(!n.allowed)throw new lr(n.reason)}async function $y(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<=ZU;s++){await jp(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??ej())?{dispatcher:Efe}:{}},l=await XU(e,i,a,r.retry??{});if(!Rfe.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new lr(`too many redirects (>${ZU}) starting from ${t}`)}var wfe,vfe,kfe,lr,Efe,ZU,Rfe,vA=y(()=>{"use strict";N();QU();wfe=[["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]],vfe=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],kfe=(()=>{let e=new yfe;for(let[t,n]of wfe)e.addSubnet(t,n,"ipv4");for(let[t,n]of vfe)e.addSubnet(t,n,"ipv6");return e})(),lr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Efe=new Sfe({connect:{lookup(e,t,n){tj(e).then(r=>{let o=r.find(s=>bA(s.address));if(o!==void 0){n(new lr(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,SA(i.address))},r=>n(r,"",0))}}});ZU=20,Rfe=new Set([301,302,303,307,308])});import{readFileSync as xfe}from"node:fs";import{join as Afe}from"path";function Cfe(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function nj(e,t){return Cfe(t).test(e)}function Pfe(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(_fe.has(t))return!0;if(Ife.has(t))return!1}return!1}function rj(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Mfe(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 oj(e){let t=e===void 0||e.trim()===""?"default":e.trim();return jd(t),t}function Ofe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Dfe(e){try{return xfe(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function $fe(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=oj(t.defaultProfile)),n}function ij(e){let t=e?.env??v,n=e?.readFileSync??Dfe,r=e?.surface??t.AGENT_SURFACE,o=Pfe(t.AFK_BROWSER_HEADLESS,r),i=rj(t.AFK_BROWSER_ALLOWED_DOMAINS),s=rj(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Ofe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Mfe(t.AFK_BROWSER_BACKEND),c=oj(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():Afe(tr(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=$fe(u,g);return h.configPath=p,h}function Fy(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(nj(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>nj(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var _fe,Ife,Ly=y(()=>{"use strict";N();H();_fe=new Set(["daemon","subagent","telegram","afk"]),Ife=new Set(["repl","interactive","cli"])});import{existsSync as Ffe,readFileSync as Lfe}from"node:fs";import{createRequire as Nfe}from"node:module";import{dirname as Bfe,join as Ufe}from"node:path";function lj(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Hfe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function dn(e){let t=lj(e);return aj.some(n=>t.includes(n))}function Wfe(){try{let t=Nfe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(Lfe(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=Ufe(Bfe(t),o);return Ffe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Hp(){return sj??=Wfe()??jfe,sj}function kA(e){return e.includes("install chromium")}function Un(e,t){let n=lj(e),r=t?.latched===!0?` ${Kfe}`:"";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: ${Hp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Hp()}). Or pick a different tool.${r}`}function Wp(e,t,n=!1){if(!dn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
384
384
 
385
- ${Un(e,{headless:t,latched:n})}`,{cause:e})}var aj,jfe,Hfe,sj,Kfe,Ny=y(()=>{"use strict";aj=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],jfe="pnpm exec playwright install chromium",Hfe=4;Kfe="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 Xs from"node:fs";import By from"node:path";import{randomBytes as Gfe}from"node:crypto";import{chromium as qfe}from"playwright";function zfe(){try{return"5.149.4"}catch{}try{let e=By.resolve(import.meta.dirname,"../../../package.json"),t=Xs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Vfe,Uy,cj=y(()=>{"use strict";Ny();H();ue();Vfe=zfe(),Uy=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=qfe.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=Wp(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/${Vfe}`}}loadStorageState(t){let n=Hd(t);try{if(!Xs.existsSync(n))return;let r=JSON.parse(Xs.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Hd(t);if(!Xs.existsSync(r))return;let o=await n.storageState(),i=By.join(By.dirname(r),`.${By.basename(r)}.${process.pid}.${Gfe(4).toString("hex")}.tmp`);Xs.writeFileSync(i,JSON.stringify(o),{mode:384}),Xs.chmodSync(i,384),Xs.renameSync(i,r),F("[browser/vault] saved session",{profile:t,file:r})}catch(r){F("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Yfe}from"crypto";function uj(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Jfe.test(e.label))}function dj(e){return Yfe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function pj(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Jfe,jy=y(()=>{"use strict";Jfe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Xfe}from"node:crypto";function Qfe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Zfe(e,t,n){return`el_${Xfe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function ege(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function mj(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function gj(e,t){let n=e.role??"",r=e.name??"";fj.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])gj(i,t)}async function tge(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},hj).catch(()=>[])}async function nge(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},hj).catch(()=>[])}function rge(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Hy(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=rge(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tge(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],gj(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await nge(e)).filter(D=>fj.has(D.role??"")));let w=new Map;for(let P of p){let D=mj(P.name),L=w.get(D);(!L||L.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(mj(P.name??""))})),E=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,D)=>{let L=P.dom?.bbox.y??0,U=D.dom?.bbox.y??0;if(L!==U)return L-U;let G=P.dom?.bbox.x??0,K=D.dom?.bbox.x??0;return G-K}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((P,D)=>{let L=P.ax.role??"generic",U=P.ax.name??"",G=Zfe(L,U,D),K=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,q=null;P.ax.value!==void 0&&P.ax.value!==null&&(q=String(P.ax.value)),P.ax.checked!==void 0&&(q=String(P.ax.checked)),uj({role:L,kind:W})&&(q="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let j={id:G,role:L,label:Qfe(U),kind:W,value:q,state:M,bbox:K};return $!==void 0&&(j.selector=$),j}),I="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?I="loading":P==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=ege(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var fj,hj,yj=y(()=>{"use strict";jy();fj=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);hj="a[href], button, input, select, textarea, [role], [tabindex], label"});async function bj(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 TA(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>bj(e,i)))).filter(o=>o!==null)}async function oge(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 EA(e,t,n){switch(t.kind){case"element_id":return ige(e,t,n);case"selector":return sge(e,t);case"semantic":return age(e,t)}}async function ige(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 TA(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function sge(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 TA(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function age(e,t){return t.role!==void 0?lge(e,t.text,t.role):cge(e,t.text,t)}async function lge(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 TA(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function cge(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 oge(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await bj(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let E=0;E<w.length;E++)k=k*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var Sj=y(()=>{"use strict"});async function RA(e,t,n,r){let o=e.url();if(o===n)return null;let i=Fy(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 wj=y(()=>{"use strict";Ly()});import{randomBytes as uge}from"crypto";import{mkdir as dge,stat as pge,writeFile as mge}from"fs/promises";import{join as xA}from"path";import{gzip as fge}from"zlib";import{promisify as gge}from"util";function hge(e){return xA(wn(e),"browser")}function yge(e){return xA(hge(e),"screenshots")}function bge(){return new Date().toISOString().replace(/[:.]/g,"-")}function Sge(){return uge(3).toString("hex")}async function AA(e,t,n){if(t.length>vj)throw new Error(`writeScreenshotSidecar: buffer exceeds ${vj} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=yge(e);await dge(r,{recursive:!0});let o=`${bge()}-${Sge()}-${n}.png`,i=xA(r,o);await mge(i,t);let{size:s}=await pge(i);return{path:i,bytes:s}}var $8e,vj,kj=y(()=>{"use strict";H();jy();$8e=gge(fge);vj=5*1024*1024});var Ej={};co(Ej,{PlaywrightProvider:()=>CA});function Tj(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 CA,Rj=y(()=>{"use strict";cj();yj();Sj();Ly();wj();kj();CA=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Uy(t)}async open(t){let n=Fy(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 RA(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 Hy(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 Hy(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 EA(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${Tj(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 RA(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 Hy(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 EA(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${Tj(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 AA(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 AA(n,o,r);return i}catch{return null}}}});var Zs={};co(Zs,{__resetBrowserRegistryForTests:()=>Ege,browserProviderActive:()=>kge,closeBrowserProvider:()=>_A,getBrowserProvider:()=>vge,peekBrowserProvider:()=>Tge});function xj(){Promise.resolve(_A()).then(()=>{process.exit(130)})}function Aj(){Promise.resolve(_A()).then(()=>{process.exit(143)})}function Cj(){Ur=null}function wge(){Wy||(process.on("SIGINT",xj),process.on("SIGTERM",Aj),process.on("exit",Cj),Wy=!0)}function _j(){Wy&&(process.removeListener("SIGINT",xj),process.removeListener("SIGTERM",Aj),process.removeListener("exit",Cj),Wy=!1)}async function vge(e){return Ur!==null?Ur:(Qs!==null||(Qs=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(Rj(),Ej)),n=ij(e),r=new t(n);return wge(),Ur=r,Qs=null,r})()),Qs)}async function _A(){if(Ur===null)return;let e=Ur;Ur=null,Qs=null,_j(),await e.shutdown()}function kge(){return Ur!==null}function Tge(){return Ur}function Ege(){Ur=null,Qs=null,_j()}var Ur,Qs,Wy,ea=y(()=>{"use strict";Ly();Ur=null,Qs=null,Wy=!1});async function Ij(e,t){try{return await zU(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Ige(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ea(),Zs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function Pj(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Ige,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await $y(n,e,{headers:_ge,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Cge.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(Age.test(p)&&!xge.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await Ij(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof lr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=hA({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await jp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>jp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await jp(d.finalUrl,o);let p=await Ij(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=hA({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof lr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var xge,Age,Cge,_ge,Mj=y(()=>{"use strict";VU();yA();vA();ue();xge=/(text\/html|application\/xhtml\+xml)/i,Age=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Cge=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,_ge={"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 Oge(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Pge,{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),Mge),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function Oj(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Oge({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 Dj(e,t){if(t.length===0)return`# Search results for "${e}"
385
+ ${Un(e,{headless:t,latched:n})}`,{cause:e})}var aj,jfe,Hfe,sj,Kfe,Ny=y(()=>{"use strict";aj=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],jfe="pnpm exec playwright install chromium",Hfe=4;Kfe="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 Xs from"node:fs";import By from"node:path";import{randomBytes as Gfe}from"node:crypto";import{chromium as qfe}from"playwright";function zfe(){try{return"5.149.5"}catch{}try{let e=By.resolve(import.meta.dirname,"../../../package.json"),t=Xs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Vfe,Uy,cj=y(()=>{"use strict";Ny();H();ue();Vfe=zfe(),Uy=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=qfe.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=Wp(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/${Vfe}`}}loadStorageState(t){let n=Hd(t);try{if(!Xs.existsSync(n))return;let r=JSON.parse(Xs.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Hd(t);if(!Xs.existsSync(r))return;let o=await n.storageState(),i=By.join(By.dirname(r),`.${By.basename(r)}.${process.pid}.${Gfe(4).toString("hex")}.tmp`);Xs.writeFileSync(i,JSON.stringify(o),{mode:384}),Xs.chmodSync(i,384),Xs.renameSync(i,r),F("[browser/vault] saved session",{profile:t,file:r})}catch(r){F("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Yfe}from"crypto";function uj(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Jfe.test(e.label))}function dj(e){return Yfe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function pj(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Jfe,jy=y(()=>{"use strict";Jfe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Xfe}from"node:crypto";function Qfe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Zfe(e,t,n){return`el_${Xfe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function ege(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function mj(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function gj(e,t){let n=e.role??"",r=e.name??"";fj.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])gj(i,t)}async function tge(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},hj).catch(()=>[])}async function nge(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},hj).catch(()=>[])}function rge(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Hy(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=rge(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tge(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],gj(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await nge(e)).filter(D=>fj.has(D.role??"")));let w=new Map;for(let P of p){let D=mj(P.name),L=w.get(D);(!L||L.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(mj(P.name??""))})),E=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,D)=>{let L=P.dom?.bbox.y??0,U=D.dom?.bbox.y??0;if(L!==U)return L-U;let G=P.dom?.bbox.x??0,K=D.dom?.bbox.x??0;return G-K}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((P,D)=>{let L=P.ax.role??"generic",U=P.ax.name??"",G=Zfe(L,U,D),K=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,q=null;P.ax.value!==void 0&&P.ax.value!==null&&(q=String(P.ax.value)),P.ax.checked!==void 0&&(q=String(P.ax.checked)),uj({role:L,kind:W})&&(q="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let j={id:G,role:L,label:Qfe(U),kind:W,value:q,state:M,bbox:K};return $!==void 0&&(j.selector=$),j}),I="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?I="loading":P==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=ege(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var fj,hj,yj=y(()=>{"use strict";jy();fj=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);hj="a[href], button, input, select, textarea, [role], [tabindex], label"});async function bj(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 TA(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>bj(e,i)))).filter(o=>o!==null)}async function oge(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 EA(e,t,n){switch(t.kind){case"element_id":return ige(e,t,n);case"selector":return sge(e,t);case"semantic":return age(e,t)}}async function ige(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 TA(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function sge(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 TA(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function age(e,t){return t.role!==void 0?lge(e,t.text,t.role):cge(e,t.text,t)}async function lge(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 TA(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function cge(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 oge(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await bj(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let E=0;E<w.length;E++)k=k*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var Sj=y(()=>{"use strict"});async function RA(e,t,n,r){let o=e.url();if(o===n)return null;let i=Fy(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 wj=y(()=>{"use strict";Ly()});import{randomBytes as uge}from"crypto";import{mkdir as dge,stat as pge,writeFile as mge}from"fs/promises";import{join as xA}from"path";import{gzip as fge}from"zlib";import{promisify as gge}from"util";function hge(e){return xA(wn(e),"browser")}function yge(e){return xA(hge(e),"screenshots")}function bge(){return new Date().toISOString().replace(/[:.]/g,"-")}function Sge(){return uge(3).toString("hex")}async function AA(e,t,n){if(t.length>vj)throw new Error(`writeScreenshotSidecar: buffer exceeds ${vj} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=yge(e);await dge(r,{recursive:!0});let o=`${bge()}-${Sge()}-${n}.png`,i=xA(r,o);await mge(i,t);let{size:s}=await pge(i);return{path:i,bytes:s}}var $8e,vj,kj=y(()=>{"use strict";H();jy();$8e=gge(fge);vj=5*1024*1024});var Ej={};co(Ej,{PlaywrightProvider:()=>CA});function Tj(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 CA,Rj=y(()=>{"use strict";cj();yj();Sj();Ly();wj();kj();CA=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Uy(t)}async open(t){let n=Fy(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 RA(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 Hy(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 Hy(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 EA(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${Tj(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 RA(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 Hy(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 EA(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${Tj(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 AA(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 AA(n,o,r);return i}catch{return null}}}});var Zs={};co(Zs,{__resetBrowserRegistryForTests:()=>Ege,browserProviderActive:()=>kge,closeBrowserProvider:()=>_A,getBrowserProvider:()=>vge,peekBrowserProvider:()=>Tge});function xj(){Promise.resolve(_A()).then(()=>{process.exit(130)})}function Aj(){Promise.resolve(_A()).then(()=>{process.exit(143)})}function Cj(){Ur=null}function wge(){Wy||(process.on("SIGINT",xj),process.on("SIGTERM",Aj),process.on("exit",Cj),Wy=!0)}function _j(){Wy&&(process.removeListener("SIGINT",xj),process.removeListener("SIGTERM",Aj),process.removeListener("exit",Cj),Wy=!1)}async function vge(e){return Ur!==null?Ur:(Qs!==null||(Qs=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(Rj(),Ej)),n=ij(e),r=new t(n);return wge(),Ur=r,Qs=null,r})()),Qs)}async function _A(){if(Ur===null)return;let e=Ur;Ur=null,Qs=null,_j(),await e.shutdown()}function kge(){return Ur!==null}function Tge(){return Ur}function Ege(){Ur=null,Qs=null,_j()}var Ur,Qs,Wy,ea=y(()=>{"use strict";Ly();Ur=null,Qs=null,Wy=!1});async function Ij(e,t){try{return await zU(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Ige(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ea(),Zs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function Pj(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Ige,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await $y(n,e,{headers:_ge,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Cge.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(Age.test(p)&&!xge.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await Ij(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof lr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=hA({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await jp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>jp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await jp(d.finalUrl,o);let p=await Ij(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=hA({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof lr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var xge,Age,Cge,_ge,Mj=y(()=>{"use strict";VU();yA();vA();ue();xge=/(text\/html|application\/xhtml\+xml)/i,Age=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Cge=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,_ge={"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 Oge(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Pge,{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),Mge),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function Oj(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Oge({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 Dj(e,t){if(t.length===0)return`# Search results for "${e}"
386
386
 
387
387
  (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(`
388
388
  `).trimEnd()}var Pge,Mge,$j=y(()=>{"use strict";ut();Pge="https://api.exa.ai/search",Mge=10});function Ky(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 ta=y(()=>{"use strict";Ny()});function Bge(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=Dge;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,$ge)}let a=Fge;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,Lge)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function IA(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Ns(e,t),truncated:!0}}function Uge(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=Bge(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 wA(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 $y(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof lr?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=IA(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await Pj(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=IA(YU(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof lr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=dn(p)&&!kA(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Hp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=Oj({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:Nge,timeoutMs:s.timeoutMs,signal:a.signal}),f=IA(Dj(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 Dge,$ge,Fge,Lge,Nge,Fj,Lj=y(()=>{"use strict";Mj();$j();vA();ui();yA();ta();Dge=3e4,$ge=12e4,Fge=1e5,Lge=1e6,Nge=10;Fj=Uge()});import{existsSync as Bj,mkdirSync as jge,readFileSync as Hge,renameSync as Wge,unlinkSync as Kge,writeFileSync as Gge}from"node:fs";import{dirname as Nj,join as qge}from"node:path";import{randomBytes as zge}from"node:crypto";function Rn(e){let t=e??fR();if(!Bj(t))return[];try{let n=Hge(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 gi(e,t){let n=t??fR();jge(Nj(n),{recursive:!0});let r=qge(Nj(n),`.schedules.json.${process.pid}.${zge(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{Gge(r,o,"utf-8"),Wge(r,n)}catch(i){try{Bj(r)&&Kge(r)}catch{}throw i}}function Gy(e,t){let n=Rn(t),r=n.map(l=>l.id),o=Vge(e.name),i=Yge(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),gi(n,t),a}function qy(e,t){let n=Rn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(gi(o,t),!0)}function Kp(e,t){return Rn(t).find(n=>n.id===e)}function Vge(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Yge(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function zy(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 Vy=y(()=>{"use strict";H()});import{existsSync as Jge,readFileSync as Xge}from"node:fs";import{join as Qge}from"node:path";async function jn(e,t,n){let r,o;try{let i=Qge(Vg("default"),"port");if(!Jge(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=Xge(i,"utf-8").trim(),a=Zge(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function Zge(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var hi,PA=y(()=>{"use strict";H();hi="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 ehe}from"node:fs";import{readFile as the}from"node:fs/promises";var Uj,jj,Hj,Wj,Kj=y(()=>{"use strict";Vy();H();PA();Uj=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=Gy({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await jn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await jn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:hi}})}},jj=async(e,t)=>{let n=Rn();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},Hj=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=Er();if(!ehe(i))return{content:JSON.stringify([])};let s;try{let c=await the(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1956,7 +1956,7 @@ ${E}
1956
1956
  ${T}`})}return{fileBlocks:l,warnings:c}}function See(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function wee(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}N();B();N();at();B();Ra();function vee(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function kee(e,t){Fe()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function Tee(e,t,n,r){if(!Fe())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Me(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${ve(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function Eee(e,t,n,r){if(!Fe())return;let{subagentId:o,agentType:i}=n,s=Me(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${ve(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var cE=class{state;writer;ttfb;constructor(t,n){this.state=vee(),this.writer=t,this.ttfb=n}onToolStart(t){kee(this.state,t)}onToolResult(t,n){Tee(this.state,t,n,this.writer)}onSubagentEvent(t,n){Eee(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function Ree(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function xee(e){return e.received?{}:{turnStartedAt:e.startedAt}}function Aee(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function Cee(e,t=process.stdout,n){if(!Fe()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new cE(e,n)))}ue();B();var lNe=3e3;async function _ee(e,t){if(!e)return t;let n=Date.now();if(n-t<lNe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){We()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}kk();async function Iee(e,t,n,r,o="summary",i,s){let a=d5(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=Ree(l);Cee(i,process.stdout,c),Iu(process.stdout,hf(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,k=!1,E={abort:null},T=0,R=[],I=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,x=()=>{let G=r.subagentControl;G?.hasPromotableForeground()&&wee(G,_,r.onQueuedUserMessage).then(({jobs:K,flushedText:W,flushedPreview:q})=>{let M=(i??{fn:console.log}).fn;for(let $ of K)M(m.dim(` \u2192 subagent backgrounded as ${$.jobId}: ${$.label}`));W!==void 0&&M(m.dim(` \u2192 queued message sent to this turn: ${See(q??W)}`))}).catch(()=>{})},_=r.getCompositor?r.getCompositor():null,P=()=>new nd({out:rd(i),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch(G=>{We()&&console.error(" "+m.error("session.interrupt() failed:"),G)})},...r.subagentControl?{onBackground:x}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},..._?{compositor:_}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...xee(c)}),D=P(),L=async()=>{if(!h){h=!0;try{await D.dispose()}catch{}}},U=async()=>{await D.arm();let G=D.getCompositor();if(i&&G){let K=G;i.fn=W=>K.commitAbove(W),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(G),r.setInterruptNotifier?.(K=>D.setInterrupting(K)),r.rearmStatus?.()};try{_?_.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{w=!0,D.setSoftStopping(!0),t.interrupt().catch(j=>{We()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),j)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(j=>{We()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),j)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch($=>{We()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),$)})}),await U(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(x);let{fileBlocks:G,warnings:K}=bee(e.text,{rootDir:process.cwd()});for(let $ of K)(i??{fn:console.log}).fn(m.dim(` @-file: ${$}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let W=G.length>0||e.attachments.length>0?await yee(e.text,e.attachments,void 0,G,t.sessionId):e.text,q=t.sendMessageStream(W);if(await wc(($,j)=>{D.process($,j),j&&c.plainHooks?.onSubagentEvent($,j)},async()=>{for await(let $ of q){if(w||k)break;let j=Aee(c,$,f);if($.type==="chunk"&&$.chunk.type==="content"?(u=p?pee(u,$.chunk.content):u+$.chunk.content,p=!1,f=!0):$.type==="message"&&!f&&(u=$.message.content),$.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let X=$.chunk,ee={toolName:X.toolName,toolUseId:X.toolUseId,input:X.toolInput,...X.toolInputRaw!==void 0&&{inputRaw:X.toolInputRaw}};I.set(X.toolUseId,ee),R.push(ee),c.plainHooks?.onToolStart(X)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let X=$.chunk;d=u.length,p=!0;let ee=I.get(X.toolUseId);ee&&(ee.result=X.content,ee.isError=X.isError,I.delete(X.toolUseId)),c.plainHooks?.onToolResult(X,ee?.toolName),T=await _ee(r.onContextProgress,T)}if($.type==="paused"){if(r.setPausedState?.(!0),await L(),_&&$.autoResume===!0){let X=new AbortController;E.abort=X;let ee=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Ie=ee?`Keep waiting \u2014 auto-resumes at ${ee}`:"Keep waiting \u2014 auto-resume in progress",re="Switch model / provider (type /model after)",Se="Stop waiting",$e=[m.warning(" \u23F3 Usage limit reached.")+(ee?m.dim(` Auto-resumes at ${ee}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];hn(_,{header:$e,options:[Ie,re,Se],signal:X.signal,initialIndex:0}).then(Sn=>{if(E.abort=null,!Sn)return;let Ve=Sn[0];Ve===void 0||Ve===Ie||(k=!0,Ve===re&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Xt=>{We()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Xt)}))}).catch(Sn=>{We()&&console.error(" "+m.error("picker promise rejected:"),Sn)})}else(i??{fn:console.log}).fn(RF({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let X=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,R.length=0,I.clear(),b=!1,S=void 0,g=!1,D=P(),h=!1,await U(),(i??{fn:console.log}).fn(m.success(X));continue}if($.type==="error"){await L(),Ml(Rl($.error)),g=!0;continue}D.process($),j&&(c.plainHooks?.onFirstContent(process.stdout),D.notifyFirstContent()),$.type==="done"&&(b=!0,S=$.metadata)}}),await L(),w){let $=i?i.fn:console.log,j=_?_.getPendingCount():0,X=j>0?` \xB7 ${j} queued`:"";$(m.warning(`\u23F8 Stopped${X} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),$("")}if(k){let $=i?i.fn:console.log;$(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(b&&!w&&!k){Ia(n,a,u,S,R),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),_u(process.stdout),bX(process.stdout,"afk: turn complete");let $=X=>{i?i.fn(X):console.log(X)},j=lE(u);if(j){$(mee(j,{durationMs:S?.durationMs,totalCostUsd:S?.totalCostUsd,toolCount:R.length})),$("");let X=I9(R);if(r.onTerminalState)try{r.onTerminalState(j,{doneHasCorroboratingEvidence:X})}catch{}if(n.permissionMode==="autonomous"){let ee=j.kind==="done"&&Bp().verifyDone===!0&&!X;M9(j,void 0,{unverified:ee})}}if(QO(S,n,$),r.onAfterTurn){let X=r.onAfterTurn();X instanceof Promise&&await X.catch(()=>{})}}}catch(G){await L(),g||Ml(Rl(G))}finally{await L(),Iu(process.stdout,hf(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Vi();var cNe=5e3,uNe=3,dNe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function pNe(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 Pee(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async _=>{We()&&(h=yT(_)),await Kf(e.session.current),We()&&(b=S0())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,k=!1,E=!1,T,R,I,C=(()=>{let _=parseInt(e.options.maxTurns,10);return _>0?_:void 0})(),x=0;for(g.onInjectable=()=>{x>=uNe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(x++,_u(process.stdout),S={text:dNe,attachments:[]},o.abortPendingRead())};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let M of b)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),b=[]}let _=f.drainNotifications();for(let{job:M,result:$}of _){let j=$.errorReason===void 0?"\u2713":"\u2717",X=$.errorReason==="abort"?"killed":$.errorReason==="timeout"?"timed out":$.errorReason==="signal-killed"?"killed by signal":`exit ${$.exitCode??0}`,ee=Math.max(0,Math.round($.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${j} [${M.id}] ${X} \xB7 ${ee}s \xB7 `)+M.command)}let P=g.drainNotifications();for(let{job:M}of P){let $=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",j=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,X=ie(M.label,60);e.replRenderer.writeLine(m.dim(` ${$} [${M.jobId}] subagent ${M.status} \xB7 ${j}s \xB7 `)+X)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let M of D)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let L,U;if(S===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,S={text:M.message,attachments:[]})}if(S!==void 0){let M=S;S=void 0;let $=pd(e.stats.permissionMode),j=$a({buffer:M.text,promptText:$,isTTY:!!process.stdout.isTTY,attachmentSummary:Hu([...M.attachments])});e.replRenderer.writeLine(j),L=M.text.trim(),U=M.attachments}else{let M=w;w=void 0;let $=await o.readLine({promptFn:()=>pd(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{nE(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});L=$.text.trim(),U=$.attachments}if(!L&&U.length===0)continue;if(L.startsWith("!")){let M=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(k||(k=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(L))){e.statusLine.rearm();continue}}let G=!1;if(L.startsWith("/")){let M=await vX(L,e.slashCtx,U);if(M.handled){if(M.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((L==="/clear"||L.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){S={text:M.result.message,attachments:U??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){w=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}G=!0}a.push(L),await pNe(e,L);let K=L;if(G){let M=zP(L);if(M){let $=M.name.replace(/^\//,"").split(":").pop()??"";if($&&f0($)){let j={skillName:$,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},X=e.session.current.sessionId,ee=Ya(X),Ie=Date.now();F(`[afk trace] preflight.start commandName=${$}`);let re=!1,Se=await Va(j,{cwd:e.stats.cwd??process.cwd(),artifactDir:ee},$e=>{We()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${$}) failed: `)+($e instanceof Error?$e.message:String($e)))});re=Se!==null,F(`[afk trace] preflight.end commandName=${$} durationMs=${Date.now()-Ie} success=${re}`),K=y0(Se?.manifestBlock,L)}}}let W=f.drainInjections();W.length>0&&(K=W+K);let q=g.drainInjections();if(q.length>0&&(K=q+K),T!==void 0&&(K=T+`
1957
1957
 
1958
1958
  `+K,T=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:K,sessionId:e.stats.sessionId},$=await e.hookRegistry.dispatch(M);$.injectContext&&(K=$.injectContext+K)}catch(M){if(M instanceof xe){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${ae(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Mr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(R=void 0,I=void 0,await Iee({text:K,attachments:U},e.session.current,e.stats,{setInFlight(M){n.turnInFlight=M},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(M){await t.appendUser(M)},async onQueuedUserMessage(M){await t.appendQueuedUser(M)},async onTurnComplete(M,$){if(await t.appendTurn(M,$),e.stats.sessionId)try{zi(e.stats)}catch(j){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(j instanceof Error?j.message:String(j))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(Jn(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,$)=>{p?.push(M),R=M.kind,I=$?.doneHasCorroboratingEvidence},setActiveCompositor:M=>{n.activeCompositor=M,M===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:M=>{n.notifyInterrupting=M},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:M=>o.setBackgroundHandler(M),setSoftStopHandler:i,setPausedState:M=>o.setPausedState(M),setPauseInterruptHandler:M=>o.setPauseInterruptHandler(M),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Jn(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(M,$)=>{c.repaint(M),u?.onStage(M,$)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(pd(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},...I!==void 0?{doneHasCorroboratingEvidence:I}:{}},void 0,cNe);M.injectContext&&M.injectContext.trim().length>0&&(T=M.injectContext)}catch(M){if(M instanceof _t)throw M;M instanceof Mr?(F("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof xe?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(M.reason??"no reason given")}`)):F("[stop hook] unexpected error: "+String(M))}}}function mNe(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 Mee(e,t,n,r){let o=await xZ(),i=new tE({rl:e.rl,history:o,statusLine:e.statusLine}),s=mNe(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await VZ(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=dee(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await Pee(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Pp();cc();import{execFile as fNe}from"node:child_process";import{dirname as gNe,isAbsolute as hNe,resolve as yNe}from"node:path";import{promisify as bNe}from"node:util";var Oee=bNe(fNe),SNe=3e3,wNe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function vNe(){let t=(await Oee("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=hNe(t)?t:yNe(process.cwd(),t);return gNe(n)}async function Dee(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await vNe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),SNe)});try{let o=Wn({execFile:Oee,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=>wNe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}vh();Pp();import{promises as kNe}from"node:fs";import{dirname as TNe,join as Lee}from"node:path";import{randomBytes as ENe}from"node:crypto";var RNe=["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(`
1959
- `),$ee=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,eD=30,xNe=1024,ANe=8e3,CNe="haiku";async function _Ne(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=ONe(n,xNe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??ANe),s=t.signal?DNe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Nl({token:t.token,model:t.model??CNe,system:RNe,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=INe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=TNe(t.worktreePath);return await PNe(l,c)}function INe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if($ee.test(t)&&t.length<=eD)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>eD)break;o=s}return $ee.test(o)?o:null}async function PNe(e,t){if(!await MNe(Lee(t,e)))return e;let n=ENe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,eD-5)}-${n}`}async function MNe(e){try{return await kNe.access(e),!0}catch{return!1}}function ONe(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 DNe(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 Nee(e){let t,n,r=Lee(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await _Ne(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=`${Ay(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Fee(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 Fee(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 Fee(e,t){e&&e.setCwd(t),$Ne(t)}function $Ne(e){try{process.chdir(e)}catch{}}ht();Rt();Tl();no();H();import{spawn as Uee}from"child_process";import{existsSync as jee,mkdirSync as UNe,readFileSync as Hee,unlinkSync as Bee,writeFileSync as Wee}from"fs";import{get as jNe}from"https";import{join as Kee}from"path";import{readFileSync as FNe}from"fs";import{dirname as LNe,join as NNe}from"path";import{fileURLToPath as BNe}from"url";function io(){try{return"5.149.4"}catch{}try{let e=LNe(BNe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(FNe(NNe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}B();N();var HNe=64*1024,WNe=10800*1e3,KNe=800,GNe=3600*1e3,qNe="update-check.json",zNe="pending-update.json";function tD(){return Kee(wl(),qNe)}function ug(){return Kee(wl(),zNe)}function nD(){let e=wl();jee(e)||UNe(e,{recursive:!0})}function Gee(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 qee(){try{let e=Hee(tD(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function zee(){try{nD();let e=`
1959
+ `),$ee=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,eD=30,xNe=1024,ANe=8e3,CNe="haiku";async function _Ne(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=ONe(n,xNe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??ANe),s=t.signal?DNe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Nl({token:t.token,model:t.model??CNe,system:RNe,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=INe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=TNe(t.worktreePath);return await PNe(l,c)}function INe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if($ee.test(t)&&t.length<=eD)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>eD)break;o=s}return $ee.test(o)?o:null}async function PNe(e,t){if(!await MNe(Lee(t,e)))return e;let n=ENe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,eD-5)}-${n}`}async function MNe(e){try{return await kNe.access(e),!0}catch{return!1}}function ONe(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 DNe(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 Nee(e){let t,n,r=Lee(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await _Ne(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=`${Ay(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Fee(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 Fee(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 Fee(e,t){e&&e.setCwd(t),$Ne(t)}function $Ne(e){try{process.chdir(e)}catch{}}ht();Rt();Tl();no();H();import{spawn as Uee}from"child_process";import{existsSync as jee,mkdirSync as UNe,readFileSync as Hee,unlinkSync as Bee,writeFileSync as Wee}from"fs";import{get as jNe}from"https";import{join as Kee}from"path";import{readFileSync as FNe}from"fs";import{dirname as LNe,join as NNe}from"path";import{fileURLToPath as BNe}from"url";function io(){try{return"5.149.5"}catch{}try{let e=LNe(BNe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(FNe(NNe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}B();N();var HNe=64*1024,WNe=10800*1e3,KNe=800,GNe=3600*1e3,qNe="update-check.json",zNe="pending-update.json";function tD(){return Kee(wl(),qNe)}function ug(){return Kee(wl(),zNe)}function nD(){let e=wl();jee(e)||UNe(e,{recursive:!0})}function Gee(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 qee(){try{let e=Hee(tD(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function zee(){try{nD();let e=`
1960
1960
  const https = require('https');
1961
1961
  const fs = require('fs');
1962
1962
  const url = 'https://registry.npmjs.org/agent-afk/latest';