agent-afk 5.124.0 → 5.124.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +2 -2
- package/dist/index.mjs +223 -223
- package/dist/telegram/streaming.handlers.d.ts +44 -0
- package/dist/telegram/streaming.progress.d.ts +23 -0
- package/dist/telegram/streaming.sender.d.ts +10 -0
- package/dist/telegram/streaming.watchdog.d.ts +17 -0
- package/dist/telegram.mjs +283 -283
- 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 Cue,kx=y(()=>{"use strict";Cue=new Set(["script","style","noscript","template","svg"])});function Pue(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 iB(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function Mue(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 sB(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Pue,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(!Iue.has(d.status)||u===o)return d;let p=Mue(d,s)??iB(u,i,s);N("[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=iB(u,i,s);N("[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 Iue,aB=y(()=>{"use strict";ue();Iue=new Set([429,502,503,504])});import{BlockList as Oue,isIP as Ex}from"node:net";import{lookup as Due}from"node:dns/promises";import{Agent as $ue}from"undici";function cB(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Bue(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Tx(e){let t=Ex(e);return t===0?!1:Nue.check(e,t===4?"ipv4":"ipv6")}async function uB(e){return Due(e,{all:!0,verbatim:!0})}async function Rx(e,t={}){if(t.allowPrivateHosts??cB())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=Bue(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(Ex(r)!==0)return Tx(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??uB,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(Tx(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function bp(e,t={}){let n=await Rx(e,t);if(!n.allowed)throw new rr(n.reason)}async function Zh(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<=lB;s++){await bp(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??cB())?{dispatcher:Uue}:{}},l=await sB(e,i,a,r.retry??{});if(!jue.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 rr(`too many redirects (>${lB}) starting from ${t}`)}var Fue,Lue,Nue,rr,Uue,lB,jue,xx=y(()=>{"use strict";L();aB();Fue=[["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]],Lue=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Nue=(()=>{let e=new Oue;for(let[t,n]of Fue)e.addSubnet(t,n,"ipv4");for(let[t,n]of Lue)e.addSubnet(t,n,"ipv6");return e})(),rr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Uue=new $ue({connect:{lookup(e,t,n){uB(e).then(r=>{let o=r.find(s=>Tx(s.address));if(o!==void 0){n(new rr(`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,Ex(i.address))},r=>n(r,"",0))}}});lB=20,jue=new Set([301,302,303,307,308])});import{readFileSync as Hue}from"node:fs";import{join as Wue}from"path";function Kue(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function dB(e,t){return Kue(t).test(e)}function zue(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(Gue.has(t))return!0;if(que.has(t))return!1}return!1}function pB(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Vue(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 mB(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Sd(t),t}function Yue(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Jue(e){try{return Hue(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Xue(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=mB(t.defaultProfile)),n}function fB(e){let t=e?.env??k,n=e?.readFileSync??Jue,r=e?.surface??t.AGENT_SURFACE,o=zue(t.AFK_BROWSER_HEADLESS,r),i=pB(t.AFK_BROWSER_ALLOWED_DOMAINS),s=pB(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Yue(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Vue(t.AFK_BROWSER_BACKEND),c=mB(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():Wue(Jn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Xue(u,g);return h.configPath=p,h}function ey(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(dB(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>dB(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Gue,que,ty=y(()=>{"use strict";L();U();Gue=new Set(["daemon","subagent","telegram","afk"]),que=new Set(["repl","interactive","cli"])});import{existsSync as Que,readFileSync as Zue}from"node:fs";import{createRequire as ede}from"node:module";import{dirname as tde,join as nde}from"node:path";function yB(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<ode&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function nn(e){let t=yB(e);return hB.some(n=>t.includes(n))}function ide(){try{let t=ede(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(Zue(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=nde(tde(t),o);return Que(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Sp(){return gB??=ide()??rde,gB}function Ax(e){return e.includes("install chromium")}function Dn(e,t){let n=yB(e),r=t?.latched===!0?` ${sde}`:"";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: ${Sp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Sp()}). Or pick a different tool.${r}`}function wp(e,t,n=!1){if(!nn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
318
318
|
|
|
319
|
-
${Dn(e,{headless:t,latched:n})}`,{cause:e})}var hB,rde,ode,gB,sde,ny=y(()=>{"use strict";hB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],rde="pnpm exec playwright install chromium",ode=4;sde="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 Us from"node:fs";import ry from"node:path";import{randomBytes as ade}from"node:crypto";import{chromium as lde}from"playwright";function cde(){try{return"5.124.0"}catch{}try{let e=ry.resolve(import.meta.dirname,"../../../package.json"),t=Us.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ude,oy,bB=y(()=>{"use strict";ny();U();ue();ude=cde(),oy=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=lde.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=wp(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${ude}`}}loadStorageState(t){let n=wd(t);try{if(!Us.existsSync(n))return;let r=JSON.parse(Us.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=wd(t);if(!Us.existsSync(r))return;let o=await n.storageState(),i=ry.join(ry.dirname(r),`.${ry.basename(r)}.${process.pid}.${ade(4).toString("hex")}.tmp`);Us.writeFileSync(i,JSON.stringify(o),{mode:384}),Us.chmodSync(i,384),Us.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as dde}from"crypto";function SB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&pde.test(e.label))}function wB(e){return dde("sha256").update(e,"utf8").digest("hex").slice(0,8)}function vB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var pde,iy=y(()=>{"use strict";pde=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as mde}from"node:crypto";function fde(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function gde(e,t,n){return`el_${mde("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function hde(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function kB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function EB(e,t){let n=e.role??"",r=e.name??"";TB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])EB(i,t)}async function yde(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},RB).catch(()=>[])}async function bde(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},RB).catch(()=>[])}function Sde(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function sy(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Sde(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=yde(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=[],EB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await bde(e)).filter(M=>TB.has(M.role??"")));let w=new Map;for(let O of p){let M=kB(O.name),Y=w.get(M);(!Y||Y.bbox.w===0&&O.bbox.w>0)&&w.set(M,O)}let T=b.map(O=>({ax:O,dom:w.get(kB(O.name??""))})),E=r?T:T.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);E.sort((O,M)=>{let Y=O.dom?.bbox.y??0,F=M.dom?.bbox.y??0;if(Y!==F)return Y-F;let G=O.dom?.bbox.x??0,j=M.dom?.bbox.x??0;return G-j}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((O,M)=>{let Y=O.ax.role??"generic",F=O.ax.name??"",G=gde(Y,F,M),j=O.dom?.bbox??{x:0,y:0,w:0,h:0},K=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),SB({role:Y,kind:K})&&(P="[redacted]");let $={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&($.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&($.selected=O.ax.selected),O.ax.expanded!==void 0&&($.expanded=O.ax.expanded);let W;O.dom?.testId?W=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(W=`#${O.dom.id}`);let H={id:G,role:Y,label:fde(F),kind:K,value:P,state:$,bbox:j};return W!==void 0&&(H.selector=W),H}),_="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=hde(f),R=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:R,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 TB,RB,xB=y(()=>{"use strict";iy();TB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);RB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function AB(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 Cx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>AB(e,i)))).filter(o=>o!==null)}async function wde(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 _x(e,t,n){switch(t.kind){case"element_id":return vde(e,t,n);case"selector":return kde(e,t);case"semantic":return Tde(e,t)}}async function vde(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 Cx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function kde(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 Cx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Tde(e,t){return t.role!==void 0?Ede(e,t.text,t.role):Rde(e,t.text,t)}async function Ede(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 Cx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Rde(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 wde(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 AB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,T=0;for(let E=0;E<w.length;E++)T=T*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${T.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var CB=y(()=>{"use strict"});async function Ix(e,t,n,r){let o=e.url();if(o===n)return null;let i=ey(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 _B=y(()=>{"use strict";ty()});import{randomBytes as xde}from"crypto";import{mkdir as Ade,stat as Cde,writeFile as _de}from"fs/promises";import{join as Px}from"path";import{gzip as Ide}from"zlib";import{promisify as Pde}from"util";function Mde(e){return Px(pn(e),"browser")}function Ode(e){return Px(Mde(e),"screenshots")}function Dde(){return new Date().toISOString().replace(/[:.]/g,"-")}function $de(){return xde(3).toString("hex")}async function Mx(e,t,n){if(t.length>IB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${IB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Ode(e);await Ade(r,{recursive:!0});let o=`${Dde()}-${$de()}-${n}.png`,i=Px(r,o);await _de(i,t);let{size:s}=await Cde(i);return{path:i,bytes:s}}var bJe,IB,PB=y(()=>{"use strict";U();iy();bJe=Pde(Ide);IB=5*1024*1024});var OB={};no(OB,{PlaywrightProvider:()=>Ox});function MB(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 Ox,DB=y(()=>{"use strict";bB();xB();CB();ty();_B();PB();Ox=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new oy(t)}async open(t){let n=ey(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 Ix(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 sy(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 sy(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 _x(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${MB(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 Ix(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 sy(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 _x(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${MB(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 Mx(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 Mx(n,o,r);return i}catch{return null}}}});var Hs={};no(Hs,{__resetBrowserRegistryForTests:()=>Ude,browserProviderActive:()=>Nde,closeBrowserProvider:()=>Dx,getBrowserProvider:()=>Lde,peekBrowserProvider:()=>Bde});function $B(){Promise.resolve(Dx()).then(()=>{process.exit(130)})}function FB(){Promise.resolve(Dx()).then(()=>{process.exit(143)})}function LB(){Or=null}function Fde(){ay||(process.on("SIGINT",$B),process.on("SIGTERM",FB),process.on("exit",LB),ay=!0)}function NB(){ay&&(process.removeListener("SIGINT",$B),process.removeListener("SIGTERM",FB),process.removeListener("exit",LB),ay=!1)}async function Lde(e){return Or!==null?Or:(js!==null||(js=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(DB(),OB)),n=fB(e),r=new t(n);return Fde(),Or=r,js=null,r})()),js)}async function Dx(){if(Or===null)return;let e=Or;Or=null,js=null,NB(),await e.shutdown()}function Nde(){return Or!==null}function Bde(){return Or}function Ude(){Or=null,js=null,NB()}var Or,js,ay,Ws=y(()=>{"use strict";ty();Or=null,js=null,ay=!1});async function BB(e,t){try{return await nB(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function qde(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ws(),Hs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function UB(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??qde,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Zh(n,e,{headers:Gde,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Kde.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(Wde.test(p)&&!Hde.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await BB(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof rr||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=vx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await bp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>bp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await bp(d.finalUrl,o);let p=await BB(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=vx({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 rr)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 Hde,Wde,Kde,Gde,jB=y(()=>{"use strict";rB();kx();xx();ue();Hde=/(text\/html|application\/xhtml\+xml)/i,Wde=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Kde=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Gde={"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(zde,{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),Vde),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=_e(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 HB(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 WB(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
319
|
+
${Dn(e,{headless:t,latched:n})}`,{cause:e})}var hB,rde,ode,gB,sde,ny=y(()=>{"use strict";hB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],rde="pnpm exec playwright install chromium",ode=4;sde="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 Us from"node:fs";import ry from"node:path";import{randomBytes as ade}from"node:crypto";import{chromium as lde}from"playwright";function cde(){try{return"5.124.1"}catch{}try{let e=ry.resolve(import.meta.dirname,"../../../package.json"),t=Us.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ude,oy,bB=y(()=>{"use strict";ny();U();ue();ude=cde(),oy=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=lde.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=wp(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${ude}`}}loadStorageState(t){let n=wd(t);try{if(!Us.existsSync(n))return;let r=JSON.parse(Us.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=wd(t);if(!Us.existsSync(r))return;let o=await n.storageState(),i=ry.join(ry.dirname(r),`.${ry.basename(r)}.${process.pid}.${ade(4).toString("hex")}.tmp`);Us.writeFileSync(i,JSON.stringify(o),{mode:384}),Us.chmodSync(i,384),Us.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as dde}from"crypto";function SB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&pde.test(e.label))}function wB(e){return dde("sha256").update(e,"utf8").digest("hex").slice(0,8)}function vB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var pde,iy=y(()=>{"use strict";pde=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as mde}from"node:crypto";function fde(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function gde(e,t,n){return`el_${mde("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function hde(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function kB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function EB(e,t){let n=e.role??"",r=e.name??"";TB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])EB(i,t)}async function yde(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},RB).catch(()=>[])}async function bde(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},RB).catch(()=>[])}function Sde(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function sy(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Sde(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=yde(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=[],EB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await bde(e)).filter(M=>TB.has(M.role??"")));let w=new Map;for(let O of p){let M=kB(O.name),Y=w.get(M);(!Y||Y.bbox.w===0&&O.bbox.w>0)&&w.set(M,O)}let T=b.map(O=>({ax:O,dom:w.get(kB(O.name??""))})),E=r?T:T.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);E.sort((O,M)=>{let Y=O.dom?.bbox.y??0,F=M.dom?.bbox.y??0;if(Y!==F)return Y-F;let G=O.dom?.bbox.x??0,j=M.dom?.bbox.x??0;return G-j}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((O,M)=>{let Y=O.ax.role??"generic",F=O.ax.name??"",G=gde(Y,F,M),j=O.dom?.bbox??{x:0,y:0,w:0,h:0},K=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),SB({role:Y,kind:K})&&(P="[redacted]");let $={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&($.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&($.selected=O.ax.selected),O.ax.expanded!==void 0&&($.expanded=O.ax.expanded);let W;O.dom?.testId?W=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(W=`#${O.dom.id}`);let H={id:G,role:Y,label:fde(F),kind:K,value:P,state:$,bbox:j};return W!==void 0&&(H.selector=W),H}),_="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=hde(f),R=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:R,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 TB,RB,xB=y(()=>{"use strict";iy();TB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);RB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function AB(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 Cx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>AB(e,i)))).filter(o=>o!==null)}async function wde(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 _x(e,t,n){switch(t.kind){case"element_id":return vde(e,t,n);case"selector":return kde(e,t);case"semantic":return Tde(e,t)}}async function vde(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 Cx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function kde(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 Cx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Tde(e,t){return t.role!==void 0?Ede(e,t.text,t.role):Rde(e,t.text,t)}async function Ede(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 Cx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Rde(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 wde(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 AB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,T=0;for(let E=0;E<w.length;E++)T=T*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${T.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var CB=y(()=>{"use strict"});async function Ix(e,t,n,r){let o=e.url();if(o===n)return null;let i=ey(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 _B=y(()=>{"use strict";ty()});import{randomBytes as xde}from"crypto";import{mkdir as Ade,stat as Cde,writeFile as _de}from"fs/promises";import{join as Px}from"path";import{gzip as Ide}from"zlib";import{promisify as Pde}from"util";function Mde(e){return Px(pn(e),"browser")}function Ode(e){return Px(Mde(e),"screenshots")}function Dde(){return new Date().toISOString().replace(/[:.]/g,"-")}function $de(){return xde(3).toString("hex")}async function Mx(e,t,n){if(t.length>IB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${IB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Ode(e);await Ade(r,{recursive:!0});let o=`${Dde()}-${$de()}-${n}.png`,i=Px(r,o);await _de(i,t);let{size:s}=await Cde(i);return{path:i,bytes:s}}var bJe,IB,PB=y(()=>{"use strict";U();iy();bJe=Pde(Ide);IB=5*1024*1024});var OB={};no(OB,{PlaywrightProvider:()=>Ox});function MB(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 Ox,DB=y(()=>{"use strict";bB();xB();CB();ty();_B();PB();Ox=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new oy(t)}async open(t){let n=ey(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 Ix(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 sy(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 sy(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 _x(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${MB(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 Ix(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 sy(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 _x(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${MB(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 Mx(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 Mx(n,o,r);return i}catch{return null}}}});var Hs={};no(Hs,{__resetBrowserRegistryForTests:()=>Ude,browserProviderActive:()=>Nde,closeBrowserProvider:()=>Dx,getBrowserProvider:()=>Lde,peekBrowserProvider:()=>Bde});function $B(){Promise.resolve(Dx()).then(()=>{process.exit(130)})}function FB(){Promise.resolve(Dx()).then(()=>{process.exit(143)})}function LB(){Or=null}function Fde(){ay||(process.on("SIGINT",$B),process.on("SIGTERM",FB),process.on("exit",LB),ay=!0)}function NB(){ay&&(process.removeListener("SIGINT",$B),process.removeListener("SIGTERM",FB),process.removeListener("exit",LB),ay=!1)}async function Lde(e){return Or!==null?Or:(js!==null||(js=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(DB(),OB)),n=fB(e),r=new t(n);return Fde(),Or=r,js=null,r})()),js)}async function Dx(){if(Or===null)return;let e=Or;Or=null,js=null,NB(),await e.shutdown()}function Nde(){return Or!==null}function Bde(){return Or}function Ude(){Or=null,js=null,NB()}var Or,js,ay,Ws=y(()=>{"use strict";ty();Or=null,js=null,ay=!1});async function BB(e,t){try{return await nB(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function qde(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ws(),Hs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function UB(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??qde,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Zh(n,e,{headers:Gde,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Kde.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(Wde.test(p)&&!Hde.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await BB(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof rr||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=vx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await bp(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>bp(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await bp(d.finalUrl,o);let p=await BB(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=vx({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 rr)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 Hde,Wde,Kde,Gde,jB=y(()=>{"use strict";rB();kx();xx();ue();Hde=/(text\/html|application\/xhtml\+xml)/i,Wde=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Kde=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Gde={"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(zde,{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),Vde),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=_e(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 HB(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 WB(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 zde,Vde,KB=y(()=>{"use strict";It();zde="https://api.exa.ai/search",Vde=10});function ly(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 Ks=y(()=>{"use strict";ny()});function tpe(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=Jde;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,Xde)}let a=Qde;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,Zde)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function $x(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:ao(e,t),truncated:!0}}function npe(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=tpe(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 Rx(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 Zh(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof rr?{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=$x(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await UB(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=$x(oB(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 rr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=nn(p)&&!Ax(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Sp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=HB({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:epe,timeoutMs:s.timeoutMs,signal:a.signal}),f=$x(WB(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 Jde,Xde,Qde,Zde,epe,GB,qB=y(()=>{"use strict";jB();KB();xx();ri();kx();Ks();Jde=3e4,Xde=12e4,Qde=1e5,Zde=1e6,epe=10;GB=npe()});import{existsSync as VB,mkdirSync as rpe,readFileSync as ope,renameSync as ipe,unlinkSync as spe,writeFileSync as ape}from"node:fs";import{dirname as zB,join as lpe}from"node:path";import{randomBytes as cpe}from"node:crypto";function bn(e){let t=e??kE();if(!VB(t))return[];try{let n=ope(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 ci(e,t){let n=t??kE();rpe(zB(n),{recursive:!0});let r=lpe(zB(n),`.schedules.json.${process.pid}.${cpe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{ape(r,o,"utf-8"),ipe(r,n)}catch(i){try{VB(r)&&spe(r)}catch{}throw i}}function cy(e,t){let n=bn(t),r=n.map(l=>l.id),o=upe(e.name),i=dpe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),ci(n,t),a}function uy(e,t){let n=bn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(ci(o,t),!0)}function vp(e,t){return bn(t).find(n=>n.id===e)}function upe(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function dpe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function dy(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 py=y(()=>{"use strict";U()});import{existsSync as ppe,readFileSync as mpe}from"node:fs";import{join as fpe}from"node:path";async function $n(e,t,n){let r;try{let o=fpe(wg("default"),"port");if(!ppe(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=mpe(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 ui,Fx=y(()=>{"use strict";U();ui="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 gpe}from"node:fs";import{readFile as hpe}from"node:fs/promises";var YB,JB,XB,QB,ZB=y(()=>{"use strict";py();U();Fx();YB=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=cy({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 $n("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 $n("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:ui}})}},JB=async(e,t)=>{let n=bn();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})))}},XB=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(!gpe(i))return{content:JSON.stringify([])};let s;try{let c=await hpe(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 @@ ${E}
|
|
|
1870
1870
|
${v}`})}return{fileBlocks:l,warnings:c}}function LQ(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function NQ(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}}Ov();async function BQ(e,t,n,r,o="summary",i,s){let a=Y4(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),du(process.stdout,Km(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},T=0,E=3e3,v=[],A=new Map,_=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,C=()=>{let F=r.subagentControl;F?.hasPromotableForeground()&&NQ(F,R,r.onQueuedUserMessage).then(({jobs:G,flushedText:j,flushedPreview:K})=>{let P=(i??{fn:console.log}).fn;for(let $ of G)P(m.dim(` \u2192 subagent backgrounded as ${$.jobId}: ${$.label}`));j!==void 0&&P(m.dim(` \u2192 queued message sent to this turn: ${LQ(K??j)}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,I=()=>new Du({out:$u(i),thinkingMode:o,..._?{activeSkillName:_}:{},onCancel:()=>{t.interrupt().catch(F=>{He()&&console.error(" "+m.error("session.interrupt() failed:"),F)})},...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}:{},...R?{compositor:R}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),O=I(),M=async()=>{if(!f){f=!0;try{await O.dispose()}catch{}}},Y=async()=>{await O.arm();let F=O.getCompositor();if(i&&F){let G=F;i.fn=j=>G.commitAbove(j),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(F),r.setInterruptNotifier?.(G=>O.setInterrupting(G)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{b=!0,O.setSoftStopping(!0),t.interrupt().catch(W=>{He()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),W)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(W=>{He()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),W)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{S=!0,t.interrupt().catch($=>{He()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),$)})}),await Y(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(C);let{fileBlocks:F,warnings:G}=FQ(e.text,{rootDir:process.cwd()});for(let $ of G)(i??{fn:console.log}).fn(m.dim(` @-file: ${$}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let j=F.length>0||e.attachments.length>0?await $Q(e.text,e.attachments,void 0,F,t.sessionId):e.text,K=t.sendMessageStream(j);if(await ec(($,W)=>{O.process($,W)},async()=>{for await(let $ of K){if(b||S)break;if($.type==="chunk"&&$.chunk.type==="content"?(l=u?OQ(l,$.chunk.content):l+$.chunk.content,u=!1,d=!0):$.type==="message"&&!d&&(l=$.message.content),$.type==="stream_retry"&&(l=l.slice(0,c),u=l.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let W=$.chunk,H={toolName:W.toolName,toolUseId:W.toolUseId,input:W.toolInput,...W.toolInputRaw!==void 0&&{inputRaw:W.toolInputRaw}};A.set(W.toolUseId,H),v.push(H)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let W=$.chunk;c=l.length,u=!0;let H=A.get(W.toolUseId);if(H&&(H.result=W.content,H.isError=W.isError,A.delete(W.toolUseId)),r.onContextProgress){let oe=Date.now();if(oe-T>=E){T=oe;try{let re=r.onContextProgress();re instanceof Promise&&await re}catch(re){He()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),re)}}}}if($.type==="paused"){if(r.setPausedState?.(!0),await M(),R&&$.autoResume===!0){let W=new AbortController;w.abort=W;let H=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,oe=H?`Keep waiting \u2014 auto-resumes at ${H}`:"Keep waiting \u2014 auto-resume in progress",re="Switch model / provider (type /model after)",Z="Stop waiting",le=[m.warning(" \u23F3 Usage limit reached.")+(H?m.dim(` Auto-resumes at ${H}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];qn(R,{header:le,options:[oe,re,Z],signal:W.signal,initialIndex:0}).then(Ie=>{if(w.abort=null,!Ie)return;let An=Ie[0];An===void 0||An===oe||(S=!0,An===re&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Ne=>{He()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Ne)}))}).catch(Ie=>{He()&&console.error(" "+m.error("picker promise rejected:"),Ie)})}else(i??{fn:console.log}).fn(a$({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),w.abort?.abort(),w.abort=null;let W=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,d=!1,v.length=0,A.clear(),g=!1,h=void 0,p=!1,O=I(),f=!1,await Y(),(i??{fn:console.log}).fn(m.success(W));continue}if($.type==="error"){await M(),yl(ul($.error)),p=!0;continue}O.process($),$.type==="done"&&(g=!0,h=$.metadata)}}),await M(),b){let $=i?i.fn:console.log,W=R?R.getPendingCount():0,H=W>0?` \xB7 ${W} queued`:"";$(m.warning(`\u23F8 Stopped${H} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),$("")}if(S){let $=i?i.fn:console.log;$(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(g&&!b&&!S){ga(n,a,l,h,v),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),uu(process.stdout),lJ(process.stdout,"afk: turn complete");let $=H=>{i?i.fn(H):console.log(H)},W=bT(l);if(W){$(DQ(W)),$("");let H=r8(v);if(r.onTerminalState)try{r.onTerminalState(W,{doneHasCorroboratingEvidence:H})}catch{}if(n.permissionMode==="autonomous"){let oe=W.kind==="done"&&hp().verifyDone===!0&&!H;i8(W,void 0,{unverified:oe})}}if(vOe(h,n,$),r.onAfterTurn){let H=r.onAfterTurn();H instanceof Promise&&await H.catch(()=>{})}}}catch(F){await M(),p||yl(ul(F))}finally{await M(),du(process.stdout,Km(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 wOe(e,t){let n=Math.round(e*100),r=me(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${me(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 vOe(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(Re(e.durationMs)),e.totalCostUsd!==void 0&&r.push(Tt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(me(o+i)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let s=fM(t),a=it(t.model),l=wOe(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=MQ(ck(eb()),new Date,{autoResume:zN()});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("")}Hi();var kOe=5e3,TOe=3,EOe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function ROe(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 R=>{He()&&(g=Ck(R)),await Sf(e.session.current),He()&&(h=cM())}).catch(()=>{});let b=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,w=!1,T=!1,E,v,A,_=(()=>{let R=parseInt(e.options.maxTurns,10);return R>0?R:void 0})(),C=0;for(f.onInjectable=()=>{C>=TOe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(C++,uu(process.stdout),b={text:EOe,attachments:[]},o.abortPendingRead())};;){if(g&&(e.replRenderer.writeLine(g),e.replRenderer.writeLine(""),g=null),h.length>0){for(let P of h)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),h=[]}let R=p.drainNotifications();for(let{job:P,result:$}of R){let W=$.errorReason===void 0?"\u2713":"\u2717",H=$.errorReason==="abort"?"killed":$.errorReason==="timeout"?"timed out":$.errorReason==="signal-killed"?"killed by signal":`exit ${$.exitCode??0}`,oe=Math.max(0,Math.round($.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${W} [${P.id}] ${H} \xB7 ${oe}s \xB7 `)+P.command)}let I=f.drainNotifications();for(let{job:P}of I){let $=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",W=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,H=ie(P.label,60);e.replRenderer.writeLine(m.dim(` ${$} [${P.jobId}] subagent ${P.status} \xB7 ${W}s \xB7 `)+H)}let O=l.renderIfChanged(e.stats.sessionId);if(O.length>0){for(let P of O)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let M,Y;if(b===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,b={text:P.message,attachments:[]})}if(b!==void 0){let P=b;b=void 0;let $=Ku(e.stats.permissionMode),W=wa({buffer:P.text,promptText:$,isTTY:!!process.stdout.isTTY,attachmentSummary:ku([...P.attachments])});e.replRenderer.writeLine(W),M=P.text.trim(),Y=P.attachments}else{let P=S;S=void 0;let $=await o.readLine({promptFn:()=>Ku(e.stats.permissionMode),...P!==void 0?{initialBuffer:P}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{mT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});M=$.text.trim(),Y=$.attachments}if(!M&&Y.length===0)continue;if(M.startsWith("!")){let P=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(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(M))){e.statusLine.rearm();continue}}let F=!1;if(M.startsWith("/")){let P=await dJ(M,e.slashCtx,Y);if(P.handled){if(P.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((M==="/clear"||M.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),d.reset(),E=void 0),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){b={text:P.result.message,attachments:Y??[]},e.statusLine.rearm();continue}if(P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="prefill"){S=P.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}F=!0}a.push(M),await ROe(e,M);let G=M;if(F){let P=GI(M);if(P){let $=P.name.replace(/^\//,"").split(":").pop()??"";if($&&oM($)){let W={skillName:$,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},H=e.session.current.sessionId,oe=Oa(H),re=Date.now();N(`[afk trace] preflight.start commandName=${$}`);let Z=!1,le=await Ma(W,{cwd:e.stats.cwd??process.cwd(),artifactDir:oe},Ie=>{He()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${$}) failed: `)+(Ie instanceof Error?Ie.message:String(Ie)))});Z=le!==null,N(`[afk trace] preflight.end commandName=${$} durationMs=${Date.now()-re} success=${Z}`),G=aM(le?.manifestBlock,M)}}}let j=p.drainInjections();j.length>0&&(G=j+G);let K=f.drainInjections();if(K.length>0&&(G=K+G),E!==void 0&&(G=E+`
|
|
1871
1871
|
|
|
1872
1872
|
`+G,E=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:G,sessionId:e.stats.sessionId},$=await e.hookRegistry.dispatch(P);$.injectContext&&(G=$.injectContext+G)}catch(P){if(P instanceof Ee){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(P.reason?m.dim(`: ${_e(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Ar){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(v=void 0,A=void 0,await BQ({text:G,attachments:Y},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onQueuedUserMessage(P){await t.appendQueuedUser(P)},async onTurnComplete(P,$){if(await t.appendTurn(P,$),e.stats.sessionId)try{ji(e.stats)}catch(W){T||(T=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(W instanceof Error?W.message:String(W))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(Kn(e.stats,e.contextSampler,e.gitStatusSampler,_)),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,$)=>{d?.push(P),v=P.kind,A=$?.doneHasCorroboratingEvidence},setActiveCompositor:P=>{n.activeCompositor=P},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Kn(e.stats,e.contextSampler,e.gitStatusSampler,_))},...c?{onStageChange:(P,$)=>{c.repaint(P),u?.onStage(P,$)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ku(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...v!==void 0?{terminalState:v}:{},...A!==void 0?{doneHasCorroboratingEvidence:A}:{}},void 0,kOe);P.injectContext&&P.injectContext.trim().length>0&&(E=P.injectContext)}catch(P){if(P instanceof Rt)throw P;P instanceof Ar?(N("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):P instanceof Ee?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${_e(P.reason??"no reason given")}`)):N("[stop hook] unexpected error: "+String(P))}}}function xOe(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 jQ(e,t,n,r){let o=await Q9(),i=new pT({rl:e.rl,history:o,statusLine:e.statusLine}),s=xOe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await fQ(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=IQ(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)}}lp();Kl();import{execFile as AOe}from"node:child_process";import{dirname as COe,isAbsolute as _Oe,resolve as IOe}from"node:path";import{promisify as POe}from"node:util";var HQ=POe(AOe),MOe=3e3,OOe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function DOe(){let t=(await HQ("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=_Oe(t)?t:IOe(process.cwd(),t);return COe(n)}async function WQ(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await DOe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),MOe)});try{let o=Ln({execFile:HQ,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=>OOe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}zg();lp();import{promises as $Oe}from"node:fs";import{dirname as FOe,join as qQ}from"node:path";import{randomBytes as LOe}from"node:crypto";var NOe=["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
|
-
`),KQ=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,F0=30,BOe=1024,UOe=8e3,jOe="haiku";async function HOe(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=qOe(n,BOe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??UOe),s=t.signal?zOe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await kl({token:t.token,model:t.model??jOe,system:NOe,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=WOe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=FOe(t.worktreePath);return await KOe(l,c)}function WOe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(KQ.test(t)&&t.length<=F0)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>F0)break;o=s}return KQ.test(o)?o:null}async function KOe(e,t){if(!await GOe(qQ(t,e)))return e;let n=LOe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,F0-5)}-${n}`}async function GOe(e){try{return await $Oe.access(e),!0}catch{return!1}}function qOe(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 zOe(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 zQ(e){let t,n,r=qQ(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await HOe(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=`${Gh(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),VOe(t)}function VOe(e){try{process.chdir(e)}catch{}}ut();Pt();ll();Yr();U();import{spawn as YQ}from"child_process";import{existsSync as JQ,mkdirSync as ZOe,readFileSync as XQ,unlinkSync as VQ,writeFileSync as QQ}from"fs";import{get as eDe}from"https";import{join as ZQ}from"path";import{readFileSync as YOe}from"fs";import{dirname as JOe,join as XOe}from"path";import{fileURLToPath as QOe}from"url";function Qr(){try{return"5.124.
|
|
1873
|
+
`),KQ=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,F0=30,BOe=1024,UOe=8e3,jOe="haiku";async function HOe(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=qOe(n,BOe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??UOe),s=t.signal?zOe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await kl({token:t.token,model:t.model??jOe,system:NOe,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=WOe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=FOe(t.worktreePath);return await KOe(l,c)}function WOe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(KQ.test(t)&&t.length<=F0)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>F0)break;o=s}return KQ.test(o)?o:null}async function KOe(e,t){if(!await GOe(qQ(t,e)))return e;let n=LOe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,F0-5)}-${n}`}async function GOe(e){try{return await $Oe.access(e),!0}catch{return!1}}function qOe(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 zOe(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 zQ(e){let t,n,r=qQ(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await HOe(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=`${Gh(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),VOe(t)}function VOe(e){try{process.chdir(e)}catch{}}ut();Pt();ll();Yr();U();import{spawn as YQ}from"child_process";import{existsSync as JQ,mkdirSync as ZOe,readFileSync as XQ,unlinkSync as VQ,writeFileSync as QQ}from"fs";import{get as eDe}from"https";import{join as ZQ}from"path";import{readFileSync as YOe}from"fs";import{dirname as JOe,join as XOe}from"path";import{fileURLToPath as QOe}from"url";function Qr(){try{return"5.124.1"}catch{}try{let e=JOe(QOe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(YOe(XOe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}B();L();var tDe=64*1024,nDe=10800*1e3,rDe=800,oDe=3600*1e3,iDe="update-check.json",sDe="pending-update.json";function L0(){return ZQ(il(),iDe)}function Ff(){return ZQ(il(),sDe)}function N0(){let e=il();JQ(e)||ZOe(e,{recursive:!0})}function e7(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 t7(){try{let e=XQ(L0(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function n7(){try{N0();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';
|