agent-afk 5.123.3 → 5.123.4
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 +2 -2
- package/dist/index.mjs +200 -200
- package/dist/telegram/streaming.body.d.ts +6 -0
- package/dist/telegram/streaming.d.ts +3 -14
- package/dist/telegram/streaming.preview.d.ts +17 -0
- package/dist/telegram/streaming.retry.d.ts +13 -0
- package/dist/telegram.mjs +252 -252
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -316,7 +316,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
|
|
|
316
316
|
|
|
317
317
|
${t}`}var Jce,mR=y(()=>{"use strict";Jce=new Set(["script","style","noscript","template","svg"])});function Zce(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 qN(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function eue(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 zN(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Zce,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(!Qce.has(d.status)||u===o)return d;let p=eue(d,s)??qN(u,i,s);j("[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=qN(u,i,s);j("[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 Qce,VN=y(()=>{"use strict";de();Qce=new Set([429,502,503,504])});import{BlockList as tue,isIP as gR}from"node:net";import{lookup as nue}from"node:dns/promises";import{Agent as rue}from"undici";function JN(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function aue(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function fR(e){let t=gR(e);return t===0?!1:sue.check(e,t===4?"ipv4":"ipv6")}async function XN(e){return nue(e,{all:!0,verbatim:!0})}async function hR(e,t={}){if(t.allowPrivateHosts??JN())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=aue(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(gR(r)!==0)return fR(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??XN,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(fR(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function fp(e,t={}){let n=await hR(e,t);if(!n.allowed)throw new nr(n.reason)}async function Vh(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<=YN;s++){await fp(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??JN())?{dispatcher:lue}:{}},l=await zN(e,i,a,r.retry??{});if(!cue.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 nr(`too many redirects (>${YN}) starting from ${t}`)}var oue,iue,sue,nr,lue,YN,cue,yR=y(()=>{"use strict";B();VN();oue=[["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]],iue=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],sue=(()=>{let e=new tue;for(let[t,n]of oue)e.addSubnet(t,n,"ipv4");for(let[t,n]of iue)e.addSubnet(t,n,"ipv6");return e})(),nr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};lue=new rue({connect:{lookup(e,t,n){XN(e).then(r=>{let o=r.find(s=>fR(s.address));if(o!==void 0){n(new nr(`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,gR(i.address))},r=>n(r,"",0))}}});YN=20,cue=new Set([301,302,303,307,308])});import{readFileSync as uue}from"node:fs";import{join as due}from"path";function pue(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function QN(e,t){return pue(t).test(e)}function gue(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(mue.has(t))return!0;if(fue.has(t))return!1}return!1}function ZN(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function hue(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 eB(e){let t=e===void 0||e.trim()===""?"default":e.trim();return hd(t),t}function yue(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function bue(e){try{return uue(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Sue(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=eB(t.defaultProfile)),n}function tB(e){let t=e?.env??v,n=e?.readFileSync??bue,r=e?.surface??t.AGENT_SURFACE,o=gue(t.AFK_BROWSER_HEADLESS,r),i=ZN(t.AFK_BROWSER_ALLOWED_DOMAINS),s=ZN(t.AFK_BROWSER_BLOCKED_DOMAINS),a=yue(t.AFK_BROWSER_DOM_SNAPSHOTS),l=hue(t.AFK_BROWSER_BACKEND),c=eB(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():due(Yn(),"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=Sue(u,g);return h.configPath=p,h}function Yh(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(QN(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>QN(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var mue,fue,Jh=y(()=>{"use strict";B();H();mue=new Set(["daemon","subagent","telegram","afk"]),fue=new Set(["repl","interactive","cli"])});import{existsSync as wue,readFileSync as vue}from"node:fs";import{createRequire as kue}from"node:module";import{dirname as Tue,join as Eue}from"node:path";function oB(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Rue&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function on(e){let t=oB(e);return rB.some(n=>t.includes(n))}function Aue(){try{let t=kue(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(vue(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=Eue(Tue(t),o);return wue(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function gp(){return nB??=Aue()??xue,nB}function bR(e){return e.includes("install chromium")}function $n(e,t){let n=oB(e),r=t?.latched===!0?` ${Cue}`:"";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: ${gp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${gp()}). Or pick a different tool.${r}`}function hp(e,t,n=!1){if(!on(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
318
318
|
|
|
319
|
-
${$n(e,{headless:t,latched:n})}`,{cause:e})}var rB,xue,Rue,nB,Cue,Xh=y(()=>{"use strict";rB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],xue="pnpm exec playwright install chromium",Rue=4;Cue="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 Qh from"node:path";import{randomBytes as _ue}from"node:crypto";import{chromium as Iue}from"playwright";function Pue(){try{return"5.123.3"}catch{}try{let e=Qh.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 Mue,Zh,iB=y(()=>{"use strict";Xh();H();de();Mue=Pue(),Zh=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=Iue.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=hp(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/${Mue}`}}loadStorageState(t){let n=yd(t);try{if(!js.existsSync(n))return;let r=JSON.parse(js.readFileSync(n,"utf8"));return j("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){j("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=yd(t);if(!js.existsSync(r))return;let o=await n.storageState(),i=Qh.join(Qh.dirname(r),`.${Qh.basename(r)}.${process.pid}.${_ue(4).toString("hex")}.tmp`);js.writeFileSync(i,JSON.stringify(o),{mode:384}),js.chmodSync(i,384),js.renameSync(i,r),j("[browser/vault] saved session",{profile:t,file:r})}catch(r){j("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Oue}from"crypto";function sB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Due.test(e.label))}function aB(e){return Oue("sha256").update(e,"utf8").digest("hex").slice(0,8)}function lB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Due,ey=y(()=>{"use strict";Due=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as $ue}from"node:crypto";function Fue(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Lue(e,t,n){return`el_${$ue("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Nue(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function cB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function dB(e,t){let n=e.role??"",r=e.name??"";uB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])dB(i,t)}async function Bue(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},pB).catch(()=>[])}async function Uue(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},pB).catch(()=>[])}function jue(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function ty(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=jue(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Bue(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=[],dB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Uue(e)).filter(P=>uB.has(P.role??"")));let w=new Map;for(let O of p){let P=cB(O.name),X=w.get(P);(!X||X.bbox.w===0&&O.bbox.w>0)&&w.set(P,O)}let E=b.map(O=>({ax:O,dom:w.get(cB(O.name??""))})),T=r?E:E.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,P)=>{let X=O.dom?.bbox.y??0,$=P.dom?.bbox.y??0;if(X!==$)return X-$;let V=O.dom?.bbox.x??0,K=P.dom?.bbox.x??0;return V-K}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,P)=>{let X=O.ax.role??"generic",$=O.ax.name??"",V=Lue(X,$,P),K=O.dom?.bbox??{x:0,y:0,w:0,h:0},M=O.dom?.type??null,N=null;O.ax.value!==void 0&&O.ax.value!==null&&(N=String(O.ax.value)),O.ax.checked!==void 0&&(N=String(O.ax.checked)),sB({role:X,kind:M})&&(N="[redacted]");let L={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(L.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(L.selected=O.ax.selected),O.ax.expanded!==void 0&&(L.expanded=O.ax.expanded);let D;O.dom?.testId?D=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(D=`#${O.dom.id}`);let W={id:V,role:X,label:Fue($),kind:M,value:N,state:L,bbox:K};return D!==void 0&&(W.selector=D),W}),_="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?_="loading":O==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="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=Nue(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var uB,pB,mB=y(()=>{"use strict";ey();uB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);pB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function fB(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 SR(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>fB(e,i)))).filter(o=>o!==null)}async function Hue(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 wR(e,t,n){switch(t.kind){case"element_id":return Wue(e,t,n);case"selector":return Kue(e,t);case"semantic":return Gue(e,t)}}async function Wue(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 SR(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Kue(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 SR(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Gue(e,t){return t.role!==void 0?que(e,t.text,t.role):zue(e,t.text,t)}async function que(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 SR(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function zue(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 Hue(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 fB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,E=0;for(let T=0;T<w.length;T++)E=E*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var gB=y(()=>{"use strict"});async function vR(e,t,n,r){let o=e.url();if(o===n)return null;let i=Yh(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 hB=y(()=>{"use strict";Jh()});import{randomBytes as Vue}from"crypto";import{mkdir as Yue,stat as Jue,writeFile as Xue}from"fs/promises";import{join as kR}from"path";import{gzip as Que}from"zlib";import{promisify as Zue}from"util";function ede(e){return kR(mn(e),"browser")}function tde(e){return kR(ede(e),"screenshots")}function nde(){return new Date().toISOString().replace(/[:.]/g,"-")}function rde(){return Vue(3).toString("hex")}async function TR(e,t,n){if(t.length>yB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${yB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=tde(e);await Yue(r,{recursive:!0});let o=`${nde()}-${rde()}-${n}.png`,i=kR(r,o);await Xue(i,t);let{size:s}=await Jue(i);return{path:i,bytes:s}}var OYe,yB,bB=y(()=>{"use strict";H();ey();OYe=Zue(Que);yB=5*1024*1024});var wB={};ro(wB,{PlaywrightProvider:()=>ER});function SB(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 ER,vB=y(()=>{"use strict";iB();mB();gB();Jh();hB();bB();ER=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Zh(t)}async open(t){let n=Yh(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 vR(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 ty(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 ty(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 wR(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${SB(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 vR(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 ty(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 wR(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${SB(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 TR(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 TR(n,o,r);return i}catch{return null}}}});var Ws={};ro(Ws,{__resetBrowserRegistryForTests:()=>lde,browserProviderActive:()=>sde,closeBrowserProvider:()=>xR,getBrowserProvider:()=>ide,peekBrowserProvider:()=>ade});function kB(){Promise.resolve(xR()).then(()=>{process.exit(130)})}function TB(){Promise.resolve(xR()).then(()=>{process.exit(143)})}function EB(){Or=null}function ode(){ny||(process.on("SIGINT",kB),process.on("SIGTERM",TB),process.on("exit",EB),ny=!0)}function xB(){ny&&(process.removeListener("SIGINT",kB),process.removeListener("SIGTERM",TB),process.removeListener("exit",EB),ny=!1)}async function ide(e){return Or!==null?Or:(Hs!==null||(Hs=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(vB(),wB)),n=tB(e),r=new t(n);return ode(),Or=r,Hs=null,r})()),Hs)}async function xR(){if(Or===null)return;let e=Or;Or=null,Hs=null,xB(),await e.shutdown()}function sde(){return Or!==null}function ade(){return Or}function lde(){Or=null,Hs=null,xB()}var Or,Hs,ny,Ks=y(()=>{"use strict";Jh();Or=null,Hs=null,ny=!1});async function RB(e,t){try{return await WN(e,t)}catch(n){return j("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function fde(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ks(),Ws));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function AB(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??fde,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Vh(n,e,{headers:mde,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(pde.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(dde.test(p)&&!ude.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await RB(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof nr||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=pR({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await fp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>fp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await fp(d.finalUrl,o);let p=await RB(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=pR({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 nr)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 ude,dde,pde,mde,CB=y(()=>{"use strict";KN();mR();yR();de();ude=/(text\/html|application\/xhtml\+xml)/i,dde=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,pde=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,mde={"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 yde(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(gde,{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),hde),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=Oe(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 _B(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?yde({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 IB(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
319
|
+
${$n(e,{headless:t,latched:n})}`,{cause:e})}var rB,xue,Rue,nB,Cue,Xh=y(()=>{"use strict";rB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],xue="pnpm exec playwright install chromium",Rue=4;Cue="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 Qh from"node:path";import{randomBytes as _ue}from"node:crypto";import{chromium as Iue}from"playwright";function Pue(){try{return"5.123.4"}catch{}try{let e=Qh.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 Mue,Zh,iB=y(()=>{"use strict";Xh();H();de();Mue=Pue(),Zh=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=Iue.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=hp(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/${Mue}`}}loadStorageState(t){let n=yd(t);try{if(!js.existsSync(n))return;let r=JSON.parse(js.readFileSync(n,"utf8"));return j("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){j("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=yd(t);if(!js.existsSync(r))return;let o=await n.storageState(),i=Qh.join(Qh.dirname(r),`.${Qh.basename(r)}.${process.pid}.${_ue(4).toString("hex")}.tmp`);js.writeFileSync(i,JSON.stringify(o),{mode:384}),js.chmodSync(i,384),js.renameSync(i,r),j("[browser/vault] saved session",{profile:t,file:r})}catch(r){j("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Oue}from"crypto";function sB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Due.test(e.label))}function aB(e){return Oue("sha256").update(e,"utf8").digest("hex").slice(0,8)}function lB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Due,ey=y(()=>{"use strict";Due=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as $ue}from"node:crypto";function Fue(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Lue(e,t,n){return`el_${$ue("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Nue(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function cB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function dB(e,t){let n=e.role??"",r=e.name??"";uB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])dB(i,t)}async function Bue(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},pB).catch(()=>[])}async function Uue(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},pB).catch(()=>[])}function jue(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function ty(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=jue(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Bue(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=[],dB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Uue(e)).filter(P=>uB.has(P.role??"")));let w=new Map;for(let O of p){let P=cB(O.name),X=w.get(P);(!X||X.bbox.w===0&&O.bbox.w>0)&&w.set(P,O)}let E=b.map(O=>({ax:O,dom:w.get(cB(O.name??""))})),T=r?E:E.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,P)=>{let X=O.dom?.bbox.y??0,$=P.dom?.bbox.y??0;if(X!==$)return X-$;let V=O.dom?.bbox.x??0,K=P.dom?.bbox.x??0;return V-K}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,P)=>{let X=O.ax.role??"generic",$=O.ax.name??"",V=Lue(X,$,P),K=O.dom?.bbox??{x:0,y:0,w:0,h:0},M=O.dom?.type??null,N=null;O.ax.value!==void 0&&O.ax.value!==null&&(N=String(O.ax.value)),O.ax.checked!==void 0&&(N=String(O.ax.checked)),sB({role:X,kind:M})&&(N="[redacted]");let L={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(L.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(L.selected=O.ax.selected),O.ax.expanded!==void 0&&(L.expanded=O.ax.expanded);let D;O.dom?.testId?D=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(D=`#${O.dom.id}`);let W={id:V,role:X,label:Fue($),kind:M,value:N,state:L,bbox:K};return D!==void 0&&(W.selector=D),W}),_="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?_="loading":O==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="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=Nue(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var uB,pB,mB=y(()=>{"use strict";ey();uB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);pB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function fB(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 SR(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>fB(e,i)))).filter(o=>o!==null)}async function Hue(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 wR(e,t,n){switch(t.kind){case"element_id":return Wue(e,t,n);case"selector":return Kue(e,t);case"semantic":return Gue(e,t)}}async function Wue(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 SR(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Kue(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 SR(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Gue(e,t){return t.role!==void 0?que(e,t.text,t.role):zue(e,t.text,t)}async function que(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 SR(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function zue(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 Hue(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 fB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,E=0;for(let T=0;T<w.length;T++)E=E*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var gB=y(()=>{"use strict"});async function vR(e,t,n,r){let o=e.url();if(o===n)return null;let i=Yh(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 hB=y(()=>{"use strict";Jh()});import{randomBytes as Vue}from"crypto";import{mkdir as Yue,stat as Jue,writeFile as Xue}from"fs/promises";import{join as kR}from"path";import{gzip as Que}from"zlib";import{promisify as Zue}from"util";function ede(e){return kR(mn(e),"browser")}function tde(e){return kR(ede(e),"screenshots")}function nde(){return new Date().toISOString().replace(/[:.]/g,"-")}function rde(){return Vue(3).toString("hex")}async function TR(e,t,n){if(t.length>yB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${yB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=tde(e);await Yue(r,{recursive:!0});let o=`${nde()}-${rde()}-${n}.png`,i=kR(r,o);await Xue(i,t);let{size:s}=await Jue(i);return{path:i,bytes:s}}var OYe,yB,bB=y(()=>{"use strict";H();ey();OYe=Zue(Que);yB=5*1024*1024});var wB={};ro(wB,{PlaywrightProvider:()=>ER});function SB(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 ER,vB=y(()=>{"use strict";iB();mB();gB();Jh();hB();bB();ER=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Zh(t)}async open(t){let n=Yh(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 vR(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 ty(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 ty(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 wR(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${SB(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 vR(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 ty(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 wR(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${SB(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 TR(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 TR(n,o,r);return i}catch{return null}}}});var Ws={};ro(Ws,{__resetBrowserRegistryForTests:()=>lde,browserProviderActive:()=>sde,closeBrowserProvider:()=>xR,getBrowserProvider:()=>ide,peekBrowserProvider:()=>ade});function kB(){Promise.resolve(xR()).then(()=>{process.exit(130)})}function TB(){Promise.resolve(xR()).then(()=>{process.exit(143)})}function EB(){Or=null}function ode(){ny||(process.on("SIGINT",kB),process.on("SIGTERM",TB),process.on("exit",EB),ny=!0)}function xB(){ny&&(process.removeListener("SIGINT",kB),process.removeListener("SIGTERM",TB),process.removeListener("exit",EB),ny=!1)}async function ide(e){return Or!==null?Or:(Hs!==null||(Hs=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(vB(),wB)),n=tB(e),r=new t(n);return ode(),Or=r,Hs=null,r})()),Hs)}async function xR(){if(Or===null)return;let e=Or;Or=null,Hs=null,xB(),await e.shutdown()}function sde(){return Or!==null}function ade(){return Or}function lde(){Or=null,Hs=null,xB()}var Or,Hs,ny,Ks=y(()=>{"use strict";Jh();Or=null,Hs=null,ny=!1});async function RB(e,t){try{return await WN(e,t)}catch(n){return j("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function fde(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ks(),Ws));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function AB(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??fde,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Vh(n,e,{headers:mde,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(pde.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(dde.test(p)&&!ude.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await RB(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof nr||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=pR({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await fp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>fp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await fp(d.finalUrl,o);let p=await RB(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=pR({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 nr)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 ude,dde,pde,mde,CB=y(()=>{"use strict";KN();mR();yR();de();ude=/(text\/html|application\/xhtml\+xml)/i,dde=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,pde=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,mde={"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 yde(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(gde,{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),hde),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=Oe(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 _B(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?yde({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 IB(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
320
320
|
|
|
321
321
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
322
322
|
`).trimEnd()}var gde,hde,PB=y(()=>{"use strict";Mt();gde="https://api.exa.ai/search",hde=10});function ry(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 Gs=y(()=>{"use strict";Xh()});function Tde(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=bde;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,Sde)}let a=wde;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,vde)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function RR(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:lo(e,t),truncated:!0}}function Ede(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=Tde(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 hR(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 Vh(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof nr?{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=RR(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await AB(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=RR(GN(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 nr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=on(p)&&!bR(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${gp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=_B({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:kde,timeoutMs:s.timeoutMs,signal:a.signal}),f=RR(IB(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 bde,Sde,wde,vde,kde,MB,OB=y(()=>{"use strict";CB();PB();yR();ni();mR();Gs();bde=3e4,Sde=12e4,wde=1e5,vde=1e6,kde=10;MB=Ede()});import{existsSync as $B,mkdirSync as xde,readFileSync as Rde,renameSync as Ade,unlinkSync as Cde,writeFileSync as _de}from"node:fs";import{dirname as DB,join as Ide}from"node:path";import{randomBytes as Pde}from"node:crypto";function Sn(e){let t=e??mE();if(!$B(t))return[];try{let n=Rde(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 li(e,t){let n=t??mE();xde(DB(n),{recursive:!0});let r=Ide(DB(n),`.schedules.json.${process.pid}.${Pde(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{_de(r,o,"utf-8"),Ade(r,n)}catch(i){try{$B(r)&&Cde(r)}catch{}throw i}}function oy(e,t){let n=Sn(t),r=n.map(l=>l.id),o=Mde(e.name),i=Ode(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),li(n,t),a}function iy(e,t){let n=Sn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(li(o,t),!0)}function yp(e,t){return Sn(t).find(n=>n.id===e)}function Mde(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Ode(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function sy(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 ay=y(()=>{"use strict";H()});import{existsSync as Dde,readFileSync as $de}from"node:fs";import{join as Fde}from"node:path";async function Fn(e,t,n){let r;try{let o=Fde(gg("default"),"port");if(!Dde(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=$de(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var ci,AR=y(()=>{"use strict";H();ci="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 Lde}from"node:fs";import{readFile as Nde}from"node:fs/promises";var FB,LB,NB,BB,UB=y(()=>{"use strict";ay();H();AR();FB=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=oy({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 Fn("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 Fn("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:ci}})}},LB=async(e,t)=>{let n=Sn();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})))}},NB=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=br();if(!Lde(i))return{content:JSON.stringify([])};let s;try{let c=await Nde(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1870,7 +1870,7 @@ ${T}
|
|
|
1870
1870
|
${k}`})}return{fileBlocks:l,warnings:c}}function aQ(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function lQ(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}}Rv();async function cQ(e,t,n,r,o="summary",i,s){let a=M4(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),cu(process.stdout,Um(process.cwd(),!0));let l="",c=0,u=!1,d=!1,p=!1,f=!1,g=!1,h,b=!1,S=!1,w={abort:null},E=0,T=3e3,k=[],A=new Map,_=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,C=()=>{let $=r.subagentControl;$?.hasPromotableForeground()&&lQ($,x,r.onQueuedUserMessage).then(({jobs:V,flushedText:K,flushedPreview:M})=>{let N=(i??{fn:console.log}).fn;for(let L of V)N(m.dim(` \u2192 subagent backgrounded as ${L.jobId}: ${L.label}`));K!==void 0&&N(m.dim(` \u2192 queued message sent to this turn: ${aQ(M??K)}`))}).catch(()=>{})},x=r.getCompositor?r.getCompositor():null,I=()=>new Ou({out:Du(i),thinkingMode:o,..._?{activeSkillName:_}:{},onCancel:()=>{t.interrupt().catch($=>{Ge()&&console.error(" "+m.error("session.interrupt() failed:"),$)})},...r.subagentControl?{onBackground:C}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...x?{compositor:x}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),O=I(),P=async()=>{if(!f){f=!0;try{await O.dispose()}catch{}}},X=async()=>{await O.arm();let $=O.getCompositor();if(i&&$){let V=$;i.fn=K=>V.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.($),r.setInterruptNotifier?.(V=>O.setInterrupting(V)),r.rearmStatus?.()};try{x?x.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{b=!0,O.setSoftStopping(!0),t.interrupt().catch(D=>{Ge()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),D)});let L=r.subagentControl;L?.hasActiveForeground()&&L.cancelActiveForeground().catch(D=>{Ge()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),D)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{S=!0,t.interrupt().catch(L=>{Ge()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),L)})}),await X(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(C);let{fileBlocks:$,warnings:V}=sQ(e.text,{rootDir:process.cwd()});for(let L of V)(i??{fn:console.log}).fn(m.dim(` @-file: ${L}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let K=$.length>0||e.attachments.length>0?await iQ(e.text,e.attachments,void 0,$,t.sessionId):e.text,M=t.sendMessageStream(K);if(await Ql((L,D)=>{O.process(L,D)},async()=>{for await(let L of M){if(b||S)break;if(L.type==="chunk"&&L.chunk.type==="content"?(l=u?rQ(l,L.chunk.content):l+L.chunk.content,u=!1,d=!0):L.type==="message"&&!d&&(l=L.message.content),L.type==="stream_retry"&&(l=l.slice(0,c),u=l.length>0),L.type==="chunk"&&L.chunk.type==="tool_use_detail"){let D=L.chunk,W={toolName:D.toolName,toolUseId:D.toolUseId,input:D.toolInput,...D.toolInputRaw!==void 0&&{inputRaw:D.toolInputRaw}};A.set(D.toolUseId,W),k.push(W)}else if(L.type==="chunk"&&L.chunk.type==="tool_result"){let D=L.chunk;c=l.length,u=!0;let W=A.get(D.toolUseId);if(W&&(W.result=D.content,W.isError=D.isError,A.delete(D.toolUseId)),r.onContextProgress){let ne=Date.now();if(ne-E>=T){E=ne;try{let ee=r.onContextProgress();ee instanceof Promise&&await ee}catch(ee){Ge()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),ee)}}}}if(L.type==="paused"){if(r.setPausedState?.(!0),await P(),x&&L.autoResume===!0){let D=new AbortController;w.abort=D;let W=L.resetsAt?L.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,ne=W?`Keep waiting \u2014 auto-resumes at ${W}`:"Keep waiting \u2014 auto-resume in progress",ee="Switch model / provider (type /model after)",J="Stop waiting",ae=[m.warning(" \u23F3 Usage limit reached.")+(W?m.dim(` Auto-resumes at ${W}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];qn(x,{header:ae,options:[ne,ee,J],signal:D.signal,initialIndex:0}).then(q=>{if(w.abort=null,!q)return;let Pe=q[0];Pe===void 0||Pe===ne||(S=!0,Pe===ee&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Re=>{Ge()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Re)}))}).catch(q=>{Ge()&&console.error(" "+m.error("picker promise rejected:"),q)})}else(i??{fn:console.log}).fn(QD({reason:L.reason,...L.resetsAt!==void 0?{resetsAt:L.resetsAt}:{},...L.accountId!==void 0?{accountId:L.accountId}:{},...L.autoResume!==void 0?{autoResume:L.autoResume}:{}}));continue}if(L.type==="resumed"){r.setPausedState?.(!1),w.abort?.abort(),w.abort=null;let D=L.hotSwapped&&L.accountId?`\u25B6 Resumed on ${L.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,d=!1,k.length=0,A.clear(),g=!1,h=void 0,p=!1,O=I(),f=!1,await X(),(i??{fn:console.log}).fn(m.success(D));continue}if(L.type==="error"){await P(),gl(ll(L.error)),p=!0;continue}O.process(L),L.type==="done"&&(g=!0,h=L.metadata)}}),await P(),b){let L=i?i.fn:console.log,D=x?x.getPendingCount():0,W=D>0?` \xB7 ${D} queued`:"";L(m.warning(`\u23F8 Stopped${W} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),L("")}if(S){let L=i?i.fn:console.log;L(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),L("")}if(g&&!b&&!S){ha(n,a,l,h,k),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),lu(process.stdout),GY(process.stdout,"afk: turn complete");let L=W=>{i?i.fn(W):console.log(W)},D=cT(l);if(D){L(oQ(D)),L("");let W=F6(k);if(r.onTerminalState)try{r.onTerminalState(D,{doneHasCorroboratingEvidence:W})}catch{}if(n.permissionMode==="autonomous"){let ne=D.kind==="done"&&pp().verifyDone===!0&&!W;N6(D,void 0,{unverified:ne})}}if(W0e(h,n,L),r.onAfterTurn){let W=r.onAfterTurn();W instanceof Promise&&await W.catch(()=>{})}}}catch($){await P(),p||gl(ll($))}finally{await P(),cu(process.stdout,Um(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),w.abort?.abort(),w.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function H0e(e,t){let n=Math.round(e*100),r=ge(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ge(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function W0e(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(_e(e.durationMs)),e.totalCostUsd!==void 0&&r.push(Et(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ge(o+i)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let s=oM(t),a=at(t.model),l=H0e(s,a);if(l.text!==null){let u=l.tier==="over"||l.tier==="near"?m.error:l.tier==="caution"?m.warning:m.dim;n(u(l.text))}let c=nQ(tk(Yy()),new Date,{autoResume:DN()});if(c.text!==null){let u=c.tier==="over"||c.tier==="near"?m.error:c.tier==="caution"?m.warning:m.dim;n(u(c.text))}n("")}ji();var K0e=5e3,G0e=3,q0e="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function z0e(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 uQ(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,verdictLedger:d,shellPassthrough:p,bgResultNotifier:f}=s,g=null,h=[];e.session.current.waitForInitialization().then(async C=>{Ge()&&(g=wk(C)),await gf(e.session.current),Ge()&&(h=ZP())}).catch(()=>{});let b=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,w=!1,E=!1,T,k,A,_=0;for(f.onInjectable=()=>{_>=G0e||!o.isAwaitingInput()||!o.bufferIsEmpty()||(_++,lu(process.stdout),b={text:q0e,attachments:[]},o.abortPendingRead())};;){if(g&&(e.replRenderer.writeLine(g),e.replRenderer.writeLine(""),g=null),h.length>0){for(let M of h)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),h=[]}let C=p.drainNotifications();for(let{job:M,result:N}of C){let L=N.errorReason===void 0?"\u2713":"\u2717",D=N.errorReason==="abort"?"killed":N.errorReason==="timeout"?"timed out":N.errorReason==="signal-killed"?"killed by signal":`exit ${N.exitCode??0}`,W=Math.max(0,Math.round(N.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${L} [${M.id}] ${D} \xB7 ${W}s \xB7 `)+M.command)}let x=f.drainNotifications();for(let{job:M}of x){let N=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",L=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,D=se(M.label,60);e.replRenderer.writeLine(m.dim(` ${N} [${M.jobId}] subagent ${M.status} \xB7 ${L}s \xB7 `)+D)}let I=l.renderIfChanged(e.stats.sessionId);if(I.length>0){for(let M of I)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let O,P;if(b===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,b={text:M.message,attachments:[]})}if(b!==void 0){let M=b;b=void 0;let N=Hu(e.stats.permissionMode),L=va({buffer:M.text,promptText:N,isTTY:!!process.stdout.isTTY,attachmentSummary:vu([...M.attachments])});e.replRenderer.writeLine(L),O=M.text.trim(),P=M.attachments}else{let M=S;S=void 0;let N=await o.readLine({promptFn:()=>Hu(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{oT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});O=N.text.trim(),P=N.attachments}if(!O&&P.length===0)continue;if(O.startsWith("!")){let M=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(w||(w=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await p.dispatch(O))){e.statusLine.rearm();continue}}let X=!1;if(O.startsWith("/")){let M=await VY(O,e.slashCtx,P);if(M.handled){if(M.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),d.reset(),T=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){b={text:M.result.message,attachments:P??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){S=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}X=!0}a.push(O),await z0e(e,O);let $=O;if(X){let M=$I(O);if(M){let N=M.name.replace(/^\//,"").split(":").pop()??"";if(N&&VP(N)){let L={skillName:N,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},D=e.session.current.sessionId,W=Ma(D),ne=Date.now();j(`[afk trace] preflight.start commandName=${N}`);let ee=!1,J=await Pa(L,{cwd:e.stats.cwd??process.cwd(),artifactDir:W},ae=>{Ge()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${N}) failed: `)+(ae instanceof Error?ae.message:String(ae)))});ee=J!==null,j(`[afk trace] preflight.end commandName=${N} durationMs=${Date.now()-ne} success=${ee}`),$=XP(J?.manifestBlock,O)}}}let V=p.drainInjections();V.length>0&&($=V+$);let K=f.drainInjections();if(K.length>0&&($=K+$),T!==void 0&&($=T+`
|
|
1871
1871
|
|
|
1872
1872
|
`+$,T=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:$,sessionId:e.stats.sessionId},N=await e.hookRegistry.dispatch(M);N.injectContext&&($=N.injectContext+$)}catch(M){if(M instanceof Ae){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${Oe(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Ar){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(k=void 0,A=void 0,await cQ({text:$,attachments:P},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,N){if(await t.appendTurn(M,N),e.stats.sessionId)try{Ui(e.stats)}catch(L){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(L instanceof Error?L.message:String(L))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,N)=>{d?.push(M),k=M.kind,A=N?.doneHasCorroboratingEvidence},setActiveCompositor:M=>{n.activeCompositor=M},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(fr(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:(M,N)=>{c.repaint(M),u?.onStage(M,N)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Hu(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...k!==void 0?{terminalState:k}:{},...A!==void 0?{doneHasCorroboratingEvidence:A}:{}},void 0,K0e);M.injectContext&&M.injectContext.trim().length>0&&(T=M.injectContext)}catch(M){if(M instanceof At)throw M;M instanceof Ar?(j("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof Ae?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${Oe(M.reason??"no reason given")}`)):j("[stop hook] unexpected error: "+String(M))}}}function V0e(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 dQ(e,t,n,r){let o=await P9(),i=new rT({rl:e.rl,history:o,statusLine:e.statusLine}),s=V0e(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await N9(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=eQ(e,n),await uQ(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}op();Hl();import{execFile as Y0e}from"node:child_process";import{dirname as J0e,isAbsolute as X0e,resolve as Q0e}from"node:path";import{promisify as Z0e}from"node:util";var pQ=Z0e(Y0e),eOe=3e3,tOe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function nOe(){let t=(await pQ("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=X0e(t)?t:Q0e(process.cwd(),t);return J0e(n)}async function mQ(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await nOe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),eOe)});try{let o=Nn({execFile:pQ,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=>tOe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Hg();op();import{promises as rOe}from"node:fs";import{dirname as oOe,join as hQ}from"node:path";import{randomBytes as iOe}from"node:crypto";var sOe=["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(`
|
|
1873
|
-
`),fQ=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,A0=30,aOe=1024,lOe=8e3,cOe="haiku";async function uOe(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=fOe(n,aOe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??lOe),s=t.signal?gOe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await wl({token:t.token,model:t.model??cOe,system:sOe,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=dOe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=oOe(t.worktreePath);return await pOe(l,c)}function dOe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(fQ.test(t)&&t.length<=A0)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>A0)break;o=s}return fQ.test(o)?o:null}async function pOe(e,t){if(!await mOe(hQ(t,e)))return e;let n=iOe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,A0-5)}-${n}`}async function mOe(e){try{return await rOe.access(e),!0}catch{return!1}}function fOe(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 gOe(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 yQ(e){let t,n,r=hQ(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await uOe(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=`${Uh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return gQ(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 gQ(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 gQ(e,t){e&&e.setCwd(t),hOe(t)}function hOe(e){try{process.chdir(e)}catch{}}pt();Ot();sl();Jr();H();import{spawn as SQ}from"child_process";import{existsSync as wQ,mkdirSync as vOe,readFileSync as vQ,unlinkSync as bQ,writeFileSync as kQ}from"fs";import{get as kOe}from"https";import{join as TQ}from"path";import{readFileSync as yOe}from"fs";import{dirname as bOe,join as SOe}from"path";import{fileURLToPath as wOe}from"url";function Zr(){try{return"5.123.
|
|
1873
|
+
`),fQ=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,A0=30,aOe=1024,lOe=8e3,cOe="haiku";async function uOe(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=fOe(n,aOe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??lOe),s=t.signal?gOe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await wl({token:t.token,model:t.model??cOe,system:sOe,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=dOe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=oOe(t.worktreePath);return await pOe(l,c)}function dOe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(fQ.test(t)&&t.length<=A0)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>A0)break;o=s}return fQ.test(o)?o:null}async function pOe(e,t){if(!await mOe(hQ(t,e)))return e;let n=iOe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,A0-5)}-${n}`}async function mOe(e){try{return await rOe.access(e),!0}catch{return!1}}function fOe(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 gOe(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 yQ(e){let t,n,r=hQ(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await uOe(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=`${Uh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return gQ(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 gQ(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 gQ(e,t){e&&e.setCwd(t),hOe(t)}function hOe(e){try{process.chdir(e)}catch{}}pt();Ot();sl();Jr();H();import{spawn as SQ}from"child_process";import{existsSync as wQ,mkdirSync as vOe,readFileSync as vQ,unlinkSync as bQ,writeFileSync as kQ}from"fs";import{get as kOe}from"https";import{join as TQ}from"path";import{readFileSync as yOe}from"fs";import{dirname as bOe,join as SOe}from"path";import{fileURLToPath as wOe}from"url";function Zr(){try{return"5.123.4"}catch{}try{let e=bOe(wOe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(yOe(SOe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}U();B();var TOe=64*1024,EOe=10800*1e3,xOe=800,ROe=3600*1e3,AOe="update-check.json",COe="pending-update.json";function C0(){return TQ(rl(),AOe)}function Pf(){return TQ(rl(),COe)}function _0(){let e=rl();wQ(e)||vOe(e,{recursive:!0})}function EQ(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 xQ(){try{let e=vQ(C0(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function RQ(){try{_0();let e=`
|
|
1874
1874
|
const https = require('https');
|
|
1875
1875
|
const fs = require('fs');
|
|
1876
1876
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|