agent-afk 5.146.1 → 5.146.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs
CHANGED
|
@@ -377,7 +377,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
|
|
|
377
377
|
|
|
378
378
|
${t}`}var Wme,dA=y(()=>{"use strict";Wme=new Set(["script","style","noscript","template","svg"])});function qme(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 UU(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function zme(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 jU(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??qme,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(!Gme.has(d.status)||u===o)return d;let p=zme(d,s)??UU(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=UU(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 Gme,HU=y(()=>{"use strict";ue();Gme=new Set([429,502,503,504])});import{BlockList as Vme,isIP as mA}from"node:net";import{lookup as Yme}from"node:dns/promises";import{Agent as Jme}from"undici";function KU(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function efe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function pA(e){let t=mA(e);return t===0?!1:Zme.check(e,t===4?"ipv4":"ipv6")}async function GU(e){return Yme(e,{all:!0,verbatim:!0})}async function fA(e,t={}){if(t.allowPrivateHosts??KU())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=efe(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(mA(r)!==0)return pA(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??GU,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(pA(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function jp(e,t={}){let n=await fA(e,t);if(!n.allowed)throw new lr(n.reason)}async function My(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<=WU;s++){await jp(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??KU())?{dispatcher:tfe}:{}},l=await jU(e,i,a,r.retry??{});if(!nfe.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 (>${WU}) starting from ${t}`)}var Xme,Qme,Zme,lr,tfe,WU,nfe,gA=y(()=>{"use strict";N();HU();Xme=[["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]],Qme=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Zme=(()=>{let e=new Vme;for(let[t,n]of Xme)e.addSubnet(t,n,"ipv4");for(let[t,n]of Qme)e.addSubnet(t,n,"ipv6");return e})(),lr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};tfe=new Jme({connect:{lookup(e,t,n){GU(e).then(r=>{let o=r.find(s=>pA(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,mA(i.address))},r=>n(r,"",0))}}});WU=20,nfe=new Set([301,302,303,307,308])});import{readFileSync as rfe}from"node:fs";import{join as ofe}from"path";function ife(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function qU(e,t){return ife(t).test(e)}function lfe(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(sfe.has(t))return!0;if(afe.has(t))return!1}return!1}function zU(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function cfe(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 VU(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Nd(t),t}function ufe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function dfe(e){try{return rfe(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function pfe(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=VU(t.defaultProfile)),n}function YU(e){let t=e?.env??v,n=e?.readFileSync??dfe,r=e?.surface??t.AGENT_SURFACE,o=lfe(t.AFK_BROWSER_HEADLESS,r),i=zU(t.AFK_BROWSER_ALLOWED_DOMAINS),s=zU(t.AFK_BROWSER_BLOCKED_DOMAINS),a=ufe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=cfe(t.AFK_BROWSER_BACKEND),c=VU(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():ofe(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=pfe(u,g);return h.configPath=p,h}function Oy(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(qU(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>qU(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var sfe,afe,Dy=y(()=>{"use strict";N();H();sfe=new Set(["daemon","subagent","telegram","afk"]),afe=new Set(["repl","interactive","cli"])});import{existsSync as mfe,readFileSync as ffe}from"node:fs";import{createRequire as gfe}from"node:module";import{dirname as hfe,join as yfe}from"node:path";function QU(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Sfe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function un(e){let t=QU(e);return XU.some(n=>t.includes(n))}function wfe(){try{let t=gfe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(ffe(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=yfe(hfe(t),o);return mfe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Hp(){return JU??=wfe()??bfe,JU}function hA(e){return e.includes("install chromium")}function Un(e,t){let n=QU(e),r=t?.latched===!0?` ${vfe}`:"";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(!un(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
379
379
|
|
|
380
|
-
${Un(e,{headless:t,latched:n})}`,{cause:e})}var XU,bfe,Sfe,JU,vfe,$y=y(()=>{"use strict";XU=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],bfe="pnpm exec playwright install chromium",Sfe=4;vfe="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 Js from"node:fs";import Fy from"node:path";import{randomBytes as kfe}from"node:crypto";import{chromium as Tfe}from"playwright";function Efe(){try{return"5.146.1"}catch{}try{let e=Fy.resolve(import.meta.dirname,"../../../package.json"),t=Js.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Rfe,Ly,ZU=y(()=>{"use strict";$y();H();ue();Rfe=Efe(),Ly=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=Tfe.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/${Rfe}`}}loadStorageState(t){let n=Bd(t);try{if(!Js.existsSync(n))return;let r=JSON.parse(Js.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=Bd(t);if(!Js.existsSync(r))return;let o=await n.storageState(),i=Fy.join(Fy.dirname(r),`.${Fy.basename(r)}.${process.pid}.${kfe(4).toString("hex")}.tmp`);Js.writeFileSync(i,JSON.stringify(o),{mode:384}),Js.chmodSync(i,384),Js.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 xfe}from"crypto";function ej(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Afe.test(e.label))}function tj(e){return xfe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function nj(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Afe,Ny=y(()=>{"use strict";Afe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Cfe}from"node:crypto";function _fe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Ife(e,t,n){return`el_${Cfe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Pfe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function rj(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function ij(e,t){let n=e.role??"",r=e.name??"";oj.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])ij(i,t)}async function Mfe(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},sj).catch(()=>[])}async function Ofe(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},sj).catch(()=>[])}function Dfe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function By(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Dfe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Mfe(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=[],ij(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Ofe(e)).filter(D=>oj.has(D.role??"")));let w=new Map;for(let P of p){let D=rj(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(rj(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let L=P.dom?.bbox.y??0,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}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let L=P.ax.role??"generic",U=P.ax.name??"",G=Ife(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)),ej({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:_fe(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=Pfe(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 oj,sj,aj=y(()=>{"use strict";Ny();oj=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);sj="a[href], button, input, select, textarea, [role], [tabindex], label"});async function lj(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 yA(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>lj(e,i)))).filter(o=>o!==null)}async function $fe(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 bA(e,t,n){switch(t.kind){case"element_id":return Ffe(e,t,n);case"selector":return Lfe(e,t);case"semantic":return Nfe(e,t)}}async function Ffe(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 yA(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Lfe(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 yA(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Nfe(e,t){return t.role!==void 0?Bfe(e,t.text,t.role):Ufe(e,t.text,t)}async function Bfe(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 yA(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Ufe(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 $fe(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 lj(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var cj=y(()=>{"use strict"});async function SA(e,t,n,r){let o=e.url();if(o===n)return null;let i=Oy(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 uj=y(()=>{"use strict";Dy()});import{randomBytes as jfe}from"crypto";import{mkdir as Hfe,stat as Wfe,writeFile as Kfe}from"fs/promises";import{join as wA}from"path";import{gzip as Gfe}from"zlib";import{promisify as qfe}from"util";function zfe(e){return wA(wn(e),"browser")}function Vfe(e){return wA(zfe(e),"screenshots")}function Yfe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Jfe(){return jfe(3).toString("hex")}async function vA(e,t,n){if(t.length>dj)throw new Error(`writeScreenshotSidecar: buffer exceeds ${dj} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Vfe(e);await Hfe(r,{recursive:!0});let o=`${Yfe()}-${Jfe()}-${n}.png`,i=wA(r,o);await Kfe(i,t);let{size:s}=await Wfe(i);return{path:i,bytes:s}}var t8e,dj,pj=y(()=>{"use strict";H();Ny();t8e=qfe(Gfe);dj=5*1024*1024});var fj={};lo(fj,{PlaywrightProvider:()=>kA});function mj(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 kA,gj=y(()=>{"use strict";ZU();aj();cj();Dy();uj();pj();kA=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ly(t)}async open(t){let n=Oy(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 SA(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 By(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 By(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 bA(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mj(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 SA(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 By(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 bA(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mj(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 vA(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 vA(n,o,r);return i}catch{return null}}}});var Qs={};lo(Qs,{__resetBrowserRegistryForTests:()=>tge,browserProviderActive:()=>Zfe,closeBrowserProvider:()=>TA,getBrowserProvider:()=>Qfe,peekBrowserProvider:()=>ege});function hj(){Promise.resolve(TA()).then(()=>{process.exit(130)})}function yj(){Promise.resolve(TA()).then(()=>{process.exit(143)})}function bj(){Br=null}function Xfe(){Uy||(process.on("SIGINT",hj),process.on("SIGTERM",yj),process.on("exit",bj),Uy=!0)}function Sj(){Uy&&(process.removeListener("SIGINT",hj),process.removeListener("SIGTERM",yj),process.removeListener("exit",bj),Uy=!1)}async function Qfe(e){return Br!==null?Br:(Xs!==null||(Xs=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(gj(),fj)),n=YU(e),r=new t(n);return Xfe(),Br=r,Xs=null,r})()),Xs)}async function TA(){if(Br===null)return;let e=Br;Br=null,Xs=null,Sj(),await e.shutdown()}function Zfe(){return Br!==null}function ege(){return Br}function tge(){Br=null,Xs=null,Sj()}var Br,Xs,Uy,Zs=y(()=>{"use strict";Dy();Br=null,Xs=null,Uy=!1});async function wj(e,t){try{return await LU(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function age(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Zs(),Qs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function vj(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??age,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await My(n,e,{headers:sge,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(ige.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(oge.test(p)&&!rge.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await wj(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=uA({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 wj(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=uA({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 rge,oge,ige,sge,kj=y(()=>{"use strict";NU();dA();gA();ue();rge=/(text\/html|application\/xhtml\+xml)/i,oge=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,ige=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,sge={"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 uge(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(lge,{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),cge),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 Tj(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?uge({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 Ej(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
380
|
+
${Un(e,{headless:t,latched:n})}`,{cause:e})}var XU,bfe,Sfe,JU,vfe,$y=y(()=>{"use strict";XU=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],bfe="pnpm exec playwright install chromium",Sfe=4;vfe="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 Js from"node:fs";import Fy from"node:path";import{randomBytes as kfe}from"node:crypto";import{chromium as Tfe}from"playwright";function Efe(){try{return"5.146.2"}catch{}try{let e=Fy.resolve(import.meta.dirname,"../../../package.json"),t=Js.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Rfe,Ly,ZU=y(()=>{"use strict";$y();H();ue();Rfe=Efe(),Ly=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=Tfe.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/${Rfe}`}}loadStorageState(t){let n=Bd(t);try{if(!Js.existsSync(n))return;let r=JSON.parse(Js.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=Bd(t);if(!Js.existsSync(r))return;let o=await n.storageState(),i=Fy.join(Fy.dirname(r),`.${Fy.basename(r)}.${process.pid}.${kfe(4).toString("hex")}.tmp`);Js.writeFileSync(i,JSON.stringify(o),{mode:384}),Js.chmodSync(i,384),Js.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 xfe}from"crypto";function ej(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Afe.test(e.label))}function tj(e){return xfe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function nj(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Afe,Ny=y(()=>{"use strict";Afe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Cfe}from"node:crypto";function _fe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Ife(e,t,n){return`el_${Cfe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Pfe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function rj(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function ij(e,t){let n=e.role??"",r=e.name??"";oj.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])ij(i,t)}async function Mfe(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},sj).catch(()=>[])}async function Ofe(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},sj).catch(()=>[])}function Dfe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function By(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Dfe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Mfe(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=[],ij(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Ofe(e)).filter(D=>oj.has(D.role??"")));let w=new Map;for(let P of p){let D=rj(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(rj(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let L=P.dom?.bbox.y??0,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}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let L=P.ax.role??"generic",U=P.ax.name??"",G=Ife(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)),ej({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:_fe(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=Pfe(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 oj,sj,aj=y(()=>{"use strict";Ny();oj=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);sj="a[href], button, input, select, textarea, [role], [tabindex], label"});async function lj(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 yA(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>lj(e,i)))).filter(o=>o!==null)}async function $fe(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 bA(e,t,n){switch(t.kind){case"element_id":return Ffe(e,t,n);case"selector":return Lfe(e,t);case"semantic":return Nfe(e,t)}}async function Ffe(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 yA(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Lfe(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 yA(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Nfe(e,t){return t.role!==void 0?Bfe(e,t.text,t.role):Ufe(e,t.text,t)}async function Bfe(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 yA(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Ufe(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 $fe(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 lj(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var cj=y(()=>{"use strict"});async function SA(e,t,n,r){let o=e.url();if(o===n)return null;let i=Oy(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 uj=y(()=>{"use strict";Dy()});import{randomBytes as jfe}from"crypto";import{mkdir as Hfe,stat as Wfe,writeFile as Kfe}from"fs/promises";import{join as wA}from"path";import{gzip as Gfe}from"zlib";import{promisify as qfe}from"util";function zfe(e){return wA(wn(e),"browser")}function Vfe(e){return wA(zfe(e),"screenshots")}function Yfe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Jfe(){return jfe(3).toString("hex")}async function vA(e,t,n){if(t.length>dj)throw new Error(`writeScreenshotSidecar: buffer exceeds ${dj} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Vfe(e);await Hfe(r,{recursive:!0});let o=`${Yfe()}-${Jfe()}-${n}.png`,i=wA(r,o);await Kfe(i,t);let{size:s}=await Wfe(i);return{path:i,bytes:s}}var t8e,dj,pj=y(()=>{"use strict";H();Ny();t8e=qfe(Gfe);dj=5*1024*1024});var fj={};lo(fj,{PlaywrightProvider:()=>kA});function mj(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 kA,gj=y(()=>{"use strict";ZU();aj();cj();Dy();uj();pj();kA=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ly(t)}async open(t){let n=Oy(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 SA(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 By(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 By(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 bA(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mj(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 SA(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 By(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 bA(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mj(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 vA(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 vA(n,o,r);return i}catch{return null}}}});var Qs={};lo(Qs,{__resetBrowserRegistryForTests:()=>tge,browserProviderActive:()=>Zfe,closeBrowserProvider:()=>TA,getBrowserProvider:()=>Qfe,peekBrowserProvider:()=>ege});function hj(){Promise.resolve(TA()).then(()=>{process.exit(130)})}function yj(){Promise.resolve(TA()).then(()=>{process.exit(143)})}function bj(){Br=null}function Xfe(){Uy||(process.on("SIGINT",hj),process.on("SIGTERM",yj),process.on("exit",bj),Uy=!0)}function Sj(){Uy&&(process.removeListener("SIGINT",hj),process.removeListener("SIGTERM",yj),process.removeListener("exit",bj),Uy=!1)}async function Qfe(e){return Br!==null?Br:(Xs!==null||(Xs=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(gj(),fj)),n=YU(e),r=new t(n);return Xfe(),Br=r,Xs=null,r})()),Xs)}async function TA(){if(Br===null)return;let e=Br;Br=null,Xs=null,Sj(),await e.shutdown()}function Zfe(){return Br!==null}function ege(){return Br}function tge(){Br=null,Xs=null,Sj()}var Br,Xs,Uy,Zs=y(()=>{"use strict";Dy();Br=null,Xs=null,Uy=!1});async function wj(e,t){try{return await LU(e,t)}catch(n){return F("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function age(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Zs(),Qs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function vj(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??age,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await My(n,e,{headers:sge,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(ige.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(oge.test(p)&&!rge.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await wj(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=uA({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 wj(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=uA({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 rge,oge,ige,sge,kj=y(()=>{"use strict";NU();dA();gA();ue();rge=/(text\/html|application\/xhtml\+xml)/i,oge=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,ige=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,sge={"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 uge(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(lge,{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),cge),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 Tj(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?uge({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 Ej(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
381
381
|
|
|
382
382
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
383
383
|
`).trimEnd()}var lge,cge,Rj=y(()=>{"use strict";at();lge="https://api.exa.ai/search",cge=10});function jy(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 ea=y(()=>{"use strict";$y()});function hge(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,pge)}let a=mge;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,fge)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function EA(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:go(e,t),truncated:!0}}function yge(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=hge(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 fA(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 My(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=EA(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await vj(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=EA(BU(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof lr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=un(p)&&!hA(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Hp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=Tj({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:gge,timeoutMs:s.timeoutMs,signal:a.signal}),f=EA(Ej(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,pge,mge,fge,gge,xj,Aj=y(()=>{"use strict";kj();Rj();gA();ui();dA();ea();dge=3e4,pge=12e4,mge=1e5,fge=1e6,gge=10;xj=yge()});import{existsSync as _j,mkdirSync as bge,readFileSync as Sge,renameSync as wge,unlinkSync as vge,writeFileSync as kge}from"node:fs";import{dirname as Cj,join as Tge}from"node:path";import{randomBytes as Ege}from"node:crypto";function Rn(e){let t=e??uR();if(!_j(t))return[];try{let n=Sge(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function hi(e,t){let n=t??uR();bge(Cj(n),{recursive:!0});let r=Tge(Cj(n),`.schedules.json.${process.pid}.${Ege(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{kge(r,o,"utf-8"),wge(r,n)}catch(i){try{_j(r)&&vge(r)}catch{}throw i}}function Hy(e,t){let n=Rn(t),r=n.map(l=>l.id),o=Rge(e.name),i=xge(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),hi(n,t),a}function Wy(e,t){let n=Rn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(hi(o,t),!0)}function Kp(e,t){return Rn(t).find(n=>n.id===e)}function Rge(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function xge(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function Ky(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Gy=y(()=>{"use strict";H()});import{existsSync as Age,readFileSync as Cge}from"node:fs";import{join as _ge}from"node:path";async function jn(e,t,n){let r,o;try{let i=_ge(Kg("default"),"port");if(!Age(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=Cge(i,"utf-8").trim(),a=Ige(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 Ige(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 yi,RA=y(()=>{"use strict";H();yi="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 Pge}from"node:fs";import{readFile as Mge}from"node:fs/promises";var Ij,Pj,Mj,Oj,Dj=y(()=>{"use strict";Gy();H();RA();Ij=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=Hy({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await 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:yi}})}},Pj=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})))}},Mj=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=Tr();if(!Pge(i))return{content:JSON.stringify([])};let s;try{let c=await Mge(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1949,7 +1949,7 @@ ${T}
|
|
|
1949
1949
|
${E}`})}return{fileBlocks:l,warnings:c}}function tee(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function nee(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();dt();B();Ea();function ree(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function oee(e,t){Fe()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function iee(e,t,n,r){if(!Fe())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Pe(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${ve(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function see(e,t,n,r){if(!Fe())return;let{subagentId:o,agentType:i}=n,s=Pe(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${ve(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var iE=class{state;writer;ttfb;constructor(t,n){this.state=ree(),this.writer=t,this.ttfb=n}onToolStart(t){oee(this.state,t)}onToolResult(t,n){iee(this.state,t,n,this.writer)}onSubagentEvent(t,n){see(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function aee(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function lee(e){return e.received?{}:{turnStartedAt:e.startedAt}}function cee(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function uee(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 iE(e,n)))}ue();B();var ILe=3e3;async function dee(e,t){if(!e)return t;let n=Date.now();if(n-t<ILe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){We()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}bk();async function pee(e,t,n,r,o="summary",i,s){let a=J6(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=aee(l);uee(i,process.stdout,c),Au(process.stdout,mf(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,k=!1,T={abort:null},E=0,R=[],I=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,x=()=>{let G=r.subagentControl;G?.hasPromotableForeground()&&nee(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: ${tee(q??W)}`))}).catch(()=>{})},_=r.getCompositor?r.getCompositor():null,P=()=>new Zu({out:ed(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}:{},...lee(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}=eee(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 ZZ(e.text,e.attachments,void 0,G,t.sessionId):e.text,q=t.sendMessageStream(W);if(await yc(($,j)=>{D.process($,j),j&&c.plainHooks?.onSubagentEvent($,j)},async()=>{for await(let $ of q){if(w||k)break;let j=cee(c,$,f);if($.type==="chunk"&&$.chunk.type==="content"?(u=p?VZ(u,$.chunk.content):u+$.chunk.content,p=!1,f=!0):$.type==="message"&&!f&&(u=$.message.content),$.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let X=$.chunk,ee={toolName:X.toolName,toolUseId:X.toolUseId,input:X.toolInput,...X.toolInputRaw!==void 0&&{inputRaw:X.toolInputRaw}};I.set(X.toolUseId,ee),R.push(ee),c.plainHooks?.onToolStart(X)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let X=$.chunk;d=u.length,p=!0;let ee=I.get(X.toolUseId);ee&&(ee.result=X.content,ee.isError=X.isError,I.delete(X.toolUseId)),c.plainHooks?.onToolResult(X,ee?.toolName),E=await dee(r.onContextProgress,E)}if($.type==="paused"){if(r.setPausedState?.(!0),await L(),_&&$.autoResume===!0){let X=new AbortController;T.abort=X;let ee=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Ie=ee?`Keep waiting \u2014 auto-resumes at ${ee}`:"Keep waiting \u2014 auto-resume in progress",re="Switch model / provider (type /model after)",Se="Stop waiting",$e=[m.warning(" \u23F3 Usage limit reached.")+(ee?m.dim(` Auto-resumes at ${ee}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];hn(_,{header:$e,options:[Ie,re,Se],signal:X.signal,initialIndex:0}).then(Sn=>{if(T.abort=null,!Sn)return;let Ve=Sn[0];Ve===void 0||Ve===Ie||(k=!0,Ve===re&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Xt=>{We()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Xt)}))}).catch(Sn=>{We()&&console.error(" "+m.error("picker promise rejected:"),Sn)})}else(i??{fn:console.log}).fn(bF({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),T.abort?.abort(),T.abort=null;let X=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,R.length=0,I.clear(),b=!1,S=void 0,g=!1,D=P(),h=!1,await U(),(i??{fn:console.log}).fn(m.success(X));continue}if($.type==="error"){await L(),Pl(El($.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){_a(n,a,u,S,R),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),xu(process.stdout),rX(process.stdout,"afk: turn complete");let $=X=>{i?i.fn(X):console.log(X)},j=oE(u);if(j){$(YZ(j)),$("");let X=m9(R);if(r.onTerminalState)try{r.onTerminalState(j,{doneHasCorroboratingEvidence:X})}catch{}if(n.permissionMode==="autonomous"){let ee=j.kind==="done"&&Bp().verifyDone===!0&&!X;g9(j,void 0,{unverified:ee})}}if(GO(S,n,$),r.onAfterTurn){let X=r.onAfterTurn();X instanceof Promise&&await X.catch(()=>{})}}}catch(G){await L(),g||Pl(El(G))}finally{await L(),Au(process.stdout,mf(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),T.abort?.abort(),T.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Yi();var PLe=5e3,MLe=3,OLe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function DLe(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 mee(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=pT(_)),await jf(e.session.current),We()&&(b=m0())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,k=!1,T=!1,E,R,I,C=(()=>{let _=parseInt(e.options.maxTurns,10);return _>0?_:void 0})(),x=0;for(g.onInjectable=()=>{x>=MLe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(x++,xu(process.stdout),S={text:OLe,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 $=cd(e.stats.permissionMode),j=Da({buffer:M.text,promptText:$,isTTY:!!process.stdout.isTTY,attachmentSummary:Bu([...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:()=>cd(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{QT(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 sX(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(),E=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 DLe(e,L);let K=L;if(G){let M=UP(L);if(M){let $=M.name.replace(/^\//,"").split(":").pop()??"";if($&&l0($)){let j={skillName:$,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},X=e.session.current.sessionId,ee=Va(X),Ie=Date.now();F(`[afk trace] preflight.start commandName=${$}`);let re=!1,Se=await za(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=d0(Se?.manifestBlock,L)}}}let W=f.drainInjections();W.length>0&&(K=W+K);let q=g.drainInjections();if(q.length>0&&(K=q+K),E!==void 0&&(K=E+`
|
|
1950
1950
|
|
|
1951
1951
|
`+K,E=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:K,sessionId:e.stats.sessionId},$=await e.hookRegistry.dispatch(M);$.injectContext&&(K=$.injectContext+K)}catch(M){if(M instanceof xe){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${ae(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Pr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(R=void 0,I=void 0,await pee({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{Vi(e.stats)}catch(j){T||(T=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(j instanceof Error?j.message:String(j))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(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(cd(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,PLe);M.injectContext&&M.injectContext.trim().length>0&&(E=M.injectContext)}catch(M){if(M instanceof _t)throw M;M instanceof Pr?(F("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof xe?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(M.reason??"no reason given")}`)):F("[stop hook] unexpected error: "+String(M))}}}function $Le(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 fee(e,t,n,r){let o=await uZ(),i=new XT({rl:e.rl,history:o,statusLine:e.statusLine}),s=$Le(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await IZ(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=zZ(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 mee(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();sc();import{execFile as FLe}from"node:child_process";import{dirname as LLe,isAbsolute as NLe,resolve as BLe}from"node:path";import{promisify as ULe}from"node:util";var gee=ULe(FLe),jLe=3e3,HLe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function WLe(){let t=(await gee("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=NLe(t)?t:BLe(process.cwd(),t);return LLe(n)}async function hee(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await WLe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),jLe)});try{let o=Wn({execFile:gee,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=>HLe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}yh();Pp();import{promises as KLe}from"node:fs";import{dirname as GLe,join as See}from"node:path";import{randomBytes as qLe}from"node:crypto";var zLe=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
1952
|
-
`),yee=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,zO=30,VLe=1024,YLe=8e3,JLe="haiku";async function XLe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=tNe(n,VLe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??YLe),s=t.signal?nNe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Fl({token:t.token,model:t.model??JLe,system:zLe,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=QLe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=GLe(t.worktreePath);return await ZLe(l,c)}function QLe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(yee.test(t)&&t.length<=zO)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>zO)break;o=s}return yee.test(o)?o:null}async function ZLe(e,t){if(!await eNe(See(t,e)))return e;let n=qLe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,zO-5)}-${n}`}async function eNe(e){try{return await KLe.access(e),!0}catch{return!1}}function tNe(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 nNe(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 wee(e){let t,n,r=See(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await XLe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ey(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return bee(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 bee(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 bee(e,t){e&&e.setCwd(t),rNe(t)}function rNe(e){try{process.chdir(e)}catch{}}ht();Rt();kl();to();H();import{spawn as kee}from"child_process";import{existsSync as Tee,mkdirSync as lNe,readFileSync as Eee,unlinkSync as vee,writeFileSync as Ree}from"fs";import{get as cNe}from"https";import{join as xee}from"path";import{readFileSync as oNe}from"fs";import{dirname as iNe,join as sNe}from"path";import{fileURLToPath as aNe}from"url";function oo(){try{return"5.146.
|
|
1952
|
+
`),yee=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,zO=30,VLe=1024,YLe=8e3,JLe="haiku";async function XLe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=tNe(n,VLe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??YLe),s=t.signal?nNe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Fl({token:t.token,model:t.model??JLe,system:zLe,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=QLe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=GLe(t.worktreePath);return await ZLe(l,c)}function QLe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(yee.test(t)&&t.length<=zO)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>zO)break;o=s}return yee.test(o)?o:null}async function ZLe(e,t){if(!await eNe(See(t,e)))return e;let n=qLe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,zO-5)}-${n}`}async function eNe(e){try{return await KLe.access(e),!0}catch{return!1}}function tNe(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 nNe(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 wee(e){let t,n,r=See(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await XLe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ey(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return bee(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 bee(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 bee(e,t){e&&e.setCwd(t),rNe(t)}function rNe(e){try{process.chdir(e)}catch{}}ht();Rt();kl();to();H();import{spawn as kee}from"child_process";import{existsSync as Tee,mkdirSync as lNe,readFileSync as Eee,unlinkSync as vee,writeFileSync as Ree}from"fs";import{get as cNe}from"https";import{join as xee}from"path";import{readFileSync as oNe}from"fs";import{dirname as iNe,join as sNe}from"path";import{fileURLToPath as aNe}from"url";function oo(){try{return"5.146.2"}catch{}try{let e=iNe(aNe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(oNe(sNe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}B();N();var uNe=64*1024,dNe=10800*1e3,pNe=800,mNe=3600*1e3,fNe="update-check.json",gNe="pending-update.json";function VO(){return xee(Sl(),fNe)}function sg(){return xee(Sl(),gNe)}function YO(){let e=Sl();Tee(e)||lNe(e,{recursive:!0})}function Aee(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 Cee(){try{let e=Eee(VO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function _ee(){try{YO();let e=`
|
|
1953
1953
|
const https = require('https');
|
|
1954
1954
|
const fs = require('fs');
|
|
1955
1955
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|